def cancel_share(share, now, end_date): now = now or timezone.now().date() end_date = end_date or next_membership_end_date() if share.paid_date is None: share.delete() else: share.cancelled_date = now share.termination_date = end_date share.save()
def cancel_membership(request): member = request.user.member if request.method == 'POST': now = timezone.now().date() end_date = next_membership_end_date() message = request.POST.get('message') member = request.user.member member.canceled = True member.end_date = end_date member.cancelation_date = now if member.is_cooperation_member: adminnotification.member_canceled(member, end_date, message) else: member.inactive = True member.save() for share in member.active_shares: cancel_share(share, now, end_date) return redirect('profile') missing_iban = member.iban == '' coop_member = member.is_cooperation_member asc = member.usable_shares_count sub = member.subscription f_sub = member.future_subscription future_active = f_sub is not None and f_sub.state == 'active' and f_sub.state == 'waiting' current_active = sub is not None and sub.state == 'active' and sub.state == 'waiting' future = future_active and f_sub.share_overflow - asc < 0 current = current_active and sub.share_overflow - asc < 0 share_error = future or current can_cancel = not coop_member or (not missing_iban and not share_error) renderdict = get_menu_dict(request) renderdict.update({ 'coop_member': coop_member, 'end_date': next_membership_end_date(), 'member': member, 'can_cancel': can_cancel, 'missing_iban': missing_iban, }) return render(request, 'cancelmembership.html', renderdict)