Code Duplication    Length = 12-13 lines in 7 locations

chezbetty/models/transaction.py 7 locations

@@ 176-188 (lines=13) @@
173
            r = r.filter(event.Event.timestamp>=start)
174
        if end:
175
            r = r.filter(event.Event.timestamp<end)
176
177
        return r.one().a or Decimal(0.0)
178
179
    # Get the total amount of discounts people have received for keeping
180
    # money in their account
181
    @classmethod
182
    def discounts(cls, start=None, end=None):
183
        r = DBSession.query(func.sum((cls.amount / (1-cls.discount)) - cls.amount).label('d'))\
184
                        .join(event.Event)\
185
                        .filter(cls.discount > 0)\
186
                        .filter(event.Event.deleted==False)
187
188
        if start:
189
            r = r.filter(event.Event.timestamp>=start)
190
        if end:
191
            r = r.filter(event.Event.timestamp<end)
@@ 161-173 (lines=13) @@
158
159
        if distinct_on is None:
160
            raise NotImplementedError("required argument distinct_on missing")
161
162
        r = r.distinct(distinct_on)
163
164
        return r.count()
165
166
    @classmethod
167
    def total(cls, start=None, end=None):
168
        r = DBSession.query(func.sum(cls.amount).label('a'))\
169
                        .join(event.Event)\
170
                        .filter(event.Event.deleted==False)
171
172
        if start:
173
            r = r.filter(event.Event.timestamp>=start)
174
        if end:
175
            r = r.filter(event.Event.timestamp<end)
176
@@ 795-806 (lines=12) @@
792
                            .filter(event.Event.deleted==False)\
793
                            .order_by(desc(event.Event.timestamp))
794
        else:
795
            return DBSession.query(cls)\
796
                            .join(Transaction)\
797
                            .join(event.Event)\
798
                            .filter(cls.type==trans_type)\
799
                            .filter(event.Event.deleted==False)\
800
                            .order_by(desc(event.Event.timestamp))
801
802
class PurchaseLineItem(SubTransaction):
803
    __mapper_args__ = {'polymorphic_identity': 'purchaselineitem'}
804
    price           = Column(Numeric)
805
    def __init__(self, transaction, amount, item, quantity, price, wholesale):
806
        SubTransaction.__init__(self, transaction, amount, item.id, quantity, wholesale)
807
        self.price = price
808
809
    @classmethod
@@ 782-793 (lines=12) @@
779
                        .join(event.Event)\
780
                        .filter(cls.item_id == id)\
781
                        .filter(event.Event.deleted==False)\
782
                        .filter(or_(event.Event.type=="inventory", event.Event.type =="restock"))\
783
                        .order_by(desc(event.Event.timestamp))
784
785
    @classmethod
786
    @limitable_all
787
    def all(cls, trans_type=None):
788
        if not trans_type:
789
            return DBSession.query(cls)\
790
                            .join(Transaction)\
791
                            .join(event.Event)\
792
                            .filter(event.Event.deleted==False)\
793
                            .order_by(desc(event.Event.timestamp))
794
        else:
795
            return DBSession.query(cls)\
796
                            .join(Transaction)\
@@ 769-780 (lines=12) @@
766
        return DBSession.query(cls)\
767
                        .join(Transaction)\
768
                        .join(event.Event)\
769
                        .filter(cls.item_id == id)\
770
                        .filter(event.Event.deleted==False)\
771
                        .filter(event.Event.type=="purchase")\
772
                        .order_by(desc(event.Event.timestamp))
773
774
    @classmethod
775
    @limitable_all
776
    def all_item_events(cls, id):
777
        return DBSession.query(cls)\
778
                        .join(Transaction)\
779
                        .join(event.Event)\
780
                        .filter(cls.item_id == id)\
781
                        .filter(event.Event.deleted==False)\
782
                        .filter(or_(event.Event.type=="inventory", event.Event.type =="restock"))\
783
                        .order_by(desc(event.Event.timestamp))
@@ 481-492 (lines=12) @@
478
            .filter(event.Event.type == 'purchase')\
479
            .filter(event.Event.deleted==False).one().f or Decimal(0.0)
480
user.User.lifetime_discounts = __lifetime_discounts
481
482
483
@property
484
def __relevant_cash_deposits(self):
485
    # Get the cashbox empty before this one
486
    previous_cb_empty = object_session(self).query(event.Event)\
487
            .filter(event.Event.type == 'emptycashbox')\
488
            .filter(event.Event.timestamp < self.timestamp)\
489
            .filter(event.Event.deleted == False)\
490
            .order_by(desc(event.Event.timestamp))\
491
            .first()
492
493
    # Now get all cash deposits between that cash box empty and this one
494
    q = object_session(self).query(event.Deposit)\
495
            .filter(event.Event.timestamp < self.timestamp)\
@@ 146-157 (lines=12) @@
143
            r = r.filter(event.Event.timestamp>=start)
144
        if end:
145
            r = r.filter(event.Event.timestamp<end)
146
147
        return r.one().c
148
149
    @classmethod
150
    def distinct(cls, *, distinct_on=None, start=None, end=None):
151
        r = DBSession.query(cls).join(event.Event)\
152
                .filter(event.Event.deleted==False)
153
154
        if start:
155
            r = r.filter(event.Event.timestamp>=start)
156
        if end:
157
            r = r.filter(event.Event.timestamp<end)
158
159
        if distinct_on is None:
160
            raise NotImplementedError("required argument distinct_on missing")