예제 #1
0
 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']
예제 #2
0
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'))