From b0746238aeebd667605f3129a1f3609ddfc98c29 Mon Sep 17 00:00:00 2001
From: DylannCordel <d.cordel@webu.coop>
Date: Wed, 22 Mar 2017 15:31:01 +0100
Subject: [PATCH] webu/djangobootstrap#118

Better admin
---
 newsbox/admin.py                              |  73 ++--
 newsbox/locale/fr/LC_MESSAGES/django.mo       | Bin 4149 -> 8670 bytes
 newsbox/locale/fr/LC_MESSAGES/django.po       | 323 +++++++++++++-----
 newsbox/models.py                             |  92 ++++-
 newsbox_cms/admin.py                          |   3 +-
 newsbox_cms/locale/fr/LC_MESSAGES/django.po   |   8 +-
 newsbox_i18n/locale/fr/LC_MESSAGES/django.po  |   2 +-
 tests/myapp/README.md                         |  22 +-
 tests/myapp/migrations/0001_initial.py        |  19 +-
 .../templates/myapp/inc/news_list_item.html   |   1 +
 .../myapp/inc/newscomplete_list_item.html     |   1 +
 .../myapp/inc/newsexpired_list_item.html      |   1 +
 .../myapp/inc/newsextended_list_item.html     |   1 +
 .../myapp/inc/newsseo_list_item.html          |   1 +
 tests/myapp/tests.py                          |   5 +-
 tests/myapp_all/migrations/0001_initial.py    |  12 +-
 .../myapp_all/inc/news_list_item.html         |   1 +
 .../myapp_all/inc/newscomplete_list_item.html |   1 +
 .../myapp_all/inc/newsexpired_list_item.html  |   1 +
 .../myapp_all/inc/newsextended_list_item.html |   1 +
 .../myapp_all/inc/newsseo_list_item.html      |   1 +
 tests/myapp_cms/migrations/0001_initial.py    |  12 +-
 .../myapp_cms/inc/news_list_item.html         |   1 +
 .../myapp_cms/inc/newscomplete_list_item.html |   1 +
 .../myapp_cms/inc/newsexpired_list_item.html  |   1 +
 .../myapp_cms/inc/newsextended_list_item.html |   1 +
 .../myapp_cms/inc/newsseo_list_item.html      |   1 +
 tests/myapp_i18n/migrations/0001_initial.py   |  12 +-
 .../myapp_i18n/inc/news_list_item.html        |   1 +
 .../inc/newscomplete_list_item.html           |   1 +
 .../myapp_i18n/inc/newsexpired_list_item.html |   1 +
 .../inc/newsextended_list_item.html           |   1 +
 .../myapp_i18n/inc/newsseo_list_item.html     |   1 +
 tests/utils.py                                |   8 +-
 34 files changed, 426 insertions(+), 185 deletions(-)
 create mode 100644 tests/myapp/templates/myapp/inc/news_list_item.html
 create mode 100644 tests/myapp/templates/myapp/inc/newscomplete_list_item.html
 create mode 100644 tests/myapp/templates/myapp/inc/newsexpired_list_item.html
 create mode 100644 tests/myapp/templates/myapp/inc/newsextended_list_item.html
 create mode 100644 tests/myapp/templates/myapp/inc/newsseo_list_item.html
 create mode 100644 tests/myapp_all/templates/myapp_all/inc/news_list_item.html
 create mode 100644 tests/myapp_all/templates/myapp_all/inc/newscomplete_list_item.html
 create mode 100644 tests/myapp_all/templates/myapp_all/inc/newsexpired_list_item.html
 create mode 100644 tests/myapp_all/templates/myapp_all/inc/newsextended_list_item.html
 create mode 100644 tests/myapp_all/templates/myapp_all/inc/newsseo_list_item.html
 create mode 100644 tests/myapp_cms/templates/myapp_cms/inc/news_list_item.html
 create mode 100644 tests/myapp_cms/templates/myapp_cms/inc/newscomplete_list_item.html
 create mode 100644 tests/myapp_cms/templates/myapp_cms/inc/newsexpired_list_item.html
 create mode 100644 tests/myapp_cms/templates/myapp_cms/inc/newsextended_list_item.html
 create mode 100644 tests/myapp_cms/templates/myapp_cms/inc/newsseo_list_item.html
 create mode 100644 tests/myapp_i18n/templates/myapp_i18n/inc/news_list_item.html
 create mode 100644 tests/myapp_i18n/templates/myapp_i18n/inc/newscomplete_list_item.html
 create mode 100644 tests/myapp_i18n/templates/myapp_i18n/inc/newsexpired_list_item.html
 create mode 100644 tests/myapp_i18n/templates/myapp_i18n/inc/newsextended_list_item.html
 create mode 100644 tests/myapp_i18n/templates/myapp_i18n/inc/newsseo_list_item.html

diff --git a/newsbox/admin.py b/newsbox/admin.py
index a07d274..9449fad 100644
--- a/newsbox/admin.py
+++ b/newsbox/admin.py
@@ -107,12 +107,12 @@ def add_fields_to_fieldset(
 
 class NewsboxBaseAdmin(admin.ModelAdmin):
 
-    list_filter = ('newsbox_publication_start_date', 'newsbox_published', )
+    list_filter = ('newsbox_publication_start_date', 'newsbox_status', )
     list_display = ['get_newsbox_title', 'newsbox_date_short', 'changestatus_link']
     list_display_links = ('get_newsbox_title',)
     fieldsets = [
         (None, {
-            'fields': ['newsbox_title', 'newsbox_slug', 'newsbox_date', 'newsbox_published', ], }),
+            'fields': ['newsbox_title', 'newsbox_slug', 'newsbox_date', 'newsbox_status', ], }),
         (_('Content'), {
             'fields': ['newsbox_summary', 'newsbox_body'], }), ]
     actions = ['publish', 'unpublish']
@@ -124,7 +124,7 @@ class NewsboxBaseAdmin(admin.ModelAdmin):
         return pfields
 
     def changestatus_link(self, obj):
-        if obj.newsbox_published:
+        if obj.newsbox_status == obj.STATUS_PUBLISHED:
             title = _('Unpublish this %s') % six.text_type(
                 obj._meta.verbose_name)
             icon_url = static('admin/img/icon-yes.gif')
@@ -136,10 +136,10 @@ class NewsboxBaseAdmin(admin.ModelAdmin):
                                             self.model._meta.app_label)
         return '<a href="%s" title="%s"><img src="%s" alt="%s" /></a>' % (
             reverse('admin:%s' % url_name, args=[obj.pk, ]),
-            title, icon_url, obj.newsbox_published)
+            title, icon_url, obj.get_newsbox_status_display())
 
     changestatus_link.allow_tags = True
-    changestatus_link.admin_order_field = 'newsbox_published'
+    changestatus_link.admin_order_field = 'newsbox_status'
     changestatus_link.short_description = _('published')
 
     def newsbox_date_short(self, obj):
@@ -188,30 +188,22 @@ class NewsboxBaseAdmin(admin.ModelAdmin):
                 _('You do not have permission to publish this %s')
                 % (six.text_type(self.model._meta.verbose_name),))
 
-        obj.newsbox_published = not obj.newsbox_published
+        old_status = obj.newsbox_status
+        if obj.newsbox_status == obj.STATUS_PUBLISHED:
+            obj.newsbox_status = obj.STATUS_ARCHIVED
+        else:
+            obj.newsbox_status = obj.STATUS_PUBLISHED
         obj.save()
-        if obj.newsbox_published:
-            log_msg = 'publication status set ON'
-            messages.info(
-                request,
-                _(
-                    'The %(objtype)s "%(objtitle)s" has been '
-                    'successfully published'
-                ) % {
-                    'objtype': six.text_type(self.model._meta.verbose_name),
-                    'objtitle': six.text_type(obj)}
-            )
+        log_msg = _('publication status changed from %(old)s to %(new)s') % {
+            'old': old_status,
+            'new_status': obj.newsbox_status,
+        }
+        if obj.newsbox_status == obj.STATUS_PUBLISHED:
+            msg = _('The %(objtype)s "%(objtitle)s" has been successfully published')
         else:
-            log_msg = _('publication status set OFF')
-            messages.info(
-                request,
-                _(
-                    'The %(objtype)s "%(objtitle)s" has been '
-                    'successfully unpublished'
-                ) % {
-                    'objtype': six.text_type(self.model._meta.verbose_name),
-                    'objtitle': obj}
-            )
+            msg = _('The %(objtype)s "%(objtitle)s" has been successfully unpublished')
+        messages.info(request, msg % {'objtype': six.text_type(self.model._meta.verbose_name),
+                                      'objtitle': six.text_type(obj)})
         LogEntry.objects.log_action(
             user_id=request.user.id,
             content_type_id=ContentType.objects.get_for_model(self.model).pk,
@@ -275,11 +267,10 @@ class NewsboxBaseAdmin(admin.ModelAdmin):
                 'objtitle': last_obj_ok, })
         else:
             messages.success(request, ungettext_lazy(
-                '%(nb)d %(objtype_sing)s has been published',
-                '%(nb)d %(objtype_plural)s have been published',
+                '%(nb)d %(objtype)s has been published',
+                '%(nb)d %(objtype)s have been published',
                 ok) % {'nb': ok,
-                       'objtype_sing': self.model._meta.verbose_name,
-                       'objtype_plural': self.model._meta.verbose_name_plural})
+                       'objtype': self.model._meta.verbose_name_plural,})
     publish.short_description = _('Publish selected %(verbose_name_plural)s')
 
     def unpublish(self, request, queryset):
@@ -317,13 +308,11 @@ class NewsboxBaseAdmin(admin.ModelAdmin):
                 'objtitle': last_obj_ok, })
         else:
             messages.success(request, ungettext_lazy(
-                '%(nb)d %(objtype_sing)s has been unpublished',
-                '%(nb)d %(objtype_plural)s have been unpublished',
+                '%(nb)d %(objtype)s has been unpublished',
+                '%(nb)d %(objtype)s have been unpublished',
                 ok) % {'nb': ok,
-                       'objtype_sing': self.model._meta.verbose_name,
-                       'objtype_plural': self.model._meta.verbose_name_plural})
-    unpublish.short_description = _(
-        'Unpublish selected %(verbose_name_plural)s')
+                       'objtype': self.model._meta.verbose_name_plural})
+    unpublish.short_description = _('Unpublish selected %(verbose_name_plural)s')
 
     def ensure_slug_uniq_queryset(self, request, obj, slug):
         y, m, d = (obj.newsbox_publication_start_date.year,
@@ -389,14 +378,16 @@ class NewsboxExpiredAdmin(NewsboxBaseAdmin):
 
     def get_fieldsets(self, request, obj=None):
         fieldsets = super(NewsboxExpiredAdmin, self).get_fieldsets(request, obj)
-
-        remove_field_from_fieldsets('newsbox_published', fieldsets)
+        for fieldset in fieldsets:
+            if 'newsbox_publication_end_date' in fieldset[1]['fields']:
+                return fieldsets
+        remove_field_from_fieldsets('newsbox_status', fieldsets)
         add_fields_to_fieldset(
-            ['newsbox_published',
+            ['newsbox_status',
              'newsbox_publication_start_date',
              'newsbox_publication_end_date', ],
             fieldsets,
-            default_fieldset_name=_('Publication'),
+            default_fieldset_name=_('Publication settings'),
             default_fieldset_position=1)
 
         return fieldsets
diff --git a/newsbox/locale/fr/LC_MESSAGES/django.mo b/newsbox/locale/fr/LC_MESSAGES/django.mo
index f6262bb9e5657f5c178a292a064e2928ee2530d3..f5848f4f19e96b23214f106bf6c0cea9146c4a07 100644
GIT binary patch
literal 8670
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

delta 1766
zcmZA0OK4nG7{Kw9N7H2TnoiO@I?2q*vw72rNt(u}v<*e$qoFDyh<Gz|G!rM2aqgWa
zK_msSLeVZfxN;M5<1AdXRVj#29HACm2rk@6QNe|)HXG{;_5a-&%*4Zd_jm5=eCK@U
z&h68m=<VB~>UR}wg6JaNs!-|y{Hu}!?QWG)r*Id~;8e9zv-m33<HvXqZ{Q$)g>`rb
zWxU_95!((FpYO*Z&W~ZUQrqfTI`Tpi8_+Fz0Z(xLHr|gnaU82^l%lI*ID*IV5H926
z=;0K8feUyK<-K`kc?MUJIjJkyNPhKc>B5)T&W&5hPyNUth`*Hl17#)kwZ#c^q6`#8
zSwKHZMJBKn=dcaWmhQiZ@_Ytm{2U%2zj}?1RQq+jMfoq{D(6dqqMzY8&IcJ?Dzt?%
zz(tg8yNrkNbL_@%u@iTZpQ`7j`>-8lL64#=<T>0vLT8mu7~jAL@qIjrKj2a9<!LGT
zBF^9vw&0tX#`o}f3^XbA2qrOx*YGj?8Rh*+He9x97Nru4&D39JewGVTLW2=pFFkk}
zWyU+mHmWN~G1PTrZmNK?!f#L(@;yog?jc1~hk02NMNrQBP$n{lQt`<k^{3)0M95z8
zk^60kBa8B19>;z{60r~!B_z3gE5n2)28hxh#;>HTQW6dlql7d`EUk}_$udXPCHw#X
zCLfPfL-tr&M-l%h+aVQ`DoA4?{$7t^FVRCtlWIvNq)A052-&g`!fyjZ>E+>swsoxy
zRU3|L$7&+g8zyU{Q^N(FOWX09?x0+wpUEw!lJ1I0*q;ubv$M5*wNIE$Pp8d>-3ZK9
zswMk((@^tL@hR=CBwan=+CKve{@`2n$9=EYN9@gpQTuDtDSNf~snEJMo0%jDycHv3
zxf3=V{H}d@J+Y<YS>t%g^|Veno>6kJBZoeylQ}3im3zq!hMsAh8IQ%rCu2G`GdDeL
zFNMPUuAI1bHS}_Yz0ew{F!oaGbfs~j$8NTUiWeR>u6E9wxOQ{#c;Q1=J)Jh%iF-LG
zmGlaEohE%Uohalt3wfEKc1_mNtInFk`u1*Q9DAcJY>%}~_j_LX0P5s_W4Yu=o_Eq7
zbNH<z8ZN(+$rkeQLOx;SE~T9BoNtkiRMTX2+{mbu^PSGg4xZ2{nfBhu>NF477lK{(
zPG_)%{N*buyH{t^M*>az@7ta5ux*IUO_6V*koUK_ETvkY?z*s}Q_d?nlS&z#I=YwH
z{u7z4FF$`M+OzL`CAwDWPp#YTMn`K(%eWiuZKkH>xtM)-SA0F2as8dv38Ui_#s2_`
pd;gJ+vS(lG#Xwp9uAV2gKMdRBe-w(B+}v6rue_v}HOk4Ue*qaMSFr#9

diff --git a/newsbox/locale/fr/LC_MESSAGES/django.po b/newsbox/locale/fr/LC_MESSAGES/django.po
index ad81980..e8dfe86 100644
--- a/newsbox/locale/fr/LC_MESSAGES/django.po
+++ b/newsbox/locale/fr/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-11-21 16:55+0100\n"
-"PO-Revision-Date: 2016-11-21 16:59+0100\n"
+"POT-Creation-Date: 2017-03-22 12:06+0100\n"
+"PO-Revision-Date: 2017-03-22 12:11+0100\n"
 "Last-Translator: DylannCordel <d.cordel@webu.coop>\n"
 "Language-Team: Webu <developpeurs@webu.coop>\n"
 "Language: fr_FR\n"
@@ -34,7 +34,7 @@ msgstr "Dépublier cette %s"
 msgid "Publish this %s"
 msgstr "Publier cette %s"
 
-#: admin.py:143 models.py:190
+#: admin.py:143 models.py:216
 msgid "published"
 msgstr "publiée"
 
@@ -46,186 +46,352 @@ msgstr "date de pub."
 msgid "Title"
 msgstr "Titre"
 
-#: admin.py:182
+#: admin.py:188 admin.py:221 admin.py:230
 #, python-format
 msgid "You do not have permission to publish this %s"
-msgstr "Vous n'avez pas la permission de publier cette %s"
+msgstr "Vous n'avez pas la permission de publier ce %s"
 
-#: admin.py:191
+#: admin.py:197
 #, python-format
-msgid "The %(objtype)s \"%(objtitle)s\" was successfully published"
-msgstr "Cette %(objtype)s \"%(objtitle)s\" a été publiée avec succès"
+msgid "publication status changed from %(old)s to %(new)s"
+msgstr "statut de publication changé de %(old)s à %(new)s"
 
-#: admin.py:201
+#: admin.py:202
 #, python-format
-msgid "The %(objtype)s \"%(objtitle)s\" was successfully unpublished"
-msgstr "Cette %(objtype)s \"%(objtitle)s\" a été dépubliée avec succès"
+msgid "The %(objtype)s \"%(objtitle)s\" has been successfully published"
+msgstr "Le %(objtype)s \"%(objtitle)s\" a été publié avec succès"
 
-#: admin.py:229
+#: admin.py:204
+#, python-format
+msgid "The %(objtype)s \"%(objtitle)s\" has been successfully unpublished"
+msgstr "Le %(objtype)s \"%(objtitle)s\" a été dépublié avec succès"
+
+#: admin.py:249
 #, python-format
 msgid "You do not have permission to publish the %(objtype)s \"%(objtitle)s\""
 msgstr ""
-"Vous n'avez pas la permission de publier cette %(objtype)s \"%(objtitle)s\""
+"Vous n'avez pas la permission de publier ce %(objtype)s \"%(objtitle)s\""
+
+#: admin.py:260
+msgid "Published"
+msgstr "Publié"
 
-#: admin.py:242
+#: admin.py:265
 #, python-format
-msgid "%(nb)d %(objtype)s was published"
-msgid_plural "%(nb)d %(objtype)s were published"
-msgstr[0] "%(nb)d %(objtype)s a été dépubliée avec succès"
-msgstr[1] "%(nb)d %(objtype)s ont été dépubliées avec succès"
+msgid "The %(objtype)s \"%(objtitle)s\" has been published"
+msgstr "Le %(objtype)s \"%(objtitle)s\" a été publié avec succès"
 
-#: admin.py:245
+#: admin.py:270
+#, python-format
+msgid "%(nb)d %(objtype)s has been published"
+msgid_plural "%(nb)d %(objtype)s have been published"
+msgstr[0] "%(nb)d %(objtype)s a été publié avec succès"
+msgstr[1] "%(nb)d %(objtype)s ont été publiés avec succès"
+
+#: admin.py:274
 #, python-format
 msgid "Publish selected %(verbose_name_plural)s"
-msgstr "Publier les %(verbose_name_plural)s sélectionnées"
+msgstr "Publier les %(verbose_name_plural)s sélectionnés"
 
-#: admin.py:260
+#: admin.py:290
 #, python-format
 msgid ""
 "You do not have permission to unpublish the %(objtype)s \"%(objtitle)s\""
 msgstr ""
-"Vous n'avez pas la permission de dépublier cette %(objtype)s \"%(objtitle)s\""
+"Vous n'avez pas la permission de dépublier ce %(objtype)s \"%(objtitle)s\""
+
+#: admin.py:301
+msgid "Unpublished"
+msgstr "Dépublié"
 
-#: admin.py:273
+#: admin.py:306
 #, python-format
-msgid "%(nb)d %(objtype)s was unpublished"
-msgid_plural "%(nb)d %(objtype)s were unpublished"
-msgstr[0] "%(nb)d %(objtype)s a été dépubliée avec succès"
-msgstr[1] "%(nb)d %(objtype)s ont été dépubliées avec succès"
+msgid "The %(objtype)s \"%(objtitle)s\" has been unpublished"
+msgstr "Le %(objtype)s \"%(objtitle)s\" a été dépublié avec succès"
 
-#: admin.py:281
+#: admin.py:311
+#, python-format
+msgid "%(nb)d %(objtype)s has been unpublished"
+msgid_plural "%(nb)d %(objtype)s have been unpublished"
+msgstr[0] "%(nb)d %(objtype)s a été dépublié avec succès"
+msgstr[1] "%(nb)d %(objtype)s ont été dépubliés avec succès"
+
+#: admin.py:315
 #, python-format
 msgid "Unpublish selected %(verbose_name_plural)s"
-msgstr "Dépublier les %(verbose_name_plural)s sélectionnées"
+msgstr "Dépublier les %(verbose_name_plural)s sélectionnés"
 
-#: admin.py:329
+#: admin.py:363
 msgid "never"
 msgstr "jamais"
 
-#: admin.py:338
+#: admin.py:372
 #, python-format
 msgid "from %(from)s to %(to)s"
 msgstr "du %(from)s au %(to)s"
 
-#: admin.py:339
+#: admin.py:373
 msgid "to"
 msgstr "au"
 
-#: admin.py:342
+#: admin.py:376
 msgid "publication"
 msgstr "publication"
 
-#: admin.py:354
-msgid "Publication"
-msgstr "Publication"
+#: admin.py:390
+msgid "Publication settings"
+msgstr "Paramètres de publication"
 
-#: admin.py:379
+#: admin.py:415
 msgid "SEO Settings"
 msgstr "Options de référencement"
 
-#: models.py:21
+#: models.py:24
 msgid "title"
 msgstr "titre"
 
-#: models.py:26
+#: models.py:25
+msgid "The title should not be too long and should be explicit"
+msgstr "Le titre ne doit pas être trop long et doit être explicite"
+
+#: models.py:30
 msgid "slug"
 msgstr "slug"
 
-#: models.py:27
+#: models.py:31
 msgid "The part of the title that is used in the URL"
 msgstr "La partie du titre utilisée dans l'URL"
 
-#: models.py:31
+#: models.py:35
 msgid "summary"
 msgstr "résumé"
 
-#: models.py:35
+#: models.py:36
+msgid "This text must be short, it will be displayed in the lists."
+msgstr "Ce texte doit être court, il sera utilisé dans les vue de listes."
+
+#: models.py:40
 msgid "body"
 msgstr "corps"
 
-#: models.py:42
+#: models.py:47
 msgid "meta description"
 msgstr "méta description"
 
-#: models.py:45
+#: models.py:49
+#, python-format
+msgid ""
+"The meta-description allow to improve your referencing and indicates to "
+"search engines a summary of your page. To draft her better, you can consult "
+"%(help_link)sthis help page%(link_end)s."
+msgstr ""
+"La méta-description permet d'améliorer votre référencement et indique aux "
+"moteurs de recherche un résumé de votre page. Pour la renseigner au mieux, "
+"vous pouvez consultez %(help_link)scette page d'aide%(link_end)s."
+
+#. Translators: This is the "help_link" URL for the meta-description help
+#: models.py:54
+#, python-format
+msgid ""
+"%(start_tag)shttps://support.google.com/webmasters/answer/35624?"
+"rd=1&hl=en#1%(end_tag)s"
+msgstr ""
+"%(start_tag)shttps://support.google.com/webmasters/answer/35624?"
+"rd=1&hl=fr#1%(end_tag)s"
+
+#: models.py:62
 msgid "meta keywords"
 msgstr "méta mots clés"
 
-#: models.py:164
+#: models.py:63
+msgid ""
+"List of few keywords (4-5) separated by commas. These words must be relevant "
+"with the contents of your page : they must be present in the contents of the "
+"page where they should be put in \"bold\" to highlight their importance. "
+"Also try to place them in the title of your page. Note that even if Google "
+"does not use this meta anymore, other search engines still use these, like "
+"Yandex, the most used search engine in Russia."
+msgstr ""
+"Liste de quelques mots-clefs (4-5)  séparés par des virgules. Ces mots "
+"doivent être pertinents avec le contenu de votre page : ils doivent être "
+"présents dans le contenu de la page où il devraient être mis en \"gras\" "
+"pour souligner leur importance. Essayez également de les placer dans le "
+"titre de votre page. Il est à noter que même si Google n'utilise plus cette "
+"meta, d'autre moteur continue de l'utiliser, tel Yandex, le moteur de "
+"recherche le plus utiliséen Russie."
+
+#: models.py:71
+msgid "canonical URL"
+msgstr "URL canonique"
+
+#: models.py:73
+#, python-format
+msgid ""
+"This field allows you to indicate to search engines the \"official\" URL of "
+"a duplicated contents. If your contents come from another page (of your "
+"website or another one), then you should indicate the URL of the \"source\" "
+"to avoid \"duplicated contents\" penalization of search engines. You can "
+"consult %(help_link_1)sthe moz dossier%(end_link)s on this matter or "
+"%(help_link_2)sGoogle help%(end_link)s."
+msgstr ""
+"Ce champ vous permet d'indiquer aux moteurs de recherche l'URL \"officielle"
+"\" d'un contenu dupliqué. Si votre contenu provient d'une autre page (de "
+"votre site ou non), alors vous devriez indiquer l'URL de ce contenu \"source"
+"\" afin d'éviter que les moteurs de recherches ne vous pénalisent pour du "
+"\"contenu dupliqué\". Vous pouvez consultez %(help_link_1)sle dossier de "
+"webrankinfo%(end_link)s à ce sujet ou %(help_link_2)sl'aide google"
+"%(end_link)s."
+
+#. Translators: This is the "help_link_1" URL for the canonical URL help
+#: models.py:81
+#, python-format
+msgid ""
+"%(start_tag)shttps://moz.com/blog/canonical-url-tag-the-most-important-"
+"advancement-in-seo-practices-since-sitemaps%(end_tag)s"
+msgstr ""
+"%(start_tag)shttp://www.webrankinfo.com/dossiers/techniques/url-canonique"
+"%(end_tag)s"
+
+#. Translators: This is the "help_link_2" URL for the canonical URL help
+#: models.py:87
+#, python-format
+msgid ""
+"%(start_tag)shttps://support.google.com/webmasters/answer/139066?"
+"hl=en#2%(end_tag)s"
+msgstr ""
+"%(start_tag)shttps://support.google.com/webmasters/answer/139066?"
+"hl=fr#2%(end_tag)s"
+
+#: models.py:215
+msgid "draft"
+msgstr "brouillon"
+
+#: models.py:217
+msgid "archived"
+msgstr "archivé"
+
+#: models.py:222
 msgid "creation date"
 msgstr "date de création"
 
-#: models.py:168
+#: models.py:226
 msgid "last update date"
 msgstr "date de dernière modification"
 
-#: models.py:174
-msgid "date"
-msgstr "date"
+#: models.py:232
+msgid "datetime"
+msgstr "date-heure"
 
-#: models.py:175
-msgid "Date of the event related to this news"
-msgstr "Date de l'évènement lié à cette actualité"
+#: models.py:233
+msgid "Datetime of the event related to this news"
+msgstr "Date de l'évènement lié à ce billet"
 
-#: models.py:182
+#: models.py:240
 msgid "publication start date"
 msgstr "date de début de publication"
 
-#: models.py:185
+#: models.py:243
 msgid ""
 "When the news should go live. Status must be \"Published\" for news to go "
 "live."
 msgstr ""
-"Date à laquelle l'actualité sera visible. Le statut doit être \"publié\" "
-"pour que l'actualité soit visible."
+"Date à laquelle le billet sera visible. Le statut doit être \"publié\" pour "
+"que le billet soit visible."
+
+#: models.py:247
+msgid "status"
+msgstr "statut"
 
-#: models.py:199 models.py:200
+#: models.py:249
+msgid ""
+"Use \"Draft\" to prepare your content before publishing and \"Archived\" to "
+"unpublish content without deleting it"
+msgstr ""
+"Utilisez \"Brouillon\" pour préparer vos contenus avant publication et "
+"\"Archivé\" pour dépublier un contenu sans le supprimer"
+
+#: models.py:257 models.py:258
 msgid "news"
-msgstr "actualité"
+msgstr "billet"
 
-#: models.py:204
+#: models.py:262
 msgid "Can publish"
 msgstr "Peut publier"
 
-#: models.py:262
+#: models.py:343
 msgid "publication end date"
 msgstr "date de fin de publication"
 
-#: models.py:265
-msgid "When to expire the news.Leave empty to never expire."
+#: models.py:345
+msgid "When the news will expire. Leave empty to never expire."
 msgstr ""
-"Date à laquelle l'actualité ne sera plus visible. Laisser vide pour qu'elle "
+"Date à laquelle le billet ne sera plus visible. Laisser vide pour qu'elle "
 "n'expire jamais."
 
-#: models.py:295
+#: models.py:384
 msgid "indexed"
-msgstr "indéxée"
+msgstr "indéxé"
 
-#: models.py:297
+#: models.py:386
+msgid "Not indexed on search engines"
+msgstr "Ne pas indéxer sur les moteurs de recherche"
+
+#: models.py:387
+msgid "Indexed on search engines"
+msgstr "Indexé sur les moteurs de recherche"
+
+#: models.py:388
 msgid "An unindexed news will not be indexed by search engines."
 msgstr ""
-"Une actualité non indéxée ne sera jamais indéxée par les moteurs de recherche"
+"Un billet non indéxé ne sera jamais référencé par les moteurs de recherche"
 
-#: templates/newsbox/list.html:41
-msgid "Read more"
-msgstr "Lire la suite"
+#: templates/newsbox/inc/detail.html:26
+#: templates/newsbox/inc/list_item.html:33
+#, python-format
+msgid "published on %(date)s"
+msgstr "publié le %(date)s"
+
+#: templates/newsbox/inc/list.html:23 templates/newsbox/inc/list.html.py:25
+msgid "All dates"
+msgstr "Toutes les dates"
+
+#: templates/newsbox/inc/list.html:25
+msgid "Display all dates"
+msgstr "Afficher toutes les dates"
 
-#: templates/newsbox/list.html:56
+#: templates/newsbox/inc/list.html:27
+msgid "Display all months"
+msgstr "Afficher tous les mois"
+
+#: templates/newsbox/inc/list.html:50
+msgid "Display all days"
+msgstr "Afficher tous les jours"
+
+#: templates/newsbox/inc/list.html:72
 msgid "Previous news"
-msgstr "Actualités précédentes"
+msgstr "Billets précédents"
 
-#: templates/newsbox/list.html:60
+#: templates/newsbox/inc/list.html:76
 #, python-format
 msgid "Page %(number)s on %(total)s"
 msgstr "Page %(number)s sur %(total)s"
 
-#: templates/newsbox/list.html:64
+#: templates/newsbox/inc/list.html:80
 msgid "Next news"
-msgstr "Actualités suivantes"
+msgstr "Billets suivants"
 
-#: templates/newsbox/list.html:68
+#: templates/newsbox/inc/list.html:84
 msgid "See all news"
-msgstr "Voir toutes les actualités"
+msgstr "Voir tous les billets"
+
+#: templates/newsbox/inc/list_item.html:36
+msgid "Read more"
+msgstr "Lire la suite"
+
+#~ msgid "%(nb)d %(objtype)s was published"
+#~ msgid_plural "%(nb)d %(objtype)s were published"
+#~ msgstr[0] "%(nb)d %(objtype)s a été dépubliée avec succès"
+#~ msgstr[1] "%(nb)d %(objtype)s ont été dépubliées avec succès"
 
 #~ msgid "Slug"
 #~ msgstr "Slug"
@@ -274,9 +440,6 @@ msgstr "Voir toutes les actualités"
 #~ msgstr[0] "Affichage de toutes les actualités"
 #~ msgstr[1] "Affichage de toutes les actualités"
 
-#~ msgid "Display of all news"
-#~ msgstr "Affichage de toutes les actualités"
-
 #~ msgid ""
 #~ "\n"
 #~ "                                    Page %(number)s on %(total)s\n"
diff --git a/newsbox/models.py b/newsbox/models.py
index 6e6de8e..d3c5bce 100644
--- a/newsbox/models.py
+++ b/newsbox/models.py
@@ -11,7 +11,10 @@ from django.utils.timezone import now
 from django.utils.translation import ugettext_lazy as _
 from django.utils.encoding import python_2_unicode_compatible
 from django.utils import six
+from django.utils.functional import lazy
+from django.utils.safestring import mark_safe
 
+mark_safe_lazy = lazy(mark_safe, six.text_type)
 newsbox_models = []
 
 
@@ -19,6 +22,7 @@ def newsbox_mcls_processor(mcls, class_name, class_bases, class_attrs, base, new
     if 'newsbox_title' not in class_attrs:
         class_attrs['newsbox_title'] = models.CharField(
             verbose_name=_('title'),
+            help_text=_('The title should not be too long and should be explicit'),
             max_length=255)
         newsbox_opts['trans_fieldnames'].append('newsbox_title')
     if 'newsbox_slug' not in class_attrs:
@@ -28,7 +32,8 @@ def newsbox_mcls_processor(mcls, class_name, class_bases, class_attrs, base, new
         newsbox_opts['trans_fieldnames'].append('newsbox_slug')
     if 'newsbox_summary' not in class_attrs:
         class_attrs['newsbox_summary'] = models.TextField(
-            verbose_name=_('summary'))
+            verbose_name=_('summary'),
+            help_text=_('This text must be short, it will be displayed in the lists.'))
         newsbox_opts['trans_fieldnames'].append('newsbox_summary')
     if 'newsbox_body' not in class_attrs:
         class_attrs['newsbox_body'] = models.TextField(
@@ -40,13 +45,55 @@ def newsbox_mcls_processor(mcls, class_name, class_bases, class_attrs, base, new
 def newsboxseo_mcls_processor(mcls, class_name, class_bases, class_attrs, base, newsbox_opts):
     class_attrs['newsbox_meta_description'] = models.TextField(
         verbose_name=_('meta description'),
+        help_text=mark_safe_lazy(
+            _('The meta-description allow to improve your referencing and indicates to '
+              'search engines a summary of your page. To draft her better, you can consult '
+              '%(help_link)sthis help page%(link_end)s.') % {
+                'help_link': _(
+                    # Translators: This is the "help_link" URL for the meta-description help
+                    '%(start_tag)s'
+                    'https://support.google.com/webmasters/answer/35624?rd=1&hl=en#1'
+                    '%(end_tag)s') % {'start_tag': '<a target="_blank" href="',
+                                      'end_tag': '">'},
+                'link_end': '</a>'}
+        ),
         max_length=255, blank=True, null=True)
     class_attrs['newsbox_meta_keywords'] = models.CharField(
         verbose_name=_('meta keywords'),
+        help_text=_('List of few keywords (4-5) separated by commas. These words must be relevant '
+                    'with the contents of your page : they must be present in the contents of the '
+                    'page where they should be put in \"bold\" to highlight their importance. '
+                    'Also try to place them in the title of your page. Note that even if Google '
+                    'does not use this meta anymore, other search engines still use these, like '
+                    'Yandex, the most used search engine in Russia.'),
         max_length=255, blank=True, null=True)
+    class_attrs['newsbox_canonical_url'] = models.URLField(
+        verbose_name=_('canonical URL'),
+        help_text=mark_safe_lazy(
+            _('This field allows you to indicate to search engines the "official" URL of a '
+              'duplicated contents. If your contents come from another page (of your website '
+              'or another one), then you should indicate the URL of the "source" to avoid '
+              '"duplicated contents" penalization of search engines. You can consult '
+              '%(help_link_1)sthe moz dossier%(end_link)s on this matter or '
+              '%(help_link_2)sGoogle help%(end_link)s.') % {
+                'help_link_1': _(
+                    # Translators: This is the "help_link_1" URL for the canonical URL help
+                    '%(start_tag)s'
+                    'https://moz.com/blog/canonical-url-tag-the-most-important-advancement-in-seo-practices-since-sitemaps'  # noqa
+                    '%(end_tag)s') % {'start_tag': '<a target="_blank" href="',
+                                      'end_tag': '">'},
+                'help_link_2': _(
+                    # Translators: This is the "help_link_2" URL for the canonical URL help
+                    '%(start_tag)s'
+                    'https://support.google.com/webmasters/answer/139066?hl=en#2'
+                    '%(end_tag)s') % {'start_tag': '<a target="_blank" href="',
+                                      'end_tag': '">'},
+                'end_link': '</a>'}
+        ),
+        null=True, blank=True,)
 
     newsbox_opts['trans_fieldnames'] += [
-        'newsbox_meta_description', 'newsbox_meta_keywords']
+        'newsbox_meta_description', 'newsbox_meta_keywords', 'newsbox_canonical_url']
 
 
 ###################################################################################################
@@ -161,6 +208,15 @@ class NewsboxBase(six.with_metaclass(NewsboxModelBase, models.Model)):
     Abstract class to build your own news
     """
 
+    STATUS_DRAFT = 'draft'
+    STATUS_PUBLISHED = 'published'
+    STATUS_ARCHIVED = 'archived'
+    STATUS_CHOICES = (
+        (STATUS_DRAFT, _('draft')),
+        (STATUS_PUBLISHED, _('published')),
+        (STATUS_ARCHIVED, _('archived')),
+    )
+
     # Automatic fields
     newsbox_creation_date = models.DateTimeField(
         verbose_name=_('creation date'),
@@ -173,8 +229,8 @@ class NewsboxBase(six.with_metaclass(NewsboxModelBase, models.Model)):
 
     # event datetime
     newsbox_date = models.DateTimeField(
-        verbose_name=_('date'),
-        help_text=_('Date of the event related to this news'),
+        verbose_name=_('datetime'),
+        help_text=_('Datetime of the event related to this news'),
         default=None, db_index=False,
         null=True, blank=True,
     )
@@ -187,11 +243,11 @@ class NewsboxBase(six.with_metaclass(NewsboxModelBase, models.Model)):
             'When the news should go live. '
             'Status must be "Published" for news to go live.'),
         null=False, blank=False)
-
-    newsbox_published = models.BooleanField(
-        verbose_name=_('published'),
-        blank=True,
-        default=True,)
+    newsbox_status=models.CharField(
+        verbose_name=_('status'), max_length=10,
+        choices=STATUS_CHOICES, default=STATUS_DRAFT,
+        help_text=_('Use "Draft" to prepare your content before publishing and "Archived" to '
+                    'unpublish content without deleting it'))
 
     default_manager = NewsboxManager()
     objects = default_manager
@@ -209,7 +265,7 @@ class NewsboxBase(six.with_metaclass(NewsboxModelBase, models.Model)):
     @classmethod
     def q_published(cls):
         # Only published News
-        q = models.Q(newsbox_published=True)
+        q = models.Q(newsbox_status=cls.STATUS_PUBLISHED)
         # exclude news with publication start date in the future
         q &= models.Q(newsbox_publication_start_date__lte=now())
         return q
@@ -233,14 +289,14 @@ class NewsboxBase(six.with_metaclass(NewsboxModelBase, models.Model)):
 
     @property
     def is_published(self):
-        if not self.newsbox_published:
+        if self.newsbox_status != self.STATUS_PUBLISHED:
             return False
         return now() >= self.newsbox_publication_start_date
 
     def publish(self, commit=True):
         updated = False
-        if not self.newsbox_published:
-            self.newsbox_published = True
+        if self.newsbox_status != self.STATUS_PUBLISHED:
+            self.newsbox_status = self.STATUS_PUBLISHED
             updated = True
         if self.newsbox_publication_start_date:
             now_datetime = now()
@@ -253,8 +309,8 @@ class NewsboxBase(six.with_metaclass(NewsboxModelBase, models.Model)):
 
     def unpublish(self, commit=True):
         updated = False
-        if self.newsbox_published:
-            self.newsbox_published = False
+        if self.newsbox_status == self.STATUS_PUBLISHED:
+            self.newsbox_status = self.STATUS_ARCHIVED
             updated = True
         if updated and commit:
             self.save()
@@ -324,9 +380,11 @@ class NewsboxSEOBase(six.with_metaclass(NewsboxModelBase, models.Model)):
     """
 
     # SEO Fields
-    newsbox_indexed = models.BooleanField(
+    newsbox_indexed = models.PositiveSmallIntegerField(
         verbose_name=_('indexed'),
-        default=True,
+        default=1,
+        choices=((0, _('Not indexed on search engines'), ),
+                 (1, _('Indexed on search engines'), )),
         help_text=_('An unindexed news will not be indexed by search engines.'))
 
     class Meta:
diff --git a/newsbox_cms/admin.py b/newsbox_cms/admin.py
index e6b59b3..cc6bf89 100644
--- a/newsbox_cms/admin.py
+++ b/newsbox_cms/admin.py
@@ -130,7 +130,8 @@ class NewsboxCMSAdmin(
         add_fields_to_fieldset(
             ['newsbox_summary'],
             fieldsets,
-            same_fieldset_as='newsbox_published',
+            same_fieldset_as='newsbox_title',
+            after_field='newsbox_date',
             replace_existing_field=True,
             remove_empty_fieldset=True,
         )
diff --git a/newsbox_cms/locale/fr/LC_MESSAGES/django.po b/newsbox_cms/locale/fr/LC_MESSAGES/django.po
index bf780bf..58eb30f 100644
--- a/newsbox_cms/locale/fr/LC_MESSAGES/django.po
+++ b/newsbox_cms/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-11-21 16:56+0100\n"
+"POT-Creation-Date: 2017-03-22 11:56+0100\n"
 "PO-Revision-Date: 2016-11-21 16:58+0100\n"
 "Last-Translator: DylannCordel <d.cordel@webu.coop>\n"
 "Language-Team: Webu <developpeurs@webu.coop>\n"
@@ -32,11 +32,11 @@ msgstr "Afficher la page de l'objet"
 msgid "edit object's parameters"
 msgstr "Éditer les paramètres de l'objet"
 
-#: cms_plugins.py:10
+#: cms_plugins.py:12
 msgid "News list"
 msgstr "Liste d'actualités"
 
-#: cms_plugins.py:23
+#: cms_plugins.py:47
 msgid "The choosen news type to display is invalid"
 msgstr "Le type d'actualité à afficher choisi est invalide"
 
@@ -88,7 +88,7 @@ msgstr[1] "Affichage de  %(nb)d actualités"
 msgid "Display of all news"
 msgstr "Affichage de toutes les actualités"
 
-#: templates/newsbox_cms/list-cms.html:13
+#: templates/newsbox_cms/inc/list_item.html:16
 msgid "Read more"
 msgstr "Lire la suite"
 
diff --git a/newsbox_i18n/locale/fr/LC_MESSAGES/django.po b/newsbox_i18n/locale/fr/LC_MESSAGES/django.po
index b6864e3..b83a098 100644
--- a/newsbox_i18n/locale/fr/LC_MESSAGES/django.po
+++ b/newsbox_i18n/locale/fr/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-11-21 16:56+0100\n"
+"POT-Creation-Date: 2017-03-22 11:56+0100\n"
 "PO-Revision-Date: 2016-11-21 16:57+0100\n"
 "Last-Translator: DylannCordel <d.cordel@webu.coop>\n"
 "Language-Team: Webu <developpeurs@webu.coop>\n"
diff --git a/tests/myapp/README.md b/tests/myapp/README.md
index 635d779..4881eb2 100644
--- a/tests/myapp/README.md
+++ b/tests/myapp/README.md
@@ -9,21 +9,21 @@ If not precised, news have those default values :
 * newsbox_title                     : News %(pk)d
 * newsbox_date                      : 2014-02-22 10:00:00
 * newsbox_publication_start_date    : 1985-07-02 10:00:00
-* newsbox_published                 : True
+* newsbox_status                    : published
 * newsbox_summary                   : Summary of the news %(pk)d
 * newsbox_body                      : Body of the news %(pk)d
 
 ### List of all available test News
 
-1. A basic classic published news 
-2. A not published news via newsbox_published
- * newsbox_published = False
+1. A basic classic published news
+2. A not published news via newsbox_status
+ * newsbox_status = 'archived'
 3. A not published news via newsbox_publication_start_date
  * newsbox_publication_start_date = 2020-01-01 10:00:00
 4. A published news without body
  * newsbox_body = ''
-5. A not published news via newsbox_published (same as #2)
- * newsbox_published = False
+5. A not published news via newsbox_status (same as #2)
+ * newsbox_status = 'archived'
 6. A published news about an old event
  * newsbox_date = 2005-07-15 10:00:00
 7. A published news about a future event
@@ -31,7 +31,7 @@ If not precised, news have those default values :
 
 ## NewsExpired
 
-If not precised, Expired news have default values from news for classic news 
+If not precised, Expired news have default values from news for classic news
 fields and those values for specific Expired news fields :
 
 * newsbox_publication_end_date      : 2014-02-22 10:00:00
@@ -61,7 +61,7 @@ and those values for specific SEO news fields :
 
 ## NewsComplete
 
-If not precised, Complete news have default values from news for classic news 
+If not precised, Complete news have default values from news for classic news
 fields, from NewsSEO for seo fields, from NewsExpired for expired fields.
 
 ### List of all available test NewsComplete
@@ -72,8 +72,8 @@ fields, from NewsSEO for seo fields, from NewsExpired for expired fields.
 
 ## NewsExtended
 
-If not precised, Complete news have default values from news for classic news 
-fields, from NewsSEO for seo fields, from NewsExpired for expired fields and 
+If not precised, Complete news have default values from news for classic news
+fields, from NewsSEO for seo fields, from NewsExpired for expired fields and
 those values for specific NewsExtended news fields :
 
 * general_field                     : Test
@@ -86,5 +86,5 @@ those values for specific NewsExtended news fields :
 
 ## Code used to generate test news
 
-You can see the code used to generate initial fixtures in utils.py in this 
+You can see the code used to generate initial fixtures in utils.py in this
 directory.
diff --git a/tests/myapp/migrations/0001_initial.py b/tests/myapp/migrations/0001_initial.py
index 901e59b..5e334d3 100644
--- a/tests/myapp/migrations/0001_initial.py
+++ b/tests/myapp/migrations/0001_initial.py
@@ -19,7 +19,7 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
                 ('newsbox_summary', models.TextField(verbose_name='summary')),
@@ -39,15 +39,16 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('newsbox_meta_description', models.TextField(max_length=255, null=True, verbose_name='meta description', blank=True)),
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
                 ('newsbox_summary', models.TextField(verbose_name='summary')),
                 ('newsbox_body', models.TextField(verbose_name='body', blank=True)),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
@@ -63,7 +64,7 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
@@ -84,9 +85,9 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('general_field', models.CharField(max_length=50)),
                 ('content_field', models.CharField(max_length=50)),
                 ('seo_field', models.CharField(max_length=50)),
@@ -96,6 +97,7 @@ class Migration(migrations.Migration):
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
                 ('newsbox_summary', models.TextField(verbose_name='summary')),
                 ('newsbox_body', models.TextField(verbose_name='body', blank=True)),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
@@ -111,14 +113,15 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('newsbox_meta_description', models.TextField(max_length=255, null=True, verbose_name='meta description', blank=True)),
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
                 ('newsbox_summary', models.TextField(verbose_name='summary')),
                 ('newsbox_body', models.TextField(verbose_name='body', blank=True)),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
diff --git a/tests/myapp/templates/myapp/inc/news_list_item.html b/tests/myapp/templates/myapp/inc/news_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp/templates/myapp/inc/news_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp/templates/myapp/inc/newscomplete_list_item.html b/tests/myapp/templates/myapp/inc/newscomplete_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp/templates/myapp/inc/newscomplete_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp/templates/myapp/inc/newsexpired_list_item.html b/tests/myapp/templates/myapp/inc/newsexpired_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp/templates/myapp/inc/newsexpired_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp/templates/myapp/inc/newsextended_list_item.html b/tests/myapp/templates/myapp/inc/newsextended_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp/templates/myapp/inc/newsextended_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp/templates/myapp/inc/newsseo_list_item.html b/tests/myapp/templates/myapp/inc/newsseo_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp/templates/myapp/inc/newsseo_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp/tests.py b/tests/myapp/tests.py
index cf8707c..d31ecbc 100644
--- a/tests/myapp/tests.py
+++ b/tests/myapp/tests.py
@@ -74,8 +74,8 @@ class NewsboxModelsTests(TestCase):
     def get_news_in_list_by_summary(self, response, summary):
         soup = BeautifulSoup(response.content, "html.parser")
         for news in soup.find_all('article'):
-            readmore_summary = news.find('p', text=summary)
-            if readmore_summary:
+            readmore_summary = news.find('div', attrs={'class': 'summary'})
+            if readmore_summary and readmore_summary.text.strip() == summary:
                 return news
         return None
 
@@ -269,4 +269,3 @@ class NewsboxModelsTests(TestCase):
         # for model in [News, NewsSEO, NewsExpired, NewsComplete, NewsExtended]:
             # Permission.objects.filter(content_type__app_label='myapp',
                                       # content_type__model=model._meta.model_name)
-            
\ No newline at end of file
diff --git a/tests/myapp_all/migrations/0001_initial.py b/tests/myapp_all/migrations/0001_initial.py
index 0e625b7..cddfa82 100644
--- a/tests/myapp_all/migrations/0001_initial.py
+++ b/tests/myapp_all/migrations/0001_initial.py
@@ -23,7 +23,7 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_body', cms.models.fields.PlaceholderField(slotname='newsbox_body', editable=False, to='cms.Placeholder', null=True, verbose_name='body')),
             ],
             options={
@@ -41,9 +41,9 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('newsbox_body', cms.models.fields.PlaceholderField(slotname='newsbox_body', editable=False, to='cms.Placeholder', null=True, verbose_name='body')),
             ],
             options={
@@ -63,6 +63,7 @@ class Migration(migrations.Migration):
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
                 ('master', models.ForeignKey(related_name='translations', editable=False, to='myapp_all.NewsComplete', null=True)),
             ],
             options={
@@ -82,9 +83,9 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('general_field', models.CharField(max_length=50)),
                 ('newsbox_body', cms.models.fields.PlaceholderField(slotname='newsbox_body', editable=False, to='cms.Placeholder', null=True, verbose_name='body')),
             ],
@@ -107,6 +108,7 @@ class Migration(migrations.Migration):
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
                 ('master', models.ForeignKey(related_name='translations', editable=False, to='myapp_all.NewsExtended', null=True)),
             ],
             options={
diff --git a/tests/myapp_all/templates/myapp_all/inc/news_list_item.html b/tests/myapp_all/templates/myapp_all/inc/news_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_all/templates/myapp_all/inc/news_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_all/templates/myapp_all/inc/newscomplete_list_item.html b/tests/myapp_all/templates/myapp_all/inc/newscomplete_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_all/templates/myapp_all/inc/newscomplete_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_all/templates/myapp_all/inc/newsexpired_list_item.html b/tests/myapp_all/templates/myapp_all/inc/newsexpired_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_all/templates/myapp_all/inc/newsexpired_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_all/templates/myapp_all/inc/newsextended_list_item.html b/tests/myapp_all/templates/myapp_all/inc/newsextended_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_all/templates/myapp_all/inc/newsextended_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_all/templates/myapp_all/inc/newsseo_list_item.html b/tests/myapp_all/templates/myapp_all/inc/newsseo_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_all/templates/myapp_all/inc/newsseo_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_cms/migrations/0001_initial.py b/tests/myapp_cms/migrations/0001_initial.py
index ae21fc4..32ca514 100644
--- a/tests/myapp_cms/migrations/0001_initial.py
+++ b/tests/myapp_cms/migrations/0001_initial.py
@@ -22,7 +22,7 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_summary', djangocms_text_ckeditor.fields.HTMLField(verbose_name='summary')),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
@@ -42,15 +42,16 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('newsbox_meta_description', models.TextField(max_length=255, null=True, verbose_name='meta description', blank=True)),
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
                 ('newsbox_summary', djangocms_text_ckeditor.fields.HTMLField(verbose_name='summary')),
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
                 ('newsbox_body', cms.models.fields.PlaceholderField(slotname='newsbox_body', editable=False, to='cms.Placeholder', null=True, verbose_name='body')),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
@@ -66,9 +67,9 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('general_field', models.CharField(max_length=50)),
                 ('content_field', models.CharField(max_length=50)),
                 ('seo_field', models.CharField(max_length=50)),
@@ -78,6 +79,7 @@ class Migration(migrations.Migration):
                 ('newsbox_title', models.CharField(max_length=255, verbose_name='title')),
                 ('newsbox_slug', models.SlugField(help_text='The part of the title that is used in the URL', verbose_name='slug')),
                 ('newsbox_body', cms.models.fields.PlaceholderField(slotname='newsbox_body', editable=False, to='cms.Placeholder', null=True, verbose_name='body')),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
diff --git a/tests/myapp_cms/templates/myapp_cms/inc/news_list_item.html b/tests/myapp_cms/templates/myapp_cms/inc/news_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_cms/templates/myapp_cms/inc/news_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_cms/templates/myapp_cms/inc/newscomplete_list_item.html b/tests/myapp_cms/templates/myapp_cms/inc/newscomplete_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_cms/templates/myapp_cms/inc/newscomplete_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_cms/templates/myapp_cms/inc/newsexpired_list_item.html b/tests/myapp_cms/templates/myapp_cms/inc/newsexpired_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_cms/templates/myapp_cms/inc/newsexpired_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_cms/templates/myapp_cms/inc/newsextended_list_item.html b/tests/myapp_cms/templates/myapp_cms/inc/newsextended_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_cms/templates/myapp_cms/inc/newsextended_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_cms/templates/myapp_cms/inc/newsseo_list_item.html b/tests/myapp_cms/templates/myapp_cms/inc/newsseo_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_cms/templates/myapp_cms/inc/newsseo_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_i18n/migrations/0001_initial.py b/tests/myapp_i18n/migrations/0001_initial.py
index b5b2ba1..d20f477 100644
--- a/tests/myapp_i18n/migrations/0001_initial.py
+++ b/tests/myapp_i18n/migrations/0001_initial.py
@@ -20,7 +20,7 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
@@ -37,9 +37,9 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
             ],
             options={
                 'ordering': ('-newsbox_publication_start_date',),
@@ -59,6 +59,7 @@ class Migration(migrations.Migration):
                 ('newsbox_body', models.TextField(verbose_name='body', blank=True)),
                 ('newsbox_meta_description', models.TextField(max_length=255, null=True, verbose_name='meta description', blank=True)),
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
                 ('master', models.ForeignKey(related_name='translations', editable=False, to='myapp_i18n.NewsComplete', null=True)),
             ],
             options={
@@ -78,9 +79,9 @@ class Migration(migrations.Migration):
                 ('newsbox_changed_date', models.DateTimeField(auto_now=True, verbose_name='last update date')),
                 ('newsbox_date', models.DateTimeField(default=None, help_text='Date of the event related to this news', null=True, verbose_name='date', blank=True)),
                 ('newsbox_publication_start_date', models.DateTimeField(default=datetime.datetime.now, help_text='When the news should go live. Status must be "Published" for news to go live.', verbose_name='publication start date', db_index=True)),
-                ('newsbox_published', models.BooleanField(default=True, verbose_name='published')),
+                ('newsbox_status', models.CharField(default='draft', help_text='Use "Draft" to prepare your content before publishing and "Archived" to unpublish content without deleting it', max_length=10, verbose_name='status', choices=[('draft', 'draft'), ('published', 'published'), ('archived', 'archived')])),
                 ('newsbox_publication_end_date', models.DateTimeField(help_text='When to expire the news.Leave empty to never expire.', null=True, verbose_name='publication end date', db_index=True, blank=True)),
-                ('newsbox_indexed', models.BooleanField(default=True, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed')),
+                ('newsbox_indexed', models.PositiveSmallIntegerField(default=1, help_text='An unindexed news will not be indexed by search engines.', verbose_name='indexed', choices=[(0, 'Not indexed on search engines'), (1, 'Indexed on search engines')])),
                 ('general_field', models.CharField(max_length=50)),
             ],
             options={
@@ -103,6 +104,7 @@ class Migration(migrations.Migration):
                 ('newsbox_body', models.TextField(verbose_name='body', blank=True)),
                 ('newsbox_meta_description', models.TextField(max_length=255, null=True, verbose_name='meta description', blank=True)),
                 ('newsbox_meta_keywords', models.CharField(max_length=255, null=True, verbose_name='meta keywords', blank=True)),
+                ('newsbox_canonical_url', models.URLField(help_text='Ce champ vous permet d\'indiquer aux moteurs de recherche l\'URL "officielle" d\'un contenu dupliqu\xe9. Si votre contenu provient d\'une autre page (de votre site ou non), alors vous devriez indiquer l\'URL de ce contenu "source" afin d\'\xe9viter que les moteurs de recherches ne vous p\xe9nalisent pour du "contenu dupliqu\xe9". Vous pouvez consultez <a target="_blank" href="http://www.webrankinfo.com/dossiers/techniques/url-canonique">le dossier de webrankinfo</a> \xe0 ce sujet ou <a target="_blank" href="https://support.google.com/webmasters/answer/139066?hl=fr#2">l\'aide google</a>.', null=True, verbose_name='canonical URL', blank=True)),
                 ('master', models.ForeignKey(related_name='translations', editable=False, to='myapp_i18n.NewsExtended', null=True)),
             ],
             options={
diff --git a/tests/myapp_i18n/templates/myapp_i18n/inc/news_list_item.html b/tests/myapp_i18n/templates/myapp_i18n/inc/news_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_i18n/templates/myapp_i18n/inc/news_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_i18n/templates/myapp_i18n/inc/newscomplete_list_item.html b/tests/myapp_i18n/templates/myapp_i18n/inc/newscomplete_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_i18n/templates/myapp_i18n/inc/newscomplete_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_i18n/templates/myapp_i18n/inc/newsexpired_list_item.html b/tests/myapp_i18n/templates/myapp_i18n/inc/newsexpired_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_i18n/templates/myapp_i18n/inc/newsexpired_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_i18n/templates/myapp_i18n/inc/newsextended_list_item.html b/tests/myapp_i18n/templates/myapp_i18n/inc/newsextended_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_i18n/templates/myapp_i18n/inc/newsextended_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/myapp_i18n/templates/myapp_i18n/inc/newsseo_list_item.html b/tests/myapp_i18n/templates/myapp_i18n/inc/newsseo_list_item.html
new file mode 100644
index 0000000..37db251
--- /dev/null
+++ b/tests/myapp_i18n/templates/myapp_i18n/inc/newsseo_list_item.html
@@ -0,0 +1 @@
+{% extends 'newsbox/inc/list_item.html' %}
diff --git a/tests/utils.py b/tests/utils.py
index 74531c9..b82027d 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -35,15 +35,15 @@ newsTypes = {
                 'newsbox_title': 'News %(i)d',
                 'newsbox_date': None,
                 'newsbox_publication_start_date': '2014-03-%(i)02dT10:00:00+02:00',
-                'newsbox_published': True,
+                'newsbox_status': 'published',
                 'newsbox_summary': 'Summary of the news %(i)d',
                 'newsbox_body': 'Body of the news %(i)d',
             },
             1: {},
-            2: {'newsbox_published': False},
+            2: {'newsbox_status': 'archived'},
             3: {'newsbox_publication_start_date': '2020-01-01T10:00:00+02:00'},
             4: {'newsbox_body': ''},
-            5: {'newsbox_published': False},
+            5: {'newsbox_status': 'archived'},
             6: {'newsbox_date': '2028-01-01T10:00:00+02:00',
                 'newsbox_publication_start_date': '2005-07-15T10:00:00+02:00'},
             7: {'newsbox_date': '1985-07-02T10:00:00+02:00'},
@@ -53,7 +53,7 @@ newsTypes = {
         'overwrites': {
             'inherit': ['myapp.News', ],
             5: {
-                'newsbox_published': True,
+                'newsbox_status': 'published',
                 'newsbox_publication_end_date': '2014-06-01T10:00:00+02:00',
             },
         },
-- 
GitLab