Example #1
0
def ajax_pricing(request, event_id, template_name="events/registration/pricing.html"):
    """Ajax query for pricing info.
    The parameters are email and memberid.
    Both are not unique to a user but are assumed to be unique.
    On cases that there are multiple matches,
    the first match will be the basis of the pricing list.
    If the setting "sharedpricing" is enabled this ajax check will consider
    the emails associated with the session.
    ** This now also returns ADDON info in the same format.
    """
    event = get_object_or_404(Event, pk=event_id)
    
    if not get_setting('module', 'events', 'anonymousmemberpricing'):
        raise Http404
    
    memberid = request.GET.get('memberid', None)
    email = request.GET.get('email', None)
    
    user = AnonymousUser()
    allow_memberid = get_setting('module', 'events', 'memberidpricing')
    shared_pricing = get_setting('module', 'events', 'sharedpricing')
    
    if memberid and allow_memberid:  # memberid takes priority over email
        membership = Membership.objects.first(member_number=memberid)
        if hasattr(membership, 'user'):
            user = membership.user
    elif email:
        users = User.objects.filter(email=email)
        if users:
            user = users[0]
    
    # register user in user list
    user_pks = request.session.get('user_list', [])
    if not user.is_anonymous():
        user_pks.append(user.pk)
    request.session['user_list'] = user_pks

    # Set up available pricings
    all_pricings = get_active_pricings(event)
    if shared_pricing:
        # use entire user list
        shareable_users = User.objects.filter(pk__in=user_pks)
        available_pricings = get_pricings_for_list(event, shareable_users)
    else:
        shareable_users = None
        available_pricings = get_available_pricings(event, user)
    pricing_list = []
    for pricing in all_pricings:
        p_dict = {
            'title':pricing.title,
            'quantity':pricing.quantity,
            'price':str(pricing.price),
            'pk':pricing.pk,
            'enabled':True,
            'is_public':pricing.allow_anonymous,
        }
        
        if pricing not in available_pricings:
            p_dict['enabled'] = False
        
        pricing_list.append(p_dict)
        
    all_addons = get_active_addons(event)
    if shared_pricing:
        available_addons = get_addons_for_list(event, shareable_users)
    else:
        available_addons = get_available_addons(event, user)
    
    a_list = []
    for addon in all_addons:
        d = model_to_dict(addon)
        d['options'] = addon.options
        if addon in available_addons:
            # temporarily allow anon viewing for this email
            d['allow_anonymous'] = True
        a_list.append(d)
    
    form = render_to_string('events/addons/addon-add-box.html',
        {'addons':a_list, 'anon_pricing':True},
        RequestContext(request))
            
    data = json.dumps({
        'pricings':pricing_list,
        'add-addons-form':form,
    })
    return HttpResponse(data, mimetype="text/plain")
Example #2
0
def ajax_pricing(request,
                 event_id,
                 template_name="events/registration/pricing.html"):
    """Ajax query for pricing info.
    The parameters are email and memberid.
    Both are not unique to a user but are assumed to be unique.
    On cases that there are multiple matches,
    the first match will be the basis of the pricing list.
    If the setting "sharedpricing" is enabled this ajax check will consider
    the emails associated with the session.
    ** This now also returns ADDON info in the same format.
    """
    event = get_object_or_404(Event, pk=event_id)

    if not get_setting('module', 'events', 'anonymousmemberpricing'):
        raise Http404

    memberid = request.GET.get('memberid', None)
    email = request.GET.get('email', None)

    user = AnonymousUser()
    allow_memberid = get_setting('module', 'events', 'memberidpricing')
    shared_pricing = get_setting('module', 'events', 'sharedpricing')

    if memberid and allow_memberid:  # memberid takes priority over email
        membership = Membership.objects.first(member_number=memberid)
        if hasattr(membership, 'user'):
            user = membership.user
    elif email:
        users = User.objects.filter(email=email)
        if users:
            user = users[0]

    # register user in user list
    user_pks = request.session.get('user_list', [])
    if not user.is_anonymous():
        user_pks.append(user.pk)
    request.session['user_list'] = user_pks

    # Set up available pricings
    all_pricings = get_active_pricings(event)
    if shared_pricing:
        # use entire user list
        shareable_users = User.objects.filter(pk__in=user_pks)
        available_pricings = get_pricings_for_list(event, shareable_users)
    else:
        shareable_users = None
        available_pricings = get_available_pricings(event, user)
    pricing_list = []
    for pricing in all_pricings:
        p_dict = {
            'title': pricing.title,
            'quantity': pricing.quantity,
            'price': str(pricing.price),
            'pk': pricing.pk,
            'enabled': True,
            'is_public': pricing.allow_anonymous,
        }

        if pricing not in available_pricings:
            p_dict['enabled'] = False

        pricing_list.append(p_dict)

    all_addons = get_active_addons(event)
    if shared_pricing:
        available_addons = get_addons_for_list(event, shareable_users)
    else:
        available_addons = get_available_addons(event, user)

    a_list = []
    for addon in all_addons:
        d = model_to_dict(addon)
        d['options'] = addon.options
        if addon in available_addons:
            # temporarily allow anon viewing for this email
            d['allow_anonymous'] = True
        a_list.append(d)

    form = render_to_string('events/addons/addon-add-box.html', {
        'addons': a_list,
        'anon_pricing': True
    }, RequestContext(request))

    data = json.dumps({
        'pricings': pricing_list,
        'add-addons-form': form,
    })
    return HttpResponse(data, mimetype="text/plain")
Example #3
0
def multi_register(request, event_id, template_name="events/registration/multi_register.html"):
    """
    This view is where a user defines the specifics of his/her registrations.
    A registration set is a set of registrants (one or many) that comply with a specific pricing.
    A pricing defines the maximum number of registrants in a registration set.
    A user can avail multiple registration sets.
    
    If the site setting anonymousmemberpricing is enabled,
    anonymous users can select non public pricings in their registration sets,
    provided that the first registrant of every registration set's email is validated to be an existing user.
    
    If the site setting anonymousmemberpricing is disabled,
    anonymous users will not be able to see non public prices.
    """
    
    # redirect to default registration if anonymousmemberpricing not enabled
    if not get_setting('module', 'events', 'anonymousmemberpricing'):
        return redirect('event.multi_register', event_id)
        
    # clear user list session
    request.session['user_list'] = []
    
    event = get_object_or_404(Event, pk=event_id)
    
    # check if event allows registration
    if (event.registration_configuration is None or not event.registration_configuration.enabled):
        raise Http404
    
    # check if it is still open, always open for admin users
    if not request.user.profile.is_superuser:
        status = reg_status(event, request.user)
        if status == REG_FULL:
            messages.add_message(request, messages.ERROR, _('Registration is full.'))
            return redirect('event', event.pk)
        elif status == REG_CLOSED:
            messages.add_message(request, messages.ERROR, _('Registration is closed.'))
            return redirect('event', event.pk)
    
    user = AnonymousUser()
    # get available pricings
    active_pricings = get_active_pricings(event)
    event_pricings = event.registration_configuration.regconfpricing_set.all()
    
    # get available addons
    active_addons = get_active_addons(event)

    # check if use a custom reg form
    custom_reg_form = None
    reg_conf = event.registration_configuration
    if reg_conf.use_custom_reg_form:
        if reg_conf.bind_reg_form_to_conf_only:
            custom_reg_form = reg_conf.reg_form
            
    #custom_reg_form = None
                               
    if custom_reg_form:
        RF = FormForCustomRegForm
    else:
        RF = RegistrantForm
    
    # start the form set factory    
    RegistrantFormSet = formset_factory(
        RF,
        formset=RegistrantBaseFormSet,
        can_delete=True,
        extra=0,
    )
    
    RegAddonFormSet = formset_factory(
        RegAddonForm,
        formset=RegAddonBaseFormSet,
        extra=0,
    )
    
    if request.method == "POST":
        # process the submitted forms
        params = {'prefix': 'registrant',
                 'event': event,
                 'extra_params': {
                                  'pricings':event_pricings,
                                  }
                  }
        if custom_reg_form:
            params['extra_params'].update({"custom_reg_form": custom_reg_form,
                                           'event': event}) 
        reg_formset = RegistrantFormSet(request.POST,
                            **params)
        
        reg_form = RegistrationForm(event, request.user, request.POST,
                    reg_count = len(reg_formset.forms))
        
        # This form is just here to preserve the data in case of invalid registrants
        # The real validation of addons is after validation of registrants
        addon_formset = RegAddonFormSet(request.POST,
                            prefix='addon',
                            event=event,
                            extra_params={
                                'addons':active_addons,
                                'valid_addons':active_addons,
                            })
        addon_formset.is_valid()
        
        # validate the form and formset
        if False not in (reg_form.is_valid(), reg_formset.is_valid()):
            valid_addons = get_addons_for_list(event, reg_formset.get_user_list())
            # validate the addons
            addon_formset = RegAddonFormSet(request.POST,
                            prefix='addon',
                            event=event,
                            extra_params={
                                'addons':active_addons,
                                'valid_addons':valid_addons,
                            })
            if addon_formset.is_valid():
                # process the registration
                # this will create the registrants and apply the discount
                reg8n = process_registration(reg_form, reg_formset,  addon_formset, custom_reg_form=custom_reg_form)
                
                self_reg8n = get_setting('module', 'users', 'selfregistration')
                is_credit_card_payment = (reg8n.payment_method and 
                    (reg8n.payment_method.machine_name).lower() == 'credit-card'
                    and reg8n.amount_paid > 0)
                registrants = reg8n.registrant_set.all().order_by('id')
                for registrant in registrants:
                    #registrant.assign_mapped_fields()
                    if registrant.custom_reg_form_entry:
                        registrant.name = registrant.custom_reg_form_entry.__unicode__()
                    else:
                        registrant.name = ' '.join([registrant.first_name, registrant.last_name])
                
                if is_credit_card_payment: # online payment
                    # email the admins as well
                    email_admins(event, reg8n.amount_paid, self_reg8n, reg8n, registrants)
                    # get invoice; redirect to online pay
                    return redirect('payment.pay_online',
                        reg8n.invoice.id, reg8n.invoice.guid)
                else:
                    # offline payment
                    # email the registrant
                    send_registrant_email(reg8n, self_reg8n)
                    # email the admins as well
                    email_admins(event, reg8n.amount_paid, self_reg8n, reg8n, registrants)

                EventLog.objects.log(instance=event)
                
                # redirect to confirmation
                return redirect('event.registration_confirmation', event_id, reg8n.registrant.hash)
    else:
        params = {'prefix': 'registrant',
                    'event': event,
                    'extra_params': {
                        'pricings':event_pricings,
                    }
                  }
        if custom_reg_form:
            params['extra_params'].update({"custom_reg_form": custom_reg_form,
                                           'event': event}) 
        # intialize empty forms
        reg_formset = RegistrantFormSet(**params)
        reg_form = RegistrationForm(event, request.user)
        addon_formset = RegAddonFormSet(
                            prefix='addon',
                            event=event,
                            extra_params={
                                'addons':active_addons,
                            })
    
    sets = reg_formset.get_sets()
    
    # build our hidden form dynamically
    hidden_form = None
    if custom_reg_form:
        params = {'prefix': 'registrant',
                  'event': event,
                  'extra_params': {
                        'pricings':event_pricings,
                        'custom_reg_form': custom_reg_form,
                        'event': event
                    }
                  }
        FormSet = formset_factory(
            FormForCustomRegForm,
            formset=RegistrantBaseFormSet,
            can_delete=True,
            extra=1,
        )
        formset = FormSet(**params)
        hidden_form = formset.forms[0]
        
    
    return render_to_response(template_name, {
            'event':event,
            'reg_form':reg_form,
            'custom_reg_form': custom_reg_form,
            'hidden_form': hidden_form,
            'registrant': reg_formset,
            'addon_formset': addon_formset,
            'sets': sets,
            'addons':active_addons,
            'pricings':active_pricings,
            'anon_pricing':True,
            'total_price':reg_formset.get_total_price()+addon_formset.get_total_price(),
            'allow_memberid_pricing':get_setting('module', 'events', 'memberidpricing'),
            'shared_pricing':get_setting('module', 'events', 'sharedpricing'),
            }, context_instance=RequestContext(request))
Example #4
0
def multi_register(request,
                   event_id,
                   template_name="events/registration/multi_register.html"):
    """
    This view is where a user defines the specifics of his/her registrations.
    A registration set is a set of registrants (one or many) that comply with a specific pricing.
    A pricing defines the maximum number of registrants in a registration set.
    A user can avail multiple registration sets.
    
    If the site setting anonymousmemberpricing is enabled,
    anonymous users can select non public pricings in their registration sets,
    provided that the first registrant of every registration set's email is validated to be an existing user.
    
    If the site setting anonymousmemberpricing is disabled,
    anonymous users will not be able to see non public prices.
    """

    # redirect to default registration if anonymousmemberpricing not enabled
    if not get_setting('module', 'events', 'anonymousmemberpricing'):
        return redirect('event.multi_register', event_id)

    # clear user list session
    request.session['user_list'] = []

    event = get_object_or_404(Event, pk=event_id)

    # check if event allows registration
    if (event.registration_configuration is None
            or not event.registration_configuration.enabled):
        raise Http404

    # check if it is still open, always open for admin users
    if not request.user.profile.is_superuser:
        status = reg_status(event, request.user)
        if status == REG_FULL:
            messages.add_message(request, messages.ERROR,
                                 _('Registration is full.'))
            return redirect('event', event.pk)
        elif status == REG_CLOSED:
            messages.add_message(request, messages.ERROR,
                                 _('Registration is closed.'))
            return redirect('event', event.pk)

    user = AnonymousUser()
    # get available pricings
    active_pricings = get_active_pricings(event)
    event_pricings = event.registration_configuration.regconfpricing_set.all()

    # get available addons
    active_addons = get_active_addons(event)

    # check if use a custom reg form
    custom_reg_form = None
    reg_conf = event.registration_configuration
    if reg_conf.use_custom_reg_form:
        if reg_conf.bind_reg_form_to_conf_only:
            custom_reg_form = reg_conf.reg_form

    #custom_reg_form = None

    if custom_reg_form:
        RF = FormForCustomRegForm
    else:
        RF = RegistrantForm

    # start the form set factory
    RegistrantFormSet = formset_factory(
        RF,
        formset=RegistrantBaseFormSet,
        can_delete=True,
        extra=0,
    )

    RegAddonFormSet = formset_factory(
        RegAddonForm,
        formset=RegAddonBaseFormSet,
        extra=0,
    )

    if request.method == "POST":
        # process the submitted forms
        params = {
            'prefix': 'registrant',
            'event': event,
            'extra_params': {
                'pricings': event_pricings,
            }
        }
        if custom_reg_form:
            params['extra_params'].update({
                "custom_reg_form": custom_reg_form,
                'event': event
            })
        reg_formset = RegistrantFormSet(request.POST, **params)

        reg_form = RegistrationForm(event,
                                    request.user,
                                    request.POST,
                                    reg_count=len(reg_formset.forms))

        # This form is just here to preserve the data in case of invalid registrants
        # The real validation of addons is after validation of registrants
        addon_formset = RegAddonFormSet(request.POST,
                                        prefix='addon',
                                        event=event,
                                        extra_params={
                                            'addons': active_addons,
                                            'valid_addons': active_addons,
                                        })
        addon_formset.is_valid()

        # validate the form and formset
        if False not in (reg_form.is_valid(), reg_formset.is_valid()):
            valid_addons = get_addons_for_list(event,
                                               reg_formset.get_user_list())
            # validate the addons
            addon_formset = RegAddonFormSet(request.POST,
                                            prefix='addon',
                                            event=event,
                                            extra_params={
                                                'addons': active_addons,
                                                'valid_addons': valid_addons,
                                            })
            if addon_formset.is_valid():
                # process the registration
                # this will create the registrants and apply the discount
                reg8n = process_registration(reg_form,
                                             reg_formset,
                                             addon_formset,
                                             custom_reg_form=custom_reg_form)

                self_reg8n = get_setting('module', 'users', 'selfregistration')
                is_credit_card_payment = (reg8n.payment_method and (
                    reg8n.payment_method.machine_name).lower() == 'credit-card'
                                          and reg8n.amount_paid > 0)
                registrants = reg8n.registrant_set.all().order_by('id')
                for registrant in registrants:
                    #registrant.assign_mapped_fields()
                    if registrant.custom_reg_form_entry:
                        registrant.name = registrant.custom_reg_form_entry.__unicode__(
                        )
                    else:
                        registrant.name = ' '.join(
                            [registrant.first_name, registrant.last_name])

                if is_credit_card_payment:  # online payment
                    # email the admins as well
                    email_admins(event, reg8n.amount_paid, self_reg8n, reg8n,
                                 registrants)
                    # get invoice; redirect to online pay
                    return redirect('payment.pay_online', reg8n.invoice.id,
                                    reg8n.invoice.guid)
                else:
                    # offline payment
                    # email the registrant
                    send_registrant_email(reg8n, self_reg8n)
                    # email the admins as well
                    email_admins(event, reg8n.amount_paid, self_reg8n, reg8n,
                                 registrants)

                EventLog.objects.log(instance=event)

                # redirect to confirmation
                return redirect('event.registration_confirmation', event_id,
                                reg8n.registrant.hash)
    else:
        params = {
            'prefix': 'registrant',
            'event': event,
            'extra_params': {
                'pricings': event_pricings,
            }
        }
        if custom_reg_form:
            params['extra_params'].update({
                "custom_reg_form": custom_reg_form,
                'event': event
            })
        # intialize empty forms
        reg_formset = RegistrantFormSet(**params)
        reg_form = RegistrationForm(event, request.user)
        addon_formset = RegAddonFormSet(prefix='addon',
                                        event=event,
                                        extra_params={
                                            'addons': active_addons,
                                        })

    sets = reg_formset.get_sets()

    # build our hidden form dynamically
    hidden_form = None
    if custom_reg_form:
        params = {
            'prefix': 'registrant',
            'event': event,
            'extra_params': {
                'pricings': event_pricings,
                'custom_reg_form': custom_reg_form,
                'event': event
            }
        }
        FormSet = formset_factory(
            FormForCustomRegForm,
            formset=RegistrantBaseFormSet,
            can_delete=True,
            extra=1,
        )
        formset = FormSet(**params)
        hidden_form = formset.forms[0]

    return render_to_response(template_name, {
        'event':
        event,
        'reg_form':
        reg_form,
        'custom_reg_form':
        custom_reg_form,
        'hidden_form':
        hidden_form,
        'registrant':
        reg_formset,
        'addon_formset':
        addon_formset,
        'sets':
        sets,
        'addons':
        active_addons,
        'pricings':
        active_pricings,
        'anon_pricing':
        True,
        'total_price':
        reg_formset.get_total_price() + addon_formset.get_total_price(),
        'allow_memberid_pricing':
        get_setting('module', 'events', 'memberidpricing'),
        'shared_pricing':
        get_setting('module', 'events', 'sharedpricing'),
    },
                              context_instance=RequestContext(request))