def test_dependency(self): event = Event.objects.get(pk=2) user = SUser.objects.get(pk=1) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.SADMIN, event) form = OptionGroupSelectionsFormSet({ 'option_2': 'checked', 'option_3': 'checked' }, user=user) self.assertTrue(form.is_valid()) self.assertTrue('option_2' in form[0].cleaned_data) self.assertTrue('option_3' in form[0].cleaned_data) # We should remove dependent selections automatically - even in sadmin scope form = OptionGroupSelectionsFormSet({ 'option_3': 'checked' }, user=user) self.assertTrue(form.is_valid()) self.assertFalse(form[0].cleaned_data.get('option_2', False)) self.assertFalse(form[0].cleaned_data.get('option_3', False))
def test_option_scope(self): event = Event.objects.filter(pk=2) user = SUser.objects.get(pk=1) # Tests visibility in the different edit scopes. # The event has one group and 9 options, one for each possible visibility bit # SCOPE: SADMIN - all visible OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.SADMIN, event) form = OptionGroupSelectionsFormSet(user=user) self.assertEqual(len(form), 1) self.assertEqual(len(form[0].fields), 9) # SCOPE: EDIT_MANAGE_WAITING - show in_scope_edit_manage_waiting and in_scope_view_manage (readonly) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_MANAGE_WAITING, event) form = OptionGroupSelectionsFormSet(user=user) self.assertEqual(len(form), 1) self.assertEqual(len(form[0].fields), 2) # SCOPE: EDIT_MANAGE_ACCEPTED OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_MANAGE_ACCEPTED, event) form = OptionGroupSelectionsFormSet(user=user) self.assertEqual(len(form), 1) self.assertEqual(len(form[0].fields), 2) # SCOPE: EDIT_MANAGE_ATTENDED OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_MANAGE_ATTENDED, event) form = OptionGroupSelectionsFormSet(user=user) self.assertEqual(len(form), 1) self.assertEqual(len(form[0].fields), 2) # SCOPE: EDIT_REGISTRATION OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_REGISTRATION, event) form = OptionGroupSelectionsFormSet(user=user) self.assertEqual(len(form), 1) self.assertEqual(len(form[0].fields), 2)
def event_register(request, event, template='eventportal/event_register.html', extra_context=None): # TODO This method should be merged with the nearly identical registration method in eventsingle if extra_context is None: extra_context = {} EventSelectionFormSet = dynamic_selections_formset_factory( SCOPE.EDIT_REGISTRATION, event, helper_factory=attendee_selection_helper_factory ) if event.is_attendee(request.user): return HttpResponseRedirect( reverse('eventportal_event_status', kwargs={'event_pk': event.pk})) if request.method == 'POST': options_form = EventSelectionFormSet(request.POST, user=request.user) if options_form.is_valid(): attendee = Attend.objects.create(event=event, user=request.user, price=0) options_form.save(attendee=attendee) attendee.recalculate_price() attendee.event.send_notification_on_registration(attendee) # If the user has paid fully, and the event policy is to move paid members to the attended state, then do it if event.move_to_accepted_policy == AttendeeAcceptPolicy.on_payment and attendee.is_paid(): attendee.state = AttendState.accepted attendee.save() messages.success(request, _(u'You are now registered for this event.')) attendee_updated_signal.send(event_register, attendee=attendee) return HttpResponseRedirect( reverse('eventportal_event', kwargs={'event_pk': event.pk}) + '?signup=1') else: options_form = EventSelectionFormSet(user=request.user) context = { 'event': event, 'formset': options_form, } context.update(extra_context) return render(request, template, context)
def test_required_checkbox_sadmin(self): event = Event.objects.get(pk=1) user = SUser.objects.get(pk=1) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.SADMIN, event) form = OptionGroupSelectionsFormSet({ }, user=user) self.assertTrue(form.is_valid())
def test_dependency_required_dependency_dependency_selected(self): event = Event.objects.get(pk=3) user = SUser.objects.get(pk=1) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_REGISTRATION, event) # Fail if the dependency is checked, but the required child is not form = OptionGroupSelectionsFormSet({ 'option_4': 'checked' }, user=user) self.assertFalse(form.is_valid())
def test_dependency_required_dependency_none_selected(self): event = Event.objects.get(pk=3) user = SUser.objects.get(pk=1) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_REGISTRATION, event) # None selected, but still valid form = OptionGroupSelectionsFormSet({ }, user=user) self.assertTrue(form.is_valid()) self.assertFalse(form[0].cleaned_data.get('option_4', False)) self.assertFalse(form[0].cleaned_data.get('option_5', False))
def test_dependency_required_dependency_not_selected(self): event = Event.objects.get(pk=3) user = SUser.objects.get(pk=1) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_REGISTRATION, event) # Dependency not selected, so both should be deselected form = OptionGroupSelectionsFormSet({ 'option_5': 'checked' }, user=user) self.assertTrue(form.is_valid()) self.assertFalse(form[0].cleaned_data.get('option_4', False)) self.assertFalse(form[0].cleaned_data.get('option_5', False))
def event_status_update(request, event): attendee = Attend.objects.get(user=request.user, event=event) if attendee.state == AttendState.waiting: scope = SCOPE.EDIT_MANAGE_WAITING elif attendee.state == AttendState.accepted: scope = SCOPE.EDIT_MANAGE_ACCEPTED else: scope = SCOPE.EDIT_MANAGE_ATTENDED EventSelectionFormSet = dynamic_selections_formset_factory( scope, event, helper_factory=attendee_selection_helper_factory ) if request.method == 'POST': form = EventSelectionFormSet(request.POST, user=request.user, attendee=attendee) if form.is_valid(): form.save() attendee.recalculate_price() # If the user has paid fully, and the event policy is to move paid members to the attended state, then do it if event.move_to_accepted_policy == AttendeeAcceptPolicy.on_payment and attendee.is_paid(): attendee.state = AttendState.accepted attendee.save() attendee.event.send_notification_on_registration_update(attendee) attendee_updated_signal.send(event_status_update, attendee=attendee) return HttpResponseRedirect( reverse('eventportal_event_status', kwargs={'event_pk': event.id})) else: form = EventSelectionFormSet(user=request.user, attendee=attendee) return render(request, 'eventportal/status_update.html', { 'event': event, 'formset': form })
def test_required_checkbox(self): event = Event.objects.get(pk=1) user = SUser.objects.get(pk=1) OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_REGISTRATION, event) form = OptionGroupSelectionsFormSet({ }, user=user) self.assertFalse(form.is_valid()) form = OptionGroupSelectionsFormSet({ 'option_1': 'checked' }, user=user) self.assertTrue(form.is_valid())
def event_attendee_selections(request, event_pk, attendee_pk): event = get_object_or_404(Event, pk=event_pk) attendee = get_object_or_404(event.attendees, pk=attendee_pk) DynamicSelectionsFormSet = dynamic_selections_formset_factory( SCOPE.SADMIN, event, helper_factory=attendee_selection_helper_factory ) if request.method == 'POST': formset = DynamicSelectionsFormSet(request.POST, user=attendee.user, attendee=attendee) if formset.is_valid(): formset.save() messages.success(request, 'Saved selections') attendee_updated_signal.send(event_attendee_selections, attendee=attendee) return HttpResponseRedirect(reverse('sadmin2:event_attendee', kwargs={'event_pk': event.pk, 'attendee_pk': attendee.pk})) else: formset = DynamicSelectionsFormSet(user=attendee.user, attendee=attendee) return render(request, 'sadmin2/event/attendee_selections.html', { 'sadmin2_menu_main_active': 'events', 'sadmin2_breadcrumbs_active': 'event_attendees_attendee_selections', 'sadmin2_menu_tab': menu.sadmin2_menu_tab_attendee, 'sadmin2_menu_tab_active': 'selections', 'event': event, 'attendee': attendee, 'formset': formset })
def test_maximum_selected(self): event = Event.objects.get(pk=2) user = SUser.objects.get(pk=1) group = OptionGroup.objects.get(pk=2) group.maximum_selected = 1 group.save() OptionGroupSelectionsFormSet = dynamic_selections_formset_factory(SCOPE.EDIT_REGISTRATION, event) form = OptionGroupSelectionsFormSet({ 'option_2': 'checked', 'option_3': 'checked' }, user=user) self.assertFalse(form.is_valid()) form = OptionGroupSelectionsFormSet({ 'option_2': 'checked' }, user=user) self.assertTrue(form.is_valid())
def step2(request, event, template=None): # TODO This method should be merged with the nearly identical registration method in eventportal step, edit_profile, edit_selections = _get_step(request, event.pk) if step < 2: # we have not arrived at this step yet return HttpResponseRedirect( reverse('eventsingle_steps', kwargs={'event_pk': event.pk}) ) try: attendee = Attend.objects.get(event=event, user=request.user) instance_kwargs = { 'instance': attendee, 'user': request.user } if attendee.state == AttendState.waiting: scope = SCOPE.EDIT_MANAGE_WAITING elif attendee.state == AttendState.accepted: scope = SCOPE.EDIT_MANAGE_ACCEPTED else: scope = SCOPE.EDIT_MANAGE_ATTENDED except Attend.DoesNotExist: attendee = None instance_kwargs = { 'user': request.user } scope = SCOPE.EDIT_REGISTRATION EventSelectionFormSet = dynamic_selections_formset_factory( scope, event, helper_factory=frontend_selection_helper_factory ) if request.method == 'POST' and \ (('quick_register' in request.POST and EventSelectionFormSet.is_empty()) or 'quick_register' not in request.POST): options_form = EventSelectionFormSet(request.POST, **instance_kwargs) if options_form.is_valid(): if attendee is None: attendee = Attend.objects.create(event=event, user=request.user, price=0) else: messages.success(request, _('Selections updated')) options_form.save(attendee=attendee) attendee.recalculate_price() # If the user has paid fully, and the event policy is to move paid members to the attended state, then do it if event.move_to_accepted_policy == AttendeeAcceptPolicy.on_payment and attendee.is_paid(): attendee.state = AttendState.accepted attendee.save() if scope == SCOPE.EDIT_REGISTRATION: attendee.event.send_notification_on_registration(attendee) else: attendee.event.send_notification_on_registration_update(attendee) attendee_updated_signal.send(step2, attendee=attendee) return HttpResponseRedirect( reverse('eventsingle_steps', kwargs={'event_pk': event.pk}) ) else: options_form = EventSelectionFormSet(**instance_kwargs) return render(request, template if template is not None else 'eventsingle/step2.html', { 'formset': options_form, 'step': step, 'current_step': 2, 'can_edit_profile': edit_profile, 'can_edit_selections': edit_selections, 'edit_mode': step > 2 })