def registration(request, year, season, division, section=None): valid_division_states = ['cancelled', 'closed', 'open'] if request.user.is_superuser or request.user.groups.filter( name='junta').exists(): valid_division_states = valid_division_states + ['hidden', 'preview'] try: league = League.objects.get( Q(year=year), Q(season__name=season) | Q(season__slug=season), Q(night=division) | Q(night_slug=division), state__in=valid_division_states, ) except League.DoesNotExist: raise Http404('Division Not Found') try: registration, created = Registrations.objects.get_or_create( user=request.user, league=league) except IntegrityError: registration = Registrations.objects.get(user=request.user, league=league) if not league.is_open(request.user): return render_to_response('leagues/registration/error.html', { 'league': league, 'registration': registration, 'errors': ['closed'], }, context_instance=RequestContext(request)) if not registration.is_complete: errors = [] try: user_profile = request.user.profile if league.min_age: if not user_profile or \ user_profile.get_age_on(league.league_start_date) < league.min_age: errors.append('age') if not user_profile or not user_profile.is_complete_for_user: errors.append('profile') if not request.user.has_completed_player_rating: errors.append('rating') if request.user.has_expired_player_rating: errors.append('rating_expired') except ObjectDoesNotExist: errors.append('unknown') if len(errors): return render_to_response('leagues/registration/error.html', { 'league': league, 'registration': registration, 'errors': errors, }, context_instance=RequestContext(request)) num_steps = 4 if league.checks_accepted: num_steps = num_steps + 1 tick_percentage = 100.0 / num_steps attendance_form = None paypal_form = None if request.method == 'POST': success = True # conduct response if 'conduct_accept' in request.POST: registration.conduct_complete = 1 registration.save() messages.success(request, 'Code of conduct response saved.') elif 'conduct_decline' in request.POST: registration.conduct_complete = 0 registration.save() success = False section = 'conduct' messages.error(request, 'You must accept the code of conduct to continue.') # waiver response if 'waiver_accept' in request.POST: registration.waiver_complete = 1 registration.save() messages.success(request, 'Waiver response saved.') elif 'waiver_decline' in request.POST: registration.waiver_complete = 0 registration.save() success = False section = 'waiver' messages.error(request, 'You must accept the waiver to continue.') # attendance/captaining response if 'id' in request.POST and 'attendance' in request.POST: attendance_form = RegistrationAttendanceForm(request.POST, instance=registration) if attendance_form.is_valid(): attendance_form.save() if not registration.baggage_id: baggage = Baggage() baggage.save() registration.baggage_id = baggage.id registration.save() if league.type == 'league': messages.success( request, 'Attendance and captaining response saved.') else: messages.success(request, 'Attendance response saved.') else: success = False section = 'attendance' if league.type == 'league': messages.error( request, 'You must provide a valid attendance and captaining rating to continue.' ) else: messages.error( request, 'You must provide a valid attendance rating to continue.' ) # payment type response if 'pay_type' in request.POST: if not league.checks_accepted: registration.pay_type = 'paypal' registration.save() messages.error( request, 'Payment type set to PayPal. Checks are not accepted for this league.' ) elif request.POST.get('pay_type').lower() == 'pay with check': registration.pay_type = 'check' registration.save() messages.success(request, 'Payment type set to check.') elif request.POST.get('pay_type').lower() == 'pay with paypal': registration.pay_type = 'paypal' registration.save() messages.success(request, 'Payment type set to PayPal.') else: success = False section = 'pay_type' messages.error( request, 'You must select a valid payment type to continue.') if 'coupon_code' in request.POST: if league.coupons_accepted: if not registration.is_complete and not registration.is_refunded: try: coupon_code = request.POST.get('coupon_code') coupon = Coupon.objects.get(code=coupon_code) except ObjectDoesNotExist: coupon = None if coupon: if coupon.is_valid(league, request.user): registration.coupon = coupon registration.save() messages.success( request, 'Your coupon code has been added and will be redeemed when your registration is completed.' ) else: success = False messages.error( request, 'The coupon code entered is not valid. The code could be expired or past its use limit.' ) else: success = False messages.error( request, 'The coupon code entered does not exist.') else: success = False messages.error( request, 'Your registration is already complete or refunded.') else: success = False messages.error( request, 'Coupon codes are not accepted for this division.') if 'remove_coupon' in request.POST: if registration.coupon: registration.coupon = None registration.save() messages.success( request, 'Your coupon has been removed and will not be used with this registration.' ) else: success = False messages.error( request, 'Could not remove coupon; no coupon is associated with this registration.' ) if 'process_registration' in request.POST: if registration.is_ready_for_payment: registration.payment_complete = True registration.registered = timezone.now() registration.save() success = True messages.success(request, 'Your registration has been processed.') else: messages.error(request, 'Your registration could not be processed.') if success: return HttpResponseRedirect( reverse('league_registration', kwargs={ 'year': year, 'season': season, 'division': division })) if section == 'conduct' or not registration.conduct_complete: return render_to_response('leagues/registration/conduct.html', { 'league': league, 'registration': registration, 'section': 'conduct', 'tick_percentage': tick_percentage }, context_instance=RequestContext(request)) if section == 'waiver' or not registration.waiver_complete: return render_to_response('leagues/registration/waiver.html', { 'league': league, 'registration': registration, 'section': 'waiver', 'tick_percentage': tick_percentage }, context_instance=RequestContext(request)) if section == 'attendance' or \ registration.attendance is None or \ (registration.captain is None and league.type == 'league'): if not attendance_form: attendance_form = RegistrationAttendanceForm(instance=registration) return render_to_response('leagues/registration/attendance.html', { 'league': league, 'registration': registration, 'attendance_form': attendance_form, 'section': 'attendance', 'tick_percentage': tick_percentage }, context_instance=RequestContext(request)) if registration.check_price > 0 or registration.paypal_price > 0: if league.checks_accepted and (section == 'pay_type' or not registration.pay_type or (registration.pay_type != 'check' and registration.pay_type != 'paypal')): return render_to_response('leagues/registration/payment.html', { 'league': league, 'registration': registration, 'section': 'pay_type', 'tick_percentage': tick_percentage }, context_instance=RequestContext(request)) if not registration.paypal_invoice_id: registration.paypal_invoice_id = str(uuid.uuid4()) registration.save() if not registration.paypal_complete and not registration.check_complete: base_url = request.build_absolute_uri( getattr(settings, 'FORCE_SCRIPT_NAME', '/')).replace(request.path_info.replace(' ', '%20'), '') paypal_dict = { 'amount': registration.paypal_price, 'cancel_return': u'{}/leagues/{}/{}/{}/registration/'.format( base_url, league.year, league.season.slug, league.night_slug), 'invoice': registration.paypal_invoice_id, 'item_name': u'{} {} {}'.format(league.season_title, league.year, league.night_title), 'notify_url': u'{}/leagues/registration/payment/{}'.format( base_url, getattr(settings, 'PAYPAL_CALLBACK_SECRET', 'notification/callback/for/a2ultimate/secret/')), 'return_url': u'{}/leagues/{}/{}/{}/registration-complete/'.format( base_url, league.year, league.season.slug, league.night_slug), } paypal_form = PayPalPaymentsForm(initial=paypal_dict) # https://ppmts.custhelp.com/app/answers/detail/a_id/165 return render_to_response('leagues/registration/status.html', { 'paypal_form': paypal_form, 'league': league, 'registration': registration, 'section': 'status', 'tick_percentage': tick_percentage, 'coupon_is_valid': registration.coupon.is_valid(league, request.user) if registration.coupon else False, }, context_instance=RequestContext(request))