Example #1
0
    def do_import(self, f, date, comment):
        for line in f:
            name, balance = line[:-1].split(',')
            balance = float(balance)
            try:
                member = Member.objects.get(name=name, hidden=False)
                a = Activity(
                        member  = member,
                        weight  = 0.0,
                        date    = date,
                        cost    = -balance if balance < 0 else 0,
                        deposit = balance  if balance > 0 else 0,
                        comment = comment,
                        )
                a.save()

                acts, running, sum = member.running_total()
                if sum != member.balance:
                    member.balance = sum
                    member.save()

            except Member.DoesNotExist:
                ms = list(Member.objects.filter(name=name))
                if len(ms) == 0:
                    print name, "Not found"
                elif len(ms) == 1:
                    if ms[0].hidden:
                        print name, "is hidden"
                    else:
                        assert False
                else:
                    assert False
        f.close()
Example #2
0
def activity_by_date_POST(request, d):
    "API: 修改某日的所有Activity"
    threading.Thread(target=send_log, args=('activity_by_date/%s' % d, request.body)).start()
    data = json.loads(request.body)

    with reversion.create_revision():
        # 1. Delete
        Activity.objects.filter(date=d).delete()

        # 2. Re-add
        acts = {}
        for a in data['activities']:
            name = a['name']
            mid = Member.objects.get(name=name, hidden=False).id
            a['member_id'] = mid
            if mid in acts:
                # Merge activities when member is duplicated.
                act = acts[mid]
                if 'weight' in a and a['weight']:
                    act['weight'] += a['weight']
                if 'deposit' in a and a['deposit']:
                    act['deposit'] += a['deposit']
            else:
                if 'weight' not in a or not a['weight']:
                    a['weight'] = 0
                if 'deposit' not in a or not a['deposit']:
                    a['deposit'] = 0
                acts[mid] = a
        for act in acts.values():
            a = Activity(member_id=act['member_id'], cost=act['weight'], deposit=act['deposit'], date=d)
            if a.cost or a.deposit:
                # Don't save when both cost and deposit are 0, basically delete this activity.
                a.save()

        # 3. Re-balance
        member_ids = acts.keys()
        for member in Member.objects.filter(id__in=member_ids):
            _, running, sum = member.running_total()
            if sum != member.balance:
                member.balance = sum
                member.save()
        reversion.set_user(request.user)

    # 4. Done
    return HttpResponse("ok", content_type="application/json")
Example #3
0
def checkin_POST(request):
    threading.Thread(target=send_log, args=('checkin', request.body)).start()

    data = json.loads( request.body )
    # print data

    date = parse_date(data['date'])

    l = data['list']
    ver = data.get('ver', '1')
    if ver == '1':
        logger.error('checkin ver 1 is used')

    with reversion.create_revision():
        for o in l:
            # print o
            deposit = o['deposit']
            member = get_object_or_404(Member, name=o['name'], hidden=False)
            cost = determine_cost(member, o['weight'], ver)

            a = Activity(
                member = member,
                weight = o['weight'],
                date = date,
                cost = cost,
                deposit = deposit,
            )
            a.save()

            member.balance -= cost
            if deposit:
                member.balance += deposit
            member.save()
        reversion.set_user(request.user)
        reversion.set_comment('Checkin %d members' % len(l))

    return HttpResponse("ok", content_type="application/json")