def process_request(self, request): if 'active_forening' in request.session: try: request.active_forening = Forening.get_cached_forening( id=request.session['active_forening'], ) except Forening.DoesNotExist: # It might have been removed, remove it and let the user choose # a new one del request.session['active_forening']
def renew_membership(request): if request.method != 'POST': return redirect('user:account') if 'stripeToken' not in request.POST: return redirect('user:account') description = "Fornying av medlemskap" if date.today() < membership_year_start()['public_date']: applicable_year = membership_year_start()['public_date'].year else: applicable_year = membership_year_start()['public_date'].year + 1 metadata = { 'Periode': 'Medlemsåret %s' % applicable_year, } if not request.user.has_family(): # Single member, pay their own invoice amount = request.user.payment.status['amount_due'] metadata['Medlemskap'] = request.user.membership_type()['name'] metadata['Medlem'] = '%s (medlemsnr: %s)' % (request.user.get_full_name(), request.user.memberid) request.user.clear_cache() elif request.user.family.relation == 'family': # Family membership, pay the invoice of the parent amount = request.user.payment.status['amount_due'] metadata['Medlemskap'] = 'Familiemedlemskap' metadata['Familie hovedmedlem'] = '%s (medlemsnr: %s)' % ( request.user.family.parent.get_full_name(), request.user.family.parent.memberid, ) metadata['Alle familiemedlemmer'] = ', '.join([ '%s (medlemsnr: %s)' % (u.get_full_name(), u.memberid) for u in request.user.family.all_members() ]) request.user.family.clear_cache() elif request.user.family.relation == 'household': # Household membership, each member has their own invoice. amount = request.user.family.payment_amount_due() metadata['Medlemskap'] = 'Husstandsmedlemskap' metadata['Medlemmer'] = ', '.join([ '%s (medlemsnr: %s, %s, %s)' % ( u.get_full_name(), u.memberid, u.membership_type()['name'], currency(u.payment.status['amount_due']), ) for u in request.user.family.payment_members() ]) request.user.family.clear_cache() charge = Charge.new_charge( Forening.get_cached_forening(id=Forening.DNT_CENTRAL_ID).payment_auth()['stripe_user_id'], request.user, request.POST['stripeToken'], amount, description, metadata, ) try: if not charge.was_success(): # Unsuccessful payment. Store the error message and display it on the account page request.session['membership.%s.payment_failure' % request.user.memberid] = { 'error_display': charge.get_error_code_display(), 'error_message': charge.error_message, } else: # Payment was succesful; save it to Focus if not request.user.has_family() or request.user.family.relation == 'family': request.user.payment.save_pending_payment(charge.charge_id, amount) else: for household_member in request.user.family.payment_members(): household_member.payment.save_pending_payment( charge.charge_id, household_member.payment.status['amount_due'], ) except: # Problem during pending payment registration - likely connection issue with Focus. # - Since the payment isn't stored in Focus, the user will not get the confirmation, so add an error message # explaining the situation. # - Manual followup is required by memberservice, so send email to memberservice with required information # - Log an error to be able to trace events, in case it's ever needed messages.error(request, 'payment_registration_failure') logger.error( "Feil ved lagring av medlemskapsfornyelse i Focus", exc_info=sys.exc_info(), extra={ 'request': request, 'amount': amount, 'metadata': metadata, 'charge': charge, }, ) try: context = { 'amount': amount, 'metadata': metadata, 'charge': charge, } message = render_to_string('common/focus/payment_registration_failure.txt', context, request=request) send_mail( "Fornying av medlemskap kunne ikke lagres i Focus", message, settings.DEFAULT_FROM_EMAIL, [settings.MEMBERSERVICE_EMAIL], ) except (SMTPException, SSLError, UnicodeEncodeError): # Jesus. Error upon error. Log it, hopefully devs will be able to follow up. logger.error( "Kunne ikke sende varselsepost til medlemsservice, beskjed må gis manuelt", extra={ 'request': request, 'message': message, 'amount': amount, 'metadata': metadata, 'charge': charge, }, ) finally: return redirect('%s#forny-medlemskap' % reverse('user:account'))