class TestAccessForm(TestCase): def test_converts_username_to_user_instance(self): self.given_a_board() self.given_another_user('hortense') self.when_instantiating_access_form_with_username('hortense') self.then_form_should_be_valid() self.then_user_should_be_instance(username='******') def test_rejects_nonexistent_username(self): self.given_a_board() self.given_another_user('hortense') self.when_instantiating_access_form_with_username('bartholemew') self.then_form_should_NOT_be_valid() self.then_user_field_should_have_error_message() # Helpers def given_a_board(self): self.owner = User.objects.create_user(username='******', password='******') self.board = self.owner.board_set.create(name='a') self.bag = self.board.bag_set.create(name='state') self.new_tag = self.bag.tag_set.create(name='new') self.progress_tag = self.bag.tag_set.create(name='in-progress') self.done_tag = self.bag.tag_set.create(name='done') def given_another_user(self, username='******', password='******'): self.other = User.objects.create_user(username=username, password=password) def when_instantiating_access_form_with_username(self, username='******', can_rearrange=True): post = { 'user': username, } if can_rearrange: post['can_rearrange'] = 'on' self.form = AccessForm(post, instance=Access(board=self.board)) def then_form_should_be_valid(self): self.assertTrue(self.form.is_valid()) def then_form_should_NOT_be_valid(self): self.assertFalse(self.form.is_valid()) def then_user_should_be_instance(self, username): actual = self.form.cleaned_data['user'] self.assertTrue(isinstance(actual, User)) self.assertEqual(username, actual.username) def then_user_field_should_have_error_message(self): self.assertTrue(self.form['user'].errors)
def when_instantiating_access_form_with_username(self, username='******', can_rearrange=True): post = { 'user': username, } if can_rearrange: post['can_rearrange'] = 'on' self.form = AccessForm(post, instance=Access(board=self.board))
def board_detail(request, owner, board): if not board.allows_add_remove_user(request.user): add_user_form = None elif request.method == 'POST': add_user_form = AccessForm(request.POST, instance=Access(board=board)) if add_user_form.is_valid(): add_user_form.save(message_callback=lambda msg: messages.info(request, msg)) return redirect_to_board_detail(board) else: add_user_form = AccessForm(instance=Access(board=board)) # blank form collaborators = board.collaborators.all() for x in collaborators: x.can_rearrange = board.allows_rearrange(x) popup_path = reverse('new-card-popup', kwargs={ 'owner_username': board.owner.username, 'board_name': board.name}) popup_url = request.build_absolute_uri(popup_path) features = { 'width': 600, 'height': 200, } features.update((x, 'no') for x in ['location', 'menubar', 'status', 'toolbar']) features.update((x, 'yes') for x in ['resizable', 'scrollbar']) bookmarklet_url = "javascript:d=document,e=escape,x=d.getElementsByTagName('h1');window.open('{url}?title='+e(d.title)+'&h1='+e(x.length?x[0].textContent:'')+'&url='+e(d.location),'new-card','{features}');void(0)".format( url=popup_url, features=','.join('{0}={1}'.format(k, v) for (k, v) in sorted(features.items())) ) return { 'board': board, 'collaborators': collaborators, 'any_cant_rearrange': any(not x.can_rearrange for x in collaborators), 'bags': board.bag_set.all(), 'allows_add_remove_user': board.allows_add_remove_user(request.user), 'add_user_form': add_user_form, 'bookmarklet_url': bookmarklet_url, }
def add_user(request, owner, board): if not board.allows_add_remove_user(request.user): messages.info(request, 'You can’t add users to this board.') return redirect_to_board_detail(board) if request.method == 'POST': print ' request.POST', request.POST form = AccessForm(request.POST, instance=Access(board=board)) if form.is_valid(): try: access = Access.objects.get(user=form.cleaned_data['user'], board=board) access.can_rearrange = form.cleaned_data['can_rearrange'] access.save() messages.info(request, '{0} was already a member.'.format(access.user.username)) except Access.DoesNotExist: access = form.save() return redirect_to_board_detail(board) else: form = AccessForm(instance=Access(board=board)) # blank form return { 'form': form, 'non_field_errors': form.errors.get(NON_FIELD_ERRORS), }