def test_save_first_minutes_document(self): # get the editor page and save the site response = self.app.get(reverse('documents:create', args=['minutesdocument']) + '?group={}'.format(self.group.id), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] text = "Lorem ipsum" form.set('text_en', text) form.set('comment', text) form.set('url_title', slugify(text)) response = form.submit().follow() self.assertEqual(response.status_code, 200) document = MinutesDocument.objects.get(url_title=slugify(text)) # check whether number of versions is correct versions = Version.objects.get_for_object(document) self.assertEqual(len(versions), 1) # check whether the properties of the new document are correct self.assertEqual((document.title_en, document.title_de), MinutesDocument.generate_new_title()) self.assertEqual(document.author, self.user) self.assertEqual(document.moderator, self.user) self.assertEqual(document.text_en, text) self.assertEqual(versions[0].revision.get_comment(), text) self.assertListEqual(list(document.participants.all().order_by('username')), list(self.group.user_set.all().order_by('username'))) checker = ObjectPermissionChecker(self.group) self.assertTrue(checker.has_perm(document.edit_permission_name, document))
def test_save_another_minutes_document(self): test_title = "Test title" test_moderator = baker.make(UserProfile) first_document = baker.make(MinutesDocument, title_en=test_title, moderator=test_moderator) first_document.set_all_permissions(self.group) # get the editor page and save the site response = self.app.get(reverse('documents:create', args=['minutesdocument']) + '?group={}'.format(self.group.id), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] text = "Lorem ipsum" form.set('text_en', text) form.set('comment', text) form.set('url_title', slugify(text)) response = form.submit().follow() self.assertEqual(response.status_code, 200) document = MinutesDocument.objects.get(url_title=slugify(text)) # check whether the properties of the new document are correct self.assertEqual(document.title_en, test_title) # should be taken from previous minutes document self.assertEqual(document.moderator, test_moderator) # should be taken from previous minutes document self.assertEqual(document.author, self.user) self.assertEqual(document.text_en, text) self.assertListEqual(list(document.participants.all().order_by('username')), list(self.group.user_set.all().order_by('username')))
def test_save_another_minutes_document(self): test_title = "Test title" test_moderator = mommy.make(UserProfile) first_document = mommy.make(MinutesDocument, title=test_title, moderator=test_moderator) first_document.set_all_permissions(self.group) # get the editor page and save the site response = self.app.get(reverse('documents:create', args=['minutesdocument']) + '?group={}'.format(self.group.id), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] text = "Lorem ipsum" form.set('text', text) form.set('comment', text) form.set('url_title', slugify(text)) response = form.submit().follow() self.assertEqual(response.status_code, 200) document = MinutesDocument.objects.get(url_title=slugify(text)) # check whether the properties of the new document are correct self.assertEqual(document.title, test_title) # should be taken from previous minutes document self.assertEqual(document.moderator, test_moderator) # should be taken from previous minutes document self.assertEqual(document.author, self.user) self.assertEqual(document.text, text) self.assertListEqual(list(document.participants.all().order_by('username')), list(self.group.user_set.all().order_by('username')))
def test_save_first_minutes_document(self): # get the editor page and save the site response = self.app.get(reverse('documents:create', args=['minutesdocument']) + '?group={}'.format(self.group.id), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] text = "Lorem ipsum" form.set('text', text) form.set('comment', text) form.set('url_title', slugify(text)) response = form.submit().follow() self.assertEqual(response.status_code, 200) document = MinutesDocument.objects.get(url_title=slugify(text)) # check whether number of versions is correct versions = Version.objects.get_for_object(document) self.assertEqual(len(versions), 1) # check whether the properties of the new document are correct self.assertEqual(document.title, MinutesDocument.generate_new_title()) self.assertEqual(document.author, self.user) self.assertEqual(document.moderator, self.user) self.assertEqual(document.text, text) self.assertEqual(versions[0].revision.comment, text) self.assertListEqual(list(document.participants.all().order_by('username')), list(self.group.user_set.all().order_by('username'))) checker = ObjectPermissionChecker(self.group) self.assertTrue(checker.has_perm(document.edit_permission_name, document))
def test_autosave_newPage(self): # create document response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] url_title = slugify(form.get('title').value) # autosave AUTO response = self.app.post(reverse('documents:autosave', args=[url_title]), {'text': 'AUTO', 'title': form.get('title').value, 'comment': ''}, xhr=True) self.assertEqual(response.status_code, 200) # on the new page site should be a banner with a restore link response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) self.assertIn((reverse('edit', args=[url_title]) + '?restore'), str(response.body)) user2 = mommy.make(UserProfile, is_superuser=True) # on the new page site should be a banner with a restore link but not for another user response = self.app.get(reverse('documents:create', args=['informationdocument']), user=user2) self.assertEqual(response.status_code, 200) self.assertNotIn((reverse('edit', args=[url_title]) + '?restore'), str(response.body)) # create second document response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] url_title2 = slugify(form.get('title').value) # autosave second document AUTO response = self.app.post(reverse('documents:autosave', args=[url_title2]), {'text': 'AUTO', 'title': form.get('title').value, 'comment': ''}, user=self.user, xhr=True) self.assertEqual(response.status_code, 200) # on the new page site should be a banner with a restore link for both sites response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertIn((reverse('edit', args=[url_title]) + '?restore'), str(response.body)) self.assertIn((reverse('edit', args=[url_title2]) + '?restore'), str(response.body)) # if not loading autosave text should be still empty response = self.app.get(reverse('edit', args=[url_title]), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] self.assertEqual(form.get('text').value, '') # if loading autosave text should be AUTO response = self.app.get(reverse('edit', args=[url_title]), {'restore': ''}, user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] self.assertEqual(form.get('text').value, 'AUTO')
def test_save_new_page(self): # get the editor page and save the site response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] text = "Hallo Bibi Blocksberg!" form.set('text_en', text) form.set('title_en', text) form.set('comment', text) form.set('url_title', slugify(text)) form.set('group', self.group.pk) response = form.submit().follow() self.assertEqual(response.status_code, 200) document = InformationDocument.objects.get(title_en=text) # check whether number of versions is correct versions = Version.objects.get_for_object(document) self.assertEqual(len(versions), 1) # check whether the properties of the new document are correct self.assertEqual(document.title_en, text) self.assertEqual(document.text_en, text) self.assertEqual(versions[0].revision.get_comment(), text)
def test_save_new_page(self): # get the editor page and save the site response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms[0] text = "Hallo Bibi Blocksberg!" form.set('text', text) form.set('title', text) form.set('comment', text) form.set('url_title', slugify(text)) form.set('group', self.group.pk) response = form.submit().follow() self.assertEqual(response.status_code, 200) document = InformationDocument.objects.get(title=text) # check whether number of versions is correct versions = Version.objects.get_for_object(document) self.assertEqual(len(versions), 1) # check whether the properties of the new document are correct self.assertEqual(document.title, text) self.assertEqual(document.text, text) self.assertEqual(versions[0].revision.comment, text)
def clean_url_title(self): super().clean() url_title = self.cleaned_data['url_title'].lower() if not slugify(url_title) == url_title: raise ValidationError(_('Only the following characters are allowed in the URL: a-z, -, _, /')) if any(url_part in settings.FORBIDDEN_URLS for url_part in url_title.split('/')): raise ValidationError(_('The URL used for this page is not allowed.')) if Document.objects.filter(url_title=url_title).exclude(id=self.instance.id).exists(): raise ValidationError(_('The URL used for this page is already taken.')) return url_title
def generate_default_slug(cls, title): slug = slugify(title) count = 2 while Document.objects.filter(url_title=slug).exists(): # check whether current title already ends with '_\d+' and handle this case accordingly temp_suffix_match = re.search(r'_(?P<count>\d+)$', slug) if temp_suffix_match: slug = slug[:temp_suffix_match.start()] slug = "{}_{}".format(slug, count) count += 1 return slug
def pre_save_document(sender, instance, *args, **kwargs): """ creates a slugified title that can be used as URL to the Document This will be used to identify a document that a user wants to see. In case someone creates a document with the same title it is not not defined which document might show up. So please try to avoid that ;) """ if sender not in Document.__subclasses__(): return # get the max_length of a slug field as we need to make sure it is no longer than that # as slugify is not doing that for us for field in Document._meta.fields: if field.verbose_name == 'url_title' and instance.url_title == "": instance.url_title = slugify(instance.title)[:field.max_length] return
def test_autosave_with_different_document_types(self): # create document response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) form = response.forms['document-form'] url_title = slugify(form.get('title').value) # autosave AUTO response = self.app.post(reverse('documents:autosave', args=[url_title]), {'text': 'AUTO', 'title': form.get('title').value, 'comment': '', 'group': mommy.make(Group)}, xhr=True) self.assertEqual(response.status_code, 200) # there should be no restore link on creation page for different document type response = self.app.get(reverse('documents:create', args=['poll']), user=self.user) self.assertNotIn((reverse('edit', args=[url_title]) + '?restore'), str(response.body)) # on the new page site should be a banner with a restore link response = self.app.get(reverse('documents:create', args=['informationdocument']), user=self.user) self.assertEqual(response.status_code, 200) self.assertIn((reverse('edit', args=[url_title]) + '?restore'), str(response.body))
def save(self, *args, **kwargs): # make sure that the url is slugified self.url_title = slugify(self.url_title) super().save(*args, **kwargs)
def generate_default_slug(cls, title): return slugify(title)