From b7a1c5b8168858374dd0041d420b25058970ef54 Mon Sep 17 00:00:00 2001 From: tanshu <git@tanshu.com> Date: Mon, 1 Jun 2020 20:40:52 +0530 Subject: [PATCH] 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 --- brewman/models/master.py | 112 +++++++++++++++----------------------- brewman/models/voucher.py | 23 +++++--- brewman/routers/rebase.py | 5 ++ overlord/package.json | 2 +- setup.py | 2 +- 5 files changed, 64 insertions(+), 80 deletions(-) diff --git a/brewman/models/master.py b/brewman/models/master.py index 61ba86c0..63d3a3af 100644 --- a/brewman/models/master.py +++ b/brewman/models/master.py @@ -10,11 +10,10 @@ from sqlalchemy import ( Boolean, ForeignKey, func, - DateTime, PickleType, Date, ) -from sqlalchemy.orm import relationship +from sqlalchemy.orm import relationship, Session from brewman.models.guidtype import GUID from .meta import Base @@ -60,7 +59,7 @@ class Product(Base): is_active=None, is_purchased=None, is_sold=None, - id=None, + id_=None, is_fixture=False, ): self.code = code @@ -76,20 +75,17 @@ class Product(Base): self.is_active = is_active self.is_purchased = is_purchased self.is_sold = is_sold - self.id = id + self.id = id_ self.is_fixture = is_fixture @property def full_name(self): return "{0} ({1})".format(self.name, self.units) - def create(self, dbsession): - code = dbsession.query(func.max(Product.code)).one()[0] - if code is None: - self.code = 1 - else: - self.code = code + 1 - dbsession.add(self) + def create(self, db: Session): + code = db.query(func.max(Product.code)).one()[0] + self.code = 1 if code is None else code + 1 + db.add(self) return self def can_delete(self, advanced_delete): @@ -148,7 +144,7 @@ class Recipe(Base): valid_to=None, notes=None, effective_from=None, - id=None, + id_=None, ): self.product_id = product_id self.quantity = quantity @@ -159,7 +155,7 @@ class Recipe(Base): self.notes = "" if notes is None else notes self.effective_from = date.today() if effective_from is None else effective_from self.effective_to = None - self.id = id + self.id = id_ class RecipeItem(Base): @@ -174,12 +170,12 @@ class RecipeItem(Base): 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.product_id = product_id self.quantity = quantity self.price = price - self.id = id + self.id = id_ class ProductGroup(Base): @@ -191,9 +187,9 @@ class ProductGroup(Base): 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.id = id + self.id = id_ self.is_fixture = is_fixture @classmethod @@ -219,9 +215,9 @@ class CostCentre(Base): def __name__(self): 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.id = id + self.id = id_ self.is_fixture = is_fixture @classmethod @@ -274,22 +270,22 @@ class AccountBase(Base): self, code=None, name=None, - type=None, + type_=None, is_starred=None, is_active=None, is_reconcilable=False, cost_centre_id=None, - id=None, + id_=None, is_fixture=False, ): self.code = code self.name = name - self.type = type + self.type = type_ self.is_starred = is_starred self.is_active = is_active self.is_reconcilable = is_reconcilable self.cost_centre_id = cost_centre_id - self.id = id + self.id = id_ self.is_fixture = is_fixture @classmethod @@ -308,21 +304,15 @@ class AccountBase(Base): query_ = query_.filter(cls.name.ilike("%" + item + "%")) return query_.order_by(cls.name) - def create(self, dbsession): - code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0] - if code is None: - self.code = 1 - else: - self.code = code + 1 - dbsession.add(self) + def create(self, db: Session): + code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0] + self.code = 1 if code is None else code + 1 + db.add(self) return self def can_delete(self, advanced_delete): if self.is_fixture: - return ( - False, - "{0} is a fixture and cannot be edited or deleted.".format(self.name), - ) + return False, f"{self.name} is a fixture and cannot be edited or deleted." if self.is_active: return False, "Account is active" if len(self.journals) > 0 and not advanced_delete: @@ -330,8 +320,8 @@ class AccountBase(Base): return True, "" @classmethod - def get_code(cls, type, dbsession): - code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == type).one()[0] + def get_code(cls, type_, db: Session): + code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == type_).one()[0] return 1 if code is None else code + 1 @classmethod @@ -410,21 +400,18 @@ class Employee(AccountBase): super().__init__( code=code, name=name, - type=10, + type_=10, is_starred=is_starred, is_active=is_active, is_reconcilable=False, cost_centre_id=cost_centre_id, ) - def create(self, dbsession): - code = dbsession.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0] - if code is None: - self.code = 1 - else: - self.code = code + 1 - self.name += " (" + str(self.code) + ")" - dbsession.add(self) + def create(self, db: Session): + code = db.query(func.max(AccountBase.code)).filter(AccountBase.type == self.type).one()[0] + self.code = 1 if code in None else code + 1 + self.name += f" ({str(self.code)})" + db.add(self) return self def can_delete(self, advanced_delete): @@ -466,24 +453,18 @@ class AttendanceType: @classmethod def by_name(cls, name): - list = cls.list() - for item in list: - if item.name == name: - return item + next(i for i in cls.list() if i.name == name) @classmethod - def by_id(cls, id): - list = cls.list() - for item in list: - if item.id == id: - return item + def by_id(cls, id_): + next(i for i in cls.list() if i.id == id_) class AccountType: 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.balance_sheet = balance_sheet self.debit = debit @@ -498,7 +479,7 @@ class AccountType: @classmethod def list(cls): - list = [ + return [ AccountType(1, "Cash", True, True, "Cash", 10, True), AccountType(2, "Purchase", False, True, "Operating", 20, 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(14, 'Total', False, False, False, 900, False)) # list.append(AccountType(15, 'Net', False, False, False, 1000, False)) - return list @classmethod def by_name(cls, name): - list = cls.list() - for item in list: - if item.name == name: - return item + next(i for i in cls.list() if i.name == name) @classmethod - def by_id(cls, id): - list = cls.list() - for item in list: - if item.id == id: - return item + def by_id(cls, id_): + next(i for i in cls.list() if i.id == id_) class DbSetting(Base): @@ -539,7 +513,7 @@ class DbSetting(Base): name = Column("name", Unicode(255), unique=True, nullable=False) data = Column("data", PickleType) - def __init__(self, id=None, name=None, data=None): - self.id = id + def __init__(self, id_=None, name=None, data=None): + self.id = id_ self.name = name self.data = data diff --git a/brewman/models/voucher.py b/brewman/models/voucher.py index a3f488a8..0214e8e5 100644 --- a/brewman/models/voucher.py +++ b/brewman/models/voucher.py @@ -196,14 +196,15 @@ class EmployeeBenefit(Base): ): self.id = id_ self.voucher_id = voucher_id - self.journal_id = journal_id self.gross_salary = gross_salary self.days_worked = days_worked self.esi_ee = esi_ee self.pf_ee = pf_ee self.esi_er = esi_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 @@ -224,9 +225,10 @@ class Incentive(Base): self.voucher_id = voucher_id if journal is None: self.journal_id = journal_id + else: + self.journal = journal self.days_worked = days_worked self.points = points - self.journal = journal class Inventory(Base): @@ -260,14 +262,16 @@ class Inventory(Base): self.voucher_id = voucher_id if product is None: self.product_id = product_id + else: + self.product = product if batch is None: self.batch_id = batch_id + else: + self.batch = batch self.quantity = quantity self.rate = rate self.tax = tax self.discount = discount - self.batch = batch - self.product = product @hybrid_property def amount(self): @@ -298,7 +302,8 @@ class Batch(Base): self.discount = discount if product is None: self.product_id = product_id - self.product = product + else: + self.product = product def amount(self): 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 not None: old.is_valid = False - dbsession.add(self) + db.add(self) class Fingerprint(Base): @@ -374,8 +379,8 @@ class Fingerprint(Base): employee_id = Column("employee_id", GUID(), ForeignKey("employees.id")) date = Column("date", DateTime) - def __init__(self, id=None, employee_id=None, date=None): - self.id = id + def __init__(self, id_=None, employee_id=None, date=None): + self.id = id_ self.employee_id = employee_id self.date = date self.fingerprint_type = 0 diff --git a/brewman/routers/rebase.py b/brewman/routers/rebase.py index 37915d37..18c136e6 100644 --- a/brewman/routers/rebase.py +++ b/brewman/routers/rebase.py @@ -44,6 +44,7 @@ def rebase( db.add(voucher_l) for j in voucher_l.journals: db.add(j) + db.flush() db.add(voucher_b) for j in voucher_b.journals: db.add(j) @@ -86,6 +87,10 @@ def save_starred(date_: date, db: Session): for other in others: if voucher.type != VoucherType.by_name("Opening Accounts").id: 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) voucher.type = VoucherType.by_name("Journal") if len(voucher.narration) >= 1000: diff --git a/overlord/package.json b/overlord/package.json index e1c3eae3..56bcff26 100644 --- a/overlord/package.json +++ b/overlord/package.json @@ -1,6 +1,6 @@ { "name": "overlord", - "version": "7.0.0", + "version": "7.0.1", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/setup.py b/setup.py index 645c3a40..7a64acee 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ with open(os.path.join(here, 'requirements.txt'), "r") as r: requires = r.read().splitlines() setup(name='brewman', - version='7.0', + version='7.0.1', description='brewman', long_description=README + '\n\n' + CHANGES, classifiers=[