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()
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")
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")