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(), instance=self.user, user=self.user) self.assertTrue(formset.is_valid(), formset.errors)