Fix: Relations were not working as after setting the id, if the object was none, then it set to None again.

eg. in Inventory if product_id was supplied and not the product object, product_id was set, but then when the product was set to None, the product_id was also gone

Version bumped to 7.0.1
This commit is contained in:
Amritanshu Agrawal 2020-06-01 20:40:52 +05:30
parent 58f6d6578b
commit b7a1c5b816
5 changed files with 64 additions and 80 deletions

@ -10,11 +10,10 @@ from sqlalchemy import (
Boolean, Boolean,
ForeignKey, ForeignKey,
func, func,
DateTime,
PickleType, PickleType,
Date, Date,
) )
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship, Session
from brewman.models.guidtype import GUID from brewman.models.guidtype import GUID
from .meta import Base from .meta import Base
@ -60,7 +59,7 @@ class Product(Base):
is_active=None, is_active=None,
is_purchased=None, is_purchased=None,
is_sold=None, is_sold=None,
id=None, id_=None,
is_fixture=False, is_fixture=False,
): ):
self.code = code self.code = code
@ -76,20 +75,17 @@ class Product(Base):
self.is_active = is_active self.is_active = is_active
self.is_purchased = is_purchased self.is_purchased = is_purchased
self.is_sold = is_sold self.is_sold = is_sold
self.id = id self.id = id_
self.is_fixture = is_fixture self.is_fixture = is_fixture
@property @property
def full_name(self): def full_name(self):
return "{0} ({1})".format(self.name, self.units) return "{0} ({1})".format(self.name, self.units)
def create(self, dbsession): def create(self, db: Session):
code = dbsession.query(func.max(Product.code)).one()[0] code = db.query(func.max(Product.code)).one()[0]
if code is None: self.code = 1 if code is None else code + 1
self.code = 1 db.add(self)
else:
self.code = code + 1
dbsession.add(self)
return self return self
def can_delete(self, advanced_delete): def can_delete(self, advanced_delete):
@ -148,7 +144,7 @@ class Recipe(Base):
valid_to=None, valid_to=None,
notes=None, notes=None,
effective_from=None, effective_from=None,
id=None, id_=None,
): ):
self.product_id = product_id self.product_id = product_id
self.quantity = quantity self.quantity = quantity
@ -159,7 +155,7 @@ class Recipe(Base):
self.notes = "" if notes is None else notes self.notes = "" if notes is None else notes
self.effective_from = date.today() if effective_from is None else effective_from self.effective_from = date.today() if effective_from is None else effective_from
self.effective_to = None self.effective_to = None
self.id = id self.id = id_
class RecipeItem(Base): class RecipeItem(Base):
@ -174,12 +170,12 @@ class RecipeItem(Base):
product = relationship("Product") product = relationship("Product")
def __init__(self, recipe_id=None, product_id=None, quantity=None, price=None, id=None): def __init__(self, recipe_id=None, product_id=None, quantity=None, price=None, id_=None):
self.recipe_id = recipe_id self.recipe_id = recipe_id
self.product_id = product_id self.product_id = product_id
self.quantity = quantity self.quantity = quantity
self.price = price self.price = price
self.id = id self.id = id_
class ProductGroup(Base): class ProductGroup(Base):
@ -191,9 +187,9 @@ class ProductGroup(Base):
products = relationship("Product", backref="product_group") products = relationship("Product", backref="product_group")
def __init__(self, name=None, id=None, is_fixture=False): def __init__(self, name=None, id_=None, is_fixture=False):
self.name = name self.name = name
self.id = id self.id = id_
self.is_fixture = is_fixture self.is_fixture = is_fixture
@classmethod @classmethod
@ -219,9 +215,9 @@ class CostCentre(Base):
def __name__(self): def __name__(self):
return self.name return self.name
def __init__(self, name=None, id=None, is_fixture=False): def __init__(self, name=None, id_=None, is_fixture=False):
self.name = name self.name = name
self.id = id self.id = id_
self.is_fixture = is_fixture self.is_fixture = is_fixture
@classmethod @classmethod
@ -274,22 +270,22 @@ class AccountBase(Base):
self, self,
code=None, code=None,
name=None, name=None,
type=None, type_=None,
is_starred=None, is_starred=None,
is_active=None, is_active=None,
is_reconcilable=False, is_reconcilable=False,
cost_centre_id=None, cost_centre_id=None,
id=None, id_=None,
is_fixture=False, is_fixture=False,
): ):
self.code = code self.code = code
self.name = name self.name = name
self.type = type self.type = type_
self.is_starred = is_starred self.is_starred = is_starred
self.is_active = is_active self.is_active = is_active
self.is_reconcilable = is_reconcilable self.is_reconcilable = is_reconcilable
self.cost_centre_id = cost_centre_id self.cost_centre_id = cost_centre_id
self.id = id self.id = id_
self.is_fixture = is_fixture self.is_fixture = is_fixture
@classmethod @classmethod
@ -308,21 +304,15 @@ class AccountBase(Base):
query_ = query_.filter(cls.name.ilike("%" + item + "%")) query_ = query_.filter(cls.name.ilike("%" + item + "%"))
return query_.order_by(cls.name) return query_.order_by(cls.name)
def create(self, dbsession): def create(self, db: Session):
code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0] code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0]
if code is None: self.code = 1 if code is None else code + 1
self.code = 1 db.add(self)
else:
self.code = code + 1
dbsession.add(self)
return self return self
def can_delete(self, advanced_delete): def can_delete(self, advanced_delete):
if self.is_fixture: if self.is_fixture:
return ( return False, f"{self.name} is a fixture and cannot be edited or deleted."
False,
"{0} is a fixture and cannot be edited or deleted.".format(self.name),
)
if self.is_active: if self.is_active:
return False, "Account is active" return False, "Account is active"
if len(self.journals) > 0 and not advanced_delete: if len(self.journals) > 0 and not advanced_delete:
@ -330,8 +320,8 @@ class AccountBase(Base):
return True, "" return True, ""
@classmethod @classmethod
def get_code(cls, type, dbsession): def get_code(cls, type_, db: Session):
code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == type).one()[0] code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == type_).one()[0]
return 1 if code is None else code + 1 return 1 if code is None else code + 1
@classmethod @classmethod
@ -410,21 +400,18 @@ class Employee(AccountBase):
super().__init__( super().__init__(
code=code, code=code,
name=name, name=name,
type=10, type_=10,
is_starred=is_starred, is_starred=is_starred,
is_active=is_active, is_active=is_active,
is_reconcilable=False, is_reconcilable=False,
cost_centre_id=cost_centre_id, cost_centre_id=cost_centre_id,
) )
def create(self, dbsession): def create(self, db: Session):
code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0] code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0]
if code is None: self.code = 1 if code in None else code + 1
self.code = 1 self.name += f" ({str(self.code)})"
else: db.add(self)
self.code = code + 1
self.name += " (" + str(self.code) + ")"
dbsession.add(self)
return self return self
def can_delete(self, advanced_delete): def can_delete(self, advanced_delete):
@ -466,24 +453,18 @@ class AttendanceType:
@classmethod @classmethod
def by_name(cls, name): def by_name(cls, name):
list = cls.list() next(i for i in cls.list() if i.name == name)
for item in list:
if item.name == name:
return item
@classmethod @classmethod
def by_id(cls, id): def by_id(cls, id_):
list = cls.list() next(i for i in cls.list() if i.id == id_)
for item in list:
if item.id == id:
return item
class AccountType: class AccountType:
def __init__( def __init__(
self, id, name, balance_sheet=None, debit=None, cash_flow_classification=None, order=None, show_in_list=None, self, id_, name, balance_sheet=None, debit=None, cash_flow_classification=None, order=None, show_in_list=None,
): ):
self.id = id self.id = id_
self.name = name self.name = name
self.balance_sheet = balance_sheet self.balance_sheet = balance_sheet
self.debit = debit self.debit = debit
@ -498,7 +479,7 @@ class AccountType:
@classmethod @classmethod
def list(cls): def list(cls):
list = [ return [
AccountType(1, "Cash", True, True, "Cash", 10, True), AccountType(1, "Cash", True, True, "Cash", 10, True),
AccountType(2, "Purchase", False, True, "Operating", 20, True), AccountType(2, "Purchase", False, True, "Operating", 20, True),
AccountType(3, "Sale", False, False, "Operating", 10, True), AccountType(3, "Sale", False, False, "Operating", 10, True),
@ -515,21 +496,14 @@ class AccountType:
# list.append(AccountType(8, 'Discount', False, False, True, 30, True)) # list.append(AccountType(8, 'Discount', False, False, True, 30, True))
# list.append(AccountType(14, 'Total', False, False, False, 900, False)) # list.append(AccountType(14, 'Total', False, False, False, 900, False))
# list.append(AccountType(15, 'Net', False, False, False, 1000, False)) # list.append(AccountType(15, 'Net', False, False, False, 1000, False))
return list
@classmethod @classmethod
def by_name(cls, name): def by_name(cls, name):
list = cls.list() next(i for i in cls.list() if i.name == name)
for item in list:
if item.name == name:
return item
@classmethod @classmethod
def by_id(cls, id): def by_id(cls, id_):
list = cls.list() next(i for i in cls.list() if i.id == id_)
for item in list:
if item.id == id:
return item
class DbSetting(Base): class DbSetting(Base):
@ -539,7 +513,7 @@ class DbSetting(Base):
name = Column("name", Unicode(255), unique=True, nullable=False) name = Column("name", Unicode(255), unique=True, nullable=False)
data = Column("data", PickleType) data = Column("data", PickleType)
def __init__(self, id=None, name=None, data=None): def __init__(self, id_=None, name=None, data=None):
self.id = id self.id = id_
self.name = name self.name = name
self.data = data self.data = data

@ -196,14 +196,15 @@ class EmployeeBenefit(Base):
): ):
self.id = id_ self.id = id_
self.voucher_id = voucher_id self.voucher_id = voucher_id
self.journal_id = journal_id
self.gross_salary = gross_salary self.gross_salary = gross_salary
self.days_worked = days_worked self.days_worked = days_worked
self.esi_ee = esi_ee self.esi_ee = esi_ee
self.pf_ee = pf_ee self.pf_ee = pf_ee
self.esi_er = esi_er self.esi_er = esi_er
self.pf_er = pf_er self.pf_er = pf_er
if journal_id is None and journal is not None: if journal is None:
self.journal_id = journal_id
else:
self.journal = journal self.journal = journal
@ -224,9 +225,10 @@ class Incentive(Base):
self.voucher_id = voucher_id self.voucher_id = voucher_id
if journal is None: if journal is None:
self.journal_id = journal_id self.journal_id = journal_id
else:
self.journal = journal
self.days_worked = days_worked self.days_worked = days_worked
self.points = points self.points = points
self.journal = journal
class Inventory(Base): class Inventory(Base):
@ -260,14 +262,16 @@ class Inventory(Base):
self.voucher_id = voucher_id self.voucher_id = voucher_id
if product is None: if product is None:
self.product_id = product_id self.product_id = product_id
else:
self.product = product
if batch is None: if batch is None:
self.batch_id = batch_id self.batch_id = batch_id
else:
self.batch = batch
self.quantity = quantity self.quantity = quantity
self.rate = rate self.rate = rate
self.tax = tax self.tax = tax
self.discount = discount self.discount = discount
self.batch = batch
self.product = product
@hybrid_property @hybrid_property
def amount(self): def amount(self):
@ -298,7 +302,8 @@ class Batch(Base):
self.discount = discount self.discount = discount
if product is None: if product is None:
self.product_id = product_id self.product_id = product_id
self.product = product else:
self.product = product
def amount(self): def amount(self):
return self.quantity_remaining * self.rate * (1 + self.tax) * (1 - self.discount) return self.quantity_remaining * self.rate * (1 + self.tax) * (1 - self.discount)
@ -364,7 +369,7 @@ class Attendance(Base):
if old is None or old.attendance_type != self.attendance_type: if old is None or old.attendance_type != self.attendance_type:
if old is not None: if old is not None:
old.is_valid = False old.is_valid = False
dbsession.add(self) db.add(self)
class Fingerprint(Base): class Fingerprint(Base):
@ -374,8 +379,8 @@ class Fingerprint(Base):
employee_id = Column("employee_id", GUID(), ForeignKey("employees.id")) employee_id = Column("employee_id", GUID(), ForeignKey("employees.id"))
date = Column("date", DateTime) date = Column("date", DateTime)
def __init__(self, id=None, employee_id=None, date=None): def __init__(self, id_=None, employee_id=None, date=None):
self.id = id self.id = id_
self.employee_id = employee_id self.employee_id = employee_id
self.date = date self.date = date
self.fingerprint_type = 0 self.fingerprint_type = 0

@ -44,6 +44,7 @@ def rebase(
db.add(voucher_l) db.add(voucher_l)
for j in voucher_l.journals: for j in voucher_l.journals:
db.add(j) db.add(j)
db.flush()
db.add(voucher_b) db.add(voucher_b)
for j in voucher_b.journals: for j in voucher_b.journals:
db.add(j) db.add(j)
@ -86,6 +87,10 @@ def save_starred(date_: date, db: Session):
for other in others: for other in others:
if voucher.type != VoucherType.by_name("Opening Accounts").id: if voucher.type != VoucherType.by_name("Opening Accounts").id:
voucher.narration += f"\nSuspense \u20B9{other.amount:,.2f} is {other.account.name}" voucher.narration += f"\nSuspense \u20B9{other.amount:,.2f} is {other.account.name}"
if other.employee_benefit:
db.delete(other.employee_benefit)
if other.incentive:
db.delete(other.incentive)
db.delete(other) db.delete(other)
voucher.type = VoucherType.by_name("Journal") voucher.type = VoucherType.by_name("Journal")
if len(voucher.narration) >= 1000: if len(voucher.narration) >= 1000:

@ -1,6 +1,6 @@
{ {
"name": "overlord", "name": "overlord",
"version": "7.0.0", "version": "7.0.1",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",

@ -11,7 +11,7 @@ with open(os.path.join(here, 'requirements.txt'), "r") as r:
requires = r.read().splitlines() requires = r.read().splitlines()
setup(name='brewman', setup(name='brewman',
version='7.0', version='7.0.1',
description='brewman', description='brewman',
long_description=README + '\n\n' + CHANGES, long_description=README + '\n\n' + CHANGES,
classifiers=[ classifiers=[