Code Duplication    Length = 13-16 lines in 4 locations

chezbetty/models/transaction.py 4 locations

@@ 223-236 (lines=14) @@
220
                     .filter(event.Event.deleted==False)
221
        return r
222
223
    @classmethod
224
    def count(cls, *, trans_type=None, start=None, end=None):
225
        r = DBSession.query(func.count(cls.id).label('c'))\
226
                            .join(event.Event)\
227
                            .filter(event.Event.deleted==False)
228
229
        if trans_type:
230
            r = r.filter(cls.type==trans_type)
231
        if start:
232
            r = r.filter(event.Event.timestamp>=start)
233
        if end:
234
            r = r.filter(event.Event.timestamp<end)
235
236
        return r.one().c
237
238
    @classmethod
239
    def distinct(cls, *, distinct_on=None, start=None, end=None):
@@ 280-292 (lines=13) @@
277
        return r.one().d or Decimal(0.0)
278
279
    # Get the total amount of fees people have paid for being in debt
280
    @classmethod
281
    def fees(cls, start=None, end=None):
282
        r = DBSession.query(func.sum((cls.amount / (1-cls.discount)) - cls.amount).label('f'))\
283
                        .join(event.Event)\
284
                        .filter(cls.discount < 0)\
285
                        .filter(event.Event.deleted==False)
286
287
        if start:
288
            r = r.filter(event.Event.timestamp>=start)
289
        if end:
290
            r = r.filter(event.Event.timestamp<end)
291
292
        return r.one().f or Decimal(0.0)
293
294
    # Returns an array of tuples where the first item is a millisecond timestamp,
295
    # the next is the total amount of debt, and the next is the total amount
@@ 265-277 (lines=13) @@
262
263
    # Get the total amount of discounts people have received for keeping
264
    # money in their account
265
    @classmethod
266
    def discounts(cls, start=None, end=None):
267
        r = DBSession.query(func.sum((cls.amount / (1-cls.discount)) - cls.amount).label('d'))\
268
                        .join(event.Event)\
269
                        .filter(cls.discount > 0)\
270
                        .filter(event.Event.deleted==False)
271
272
        if start:
273
            r = r.filter(event.Event.timestamp>=start)
274
        if end:
275
            r = r.filter(event.Event.timestamp<end)
276
277
        return r.one().d or Decimal(0.0)
278
279
    # Get the total amount of fees people have paid for being in debt
280
    @classmethod
@@ 238-253 (lines=16) @@
235
236
        return r.one().c
237
238
    @classmethod
239
    def distinct(cls, *, distinct_on=None, start=None, end=None):
240
        r = DBSession.query(cls).join(event.Event)\
241
                .filter(event.Event.deleted==False)
242
243
        if start:
244
            r = r.filter(event.Event.timestamp>=start)
245
        if end:
246
            r = r.filter(event.Event.timestamp<end)
247
248
        if distinct_on is None:
249
            raise NotImplementedError("required argument distinct_on missing")
250
251
        r = r.distinct(distinct_on)
252
253
        return r.count()
254
255
    @classmethod
256
    @datefilter_one_or_zero(label='a')