def __init__(self, *args, **kwargs): super(BaseArticleAdminForm, self).__init__(*args, **kwargs) # pylint: disable=E1002 self.article = kwargs.get('instance', None) templates = get_article_templates(self.article, getattr(self, "current_user", None)) if templates: self.fields['template'].widget = forms.Select(choices=templates) self.slug_fields = [] if is_localized(): for lang_and_name in settings.LANGUAGES: from modeltranslation.utils import build_localized_fieldname field_name = build_localized_fieldname('slug', lang_and_name[0]) self.slug_fields.append(field_name) else: self.slug_fields = ['slug'] can_change_article_slug = can_rewrite_url() if not can_change_article_slug: can_change_article_slug = ( self.article.publication != BaseArticle.PUBLISHED ) if self.article else True for slug_field in self.slug_fields: if not can_change_article_slug: self.fields[slug_field].widget = ReadOnlyInput()
def test_new_article_two_sites(self): other_site = mommy.make(Site) article_class = get_article_class() self._log_as_editor() data = { 'title': "Un titre", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': sorted([settings.SITE_ID, other_site.id]) } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.count(), 1) article = article_class.objects.all()[0] self.assertEqual(article.title, data['title']) self.assertEqual(article.publication, data['publication']) self.assertEqual(article.template, data['template']) self.assertEqual(article.navigation_parent, None) self.assertEqual(NavNode.objects.count(), 0) self.assertEqual( [_article.id for _article in article.sites.order_by("id")], data['sites'])
def test_new_article_invalid_category_site(self): article_class = get_article_class() category1 = mommy.make(ArticleCategory) category1.sites.clear() category1.sites.add(Site.objects.get_current()) category1.save() category2 = mommy.make(ArticleCategory) category2.sites.clear() category2.save() self._log_as_editor() data = { 'title': "Un titre", 'category': category2.id, 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.count(), 0) soup = BeautifulSoup(response.content) self.assertEqual(len(soup.select("ul.errorlist")), 1)
def __init__(self, user, *args, **kwargs): article = kwargs['instance'] try: initials = kwargs['initial'] except KeyError: initials = {} summary = article.summary if not summary: summary = dehtml(article.content)[:400] initials.update({'summary': summary}) initials.update({'publication_date': article.publication_date.strftime("%Y-%m-%d %H:%M:%S")}) kwargs['initial'] = initials super(ArticleSettingsForm, self).__init__(*args, **kwargs) # pylint: disable=E1002 self.fields['category'].queryset = self.fields['category'].queryset.filter(sites=settings.SITE_ID) choices = get_article_templates(article, user) if choices: self.fields["template"] = forms.ChoiceField(choices=choices) else: self.fields["template"] = forms.CharField() if 'sites' in self.fields and not is_multi_site(): self.fields['sites'].widget = forms.MultipleHiddenInput()
def __init__(self, user, *args, **kwargs): article = kwargs['instance'] try: initials = kwargs['initial'] except KeyError: initials = {} summary = article.summary if not summary: summary = dehtml(article.content)[:400] initials.update({'summary': summary}) initials.update({ 'publication_date': article.publication_date.strftime("%Y-%m-%d %H:%M:%S") }) kwargs['initial'] = initials super(ArticleSettingsForm, self).__init__(*args, **kwargs) # pylint: disable=E1002 self.fields['category'].queryset = self.fields[ 'category'].queryset.filter(sites=settings.SITE_ID) choices = get_article_templates(article, user) if choices: self.fields["template"] = forms.ChoiceField(choices=choices) else: self.fields["template"] = forms.CharField() if 'sites' in self.fields and not is_multi_site(): self.fields['sites'].widget = forms.MultipleHiddenInput()
def test_new_article_navigation(self): article_class = get_article_class() tree = get_navtree_class().objects.create() self._log_as_editor() data = { 'title': "Un titre", 'publication': BaseArticle.PUBLISHED, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': -tree.id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.count(), 1) article = article_class.objects.all()[0] self.assertEqual(article.title, data['title']) self.assertEqual(article.publication, data['publication']) self.assertEqual(article.template, data['template']) self.assertEqual(article.navigation_parent, -tree.id) self.assertEqual(NavNode.objects.count(), 1) node = NavNode.objects.all()[0] self.assertEqual(node.content_object, article) self.assertEqual(node.parent, None) self.assertEqual(node.tree, tree)
def test_new_article_navigation_leaf(self): initial_data = {'title': "test", 'content': "this is my article content"} article_class = get_article_class() art1 = article_class.objects.create(publication=BaseArticle.PUBLISHED, **initial_data) tree = get_navtree_class().objects.create() ct = ContentType.objects.get_for_model(article_class) node1 = NavNode.objects.create(content_type=ct, object_id=art1.id, tree=tree, parent=None) self._log_as_editor() data = { 'title': "Un titre", 'publication': BaseArticle.PUBLISHED, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': node1.id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.exclude(id=art1.id).count(), 1) art2 = article_class.objects.exclude(id=art1.id)[0] self.assertEqual(art2.title, data['title']) self.assertEqual(art2.publication, data['publication']) self.assertEqual(art2.template, data['template']) self.assertEqual(art2.navigation_parent, node1.id) self.assertEqual(NavNode.objects.count(), 2) node2 = NavNode.objects.exclude(id=node1.id)[0] self.assertEqual(node2.content_object, art2) self.assertEqual(node2.parent, node1)
def test_new_article_two_sites(self): other_site = mommy.make(Site) article_class = get_article_class() self._log_as_editor() data = { 'title': "Un titre", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': sorted([settings.SITE_ID, other_site.id]) } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.count(), 1) article = article_class.objects.all()[0] self.assertEqual(article.title, data['title']) self.assertEqual(article.publication, data['publication']) self.assertEqual(article.template, data['template']) self.assertEqual(article.navigation_parent, None) self.assertEqual(NavNode.objects.count(), 0) self.assertEqual([_article.id for _article in article.sites.order_by("id")], data['sites'])
def test_article_settings_no_sites(self): other_site = mommy.make(Site) initial_data = {'title': "test", 'content': "this is my article content"} article_class = get_article_class() art1 = article_class.objects.create(publication=BaseArticle.PUBLISHED, **initial_data) self._log_as_editor() data = { 'template': get_article_templates(None, self.user)[0][0], 'category': '', 'publication': BaseArticle.PUBLISHED, 'publication_date': "2013-01-01 12:00:00", 'headline': True, 'in_newsletter': True, 'summary': 'short summary', 'navigation_parent': None, 'sites': [] } response = self.client.post(reverse('coop_cms_article_settings', args=[art1.id]), data=data, follow=True) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content) self.assertEqual(len(soup.select("ul.errorlist")), 1) self.assertEqual(article_class.objects.exclude(id=art1.id).count(), 0) art1 = article_class.objects.get(id=art1.id) self.assertNotEqual(art1.summary, data['summary']) self.assertEqual(sorted([a.id for a in art1.sites.all()]), [settings.SITE_ID])
def __init__(self, article, user, *args, **kwargs): super(ArticleTemplateForm, self).__init__(*args, **kwargs) # pylint: disable=E1002 choices = get_article_templates(article, user) if choices: self.fields["template"] = forms.ChoiceField(choices=choices) else: self.fields["template"] = forms.CharField() self.fields["template"].initial = article.template
def __init__(self, user, *args, **kwargs): super(NewArticleForm, self).__init__(*args, **kwargs) choices = get_article_templates(None, user) if choices: self.fields["template"] = forms.ChoiceField(choices=choices) else: self.fields["template"] = forms.CharField() self.fields["title"].widget = forms.TextInput(attrs={'size': 30})
def __init__(self, *args, **kwargs): super(ArticleAdminForm, self).__init__(*args, **kwargs) self.article = kwargs.get('instance', None) self.fields['navigation_parent'] = forms.ChoiceField( choices=get_node_choices(), required=False, help_text=get_navigation_parent_help_text() ) if self.article: self.initial['navigation_parent'] = self.article.navigation_parent templates = get_article_templates(self.article, self.current_user) if templates: self.fields['template'].widget = forms.Select(choices=templates)
def test_new_article_no_perm(self): article_class = get_article_class() self._log_as_editor_no_add() data = { 'title': "Ceci est un titre", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(403, response.status_code) self.assertEqual(article_class.objects.filter(title=data['title']).count(), 0)
def __init__(self, user, *args, **kwargs): super(NewArticleForm, self).__init__(*args, **kwargs) # pylint: disable=E1002 choices = get_article_templates(None, user) if choices: self.fields["template"] = forms.ChoiceField(choices=choices) else: self.fields["template"] = forms.CharField() self.fields["title"].required = True self.fields["title"].widget = forms.TextInput(attrs={'size': 30}) self.fields['category'].queryset = self.fields['category'].queryset.filter(sites=settings.SITE_ID) if 'sites' in self.fields: self.fields['sites'].initial = self.get_initials('sites') if not is_multi_site(): self.fields['sites'].widget = forms.MultipleHiddenInput()
def test_new_article_no_perm(self): article_class = get_article_class() self._log_as_editor_no_add() data = { 'title': "Ceci est un titre", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(403, response.status_code) self.assertEqual( article_class.objects.filter(title=data['title']).count(), 0)
def test_new_article_title_required(self): article_class = get_article_class() self._log_as_editor() data = { 'title': "", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content) self.assertEqual(article_class.objects.count(), 0) self.assertEqual(len(soup.select("ul.errorlist")), 1)
def __init__(self, user, *args, **kwargs): article = kwargs['instance'] try: initials = kwargs['initial'] except: initials = {} summary = article.summary if not summary: summary = dehtml(article.content)[:250] initials.update({'summary': summary}) kwargs['initial'] = initials super(ArticleSettingsForm, self).__init__(*args, **kwargs) choices = get_article_templates(article, user) if choices: self.fields["template"] = forms.ChoiceField(choices=choices) else: self.fields["template"] = forms.CharField()
def test_new_article_anonymous(self): article_class = get_article_class() self._log_as_editor() #create self.user self.client.logout() data = { 'title': "Ceci est un titre", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(200, response.status_code) # if can_edit returns 404 error next_url = response.redirect_chain[-1][0] login_url = reverse('login') self.assertTrue(login_url in next_url) self.assertEqual(article_class.objects.filter(title=data['title']).count(), 0)
def test_new_article_navigation_leaf(self): initial_data = { 'title': "test", 'content': "this is my article content" } article_class = get_article_class() art1 = article_class.objects.create(publication=BaseArticle.PUBLISHED, **initial_data) tree = get_navtree_class().objects.create() ct = ContentType.objects.get_for_model(article_class) node1 = NavNode.objects.create(content_type=ct, object_id=art1.id, tree=tree, parent=None) self._log_as_editor() data = { 'title': "Un titre", 'publication': BaseArticle.PUBLISHED, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': node1.id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.exclude(id=art1.id).count(), 1) art2 = article_class.objects.exclude(id=art1.id)[0] self.assertEqual(art2.title, data['title']) self.assertEqual(art2.publication, data['publication']) self.assertEqual(art2.template, data['template']) self.assertEqual(art2.navigation_parent, node1.id) self.assertEqual(NavNode.objects.count(), 2) node2 = NavNode.objects.exclude(id=node1.id)[0] self.assertEqual(node2.content_object, art2) self.assertEqual(node2.parent, node1)
def test_article_settings_unknown_sites(self): other_site = mommy.make(Site) initial_data = { 'title': "test", 'content': "this is my article content" } article_class = get_article_class() art1 = article_class.objects.create(publication=BaseArticle.PUBLISHED, **initial_data) self._log_as_editor() data = { 'template': get_article_templates(None, self.user)[0][0], 'category': '', 'publication': BaseArticle.PUBLISHED, 'publication_date': "2013-01-01 12:00:00", 'headline': True, 'in_newsletter': True, 'summary': 'short summary', 'navigation_parent': None, 'sites': [settings.SITE_ID, 999] } response = self.client.post(reverse('coop_cms_article_settings', args=[art1.id]), data=data, follow=True) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content) self.assertEqual(len(soup.select("ul.errorlist")), 1) self.assertEqual(article_class.objects.exclude(id=art1.id).count(), 0) art1 = article_class.objects.get(id=art1.id) self.assertNotEqual(art1.summary, data['summary']) self.assertEqual(sorted([a.id for a in art1.sites.all()]), [settings.SITE_ID])
def __init__(self, *args, **kwargs): super(BaseArticleAdminForm, self).__init__(*args, **kwargs) # pylint: disable=E1002 self.article = kwargs.get('instance', None) templates = get_article_templates(self.article, getattr(self, "current_user", None)) if templates: self.fields['template'].widget = forms.Select(choices=templates) self.slug_fields = [] if is_localized(): for lang_and_name in settings.LANGUAGES: from modeltranslation.utils import build_localized_fieldname field_name = build_localized_fieldname('slug', lang_and_name[0]) self.slug_fields.append(field_name) else: self.slug_fields = ['slug'] can_change_article_slug = can_rewrite_url() if not can_change_article_slug: can_change_article_slug = (self.article.publication != BaseArticle.PUBLISHED) if self.article else True for slug_field in self.slug_fields: if not can_change_article_slug: self.fields[slug_field].widget = ReadOnlyInput()
def test_new_article_anonymous(self): article_class = get_article_class() self._log_as_editor() #create self.user self.client.logout() data = { 'title': "Ceci est un titre", 'publication': BaseArticle.DRAFT, 'template': get_article_templates(None, self.user)[0][0], 'navigation_parent': None, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_new_article'), data=data, follow=True) self.assertEqual(200, response.status_code) # if can_edit returns 404 error next_url = response.redirect_chain[-1][0] login_url = reverse('login') self.assertTrue(login_url in next_url) self.assertEqual( article_class.objects.filter(title=data['title']).count(), 0)
def test_article_settings(self, move_nav=False): initial_data = { 'title': "test", 'content': "this is my article content" } article_class = get_article_class() art0 = mommy.make(article_class, slug="art0") art1 = article_class.objects.create(publication=BaseArticle.PUBLISHED, **initial_data) tree = get_navtree_class().objects.create() ct = ContentType.objects.get_for_model(article_class) node1 = NavNode.objects.create(content_type=ct, object_id=art0.id, tree=tree, parent=None) node2 = NavNode.objects.create(content_type=ct, object_id=art0.id, tree=tree, parent=None) category = mommy.make(ArticleCategory) self._log_as_editor() data = { 'template': get_article_templates(None, self.user)[0][0], 'category': category.id, 'publication': BaseArticle.PUBLISHED, 'publication_date': "2013-01-01 12:00:00", 'headline': True, 'in_newsletter': True, 'summary': 'short summary', 'navigation_parent': node1.id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_article_settings', args=[art1.id]), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual( article_class.objects.exclude(id__in=(art1.id, art0.id)).count(), 0) art1 = article_class.objects.get(id=art1.id) self.assertEqual(art1.title, initial_data['title']) self.assertEqual(art1.publication, data['publication']) self.assertEqual(art1.navigation_parent, node1.id) self.assertEqual(art1.publication_date, make_dt(datetime(2013, 1, 1, 12, 0, 0))) self.assertEqual(art1.headline, data['headline']) self.assertEqual(art1.in_newsletter, data['in_newsletter']) self.assertEqual(art1.summary, data['summary']) self.assertEqual(art1.template, data['template']) self.assertEqual([a.id for a in art1.sites.all()], data['sites']) self.assertEqual(NavNode.objects.count(), 3) node = NavNode.objects.exclude(id__in=(node1.id, node2.id))[0] self.assertEqual(node.content_object, art1) self.assertEqual(node.parent, node1) # Update the article category2 = mommy.make(ArticleCategory) node_id = node2.id if move_nav else node1.id data = { 'template': get_article_templates(None, self.user)[1][0], 'category': category2.id, 'publication': BaseArticle.DRAFT, 'publication_date': "2013-01-01 18:00:00", 'headline': False, 'in_newsletter': False, 'summary': 'another summary', 'navigation_parent': node_id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_article_settings', args=[art1.id]), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual( article_class.objects.exclude(id__in=(art1.id, art0.id)).count(), 0) art1 = article_class.objects.get(id=art1.id) self.assertEqual(art1.title, initial_data['title']) self.assertEqual(art1.publication, data['publication']) self.assertEqual(art1.template, data['template']) self.assertEqual(art1.publication_date, make_dt(datetime(2013, 1, 1, 18, 0, 0))) self.assertEqual(art1.headline, data['headline']) self.assertEqual(art1.in_newsletter, data['in_newsletter']) self.assertEqual(art1.summary, data['summary']) if move_nav: self.assertEqual(NavNode.objects.count(), 4) node = NavNode.objects.exclude(id__in=(node1.id, node2.id, node.id))[0] self.assertEqual(node.content_object, art1) self.assertEqual(node.parent, node2) else: self.assertEqual(NavNode.objects.count(), 3) node = NavNode.objects.exclude(id__in=(node1.id, node2.id))[0] self.assertEqual(node.content_object, art1) self.assertEqual(node.parent, node1)
def __init__(self, *args, **kwargs): super(ArticleAdminForm, self).__init__(*args, **kwargs) self.article = kwargs.get('instance', None) templates = get_article_templates(self.article, self.current_user) if templates: self.fields['template'].widget = forms.Select(choices=templates)
def test_article_settings(self, move_nav=False): initial_data = {'title': "test", 'content': "this is my article content"} article_class = get_article_class() art0 = mommy.make(article_class, slug="art0" ) art1 = article_class.objects.create(publication=BaseArticle.PUBLISHED, **initial_data) tree = get_navtree_class().objects.create() ct = ContentType.objects.get_for_model(article_class) node1 = NavNode.objects.create(content_type=ct, object_id=art0.id, tree=tree, parent=None) node2 = NavNode.objects.create(content_type=ct, object_id=art0.id, tree=tree, parent=None) category = mommy.make(ArticleCategory) self._log_as_editor() data = { 'template': get_article_templates(None, self.user)[0][0], 'category': category.id, 'publication': BaseArticle.PUBLISHED, 'publication_date': "2013-01-01 12:00:00", 'headline': True, 'in_newsletter': True, 'summary': 'short summary', 'navigation_parent': node1.id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_article_settings', args=[art1.id]), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.exclude(id__in=(art1.id, art0.id)).count(), 0) art1 = article_class.objects.get(id=art1.id) self.assertEqual(art1.title, initial_data['title']) self.assertEqual(art1.publication, data['publication']) self.assertEqual(art1.navigation_parent, node1.id) self.assertEqual(art1.publication_date, make_dt(datetime(2013, 1, 1, 12, 0, 0))) self.assertEqual(art1.headline, data['headline']) self.assertEqual(art1.in_newsletter, data['in_newsletter']) self.assertEqual(art1.summary, data['summary']) self.assertEqual(art1.template, data['template']) self.assertEqual([a.id for a in art1.sites.all()], data['sites']) self.assertEqual(NavNode.objects.count(), 3) node = NavNode.objects.exclude(id__in=(node1.id, node2.id))[0] self.assertEqual(node.content_object, art1) self.assertEqual(node.parent, node1) # Update the article category2 = mommy.make(ArticleCategory) node_id = node2.id if move_nav else node1.id data = { 'template': get_article_templates(None, self.user)[1][0], 'category': category2.id, 'publication': BaseArticle.DRAFT, 'publication_date': "2013-01-01 18:00:00", 'headline': False, 'in_newsletter': False, 'summary': 'another summary', 'navigation_parent': node_id, 'sites': [settings.SITE_ID] } response = self.client.post(reverse('coop_cms_article_settings', args=[art1.id]), data=data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(article_class.objects.exclude(id__in=(art1.id, art0.id)).count(), 0) art1 = article_class.objects.get(id=art1.id) self.assertEqual(art1.title, initial_data['title']) self.assertEqual(art1.publication, data['publication']) self.assertEqual(art1.template, data['template']) self.assertEqual(art1.publication_date, make_dt(datetime(2013, 1, 1, 18, 0, 0))) self.assertEqual(art1.headline, data['headline']) self.assertEqual(art1.in_newsletter, data['in_newsletter']) self.assertEqual(art1.summary, data['summary']) if move_nav: self.assertEqual(NavNode.objects.count(), 4) node = NavNode.objects.exclude(id__in=(node1.id, node2.id, node.id))[0] self.assertEqual(node.content_object, art1) self.assertEqual(node.parent, node2) else: self.assertEqual(NavNode.objects.count(), 3) node = NavNode.objects.exclude(id__in=(node1.id, node2.id))[0] self.assertEqual(node.content_object, art1) self.assertEqual(node.parent, node1)