From 3212102bc88a9ad3342b4f6fd2830ec968f35bea Mon Sep 17 00:00:00 2001 From: Emeric54 Date: Thu, 21 Jan 2016 19:22:48 +0100 Subject: [PATCH 01/52] Mail d'inscription TU --- zds/member/tests/tests_views.py | 4 ++-- zds/member/views.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/zds/member/tests/tests_views.py b/zds/member/tests/tests_views.py index fa0124ccf2..345fef24c7 100644 --- a/zds/member/tests/tests_views.py +++ b/zds/member/tests/tests_views.py @@ -266,8 +266,8 @@ def test_register(self): follow=False) self.assertEqual(result.status_code, 200) - # check a new email has been sent at the new user. - self.assertEquals(len(mail.outbox), 2) + # check a new email hasn't been sent at the new user. + self.assertEquals(len(mail.outbox), 1) # check if the new user is active. self.assertTrue(User.objects.get(username='firm1').is_active) diff --git a/zds/member/views.py b/zds/member/views.py index 196fd49e22..2a21c598ca 100644 --- a/zds/member/views.py +++ b/zds/member/views.py @@ -821,7 +821,7 @@ def active_account(request): _(u"Bienvenue sur {}").format(settings.ZDS_APP['site']['litteral_name']), _(u"Le manuel du nouveau membre"), msg, - True, + False, True, False) token.delete() From 016b2c0ba66a0f963cc2058269b3a007f8ae917d Mon Sep 17 00:00:00 2001 From: Emeric54 Date: Thu, 21 Jan 2016 21:36:42 +0100 Subject: [PATCH 02/52] =?UTF-8?q?[ci=20skip]Met=20=C3=A0=20jour=20l'ann?= =?UTF-8?q?=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 4 ++-- doc/source/conf.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index a230c8df6e..0937cf0626 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Zeste de Savoir - Copyright (c) 2014-2015 Zeste de Savoir + Copyright (c) 2014-2016 Zeste de Savoir This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -12,4 +12,4 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . \ No newline at end of file + along with this program. If not, see . diff --git a/doc/source/conf.py b/doc/source/conf.py index 262ed8e8f4..e00e88f7bd 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -64,7 +64,7 @@ # General information about the project. project = u'Zeste de Savoir' -copyright = u'2015, zestedesavoir' +copyright = u'2016, zestedesavoir' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From ea0089685483b48506b9f11cf4cd40c9baad3072 Mon Sep 17 00:00:00 2001 From: Emeric54 Date: Thu, 21 Jan 2016 21:58:27 +0100 Subject: [PATCH 03/52] =?UTF-8?q?[ci=20skip]=20Typo=20page=20de=20d=C3=A9s?= =?UTF-8?q?inscription?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/member/settings/unregister.html | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/templates/member/settings/unregister.html b/templates/member/settings/unregister.html index be962a8473..7a87d0f3b6 100644 --- a/templates/member/settings/unregister.html +++ b/templates/member/settings/unregister.html @@ -23,31 +23,31 @@ {% block content %}

{% blocktrans with username=user.username %} - Attention {{ username }}, vous êtes sur le point de vous désinscrire de Zeste de Savoir. Voici ce qu'implique cette action qui ne peut être annulée : + Attention {{ username }}, vous êtes sur le point de vous désinscrire de Zeste de Savoir. Voici ce qu'implique cette action qui ne peut être annulée. {% endblocktrans %}

  • - {% trans "Toutes vos conversations privées (MP) seront perdues" %} ; + {% trans "Toutes vos conversations privées (MP) seront perdues" %}.
  • - {% trans "Tous vos messages de forums seront anonymisés" %} ; + {% trans "Tous vos messages de forums seront anonymisés" %}.
  • {% blocktrans with username=user.username email=user.email %} - Votre compte et tout ses détails seront supprimés, cela signifie que l'adresse courriel ({{ email }}) sera effacée du système et votre pseudo ({{ username }}) sera libéré et utilisable par un autre membre ; + Votre compte et tout ses détails seront supprimés, cela signifie que l'adresse courriel ({{ email }}) sera effacée du système et votre pseudo ({{ username }}) sera libéré et utilisable par un autre membre. {% endblocktrans %}
  • - {% trans "Vos tutoriels et articles non publiés (brouillon, bêta ou en cours de validation) seront supprimés sans possibilité de récuperation (sauf si d'autres auteurs sont présents lors de la rédaction" %}) ; + {% trans "Vos tutoriels et articles non publiés (brouillon, bêta ou en cours de validation) seront supprimés sans possibilité de récuperation (sauf si d'autres auteurs sont présents lors de la rédaction" %}).
  • - {% trans "Vos tutoriels et articles publiés subiront les modifications suivantes" %} : + {% trans "Vos tutoriels et articles publiés subiront les modifications suivantes" %}.
    • {% blocktrans %} - si vous étiez seul, ils seront placés sous la gouvernance du compte "Auteur Externe", sauf demande contraire de votre part à un membre du staff avant votre désinscription ; + si vous étiez seul, ils seront placés sous la gouvernance du compte "Auteur Externe", sauf demande contraire de votre part à un membre du staff avant votre désinscription. {% endblocktrans %}
    • @@ -56,16 +56,16 @@
  • - {% trans "Vos galeries d'image subiront les modifications suivantes" %} : + {% trans "Vos galeries d'image subiront les modifications suivantes" %}.
    • {% blocktrans %} - Si la gallerie est liée à un tutoriel, elle subira le même sort que ce dernier (attribution à Auteur externe ou aux autres auteurs du contenu) ; + Si la gallerie est liée à un tutoriel, elle subira le même sort que ce dernier (attribution à Auteur externe ou aux autres auteurs du contenu). {% endblocktrans %}
    • {% blocktrans %} - Si vous êtes plusieurs possesseurs, vous serez simplement supprimé du groupe ; + Si vous êtes plusieurs possesseurs, vous serez simplement supprimé du groupe. {% endblocktrans %}
    • @@ -79,7 +79,7 @@

      - {% blocktrans %} Si vous souhaitez poursuivre votre désinscription, cliquez sur le bouton Me désinscrire ci-dessous. Sinon il n'est pas encore trop tard {% endblocktrans %}... + {% blocktrans %} Si vous souhaitez poursuivre votre désinscription, cliquez sur le bouton Me désinscrire ci-dessous. Sinon, il n'est pas encore trop tard{% endblocktrans %}...

      From 41ac7020cb92bf680a219fac73815b906ff3e99e Mon Sep 17 00:00:00 2001 From: GerardPaligot Date: Fri, 22 Jan 2016 23:15:06 +0100 Subject: [PATCH 04/52] fix(fixture): Updates update_index_date field for topics and comments. --- fixtures/topics.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fixtures/topics.yaml b/fixtures/topics.yaml index 6df66e9fdc..7182fb7d30 100644 --- a/fixtures/topics.yaml +++ b/fixtures/topics.yaml @@ -6,6 +6,7 @@ forum: 10 author: 3 pubdate: 2013-12-21T13:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 last_message: 1 - model: forum.Topic pk: 2 @@ -15,6 +16,7 @@ forum: 3 author: 3 pubdate: 2013-12-21T13:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 last_message: 2 - model: forum.Topic pk: 3 @@ -23,6 +25,7 @@ forum: 2 author: 3 pubdate: 2013-12-21T13:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 last_message: 4 - model: forum.Topic pk: 4 @@ -31,6 +34,7 @@ forum: 12 author: 3 pubdate: 2014-01-05T18:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 last_message: 5 - model: forum.Post pk: 1 @@ -45,6 +49,7 @@ like: 42 dislike: 0 pubdate: 2013-12-21T13:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 position: 1 - model: forum.Post pk: 2 @@ -59,6 +64,7 @@ like: 3 dislike: 12 pubdate: 2013-12-21T13:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 position: 1 - model: forum.Post pk: 3 @@ -73,6 +79,7 @@ like: 42 dislike: 0 pubdate: 2013-12-21T13:22:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 position: 2 - model: forum.Post pk: 4 @@ -87,6 +94,7 @@ like: 0 dislike: 0 pubdate: 2013-12-21T13:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 position: 1 - model: forum.Post pk: 5 @@ -267,4 +275,5 @@ like: 1337 dislike: 0 pubdate: 2014-01-05T18:20:30+00:00 + update_index_date: 2013-12-21T13:20:30+00:00 position: 1 \ No newline at end of file From 1f02d70643d7bb44778f04d0d4c9be346778e961 Mon Sep 17 00:00:00 2001 From: artragis Date: Tue, 19 Jan 2016 09:30:47 +0100 Subject: [PATCH 05/52] Cleanup code and use managers. --- doc/source/back-end-code/forum.rst | 8 ++- doc/source/back-end-code/tutorialv2.rst | 9 ++- zds/featured/managers.py | 6 +- zds/forum/managers.py | 9 ++- zds/pages/utils.py | 49 ----------------- zds/pages/views.py | 16 ++---- zds/tutorialv2/managers.py | 70 ++++++++++++++++++++++++ zds/tutorialv2/models/models_database.py | 5 +- 8 files changed, 100 insertions(+), 72 deletions(-) delete mode 100644 zds/pages/utils.py diff --git a/doc/source/back-end-code/forum.rst b/doc/source/back-end-code/forum.rst index e1aa57beef..82efe44d49 100644 --- a/doc/source/back-end-code/forum.rst +++ b/doc/source/back-end-code/forum.rst @@ -13,8 +13,14 @@ Modèles (``models.py``) .. automodule:: zds.forum.models :members: +Les managers (``managers.py``) +============================== + +.. automodule:: zds.forum.managers + :members: + Vues (``views.py``) =================== .. automodule:: zds.forum.views - :members: \ No newline at end of file + :members: diff --git a/doc/source/back-end-code/tutorialv2.rst b/doc/source/back-end-code/tutorialv2.rst index e53dc952a8..3872dcfd2a 100644 --- a/doc/source/back-end-code/tutorialv2.rst +++ b/doc/source/back-end-code/tutorialv2.rst @@ -22,6 +22,12 @@ Modèles "versionnés" (``models_versioned.py``) .. automodule:: zds.tutorialv2.models.models_versioned :members: +Les managers (``managers.py``) +============================== + +.. automodule:: zds.tutorialv2.managers + :members: + Vues (``views/``) ================= @@ -59,6 +65,7 @@ Les forumulaires (``forms.py``) Les utilitaires (``utils.py``) ============================== + .. automodule:: zds.tutorialv2.utils :members: @@ -66,4 +73,4 @@ Les utilitaires de publication (``publication_utils.py``) ========================================================= .. automodule:: zds.tutorialv2.publication_utils.py - :members: \ No newline at end of file + :members: diff --git a/zds/featured/managers.py b/zds/featured/managers.py index d8b90ec775..7077900dba 100644 --- a/zds/featured/managers.py +++ b/zds/featured/managers.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- from datetime import datetime -from django.core.exceptions import ObjectDoesNotExist from django.db import models from zds import settings @@ -24,7 +23,4 @@ class FeaturedMessageManager(models.Manager): """ def get_last_message(self): - try: - return self.all()[:1].get() - except ObjectDoesNotExist: - return None + return self.last() diff --git a/zds/forum/managers.py b/zds/forum/managers.py index d156f69edd..97235a04e1 100644 --- a/zds/forum/managers.py +++ b/zds/forum/managers.py @@ -60,12 +60,17 @@ def get_beta_topic_of(self, tutorial): return self.filter(key=tutorial.pk, key__isnull=False).first() def get_last_topics(self): + """ + Get last posted topics and prefetch some related properties. + Depends on settings.ZDS_APP['topic']['home_number'] + :return: + :rtype: django.models.Queryset + """ return self.order_by('-pubdate') \ .exclude(Q(forum__group__isnull=False)) \ .exclude(is_locked=True) \ - .all() \ .select_related('forum', 'author', 'last_message') \ - .prefetch_related('tags')[:settings.ZDS_APP['topic']['home_number']] + .prefetch_related('tags').all()[:settings.ZDS_APP['topic']['home_number']] def get_all_topics_of_a_forum(self, forum_pk, is_sticky=False): return self.filter(forum__pk=forum_pk, is_sticky=is_sticky) \ diff --git a/zds/pages/utils.py b/zds/pages/utils.py deleted file mode 100644 index ffbb18f172..0000000000 --- a/zds/pages/utils.py +++ /dev/null @@ -1,49 +0,0 @@ -from zds import settings -from zds.tutorialv2.models.models_database import PublishedContent, PublishableContent - - -def get_last_articles(): - sub_query = "SELECT COUNT(*) FROM {} WHERE {}={}" - sub_query = sub_query.format( - "tutorialv2_contentreaction", - "tutorialv2_contentreaction.related_content_id", - "tutorialv2_publishedcontent.content_pk" - ) - home_number = settings.ZDS_APP['article']['home_number'] - all_contents = PublishableContent.objects.filter(type="ARTICLE")\ - .filter(public_version__isnull=False)\ - .prefetch_related("authors")\ - .prefetch_related("authors__profile")\ - .select_related("last_note")\ - .select_related("public_version")\ - .prefetch_related("subcategory")\ - .extra(select={"count_note": sub_query})\ - .order_by('-public_version__publication_date')[:home_number] - published = [] - for content in all_contents: - content.public_version.content = content - published.append(content.public_version) - return published - - -def get_last_tutorials(): - home_number = settings.ZDS_APP['tutorial']['home_number'] - all_contents = PublishableContent.objects.filter(type="TUTORIAL")\ - .filter(public_version__isnull=False)\ - .prefetch_related("authors")\ - .prefetch_related("authors__profile")\ - .select_related("last_note")\ - .select_related("public_version")\ - .prefetch_related("subcategory")\ - .order_by('-public_version__publication_date')[:home_number] - published = [] - for content in all_contents: - content.public_version.content = content - published.append(content.public_version) - return published - - -def get_tutorials_count(): - return PublishedContent.objects\ - .filter(content_type="TUTORIAL", must_redirect=False)\ - .count() diff --git a/zds/pages/views.py b/zds/pages/views.py index 0c0b57ee1a..c49bc1f377 100644 --- a/zds/pages/views.py +++ b/zds/pages/views.py @@ -18,7 +18,7 @@ from zds.featured.models import FeaturedResource, FeaturedMessage from zds.pages.forms import AssocSubscribeForm from zds.settings import BASE_DIR -from utils import get_last_tutorials, get_tutorials_count, get_last_articles +from zds.tutorialv2.models.models_database import PublishableContent, PublishedContent from zds.utils.models import Alert from django.utils.translation import ugettext_lazy as _ @@ -26,16 +26,8 @@ def home(request): """Display the home page with last topics added.""" - tutos = [] - for tuto in get_last_tutorials(): - data = tuto - - tutos.append(data) - - articles = [] - for article in get_last_articles(): - data = article - articles.append(data) + tutos = PublishableContent.objects.get_last_tutorials() + articles = PublishableContent.objects.get_last_articles() try: with open(os.path.join(BASE_DIR, 'quotes.txt'), 'r') as quotes_file: @@ -55,7 +47,7 @@ def home(request): 'last_articles': articles, 'last_featured_resources': FeaturedResource.objects.get_last_featured(), 'last_topics': Topic.objects.get_last_topics(), - 'tutorials_count': get_tutorials_count(), + 'tutorials_count': PublishedContent.objects.get_tutorials_count(), 'quote': quote.replace('\n', ''), 'suggestions': suggestions, }) diff --git a/zds/tutorialv2/managers.py b/zds/tutorialv2/managers.py index 0c7954babd..c249c338e8 100644 --- a/zds/tutorialv2/managers.py +++ b/zds/tutorialv2/managers.py @@ -10,6 +10,13 @@ class PublishedContentManager(models.Manager): """ def last_contents_of_a_member_loaded(self, author, _type=None): + """ + Get contents published by author depends on settings.ZDS_APP['content']['user_page_number'] + :param author: + :param _type: subtype to filter request + :return: + :rtype: django.db.models.QuerySet + """ queryset = self.prefetch_related('content')\ .prefetch_related('content__authors')\ @@ -28,3 +35,66 @@ def last_tutorials_of_a_member_loaded(self, author): def last_articles_of_a_member_loaded(self, author): return self.last_contents_of_a_member_loaded(author, _type='ARTICLE') + + def get_tutorials_count(self): + """ + :rtype: int + """ + return self.filter(content_type="TUTORIAL", must_redirect=False)\ + .count() + + +class PublishableContentManager(models.Manager): + """...""" + + def get_last_tutorials(self): + """ + This depends on settings.ZDS_APP['tutorial']['home_number'] parameter + :return: lit of last published content + :rtype: list + """ + home_number = settings.ZDS_APP['tutorial']['home_number'] + all_contents = self.filter(type="TUTORIAL")\ + .filter(public_version__isnull=False)\ + .prefetch_related("authors")\ + .prefetch_related("authors__profile")\ + .select_related("last_note")\ + .select_related("public_version")\ + .prefetch_related("subcategory")\ + .order_by('-public_version__publication_date')[:home_number] + published = [] + for content in all_contents: + content.public_version.content = content + published.append(content.public_version) + return published + + def get_last_articles(self): + """ + ..attention: + this one use a raw subquery for historical reasons. Il will hopefully be replaced one day by an + ORM primitive. + + :return: list of last articles expended with "count_note" property that prefetch number of comments + :rtype:list + """ + sub_query = "SELECT COUNT(*) FROM {} WHERE {}={}" + sub_query = sub_query.format( + "tutorialv2_contentreaction", + "tutorialv2_contentreaction.related_content_id", + "tutorialv2_publishedcontent.content_pk" + ) + home_number = settings.ZDS_APP['article']['home_number'] + all_contents = self.filter(type="ARTICLE")\ + .filter(public_version__isnull=False)\ + .prefetch_related("authors")\ + .prefetch_related("authors__profile")\ + .select_related("last_note")\ + .select_related("public_version")\ + .prefetch_related("subcategory")\ + .extra(select={"count_note": sub_query})\ + .order_by('-public_version__publication_date')[:home_number] + published = [] + for content in all_contents: + content.public_version.content = content + published.append(content.public_version) + return published diff --git a/zds/tutorialv2/models/models_database.py b/zds/tutorialv2/models/models_database.py index 0c80b6887d..e139addb0f 100644 --- a/zds/tutorialv2/models/models_database.py +++ b/zds/tutorialv2/models/models_database.py @@ -32,8 +32,7 @@ from zds.utils.tutorials import get_blob from zds.tutorialv2.models import TYPE_CHOICES, STATUS_CHOICES from zds.tutorialv2.models.models_versioned import NotAPublicVersion -from zds.tutorialv2.managers import PublishedContentManager - +from zds.tutorialv2.managers import PublishedContentManager, PublishableContentManager ALLOWED_TYPES = ['pdf', 'md', 'html', 'epub', 'zip'] @@ -118,6 +117,8 @@ class Meta: public_version = models.ForeignKey( 'PublishedContent', verbose_name=u'Version publiée', blank=True, null=True, on_delete=models.SET_NULL) + objects = PublishableContentManager() + def __unicode__(self): return self.title From 31c0634e6712b0599118eb43cc3276f99ee0d505 Mon Sep 17 00:00:00 2001 From: Emeric54 Date: Mon, 8 Feb 2016 16:27:23 +0100 Subject: [PATCH 06/52] [ci skip] Typo rejet de la validation --- zds/tutorialv2/views/views_validations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zds/tutorialv2/views/views_validations.py b/zds/tutorialv2/views/views_validations.py index 5b38e28e28..9ad6695377 100644 --- a/zds/tutorialv2/views/views_validations.py +++ b/zds/tutorialv2/views/views_validations.py @@ -326,7 +326,7 @@ def form_valid(self, form): send_mp( bot, validation.content.authors.all(), - _(u"Rejet de la demande publication").format(), + _(u"Rejet de la demande de publication").format(), validation.content.title, msg, True, From 9e1adfb350b99233335f0d1df7995b22cbba3084 Mon Sep 17 00:00:00 2001 From: Situphen Date: Fri, 12 Feb 2016 19:42:54 +0100 Subject: [PATCH 07/52] Corrige un petite erreur --- doc/source/front-end/elements-specifiques-au-site.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/front-end/elements-specifiques-au-site.rst b/doc/source/front-end/elements-specifiques-au-site.rst index 2af5d3017b..fe8cd09f7d 100644 --- a/doc/source/front-end/elements-specifiques-au-site.rst +++ b/doc/source/front-end/elements-specifiques-au-site.rst @@ -85,7 +85,7 @@ API Javascript pour manipuler les modales Il est possible de créer des modales en Javascript. Exemple: -.. sourcecore:: javascript +.. sourcecode:: javascript var m = new Modal({ title: "Titre de la modale", From bfb64638a6f420186552df55a16cfa58a7b8c165 Mon Sep 17 00:00:00 2001 From: Situphen Date: Sat, 13 Feb 2016 13:08:44 +0100 Subject: [PATCH 08/52] Affiche le karma en dessous des avatars (fix #1444) --- assets/scss/components/_topic-message.scss | 8 ++---- templates/misc/message_user.html | 29 +++++++++++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/assets/scss/components/_topic-message.scss b/assets/scss/components/_topic-message.scss index 3abc7f2652..d919f1285c 100644 --- a/assets/scss/components/_topic-message.scss +++ b/assets/scss/components/_topic-message.scss @@ -75,15 +75,10 @@ color: #424242; height: 25px; line-height: 26px; - width: 28px; + width: 58px; color: #777; transition: all $transition-duration ease; - &:first-child { - border-right: 0; - width: 29px; - } - &:hover, &:focus { border-bottom-width: 1px; @@ -96,6 +91,7 @@ } &.negative { color: #c0392b; + font-weight: bold; } } } diff --git a/templates/misc/message_user.html b/templates/misc/message_user.html index 287e4c6997..2ad74a0279 100644 --- a/templates/misc/message_user.html +++ b/templates/misc/message_user.html @@ -10,18 +10,19 @@ {% include 'misc/badge.part.html' %} - {% comment %} - {# TODO : properly display metadata (karma) #} - {% if perms.forum.change_post %} -

      - {% endif %} - {% endcomment %} + {% if perms.forum.change_post and profile.karma != 0 %} + + {% endif %} {% endwith %} - \ No newline at end of file + From e149b9d68434103e3aee8b484968d703f1ee8667 Mon Sep 17 00:00:00 2001 From: Orandin Date: Mon, 15 Feb 2016 14:04:43 +0100 Subject: [PATCH 09/52] Fix#3366: Ajout de l'extension de l'image --- zds/gallery/tests/tests_views.py | 1 + zds/gallery/views.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/zds/gallery/tests/tests_views.py b/zds/gallery/tests/tests_views.py index 2be8174d5d..a589d05b46 100644 --- a/zds/gallery/tests/tests_views.py +++ b/zds/gallery/tests/tests_views.py @@ -720,6 +720,7 @@ def test_import_images_in_gallery(self): ) self.assertEqual(302, response.status_code) self.assertEqual(Image.objects.filter(gallery=self.gallery).count(), 1) + self.assertEqual("jpg", self.gallery.get_images()[0].get_extension()) def test_import_images_in_gallery_no_archive(self): login_check = self.client.login(username=self.profile1.user.username, password='hostel77') diff --git a/zds/gallery/views.py b/zds/gallery/views.py index 215f85a4cf..35b328b98f 100644 --- a/zds/gallery/views.py +++ b/zds/gallery/views.py @@ -460,7 +460,7 @@ def form_valid(self, form): # create picture in database: f_im = File(open(ph_temp, "rb")) - f_im.name = title + f_im.name = title + ext pic = Image() pic.gallery = gallery From fb081c8a404fa7cf16cb83974e0c9cd1a9b2ce88 Mon Sep 17 00:00:00 2001 From: Situphen Date: Fri, 12 Feb 2016 20:37:07 +0100 Subject: [PATCH 10/52] =?UTF-8?q?Met=20=C3=A0=20jour=20la=20documentation?= =?UTF-8?q?=20d'installation=20du=20front-end=20(fix=20#3294)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/source/install/frontend-install.rst | 68 +++++++++---------------- 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/doc/source/install/frontend-install.rst b/doc/source/install/frontend-install.rst index 0774dcf4e0..786be14782 100644 --- a/doc/source/install/frontend-install.rst +++ b/doc/source/install/frontend-install.rst @@ -8,6 +8,8 @@ Vous voulez nous aider au développement du frontend ? Installez Node.js et npm Installation de Node.js et npm ============================== +Zeste de Savoir utilise actuellement la v4 de Node.JS. + Windows ------- @@ -15,7 +17,7 @@ Windows Cette partie de la documentation n'est probablement pas à jour faute de contributeur utilisant Windows. Il se peut que l'installation fonctionne correctement, partiellement ou pas du tout. Bref, en cas de problème n'hésitez pas à venir demander de l'aide sur le `forum des Devs' de Zeste de Savoir `_ ! -Node.js propose un installeur (*.msi*) pour Windows, disponible à `cette adresse `_. Choisissez *Windows Installer*, avec l'architecture adéquate, et installez Node.js en ouvrant le fichier téléchargé. +Node.js propose un installeur (*.msi*) pour Windows, disponible à `cette adresse `_. Choisissez *Windows Installer*, avec l'architecture adéquate, et installez Node.js en ouvrant le fichier téléchargé. Vérifiez de posséder la version 2.5.0 de npm (et non la version 1.4.X que peut installer l'installeur), pour connaitre votre version : ``npm -v``. Pour mettre à jour npm, vous avez `trois possibilités `_, l'une d'elle est de faire ``npm install npm`` dans le dossier ``C:\Program Files (x86)\nodejs``. @@ -35,86 +37,62 @@ Veillez à respecter `ces conditions `_. Choisissez *Mac OS X Installer*, et installez Node.js en ouvrant le fichier téléchargé. +Node.js propose un installeur (*.pkg*) pour Mac OS X, disponible à `cette adresse `_. Choisissez *Mac OS X Installer*, et installez Node.js en ouvrant le fichier téléchargé. Linux ----- -Ubuntu -~~~~~~ - -L'installation peut se faire simplement via ``apt-get`` : +Pour être sûr d'avoir la dernière version de Node.JS, il faut passer par les dépôts de la Fondation Node.JS. Pour cela, elle met à disposition un script (en fonction de votre *package manager*) qu'il suffit de lancer. S'il n'y a pas d'instructions pour votre distribution sur cette page, il y en a sûrement dans `la documentation officielle (en anglais) `_. -.. sourcecode:: bash +Si vous ne voulez pas utiliser cette méthode, `des fichiers binaires ainsi que le code source sont disponibles `_. - sudo apt-get install nodejs npm nodejs-legacy +Debian et ses dérivés (tels que Ubuntu, Linux Mint) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Mais il est possible d'avoir une version un peu plus récente avec : +Comme indiqué `ici `_, il faut lancer ces commandes : .. sourcecode:: bash - sudo add-apt-repository ppa:chris-lea/node.js - sudo apt-get update - sudo apt-get install nodejs - -Certaines dépendances utilisent ``node`` au lieu de ``nodejs``, pour y remédier (pas besoin sous Fedora !) : - -.. sourcecode:: bash - - sudo ln -s /usr/bin/nodejs /usr/bin/node - -Debian -~~~~~~ - -Une version récente de Node.js se trouve dans les dépôts *wheezy-backport*, *jessie* et *sid*. Sur ces versions de Debian, l'installation peut se faire de cette manière : - -.. sourcecode:: bash - - sudo apt-get install nodejs + curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - + sudo apt-get install -y nodejs Fedora / CentOS / RHEL ~~~~~~~~~~~~~~~~~~~~~~ -Il vous faut tout simplement faire : +Comme indiqué `ici `_, il faut lancer ces commandes : .. sourcecode:: bash - sudo dnf install nodejs + curl --silent --location https://rpm.nodesource.com/setup_4.x | bash - + # Puis, en root + yum -y install nodejs Arch Linux ~~~~~~~~~~ -Il faut simplement lancer cette commande : +Comme indiqué `ici `_, il faut lancer cette commande : .. sourcecode:: bash - pacman -S nodejs - -FreeBSD / OpenBSD ------------------ + pacman -S nodejs npm -Une installation via ``pkg`` devrait suffire : - -.. sourcecode:: bash - - pkg install node +Il existe aussi `une documentation relative à Node.JS spécialement pour Arch Linux `_. ----- -*Les instructions pour installer Node.js sur les distributions CentOS, RHEL, FreeBSD et OpenBSD sont issues du lien juste en dessous et n'ont pas été testées.* - -Les **instructions détaillées** pour toutes les distributions se trouvent dans la `documentation officielle (en anglais) `_. +Vérifier que les bonnes versions sont installées +------------------------------------------------ Pour vérifier que Node.js et npm sont installés (et que vous avez les bonnes versions) : .. sourcecode:: bash node -v - v0.10.26 + v4.2.6 npm -v - 2.1.7 + 2.14.12 -**Vous devez avoir une version de Node.js > 0.10.x et de npm > 2.x.x.** Si votre version de npm est 1.x.x, vous devez le mettre à jour (voir juste en dessous). +**Vous devez avoir une version de Node.js v4.x et de npm 2.x.x.** Si votre version de npm est 1.x.x, vous devez le mettre à jour (voir juste en dessous). Mise à jour de Node.js et npm ----------------------------- From 37c80b536e420955fe5bd784150efa62f6d141cc Mon Sep 17 00:00:00 2001 From: Orandin Date: Wed, 17 Feb 2016 20:46:06 +0100 Subject: [PATCH 11/52] =?UTF-8?q?Fix#3234:=20Lien=20de=20retour=20=C3=A0?= =?UTF-8?q?=20la=20liste=20des=20sujets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- templates/forum/topic/index.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/forum/topic/index.html b/templates/forum/topic/index.html index fdc477199c..17909f3a72 100644 --- a/templates/forum/topic/index.html +++ b/templates/forum/topic/index.html @@ -128,6 +128,9 @@ {% block new_btn %} + + {% trans "Retour à la liste des sujets" %} + {% trans "Nouveau sujet" %} From fa035655d8bd4c983573e05e9bac8cd23393057e Mon Sep 17 00:00:00 2001 From: pierre-24 Date: Mon, 22 Feb 2016 23:03:49 +0100 Subject: [PATCH 12/52] Freeze the version of `python-slugify` to 1.1.4 (fix #3383) (and provide a command to fix broken contents) --- doc/source/back-end/contents.rst | 10 ++++++ requirements.txt | 1 + update.md | 8 +++++ .../management/commands/adjust_slugs.py | 31 +++++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 zds/tutorialv2/management/commands/adjust_slugs.py diff --git a/doc/source/back-end/contents.rst b/doc/source/back-end/contents.rst index 86f43d633d..0ba35739a0 100644 --- a/doc/source/back-end/contents.rst +++ b/doc/source/back-end/contents.rst @@ -177,6 +177,16 @@ une contrainte sur la taille maximum d'un nom de fichier sur les différents sys *slug*, pour des raisons de stockage (voir plus bas). Il ne faut pas oublier la contrainte d'unicité à l'intérieur d'un conteneur. +.. attention:: + + Suite à un changement majeur dans la librairie ``python-slugify``, une différence peu apparaitre dans le *slug* + généré à partir de titres contenant des espaces. Dès lors, pour des raisons de rétro-compatibilités, c'est la version + 1.1.4 de cette librairie qui est utilisée par ZdS. Par ailleurs, la commande ``python manage.py adjust_slugs`` a été + créée pour réparer les éventuels dommages, en détectant les titres posant potentielement des problèmes et en tentant + de les faire correspondre à nouveau à leur contrepartie dans le système de fichier. + + `Plus d'information ici `_. + Cycle de vie des contenus ========================= diff --git a/requirements.txt b/requirements.txt index 2b19845689..e81213f749 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,4 +34,5 @@ dry-rest-permissions==0.1.6 # Zep 12 dependency django-uuslug==1.0.3 +python-slugify==1.1.4 # next versions of this library break previous behavior for slug generation from string with single quotes watchdog==0.8.3 # use last non-bc-breaking version diff --git a/update.md b/update.md index c661da29ee..2727b3a95b 100644 --- a/update.md +++ b/update.md @@ -432,3 +432,11 @@ systemctl start zds-watchdog.service Il est possible de configurer le logging de ce module en surchargeant les logger `logging.getLogger("zds.pandoc-publicator")`, `logging.getLogger("zds.watchdog-publicator")`. +Repasser à l'ancienne version de `python-slugify` et sauver les contenus (#3383) +-------------------------------------------------------------------------------- + +1. Passer en maintenance ; +2. Mettre à jour les dépendances de zds afin de *downgrader* `python-slugify` : `pip install --upgrade -r requirements.txt` ; +3. Exécuter la commande suivante : `python manage.py adjust_slugs`. Noter les éventuels contenus pour lesquels cela ne fonctionnerai pas ; +4. Si pour certains contenus la commande échoue, il faut retrouver le dossier correspondant dans `/contents-private/` et donner à ce contenu le même slug ; +5. Quitter la maintenance. \ No newline at end of file diff --git a/zds/tutorialv2/management/commands/adjust_slugs.py b/zds/tutorialv2/management/commands/adjust_slugs.py new file mode 100644 index 0000000000..b3ac5a7b71 --- /dev/null +++ b/zds/tutorialv2/management/commands/adjust_slugs.py @@ -0,0 +1,31 @@ +# coding: utf-8 +import os +from uuslug import slugify + +from django.core.management.base import BaseCommand +from zds.settings import ZDS_APP +from zds.tutorialv2.models.models_database import PublishableContent + + +class Command(BaseCommand): + """ + `python manage.py adjust_slugs`; fix content's slugs for which the title contains single quote(s). + """ + + def handle(self, *args, **options): + + for c in PublishableContent.objects.all(): + if '\'' in c.title: + good_slug = slugify(c.title) + if c.slug != good_slug: + if os.path.isdir(os.path.join(ZDS_APP['content']['repo_private_path'], good_slug)): + self.stdout.write(u'Fixing content #{} (« {} ») ... '.format(c.pk, c.title), ending='') + c.save() + if os.path.isdir(c.get_repo_path()): + self.stdout.write(u'[OK]') + else: + self.stdout.write(u'[KO]') + else: + self.stderr.write( + u'Content #{} (« {} ») cannot be fixed: there is no directory named "{}" in "{}".\n'. + format(c.pk, c.title, good_slug, ZDS_APP['content']['repo_private_path'])) From 0857df08f998f08e086d14c230753942bf450d4e Mon Sep 17 00:00:00 2001 From: pierre-24 Date: Tue, 23 Feb 2016 11:58:00 +0100 Subject: [PATCH 13/52] Also deal with contents that would have been created DURING v16. --- .../management/commands/adjust_slugs.py | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/zds/tutorialv2/management/commands/adjust_slugs.py b/zds/tutorialv2/management/commands/adjust_slugs.py index b3ac5a7b71..a52838fa04 100644 --- a/zds/tutorialv2/management/commands/adjust_slugs.py +++ b/zds/tutorialv2/management/commands/adjust_slugs.py @@ -5,6 +5,7 @@ from django.core.management.base import BaseCommand from zds.settings import ZDS_APP from zds.tutorialv2.models.models_database import PublishableContent +from django.utils.translation import ugettext_lazy as _ class Command(BaseCommand): @@ -19,13 +20,35 @@ def handle(self, *args, **options): good_slug = slugify(c.title) if c.slug != good_slug: if os.path.isdir(os.path.join(ZDS_APP['content']['repo_private_path'], good_slug)): - self.stdout.write(u'Fixing content #{} (« {} ») ... '.format(c.pk, c.title), ending='') + # this content was created before v16 and is probably broken + self.stdout.write(u'Fixing pre-v16 content #{} (« {} ») ... '.format(c.pk, c.title), ending='') c.save() if os.path.isdir(c.get_repo_path()): self.stdout.write(u'[OK]') else: self.stdout.write(u'[KO]') + elif os.path.isdir(os.path.join(ZDS_APP['content']['repo_private_path'], c.slug)): + # this content was created during v16 and will be broken if nothing is done + self.stdout.write(u'Fixing in-v16 content #{} (« {} ») ... '.format(c.pk, c.title), ending='') + try: + versioned = c.load_version() + except IOError: + self.stdout.write(u'[KO]') + else: + c.sha_draft = versioned.repo_update_top_container( + c.title, + good_slug, + versioned.get_introduction(), + versioned.get_conclusion(), + commit_message=_(u'[hotfix] Corrige le slug pour éviter un bug')) + + c.save() + + if os.path.isdir(c.get_repo_path()): + self.stdout.write(u'[OK]') + else: + self.stdout.write(u'[KO]') else: self.stderr.write( - u'Content #{} (« {} ») cannot be fixed: there is no directory named "{}" in "{}".\n'. - format(c.pk, c.title, good_slug, ZDS_APP['content']['repo_private_path'])) + u'Content #{} (« {} ») is an orphan: there is no directory named "{}" or "{}".\n'. + format(c.pk, c.title, good_slug, c.slug)) From c7e586eba0abbc5d1c54fb3acc679021d2ea9e11 Mon Sep 17 00:00:00 2001 From: hcourte Date: Tue, 23 Feb 2016 18:09:22 +0100 Subject: [PATCH 14/52] Correct commit name --- zds/tutorialv2/management/commands/adjust_slugs.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/zds/tutorialv2/management/commands/adjust_slugs.py b/zds/tutorialv2/management/commands/adjust_slugs.py index a52838fa04..71ce79b676 100644 --- a/zds/tutorialv2/management/commands/adjust_slugs.py +++ b/zds/tutorialv2/management/commands/adjust_slugs.py @@ -5,7 +5,6 @@ from django.core.management.base import BaseCommand from zds.settings import ZDS_APP from zds.tutorialv2.models.models_database import PublishableContent -from django.utils.translation import ugettext_lazy as _ class Command(BaseCommand): @@ -40,7 +39,7 @@ def handle(self, *args, **options): good_slug, versioned.get_introduction(), versioned.get_conclusion(), - commit_message=_(u'[hotfix] Corrige le slug pour éviter un bug')) + commit_message='[hotfix] Corrige le slug') c.save() From 46d853a5f8582783b35b50eba116152b0d3ca059 Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Wed, 24 Feb 2016 22:33:09 +0100 Subject: [PATCH 15/52] =?UTF-8?q?Ajout=20de=20notes=20pour=20=C3=A9clairci?= =?UTF-8?q?r=20le=20but=20du=20fichier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- update.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/update.md b/update.md index 2727b3a95b..3ce2515b0f 100644 --- a/update.md +++ b/update.md @@ -439,4 +439,15 @@ Repasser à l'ancienne version de `python-slugify` et sauver les contenus (#3383 2. Mettre à jour les dépendances de zds afin de *downgrader* `python-slugify` : `pip install --upgrade -r requirements.txt` ; 3. Exécuter la commande suivante : `python manage.py adjust_slugs`. Noter les éventuels contenus pour lesquels cela ne fonctionnerai pas ; 4. Si pour certains contenus la commande échoue, il faut retrouver le dossier correspondant dans `/contents-private/` et donner à ce contenu le même slug ; -5. Quitter la maintenance. \ No newline at end of file +5. Quitter la maintenance. + + +-------------------------------- + +**Notes auxquelles penser lors de l'édition de ce fichier (à laisser en bas) :** + +Le déploiement doit être autonome. Ce qui implique que : + +1. La mise à jour de dépendances est automatique et systématique, +2. La personne qui déploie ne doit pas réfléchir (parce que c'est source d'erreur), +3. La personne qui déploie ne doit pas avoir connaissance de ce qui est déployé (techniquement et fonctionnellement). From 9ce0d1b3de833a8f01ad80e521dfdc6882a06b3e Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 22:41:17 +0200 Subject: [PATCH 16/52] Model._meta.module_name --> Model._meta.model_name Cf https://docs.djangoproject.com/en/1.8/releases/1.8/#features-removed-in-1-8 --- zds/search/forms.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 zds/search/forms.py diff --git a/zds/search/forms.py b/zds/search/forms.py new file mode 100644 index 0000000000..f63b00264e --- /dev/null +++ b/zds/search/forms.py @@ -0,0 +1,37 @@ +# encoding: utf-8 + +from django import forms +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.forms import ModelSearchForm +from zds.search.constants import MODEL_NAMES + + +class CustomSearchForm(ModelSearchForm): + + def __init__(self, *args, **kwargs): + super(CustomSearchForm, self).__init__(*args, **kwargs) + self.fields['models'] = forms.MultipleChoiceField( + choices=self.model_choices(), + required=False, + label='Rechercher dans', + widget=forms.CheckboxSelectMultiple( + attrs={ + 'form': 'search_form' + } + ) + ) + + def model_choices(self, using=DEFAULT_ALIAS): + choices = [ + ("%s.%s" % + (m._meta.app_label, + m._meta.model_name), + self.get_model_name( + m._meta.app_label, + m._meta.model_name, + True)) for m in connections[using].get_unified_index().get_indexed_models()] + return sorted(choices, key=lambda x: x[1]) + + def get_model_name(self, app_label, module_name, plural): + return MODEL_NAMES[app_label][module_name][plural] From c732cc47685848843e1431659c98a99b1ced93bc Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 22:42:45 +0200 Subject: [PATCH 17/52] =?UTF-8?q?Suppression=20du=20module=20inutilis?= =?UTF-8?q?=C3=A9=20"django.contrib.sites"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S'il doit revenir, des modifications sont nécessaires. Cf https://docs.djangoproject.com/en/1.8/releases/1.8/#django-contrib-sites --- zds/settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/zds/settings.py b/zds/settings.py index 7e5ca64621..d1aca616df 100644 --- a/zds/settings.py +++ b/zds/settings.py @@ -154,7 +154,6 @@ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', - 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sitemaps', From 2478e52e0992d1013abf1f4a20bf55e12b22e4be Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 22:44:33 +0200 Subject: [PATCH 18/52] =?UTF-8?q?Django=201.8:=20D=C3=A9clarer=20le=20doss?= =?UTF-8?q?ier=20de=20fixtures=20par=20d=C3=A9faut=20lance=20une=20erreur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Donc on supprime cette déclaration qui était de toutes façons inutile même avec Django 1.7. Cf https://docs.djangoproject.com/en/1.8/releases/1.8/#management-commands --- zds/settings.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/zds/settings.py b/zds/settings.py index d1aca616df..889bd55ba1 100644 --- a/zds/settings.py +++ b/zds/settings.py @@ -93,8 +93,6 @@ # 'django.contrib.staticfiles.finders.DefaultStorageFinder', ) -FIXTURE_DIRS = (os.path.join(BASE_DIR, 'fixtures')) - # Make this unique, and don't share it with anybody. SECRET_KEY = 'n!01nl+318#x75_%le8#s0=-*ysw&y49uc#t=*wvi(9hnyii0z' # noqa From d4fb78bddf99d025a23bdc2dac6bdf894ac62b5b Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 22:46:46 +0200 Subject: [PATCH 19/52] =?UTF-8?q?Suppression=20d'une=20relation=20erron?= =?UTF-8?q?=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Django 1.8 vérifie ces relations et donc lancerait une erreur. Cf https://docs.djangoproject.com/en/1.8/releases/1.8/#select-related-now-checks-given-fields --- zds/mp/managers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zds/mp/managers.py b/zds/mp/managers.py index d0d1dba732..d353746a87 100644 --- a/zds/mp/managers.py +++ b/zds/mp/managers.py @@ -12,7 +12,7 @@ class PrivateTopicManager(models.Manager): def get_private_topics_of_user(self, user_id): return super(PrivateTopicManager, self).get_queryset() \ .filter(Q(participants__in=[user_id]) | Q(author=user_id)) \ - .select_related("author", "participants") \ + .select_related("author") \ .distinct().order_by('-last_message__pubdate').all() def get_private_topics_selected(self, user_id, pks): From 1eb0c56f7fc0aaf32347376b99a80a914729714d Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 22:50:41 +0200 Subject: [PATCH 20/52] =?UTF-8?q?Utilisation=20d'une=20API=20priv=C3=A9e?= =?UTF-8?q?=20qui=20a=20chang=C3=A9e=20de=20package=20Cf=20https://docs.dj?= =?UTF-8?q?angoproject.com/en/1.8/releases/1.8/#cleanup-of-the-django-temp?= =?UTF-8?q?late-namespace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zds/utils/templatetags/tests/tests_append_to_get.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zds/utils/templatetags/tests/tests_append_to_get.py b/zds/utils/templatetags/tests/tests_append_to_get.py index 565ad15e5f..09f6b4fb13 100644 --- a/zds/utils/templatetags/tests/tests_append_to_get.py +++ b/zds/utils/templatetags/tests/tests_append_to_get.py @@ -2,7 +2,7 @@ from django.test import TestCase, RequestFactory -from django.template import TemplateSyntaxError, Token, TOKEN_TEXT, Context, VariableDoesNotExist, Template +from django.template.base import TemplateSyntaxError, Token, TOKEN_TEXT, Context, VariableDoesNotExist, Template from zds.utils.templatetags.append_to_get import easy_tag, AppendGetNode From 2b14c6a3e6510bbc14bef74eb2b885b96b439fd5 Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 23:15:00 +0200 Subject: [PATCH 21/52] =?UTF-8?q?Passage=20=C3=A0=20Django=201.8=20minimal?= =?UTF-8?q?=20(il=20reste=20plein=20de=20warnings=20mais=20=C3=A7a=20march?= =?UTF-8?q?e)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Impacts directs obligatoires : - Une relation en base change de nom pour être python-compatible (et donc sa migration en base) - On doit maintenant préciser le paramètre --fake-initial lors d'une migration de MAJ (cf https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---fake-initial) - Debug Toolbar en v1.3 - Fix pour que oauth fonctionne, cf https://github.com/evonove/django-oauth-toolkit/issues/204 --- CONTRIBUTING.md | 2 +- README.md | 2 +- .../back-end-code/arborescence-back.rst | 2 +- requirements-dev.txt | 4 +- requirements.txt | 2 +- scripts/deploy.sh | 2 +- templates/pages/about.html | 2 +- .../oauth2_provider/0001_initial.py | 75 +++++++++++++++++++ zds/migrations/oauth2_provider/__init__.py | 0 zds/settings.py | 12 ++- .../migrations/0002_auto_20150414_2256.py | 20 +++++ zds/utils/models.py | 2 +- 12 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 zds/migrations/oauth2_provider/0001_initial.py create mode 100644 zds/migrations/oauth2_provider/__init__.py create mode 100644 zds/utils/migrations/0002_auto_20150414_2256.py diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cddb208324..b885d99618 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,7 +48,7 @@ Tous les détails sur le workflow se trouvent [sur la page dédiée](http://zds- | Nouvelle Fonctionnalité ? | [oui|non] | Tickets (_issues_) concernés | [Liste de tickets séparés par des virgules] ``` -* Ajoutez des notes de QA (Quality Assurance). Ces notes doivent permettent à un testeur de comprendre ce que vous avez modifié, ce qu'il faut tester en priorité et les pièges auxquels il doit s'attendre et donc sur lesquels porter une attention particulière. Précisez tout particulièrement s'il est nécessaire d'effectuer une action de gestion préalable, comme `python manage.py migrate`, `python manage.py loaddata fixture/*.yaml` ou `npm run gulp -- build`. +* Ajoutez des notes de QA (Quality Assurance). Ces notes doivent permettent à un testeur de comprendre ce que vous avez modifié, ce qu'il faut tester en priorité et les pièges auxquels il doit s'attendre et donc sur lesquels porter une attention particulière. Précisez tout particulièrement s'il est nécessaire d'effectuer une action de gestion préalable, comme `python manage.py migrate --fake-initial`, `python manage.py loaddata fixture/*.yaml` ou `npm run gulp -- build`. ## Les commits * Pour les commits, nous suivons le même ordre d'idée des standards Git, à savoir : diff --git a/README.md b/README.md index 29b20d7a7a..e37b4b6347 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Après avoir mis à jour votre dépôt, vous devez exécuter les commandes suiva ```console pip install --upgrade -r requirements.txt -r requirements-dev.txt -python manage.py migrate +python manage.py migrate --fake-initial ``` diff --git a/doc/source/back-end-code/arborescence-back.rst b/doc/source/back-end-code/arborescence-back.rst index f06008d166..f5cbf95764 100644 --- a/doc/source/back-end-code/arborescence-back.rst +++ b/doc/source/back-end-code/arborescence-back.rst @@ -106,7 +106,7 @@ Cela permettra aux autres développeurs de répercuter les modifications en util .. sourcecode:: bash - python manage.py migrate + python manage.py migrate --fake-initial API diff --git a/requirements-dev.txt b/requirements-dev.txt index 6531b9ce72..fab4adf06a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -2,7 +2,7 @@ PyYAML==3.11 django-debug-toolbar==1.3.0 flake8==2.4.0 autopep8==1.1.1 -sphinx==1.3.1 -sphinx_rtd_theme==0.1.8 +sphinx==1.2.3 +sphinx_rtd_theme==0.1.6 fake-factory==0.5.0 mock \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e81213f749..45b83a6043 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ pygments==2.0.2 python-social-auth==0.2.9 # Explicit dependencies (references in code) -django==1.7.10 +django==1.8.0 coverage==4.0.1 django-crispy-forms==1.4.0 django-haystack==2.4.1 diff --git a/scripts/deploy.sh b/scripts/deploy.sh index a2b8388bb4..5ea42baa7b 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -31,7 +31,7 @@ cd /opt/zdsenv/ZesteDeSavoir/ # Maintenance mode sudo rm /etc/nginx/sites-enabled/zestedesavoir sudo ln -s /etc/nginx/sites-available/zds-maintenance /etc/nginx/sites-enabled/zds-maintenance -sudo systemctl reload nginx.service +sudo service nginx reload # Delete old branch if exists git checkout prod diff --git a/templates/pages/about.html b/templates/pages/about.html index b6c6f0d8d3..7c35b04749 100644 --- a/templates/pages/about.html +++ b/templates/pages/about.html @@ -66,7 +66,7 @@

      {% trans "Système / Back-end" %}

      {% trans "Site" %}

      HTTP(S) + WSGI

      diff --git a/zds/migrations/oauth2_provider/0001_initial.py b/zds/migrations/oauth2_provider/0001_initial.py new file mode 100644 index 0000000000..470c9ce0a1 --- /dev/null +++ b/zds/migrations/oauth2_provider/0001_initial.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import oauth2_provider.validators +import oauth2_provider.generators +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='AccessToken', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('token', models.CharField(max_length=255, db_index=True)), + ('expires', models.DateTimeField()), + ('scope', models.TextField(blank=True)), + ], + ), + migrations.CreateModel( + name='Application', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('client_id', models.CharField(default=oauth2_provider.generators.generate_client_id, unique=True, max_length=100, db_index=True)), + ('redirect_uris', models.TextField(help_text='Allowed URIs list, space separated', blank=True, validators=[oauth2_provider.validators.validate_uris])), + ('client_type', models.CharField(max_length=32, choices=[('confidential', 'Confidential'), ('public', 'Public')])), + ('authorization_grant_type', models.CharField(max_length=32, choices=[('authorization-code', 'Authorization code'), ('implicit', 'Implicit'), ('password', 'Resource owner password-based'), ('client-credentials', 'Client credentials')])), + ('client_secret', models.CharField(default=oauth2_provider.generators.generate_client_secret, max_length=255, db_index=True, blank=True)), + ('name', models.CharField(max_length=255, blank=True)), + ('skip_authorization', models.BooleanField(default=False)), + ('user', models.ForeignKey(related_name='oauth2_provider_application', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Grant', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('code', models.CharField(max_length=255, db_index=True)), + ('expires', models.DateTimeField()), + ('redirect_uri', models.CharField(max_length=255)), + ('scope', models.TextField(blank=True)), + ('application', models.ForeignKey(to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='RefreshToken', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('token', models.CharField(max_length=255, db_index=True)), + ('access_token', models.OneToOneField(related_name='refresh_token', to='oauth2_provider.AccessToken')), + ('application', models.ForeignKey(to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='accesstoken', + name='application', + field=models.ForeignKey(to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL), + ), + migrations.AddField( + model_name='accesstoken', + name='user', + field=models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True), + ), + ] diff --git a/zds/migrations/oauth2_provider/__init__.py b/zds/migrations/oauth2_provider/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/zds/settings.py b/zds/settings.py index 889bd55ba1..d373b08d54 100644 --- a/zds/settings.py +++ b/zds/settings.py @@ -361,6 +361,7 @@ # Fake mails (in console) EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' +from django.contrib.messages import constants as message_constants MESSAGE_TAGS = { message_constants.DEBUG: 'debug', message_constants.INFO: 'info', @@ -553,10 +554,17 @@ # See http://daniel.hepper.net/blog/2014/04/fixing-1_6-w001-when-upgrading-from-django-1-5-to-1-7/ TEST_RUNNER = 'django.test.runner.DiscoverRunner' +# makemigrations requires this for some reason or it errors +# Just set to the default value +OAUTH2_PROVIDER_APPLICATION_MODEL = 'oauth2_provider.Application' + +# tell django where to put the oauth2 migrations +MIGRATION_MODULES = { + # key: app name, value: a fully qualified package name, not the usual `app_label.something_else` + 'oauth2_provider': 'zds.migrations.oauth2_provider', +} # Properly handle HTTPS vs HTTP SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') -# /!\ WARNING : It will probably open security holes in your site if the proxy behing isn't well configured -# Read the docs for further informations - https://docs.djangoproject.com/en/1.7/ref/settings/#secure-proxy-ssl-header # Load the production settings, overwrite the existing ones if needed try: diff --git a/zds/utils/migrations/0002_auto_20150414_2256.py b/zds/utils/migrations/0002_auto_20150414_2256.py new file mode 100644 index 0000000000..bdc09e6d48 --- /dev/null +++ b/zds/utils/migrations/0002_auto_20150414_2256.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('utils', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='editor', + field=models.ForeignKey(related_name='comments-editor+', verbose_name=b'Editeur', blank=True, to=settings.AUTH_USER_MODEL, null=True), + ), + ] diff --git a/zds/utils/models.py b/zds/utils/models.py index 89ed82fc30..0ccbb18450 100644 --- a/zds/utils/models.py +++ b/zds/utils/models.py @@ -131,7 +131,7 @@ class Meta: author = models.ForeignKey(User, verbose_name='Auteur', related_name='comments', db_index=True) editor = models.ForeignKey(User, verbose_name='Editeur', - related_name='comments-editor', + related_name='comments-editor+', null=True, blank=True) ip_address = models.CharField('Adresse IP de l\'auteur ', max_length=39) From 59b088b92bd8a0529ca2feae8ff8c6a6053f1aa5 Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 23:27:26 +0200 Subject: [PATCH 22/52] Une relation N..M nullable n'a pas de sens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ce qui n'a pas de sens doit disparaître, d'autant plus que ça provoque des warnings. Cf https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.ManyToManyField.allow_unsaved_instance_assignment --- .../migrations/0002_auto_20150414_2324.py | 19 +++++++++++++++ .../migrations/0003_auto_20150414_2324.py | 24 +++++++++++++++++++ zds/forum/models.py | 2 -- .../migrations/0004_auto_20160106_2231.py | 20 ++++++++++++++++ zds/search/models.py | 2 +- .../migrations/0002_auto_20150414_2325.py | 19 +++++++++++++++ .../migrations/0011_auto_20160106_2231.py | 20 ++++++++++++++++ zds/tutorialv2/models/models_database.py | 2 +- 8 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 zds/article/migrations/0002_auto_20150414_2324.py create mode 100644 zds/forum/migrations/0003_auto_20150414_2324.py create mode 100644 zds/search/migrations/0004_auto_20160106_2231.py create mode 100644 zds/tutorial/migrations/0002_auto_20150414_2325.py create mode 100644 zds/tutorialv2/migrations/0011_auto_20160106_2231.py diff --git a/zds/article/migrations/0002_auto_20150414_2324.py b/zds/article/migrations/0002_auto_20150414_2324.py new file mode 100644 index 0000000000..f35ed8cf91 --- /dev/null +++ b/zds/article/migrations/0002_auto_20150414_2324.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('article', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='article', + name='subcategory', + field=models.ManyToManyField(to='utils.SubCategory', db_index=True, verbose_name=b'Sous-Cat\xc3\xa9gorie', blank=True), + ), + ] diff --git a/zds/forum/migrations/0003_auto_20150414_2324.py b/zds/forum/migrations/0003_auto_20150414_2324.py new file mode 100644 index 0000000000..ab5834cfc3 --- /dev/null +++ b/zds/forum/migrations/0003_auto_20150414_2324.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('forum', '0002_auto_20150410_1505'), + ] + + operations = [ + migrations.AlterField( + model_name='forum', + name='group', + field=models.ManyToManyField(to='auth.Group', verbose_name=b'Groupe autoris\xc3\xa9s (Aucun = public)', blank=True), + ), + migrations.AlterField( + model_name='topic', + name='tags', + field=models.ManyToManyField(to='utils.Tag', db_index=True, verbose_name=b'Tags du forum', blank=True), + ), + ] diff --git a/zds/forum/models.py b/zds/forum/models.py index 1db621e0f8..980b322b3f 100644 --- a/zds/forum/models.py +++ b/zds/forum/models.py @@ -99,7 +99,6 @@ class Meta: group = models.ManyToManyField( Group, verbose_name='Groupe autorisés (Aucun = public)', - null=True, blank=True) # TODO: A forum defines an image, but it doesn't seems to be used... image = models.ImageField(upload_to=image_path_forum) @@ -205,7 +204,6 @@ class Meta: tags = models.ManyToManyField( Tag, verbose_name='Tags du forum', - null=True, blank=True, db_index=True) diff --git a/zds/search/migrations/0004_auto_20160106_2231.py b/zds/search/migrations/0004_auto_20160106_2231.py new file mode 100644 index 0000000000..7ad6bda085 --- /dev/null +++ b/zds/search/migrations/0004_auto_20160106_2231.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-01-06 22:31 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('search', '0003_auto_20150820_1950'), + ] + + operations = [ + migrations.AlterField( + model_name='searchindexcontent', + name='tags', + field=models.ManyToManyField(blank=True, db_index=True, to='search.SearchIndexTag', verbose_name=b'Tags'), + ), + ] diff --git a/zds/search/models.py b/zds/search/models.py index 8638c95d29..0afafa2415 100644 --- a/zds/search/models.py +++ b/zds/search/models.py @@ -38,7 +38,7 @@ class Meta: licence = models.CharField('Licence du contenu', max_length=200) url_image = models.CharField('L\'adresse vers l\'image du contenu', max_length=200, null=True, blank=True) - tags = models.ManyToManyField(SearchIndexTag, verbose_name='Tags', null=True, blank=True, db_index=True) + tags = models.ManyToManyField(SearchIndexTag, verbose_name='Tags', blank=True, db_index=True) authors = models.ManyToManyField(SearchIndexAuthors, verbose_name='Authors', db_index=True) url_to_redirect = models.CharField('Adresse pour rediriger', max_length=400) diff --git a/zds/tutorial/migrations/0002_auto_20150414_2325.py b/zds/tutorial/migrations/0002_auto_20150414_2325.py new file mode 100644 index 0000000000..7b444b76e1 --- /dev/null +++ b/zds/tutorial/migrations/0002_auto_20150414_2325.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tutorial', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='tutorial', + name='subcategory', + field=models.ManyToManyField(to='utils.SubCategory', db_index=True, verbose_name=b'Sous-Cat\xc3\xa9gorie', blank=True), + ), + ] diff --git a/zds/tutorialv2/migrations/0011_auto_20160106_2231.py b/zds/tutorialv2/migrations/0011_auto_20160106_2231.py new file mode 100644 index 0000000000..4cc8fdf429 --- /dev/null +++ b/zds/tutorialv2/migrations/0011_auto_20160106_2231.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-01-06 22:31 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tutorialv2', '0010_publishedcontent_sizes'), + ] + + operations = [ + migrations.AlterField( + model_name='publishablecontent', + name='subcategory', + field=models.ManyToManyField(blank=True, db_index=True, to='utils.SubCategory', verbose_name=b'Sous-Cat\xc3\xa9gorie'), + ), + ] diff --git a/zds/tutorialv2/models/models_database.py b/zds/tutorialv2/models/models_database.py index 0fbc110f16..12aa807791 100644 --- a/zds/tutorialv2/models/models_database.py +++ b/zds/tutorialv2/models/models_database.py @@ -61,7 +61,7 @@ class Meta: old_pk = models.IntegerField(db_index=True, default=0) subcategory = models.ManyToManyField(SubCategory, verbose_name='Sous-Catégorie', - blank=True, null=True, db_index=True) + blank=True, db_index=True) # store the thumbnail for tutorial or article image = models.ForeignKey(Image, From 1e4deafa5cc1b5e2baa2ef8d8851f61878eae096 Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 23:33:59 +0200 Subject: [PATCH 23/52] RedirectView.permanent va changer de valeur --> on la fixe Cf https://docs.djangoproject.com/en/1.8/ref/class-based-views/base/#django.views.generic.base.RedirectView.permanent --- zds/featured/views.py | 2 ++ zds/mp/views.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/zds/featured/views.py b/zds/featured/views.py index 53b69f8d58..62716f7653 100644 --- a/zds/featured/views.py +++ b/zds/featured/views.py @@ -130,6 +130,7 @@ class FeaturedResourceDeleteDetail(SingleObjectMixin, RedirectView): Deletes a featured resource. """ queryset = FeaturedResource.objects.all() + permanent = False @method_decorator(login_required) @method_decorator(transaction.atomic) @@ -150,6 +151,7 @@ class FeaturedResourceDeleteList(MultipleObjectMixin, RedirectView): """ Deletes a list of featured resources. """ + permanent = False @method_decorator(login_required) @method_decorator(permission_required('featured.change_featuredresource', raise_exception=True)) diff --git a/zds/mp/views.py b/zds/mp/views.py index fa15fcfa31..b7e585313a 100644 --- a/zds/mp/views.py +++ b/zds/mp/views.py @@ -145,6 +145,7 @@ class PrivateTopicLeaveDetail(LeavePrivateTopic, SingleObjectMixin, RedirectView """ Leaves a MP. """ + permanent = True queryset = PrivateTopic.objects.all() @method_decorator(login_required) @@ -163,6 +164,7 @@ def get_current_user(self): class PrivateTopicAddParticipant(SingleObjectMixin, RedirectView): + permanent = True object = None queryset = PrivateTopic.objects.all() @@ -221,6 +223,7 @@ class PrivateTopicLeaveList(LeavePrivateTopic, MultipleObjectMixin, RedirectView """ Leaves a list of MP. """ + permanent = True @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): From bd1166d8b20095621f2c998a86e5d4dcfa2a289e Mon Sep 17 00:00:00 2001 From: SpaceFox Date: Tue, 14 Apr 2015 23:38:45 +0200 Subject: [PATCH 24/52] =?UTF-8?q?django.utils.tzinfo=20est=20obsol=C3=A8te?= =?UTF-8?q?,=20remplac=C3=A9=20par=20django.utils.timezone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cf https://docs.djangoproject.com/fr/1.8/ref/utils/#django-utils-tzinfo --- zds/utils/templatetags/date.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zds/utils/templatetags/date.py b/zds/utils/templatetags/date.py index 2220fcc3c8..824929a420 100644 --- a/zds/utils/templatetags/date.py +++ b/zds/utils/templatetags/date.py @@ -6,7 +6,7 @@ from django.contrib.humanize.templatetags.humanize import naturaltime from django.template.defaultfilters import date from django.utils.datetime_safe import datetime -from django.utils.tzinfo import LocalTimezone +from django.utils.timezone import LocalTimezone register = template.Library() From 39b67bc761e341048dd2dd102835825d416dfaa1 Mon Sep 17 00:00:00 2001 From: Augustin Laville Date: Mon, 7 Dec 2015 15:22:10 +0100 Subject: [PATCH 25/52] refactor(url): Utilisation nouvelle syntaxe dans les URLs. - Change le format des urlpatterns. - Utilise les vues dans la declaration des URLs. - Correction de tous les reverse. - Correction de toutes les balises url dans les templates. --- doc/source/utils/git-pre-hook.rst | 2 +- templates/base.html | 28 +- templates/forum/post/new.html | 2 +- templates/forum/topic/index.html | 2 +- templates/forum/topic/new.html | 2 +- templates/gallery/base.html | 2 +- templates/gallery/gallery/list.html | 2 +- templates/home.html | 2 +- templates/member/login.html | 2 +- templates/member/new_password/failed.html | 2 +- templates/member/new_password/success.html | 2 +- templates/member/profile.html | 20 +- templates/member/register/index.html | 2 +- .../member/register/token_already_used.html | 2 +- templates/member/register/token_failed.html | 2 +- templates/member/settings/base.html | 2 +- templates/member/settings/unregister.html | 2 +- templates/misc/message_form.html | 2 +- templates/pages/base.html | 2 +- templates/pages/cookies.html | 2 +- templates/pages/eula.html | 2 +- templates/pages/index.html | 12 +- templates/search/opensearch.xml | 2 +- tox.ini | 2 +- zds/featured/urls.py | 24 +- zds/featured/views.py | 4 +- zds/forum/tests/tests.py | 6 +- zds/forum/urls.py | 103 ++++--- zds/gallery/forms.py | 2 +- zds/gallery/tests/tests_views.py | 30 +-- zds/gallery/urls.py | 36 +-- zds/member/api/urls.py | 21 +- zds/member/forms.py | 6 +- zds/member/models.py | 4 +- zds/member/tests/tests_views.py | 78 +++--- zds/member/urls.py | 96 +++---- zds/member/views.py | 14 +- zds/mp/api/urls.py | 17 +- zds/mp/tests/tests_views.py | 14 +- zds/mp/urls.py | 36 ++- zds/munin/urls.py | 20 +- zds/pages/tests.py | 42 +-- zds/pages/urls.py | 25 +- zds/search/urls.py | 14 +- zds/tutorialv2/tests/tests_views.py | 12 +- zds/tutorialv2/urls/__init__.py | 13 +- zds/tutorialv2/urls/urls_articles.py | 40 +-- zds/tutorialv2/urls/urls_contents.py | 251 +++++++++--------- zds/tutorialv2/urls/urls_tutorials.py | 72 ++--- zds/tutorialv2/urls/urls_validations.py | 28 +- zds/urls.py | 75 +++--- zds/utils/models.py | 4 +- .../templatetags/tests/tests_interventions.py | 6 +- 53 files changed, 585 insertions(+), 610 deletions(-) diff --git a/doc/source/utils/git-pre-hook.rst b/doc/source/utils/git-pre-hook.rst index 6674e553fe..654c6a2824 100644 --- a/doc/source/utils/git-pre-hook.rst +++ b/doc/source/utils/git-pre-hook.rst @@ -18,7 +18,7 @@ restera propre et lisible au cours du temps ! #!/bin/sh - flake8 --exclude=migrations,urls.py,settings.py --max-line-length=120 zds + flake8 --exclude=migrations,settings.py --max-line-length=120 zds # Store tests result RESULT=$? diff --git a/templates/base.html b/templates/base.html index ee609996d0..3ec61ca83b 100644 --- a/templates/base.html +++ b/templates/base.html @@ -109,7 +109,7 @@ {# OpenSearch plugin autodiscovery #} - + {% if not user.is_authenticated or user.profile.allow_temp_visual_changes %} @@ -162,7 +162,7 @@ {# Logo #}
    • {% endif %}
    - + {% trans "Toutes les notifications" %} @@ -368,7 +368,7 @@ {% if perms.forum.change_post %} {% with alerts_list=user|alerts_list %}
  • {% endfor %}
- + {% trans "Toutes les alertes" %} @@ -463,7 +463,7 @@
  • {% csrf_token %} @@ -475,7 +475,7 @@ {% else %} {# Not logged #} - {% trans "Connexion" %} + {% trans "Connexion" %} {% trans "Inscription" %} {% endif %} @@ -487,7 +487,7 @@ diff --git a/templates/forum/post/new.html b/templates/forum/post/new.html index bf35a5ddd3..3bbd4d1e18 100644 --- a/templates/forum/post/new.html +++ b/templates/forum/post/new.html @@ -67,7 +67,7 @@ {% endcaptureas %} {% captureas alert_solve_link %} - {% url "zds.forum.views.solve_alert" %} + {% url "forum-solve-alert" %} {% endcaptureas %} {% include "misc/message.part.html" with perms_change=perms.forum.change_topic %} diff --git a/templates/forum/topic/index.html b/templates/forum/topic/index.html index fdc477199c..85deba5266 100644 --- a/templates/forum/topic/index.html +++ b/templates/forum/topic/index.html @@ -93,7 +93,7 @@ {% endcaptureas %} {% captureas alert_solve_link %} - {% url "zds.forum.views.solve_alert" %} + {% url "forum-solve-alert" %} {% endcaptureas %} {% captureas unread_link %} diff --git a/templates/forum/topic/new.html b/templates/forum/topic/new.html index 011e1c7550..cc873d4d2b 100644 --- a/templates/forum/topic/new.html +++ b/templates/forum/topic/new.html @@ -34,7 +34,7 @@ {% block content %} -
    +
    {% crispy form %}
    diff --git a/templates/gallery/base.html b/templates/gallery/base.html index 9136de2fad..353d4cf6f2 100755 --- a/templates/gallery/base.html +++ b/templates/gallery/base.html @@ -44,7 +44,7 @@

    {% trans "Actions" %}

    {% trans "Supprimer la galerie" %} - +
    diff --git a/templates/member/settings/unregister.html b/templates/member/settings/unregister.html index 7a87d0f3b6..70e35bcf55 100644 --- a/templates/member/settings/unregister.html +++ b/templates/member/settings/unregister.html @@ -88,7 +88,7 @@ diff --git a/templates/misc/message_form.html b/templates/misc/message_form.html index f5f6e4f67e..939b7841c0 100644 --- a/templates/misc/message_form.html +++ b/templates/misc/message_form.html @@ -9,7 +9,7 @@ {% elif not user.is_authenticated %}
    {% trans "Vous devez être connecté pour pouvoir poster un message" %}.
    - Connexion + Connexion

    Pas encore inscrit ?

    diff --git a/templates/pages/base.html b/templates/pages/base.html index 97084831bf..0a22f685cd 100644 --- a/templates/pages/base.html +++ b/templates/pages/base.html @@ -4,7 +4,7 @@ {% block breadcrumb_base %} -
  • {% trans "Pages" %}
  • +
  • {% trans "Pages" %}
  • {% endblock %} diff --git a/templates/pages/cookies.html b/templates/pages/cookies.html index 2fae6bffbc..92b7b6ab20 100644 --- a/templates/pages/cookies.html +++ b/templates/pages/cookies.html @@ -90,7 +90,7 @@

    {% trans "Utilisation d'un logiciel 'anti-espions'" %}

    {% blocktrans %}La CNIL indique quelles solutions sont disponibles avec votre navigateur, dans son Conseil 2.{% endblocktrans %}

    {% trans "Licence de cette page" %}

    - {% url "zds.pages.views.cookies" as cook_url %} + {% url "pages-cookies" as cook_url %} {% if app.site.licenses.cookies %}

    {% blocktrans with url_license=app.site.licenses.cookies.url_license cook_descr=app.site.licenses.cookies.description cook_title=app.site.licenses.cookies.title cook_img=app.site.licenses.cookies.url_image %} diff --git a/templates/pages/eula.html b/templates/pages/eula.html index fcda4aa098..549d3680bb 100644 --- a/templates/pages/eula.html +++ b/templates/pages/eula.html @@ -205,7 +205,7 @@

    6.4 Politique relative à l'installation de cookies

    De manière générale, les cookies sont sans dommage pour l'ordinateur du membre. Ce dernier est libre d'accepter ou refuser les cookies en configurant son navigateur internet à cet effet. Pour ce faire, le membre peut se rendre sur le site de la Commission Nationale de l'Informatique et des Libertés (CNIL) à l'adresse : http://www.cnil.fr/vos-libertes/vos-traces/les-cookies/ donnant toutes les informations relatives à une telle configuration. Les cookies sont anonymes et ne sont en aucun cas utilisés pour collecter des données à caractère personnel, mais uniquement à des fins de connexion et statistiques.

    - Pour plus de détails, voir la page d'explications sur les cookies. + Pour plus de détails, voir la page d'explications sur les cookies.

    diff --git a/templates/pages/index.html b/templates/pages/index.html index 0e2acb87bb..798bc4a387 100644 --- a/templates/pages/index.html +++ b/templates/pages/index.html @@ -23,15 +23,15 @@

    {% trans "Pages" %}

    {% block content %} {% endblock %} diff --git a/templates/search/opensearch.xml b/templates/search/opensearch.xml index 59af2edd01..c3dca949b9 100644 --- a/templates/search/opensearch.xml +++ b/templates/search/opensearch.xml @@ -15,5 +15,5 @@ - + \ No newline at end of file diff --git a/tox.ini b/tox.ini index 78e7158ad0..2aeb0ea54c 100644 --- a/tox.ini +++ b/tox.ini @@ -47,6 +47,6 @@ commands = flake8 {posargs} [flake8] #show-source = True max-line-length = 120 -exclude = .tox,.venv,build,dist,doc,migrations,urls.py,settings.py,settings_prod.py,settings_test.py +exclude = .tox,.venv,build,dist,doc,migrations,settings.py,settings_prod.py,settings_test.py # Ignore N802 (functions in lowercase) because the setUp() function in tests ignore = N802 diff --git a/zds/featured/urls.py b/zds/featured/urls.py index 645211313d..4771fb12e3 100644 --- a/zds/featured/urls.py +++ b/zds/featured/urls.py @@ -1,21 +1,15 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.featured.views import FeaturedResourceList, FeaturedResourceCreate, FeaturedResourceUpdate, \ FeaturedResourceDeleteDetail, FeaturedResourceDeleteList, FeaturedMessageCreateUpdate -urlpatterns = patterns('', - url(r'^$', FeaturedResourceList.as_view(), - name='featured-resource-list'), - url(r'^unes/creer/$', FeaturedResourceCreate.as_view(), - name='featured-resource-create'), - url(r'^unes/editer/(?P\d+)/$', FeaturedResourceUpdate.as_view(), - name='featured-resource-update'), - url(r'^unes/supprimer/(?P\d+)/$', FeaturedResourceDeleteDetail.as_view(), - name='featured-resource-delete'), - url(r'^unes/supprimer/$', FeaturedResourceDeleteList.as_view(), - name='featured-resource-list-delete'), - url(r'^message/modifier/$', FeaturedMessageCreateUpdate.as_view(), - name='featured-message-create'), - ) +urlpatterns = [ + url(r'^$', FeaturedResourceList.as_view(), name='featured-resource-list'), + url(r'^unes/creer/$', FeaturedResourceCreate.as_view(), name='featured-resource-create'), + url(r'^unes/editer/(?P\d+)/$', FeaturedResourceUpdate.as_view(), name='featured-resource-update'), + url(r'^unes/supprimer/(?P\d+)/$', FeaturedResourceDeleteDetail.as_view(), name='featured-resource-delete'), + url(r'^unes/supprimer/$', FeaturedResourceDeleteList.as_view(), name='featured-resource-list-delete'), + url(r'^message/modifier/$', FeaturedMessageCreateUpdate.as_view(), name='featured-message-create'), +] diff --git a/zds/featured/views.py b/zds/featured/views.py index 62716f7653..719b1c0343 100644 --- a/zds/featured/views.py +++ b/zds/featured/views.py @@ -117,7 +117,7 @@ def form_valid(self, form): self.featured_resource.pubdate = datetime.now() self.featured_resource.save() - return redirect(reverse('zds.pages.views.home')) + return redirect(reverse('homepage')) def get_form(self, form_class): form = self.form_class(self.request.POST) @@ -215,4 +215,4 @@ def form_valid(self, form): featured_message.message = form.data.get('message') featured_message.url = form.data.get('url') featured_message.save() - return redirect(reverse('zds.pages.views.home')) + return redirect(reverse('homepage')) diff --git a/zds/forum/tests/tests.py b/zds/forum/tests/tests.py index 4b66d8b497..7b10357da2 100644 --- a/zds/forum/tests/tests.py +++ b/zds/forum/tests/tests.py @@ -490,7 +490,7 @@ def test_signal_post(self): alert = Alert.objects.get(comment=post2.pk) # try as a normal user result = self.client.post( - reverse('zds.forum.views.solve_alert'), + reverse('forum-solve-alert'), { 'alert_pk': alert.pk, }, @@ -505,7 +505,7 @@ def test_signal_post(self): True) # try again as staff result = self.client.post( - reverse('zds.forum.views.solve_alert'), + reverse('forum-solve-alert'), { 'alert_pk': alert.pk, 'text': u'Everything is Ok kid' @@ -540,7 +540,7 @@ def test_signal_and_solve_alert_empty_message(self): True) # try again as staff result = self.client.post( - reverse('zds.forum.views.solve_alert'), + reverse('forum-solve-alert'), { 'alert_pk': alert.pk, }, diff --git a/zds/forum/urls.py b/zds/forum/urls.py index fd524fd756..dc733db868 100644 --- a/zds/forum/urls.py +++ b/zds/forum/urls.py @@ -1,59 +1,54 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url -from . import feeds +from zds.forum import feeds from zds.forum.views import CategoriesForumsListView, CategoryForumsDetailView, ForumTopicsListView, \ TopicPostsListView, TopicNew, TopicEdit, FindTopic, FindTopicByTag, PostNew, PostEdit, \ - PostUseful, PostUnread, PostLike, PostDisLike, FindPost - - -urlpatterns = patterns('', - - # Feeds - url(r'^flux/messages/rss/$', feeds.LastPostsFeedRSS(), name='post-feed-rss'), - url(r'^flux/messages/atom/$', feeds.LastPostsFeedATOM(), name='post-feed-atom'), - - url(r'^flux/sujets/rss/$', feeds.LastTopicsFeedRSS(), name='topic-feed-rss'), - url(r'^flux/sujets/atom/$', feeds.LastTopicsFeedATOM(), name='topic-feed-atom'), - - # Developers warning: if you update something here, check and update help_text - # on Category slug field - - # Followed topics - url(r'^notifications/$', - 'zds.forum.views.followed_topics'), - - # Moderation - url(r'^resolution_alerte/$', - 'zds.forum.views.solve_alert'), - - # Viewing a thread - url(r'^sujet/nouveau/$', TopicNew.as_view(), name='topic-new'), - url(r'^sujet/editer/$', TopicEdit.as_view(), name='topic-edit'), - url(r'^sujet/(?P\d+)/(?P.+)/$', TopicPostsListView.as_view(), - name='topic-posts-list'), - url(r'^sujets/membre/(?P\d+)/$', FindTopic.as_view(), name='topic-find'), - url(r'^sujets/tag/(?P\d+)/(?P.+)/$', FindTopicByTag.as_view(), - name='topic-tag-find'), - url(r'^sujets/recherche/$', 'zds.forum.views.complete_topic'), - - # Message-related - url(r'^message/nouveau/$', PostNew.as_view(), name='post-new'), - url(r'^message/editer/$', PostEdit.as_view(), name='post-edit'), - url(r'^message/utile/$', PostUseful.as_view(), name='post-useful'), - url(r'^message/nonlu/$', PostUnread.as_view(), name='post-unread'), - url(r'^message/like/$', PostLike.as_view(), name='post-like'), - url(r'^message/dislike/$', PostDisLike.as_view(), name='post-dislike'), - url(r'^messages/(?P\d+)/$', FindPost.as_view(), name='post-find'), - - # Categories and forums list. - url(r'^$', CategoriesForumsListView.as_view(), name='cats-forums-list'), - - # Forum details - url(r'^(?P.+)/(?P.+)/$', ForumTopicsListView.as_view(), - name='forum-topics-list'), - - # Forums belonging to one category - url(r'^(?P.+)/$', CategoryForumsDetailView.as_view(), name='cat-forums-list'), - ) + PostUseful, PostUnread, PostLike, PostDisLike, FindPost, followed_topics, solve_alert, complete_topic + + +urlpatterns = [ + + # Feeds + url(r'^flux/messages/rss/$', feeds.LastPostsFeedRSS(), name='post-feed-rss'), + url(r'^flux/messages/atom/$', feeds.LastPostsFeedATOM(), name='post-feed-atom'), + + url(r'^flux/sujets/rss/$', feeds.LastTopicsFeedRSS(), name='topic-feed-rss'), + url(r'^flux/sujets/atom/$', feeds.LastTopicsFeedATOM(), name='topic-feed-atom'), + + # Developers warning: if you update something here, check and update help_text + # on Category slug field + + # Followed topics + url(r'^notifications/$', followed_topics, name='forum-followed-topics'), + + # Moderation + url(r'^resolution_alerte/$', solve_alert, name='forum-solve-alert'), + + # Viewing a thread + url(r'^sujet/nouveau/$', TopicNew.as_view(), name='topic-new'), + url(r'^sujet/editer/$', TopicEdit.as_view(), name='topic-edit'), + url(r'^sujet/(?P\d+)/(?P.+)/$', TopicPostsListView.as_view(), name='topic-posts-list'), + url(r'^sujets/membre/(?P\d+)/$', FindTopic.as_view(), name='topic-find'), + url(r'^sujets/tag/(?P\d+)/(?P.+)/$', FindTopicByTag.as_view(), name='topic-tag-find'), + url(r'^sujets/recherche/$', complete_topic, name='forum-complete-topic'), + + # Message-related + url(r'^message/nouveau/$', PostNew.as_view(), name='post-new'), + url(r'^message/editer/$', PostEdit.as_view(), name='post-edit'), + url(r'^message/utile/$', PostUseful.as_view(), name='post-useful'), + url(r'^message/nonlu/$', PostUnread.as_view(), name='post-unread'), + url(r'^message/like/$', PostLike.as_view(), name='post-like'), + url(r'^message/dislike/$', PostDisLike.as_view(), name='post-dislike'), + url(r'^messages/(?P\d+)/$', FindPost.as_view(), name='post-find'), + + # Categories and forums list. + url(r'^$', CategoriesForumsListView.as_view(), name='cats-forums-list'), + + # Forum details + url(r'^(?P.+)/(?P.+)/$', ForumTopicsListView.as_view(), name='forum-topics-list'), + + # Forums belonging to one category + url(r'^(?P.+)/$', CategoryForumsDetailView.as_view(), name='cat-forums-list'), +] diff --git a/zds/gallery/forms.py b/zds/gallery/forms.py index 25a8f17a2e..ba59148767 100644 --- a/zds/gallery/forms.py +++ b/zds/gallery/forms.py @@ -95,7 +95,7 @@ def __init__(self, *args, **kwargs): self.helper = FormHelper() self.helper.form_class = 'modal modal-flex' self.helper.form_id = 'add-user-modal' - self.helper.form_action = reverse('zds.gallery.views.modify_gallery') + self.helper.form_action = reverse('gallery-modify') self.helper.form_method = 'post' self.helper.layout = Layout( diff --git a/zds/gallery/tests/tests_views.py b/zds/gallery/tests/tests_views.py index 2be8174d5d..ec4a3fa7f3 100644 --- a/zds/gallery/tests/tests_views.py +++ b/zds/gallery/tests/tests_views.py @@ -18,7 +18,7 @@ class GalleryListViewTest(TestCase): def test_denies_anonymous(self): response = self.client.get(reverse('gallery-list'), follow=True) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-list'), '')) def test_list_galeries_belong_to_member(self): @@ -50,7 +50,7 @@ def test_denies_anonymous(self): response = self.client.get(reverse('gallery-details', args=['89', 'test-gallery']), follow=True) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-details', args=['89', 'test-gallery']), '')) @@ -95,13 +95,13 @@ def setUp(self): def test_denies_anonymous(self): response = self.client.get(reverse('gallery-new'), follow=True) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-new'), '')) response = self.client.post(reverse('gallery-new'), follow=True) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-new'), '')) @@ -172,7 +172,7 @@ def test_fail_delete_multi_read_permission(self): self.assertEqual(3, Image.objects.all().count()) response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'delete_multi': '', 'items': [self.gallery1.pk] @@ -194,7 +194,7 @@ def test_success_delete_multi_write_permission(self): self.assertEqual(3, Image.objects.all().count()) response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'delete_multi': '', 'items': [self.gallery1.pk, self.gallery2.pk] @@ -212,7 +212,7 @@ def test_fail_add_user_with_read_permission(self): # gallery nonexistent response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'adduser': '', 'gallery': 89, @@ -222,7 +222,7 @@ def test_fail_add_user_with_read_permission(self): # try to add an user with write permission response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'adduser': '', 'gallery': self.gallery1.pk, @@ -238,7 +238,7 @@ def test_fail_add_user_already_has_permission(self): # Same permission : read response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'adduser': '', 'gallery': self.gallery1.pk, @@ -255,7 +255,7 @@ def test_fail_add_user_already_has_permission(self): # try to add write permission to an user # who has already an read permission response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'adduser': '', 'gallery': self.gallery1.pk, @@ -274,7 +274,7 @@ def test_success_add_user_read_permission(self): self.assertTrue(login_check) response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'adduser': '', 'gallery': self.gallery1.pk, @@ -293,7 +293,7 @@ def test_success_add_user_write_permission(self): self.assertTrue(login_check) response = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'adduser': '', 'gallery': self.gallery1.pk, @@ -410,7 +410,7 @@ def test_denies_anonymous(self): follow=True ) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-image-edit', args=[15, 156]), '')) def test_fail_member_no_permission_can_edit_image(self): @@ -502,7 +502,7 @@ def tearDown(self): def test_denies_anonymous(self): response = self.client.get(reverse('gallery-image-delete'), follow=True) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-image-delete'), '')) def test_fail_modify_image_with_no_permission(self): @@ -608,7 +608,7 @@ def setUp(self): def test_denies_anonymous(self): response = self.client.get(reverse('gallery-image-new', args=[1]), follow=True) self.assertRedirects(response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('gallery-image-new', args=[1]), '')) def test_success_new_image_write_permission(self): diff --git a/zds/gallery/urls.py b/zds/gallery/urls.py index aa3431653f..5d2dcdc467 100644 --- a/zds/gallery/urls.py +++ b/zds/gallery/urls.py @@ -1,28 +1,28 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.gallery.views import NewGallery, NewImage, DeleteImages, EditImage, ImportImages, GalleryDetails, \ - EditGallery, ListGallery + EditGallery, ListGallery, modify_gallery -urlpatterns = patterns('', - # Add and edit a gallery - url(r'^nouveau/$', NewGallery.as_view(), name='gallery-new'), - url(r'^modifier/$', 'zds.gallery.views.modify_gallery'), +urlpatterns = [ + # Add and edit a gallery + url(r'^nouveau/$', NewGallery.as_view(), name='gallery-new'), + url(r'^modifier/$', modify_gallery, name='gallery-modify'), - # Image operations - url(r'^image/ajouter/(?P\d+)/$', NewImage.as_view(), name='gallery-image-new'), - url(r'^image/supprimer/$', DeleteImages.as_view(), name='gallery-image-delete'), - url(r'^image/editer/(?P\d+)/(?P\d+)/$', EditImage.as_view(), name='gallery-image-edit'), - url(r'^image/importer/(?P\d+)/$', ImportImages.as_view(), name='gallery-image-import'), + # Image operations + url(r'^image/ajouter/(?P\d+)/$', NewImage.as_view(), name='gallery-image-new'), + url(r'^image/supprimer/$', DeleteImages.as_view(), name='gallery-image-delete'), + url(r'^image/editer/(?P\d+)/(?P\d+)/$', EditImage.as_view(), name='gallery-image-edit'), + url(r'^image/importer/(?P\d+)/$', ImportImages.as_view(), name='gallery-image-import'), - # View a gallery - url(r'^(?P\d+)/(?P.+)/$', GalleryDetails.as_view(), name='gallery-details'), + # View a gallery + url(r'^(?P\d+)/(?P.+)/$', GalleryDetails.as_view(), name='gallery-details'), - # edit a gallery - url(r'^editer/(?P\d+)/(?P.+)/$', EditGallery.as_view(), name='gallery-edit'), + # edit a gallery + url(r'^editer/(?P\d+)/(?P.+)/$', EditGallery.as_view(), name='gallery-edit'), - # Index - url(r'^$', ListGallery.as_view(), name='gallery-list'), - ) + # Index + url(r'^$', ListGallery.as_view(), name='gallery-list'), +] diff --git a/zds/member/api/urls.py b/zds/member/api/urls.py index 7f07d355df..2f4f479448 100644 --- a/zds/member/api/urls.py +++ b/zds/member/api/urls.py @@ -1,15 +1,14 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url -from zds.member.api.views import MemberListAPI, MemberDetailAPI, \ - MemberDetailReadingOnly, MemberDetailBan, MemberMyDetailAPI +from zds.member.api.views import MemberListAPI, MemberDetailAPI, MemberDetailReadingOnly, MemberDetailBan, \ + MemberMyDetailAPI -urlpatterns = patterns('', - url(r'^$', MemberListAPI.as_view(), name='api-member-list'), - url(r'^mon-profil/$', MemberMyDetailAPI.as_view(), name='api-member-profile'), - url(r'^(?P[0-9]+)/$', MemberDetailAPI.as_view(), name='api-member-detail'), - url(r'^(?P[0-9]+)/lecture-seule/$', MemberDetailReadingOnly.as_view(), - name='api-member-read-only'), - url(r'^(?P[0-9]+)/ban/$', MemberDetailBan.as_view(), name='api-member-ban'), - ) +urlpatterns = [ + url(r'^$', MemberListAPI.as_view(), name='api-member-list'), + url(r'^mon-profil/$', MemberMyDetailAPI.as_view(), name='api-member-profile'), + url(r'^(?P[0-9]+)/$', MemberDetailAPI.as_view(), name='api-member-detail'), + url(r'^(?P[0-9]+)/lecture-seule/$', MemberDetailReadingOnly.as_view(), name='api-member-read-only'), + url(r'^(?P[0-9]+)/ban/$', MemberDetailBan.as_view(), name='api-member-ban'), +] diff --git a/zds/member/forms.py b/zds/member/forms.py index ccb2eea74a..91983fe46a 100644 --- a/zds/member/forms.py +++ b/zds/member/forms.py @@ -41,7 +41,7 @@ def __init__(self, profile, *args, **kwargs): self.helper.form_class = 'modal modal-flex' self.helper.form_id = 'link-tuto-modal' self.helper.form_method = 'post' - self.helper.form_action = reverse('zds.member.views.add_oldtuto') + self.helper.form_action = reverse('member-add-oldtuto') self.helper.layout = Layout( HTML(_(u'

    Choisissez un tutoriel du SdZ à attribuer au membre

    ')), @@ -84,7 +84,7 @@ class LoginForm(forms.Form): def __init__(self, next=None, *args, **kwargs): super(LoginForm, self).__init__(*args, **kwargs) self.helper = FormHelper() - self.helper.form_action = reverse('zds.member.views.login_view') + self.helper.form_action = reverse('member-login') self.helper.form_method = 'post' self.helper.form_class = 'content-wrapper' @@ -667,7 +667,7 @@ class KarmaForm(forms.Form): def __init__(self, profile, *args, **kwargs): super(KarmaForm, self).__init__(*args, **kwargs) self.helper = FormHelper() - self.helper.form_action = reverse('zds.member.views.modify_karma') + self.helper.form_action = reverse('member-modify-karma') self.helper.form_class = 'modal modal-flex' self.helper.form_id = 'karmatiser-modal' self.helper.form_method = 'post' diff --git a/zds/member/models.py b/zds/member/models.py index 0ee34711cf..f9ac02c1a2 100644 --- a/zds/member/models.py +++ b/zds/member/models.py @@ -412,7 +412,7 @@ def get_absolute_url(self): """ :return: The absolute URL of the "New password" page, including the correct token. """ - return reverse('zds.member.views.new_password') + '?token={0}'.format(self.token) + return reverse('member-new-password') + '?token={0}'.format(self.token) def __unicode__(self): return u"{0} - {1}".format(self.user.username, self.date_end) @@ -436,7 +436,7 @@ def get_absolute_url(self): """ :return: the absolute URL of the account validation page, including the token. """ - return reverse('zds.member.views.active_account') + '?token={0}'.format(self.token) + return reverse('member-active-account') + '?token={0}'.format(self.token) def __unicode__(self): return u"{0} - {1}".format(self.user.username, self.date_end) diff --git a/zds/member/tests/tests_views.py b/zds/member/tests/tests_views.py index fa0124ccf2..9140c33418 100644 --- a/zds/member/tests/tests_views.py +++ b/zds/member/tests/tests_views.py @@ -176,14 +176,14 @@ def test_modify_member(self): # an inexistant member return 404 result = self.client.get( - reverse('zds.member.views.settings_mini_profile', args=["xkcd"]), + reverse('member-settings-mini-profile', args=["xkcd"]), follow=False ) self.assertEqual(result.status_code, 404) # an existant member return 200 result = self.client.get( - reverse('zds.member.views.settings_mini_profile', args=[self.mas.user.username]), + reverse('member-settings-mini-profile', args=[self.mas.user.username]), follow=False ) self.assertEqual(result.status_code, 200) @@ -196,17 +196,17 @@ def test_login(self): # login a user. Good password then redirection to the homepage. result = self.client.post( - reverse('zds.member.views.login_view'), + reverse('member-login'), {'username': user.user.username, 'password': 'hostel77', 'remember': 'remember'}, follow=False) - self.assertRedirects(result, reverse('zds.pages.views.home')) + self.assertRedirects(result, reverse('homepage')) # login failed with bad password then no redirection # (status_code equals 200 and not 302). result = self.client.post( - reverse('zds.member.views.login_view'), + reverse('member-login'), {'username': user.user.username, 'password': 'hostel', 'remember': 'remember'}, @@ -216,7 +216,7 @@ def test_login(self): # login a user. Good password and next parameter then # redirection to the "next" page. result = self.client.post( - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + reverse('gallery-list'), {'username': user.user.username, 'password': 'hostel77', @@ -228,10 +228,10 @@ def test_login(self): # a next parameter. self.client.logout() result = self.client.get( - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + reverse('gallery-list')) self.assertContains(result, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + reverse('gallery-list'), count=1) @@ -280,7 +280,7 @@ def test_unregister(self): # test not logged user can't unregister. self.client.logout() result = self.client.post( - reverse('zds.member.views.unregister'), + reverse('member-unregister'), follow=False) self.assertEqual(result.status_code, 302) @@ -291,7 +291,7 @@ def test_unregister(self): password='hostel77') self.assertEqual(login_check, True) result = self.client.post( - reverse('zds.member.views.unregister'), + reverse('member-unregister'), follow=False) self.assertEqual(result.status_code, 302) self.assertEqual(User.objects.filter(username=user.user.username).count(), 0) @@ -368,7 +368,7 @@ def test_unregister(self): password='hostel77') self.assertEqual(login_check, True) result = self.client.post( - reverse('zds.member.views.unregister'), + reverse('member-unregister'), follow=False) self.assertEqual(result.status_code, 302) @@ -468,7 +468,7 @@ def test_forgot_password(self): mail.outbox = [] result = self.client.post( - reverse('zds.member.views.forgot_password'), + reverse('member-forgot-password'), { 'username': self.mas.user.username, 'email': '', @@ -510,7 +510,7 @@ def test_sanctions(self): user_ls = ProfileFactory() result = self.client.post( reverse( - 'zds.member.views.modify_profile', kwargs={ + 'member-modify-profile', kwargs={ 'user_pk': user_ls.user.id}), { 'ls': '', 'ls-text': 'Texte de test pour LS'}, follow=False) user = Profile.objects.get(id=user_ls.id) # Refresh profile from DB @@ -531,7 +531,7 @@ def test_sanctions(self): # Test: Un-LS result = self.client.post( reverse( - 'zds.member.views.modify_profile', kwargs={ + 'member-modify-profile', kwargs={ 'user_pk': user_ls.user.id}), { 'un-ls': '', 'unls-text': 'Texte de test pour un-LS'}, follow=False) @@ -554,7 +554,7 @@ def test_sanctions(self): user_ls_temp = ProfileFactory() result = self.client.post( reverse( - 'zds.member.views.modify_profile', kwargs={ + 'member-modify-profile', kwargs={ 'user_pk': user_ls_temp.user.id}), { 'ls-temp': '', 'ls-jrs': 10, 'ls-text': u'Texte de test pour LS TEMP'}, @@ -579,7 +579,7 @@ def test_sanctions(self): user_ban = ProfileFactory() result = self.client.post( reverse( - 'zds.member.views.modify_profile', kwargs={ + 'member-modify-profile', kwargs={ 'user_pk': user_ban.user.id}), { 'ban': '', 'ban-text': u'Texte de test pour BAN'}, follow=False) user = Profile.objects.get(id=user_ban.id) # Refresh profile from DB @@ -600,7 +600,7 @@ def test_sanctions(self): # Test: un-BAN result = self.client.post( reverse( - 'zds.member.views.modify_profile', kwargs={ + 'member-modify-profile', kwargs={ 'user_pk': user_ban.user.id}), {'un-ban': '', 'unban-text': u'Texte de test pour BAN'}, @@ -623,7 +623,7 @@ def test_sanctions(self): # Test: BAN temp user_ban_temp = ProfileFactory() result = self.client.post( - reverse('zds.member.views.modify_profile', + reverse('member-modify-profile', kwargs={'user_pk': user_ban_temp.user.id}), {'ban-temp': '', 'ban-jrs': 10, 'ban-text': u'Texte de test pour BAN TEMP'}, @@ -655,7 +655,7 @@ def test_failed_bot_sanctions(self): # Test: LS result = self.client.post( reverse( - 'zds.member.views.modify_profile', kwargs={ + 'member-modify-profile', kwargs={ 'user_pk': bot_profile.user.id}), { 'ls': '', 'ls-text': 'Texte de test pour LS'}, follow=False) user = Profile.objects.get(id=bot_profile.id) # Refresh profile from DB @@ -667,7 +667,7 @@ def test_failed_bot_sanctions(self): def test_nonascii(self): user = NonAsciiProfileFactory() - result = self.client.get(reverse('zds.member.views.login_view') + '?next=' + + result = self.client.get(reverse('member-login') + '?next=' + reverse('member-detail', args=[user.user.username]), follow=False) self.assertEqual(result.status_code, 200) @@ -724,13 +724,13 @@ def test_promote_interface(self): # check that we can go through the page result = self.client.get( - reverse('zds.member.views.settings_promote', + reverse('member-settings-promote', kwargs={'user_pk': tester.user.id}), follow=False) self.assertEqual(result.status_code, 200) # give user rights and groups thanks to staff (but account still not activated) result = self.client.post( - reverse('zds.member.views.settings_promote', + reverse('member-settings-promote', kwargs={'user_pk': tester.user.id}), { 'groups': [group.id, groupbis.id], @@ -752,7 +752,7 @@ def test_promote_interface(self): # retract all right, keep one group only and activate account result = self.client.post( - reverse('zds.member.views.settings_promote', + reverse('member-settings-promote', kwargs={'user_pk': tester.user.id}), { 'groups': [group.id], @@ -768,7 +768,7 @@ def test_promote_interface(self): # no groups specified result = self.client.post( - reverse('zds.member.views.settings_promote', + reverse('member-settings-promote', kwargs={'user_pk': tester.user.id}), { 'activation': "on" @@ -779,7 +779,7 @@ def test_promote_interface(self): # check that staff can't take away it's own super user rights result = self.client.post( - reverse('zds.member.views.settings_promote', + reverse('member-settings-promote', kwargs={'user_pk': staff.user.id}), { 'activation': "on" @@ -794,7 +794,7 @@ def test_promote_interface(self): password='hostel77') self.assertEqual(login_check, True) result = self.client.post( - reverse('zds.member.views.settings_promote', + reverse('member-settings-promote', kwargs={'user_pk': staff.user.id}), { 'activation': "on" @@ -812,7 +812,7 @@ def test_filter_member_ip(self): # test login normal user result = self.client.post( - reverse('zds.member.views.login_view'), + reverse('member-login'), {'username': tester.user.username, 'password': 'hostel77', 'remember': 'remember'}, @@ -822,14 +822,14 @@ def test_filter_member_ip(self): # Check that the filter can't be access from normal user result = self.client.post( - reverse('zds.member.views.member_from_ip', + reverse('member-from-ip', kwargs={'ip_address': tester.last_ip_address}), {}, follow=False) self.assertEqual(result.status_code, 403) # log the staff user result = self.client.post( - reverse('zds.member.views.login_view'), + reverse('member-login'), {'username': staff.user.username, 'password': 'hostel77', 'remember': 'remember'}, @@ -839,7 +839,7 @@ def test_filter_member_ip(self): # test that we retrieve correctly the 2 members (staff + user) from this ip result = self.client.post( - reverse('zds.member.views.member_from_ip', + reverse('member-from-ip', kwargs={'ip_address': staff.last_ip_address}), {}, follow=False) self.assertEqual(result.status_code, 200) @@ -854,19 +854,19 @@ def test_modify_user_karma(self): # login as user result = self.client.post( - reverse('zds.member.views.login_view'), + reverse('member-login'), {'username': tester.user.username, 'password': 'hostel77'}, follow=False) self.assertEqual(result.status_code, 302) # check that user can't use this feature - result = self.client.post(reverse('zds.member.views.modify_karma'), follow=False) + result = self.client.post(reverse('member-modify-karma'), follow=False) self.assertEqual(result.status_code, 403) # login as staff result = self.client.post( - reverse('zds.member.views.login_view'), + reverse('member-login'), {'username': staff.user.username, 'password': 'hostel77'}, follow=False) @@ -874,7 +874,7 @@ def test_modify_user_karma(self): # try to give a few bad points to the tester result = self.client.post( - reverse('zds.member.views.modify_karma'), + reverse('member-modify-karma'), {'profile_pk': tester.pk, 'warning': 'Bad tester is bad !', 'points': '-50'}, @@ -886,7 +886,7 @@ def test_modify_user_karma(self): # Now give a few good points result = self.client.post( - reverse('zds.member.views.modify_karma'), + reverse('member-modify-karma'), {'profile_pk': tester.pk, 'warning': 'Good tester is good !', 'points': '10'}, @@ -898,7 +898,7 @@ def test_modify_user_karma(self): # Now access some unknow user result = self.client.post( - reverse('zds.member.views.modify_karma'), + reverse('member-modify-karma'), {'profile_pk': 9999, 'warning': 'Good tester is good !', 'points': '10'}, @@ -907,7 +907,7 @@ def test_modify_user_karma(self): # Now give unknow point result = self.client.post( - reverse('zds.member.views.modify_karma'), + reverse('member-modify-karma'), {'profile_pk': tester.pk, 'warning': 'Good tester is good !', 'points': ''}, @@ -919,7 +919,7 @@ def test_modify_user_karma(self): # Now give no point at all result = self.client.post( - reverse('zds.member.views.modify_karma'), + reverse('member-modify-karma'), {'profile_pk': tester.pk, 'warning': 'Good tester is good !'}, follow=False) @@ -929,7 +929,7 @@ def test_modify_user_karma(self): self.assertEqual(KarmaNote.objects.filter(user=tester.user).count(), 4) # Now access without post - result = self.client.get(reverse('zds.member.views.modify_karma'), follow=False) + result = self.client.get(reverse('member-modify-karma'), follow=False) self.assertEqual(result.status_code, 405) def test_karma_and_pseudo_change(self): diff --git a/zds/member/urls.py b/zds/member/urls.py index cd7c77c128..b2420bfd49 100644 --- a/zds/member/urls.py +++ b/zds/member/urls.py @@ -1,49 +1,51 @@ # coding: utf-8 -from django.conf.urls import patterns, url - -from views import MemberList, MemberDetail, UpdateMember, UpdateAvatarMember, UpdatePasswordMember, \ - UpdateUsernameEmailMember, RegisterView, SendValidationEmailView - -urlpatterns = patterns('', - #list - url(r'^$', MemberList.as_view(), name='member-list'), - - #details - url(r'^voir/(?P.+)/$', MemberDetail.as_view(), name='member-detail'), - - #modification - url(r'^parametres/profil/$', UpdateMember.as_view(), name='update-member'), - url(r'^parametres/profil/maj_avatar/$', UpdateAvatarMember.as_view(), name='update-avatar-member'), - url(r'^parametres/compte/$', UpdatePasswordMember.as_view(), name='update-password-member'), - url(r'^parametres/user/$', UpdateUsernameEmailMember.as_view(), name='update-username-email-member'), - - #old tuto - url(r'^profil/lier/$', 'zds.member.views.add_oldtuto'), - url(r'^profil/delier/$', 'zds.member.views.remove_oldtuto'), - - #moderation - url(r'^profil/karmatiser/$', 'zds.member.views.modify_karma'), - url(r'^profil/modifier/(?P\d+)/$', 'zds.member.views.modify_profile'), - url(r'^parametres/mini_profil/(?P.+)/$', 'zds.member.views.settings_mini_profile'), - url(r'^profil/multi/(?P.+)/$', 'zds.member.views.member_from_ip'), - - #tutorials and articles - url(r'^tutoriels/$', 'zds.member.views.tutorials'), - url(r'^articles/$', 'zds.member.views.articles'), - - #user rights - url(r'^profil/promouvoir/(?P\d+)/$', 'zds.member.views.settings_promote'), - - #membership - url(r'^connexion/$', 'zds.member.views.login_view'), - url(r'^deconnexion/$', 'zds.member.views.logout_view'), - url(r'^inscription/$', RegisterView.as_view(), name='register-member'), - url(r'^reinitialisation/$', 'zds.member.views.forgot_password'), - url(r'^validation/$', SendValidationEmailView.as_view(), name='send-validation-email'), - url(r'^new_password/$', 'zds.member.views.new_password'), - url(r'^activation/$', 'zds.member.views.active_account'), - url(r'^envoi_jeton/$', 'zds.member.views.generate_token_account'), - url(r'^desinscrire/valider/$', 'zds.member.views.unregister'), - url(r'^desinscrire/avertissement/$', 'zds.member.views.warning_unregister') - ) +from django.conf.urls import url + +from zds.member.views import MemberList, MemberDetail, UpdateMember, UpdateAvatarMember, UpdatePasswordMember, \ + UpdateUsernameEmailMember, RegisterView, SendValidationEmailView, add_oldtuto, remove_oldtuto, modify_karma, \ + modify_profile, settings_mini_profile, member_from_ip, tutorials, articles, settings_promote, login_view, \ + logout_view, forgot_password, new_password, active_account, generate_token_account, unregister, warning_unregister + +urlpatterns = [ + # list + url(r'^$', MemberList.as_view(), name='member-list'), + + # details + url(r'^voir/(?P.+)/$', MemberDetail.as_view(), name='member-detail'), + + # modification + url(r'^parametres/profil/$', UpdateMember.as_view(), name='update-member'), + url(r'^parametres/profil/maj_avatar/$', UpdateAvatarMember.as_view(), name='update-avatar-member'), + url(r'^parametres/compte/$', UpdatePasswordMember.as_view(), name='update-password-member'), + url(r'^parametres/user/$', UpdateUsernameEmailMember.as_view(), name='update-username-email-member'), + + # old tuto + url(r'^profil/lier/$', add_oldtuto, name='member-add-oldtuto'), + url(r'^profil/delier/$', remove_oldtuto, name='member-remove-oldtuto'), + + # moderation + url(r'^profil/karmatiser/$', modify_karma, name='member-modify-karma'), + url(r'^profil/modifier/(?P\d+)/$', modify_profile, name='member-modify-profile'), + url(r'^parametres/mini_profil/(?P.+)/$', settings_mini_profile, name='member-settings-mini-profile'), + url(r'^profil/multi/(?P.+)/$', member_from_ip, name='member-from-ip'), + + # tutorials and articles + url(r'^tutoriels/$', tutorials, name='member-tutorials'), + url(r'^articles/$', articles, name='member-articles'), + + # user rights + url(r'^profil/promouvoir/(?P\d+)/$', settings_promote, name='member-settings-promote'), + + # membership + url(r'^connexion/$', login_view, name='member-login'), + url(r'^deconnexion/$', logout_view, name='member-logout'), + url(r'^inscription/$', RegisterView.as_view(), name='register-member'), + url(r'^reinitialisation/$', forgot_password, name='member-forgot-password'), + url(r'^validation/$', SendValidationEmailView.as_view(), name='send-validation-email'), + url(r'^new_password/$', new_password, name='member-new-password'), + url(r'^activation/$', active_account, name='member-active-account'), + url(r'^envoi_jeton/$', generate_token_account, name='member-generate-token-account'), + url(r'^desinscrire/valider/$', unregister, name='member-unregister'), + url(r'^desinscrire/avertissement/$', warning_unregister, name='member-warning-unregister') +] diff --git a/zds/member/views.py b/zds/member/views.py index 196fd49e22..88caa86d7d 100644 --- a/zds/member/views.py +++ b/zds/member/views.py @@ -429,7 +429,7 @@ def unregister(request): logout(request) User.objects.filter(pk=current.pk).delete() - return redirect(reverse("zds.pages.views.home")) + return redirect(reverse("homepage")) @require_POST @@ -606,7 +606,7 @@ def settings_mini_profile(request, user_name): profile.save() except: messages.error(request, u"Une erreur est survenue.") - return redirect(reverse("zds.member.views.settings_mini_profile")) + return redirect(reverse("member-settings-mini-profile")) messages.success(request, _(u"Le profil a correctement été mis à jour.")) return redirect(reverse("member-detail", args=[profile.user.username])) @@ -656,7 +656,7 @@ def login_view(request): try: return redirect(next_page) except: - return redirect(reverse("zds.pages.views.home")) + return redirect(reverse("homepage")) else: messages.error(request, _(u"Vous n'êtes pas autorisé à vous connecter " @@ -693,7 +693,7 @@ def logout_view(request): logout(request) request.session.clear() - return redirect(reverse("zds.pages.views.home")) + return redirect(reverse("homepage")) @https_required @@ -756,7 +756,7 @@ def new_password(request): try: token = request.GET["token"] except KeyError: - return redirect(reverse("zds.pages.views.home")) + return redirect(reverse("homepage")) token = get_object_or_404(TokenForgotPassword, token=token) if request.method == "POST": form = NewPasswordForm(token.user.username, request.POST) @@ -784,7 +784,7 @@ def active_account(request): try: token = request.GET["token"] except KeyError: - return redirect(reverse("zds.pages.views.home")) + return redirect(reverse("homepage")) token = get_object_or_404(TokenRegister, token=token) usr = token.user @@ -836,7 +836,7 @@ def generate_token_account(request): try: token = request.GET["token"] except KeyError: - return redirect(reverse("zds.pages.views.home")) + return redirect(reverse("homepage")) token = get_object_or_404(TokenRegister, token=token) # push date diff --git a/zds/mp/api/urls.py b/zds/mp/api/urls.py index 6bff16dc14..fb07587080 100644 --- a/zds/mp/api/urls.py +++ b/zds/mp/api/urls.py @@ -1,14 +1,15 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.mp.api.views import PrivateTopicListAPI, PrivateTopicDetailAPI, PrivatePostListAPI, PrivatePostDetailAPI, \ PrivateTopicReadAPI -urlpatterns = patterns('', - url(r'^$', PrivateTopicListAPI.as_view(), name='api-mp-list'), - url(r'^(?P[0-9]+)/$', PrivateTopicDetailAPI.as_view(), name='api-mp-detail'), - url(r'^(?P[0-9]+)/messages/$', PrivatePostListAPI.as_view(), name='api-mp-message-list'), - url(r'^(?P[0-9]+)/messages/(?P[0-9]+)/$', PrivatePostDetailAPI.as_view(), name='api-mp-message-detail'), - url(r'^unread/$', PrivateTopicReadAPI.as_view(), name='api-mp-list-unread'), -) +urlpatterns = [ + url(r'^$', PrivateTopicListAPI.as_view(), name='api-mp-list'), + url(r'^(?P[0-9]+)/$', PrivateTopicDetailAPI.as_view(), name='api-mp-detail'), + url(r'^(?P[0-9]+)/messages/$', PrivatePostListAPI.as_view(), name='api-mp-message-list'), + url(r'^(?P[0-9]+)/messages/(?P[0-9]+)/$', PrivatePostDetailAPI.as_view(), + name='api-mp-message-detail'), + url(r'^unread/$', PrivateTopicReadAPI.as_view(), name='api-mp-list-unread'), +] diff --git a/zds/mp/tests/tests_views.py b/zds/mp/tests/tests_views.py index 759b306b29..805f8ec63a 100644 --- a/zds/mp/tests/tests_views.py +++ b/zds/mp/tests/tests_views.py @@ -264,7 +264,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('mp-new'), '')) def test_success_get_with_and_without_username(self): @@ -471,7 +471,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('private-posts-new', args=[1, 'private-topic']), '')) def test_fail_answer_not_send_topic_pk(self): @@ -640,7 +640,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('private-posts-edit', args=[1, 'private-topic', 1]), '')) def test_succes_get_edit_post_page(self): @@ -764,7 +764,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('mp-delete', args=[1, 'private-topic']), '')) def test_fail_leave_topic_no_exist(self): @@ -866,7 +866,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('mp-edit-participant', args=[1, 'private-topic']), '')) def test_fail_add_participant_topic_no_exist(self): @@ -994,7 +994,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('mp-edit-topic', args=[self.topic1.pk, 'private-topic']), '')) # post @@ -1005,7 +1005,7 @@ def test_denies_anonymous(self): self.assertRedirects( response, - reverse('zds.member.views.login_view') + + reverse('member-login') + '?next=' + urllib.quote(reverse('mp-edit-topic', args=[self.topic1.pk, 'private-topic']), '')) topic = PrivateTopic.objects.get(pk=self.topic1.pk) diff --git a/zds/mp/urls.py b/zds/mp/urls.py index 1604bc1c3b..e7106b37c6 100644 --- a/zds/mp/urls.py +++ b/zds/mp/urls.py @@ -1,30 +1,26 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.mp.views import PrivateTopicList, PrivatePostList, PrivateTopicNew, PrivateTopicAddParticipant, \ PrivateTopicLeaveDetail, PrivateTopicLeaveList, \ PrivatePostAnswer, PrivatePostEdit, PrivateTopicEdit -urlpatterns = patterns('', - # Topics. - url(r'^$', PrivateTopicList.as_view(), name='mp-list'), - url(r'^quitter/$', PrivateTopicLeaveList.as_view(), name='mp-list-delete'), - url(r'^creer/$', PrivateTopicNew.as_view(), name='mp-new'), +urlpatterns = [ + # Topics. + url(r'^$', PrivateTopicList.as_view(), name='mp-list'), + url(r'^quitter/$', PrivateTopicLeaveList.as_view(), name='mp-list-delete'), + url(r'^creer/$', PrivateTopicNew.as_view(), name='mp-new'), - url(r'^(?P\d+)/(?P.+)/quitter/$', PrivateTopicLeaveDetail.as_view(), - name='mp-delete'), - url(r'^(?P\d+)/(?P.+)/editer/topic/$', PrivateTopicEdit.as_view(), - name='mp-edit-topic'), - url(r'^(?P\d+)/(?P.+)/editer/participants/$', - PrivateTopicAddParticipant.as_view(), name='mp-edit-participant'), + url(r'^(?P\d+)/(?P.+)/quitter/$', PrivateTopicLeaveDetail.as_view(), name='mp-delete'), + url(r'^(?P\d+)/(?P.+)/editer/topic/$', PrivateTopicEdit.as_view(), name='mp-edit-topic'), + url(r'^(?P\d+)/(?P.+)/editer/participants/$', PrivateTopicAddParticipant.as_view(), + name='mp-edit-participant'), - # Posts. - url(r'^(?P\d+)/(?P.+)/messages/$', PrivatePostList.as_view(), - name='private-posts-list'), - url(r'^(?P\d+)/(?P.+)/messages/creer/$', PrivatePostAnswer.as_view(), - name='private-posts-new'), - url(r'^(?P\d+)/(?P.+)/messages/(?P\d+)/editer/$', - PrivatePostEdit.as_view(), name='private-posts-edit'), -) + # Posts. + url(r'^(?P\d+)/(?P.+)/messages/$', PrivatePostList.as_view(), name='private-posts-list'), + url(r'^(?P\d+)/(?P.+)/messages/creer/$', PrivatePostAnswer.as_view(), name='private-posts-new'), + url(r'^(?P\d+)/(?P.+)/messages/(?P\d+)/editer/$', + PrivatePostEdit.as_view(), name='private-posts-edit'), +] diff --git a/zds/munin/urls.py b/zds/munin/urls.py index 7626a42879..7a0ed48eb3 100644 --- a/zds/munin/urls.py +++ b/zds/munin/urls.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*-: -from django.conf.urls import patterns, url -from zds.munin import views +from django.conf.urls import url -urlpatterns = patterns( - '', +from zds.munin.views import total_topics, total_posts, total_mps, total_tutorials, total_articles - url(r'^total_topics/$', views.total_topics), - url(r'^total_posts/$', views.total_posts), - url(r'^total_mps/$', views.total_mps), - url(r'^total_tutorials/$', views.total_tutorials), - url(r'^total_articles/$', views.total_articles), -) + +urlpatterns = [ + url(r'^total_topics/$', total_topics), + url(r'^total_posts/$', total_posts), + url(r'^total_mps/$', total_mps), + url(r'^total_tutorials/$', total_tutorials), + url(r'^total_articles/$', total_articles), +] diff --git a/zds/pages/tests.py b/zds/pages/tests.py index 2af59654f4..c37226cd3c 100644 --- a/zds/pages/tests.py +++ b/zds/pages/tests.py @@ -23,7 +23,7 @@ def test_url_home(self): """Test: check that home page is alive.""" result = self.client.get( - reverse('zds.pages.views.home'), + reverse('homepage'), ) self.assertEqual(result.status_code, 200) @@ -32,7 +32,7 @@ def test_url_eula(self): """Test: check that eula page is alive.""" result = self.client.get( - reverse('zds.pages.views.eula'), + reverse('pages-eula'), ) self.assertEqual(result.status_code, 200) @@ -41,7 +41,7 @@ def test_url_about(self): """Test: check that about page is alive.""" result = self.client.get( - reverse('zds.pages.views.about'), + reverse('pages-about'), ) self.assertEqual(result.status_code, 200) @@ -50,7 +50,7 @@ def test_url_contact(self): """Test: check that contact page is alive.""" result = self.client.get( - reverse('zds.pages.views.contact'), + reverse('pages-contact'), ) self.assertEqual(result.status_code, 200) @@ -59,7 +59,7 @@ def test_url_association(self): """Test: check that association page is alive.""" result = self.client.get( - reverse('zds.pages.views.association'), + reverse('pages-association'), ) self.assertEqual(result.status_code, 200) @@ -72,7 +72,7 @@ def test_subscribe_association(self): long_str += u"A" result = self.client.post( - reverse('zds.pages.views.assoc_subscribe'), + reverse('pages-assoc-subscribe'), { 'full_name': 'Anne Onyme', 'email': 'anneonyme@test.com', @@ -91,7 +91,7 @@ def test_subscribe_association(self): self.assertEquals(len(mail.outbox), 0) result = self.client.post( - reverse('zds.pages.views.assoc_subscribe'), + reverse('pages-assoc-subscribe'), { 'full_name': 'Anne Onyme', 'email': 'anneonyme@test.com', @@ -113,7 +113,7 @@ def test_url_cookies(self): """Test: check that cookies page is alive.""" result = self.client.get( - reverse('zds.pages.views.cookies'), + reverse('pages-cookies'), ) self.assertEqual(result.status_code, 200) @@ -132,7 +132,7 @@ def test_url_home(self): """Test: check that home page is alive.""" result = self.client.get( - reverse('zds.pages.views.home'), + reverse('homepage'), ) self.assertEqual(result.status_code, 200) @@ -141,7 +141,7 @@ def test_url_eula(self): """Test: check that eula page is alive.""" result = self.client.get( - reverse('zds.pages.views.eula'), + reverse('pages-eula'), ) self.assertEqual(result.status_code, 200) @@ -150,7 +150,7 @@ def test_url_about(self): """Test: check that about page is alive.""" result = self.client.get( - reverse('zds.pages.views.about'), + reverse('pages-about'), ) self.assertEqual(result.status_code, 200) @@ -159,7 +159,7 @@ def test_url_contact(self): """Test: check that contact page is alive.""" result = self.client.get( - reverse('zds.pages.views.contact'), + reverse('pages-contact'), ) self.assertEqual(result.status_code, 200) @@ -168,7 +168,7 @@ def test_url_association(self): """Test: check that association page is alive.""" result = self.client.get( - reverse('zds.pages.views.association'), + reverse('pages-association'), ) self.assertEqual(result.status_code, 200) @@ -177,7 +177,7 @@ def test_url_cookies(self): """Test: check that cookies page is alive.""" result = self.client.get( - reverse('zds.pages.views.cookies'), + reverse('pages-cookies'), ) self.assertEqual(result.status_code, 200) @@ -189,7 +189,7 @@ def test_url_home(self): """Test: check that home page is alive.""" result = self.client.get( - reverse('zds.pages.views.home'), + reverse('homepage'), ) self.assertEqual(result.status_code, 200) @@ -198,7 +198,7 @@ def test_url_eula(self): """Test: check that eula page is alive.""" result = self.client.get( - reverse('zds.pages.views.eula'), + reverse('pages-eula'), ) self.assertEqual(result.status_code, 200) @@ -207,7 +207,7 @@ def test_url_about(self): """Test: check that about page is alive.""" result = self.client.get( - reverse('zds.pages.views.about'), + reverse('pages-about'), ) self.assertEqual(result.status_code, 200) @@ -216,7 +216,7 @@ def test_url_contact(self): """Test: check that contact page is alive.""" result = self.client.get( - reverse('zds.pages.views.contact'), + reverse('pages-contact'), ) self.assertEqual(result.status_code, 200) @@ -225,7 +225,7 @@ def test_url_association(self): """Test: check that association page is alive.""" result = self.client.get( - reverse('zds.pages.views.association'), + reverse('pages-association'), ) self.assertEqual(result.status_code, 200) @@ -234,7 +234,7 @@ def test_url_cookies(self): """Test: check that cookies page is alive.""" result = self.client.get( - reverse('zds.pages.views.cookies'), + reverse('pages-cookies'), ) self.assertEqual(result.status_code, 200) @@ -243,7 +243,7 @@ def test_render_template(self): """Test: render_template() works and git_version is in template.""" result = self.client.get( - reverse('zds.pages.views.home'), + reverse('homepage'), ) self.assertTrue('git_version' in result.context[-1]) diff --git a/zds/pages/urls.py b/zds/pages/urls.py index 2df4753064..e91f78ada8 100644 --- a/zds/pages/urls.py +++ b/zds/pages/urls.py @@ -1,17 +1,20 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url +from zds.pages.views import about, association, contact, eula, alerts, cookies, assoc_subscribe, index -urlpatterns = patterns('', - url(r'^apropos/$', 'zds.pages.views.about'), - url(r'^association/$', 'zds.pages.views.association'), - url(r'^contact/$', 'zds.pages.views.contact'), - url(r'^cgu/$', 'zds.pages.views.eula'), - url(r'^alertes/$', 'zds.pages.views.alerts'), - url(r'^cookies/$', 'zds.pages.views.cookies'), - url(r'^association/inscription/$', 'zds.pages.views.assoc_subscribe'), +urlpatterns = [ + # single pages + url(r'^apropos/$', about, name='pages-about'), + url(r'^association/$', association, name='pages-association'), + url(r'^contact/$', contact, name='pages-contact'), + url(r'^cgu/$', eula, name='pages-eula'), + url(r'^alertes/$', alerts, name='pages-alerts'), + url(r'^cookies/$', cookies, name='pages-cookies'), + url(r'^association/inscription/$', assoc_subscribe, name='pages-assoc-subscribe'), - url(r'^$', 'zds.pages.views.index'), - ) + # index + url(r'^$', index, name='pages-index'), +] diff --git a/zds/search/urls.py b/zds/search/urls.py index 9933343218..851fed4add 100644 --- a/zds/search/urls.py +++ b/zds/search/urls.py @@ -1,13 +1,11 @@ # coding: utf-8 -from django.conf.urls import patterns, url -from haystack.views import search_view_factory +from django.conf.urls import url -from zds.search.form import CustomSearchForm -from zds.search.views import CustomSearchView +from zds.search.views import CustomSearchView, opensearch -urlpatterns = patterns('haystack.views', url(r'^$', CustomSearchView.as_view(), name='haystack_search')) -urlpatterns += patterns('', - url(r'^opensearch\.xml$', 'zds.search.views.opensearch') - ) +urlpatterns = [ + url(r'^$', CustomSearchView.as_view(), name='haystack_search'), + url(r'^opensearch\.xml$', opensearch, name='search-opensearch'), +] diff --git a/zds/tutorialv2/tests/tests_views.py b/zds/tutorialv2/tests/tests_views.py index 65d4dc33c6..40f3ba3455 100644 --- a/zds/tutorialv2/tests/tests_views.py +++ b/zds/tutorialv2/tests/tests_views.py @@ -3505,7 +3505,7 @@ def test_gallery_not_deleted_if_linked_to_content(self): # try to delete gallery result = self.client.post( - reverse('zds.gallery.views.modify_gallery'), + reverse('gallery-modify'), { 'delete_multi': '', 'items': [gallery.pk] @@ -4744,7 +4744,7 @@ def test_last_reactions(self): password='hostel77'), True) - result = self.client.get(reverse('zds.pages.views.index')) # go to whatever page + result = self.client.get(reverse('pages-index')) # go to whatever page self.assertEqual(result.status_code, 200) self.assertEqual(ContentRead.objects.filter(user=self.user_guest).count(), 0) @@ -4785,7 +4785,7 @@ def test_last_reactions(self): password='hostel77'), True) - result = self.client.get(reverse('zds.pages.views.index')) # go to whatever page + result = self.client.get(reverse('pages-index')) # go to whatever page self.assertEqual(result.status_code, 200) self.assertEqual(ContentRead.objects.filter(user=self.user_author).count(), 0) @@ -4816,7 +4816,7 @@ def test_last_reactions(self): # test if not connected self.client.logout() - result = self.client.get(reverse('zds.pages.views.index')) # go to whatever page + result = self.client.get(reverse('pages-index')) # go to whatever page self.assertEqual(result.status_code, 200) tuto = PublishableContent.objects.get(pk=self.tuto.pk) @@ -4839,7 +4839,7 @@ def test_last_reactions(self): password='hostel77'), True) - result = self.client.get(reverse('zds.pages.views.index')) # go to whatever page + result = self.client.get(reverse('pages-index')) # go to whatever page self.assertEqual(result.status_code, 200) self.assertEqual(ContentRead.objects.filter(user=self.user_guest).count(), 1) # already read first reaction @@ -4862,7 +4862,7 @@ def test_last_reactions(self): self.client.logout() - result = self.client.get(reverse('zds.pages.views.index')) # go to whatever page + result = self.client.get(reverse('pages-index')) # go to whatever page self.assertEqual(result.status_code, 200) def test_note_with_bad_param(self): diff --git a/zds/tutorialv2/urls/__init__.py b/zds/tutorialv2/urls/__init__.py index 7c88400f06..45025d330a 100644 --- a/zds/tutorialv2/urls/__init__.py +++ b/zds/tutorialv2/urls/__init__.py @@ -1,9 +1,10 @@ # coding: utf-8 -from django.conf.urls import patterns, include, url +from django.conf.urls import include, url -urlpatterns = patterns('', - url(r'^contenus/', include('zds.tutorialv2.urls.urls_contents', namespace='content')), - url(r'^validations/', include('zds.tutorialv2.urls.urls_validations', namespace='validation')), - url(r'^tutoriels/', include('zds.tutorialv2.urls.urls_tutorials', namespace='tutorial')), - url(r'^articles/', include('zds.tutorialv2.urls.urls_articles', namespace='article'))) +urlpatterns = [ + url(r'^contenus/', include('zds.tutorialv2.urls.urls_contents', namespace='content')), + url(r'^validations/', include('zds.tutorialv2.urls.urls_validations', namespace='validation')), + url(r'^tutoriels/', include('zds.tutorialv2.urls.urls_tutorials', namespace='tutorial')), + url(r'^articles/', include('zds.tutorialv2.urls.urls_articles', namespace='article')), +] diff --git a/zds/tutorialv2/urls/urls_articles.py b/zds/tutorialv2/urls/urls_articles.py index 3988c2c6d9..920ff30fee 100644 --- a/zds/tutorialv2/urls/urls_articles.py +++ b/zds/tutorialv2/urls/urls_articles.py @@ -1,29 +1,29 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.tutorialv2.views.views_published import ListArticles, DisplayOnlineArticle, DownloadOnlineArticle from zds.tutorialv2.feeds import LastArticlesFeedRSS, LastArticlesFeedATOM -urlpatterns = patterns('', - # Flux - url(r'^flux/rss/$', LastArticlesFeedRSS(), name='feed-rss'), - url(r'^flux/atom/$', LastArticlesFeedATOM(), name='feed-atom'), +urlpatterns = [ + # Flux + url(r'^flux/rss/$', LastArticlesFeedRSS(), name='feed-rss'), + url(r'^flux/atom/$', LastArticlesFeedATOM(), name='feed-atom'), - # View - url(r'^(?P\d+)/(?P.+)/$', DisplayOnlineArticle.as_view(), name='view'), + # View + url(r'^(?P\d+)/(?P.+)/$', DisplayOnlineArticle.as_view(), name='view'), - # downloads: - url(r'^md/(?P\d+)/(?P.+)\.md$', - DownloadOnlineArticle.as_view(requested_file='md'), name='download-md'), - url(r'^html/(?P\d+)/(?P.+)\.html$', - DownloadOnlineArticle.as_view(requested_file='html'), name='download-html'), - url(r'^pdf/(?P\d+)/(?P.+)\.pdf$', - DownloadOnlineArticle.as_view(requested_file='pdf'), name='download-pdf'), - url(r'^epub/(?P\d+)/(?P.+)\.epub$', - DownloadOnlineArticle.as_view(requested_file='epub'), name='download-epub'), - url(r'^zip/(?P\d+)/(?P.+)\.zip$', - DownloadOnlineArticle.as_view(requested_file='zip'), name='download-zip'), + # Downloads + url(r'^md/(?P\d+)/(?P.+)\.md$', DownloadOnlineArticle.as_view(requested_file='md'), name='download-md'), + url(r'^html/(?P\d+)/(?P.+)\.html$', DownloadOnlineArticle.as_view(requested_file='html'), + name='download-html'), + url(r'^pdf/(?P\d+)/(?P.+)\.pdf$', DownloadOnlineArticle.as_view(requested_file='pdf'), + name='download-pdf'), + url(r'^epub/(?P\d+)/(?P.+)\.epub$', DownloadOnlineArticle.as_view(requested_file='epub'), + name='download-epub'), + url(r'^zip/(?P\d+)/(?P.+)\.zip$', DownloadOnlineArticle.as_view(requested_file='zip'), + name='download-zip'), - # Listing - url(r'^$', ListArticles.as_view(), name='list')) + # Listing + url(r'^$', ListArticles.as_view(), name='list') +] diff --git a/zds/tutorialv2/urls/urls_contents.py b/zds/tutorialv2/urls/urls_contents.py index 7585cd6cfe..7c04c0a0d9 100644 --- a/zds/tutorialv2/urls/urls_contents.py +++ b/zds/tutorialv2/urls/urls_contents.py @@ -1,6 +1,6 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.tutorialv2.views.views_contents import DisplayContent, CreateContent, EditContent, \ DeleteContent, CreateContainer, DisplayContainer, EditContainer, CreateExtract, EditExtract, \ @@ -11,130 +11,125 @@ from zds.tutorialv2.views.views_published import SendNoteFormView, UpvoteReaction, DownvoteReaction, UpdateNoteView, \ HideReaction, ShowReaction, SendNoteAlert, SolveNoteAlert -urlpatterns = patterns('', - url(r'^tutoriels/(?P\d+)/$', - ContentOfAuthor.as_view(type='TUTORIAL', context_object_name='tutorials'), - name="find-tutorial"), - url(r'^articles/(?P\d+)/$', - ContentOfAuthor.as_view(type='ARTICLE', context_object_name='articles'), - name="find-article"), - - url(r'^aides/$', ContentsWithHelps.as_view(), name='helps'), - url(r'^(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', - DisplayContainer.as_view(public_is_prioritary=False), - name='view-container'), - url(r'^(?P\d+)/(?P.+)/(?P.+)/$', - DisplayContainer.as_view(public_is_prioritary=False), - name='view-container'), - - url(r'^(?P\d+)/(?P.+)/$', DisplayContent.as_view(public_is_prioritary=False), - name='view'), - - url(r'^telecharger/(?P\d+)/(?P.+)/$', DownloadContent.as_view(), - name='download-zip'), - - # beta: - url(r'^beta/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', - DisplayBetaContainer.as_view(public_is_prioritary=False), - name='beta-view-container'), - url(r'^beta/(?P\d+)/(?P.+)/(?P.+)/$', - DisplayBetaContainer.as_view(public_is_prioritary=False), - name='beta-view-container'), - - url(r'^beta/(?P\d+)/(?P.+)/$', DisplayBetaContent.as_view(), name='beta-view'), - - # reactions: - # for all those views, we do not need to redirect to the newest PublishedContent - # because they just must depend on PublishableContent pk, not slug nor PublishedContent model - url(r'^reactions/ajouter/$', SendNoteFormView.as_view(redirection_is_needed=False), - name="add-reaction"), - url(r'^reactions/editer/$', UpdateNoteView.as_view(redirection_is_needed=False), - name="update-reaction"), - url(r'^reactions/upvote/$', UpvoteReaction.as_view(), name="up-vote"), - url(r'^reactions/downvote/$', DownvoteReaction.as_view(), name="down-vote"), - url(r'^reactions/cacher/(?P\d+)/$', HideReaction.as_view(), name="hide-reaction"), - url(r'^reactions/afficher/(?P\d+)/$', ShowReaction.as_view(), name="show-reaction"), - url(r'^reactions/alerter/(?P\d+)/$', SendNoteAlert.as_view(), name="alert-reaction"), - url(r'^reactions/resoudre/$', SolveNoteAlert.as_view(), name="resolve-reaction"), - - # typo: - url(r'^reactions/typo/$', WarnTypo.as_view(), name="warn-typo"), - - # create: - url(r'^nouveau-tutoriel/$', - CreateContent.as_view(created_content_type="TUTORIAL"), name='create-tutorial'), - url(r'^nouvel-article/$', - CreateContent.as_view(created_content_type="ARTICLE"), name='create-article'), - url(r'^nouveau-conteneur/(?P\d+)/(?P.+)/(?P.+)/$', - CreateContainer.as_view(), - name='create-container'), - url(r'^nouveau-conteneur/(?P\d+)/(?P.+)/$', - CreateContainer.as_view(), - name='create-container'), - - - url(r'^nouvelle-section/(?P\d+)/(?P.+)/(?P.+)/' - r'(?P.+)/$', - CreateExtract.as_view(), - name='create-extract'), - url(r'^nouvelle-section/(?P\d+)/(?P.+)/(?P.+)/$', - CreateExtract.as_view(), - name='create-extract'), - url(r'^nouvelle-section/(?P\d+)/(?P.+)/$', - CreateExtract.as_view(), - name='create-extract'), - - # edit: - url(r'^editer-conteneur/(?P\d+)/(?P.+)/(?P.+)/' - r'(?P.+)/$', - EditContainer.as_view(), - name='edit-container'), - url(r'^editer-conteneur/(?P\d+)/(?P.+)/(?P.+)/$', - EditContainer.as_view(), - name='edit-container'), - - url(r'^editer-section/(?P\d+)/(?P.+)/(?P.+)/' - r'(?P.+)/(?P.+)/$', - EditExtract.as_view(), - name='edit-extract'), - url(r'^editer-section/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', - EditExtract.as_view(), - name='edit-extract'), - url(r'^editer-section/(?P\d+)/(?P.+)/(?P.+)/$', - EditExtract.as_view(), - name='edit-extract'), - - url(r'^editer/(?P\d+)/(?P.+)/$', EditContent.as_view(), name='edit'), - url(r'^deplacer/$', MoveChild.as_view(), name='move-element'), - - url(r'^historique/(?P\d+)/(?P.+)/$', DisplayHistory.as_view(), name="history"), - url(r'^comparaison/(?P\d+)/(?P.+)/$', DisplayDiff.as_view(), name="diff"), - url(r'^ajouter-auteur/(?P\d+)/$', AddAuthorToContent.as_view(), name="add-author"), - url(r'^enlever-auteur/(?P\d+)/$', RemoveAuthorFromContent.as_view(), name="remove-author"), - # beta: - url(r'^activer-beta/(?P\d+)/(?P.+)/$', ManageBetaContent.as_view(action='set'), - name="set-beta"), - url(r'^desactiver-beta/(?P\d+)/(?P.+)/$', ManageBetaContent.as_view(action='inactive'), - name="inactive-beta"), - - # jsfiddle support: - url(r'activer-js/', ActivateJSFiddleInContent.as_view(), name="activate-jsfiddle"), - - # delete: - url(r'^supprimer/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/' - r'(?P.+)/$', - DeleteContainerOrExtract.as_view(), - name='delete'), - url(r'^supprimer/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', - DeleteContainerOrExtract.as_view(), - name='delete'), - url(r'^supprimer/(?P\d+)/(?P.+)/(?P.+)/$', - DeleteContainerOrExtract.as_view(), - name='delete'), - - url(r'^supprimer/(?P\d+)/(?P.+)/$', DeleteContent.as_view(), name='delete'), - - # markdown import - url(r'^importer/archive/nouveau/$', CreateContentFromArchive.as_view(), name="import-new"), - url(r'^importer/(?P\d+)/(?P.+)/$', UpdateContentWithArchive.as_view(), name="import") - ) +urlpatterns = [ + url(r'^tutoriels/(?P\d+)/$', + ContentOfAuthor.as_view(type='TUTORIAL', context_object_name='tutorials'), + name="find-tutorial"), + url(r'^articles/(?P\d+)/$', + ContentOfAuthor.as_view(type='ARTICLE', context_object_name='articles'), + name="find-article"), + + url(r'^aides/$', ContentsWithHelps.as_view(), name='helps'), + url(r'^(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', + DisplayContainer.as_view(public_is_prioritary=False), + name='view-container'), + url(r'^(?P\d+)/(?P.+)/(?P.+)/$', + DisplayContainer.as_view(public_is_prioritary=False), + name='view-container'), + + url(r'^(?P\d+)/(?P.+)/$', DisplayContent.as_view(public_is_prioritary=False), + name='view'), + + url(r'^telecharger/(?P\d+)/(?P.+)/$', DownloadContent.as_view(), + name='download-zip'), + + # beta: + url(r'^beta/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', + DisplayBetaContainer.as_view(public_is_prioritary=False), + name='beta-view-container'), + url(r'^beta/(?P\d+)/(?P.+)/(?P.+)/$', + DisplayBetaContainer.as_view(public_is_prioritary=False), + name='beta-view-container'), + + url(r'^beta/(?P\d+)/(?P.+)/$', DisplayBetaContent.as_view(), name='beta-view'), + + # reactions: + url(r'^reactions/ajouter/$', SendNoteFormView.as_view(redirection_is_needed=False), name="add-reaction"), + url(r'^reactions/editer/$', UpdateNoteView.as_view(redirection_is_needed=False), name="update-reaction"), + url(r'^reactions/upvote/$', UpvoteReaction.as_view(), name="up-vote"), + url(r'^reactions/downvote/$', DownvoteReaction.as_view(), name="down-vote"), + url(r'^reactions/cacher/(?P\d+)/$', HideReaction.as_view(), name="hide-reaction"), + url(r'^reactions/afficher/(?P\d+)/$', ShowReaction.as_view(), name="show-reaction"), + url(r'^reactions/alerter/(?P\d+)/$', SendNoteAlert.as_view(), name="alert-reaction"), + url(r'^reactions/resoudre/$', SolveNoteAlert.as_view(), name="resolve-reaction"), + + # typo: + url(r'^reactions/typo/$', WarnTypo.as_view(), name="warn-typo"), + + # create: + url(r'^nouveau-tutoriel/$', + CreateContent.as_view(created_content_type="TUTORIAL"), name='create-tutorial'), + url(r'^nouvel-article/$', + CreateContent.as_view(created_content_type="ARTICLE"), name='create-article'), + url(r'^nouveau-conteneur/(?P\d+)/(?P.+)/(?P.+)/$', + CreateContainer.as_view(), + name='create-container'), + url(r'^nouveau-conteneur/(?P\d+)/(?P.+)/$', + CreateContainer.as_view(), + name='create-container'), + + + url(r'^nouvelle-section/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', + CreateExtract.as_view(), + name='create-extract'), + url(r'^nouvelle-section/(?P\d+)/(?P.+)/(?P.+)/$', + CreateExtract.as_view(), + name='create-extract'), + url(r'^nouvelle-section/(?P\d+)/(?P.+)/$', + CreateExtract.as_view(), + name='create-extract'), + + # edit: + url(r'^editer-conteneur/(?P\d+)/(?P.+)/(?P.+)/' + r'(?P.+)/$', + EditContainer.as_view(), + name='edit-container'), + url(r'^editer-conteneur/(?P\d+)/(?P.+)/(?P.+)/$', + EditContainer.as_view(), + name='edit-container'), + + url(r'^editer-section/(?P\d+)/(?P.+)/(?P.+)/' + r'(?P.+)/(?P.+)/$', + EditExtract.as_view(), + name='edit-extract'), + url(r'^editer-section/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', + EditExtract.as_view(), + name='edit-extract'), + url(r'^editer-section/(?P\d+)/(?P.+)/(?P.+)/$', + EditExtract.as_view(), + name='edit-extract'), + + url(r'^editer/(?P\d+)/(?P.+)/$', EditContent.as_view(), name='edit'), + url(r'^deplacer/$', MoveChild.as_view(), name='move-element'), + + url(r'^historique/(?P\d+)/(?P.+)/$', DisplayHistory.as_view(), name="history"), + url(r'^comparaison/(?P\d+)/(?P.+)/$', DisplayDiff.as_view(), name="diff"), + url(r'^ajouter-auteur/(?P\d+)/$', AddAuthorToContent.as_view(), name="add-author"), + url(r'^enlever-auteur/(?P\d+)/$', RemoveAuthorFromContent.as_view(), name="remove-author"), + # beta: + url(r'^activer-beta/(?P\d+)/(?P.+)/$', ManageBetaContent.as_view(action='set'), + name="set-beta"), + url(r'^desactiver-beta/(?P\d+)/(?P.+)/$', ManageBetaContent.as_view(action='inactive'), + name="inactive-beta"), + + # jsfiddle support: + url(r'activer-js/', ActivateJSFiddleInContent.as_view(), name="activate-jsfiddle"), + + # delete: + url(r'^supprimer/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/' + r'(?P.+)/$', + DeleteContainerOrExtract.as_view(), + name='delete'), + url(r'^supprimer/(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', + DeleteContainerOrExtract.as_view(), + name='delete'), + url(r'^supprimer/(?P\d+)/(?P.+)/(?P.+)/$', + DeleteContainerOrExtract.as_view(), + name='delete'), + + url(r'^supprimer/(?P\d+)/(?P.+)/$', DeleteContent.as_view(), name='delete'), + + # markdown import + url(r'^importer/archive/nouveau/$', CreateContentFromArchive.as_view(), name="import-new"), + url(r'^importer/(?P\d+)/(?P.+)/$', UpdateContentWithArchive.as_view(), name="import") +] diff --git a/zds/tutorialv2/urls/urls_tutorials.py b/zds/tutorialv2/urls/urls_tutorials.py index a0ab5c6dc9..a4ab5395a8 100644 --- a/zds/tutorialv2/urls/urls_tutorials.py +++ b/zds/tutorialv2/urls/urls_tutorials.py @@ -1,44 +1,44 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.tutorialv2.views.views_contents import RedirectOldBetaTuto from zds.tutorialv2.views.views_published import ListTutorials, DisplayOnlineTutorial, DisplayOnlineContainer, \ DownloadOnlineTutorial, RedirectContentSEO from zds.tutorialv2.feeds import LastTutorialsFeedRSS, LastTutorialsFeedATOM -urlpatterns = patterns('', - # flux - url(r'^flux/rss/$', LastTutorialsFeedRSS(), name='feed-rss'), - url(r'^flux/atom/$', LastTutorialsFeedATOM(), name='feed-atom'), - - # view - url(r'^(?P\d+)/(?P.+)/(?P\d+)/' - r'(?P.+)/(?P\d+)/(?P.+)/$', - RedirectContentSEO.as_view(), name="redirect_old_tuto"), - url(r'^(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', - DisplayOnlineContainer.as_view(), - name='view-container'), - url(r'^(?P\d+)/(?P.+)/(?P.+)/$', - DisplayOnlineContainer.as_view(), - name='view-container'), - - url(r'^(?P\d+)/(?P.+)/$', DisplayOnlineTutorial.as_view(), name='view'), - - # downloads: - url(r'^md/(?P\d+)/(?P.+)\.md$', - DownloadOnlineTutorial.as_view(requested_file='md'), name='download-md'), - url(r'^html/(?P\d+)/(?P.+)\.html$', - DownloadOnlineTutorial.as_view(requested_file='html'), name='download-html'), - url(r'^pdf/(?P\d+)/(?P.+)\.pdf$', - DownloadOnlineTutorial.as_view(requested_file='pdf'), name='download-pdf'), - url(r'^epub/(?P\d+)/(?P.+)\.epub$', - DownloadOnlineTutorial.as_view(requested_file='epub'), name='download-epub'), - url(r'^zip/(?P\d+)/(?P.+)\.zip$', - DownloadOnlineTutorial.as_view(requested_file='zip'), name='download-zip'), - - # Old beta url compatibility - url('^beta/(?P\d+)/(?P.+)', RedirectOldBetaTuto.as_view(), name="old-beta-url"), - - # Listing - url(r'^$', ListTutorials.as_view(), name='list')) +urlpatterns = [ + # flux + url(r'^flux/rss/$', LastTutorialsFeedRSS(), name='feed-rss'), + url(r'^flux/atom/$', LastTutorialsFeedATOM(), name='feed-atom'), + + # view + url(r'^(?P\d+)/(?P.+)/(?P\d+)/(?P.+)/(?P\d+)/(?P.+)/$', + RedirectContentSEO.as_view(), name="redirect_old_tuto"), + url(r'^(?P\d+)/(?P.+)/(?P.+)/(?P.+)/$', + DisplayOnlineContainer.as_view(), + name='view-container'), + url(r'^(?P\d+)/(?P.+)/(?P.+)/$', + DisplayOnlineContainer.as_view(), + name='view-container'), + + url(r'^(?P\d+)/(?P.+)/$', DisplayOnlineTutorial.as_view(), name='view'), + + # downloads: + url(r'^md/(?P\d+)/(?P.+)\.md$', + DownloadOnlineTutorial.as_view(requested_file='md'), name='download-md'), + url(r'^html/(?P\d+)/(?P.+)\.html$', + DownloadOnlineTutorial.as_view(requested_file='html'), name='download-html'), + url(r'^pdf/(?P\d+)/(?P.+)\.pdf$', + DownloadOnlineTutorial.as_view(requested_file='pdf'), name='download-pdf'), + url(r'^epub/(?P\d+)/(?P.+)\.epub$', + DownloadOnlineTutorial.as_view(requested_file='epub'), name='download-epub'), + url(r'^zip/(?P\d+)/(?P.+)\.zip$', + DownloadOnlineTutorial.as_view(requested_file='zip'), name='download-zip'), + + # Old beta url compatibility + url('^beta/(?P\d+)/(?P.+)', RedirectOldBetaTuto.as_view(), name="old-beta-url"), + + # Listing + url(r'^$', ListTutorials.as_view(), name='list') +] diff --git a/zds/tutorialv2/urls/urls_validations.py b/zds/tutorialv2/urls/urls_validations.py index 0796d20e34..e51dc6dfa2 100644 --- a/zds/tutorialv2/urls/urls_validations.py +++ b/zds/tutorialv2/urls/urls_validations.py @@ -1,27 +1,21 @@ # coding: utf-8 -from django.conf.urls import patterns, url +from django.conf.urls import url from zds.tutorialv2.views.views_validations import AskValidationForContent, ReserveValidation, \ HistoryOfValidationDisplay, AcceptValidation, RejectValidation, RevokeValidation, CancelValidation, \ ValidationListView -urlpatterns = patterns('', - url(r'^proposer/(?P\d+)/(?P.+)/$', AskValidationForContent.as_view(), - name="ask"), - url(r'^historique/(?P\d+)/(?P.+)/$', HistoryOfValidationDisplay.as_view(), - name="history"), +urlpatterns = [ + url(r'^proposer/(?P\d+)/(?P.+)/$', AskValidationForContent.as_view(), name="ask"), + url(r'^historique/(?P\d+)/(?P.+)/$', HistoryOfValidationDisplay.as_view(), name="history"), - url(r'^annuler/(?P\d+)/$', CancelValidation.as_view(), - name="cancel"), - url(r'^reserver/(?P\d+)/$', ReserveValidation.as_view(), - name="reserve"), - url(r'^refuser/(?P\d+)/$', RejectValidation.as_view(), - name="reject"), - url(r'^accepter/(?P\d+)/$', AcceptValidation.as_view(), - name="accept"), + url(r'^annuler/(?P\d+)/$', CancelValidation.as_view(), name="cancel"), + url(r'^reserver/(?P\d+)/$', ReserveValidation.as_view(), name="reserve"), + url(r'^refuser/(?P\d+)/$', RejectValidation.as_view(), name="reject"), + url(r'^accepter/(?P\d+)/$', AcceptValidation.as_view(), name="accept"), - url(r'^depublier/(?P\d+)/(?P.+)/$', RevokeValidation.as_view(), - name="revoke"), + url(r'^depublier/(?P\d+)/(?P.+)/$', RevokeValidation.as_view(), name="revoke"), - url(r'^$', ValidationListView.as_view(), name="list")) + url(r'^$', ValidationListView.as_view(), name="list") +] diff --git a/zds/urls.py b/zds/urls.py index 97f37e16cc..8f076cea71 100644 --- a/zds/urls.py +++ b/zds/urls.py @@ -1,10 +1,12 @@ # encoding: utf-8 -from django.conf.urls import patterns, include, url +from django.conf.urls import include, url from django.conf.urls.static import static from django.contrib import admin from django.contrib.sitemaps import GenericSitemap, Sitemap +from django.contrib.sitemaps.views import index as index_view, sitemap as sitemap_view +from zds.pages.views import home as home_view from zds.tutorialv2.models.models_database import PublishedContent from zds.forum.models import Category, Forum, Topic, Tag @@ -69,52 +71,47 @@ def location(self, article): admin.autodiscover() -urlpatterns = patterns('', - url(r'^', include('zds.tutorialv2.urls')), - url(r'^forums/', include('zds.forum.urls')), - url(r'^mp/', include('zds.mp.urls')), - url(r'^membres/', include('zds.member.urls')), - url(r'^admin/', include(admin.site.urls)), - url(r'^pages/', include('zds.pages.urls')), - url(r'^galerie/', include('zds.gallery.urls')), - url(r'^rechercher/', include('zds.search.urls')), - url(r'^munin/', include('zds.munin.urls')), - url(r'^mise-en-avant/', include('zds.featured.urls')), - url('', include('social.apps.django_app.urls', namespace='social')), - url('', include('django.contrib.auth.urls', namespace='auth')), - ('^munin/', include('munin.urls')), +urlpatterns = [ + url(r'^', include('zds.tutorialv2.urls')), + url(r'^forums/', include('zds.forum.urls')), + url(r'^mp/', include('zds.mp.urls')), + url(r'^membres/', include('zds.member.urls')), + url(r'^admin/', include(admin.site.urls)), + url(r'^pages/', include('zds.pages.urls')), + url(r'^galerie/', include('zds.gallery.urls')), + url(r'^rechercher/', include('zds.search.urls')), + url(r'^munin/', include('zds.munin.urls')), + url(r'^mise-en-avant/', include('zds.featured.urls')), + url('', include('social.apps.django_app.urls', namespace='social')), + url('', include('django.contrib.auth.urls', namespace='auth')), - url(r'^$', 'zds.pages.views.home'), + url(r'^munin/', include('munin.urls')), - ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + url(r'^$', home_view, name='homepage'), + +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # API -urlpatterns += patterns('', - url(r'^api/', include('rest_framework_swagger.urls')), - url(r'^oauth2/', include('oauth2_provider.urls', namespace='oauth2_provider')), - url(r'^api/membres/', include('zds.member.api.urls')), - url(r'^api/mps/', include('zds.mp.api.urls')), - ) +urlpatterns += \ + [ + url(r'^api/', include('rest_framework_swagger.urls')), + url(r'^oauth2/', include('oauth2_provider.urls', namespace='oauth2_provider')), + url(r'^api/membres/', include('zds.member.api.urls')), + url(r'^api/mps/', include('zds.mp.api.urls')), + ] # SiteMap URLs -urlpatterns += patterns('django.contrib.sitemaps.views', - (r'^sitemap\.xml$', - 'index', - {'sitemaps': sitemaps}), - (r'^sitemap-(?P
    .+)\.xml$', - 'sitemap', - {'sitemaps': sitemaps}), - ) +urlpatterns += [ + url(r'^sitemap\.xml$', index_view, {'sitemaps': sitemaps}), + url(r'^sitemap-(?P
    .+)\.xml$', sitemap_view, {'sitemaps': sitemaps}), +] if settings.SERVE: - urlpatterns += patterns('', - (r'^static/(?P.*)$', - 'django.views.static.serve', - {'document_root': settings.STATIC_ROOT}), - (r'^media/(?P.*)$', - 'django.views.static.serve', - {'document_root': settings.MEDIA_ROOT}), - ) + from django.views.static import serve + urlpatterns += [ + url(r'^static/(?P.*)$', serve, {'document_root': settings.STATIC_ROOT}), + url(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT}), + ] # custom view for 500 errors handler500 = "zds.pages.views.custom_error_500" diff --git a/zds/utils/models.py b/zds/utils/models.py index 0ccbb18450..972dbd7719 100644 --- a/zds/utils/models.py +++ b/zds/utils/models.py @@ -69,12 +69,12 @@ def __unicode__(self): return self.title def get_absolute_url_tutorial(self): - url = reverse('zds.tutorial.views.index') + url = reverse('tutorial-index') url = url + '?tag={}'.format(self.slug) return url def get_absolute_url_article(self): - url = reverse('zds.article.views.index') + url = reverse('article-index') url = url + '?tag={}'.format(self.slug) return url diff --git a/zds/utils/templatetags/tests/tests_interventions.py b/zds/utils/templatetags/tests/tests_interventions.py index e779e7e31e..52f89fee33 100644 --- a/zds/utils/templatetags/tests/tests_interventions.py +++ b/zds/utils/templatetags/tests/tests_interventions.py @@ -51,7 +51,7 @@ def test_interventions_privatetopics(self): password='hostel77' ) ) - response = self.client.post(reverse('zds.pages.views.home')) + response = self.client.post(reverse('homepage')) self.assertEqual(200, response.status_code) self.assertContains(response, '1', html=True) @@ -63,7 +63,7 @@ def test_interventions_privatetopics(self): password='hostel77' ) ) - response = self.client.post(reverse('zds.pages.views.home')) + response = self.client.post(reverse('homepage')) self.assertEqual(200, response.status_code) self.assertContains(response, '1', html=True) @@ -81,7 +81,7 @@ def test_interventions_privatetopics_author_leave(self): password='hostel77' ) ) - response = self.client.post(reverse('zds.pages.views.home')) + response = self.client.post(reverse('homepage')) self.assertEqual(200, response.status_code) self.assertContains(response, '1', html=True) From b726b9b153d7c6e170a8e86d3ddf164978fad365 Mon Sep 17 00:00:00 2001 From: Augustin Laville Date: Mon, 7 Dec 2015 16:17:44 +0100 Subject: [PATCH 26/52] refactor(1.8): Changement de l'import csrf. https://docs.djangoproject.com/fr/1.8/ref/templates/api/#django.template.RequestContext --- zds/member/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zds/member/views.py b/zds/member/views.py index 88caa86d7d..4ab68593cf 100644 --- a/zds/member/views.py +++ b/zds/member/views.py @@ -8,7 +8,7 @@ from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User, Group -from django.core.context_processors import csrf +from django.template.context_processors import csrf from django.core.exceptions import PermissionDenied from django.core.mail import EmailMultiAlternatives from django.core.urlresolvers import reverse From 08e930dd835704425e225527f48ac0faa162da13 Mon Sep 17 00:00:00 2001 From: Augustin Laville Date: Tue, 8 Dec 2015 10:18:15 +0100 Subject: [PATCH 27/52] Correction d'un import --- zds/utils/templatetags/model_name.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zds/utils/templatetags/model_name.py b/zds/utils/templatetags/model_name.py index 32fe952947..b478310776 100644 --- a/zds/utils/templatetags/model_name.py +++ b/zds/utils/templatetags/model_name.py @@ -1,6 +1,6 @@ from django import template -from zds.search import MODEL_NAMES +from zds.search.constant import MODEL_NAMES register = template.Library() From d390a6241703bb3080a02745b4e9820ce0cf7747 Mon Sep 17 00:00:00 2001 From: Augustin Laville Date: Mon, 7 Dec 2015 19:31:29 +0100 Subject: [PATCH 28/52] refactor(settings): Change la gestion des templates. --- zds/settings.py | 51 +++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/zds/settings.py b/zds/settings.py index d373b08d54..bfb6fe3ca0 100644 --- a/zds/settings.py +++ b/zds/settings.py @@ -18,7 +18,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(__file__)) DEBUG = True -TEMPLATE_DEBUG = DEBUG + # INTERNAL_IPS = ('127.0.0.1',) # debug toolbar DATABASES = { @@ -122,30 +122,35 @@ # Python dotted path to the WSGI application used by Django's runserver. WSGI_APPLICATION = 'zds.wsgi.application' -TEMPLATE_DIRS = [ - # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. - os.path.join(BASE_DIR, 'templates') +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + ], + 'OPTIONS': { + 'context_processors': [ + # Default context processors + 'django.contrib.auth.context_processors.auth', + 'django.template.context_processors.debug', + 'django.template.context_processors.i18n', + 'django.template.context_processors.media', + 'django.template.context_processors.static', + 'django.template.context_processors.request', + 'django.template.context_processors.tz', + 'django.contrib.messages.context_processors.messages', + 'social.apps.django_app.context_processors.backends', + 'social.apps.django_app.context_processors.login_redirect', + # ZDS context processors + 'zds.utils.context_processor.app_settings', + 'zds.utils.context_processor.git_version', + ], + 'debug': DEBUG, + } + }, ] -TEMPLATE_CONTEXT_PROCESSORS = ( - # Default context processors - 'django.contrib.auth.context_processors.auth', - 'django.core.context_processors.debug', - 'django.core.context_processors.i18n', - 'django.core.context_processors.media', - 'django.core.context_processors.static', - 'django.core.context_processors.request', - 'django.core.context_processors.tz', - 'django.contrib.messages.context_processors.messages', - 'social.apps.django_app.context_processors.backends', - 'social.apps.django_app.context_processors.login_redirect', - # ZDS context processors - 'zds.utils.context_processor.app_settings', - 'zds.utils.context_processor.git_version', -) - CRISPY_TEMPLATE_PACK = 'bootstrap' INSTALLED_APPS = ( From 9a0e6af864445b679602b55b81c798f84301755b Mon Sep 17 00:00:00 2001 From: artragis Date: Fri, 11 Dec 2015 13:29:52 +0100 Subject: [PATCH 29/52] corrige les erreurs de tutorialv2 et munin --- .../tutorialv2/includes/reaction_message.part.html | 4 ++-- zds/munin/urls.py | 10 +++++----- zds/tutorialv2/models/models_database.py | 2 +- zds/tutorialv2/views/views_contents.py | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/templates/tutorialv2/includes/reaction_message.part.html b/templates/tutorialv2/includes/reaction_message.part.html index e66b25903c..ee902b59d1 100644 --- a/templates/tutorialv2/includes/reaction_message.part.html +++ b/templates/tutorialv2/includes/reaction_message.part.html @@ -181,7 +181,7 @@
    {% endif %} - {% if message.is_visible = False %} + {% if not message.is_visible %}

    {% trans "Masqué par" %} {{ message.editor }} {% if message.text_hidden %} @@ -244,7 +244,7 @@

    {% if user.is_authenticated and helpful_link and not is_author %} {% if message.author != user or perms_change %} - {% if topic.author = user or perms_change %} + {% if topic.author == user or perms_change %} {% csrf_token %}
    - {% if galleries|length = 0 %} + {% if galleries|length == 0 %}

    {% trans "Vous n'avez pas encore de galerie" %}.
    {% trans "Créer une galerie" %}. diff --git a/templates/misc/message.part.html b/templates/misc/message.part.html index 901f27cde8..5dcc8cc54a 100644 --- a/templates/misc/message.part.html +++ b/templates/misc/message.part.html @@ -5,7 +5,7 @@ {% load i18n %} -{% if topic.author = message.author and helpful_link %} +{% if topic.author == message.author and helpful_link %} {% set True as is_author %} {% else %} {% set False as is_author %} @@ -50,7 +50,7 @@

  • {% endif %} - {% if message.author = user or perms_change %} + {% if message.author == user or perms_change %} {% if can_hide != False %}
  • @@ -77,7 +77,7 @@ {% endif %} {% endif %} - {% if message.author = user or perms_change %} + {% if message.author == user or perms_change %} {% if can_edit != False %}
  • @@ -181,7 +181,7 @@ {% endif %} - {% if message.is_visible = False %} + {% if message.is_visible == False %}

    {% trans "Masqué par" %} {{ message.editor }} {% if message.text_hidden %} @@ -244,7 +244,7 @@

    {% if user.is_authenticated and helpful_link and not is_author %} {% if message.author != user or perms_change %} - {% if topic.author = user or perms_change %} + {% if topic.author == user or perms_change %} {% csrf_token %}