def remove_participants(event, leavers): # check, that leaver is participated leavers = is_participated(event, leavers) if not leavers: return participants = Participation.objects.filter(event=event, active=True) exist_parts = participants.aggregate(s=Sum('parts'))['s'] exist_parts = 0.0 if exist_parts is None else exist_parts # fix None party_pay = event.price / exist_parts rest_participations = participants.filter(~Q(account__in=leavers)) leaver_participations = participants.filter(account__in=list(leavers)) # return money for participation in leaver_participations: leaver_transaction = Transaction(participation=participation, type=Transaction.OUT) debit = party_pay * participation.parts leaver_transaction.debit = debit leaver_transaction.save() # create diffs # yep folks, you should pay for this leavers rest_parts = rest_participations.aggregate(s=Sum('parts'))['s'] for victum in rest_participations: credit = ((leaver_transaction.debit / rest_parts) * victum.parts) delegate_debt(victum, credit, leaver_transaction) leaver_participations.update(active=False)
def return_money(participation, debit, parent): """Make diff transactions for given participation(event,user) with given debit. This means, that we get money from event and return it to user. @param participation: Event-User link that for create transaction @type participation: Participation @param debit: Money count that was returned @type debit: float @param parent: Parent transaction, that initiate return(incomer for example) @type parent: Transaction """ t = Transaction(participation=participation, type=Transaction.DIFF, parent=parent) t.debit = debit t.save()