def test_block_type_queryset_for_new_form(self): """ Block_type choices should not include blocktypes for which the user already has an active block """ available_block_type = mommy.make_recipe('booking.blocktype', _quantity=5) self.assertEquals(BlockType.objects.all().count(), 6) formset = UserBlockFormSet(instance=self.user, user=self.user) form = formset.forms[-1] block_type_queryset = form.fields['block_type'].queryset self.assertEquals(block_type_queryset.count(), 5) self.assertFalse(self.block_type in block_type_queryset) # blocktypes of unpaid blocks which are otherwise active are also not # included in the choices self.block.paid = False self.block.save() formset = UserBlockFormSet(instance=self.user, user=self.user) form = formset.forms[-1] block_type_queryset = form.fields['block_type'].queryset self.assertEquals(block_type_queryset.count(), 5) self.assertFalse(self.block_type in block_type_queryset) # blocktypes of expired blocks are included in the choices self.block.start_date = timezone.now() - timedelta(100) self.block_type.duration = 2 self.block_type.save() self.block.save() self.assertTrue(self.block.expired) formset = UserBlockFormSet(instance=self.user, user=self.user) form = formset.forms[-1] block_type_queryset = form.fields['block_type'].queryset self.assertEquals(block_type_queryset.count(), 6) self.assertIn(self.block_type, block_type_queryset)
def test_additional_data_in_form(self): event_type = mommy.make_recipe('booking.event_type_OE') available_block_type = mommy.make_recipe('booking.blocktype', event_type=event_type) formset = UserBlockFormSet(data=self.formset_data(), instance=self.user, user=self.user) form = formset.forms[0] self.assertTrue(form.can_buy_block) self.assertEquals(form.paid_id, 'paid_0')
def test_delete_checkbox(self): """ Delete checkbox should be active only for unpaid blocks, unused free blocks or unused transfer blocks """ unpaid = mommy.make_recipe('booking.block', user=self.user, paid=False) free_block_type = mommy.make_recipe('booking.free_blocktype') free = mommy.make('booking.block', user=self.user, paid=True, block_type=free_block_type) free_used = mommy.make_recipe('booking.block', user=self.user, paid=True, block_type=free_block_type) mommy.make_recipe('booking.booking', user=self.user, block=free_used) transfer = mommy.make_recipe('booking.block', user=self.user, paid=True, block_type__identifier='transferred') transfer_used = mommy.make_recipe('booking.block', user=self.user, paid=True, block_type__identifier='transferred') mommy.make_recipe('booking.booking', user=self.user, block=transfer_used) cannot_delete = [self.block, free_used, transfer_used] formset = UserBlockFormSet(instance=self.user, user=self.user) self.assertEqual(len(formset.forms), 7) # 6 blocks plus new form for form in formset.forms[:-1]: disabled = form.fields['DELETE'].widget.attrs.get('disabled', None) if form.instance in cannot_delete: self.assertEqual(disabled, 'disabled') else: self.assertIsNone(disabled)
def user_blocks_view(request, user_id): user = get_object_or_404(User, id=user_id) if request.method == 'POST': userblockformset = UserBlockFormSet( request.POST, instance=user, user=user ) if userblockformset.is_valid(): if not userblockformset.has_changed(): messages.info(request, "No changes were made") else: for form in userblockformset: if form.has_changed(): block = form.save(commit=False) if 'DELETE' in form.changed_data: messages.success( request, mark_safe( 'Block <strong>{}</strong> has been ' 'deleted! Any bookings made with this ' 'block have been changed to unpaid. ' 'Please inform user {} ({})'.format( block, block.user.username, block.user.email ) ) ) ActivityLog.objects.create( log='Block {} (id {}) deleted by admin user {}'.format( form.instance, form.instance.id, request.user.username) ) block.delete() else: new = False if form.instance.id else True msg = 'created' if new else 'updated' messages.success( request, 'Block for {} has been {}'.format( block.block_type.event_type, msg ) ) block.save() ActivityLog.objects.create( log='Block id {} ({}), user {}, {}' ' by admin user {}'.format( block.id, block.block_type, block.user.username, msg, request.user.username ) ) userblockformset.save(commit=False) return HttpResponseRedirect( reverse('studioadmin:user_blocks_list', kwargs={'user_id': user.id} ) ) else: messages.error( request, mark_safe( "There were errors in the following fields:\n{}".format( '\n'.join( ["{}".format(error) for error in userblockformset.errors] ) ) ) ) else: queryset = Block.objects.filter( user=user).order_by('-start_date') userblockformset = UserBlockFormSet( instance=user, queryset=queryset, user=user ) template = 'studioadmin/user_block_list.html' return TemplateResponse( request, template, { 'userblockformset': userblockformset, 'user': user, 'sidenav_selection': 'users' } )
def test_form_valid(self): formset = UserBlockFormSet( data=self.formset_data(), initial=[{'user': self.user.id, 'block': self.block.id}] ) self.assertTrue(formset.is_valid(), formset.errors)
def block_bookings_view(request): userblocks = [] for block in Block.objects.all(): users = set([booking.user for booking in block.bookings.all()]) [userblocks.append({'user': user.id, 'block': block.id}) for user in users] if request.method == 'POST': userblocksformset = UserBlockFormSet(request.POST, initial=userblocks) if userblocksformset.is_valid(): if not userblocksformset.has_changed(): # don't report this message if form is empty messages.info(request, 'No changes made') else: for form in userblocksformset: if form.is_valid() and form.has_changed(): if form.changed_data == ['send_confirmation']: messages.info( request, "'Send confirmation' checked for '{}' " "but no changes were made; email has not " "been sent to user." .format( form.instance.event ) ) else: block = form.cleaned_data['block'] user = form.cleaned_data['user'] if form.cleaned_data['DELETE']: bookings = [ bk for bk in user.bookings.all() if bk.block == block and bk.event.date > timezone.now() ] for booking in bookings: was_full = booking.event.spaces_left() == 0 booking.status = 'CANCELLED' booking.save() if was_full: _process_waiting_list(booking, request) messages.success( request, mark_safe( 'Remaining bookings in block {} have ' 'been cancelled for user {}: ' '<ul>{}</ul>'.format( block.name, user.username, ''.join(['<li>{}</li>'.format(bk.event) for bk in bookings]) ) ) ) ActivityLog.objects.create( log='Block {} for user {} cancelled by admin' 'user {} (booking ids {})'.format( block.name, user.username, request.user.username, ', '.join([str(bk.id) for bk in bookings]) ) ) _process_block_confirmation_email( request, user, form, block, 'cancelled' ) else: for event in block.events.all(): Booking.objects.create( event=event, user=user, block=block, paid=True, payment_confirmed=True ) try: waiting_list_user = WaitingListUser.objects.get( user=user, event=event ) waiting_list_user.delete() ActivityLog.objects.create( log='User {} has been removed ' 'from the waiting list for {}' .format(user.username, event) ) except WaitingListUser.DoesNotExist: pass messages.success( request, 'Block {} booked for user {}. Bookings for ' 'classes in this block are marked as paid and' ' confirmed'.format( block.name, user.username ) ) ActivityLog.objects.create( log='Block {} booked for user {} by admin ' 'user {}'.format( block.name, user.username, request.user.username ) ) _process_block_confirmation_email( request, user, form, block, 'created' ) else: for error in form.errors: messages.error(request, mark_safe("{}".format(error))) return HttpResponseRedirect(reverse('studioadmin:block_bookings')) else: messages.error( request, mark_safe( "There were errors in the following fields:\n{}".format( '\n'.join( ["{}".format(error) for error in userblocksformset.errors] ) ) ) ) # initial data for UserBlockFormSet needs to be a list of dictionaries # with user and block info userblocksformset = UserBlockFormSet(initial=userblocks) return TemplateResponse( request, 'studioadmin/block_bookings_list.html', { 'userblocksformset': userblocksformset, 'sidenav_selection': 'block_bookings' } )
def test_form_valid(self): formset = UserBlockFormSet(data=self.formset_data(), instance=self.user, user=self.user) self.assertTrue(formset.is_valid(), formset.errors)