"), $el, selected = false;
@@ -296,4 +304,4 @@
$input.autocomplete();
});
});
-})(jQuery);
\ No newline at end of file
+})(jQuery);
diff --git a/assets/scss/_all-supports.scss b/assets/scss/_all-supports.scss
index d6ae7b3b8f..52af051681 100644
--- a/assets/scss/_all-supports.scss
+++ b/assets/scss/_all-supports.scss
@@ -30,7 +30,7 @@
&:hover,
&:focus {
- color: #084561;
+ color: $primary;
background-color: #fff;
text-decoration: none;
}
@@ -105,7 +105,7 @@
.header-container header {
- background: #084561;
+ background: $primary;
border-bottom: 3px solid $secondary;
a,
@@ -165,7 +165,7 @@
.dropdown-title {
color: #FFF;
}
-
+
.dropdown-list {
width: 100%;
padding: 0;
@@ -326,7 +326,7 @@
width: 22px;
top: 50%;
left: 50%;
- margin: -11px 0 0 -11px;
+ margin: -11px 0 0 -11px;
&.ico-messages {
@include sprite-pos($messages);
@@ -391,7 +391,7 @@
&:hover,
&:focus {
background-color: $header-hover;
-
+
.username {
text-shadow: rgba(0, 0, 0, .5) 0 0 5px;
}
@@ -440,7 +440,7 @@
&:nth-child(2n+1) {
&,
form button {
- background-color: #084561;
+ background-color: $primary;
}
}
}
@@ -530,8 +530,10 @@
&:hover,
&:focus {
- outline: none;
- background-color: rgba(255, 255, 255, .75);
+ background-color: #FFF;
+ }
+ &:focus {
+ outline-color: $secondary;
}
}
input {
@@ -551,7 +553,7 @@
&:after {
display: block;
- content: " ";
+ content: " ";
position: absolute;
top: 12px;
left: 50%;
@@ -563,7 +565,6 @@
}
}
.search-more {
- // TODO : mettre l'icône en background plutôt que tout ça
display: block;
float: left;
height: 40px;
@@ -574,13 +575,18 @@
font-weight: bold;
text-decoration: none;
font-size: 24px;
- background: rgba(255, 255, 255, 1);
- color: #084561;
+ background: #FFF;
+ color: $primary;
transition: background $transition-duration ease;
&:hover,
&:focus {
- background: rgba(255, 255, 255, .7);
+ background: $secondary;
+ color: #FFF;
+ outline: none;
+ }
+ &:before {
+ content: "+";
}
}
}
@@ -610,7 +616,7 @@
.close-alert-box {
display: block;
position: absolute;
- top: 0;
+ top: 8px;
right: 15px;
height: 20px;
width: 20px;
@@ -696,6 +702,11 @@
}
}
}
+
+.empty {
+ display: none;
+}
+
.content-wrapper .alert-box {
margin: 0 0 20px;
@@ -856,6 +867,10 @@
font-weight: bold;
}
+ img {
+ border-right: 7px solid transparent;
+ }
+
&.ico-after {
&:after {
top: 7px;
@@ -990,7 +1005,7 @@
a {
position: relative;
- color: #084561;
+ color: $primary;
transition: all $transition-duration ease;
&:hover,
@@ -1162,8 +1177,6 @@
margin-top: 0;
}
-
-
/* ==============
ALL: Main / Home
============== */
@@ -1221,7 +1234,7 @@
font-size: 2.2rem;
line-height: 38px;
line-height: 3.8rem;
- color: #084561;
+ color: $primary;
font-weight: normal;
border-bottom: 1px solid #F8AD32;
margin-top: 0;
@@ -1279,7 +1292,7 @@
border-left: none;
width: 40px;
transition: background $transition-duration;
-
+
position: absolute;
bottom: 0;
right: 15px;
@@ -1297,6 +1310,10 @@
}
}
+.tutorial-list {
+ margin: 0 0 12px 0;
+}
+
.tutorial-list article,
.main .article-content .tutorial-list article {
min-height: 60px;
@@ -1331,6 +1348,7 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ clear: none;
}
a {
text-decoration: none;
@@ -1357,7 +1375,7 @@
height: 100px;
overflow: hidden;
background-repeat: no-repeat;
- background-position: center center;
+ background-position: center center;
background-size: cover;
img {
@@ -1381,6 +1399,18 @@
margin-left: 0;
}
}
+
+ .tutorial-help{
+ margin: 12px 0 0 0;
+ }
+
+ .tutorial-help img.light {
+ opacity: 0.2;
+ &:hover,
+ &:focus {
+ opacity: 0.5;
+ }
+ }
}
@@ -1480,7 +1510,7 @@
&:hover,
&:focus {
background: #DDD;
- color: #084561;
+ color: $primary;
}
}
@@ -1513,12 +1543,12 @@
display: block;
text-align: center;
text-decoration: none;
- color: #084561;
+ color: $primary;
min-width: 45px;
height: 40px;
line-height: 40px;
transition: all $transition-duration ease;
-
+
&.current {
height: 38px;
color: #808080;
@@ -1797,7 +1827,7 @@
.forum-list {
.group-title {
- width: 100%;
+ max-width: 100%;
margin-top: 30px !important;
clear: both;
border-bottom: 1px solid #CCC;
@@ -2078,7 +2108,7 @@
img {
max-width: 100%;
}
-
+
figure {
margin: 30px 0;
text-align: center;
@@ -2106,7 +2136,7 @@
figcaption {
display: block;
}
-
+
blockquote ~ figcaption {
padding: 0 0 1px 2%;
font-style: italic;
@@ -2552,6 +2582,7 @@ table {
font-size: 1.2rem;
color: #999;
flex: 1;
+ overflow: hidden;
p {
margin: 0;
@@ -2824,7 +2855,7 @@ form.topic-message {
.autocomplete-dropdown {
position: absolute;
z-index: 60;
-
+
ul {
padding: 0;
margin: 0;
@@ -3043,9 +3074,9 @@ form.topic-message {
padding: 20px 0;
}
.page-footer {
- background: darken($primary, 10%);
- height: 50px;
- line-height: 50px;
+ background: $primary;
+ height: 40px;
+ line-height: 40px;
border-top: 3px solid $secondary;
font-size: 14px;
font-size: 1.4rem;
@@ -3138,6 +3169,7 @@ form.topic-message {
select,
textarea {
margin: 10px 15px;
+ resize: none;
&:not([type=checkbox]):not([type=radio]) {
width: calc(98% - 32px) !important;
@@ -3234,4 +3266,4 @@ form.topic-message {
.screen,
.wide {
display: none;
-}
\ No newline at end of file
+}
diff --git a/assets/scss/_form.scss b/assets/scss/_form.scss
index 29b8bb8239..c1b2fe4a5b 100644
--- a/assets/scss/_form.scss
+++ b/assets/scss/_form.scss
@@ -11,6 +11,11 @@
form {
width: 100%;
+ &.content-wrapper {
+ width: calc(100% - 20px);
+ margin: 0 10px;
+ }
+
p {
position: relative;
}
@@ -33,7 +38,7 @@
}
-
+
label {
display: block;
color: #555;
@@ -119,7 +124,6 @@
color: #DDD;
padding: 0 15px;
border: none;
- float: right;
text-decoration: none;
margin-left: 1px;
outline: none;
@@ -139,6 +143,9 @@
animation: lineLoading linear 1s infinite;
}
}
+ &:not(.btn-holder){
+ float: right;
+ }
}
[type=submit],
.btn-submit {
@@ -149,7 +156,7 @@
&:not([disabled]):focus,
&:not(.disabled):hover,
&:not(.disabled):focus {
- background: lighten($upvote, 5%);
+ background: lighten($upvote, 7%);
}
&.disabled.submitted {
@@ -208,13 +215,46 @@
}
}
+ .btn-facebook {
+ background: #3b5998;
+
+ &:hover,
+ &:focus {
+ background: darken(#3b5998, 10%);
+ }
+ }
+ .btn-twitter {
+ background: #4099FF;
+
+ &:hover,
+ &:focus {
+ background: darken(#4099FF, 10%);
+ }
+ }
+ .btn-google-plus {
+ background: #d34836;
+
+ &:hover,
+ &:focus {
+ background: darken(#d34836, 10%);
+ }
+ }
+ .btn-facebook,
+ .btn-twitter,
+ .btn-google-plus {
+ width: 50%;
+ margin: 0 auto;
+ text-align: center;
+ }
+
.form-sub-link {
display: block;
display: inline-block;
margin-top: 8px;
}
- .buttonHolder {
+ .btn-holder,
+ .buttonHolder /* specifix for crispy */ {
margin-top: 25px;
min-height: 40px;
}
diff --git a/assets/scss/_icons.scss b/assets/scss/_icons.scss
index 62ee91a343..4cc4ad32b9 100644
--- a/assets/scss/_icons.scss
+++ b/assets/scss/_icons.scss
@@ -38,6 +38,12 @@
}
}
+ &.unread {
+ &:after {
+ @include sprite-pos($unread);
+ }
+ }
+
&.upvote {
&:after {
@include sprite-pos($thumb-up);
@@ -193,6 +199,12 @@
}
}
+ &.unread {
+ &:after {
+ @include sprite-pos($unread, true);
+ }
+ }
+
&.upvote {
&:after {
@include sprite-pos($thumb-up, true);
diff --git a/assets/scss/_mobile-tablet.scss b/assets/scss/_mobile-tablet.scss
index ca50091dad..35dafc9f5d 100644
--- a/assets/scss/_mobile-tablet.scss
+++ b/assets/scss/_mobile-tablet.scss
@@ -566,6 +566,10 @@
.date {
float: right;
+
+ .long-date {
+ display: none;
+ }
}
}
@@ -632,6 +636,7 @@
.article-content {
p,
+ ol,
ul:not(.pagination) {
font-size: 15px;
font-size: 1.5rem;
@@ -641,7 +646,7 @@
.content-wrapper,
.full-content-wrapper {
h1:not(.ico-after),
- h2,
+ h2:not(.ico-after),
h3,
.subtitle {
padding-left: 10px;
diff --git a/assets/scss/_wide.scss b/assets/scss/_wide.scss
index e282234d24..93912456fa 100644
--- a/assets/scss/_wide.scss
+++ b/assets/scss/_wide.scss
@@ -15,7 +15,7 @@
.main-container {
- min-height: calc(100% - 146px);
+ min-height: calc(100% - 136px);
}
@@ -346,6 +346,7 @@
blockquote {
margin: 0 0 0 300px;
+ width: auto;
}
}
@@ -399,6 +400,9 @@
.full-content-wrapper .tutorial-list article {
width: 46%;
float: left;
+ &.extend {
+ width: 100%;
+ }
}
@@ -496,6 +500,10 @@
white-space: nowrap;
overflow: hidden;
}
+
+ .message-metadata .date .short-date {
+ display: none;
+ }
}
}
@@ -551,6 +559,20 @@
+ /* ============
+ Forms
+ ============ */
+ .content-container,
+ #modals {
+ form.content-wrapper {
+ margin: 0;
+ width: 100%;
+ }
+ }
+
+
+
+
/* ==============
Modals boxes
============== */
diff --git a/assets/tex/template.tex b/assets/tex/template.tex
index fe57f01405..1cf94507cf 100644
--- a/assets/tex/template.tex
+++ b/assets/tex/template.tex
@@ -134,6 +134,8 @@
\usepackage{titlesec} % Allows customization of titles
\usepackage{graphicx} % Required for including pictures
+\newcommand{\gt}{>}
+\newcommand{\lt}{<}
\begin{titlepage}
$if(title)$
\title{\color{white}{$title$}}
@@ -194,4 +196,4 @@
$include-after$
$endfor$
-\end{document}
\ No newline at end of file
+\end{document}
diff --git a/conf/locale/en/LC_MESSAGES/django.po b/conf/locale/en/LC_MESSAGES/django.po
deleted file mode 100644
index 78af10d01d..0000000000
--- a/conf/locale/en/LC_MESSAGES/django.po
+++ /dev/null
@@ -1,4795 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR , YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-01 16:34+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME \n"
-"Language-Team: LANGUAGE \n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#: templates/403.html:6 templates/403.html.py:12 templates/403.html.py:18
-msgid "Erreur 403"
-msgstr ""
-
-#: templates/403.html:31
-msgid "Vous n'avez pas les droits suffisants pour accéder à cette page"
-msgstr ""
-
-#: templates/404.html:6 templates/404.html.py:12 templates/404.html.py:18
-msgid "Erreur 404"
-msgstr ""
-
-#: templates/404.html:31
-msgid "Il semblerait que ce que vous cherchiez ne se trouve plus ici"
-msgstr ""
-
-#: templates/500.html:6 templates/500.html.py:12 templates/500.html.py:18
-msgid "Erreur 500"
-msgstr ""
-
-#: templates/500.html:31
-#, python-format
-msgid ""
-"\n"
-" Si vous voyez cette page, c'est que vous avez trouvé un bug. Merci\n"
-" de rapporter cette erreur en expliquant comment vous avez procédé\n"
-" pour tomber sur cette page en créant un sujet sur\n"
-" le forum Bugs et Suggestions.Merci de "
-"votre aide\n"
-" "
-msgstr ""
-
-#: templates/500.html:39
-#, python-format
-msgid ""
-"\n"
-" Si vous êtes curieux, voici une liste "
-"des sujets ouverts à ce propos sur le bug tracker public de "
-"l'association\n"
-" "
-msgstr ""
-
-#: templates/base.html:122
-msgid "Aller au menu"
-msgstr ""
-
-#: templates/base.html:125
-msgid "Aller au contenu"
-msgstr ""
-
-#: templates/base.html:128
-msgid "Aller à la recherche"
-msgstr ""
-
-#: templates/base.html:134
-msgid ""
-"Ce site utilise Google Analytics. En poursuivant votre navigation sur ce "
-"site, vous nous autorisez à déposer des cookies à des fins de mesure "
-"d'audience. Pour s'opposer à ce dépôt vous pouvez cliquer"
-msgstr ""
-
-#: templates/base.html:136
-msgid "ici"
-msgstr ""
-
-#: templates/base.html:137
-msgid "En savoir plus"
-msgstr ""
-
-#: templates/base.html:138 templates/base.html.py:474 templates/home.html:72
-msgid "OK"
-msgstr ""
-
-#: templates/base.html:174 templates/member/profile.html:295
-#: templates/tutorial/base.html:7 templates/tutorial/base.html.py:13
-#: templates/tutorial/base.html:24 templates/tutorial/base_online.html:8
-#: templates/tutorial/base_online.html:24 templates/tutorial/index.html:42
-#: templates/tutorial/extract/new.html:7
-msgid "Tutoriels"
-msgstr ""
-
-#: templates/base.html:178 templates/tutorial/index.html:10
-#: templates/tutorial/index.html.py:31 templates/tutorial/index.html:44
-msgid "Tous les tutoriels"
-msgstr ""
-
-#: templates/base.html:205 templates/article/base.html:6
-#: templates/article/base.html.py:12 templates/article/base.html:20
-#: templates/article/base_content.html:6
-#: templates/article/base_content.html:12
-#: templates/article/base_content.html:20 templates/article/index.html:40
-#: templates/article/member/edit.html:10 templates/article/member/edit.html:19
-#: templates/article/member/history.html:18
-#: templates/article/member/index.html:6 templates/article/member/new.html:9
-#: templates/article/member/view.html:12 templates/article/member/view.html:21
-msgid "Articles"
-msgstr ""
-
-#: templates/base.html:210 templates/forum/base.html:11
-#: templates/forum/base.html.py:17 templates/forum/base.html:25
-#: templates/member/profile.html:393
-msgid "Forums"
-msgstr ""
-
-#: templates/base.html:214
-msgid "Tous les forums"
-msgstr ""
-
-#: templates/base.html:235
-msgid "Tags les plus utilisés"
-msgstr ""
-
-#: templates/base.html:264 templates/base.html.py:268
-msgid "Messagerie privée"
-msgstr ""
-
-#: templates/base.html:290
-msgid "Aucun nouveau message"
-msgstr ""
-
-#: templates/base.html:295
-msgid "Tous les messages"
-msgstr ""
-
-#: templates/base.html:309 templates/base.html.py:313
-msgid "Notifications"
-msgstr ""
-
-#: templates/base.html:331
-msgid "Aucune notification"
-msgstr ""
-
-#: templates/base.html:336
-msgid "Toutes les notifications"
-msgstr ""
-
-#: templates/base.html:347
-msgid "Alertes"
-msgstr ""
-
-#: templates/base.html:354
-msgid "Alertes Modération"
-msgstr ""
-
-#: templates/base.html:366
-msgid "Aucune alerte"
-msgstr ""
-
-#: templates/base.html:371
-msgid "Toutes les alertes"
-msgstr ""
-
-#: templates/base.html:382 templates/member/settings/account.html:13
-msgid "Mon Compte"
-msgstr ""
-
-#: templates/base.html:392 templates/base.html.py:393
-#: templates/member/settings/account.html:7
-#: templates/member/settings/account.html:19
-#: templates/member/settings/base.html:29
-msgid "Mon compte"
-msgstr ""
-
-#: templates/base.html:409 templates/member/settings/base.html:28
-#: templates/member/settings/profile.html:7
-#: templates/member/settings/profile.html:13
-#: templates/member/settings/profile.html:19
-msgid "Mon profil"
-msgstr ""
-
-#: templates/base.html:412 templates/tutorial/base.html:20
-#: templates/tutorial/member/index.html:7
-#: templates/tutorial/member/index.html:22
-#: templates/tutorial/member/index.html:47
-msgid "Mes tutoriels"
-msgstr ""
-
-#: templates/base.html:415 templates/article/member/edit.html:17
-#: templates/article/member/history.html:16
-#: templates/article/member/index.html:12 templates/article/member/new.html:15
-#: templates/article/member/view.html:19
-msgid "Mes articles"
-msgstr ""
-
-#: templates/base.html:418
-msgid "Galeries d'images"
-msgstr ""
-
-#: templates/base.html:421 templates/member/profile.html:195
-#: templates/member/settings/base.html:6
-#: templates/member/settings/base.html:12
-#: templates/member/settings/base.html:18
-msgid "Paramètres"
-msgstr ""
-
-#: templates/base.html:426 templates/tutorial/validation/index.html:28
-msgid "Validation des tutoriels"
-msgstr ""
-
-#: templates/base.html:432 templates/article/validation/index.html:51
-msgid "Validation des articles"
-msgstr ""
-
-#: templates/base.html:441
-msgid "Déconnexion"
-msgstr ""
-
-#: templates/base.html:450 templates/member/login.html:7
-#: templates/member/login.html.py:19 templates/member/login.html:26
-msgid "Connexion"
-msgstr ""
-
-#: templates/base.html:451 templates/member/register/index.html:7
-#: templates/member/register/index.html:13
-#: templates/member/register/index.html:19
-#: templates/member/register/token_already_used.html:18
-#: templates/member/register/token_failed.html:18
-#: templates/member/register/token_success.html:16
-msgid "Inscription"
-msgstr ""
-
-#: templates/base.html:464
-msgid "Accueil"
-msgstr ""
-
-#: templates/base.html:494
-msgid "Masquer l'alerte"
-msgstr ""
-
-#: templates/base.html:532 templates/article/member/history.html:94
-#: templates/tutorial/tutorial/history.html:50
-msgid "Version"
-msgstr ""
-
-#: templates/base.html:536 templates/pages/index.html:25
-msgid "CGU"
-msgstr ""
-
-#: templates/base.html:537 templates/pages/about.html:6
-#: templates/pages/about.html.py:12 templates/pages/about.html:18
-#: templates/pages/index.html:26
-msgid "À propos"
-msgstr ""
-
-#: templates/base.html:539 templates/pages/association.html:6
-#: templates/pages/association.html:12 templates/pages/association.html:18
-#: templates/pages/contact.html:31 templates/pages/index.html:28
-msgid "L'association"
-msgstr ""
-
-#: templates/base.html:542 templates/pages/index.html:30
-msgid "Adhérer"
-msgstr ""
-
-#: templates/base.html:544 templates/pages/contact.html:6
-#: templates/pages/contact.html.py:12 templates/pages/contact.html:18
-#: templates/pages/index.html:31
-msgid "Contact"
-msgstr ""
-
-#: templates/home.html:42
-#, python-format
-msgid ""
-"\n"
-" %(site_name)s est un site de partage de "
-"connaissances sur lequel vous trouverez des tutoriels de tous niveaux, des articles et des forums "
-"d'entraide animés par et pour la communauté. Les sujets abordés sont, "
-"pour l'instant, l'informatique et les sciences, mais nous n'attendons que "
-"vous pour élargir les domaines présentés !\n"
-" "
-msgstr ""
-
-#: templates/home.html:47
-msgid ""
-"\n"
-" Tous les membres peuvent écrire et publier "
-"des tutoriels et articles sur le site. Pour assurer la qualité et "
-"la pédagogie du contenu, l'équipe du site valide chaque cours avant "
-"publication.\n"
-" "
-msgstr ""
-
-#: templates/home.html:53
-#, python-format
-msgid ""
-"\n"
-" Tout cela est entièrement gratuit et garanti "
-"sans publicité, le site est géré et financé par une association à but non lucratif.\n"
-" "
-msgstr ""
-
-#: templates/home.html:68
-msgid "Tu cherches quelque chose"
-msgstr ""
-
-#: templates/home.html:71
-msgid "Lancer la recherche"
-msgstr ""
-
-#: templates/home.html:83 templates/member/profile.html:123
-#: templates/member/profile.html.py:270
-msgid "Derniers articles"
-msgstr ""
-
-#: templates/home.html:112 templates/article/view.html:128
-#: templates/article/includes/article_item.part.html:38
-msgid "Aucune réaction"
-msgstr ""
-
-#: templates/home.html:114 templates/article/view.html:126
-msgid "réaction"
-msgstr ""
-
-#: templates/home.html:129 templates/member/profile.html:115
-#: templates/member/profile.html.py:263
-msgid "Derniers tutoriels"
-msgstr ""
-
-#: templates/home.html:144
-msgid "Catégories de tutoriels"
-msgstr ""
-
-#: templates/home.html:146 templates/article/validation/index.html:76
-#: templates/tutorial/validation/index.html:65
-msgid "Catégories"
-msgstr ""
-
-#: templates/home.html:146
-msgid "de tutoriels"
-msgstr ""
-
-#: templates/article/find.html:10 templates/article/find.html.py:16
-msgid "Articles rédigés par"
-msgstr ""
-
-#: templates/article/find.html:32
-msgid "Articles rédigés"
-msgstr ""
-
-#: templates/article/find.html:35
-msgid "Liste des articles rédigés par"
-msgstr ""
-
-#: templates/article/index.html:9 templates/article/index.html.py:29
-#: templates/article/index.html:42
-msgid "Tous les articles"
-msgstr ""
-
-#: templates/article/index.html:17
-msgid "Articles de la communauté à propos de"
-msgstr ""
-
-#: templates/article/index.html:17
-msgid ""
-"Vous pourrez également découvrir de nouvelles notions en parcourant les "
-"autres catégories"
-msgstr ""
-
-#: templates/article/index.html:19
-msgid ""
-"Les articles sont rédigés par la communauté. Ils permettent aussi bien de se "
-"tenir informé des dernières innovations du moment que de découvrir de "
-"nouvelles notions liées à différents domaines : sciences, informatiques"
-msgstr ""
-
-#: templates/article/index.html:58 templates/article/member/index.html:104
-msgid "Aucun article disponible"
-msgstr ""
-
-#: templates/article/view.html:85
-msgid "Publié "
-msgstr ""
-
-#: templates/article/view.html:92 templates/article/member/history.html:75
-#: templates/article/member/view.html:85
-#: templates/article/validation/history.html:46
-msgid "Contributeur"
-msgstr ""
-
-#: templates/article/view.html:188
-#: templates/article/includes/sidebar_actions.part.html:102
-#: templates/article/member/history.html:106
-#: templates/article/validation/history.html:15
-#: templates/article/validation/index.html:14
-#: templates/tutorial/tutorial/history.html:61
-#: templates/tutorial/tutorial/view.html:346
-#: templates/tutorial/validation/history.html:15
-#: templates/tutorial/validation/index.html:8
-#: templates/tutorial/validation/index.html:19
-msgid "Validation"
-msgstr ""
-
-#: templates/article/view.html:192 templates/article/view.html.py:224
-msgid "Version hors ligne"
-msgstr ""
-
-#: templates/article/view.html:196
-#: templates/article/includes/sidebar_actions.part.html:187
-#: templates/tutorial/tutorial/view.html:368
-#: templates/tutorial/tutorial/view_online.html:186
-msgid "Dépublier"
-msgstr ""
-
-#: templates/article/view.html:199
-#: templates/article/includes/sidebar_actions.part.html:190
-msgid ""
-"\n"
-" Attention ! Vous allez "
-"dépublier un article actuellement en ligne.\n"
-" "
-msgstr ""
-
-#: templates/article/view.html:204
-#: templates/article/includes/sidebar_actions.part.html:25
-#: templates/article/includes/sidebar_actions.part.html:91
-#: templates/article/includes/sidebar_actions.part.html:150
-#: templates/article/includes/sidebar_actions.part.html:161
-#: templates/article/includes/sidebar_actions.part.html:177
-#: templates/article/includes/sidebar_actions.part.html:195
-#: templates/article/includes/sidebar_actions.part.html:227
-#: templates/gallery/gallery/list.html:89 templates/member/profile.html:176
-#: templates/member/profile.html.py:456 templates/member/profile.html:471
-#: templates/member/profile.html.py:489 templates/member/profile.html:510
-#: templates/member/profile.html.py:525 templates/member/profile.html:541
-#: templates/misc/message.part.html:66 templates/misc/message.part.html:129
-#: templates/misc/validation.part.html:40 templates/mp/index.html:104
-#: templates/mp/topic/index.html:126 templates/tutorial/chapter/view.html:168
-#: templates/tutorial/includes/chapter.part.html:46
-#: templates/tutorial/part/view.html:196
-#: templates/tutorial/tutorial/history.html:110
-#: templates/tutorial/tutorial/history.html:129
-#: templates/tutorial/tutorial/view.html:186
-#: templates/tutorial/tutorial/view.html:250
-#: templates/tutorial/tutorial/view.html:279
-#: templates/tutorial/tutorial/view.html:305
-#: templates/tutorial/tutorial/view.html:377
-#: templates/tutorial/tutorial/view.html:428
-#: templates/tutorial/tutorial/view.html:458
-#: templates/tutorial/tutorial/view_online.html:194 zds/tutorial/forms.py:509
-msgid "Confirmer"
-msgstr ""
-
-#: templates/article/view.html:213
-#: templates/article/includes/sidebar_actions.part.html:106
-#: templates/article/validation/history.html:29
-#: templates/tutorial/validation/history.html:9
-#: templates/tutorial/validation/history.html:28
-msgid "Historique de validation"
-msgstr ""
-
-#: templates/article/view.html:220
-#: templates/article/includes/sidebar_actions.part.html:14
-msgid "Gestion"
-msgstr ""
-
-#: templates/article/view.html:232
-#: templates/article/includes/sidebar_actions.part.html:243
-#: templates/tutorial/base.html:59
-msgid "Télécharger"
-msgstr ""
-
-#: templates/article/view.html:238
-#: templates/article/includes/sidebar_actions.part.html:247
-#: templates/tutorial/base.html:96
-msgid "Archive"
-msgstr ""
-
-#: templates/article/includes/article_item.part.html:44
-#: templates/article/member/index.html:21
-#: templates/article/member/index.html:36
-#: templates/article/member/index.html:49
-#: templates/article/member/index.html:73 templates/member/profile.html:317
-#: templates/member/profile.html.py:334 templates/member/profile.html:364
-#: templates/member/profile.html.py:377
-#: templates/tutorial/member/index.html:11
-#: templates/tutorial/member/index.html:31
-#: templates/tutorial/member/index.html:51
-#: templates/tutorial/member/index.html:122 zds/tutorial/views.py:490
-msgid "En validation"
-msgstr ""
-
-#: templates/article/includes/article_item.part.html:46
-#: templates/article/member/history.html:110
-msgid "Brouillon"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:5
-#: templates/article/member/edit.html:26 templates/article/member/edit.html:33
-#: templates/misc/message.part.html:77
-#: templates/tutorial/includes/chapter.part.html:90
-#: templates/tutorial/tutorial/view.html:163
-msgid "Éditer"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:9
-#: templates/tutorial/tutorial/view.html:167
-msgid "Version brouillon"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:18
-#: templates/article/member/view.html:94
-#: templates/tutorial/includes/tags_authors.part.html:39
-#: templates/tutorial/tutorial/view.html:179
-msgid "Ajouter un auteur"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:30
-#: templates/tutorial/tutorial/view.html:192
-msgid "Gérer les auteurs"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:34
-#: templates/article/member/history.html:96 templates/pages/alerts.html:29
-#: templates/tutorial/includes/tags_authors.part.html:28
-#: templates/tutorial/tutorial/history.html:52
-#: templates/tutorial/tutorial/view.html:197
-msgid "Auteur"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:35
-#: templates/forum/base.html:54 templates/gallery/gallery/details.html:123
-#: templates/gallery/gallery/list.html:76 templates/gallery/image/edit.html:68
-#: templates/gallery/image/new.html:35 templates/member/profile.html:161
-#: templates/member/profile.html.py:210 templates/member/profile.html:211
-#: templates/mp/index.html:91 templates/mp/post/edit.html:53
-#: templates/mp/topic/index.html:95 templates/tutorial/base.html:48
-#: templates/tutorial/tutorial/import.html:64
-#: templates/tutorial/tutorial/view.html:198
-msgid "Actions"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:44
-#: templates/article/includes/sidebar_actions.part.html:211
-#: templates/article/includes/sidebar_actions.part.html:215
-#: templates/member/profile.html:169
-#: templates/tutorial/includes/chapter.part.html:36
-#: templates/tutorial/tutorial/view.html:207
-msgid "Supprimer"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:47
-#: templates/tutorial/tutorial/view.html:210
-msgid "Vous êtes seul"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:60
-msgid "Voir la version en ligne"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:64
-#: templates/tutorial/tutorial/view.html:313
-msgid "Historique des versions"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:70
-#: templates/tutorial/tutorial/view.html:320
-msgid "Demander la validation"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:76
-#: templates/tutorial/tutorial/view.html:327
-msgid "Mettre à jour la version en validation"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:81
-#: templates/tutorial/tutorial/view.html:332
-msgid "En attente de validation"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:113
-#: templates/tutorial/tutorial/view.html:357
-msgid "Envoyer un MP"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:115
-#: templates/tutorial/tutorial/view.html:359
-msgid "aux auteurs"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:117
-msgid "à l'auteur"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:128
-#: templates/misc/validation.part.html:14
-#: templates/tutorial/tutorial/view.html:389
-msgid "Réserver"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:138
-#: templates/misc/validation.part.html:29
-#: templates/tutorial/tutorial/view.html:399
-msgid "Annuler la réservation"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:143
-#: zds/tutorial/forms.py:552
-msgid "Publier"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:154
-#: templates/tutorial/tutorial/view.html:410 zds/tutorial/forms.py:581
-msgid "Rejeter"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:167
-#, python-format
-msgid ""
-"\n"
-" Réservé par "
-"%(validation.validator.username)s, le retirer\n"
-" "
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:174
-msgid "La validation de cet article est actuellement réservé par"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:174
-#: templates/tutorial/tutorial/view.html:425
-msgid "Êtes-vous certains de vouloir le retirer"
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:218
-#, python-format
-msgid ""
-"\n"
-" Vous vous apprêtez à supprimer "
-"définitivement l'article \"%(article_title)s\".\n"
-" "
-msgstr ""
-
-#: templates/article/includes/sidebar_actions.part.html:233
-#: templates/tutorial/tutorial/view.html:465
-msgid "Impossible, car publié"
-msgstr ""
-
-#: templates/article/includes/sidebar_base.html:6
-#: templates/article/member/index.html:60 templates/article/member/new.html:21
-#: templates/article/member/new.html:27 templates/article/member/new.html:33
-msgid "Nouvel article"
-msgstr ""
-
-#: templates/article/includes/sidebar_base.html:10
-#: templates/forum/includes/feed.part.html:3 templates/tutorial/index.html:92
-msgid "Flux"
-msgstr ""
-
-#: templates/article/includes/sidebar_base.html:14
-msgid "Nouveaux articles (RSS)"
-msgstr ""
-
-#: templates/article/includes/sidebar_base.html:19
-msgid "Nouveaux articles (ATOM)"
-msgstr ""
-
-#: templates/article/member/edit.html:39
-msgid "Éditer l'article"
-msgstr ""
-
-#: templates/article/member/edit.html:53
-msgid ""
-"\n"
-" Cet article est actuellement en ligne ! "
-"Veuillez être particulièrement prudent au niveau des changements que vous "
-"apportez à celui-ci.\n"
-" Vous pouvez modifier la forme de celui-ci, mais évitez d'en "
-"modifier le fond !\n"
-" "
-msgstr ""
-
-#: templates/article/member/history.html:9
-#: templates/article/member/history.html:42
-#: templates/tutorial/tutorial/history.html:9
-#: templates/tutorial/tutorial/history.html:26
-msgid "Historique de"
-msgstr ""
-
-#: templates/article/member/history.html:26
-#: templates/tutorial/tutorial/history.html:16
-msgid "Historique des modifications"
-msgstr ""
-
-#: templates/article/member/history.html:68
-#: templates/article/member/view.html:77
-msgid "Publié"
-msgstr ""
-
-#: templates/article/member/history.html:92
-msgid "Visbilité"
-msgstr ""
-
-#: templates/article/member/history.html:93 templates/pages/alerts.html:30
-#: templates/tutorial/tutorial/history.html:49
-msgid "Date"
-msgstr ""
-
-#: templates/article/member/history.html:95
-#: templates/tutorial/tutorial/history.html:51
-msgid "Diff"
-msgstr ""
-
-#: templates/article/member/history.html:104
-msgid "Publique"
-msgstr ""
-
-#: templates/article/member/history.html:108
-#: templates/tutorial/tutorial/history.html:64
-msgid "Beta"
-msgstr ""
-
-#: templates/article/member/history.html:131
-#: templates/tutorial/tutorial/history.html:88
-msgid "Inconnu"
-msgstr ""
-
-#: templates/article/member/index.html:19
-#: templates/article/member/index.html:34
-#: templates/article/member/index.html:47
-#: templates/article/member/index.html:68
-#: templates/tutorial/member/index.html:9
-#: templates/tutorial/member/index.html:29
-#: templates/tutorial/member/index.html:49
-#: templates/tutorial/member/index.html:117
-msgid "Publiés"
-msgstr ""
-
-#: templates/article/member/index.html:23
-#: templates/article/member/index.html:38
-#: templates/article/member/index.html:51
-#: templates/article/member/index.html:78
-#: templates/tutorial/member/index.html:15
-#: templates/tutorial/member/index.html:35
-#: templates/tutorial/member/index.html:55
-#: templates/tutorial/member/index.html:132
-msgid "Brouillons"
-msgstr ""
-
-#: templates/article/member/index.html:25
-msgid "Tous mes articles"
-msgstr ""
-
-#: templates/article/member/index.html:32
-#: templates/article/member/index.html:45
-msgid "Mes Articles"
-msgstr ""
-
-#: templates/article/member/index.html:64
-#: templates/article/validation/index.html:22
-#: templates/forum/category/forum.html:107
-#: templates/tutorial/member/index.html:113
-#: templates/tutorial/validation/index.html:109
-msgid "Filtres"
-msgstr ""
-
-#: templates/article/member/index.html:84
-#: templates/article/validation/index.html:37
-#: templates/forum/category/forum.html:135
-#: templates/tutorial/member/index.html:139
-#: templates/tutorial/validation/index.html:124
-msgid "Annuler le filtre"
-msgstr ""
-
-#: templates/article/member/view.html:105
-msgid "Cet article est en attente d'un validateur"
-msgstr ""
-
-#: templates/article/member/view.html:109
-msgid "L'article est en cours de validation par"
-msgstr ""
-
-#: templates/article/member/view.html:116
-#: templates/tutorial/tutorial/view.html:64
-msgid "Le message suivant a été laissé à destination des validateurs"
-msgstr ""
-
-#: templates/article/member/view.html:128
-#: templates/article/member/view.html:134
-msgid "Une autre version de cet article"
-msgstr ""
-
-#: templates/article/member/view.html:129
-#: templates/tutorial/tutorial/view.html:77
-msgid "est en attente d'un validateur"
-msgstr ""
-
-#: templates/article/member/view.html:135
-#: templates/tutorial/tutorial/view.html:83
-msgid "est en cours de validation par"
-msgstr ""
-
-#: templates/article/reaction/edit.html:8
-#: templates/article/reaction/edit.html:15
-msgid "Éditer une réponse"
-msgstr ""
-
-#: templates/article/reaction/edit.html:21
-msgid "Éditer une réponse à l'article"
-msgstr ""
-
-#: templates/article/reaction/new.html:8
-#: templates/article/reaction/new.html:15
-#: templates/article/reaction/new.html:21
-msgid "Répondre à l'article"
-msgstr ""
-
-#: templates/article/reaction/new.html:29
-msgid ""
-"\n"
-" Au moins un nouveau message a été posté "
-"dans la discussion\n"
-" pendant que vous rédigiez le votre.\n"
-" "
-msgstr ""
-
-#: templates/article/validation/history.html:9
-msgid "Historique de validation de l'article"
-msgstr ""
-
-#: templates/article/validation/history.html:17
-#: templates/tutorial/tutorial/diff.html:16
-#: templates/tutorial/validation/history.html:17
-msgid "Historique"
-msgstr ""
-
-#: templates/article/validation/history.html:60
-#: templates/article/validation/index.html:63
-#: templates/tutorial/validation/history.html:40
-msgid "Proposé"
-msgstr ""
-
-#: templates/article/validation/history.html:61
-#: templates/article/validation/index.html:64
-#: templates/tutorial/validation/history.html:41
-#: templates/tutorial/validation/index.html:53
-msgid "Statut"
-msgstr ""
-
-#: templates/article/validation/history.html:72
-#: templates/tutorial/validation/history.html:52
-msgid "Message laissé à la validation"
-msgstr ""
-
-#: templates/article/validation/history.html:93
-#: templates/tutorial/validation/index.html:97
-msgid "Aucun tutoriel soumis en validation"
-msgstr ""
-
-#: templates/article/validation/index.html:8
-msgid "Liste des articles soumis en validation"
-msgstr ""
-
-#: templates/article/validation/index.html:15
-msgid "Liste des articles"
-msgstr ""
-
-#: templates/article/validation/index.html:26
-#: templates/tutorial/validation/index.html:113
-msgid "En cours de validation"
-msgstr ""
-
-#: templates/article/validation/index.html:31
-#: templates/tutorial/validation/index.html:118
-msgid "En attente de validateur"
-msgstr ""
-
-#: templates/article/validation/index.html:61
-#: templates/tutorial/validation/index.html:50 zds/article/forms.py:18
-#: zds/forum/forms.py:19 zds/gallery/forms.py:19 zds/gallery/forms.py:110
-#: zds/mp/forms.py:25 zds/tutorial/forms.py:20
-msgid "Titre"
-msgstr ""
-
-#: templates/article/validation/index.html:62
-#: templates/tutorial/validation/index.html:51
-msgid "Auteur(s)"
-msgstr ""
-
-#: templates/article/validation/index.html:85
-#: templates/tutorial/member/index.html:81
-#: templates/tutorial/validation/index.html:74
-msgid "Aucune catégorie"
-msgstr ""
-
-#: templates/article/validation/index.html:108
-msgid "Aucun article soumis en validation"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:8
-msgid "Bonjour, membres du CA"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:12
-#, python-format
-msgid ""
-"\n"
-" Le membre %(username)s souhaiterait adhérer à %(asso_name)s.\n"
-" "
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:17
-#: templates/email/assoc/subscribe.txt:8
-msgid "Identité"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:18
-#: templates/email/assoc/subscribe.txt:9 zds/member/forms.py:95
-#: zds/pages/forms.py:23
-msgid "Adresse courriel"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:19
-#: templates/email/assoc/subscribe.txt:10 zds/pages/forms.py:28
-msgid "Date de naissance"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:20
-#: templates/email/assoc/subscribe.txt:11 zds/pages/forms.py:33
-msgid "Adresse"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:23
-#: templates/email/assoc/subscribe.txt:13
-msgid "Raison de cette demande"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:29
-msgid "Cliquez ici pour voir son profil sur le site"
-msgstr ""
-
-#: templates/email/assoc/subscribe.html:32
-#: templates/email/forgot_password/confirm.html:23
-#: templates/email/mp/new.html:17 templates/email/notification/new.html:17
-msgid "Cordialement"
-msgstr ""
-
-#: templates/email/assoc/subscribe.txt:2
-msgid "Bonjour, membres du CA !"
-msgstr ""
-
-#: templates/email/assoc/subscribe.txt:4
-#, python-format
-msgid ""
-"\n"
-"Le membre %(username)s demande à adhérer à %(asso_name)s !\n"
-msgstr ""
-
-#: templates/email/assoc/subscribe.txt:16
-msgid "Lien du profil sur le site"
-msgstr ""
-
-#: templates/email/assoc/subscribe.txt:18
-msgid "Cordialement,"
-msgstr ""
-
-#: templates/email/forgot_password/confirm.html:7
-#: templates/email/forgot_password/confirm.txt:2 templates/email/mp/new.html:7
-#: templates/email/mp/new.txt:2 templates/email/notification/new.html:7
-#: templates/email/notification/new.txt:2
-#: templates/email/register/confirm.html:7
-#: templates/email/register/confirm.txt:2
-msgid "Bonjour"
-msgstr ""
-
-#: templates/email/forgot_password/confirm.html:10
-#: templates/email/forgot_password/confirm.txt:4
-msgid ""
-"Vous recevez ce message parce qu'une réinitialisation du mot de passe de "
-"votre compte utilisateur a été demandée sur"
-msgstr ""
-
-#: templates/email/forgot_password/confirm.html:14
-msgid "ATTENTION"
-msgstr ""
-
-#: templates/email/forgot_password/confirm.html:16
-msgid ""
-"Si vous n'avez pas demandé une réinitialisation du mot de passe, IGNOREZ et "
-"EFFACEZ ce courriel immédiatement ! Continuez uniquement si vous souhaitez "
-"que votre mot de passe soit réinitialisé !"
-msgstr ""
-
-#: templates/email/forgot_password/confirm.html:19
-msgid ""
-"Cliquez ou recopiez simplement le lien et complétez le reste du formulaire"
-msgstr ""
-
-#: templates/email/forgot_password/confirm.html:25
-#: templates/email/mp/new.html:19 templates/email/notification/new.html:19
-msgid "L'équipe"
-msgstr ""
-
-#: templates/email/mp/new.html:10 templates/email/mp/new.txt:4
-msgid "vous a envoyé un message privé sur"
-msgstr ""
-
-#: templates/email/mp/new.html:13 templates/email/notification/new.html:13
-msgid "Pour le lire"
-msgstr ""
-
-#: templates/email/mp/new.html:13 templates/email/notification/new.html:13
-msgid "cliquez ici"
-msgstr ""
-
-#: templates/email/mp/new.txt:6 templates/email/notification/new.txt:6
-msgid "Pour le lire, cliquez ou recopiez l'url suivante"
-msgstr ""
-
-#: templates/email/notification/new.html:10
-#: templates/email/notification/new.txt:4
-msgid "a répondu au sujet"
-msgstr ""
-
-#: templates/email/notification/new.html:10
-#: templates/email/notification/new.txt:4
-msgid "que vous suivez sur"
-msgstr ""
-
-#: templates/email/register/confirm.html:11
-#, python-format
-msgid ""
-"\n"
-" Vous vous êtes inscrit sur "
-"%(site_name)s et nous vous en remercions.\n"
-" En étant membre de notre communauté, vous aurez la "
-"possibilité de rédiger des tutoriels et des articles\n"
-" que vous pourrez ensuite publier et ainsi de rendre vos "
-"connaissances accessibles au plus grand nombre.\n"
-" Vous pourrez également échanger avec les autres "
-"membres sur nos forums !\n"
-" \n"
-" Il ne vous reste plus qu'à activer votre profil ! Pour ce "
-"faire, visitez le lien ci-dessous :\n"
-" \n"
-" %(url)s\n"
-" \n"
-" \n"
-" A très bientôt !\n"
-" \n"
-" L'équipe %(site_name)s\n"
-" "
-msgstr ""
-
-#: templates/email/register/confirm.txt:4
-#, python-format
-msgid ""
-"\n"
-"Vous vous êtes inscrit sur %(site_name)s et nous vous en remercions. En "
-"étant membre de notre communauté, vous aurez la possibilité de rédiger des "
-"tutoriels et des articles que vous pourrez ensuite publier et ainsi rendre "
-"votre savoir accessible au plus grand nombre. Vous pourrez également "
-"échanger avec les autres membres sur nos forums !\n"
-"\n"
-"Il ne vous reste plus qu'à activer votre profil ! Pour ce faire, visitez le "
-"lien ci-dessous :\n"
-"\n"
-"%(url)s\n"
-"\n"
-"A très bientôt !\n"
-"L'équipe %(site_name)s\n"
-msgstr ""
-
-#: templates/forum/base.html:66 templates/forum/topic/followed.html:6
-#: templates/forum/topic/followed.html:12
-#: templates/forum/topic/followed.html:18
-msgid "Sujets suivis"
-msgstr ""
-
-#: templates/forum/base.html:83
-msgid "Ne plus suivre"
-msgstr ""
-
-#: templates/forum/base.html:119 templates/mp/index.html:36
-msgid "Non-lu"
-msgstr ""
-
-#: templates/forum/base.html:131
-#: templates/forum/includes/topic_row.part.html:69 templates/mp/index.html:63
-msgid "Dernière réponse"
-msgstr ""
-
-#: templates/forum/base.html:133
-#: templates/forum/includes/topic_row.part.html:78
-#: templates/member/profile.html:82 templates/misc/message.part.html:182
-#: templates/misc/message.part.html:194 templates/mp/index.html:72
-msgid "par"
-msgstr ""
-
-#: templates/forum/base.html:138
-#: templates/forum/includes/topic_row.part.html:82 templates/mp/index.html:76
-msgid "Aucune réponse"
-msgstr ""
-
-#: templates/forum/base.html:151
-msgid "Aucun sujet suivi"
-msgstr ""
-
-#: templates/forum/index.html:6 templates/forum/index.html.py:18
-#: templates/forum/index.html:24
-msgid "Liste des forums"
-msgstr ""
-
-#: templates/forum/index.html:12
-msgid ""
-"Les forums vous permettent de venir poser vos questions aux autres membres "
-"mais aussi de vous entraîner ou tout simplement de discuter"
-msgstr ""
-
-#: templates/forum/index.html:31
-msgid ""
-"\n"
-" Les forums vous permettent de venir poser vos questions aux autres \n"
-" membres mais aussi de s'entrainer ou tout simplement de "
-"discuter.\n"
-" Cela fonctionne également dans l'autre sens : vous pouvez ici aider "
-"les autres et \n"
-" proposer des exercices au reste de la communauté.\n"
-" "
-msgstr ""
-
-#: templates/forum/category/forum.html:8
-#: templates/forum/category/forum.html:38
-#: templates/forum/category/forum.html:51
-#: templates/forum/category/forum.html:113
-msgid "Sujets résolus"
-msgstr ""
-
-#: templates/forum/category/forum.html:10
-#: templates/forum/category/forum.html:40
-#: templates/forum/category/forum.html:53
-msgid "Sujets non-résolus"
-msgstr ""
-
-#: templates/forum/category/forum.html:12
-#: templates/forum/category/forum.html:42
-#: templates/forum/category/forum.html:55
-#: templates/forum/category/forum.html:127
-msgid "Sujets sans réponse"
-msgstr ""
-
-#: templates/forum/category/forum.html:69 templates/forum/topic/index.html:127
-#: templates/forum/topic/new.html:9 templates/forum/topic/new.html.py:15
-#: templates/forum/topic/new.html:31
-msgid "Nouveau sujet"
-msgstr ""
-
-#: templates/forum/category/forum.html:96
-msgid "Aucun sujet trouvé"
-msgstr ""
-
-#: templates/forum/category/forum.html:120
-msgid "Sujets non résolus"
-msgstr ""
-
-#: templates/forum/find/post.html:10 templates/forum/find/post.html.py:16
-msgid "Messages postés par"
-msgstr ""
-
-#: templates/forum/find/post.html:25 templates/member/profile.html:403
-msgid "Messages postés"
-msgstr ""
-
-#: templates/forum/find/post.html:26 templates/forum/find/topic.html:25
-#: templates/search/search.html:11 templates/search/search.html.py:17
-#: templates/search/search.html:23 templates/search/search.html.py:29
-#: templates/tutorial/member/beta.html:20
-#: templates/tutorial/member/online.html:19
-msgid "Recherche"
-msgstr ""
-
-#: templates/forum/find/post.html:39 templates/forum/find/topic.html:37
-msgid "Sujet"
-msgstr ""
-
-#: templates/forum/find/post.html:40 templates/forum/find/topic.html:38
-msgid "Quand"
-msgstr ""
-
-#: templates/forum/find/post.html:41 templates/forum/find/topic.html:39
-#: templates/tutorial/includes/chapter.part.html:66
-#: templates/tutorial/includes/chapter.part.html:75
-msgid "Extrait"
-msgstr ""
-
-#: templates/forum/find/post.html:66
-msgid "Aucun message n'a été posté par"
-msgstr ""
-
-#: templates/forum/find/topic.html:9 templates/forum/find/topic.html.py:15
-msgid "Sujets crées par"
-msgstr ""
-
-#: templates/forum/find/topic.html:24
-msgid "Sujets crées"
-msgstr ""
-
-#: templates/forum/find/topic.html:63
-msgid "Aucun sujet n'a été créé par"
-msgstr ""
-
-#: templates/forum/find/topic_by_tag.html:8
-#: templates/forum/find/topic_by_tag.html:14
-#: templates/forum/find/topic_by_tag.html:20
-msgid "Tag"
-msgstr ""
-
-#: templates/forum/includes/feed.part.html:5
-msgid "Nouveaux messages (RSS)"
-msgstr ""
-
-#: templates/forum/includes/feed.part.html:6
-msgid "Nouveaux messages (ATOM)"
-msgstr ""
-
-#: templates/forum/includes/feed.part.html:7
-msgid "Nouveaux sujets (RSS)"
-msgstr ""
-
-#: templates/forum/includes/feed.part.html:8
-msgid "Nouveaux sujets (ATOM)"
-msgstr ""
-
-#: templates/forum/includes/forums.part.html:42
-msgid "Aucun sujet"
-msgstr ""
-
-#: templates/forum/includes/topic_row.part.html:14
-msgid "Epinglé"
-msgstr ""
-
-#: templates/forum/includes/topic_row.part.html:17
-#: templates/forum/topic/index.html:12
-msgid "Résolu"
-msgstr ""
-
-#: templates/forum/includes/topic_row.part.html:20
-msgid "Fermé"
-msgstr ""
-
-#: templates/forum/includes/topic_row.part.html:41
-msgid "Par"
-msgstr ""
-
-#: templates/forum/includes/topic_row.part.html:60 templates/mp/index.html:55
-msgid "réponse"
-msgstr ""
-
-#: templates/forum/post/edit.html:9 templates/forum/post/edit.html.py:18
-#: templates/forum/post/edit.html:24 templates/mp/post/edit.html:8
-#: templates/mp/post/edit.html.py:15 templates/mp/post/edit.html:21
-msgid "Éditer un message"
-msgstr ""
-
-#: templates/forum/post/new.html:10 templates/forum/post/new.html.py:16
-#: templates/forum/post/new.html:25
-msgid "Répondre au sujet"
-msgstr ""
-
-#: templates/forum/topic/index.html:68
-msgid "L'auteur de ce sujet a trouvé une solution à son problème"
-msgstr ""
-
-#: templates/forum/topic/index.html:145
-msgid "Marquer comme non résolu"
-msgstr ""
-
-#: templates/forum/topic/index.html:147
-msgid "Marquer comme résolu"
-msgstr ""
-
-#: templates/forum/topic/index.html:164
-msgid "Ne plus suivre ce sujet"
-msgstr ""
-
-#: templates/forum/topic/index.html:166
-msgid "Suivre ce sujet"
-msgstr ""
-
-#: templates/forum/topic/index.html:181
-msgid "Ne plus être notifié par courriel"
-msgstr ""
-
-#: templates/forum/topic/index.html:183
-msgid "Être notifié par courriel"
-msgstr ""
-
-#: templates/forum/topic/index.html:195 templates/member/profile.html:420
-#: templates/member/profile.html.py:421
-msgid "Modération"
-msgstr ""
-
-#: templates/forum/topic/index.html:207
-msgid "Ouvrir le sujet"
-msgstr ""
-
-#: templates/forum/topic/index.html:209
-msgid "Fermer le sujet"
-msgstr ""
-
-#: templates/forum/topic/index.html:225
-msgid "Enlever du post-it"
-msgstr ""
-
-#: templates/forum/topic/index.html:227
-msgid "Marquer en post-it"
-msgstr ""
-
-#: templates/forum/topic/index.html:234
-msgid "Déplacer le sujet"
-msgstr ""
-
-#: templates/gallery/base.html:7 templates/gallery/base.html.py:13
-msgid "Galeries"
-msgstr ""
-
-#: templates/gallery/base.html:21 templates/gallery/gallery/list.html:66
-msgid "Créer une galerie"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:35
-msgid "Galerie partagée avec"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:40
-msgid "Lecture"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:42
-msgid "Écriture"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:52
-msgid "Ajouter un utilisateur"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:67
-#: templates/gallery/gallery/details.html:98
-msgid "Supprimer la sélection"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:71
-#: templates/gallery/gallery/details.html:102
-msgid "Vue grille"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:106
-#: templates/gallery/gallery/list.html:51
-msgid "Aucune image"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:109
-#, python-format
-msgid ""
-"\n"
-" Vous pouvez ajouter une "
-"image à cette galerie dès à présent !\n"
-" "
-msgstr ""
-
-#: templates/gallery/gallery/details.html:127
-#: templates/gallery/image/edit.html:72 templates/gallery/image/new.html:39
-msgid "Ajouter une image"
-msgstr ""
-
-#: templates/gallery/gallery/details.html:132
-#: templates/gallery/image/edit.html:77 templates/gallery/image/new.html:44
-msgid "Importer une archive"
-msgstr ""
-
-#: templates/gallery/gallery/list.html:6
-#: templates/gallery/gallery/list.html:12
-#: templates/gallery/gallery/list.html:18
-msgid "Liste des galeries"
-msgstr ""
-
-#: templates/gallery/gallery/list.html:53
-msgid "1 image"
-msgstr ""
-
-#: templates/gallery/gallery/list.html:55
-msgid "images"
-msgstr ""
-
-#: templates/gallery/gallery/list.html:65
-msgid "Vous n'avez pas encore de galerie"
-msgstr ""
-
-#: templates/gallery/gallery/list.html:80
-msgid "Supprimer les galeries sélectionnées"
-msgstr ""
-
-#: templates/gallery/gallery/list.html:85
-msgid ""
-"Attention, vous vous appretez à supprimer toutes les galeries sélectionnées"
-msgstr ""
-
-#: templates/gallery/gallery/new.html:8 templates/gallery/gallery/new.html:14
-#: templates/gallery/gallery/new.html:20
-msgid "Nouvelle galerie"
-msgstr ""
-
-#: templates/gallery/image/edit.html:9 templates/gallery/image/edit.html:22
-msgid "Éditer une image"
-msgstr ""
-
-#: templates/gallery/image/edit.html:16
-msgid "Éditer une Image"
-msgstr ""
-
-#: templates/gallery/image/edit.html:31
-msgid "Image"
-msgstr ""
-
-#: templates/gallery/image/edit.html:36 templates/gallery/image/edit.html:52
-msgid "Miniature"
-msgstr ""
-
-#: templates/gallery/image/edit.html:47
-msgid "Code markdown pour insérer cette image"
-msgstr ""
-
-#: templates/gallery/image/edit.html:49
-msgid "Taille normale"
-msgstr ""
-
-#: templates/gallery/image/edit.html:55
-msgid "Miniature + lien vers taille noramle"
-msgstr ""
-
-#: templates/gallery/image/new.html:8 templates/gallery/image/new.html:15
-#: templates/gallery/image/new.html:21
-msgid "Nouvelle image"
-msgstr ""
-
-#: templates/member/base.html:6 templates/member/base.html.py:12
-#: templates/member/base.html:18
-msgid "Membres"
-msgstr ""
-
-#: templates/member/index.html:6 templates/member/index.html.py:12
-#: templates/member/index.html:18
-msgid "Liste des membres"
-msgstr ""
-
-#: templates/member/index.html:25
-msgid ""
-"Sur cette page vous pourrez trouver la liste des membres inscrits au site "
-"(actuellement"
-msgstr ""
-
-#: templates/member/index.html:25
-msgid "membres"
-msgstr ""
-
-#: templates/member/login.html:13
-#: templates/member/register/token_success.html:11
-msgid "no-sidebar"
-msgstr ""
-
-#: templates/member/login.html:37
-#, python-format
-msgid ""
-"\n"
-" Si vous n'avez pas de compte, vous pouvez vous inscrire.\n"
-" "
-msgstr ""
-
-#: templates/member/login.html:44
-#: templates/member/forgot_password/index.html:7
-#: templates/member/forgot_password/index.html:13
-#: templates/member/forgot_password/index.html:19
-#: templates/member/forgot_password/success.html:6
-#: templates/member/forgot_password/success.html:12
-#: templates/member/forgot_password/success.html:18
-msgid "Mot de passe oublié"
-msgstr ""
-
-#: templates/member/login.html:47 templates/member/register/index.html:45
-msgid "Vous êtes déjà connecté"
-msgstr ""
-
-#: templates/member/profile.html:30
-msgid "Profil de"
-msgstr ""
-
-#: templates/member/profile.html:42
-msgid "Inscrit"
-msgstr ""
-
-#: templates/member/profile.html:45
-msgid "Dernière connexion"
-msgstr ""
-
-#: templates/member/profile.html:49
-msgid "Dernière IP"
-msgstr ""
-
-#: templates/member/profile.html:65
-msgid "E-mail"
-msgstr ""
-
-#: templates/member/profile.html:71
-msgid "Site web"
-msgstr ""
-
-#: templates/member/profile.html:78
-msgid "Remarques sur cet utilisateur"
-msgstr ""
-
-#: templates/member/profile.html:85
-msgid "Cet utilisateur n'a reçu aucune remarque"
-msgstr ""
-
-#: templates/member/profile.html:88
-msgid "Ajouter une remarque"
-msgstr ""
-
-#: templates/member/profile.html:96 templates/member/profile.html.py:249
-msgid "Signature"
-msgstr ""
-
-#: templates/member/profile.html:102
-msgid "Derniers sujets créés"
-msgstr ""
-
-#: templates/member/profile.html:135 templates/member/profile.html.py:277
-#: zds/member/forms.py:203
-msgid "Biographie"
-msgstr ""
-
-#: templates/member/profile.html:143 templates/member/profile.html.py:291
-#: templates/member/profile.html:292
-msgid "Activité"
-msgstr ""
-
-#: templates/member/profile.html:156 templates/member/profile.html.py:284
-msgid "Anciens tutoriels SdZ"
-msgstr ""
-
-#: templates/member/profile.html:160 templates/tutorial/export.html:15
-#: templates/tutorial/tutorial/import.html:63
-msgid "Tutoriel"
-msgstr ""
-
-#: templates/member/profile.html:172
-#, python-format
-msgid ""
-"\n"
-" Attention ! Vous êtes sur le "
-"point de supprimer le tutoriel \"%(tutotitle)s\".\n"
-" "
-msgstr ""
-
-#: templates/member/profile.html:195
-msgid "de mon compte"
-msgstr ""
-
-#: templates/member/profile.html:199
-msgid "Modifier le profil"
-msgstr ""
-
-#: templates/member/profile.html:204
-msgid "Promouvoir"
-msgstr ""
-
-#: templates/member/profile.html:216
-msgid "Envoyer un message privé"
-msgstr ""
-
-#: templates/member/profile.html:223
-msgid "Attribuer un tuto SdZ"
-msgstr ""
-
-#: templates/member/profile.html:227
-msgid "Choisissez un tutoriel du SdZ à attribuer au membre"
-msgstr ""
-
-#: templates/member/profile.html:238 templates/member/profile.html.py:239
-msgid "Accès rapide"
-msgstr ""
-
-#: templates/member/profile.html:243
-msgid "Informations générales"
-msgstr ""
-
-#: templates/member/profile.html:256
-msgid "Derniers sujets"
-msgstr ""
-
-#: templates/member/profile.html:300 templates/member/profile.html.py:357
-msgid "En ligne"
-msgstr ""
-
-#: templates/member/profile.html:308
-msgid "En version bêta"
-msgstr ""
-
-#: templates/member/profile.html:325 templates/member/profile.html.py:342
-#: templates/member/profile.html:370 templates/member/profile.html.py:383
-msgid "En rédaction"
-msgstr ""
-
-#: templates/member/profile.html:397
-msgid "Sujets créés"
-msgstr ""
-
-#: templates/member/profile.html:413
-msgid "Aucune activité"
-msgstr ""
-
-#: templates/member/profile.html:423
-msgid "Statistiques"
-msgstr ""
-
-#: templates/member/profile.html:427
-msgid "Messages modérés"
-msgstr ""
-
-#: templates/member/profile.html:433
-msgid "Alertes actives"
-msgstr ""
-
-#: templates/member/profile.html:439
-msgid "Sanctions"
-msgstr ""
-
-#: templates/member/profile.html:444
-msgid "Lecture seule temporaire"
-msgstr ""
-
-#: templates/member/profile.html:448
-msgid ""
-"\n"
-" Pour quelle raison souhaitez-vous mettre "
-"ce membre en lecture seule temporairement ?\n"
-" "
-msgstr ""
-
-#: templates/member/profile.html:462
-msgid "Lecture seule"
-msgstr ""
-
-#: templates/member/profile.html:466
-msgid "Pour quelle raison souhaitez-vous mettre ce membre en lecture seule"
-msgstr ""
-
-#: templates/member/profile.html:478
-msgid "Ôter la lecture seule"
-msgstr ""
-
-#: templates/member/profile.html:482
-msgid ""
-"\n"
-" Pour quelle raison souhaitez-vous "
-"lever la sanction de ce membre ?\n"
-" "
-msgstr ""
-
-#: templates/member/profile.html:498
-msgid "Bannir temporairement"
-msgstr ""
-
-#: templates/member/profile.html:502
-msgid ""
-"\n"
-" Pour quelle raison souhaitez-vous bannir "
-"ce membre temporairement ?\n"
-" "
-msgstr ""
-
-#: templates/member/profile.html:516
-msgid "Bannir définitivement"
-msgstr ""
-
-#: templates/member/profile.html:520
-msgid "Pour quelle raison souhaitez-vous bannir ce membre"
-msgstr ""
-
-#: templates/member/profile.html:532
-msgid "Ôter le bannissement"
-msgstr ""
-
-#: templates/member/profile.html:536
-msgid "Pour quelle raison souhaitez vous lever la sanction de ce membre"
-msgstr ""
-
-#: templates/member/forgot_password/index.html:30
-msgid ""
-"Si vous avez perdu votre mot de passe, vous pouvez utiliser ce formulaire "
-"pour le ré-initialiser. Saisissez votre identifiant ou votre adresse de "
-"courriel dans le champ ci-dessous"
-msgstr ""
-
-#: templates/member/forgot_password/index.html:33
-msgid ""
-"Une fois le formulaire envoyé, vous recevrez un courriel demandant la "
-"validation de cette requête pour s'assurer qu'aucune tentative d'abus n'a eu "
-"lieu. Ce courriel contiendra également un lien sur lequel vous devrez "
-"cliquer pour avoir plus d'instructions"
-msgstr ""
-
-#: templates/member/forgot_password/index.html:37
-#: templates/member/new_password/index.html:34
-msgid "Vous êtes connecté"
-msgstr ""
-
-#: templates/member/forgot_password/success.html:25
-msgid ""
-"Un courriel contenant de plus amples instructions d'activation a été envoyé. "
-"Ce courriel se trouve peut-être dans vos spams"
-msgstr ""
-
-#: templates/member/new_password/failed.html:6
-#: templates/member/new_password/failed.html:12
-msgid "Nouveau mot de passe raté"
-msgstr ""
-
-#: templates/member/new_password/failed.html:18
-#: templates/member/new_password/index.html:7
-#: templates/member/new_password/index.html:13
-#: templates/member/new_password/index.html:19
-#: templates/member/new_password/success.html:18 zds/member/forms.py:396
-msgid "Nouveau mot de passe"
-msgstr ""
-
-#: templates/member/new_password/failed.html:25
-msgid ""
-"Votre mot de passe n'a pas pu être modifié. A partir du moment où vous "
-"soumettez votre requête pour réinitialiser votre mot de passe, vous n'avez "
-"qu'une heure pour la confirmer"
-msgstr ""
-
-#: templates/member/new_password/failed.html:28
-msgid "Re-soumettre votre demande de réinitialisation"
-msgstr ""
-
-#: templates/member/new_password/index.html:30
-msgid "Renseignez votre nouveau mot de passe"
-msgstr ""
-
-#: templates/member/new_password/success.html:6
-#: templates/member/new_password/success.html:12
-msgid "Nouveau mot de passe réussi"
-msgstr ""
-
-#: templates/member/new_password/success.html:25
-msgid "Votre mot de passe a bien été modifié"
-msgstr ""
-
-#: templates/member/new_password/success.html:25
-msgid "Vous connectez"
-msgstr ""
-
-#: templates/member/register/index.html:32
-#, python-format
-msgid ""
-"\n"
-" Vous êtes sur le point de vous inscrire sur "
-"%(app_name)s. Si vous\n"
-" possédez déjà un compte, veuillez vous connecter.\n"
-" "
-msgstr ""
-
-#: templates/member/register/success.html:6
-#: templates/member/register/success.html:12
-#: templates/member/register/success.html:18
-msgid "Création du compte réussie"
-msgstr ""
-
-#: templates/member/register/success.html:25
-msgid ""
-"Votre compte a été créé avec succès. Vous allez recevoir un courriel "
-"contenant un lien d'activation. Veuillez cliquer sur celui-ci avant toute "
-"tentative de connexion"
-msgstr ""
-
-#: templates/member/register/token_already_used.html:6
-#: templates/member/register/token_already_used.html:12
-msgid "Compte déjà activé"
-msgstr ""
-
-#: templates/member/register/token_already_used.html:19
-msgid "Déjà activé"
-msgstr ""
-
-#: templates/member/register/token_already_used.html:27
-#, python-format
-msgid ""
-"\n"
-" Votre email a déjà été activé. Si vous avez oublié votre mot de "
-"passe, vous pouvez le retrouver ici.\n"
-" "
-msgstr ""
-
-#: templates/member/register/token_failed.html:6
-#: templates/member/register/token_failed.html:12
-#: templates/member/register/token_failed.html:19
-msgid "Jeton expiré"
-msgstr ""
-
-#: templates/member/register/token_failed.html:27
-#, python-format
-msgid ""
-"\n"
-" Désolé, votre de jeton de confirmation a expiré. Vous pouvez "
-"cependant le regénerer, pour cela, cliquer sur ce lien suivant: envoi de jeton.\n"
-" "
-msgstr ""
-
-#: templates/member/register/token_success.html:6
-#: templates/member/register/token_success.html:23
-msgid "Confirmation d'inscription réussie"
-msgstr ""
-
-#: templates/member/register/token_success.html:17 zds/member/forms.py:519
-msgid "Confirmation"
-msgstr ""
-
-#: templates/member/register/token_success.html:26
-msgid "Vous avez confirmé votre courriel sur le site"
-msgstr ""
-
-#: templates/member/register/token_success.html:29
-msgid "Vous pouvez maintenant vous connecter et partager avec tous les membres"
-msgstr ""
-
-#: templates/member/register/token_success.html:31
-msgid "Mot de passe déjà oublié"
-msgstr ""
-
-#: templates/member/settings/base.html:26
-msgid "Navigation"
-msgstr ""
-
-#: templates/member/settings/base.html:30
-#: templates/member/settings/user.html:7
-#: templates/member/settings/user.html:13
-#: templates/member/settings/user.html:19
-msgid "Pseudo et courriel"
-msgstr ""
-
-#: templates/member/settings/base.html:31
-msgid "Se désinscrire"
-msgstr ""
-
-#: templates/member/settings/memberip.html:6
-#: templates/member/settings/memberip.html:18
-msgid "Membres par IP"
-msgstr ""
-
-#: templates/member/settings/memberip.html:12
-msgid "IP"
-msgstr ""
-
-#: templates/member/settings/memberip.html:25
-msgid "Liste des membres dont la dernière IP est"
-msgstr ""
-
-#: templates/member/settings/memberip.html:37
-#, python-format
-msgid " \"le\" %(last_visit)s "
-msgstr ""
-
-#: templates/member/settings/promote.html:7
-#: templates/member/settings/promote.html:13
-#: templates/member/settings/promote.html:19
-msgid "Gestion des groupes"
-msgstr ""
-
-#: templates/member/settings/unregister.html:6
-msgid "Supression de compte"
-msgstr ""
-
-#: templates/member/settings/unregister.html:12
-#: templates/member/settings/unregister.html:18
-msgid "Désinscription"
-msgstr ""
-
-#: templates/member/settings/unregister.html:25
-#, python-format
-msgid ""
-"\n"
-" Attention %(username)s, 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 :\n"
-" "
-msgstr ""
-
-#: templates/member/settings/unregister.html:32
-msgid "Toutes vos conversations privées (MP) seront perdues"
-msgstr ""
-
-#: templates/member/settings/unregister.html:35
-msgid "Tous vos messages de forums seront anonymisés"
-msgstr ""
-
-#: templates/member/settings/unregister.html:38
-#, python-format
-msgid ""
-"\n"
-" Votre compte et tout ses détails seront supprimés, cela "
-"signifie que l'adresse courriel (%(email)s) sera effacée du système et votre "
-"pseudo (%(username)s) sera libéré et utilisable par un autre membre ;\n"
-" "
-msgstr ""
-
-#: templates/member/settings/unregister.html:43
-msgid ""
-"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"
-msgstr ""
-
-#: templates/member/settings/unregister.html:46
-msgid "Vos tutoriels et articles publiés subiront les modifications suivantes"
-msgstr ""
-
-#: templates/member/settings/unregister.html:49
-msgid ""
-"\n"
-" 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 ;\n"
-" "
-msgstr ""
-
-#: templates/member/settings/unregister.html:54
-msgid ""
-"si vous étiez plusieurs auteurs, vous quitterez le groupe de rédacteurs. Les "
-"autres pourront dès lors continuer sans vous"
-msgstr ""
-
-#: templates/member/settings/unregister.html:62
-msgid ""
-" Si vous souhaitez poursuivre votre désinscription, cliquez sur le bouton "
-"Me désinscrire ci-dessous. Sinon il n'est pas encore trop tard "
-msgstr ""
-
-#: templates/member/settings/unregister.html:66
-#: templates/member/settings/unregister.html:80
-msgid "Me désinscrire"
-msgstr ""
-
-#: templates/member/settings/unregister.html:76
-msgid "C'est votre dernière chance de rester parmi nous"
-msgstr ""
-
-#: templates/misc/badge.part.html:7
-msgid "Banni"
-msgstr ""
-
-#: templates/misc/badge.part.html:9
-msgid "LS"
-msgstr ""
-
-#: templates/misc/badge.part.html:11
-msgid "Staff"
-msgstr ""
-
-#: templates/misc/message.part.html:39
-msgid "Auteur du sujet"
-msgstr ""
-
-#: templates/misc/message.part.html:50
-msgid "Masquer"
-msgstr ""
-
-#: templates/misc/message.part.html:56
-msgid "Pour quelle raison souhaitez vous masquer ce message"
-msgstr ""
-
-#: templates/misc/message.part.html:61
-msgid ""
-"Attention, en masquant ce message, vous ne pourrez plus l'afficher vous "
-"même. Êtes vous certains de vouloir le faire"
-msgstr ""
-
-#: templates/misc/message.part.html:86 templates/misc/message.part.html:96
-msgid "Signaler"
-msgstr ""
-
-#: templates/misc/message.part.html:91
-msgid "Pour quelle raison signalez-vous ce message"
-msgstr ""
-
-#: templates/misc/message.part.html:93
-msgid "Minimum 3 caractères pour signaler"
-msgstr ""
-
-#: templates/misc/message.part.html:106
-msgid "Citer"
-msgstr ""
-
-#: templates/misc/message.part.html:113
-msgid "Voir"
-msgstr ""
-
-#: templates/misc/message.part.html:118
-msgid "Démasquer"
-msgstr ""
-
-#: templates/misc/message.part.html:123
-#, python-format
-msgid ""
-"\n"
-" Ce message a été masqué par "
-"%(editor)s, êtes vous certains de vouloir le ré-afficher ?\n"
-" "
-msgstr ""
-
-#: templates/misc/message.part.html:152
-msgid "Reprise du dernier message de la page précédente"
-msgstr ""
-
-#: templates/misc/message.part.html:157
-msgid "Cette réponse a aidé l'auteur du sujet"
-msgstr ""
-
-#: templates/misc/message.part.html:173
-msgid "Masqué par"
-msgstr ""
-
-#: templates/misc/message.part.html:180
-msgid "Édité"
-msgstr ""
-
-#: templates/misc/message.part.html:198
-msgid "Résoudre"
-msgstr ""
-
-#: templates/misc/message.part.html:204
-msgid "Résoudre l'alerte"
-msgstr ""
-
-#: templates/misc/message_form.html:7
-msgid "Ce sujet est verrouillé"
-msgstr ""
-
-#: templates/misc/message_form.html:11
-msgid "Vous devez être connecté pour pouvoir poster un message"
-msgstr ""
-
-#: templates/misc/message_form.html:17
-msgid ""
-"Créez un compte en une minute pour profiter pleinement de toutes les "
-"fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité"
-msgstr ""
-
-#: templates/misc/message_form.html:18
-msgid "Créer un compte"
-msgstr ""
-
-#: templates/misc/message_form.html:23
-msgid ""
-"Vous venez de poster. Merci de patienter au moins 15 minutes entre deux "
-"messages consécutifs afin de limiter le flood"
-msgstr ""
-
-#: templates/misc/message_form.html:27
-msgid "Vous êtes seul dans cette conversation"
-msgstr ""
-
-#: templates/misc/message_form.html:54 zds/utils/forms.py:22
-#: zds/utils/forms.py:46
-msgid "Aperçu"
-msgstr ""
-
-#: templates/misc/message_form.html:62 zds/member/forms.py:494
-#: zds/member/forms.py:536 zds/utils/forms.py:18 zds/utils/forms.py:42
-msgid "Envoyer"
-msgstr ""
-
-#: templates/misc/pagination.part.html:18
-msgid "Précédente"
-msgstr ""
-
-#: templates/misc/pagination.part.html:40
-#: templates/misc/pagination.part.html:53
-msgid "Aller à la page"
-msgstr ""
-
-#: templates/misc/pagination.part.html:49
-msgid "Indiquez la page à laquelle vous souhaitez vous rendre"
-msgstr ""
-
-#: templates/misc/pagination.part.html:64
-msgid "Suivante"
-msgstr ""
-
-#: templates/misc/previsualization.part.html:6
-msgid "Prévisualisation de votre message"
-msgstr ""
-
-#: templates/misc/validation.part.html:19
-msgid "Réservé par"
-msgstr ""
-
-#: templates/misc/validation.part.html:34
-msgid "Actuellement réservé par"
-msgstr ""
-
-#: templates/misc/validation.part.html:35
-msgid ""
-"\n"
-" Êtes-vous certains de vouloir annuler la "
-"réservation ?\n"
-" "
-msgstr ""
-
-#: templates/misc/validation.part.html:44
-msgid "Accepté"
-msgstr ""
-
-#: templates/misc/validation.part.html:48
-msgid "Commentaire du validateur"
-msgstr ""
-
-#: templates/misc/validation.part.html:57
-msgid "Rejeté"
-msgstr ""
-
-#: templates/misc/validation.part.html:61
-msgid "Motif du rejet"
-msgstr ""
-
-#: templates/mp/base.html:7 templates/mp/base.html.py:19
-msgid "Messagerie Privée"
-msgstr ""
-
-#: templates/mp/base.html:13
-msgid "Messagerie"
-msgstr ""
-
-#: templates/mp/base.html:25
-msgid "active"
-msgstr ""
-
-#: templates/mp/base.html:33 templates/mp/post/edit.html:56
-msgid "Nouvelle conversation"
-msgstr ""
-
-#: templates/mp/index.html:9 templates/mp/index.html.py:15
-#: templates/mp/index.html:21
-msgid "Liste des conversations"
-msgstr ""
-
-#: templates/mp/index.html:42 templates/mp/topic/index.html:36
-msgid "Participant"
-msgstr ""
-
-#: templates/mp/index.html:95
-msgid "Supprimer les conversations sélectionnées"
-msgstr ""
-
-#: templates/mp/index.html:100
-msgid ""
-"Attention, vous vous appretez à supprimer toutes les conversations "
-"sélectionnées"
-msgstr ""
-
-#: templates/mp/post/edit.html:60 templates/mp/topic/index.html:49
-#: templates/mp/topic/index.html.py:100
-msgid "Ajouter un membre"
-msgstr ""
-
-#: templates/mp/post/edit.html:63
-msgid "Vous allez rajouter un nouveau membre dans la conversation privé"
-msgstr ""
-
-#: templates/mp/post/edit.html:69 templates/mp/topic/index.html:110
-#: zds/gallery/forms.py:93 zds/gallery/forms.py:138
-msgid "Ajouter"
-msgstr ""
-
-#: templates/mp/post/edit.html:76 zds/mp/forms.py:16
-msgid "Participants"
-msgstr ""
-
-#: templates/mp/post/new.html:9 templates/mp/post/new.html.py:16
-#: templates/mp/post/new.html:22
-msgid "Répondre au MP"
-msgstr ""
-
-#: templates/mp/post/new.html:36
-msgid ""
-"\n"
-" Au moins un nouveau message a été posté dans la "
-"discussion\n"
-" pendant que vous rédigiez le votre.\n"
-" "
-msgstr ""
-
-#: templates/mp/topic/index.html:104
-msgid "Vous allez rajouter un nouveau membre dans la conversation privée"
-msgstr ""
-
-#: templates/mp/topic/index.html:117
-msgid "Quitter la conversation"
-msgstr ""
-
-#: templates/mp/topic/index.html:121
-msgid ""
-"Attention, vous vous apprêtez à quitter définitivement cette conversation"
-msgstr ""
-
-#: templates/mp/topic/new.html:8 templates/mp/topic/new.html.py:14
-#: templates/mp/topic/new.html:20
-msgid "Nouvelle conversation privée"
-msgstr ""
-
-#: templates/pages/about.html:25
-#, python-format
-msgid ""
-"\n"
-" Si vous vous intéressez à tout cela, vous devriez songer à contribuer au développement du site !\n"
-" "
-msgstr ""
-
-#: templates/pages/about.html:33
-msgid "Droits"
-msgstr ""
-
-#: templates/pages/about.html:36
-#, python-format
-msgid ""
-"\n"
-" %(site_name)s est un site donc le code source "
-"est sous licence %(src_code)s, et "
-"provient en partie de %(provider_name)s.\n"
-" "
-msgstr ""
-
-#: templates/pages/about.html:43
-#, python-format
-msgid ""
-"\n"
-" Le logo de %(site_name)s a été "
-"créé par %(author_logo)s et est sous\n"
-" \n"
-" \n"
-" \t %(logo_desc)s\n"
-" \n"
-" "
-msgstr ""
-
-#: templates/pages/about.html:57
-msgid "Système / Back-end"
-msgstr ""
-
-#: templates/pages/about.html:59
-msgid "Le Back-end est propulsé par les outils suivants"
-msgstr ""
-
-#: templates/pages/about.html:62
-msgid "Site"
-msgstr ""
-
-#: templates/pages/about.html:74
-msgid "Base de données"
-msgstr ""
-
-#: templates/pages/about.html:81
-msgid "Front-end"
-msgstr ""
-
-#: templates/pages/about.html:83
-msgid "Le front-end utilise les outils suivants"
-msgstr ""
-
-#: templates/pages/about.html:86
-msgid "Feuilles de style"
-msgstr ""
-
-#: templates/pages/alerts.html:8 templates/pages/alerts.html.py:14
-#: templates/pages/alerts.html:20
-msgid "Liste des alertes en cours"
-msgstr ""
-
-#: templates/pages/alerts.html:28
-msgid "Type"
-msgstr ""
-
-#: templates/pages/alerts.html:31
-msgid "Message"
-msgstr ""
-
-#: templates/pages/alerts.html:32
-msgid "Sur un message de"
-msgstr ""
-
-#: templates/pages/alerts.html:41
-#, python-format
-msgid " posté le %(timing)s "
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:7
-#: templates/pages/assoc_subscribe.html:13
-#: templates/pages/assoc_subscribe.html:19
-msgid "Adhérer à l'association"
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:25
-msgid "Pourquoi adhérer"
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:27
-#, python-format
-msgid ""
-"\n"
-" Adhérer à l'association %(asso_name)s permet de nous soutenir de "
-"manière concrète et d'officialiser votre engagement.\n"
-" "
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:32
-#, python-format
-msgid ""
-"\n"
-" D'autre part, le financement des activités de l'association, "
-"dont bien sûr le site, est intégralement assuré par\n"
-" les cotisations des membres : adhérer vous permet ainsi "
-"d'assurer la pérennité du site. La cotisation, pour\n"
-" l'année 2014, est de %(asso_fee)s (le montant "
-"sera révisé tous les ans). Si pour une raison quelconque\n"
-" vous ne pouvez pas payer cette cotisation, faites-en nous part, "
-"nous pouvons accorder des dérogations\n"
-" exceptionnelles.\n"
-" "
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:41
-msgid "Notez que l'adhésion est subordonnée au paiement de cette cotisation"
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:44
-msgid ""
-"Adhérer permet bien entendu de participer à l'Assemblée Générale annuelle de "
-"l'association, qui élit le Conseil d'Administration. Si vous avez des idées "
-"pour faire avancer l'association et donc le site, c'est le moment"
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:47
-msgid ""
-"\n"
-" Une précision importante : adhérer à l'association ne "
-"vous apporte rien sur le site. L'adhésion\n"
-" n'est là que pour soutenir le projet, et ne donne droit à aucun "
-"pouvoir ou badge supplémentaires. Elle ne donne\n"
-" même pas accès à un forum secret, puisque le forum de "
-"l'association est public !\n"
-" "
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:54
-msgid ""
-"Enfin, toutes les fonctionnalités du site sont disponibles à tous : aucune "
-"n'est conditionnée à l'adhésion à l'association"
-msgstr ""
-
-#: templates/pages/assoc_subscribe.html:57
-msgid "Formulaire d'adhésion"
-msgstr ""
-
-#: templates/pages/association.html:24
-msgid "Présentation de l'association"
-msgstr ""
-
-#: templates/pages/association.html:26
-#, python-format
-msgid ""
-"\n"
-" %(asso_name)s est une association loi 1901 (association à but "
-"non lucratif) et joue le rôle de structure\n"
-" légale du site %(site_url)s, dont le but est de promouvoir le "
-"partage de connaissances à travers des\n"
-" ressources pédagogiques gratuites et de préférence sous licence "
-"libre.\n"
-" \n"
-" Parue au Journal officiel le 19 avril 2014, "
-"l'association a tenu sa première assemblée générale le 15 mars\n"
-" 2014, au cours de laquelle ont été élus le bureau et le conseil "
-"d'administration en présence des quatorze membres "
-"fondateurs.\n"
-" "
-msgstr ""
-
-#: templates/pages/association.html:36
-msgid ""
-"Ces membres fondateurs sont tous des anciens membres très actifs du feu "
-"siteduzero, un site de diffusion de connaissances et d'entraide. À la suite "
-"du changement de politique de ce dernier, ils ont décidé de recréer une "
-"plateforme sur laquelle ils pourraient à nouveau s'entraider et partager "
-"convenablement leurs connaissances et surtout retrouver l'esprit "
-"communautaire qu'ils aimaient tant"
-msgstr ""
-
-#: templates/pages/association.html:39
-#, python-format
-msgid ""
-"\n"
-" Voilà l'histoire de %(asso_name)s.\n"
-" "
-msgstr ""
-
-#: templates/pages/association.html:44
-msgid "L'association et le site"
-msgstr ""
-
-#: templates/pages/association.html:46
-msgid ""
-"\n"
-" Adhérer à l'association ne vous apporte rien sur le "
-"site. L'adhésion n'est là que pour soutenir\n"
-" le projet, et ne donne droit à aucun pouvoir ou badge "
-"supplémentaire. Elle ne donne même pas accès à un forum\n"
-" secret, puisque le forum de l'association est public !\n"
-" "
-msgstr ""
-
-#: templates/pages/association.html:53
-msgid ""
-"De même, toutes les fonctionnalités du site sont disponibles à tous : aucune "
-"n'est conditionné à l'adhésion à l'association"
-msgstr ""
-
-#: templates/pages/association.html:56
-msgid "Notez que vous devez être inscrit pour pouvoir adhérer"
-msgstr ""
-
-#: templates/pages/base.html:6 templates/pages/index.html:6
-#: templates/pages/index.html.py:18
-msgid "Pages"
-msgstr ""
-
-#: templates/pages/contact.html:24
-msgid "L'équipe de communication"
-msgstr ""
-
-#: templates/pages/contact.html:26
-#, python-format
-msgid ""
-"\n"
-" Vous pouvez à tout moment joindre l'équipe de communication de "
-"%(site_name)s par courriel via %(email_contact)s\n"
-" "
-msgstr ""
-
-#: templates/pages/contact.html:33
-#, python-format
-msgid ""
-"\n"
-" Vous pouvez joindre l'association par courriel via "
-"%(email_association)s\n"
-" "
-msgstr ""
-
-#: templates/pages/contact.html:39
-msgid "Le staff"
-msgstr ""
-
-#: templates/pages/contact.html:41
-#, python-format
-msgid ""
-"\n"
-" Le staff est constitué de certains membres du site dont le but "
-"est de contrôler le contenu publié sur %(site_name)s. Ils sont en charge de "
-"la modération des messages sur les forums et commentaires, ainsi que de la "
-"validation et publication d'articles et/ou de tutoriels de %(site_name)s.\n"
-" Les membres faisant partie du Staff sont les suivants :\n"
-" "
-msgstr ""
-
-#: templates/pages/contact.html:56
-msgid "L'équipe technique"
-msgstr ""
-
-#: templates/pages/contact.html:58
-#, python-format
-msgid ""
-"\n"
-" L'équipe technique est constituée de certains membres du site "
-"dont le but est d'une part de s'assurer que le site reste toujours "
-"disponible en ligne, et d'autre part de corriger les bogues rencontrés sur "
-"le site.\n"
-" Des administrateurs systèmes, jusqu'aux designeurs, en passant "
-"par les développeurs back-end et intégrateurs front-end, ils s'occupent "
-"aussi de la maintenance du dépôt officiel du "
-"projet. Les membres faisant partie de l'équipe technique sont les "
-"suivants :\n"
-" "
-msgstr ""
-
-#: templates/pages/cookies.html:6 templates/pages/cookies.html.py:12
-#: templates/pages/cookies.html:18
-msgid "À propos des cookies"
-msgstr ""
-
-#: templates/pages/cookies.html:24
-msgid "Qu'est-ce qu'un cookie"
-msgstr ""
-
-#: templates/pages/cookies.html:26
-msgid ""
-"\n"
-" Un cookie (aussi appelé témoin de "
-"connexion ou témoin au Québec) est un petit bout "
-"de texte envoyé par le serveur web au navigateur, et renvoyé à l'identique "
-"par le navigateur au serveur.\n"
-" "
-msgstr ""
-
-#: templates/pages/cookies.html:30
-msgid ""
-"Les cookies ne sont ni des logiciels espions ni des virus, puisqu'ils ne "
-"sont en réalité que de simples fichiers textes et ne peuvent en aucun cas "
-"être exécutés"
-msgstr ""
-
-#: templates/pages/cookies.html:32
-#, python-format
-msgid ""
-"\n"
-" Pour plus de détails sur ce qu'est un cookie, voyez le site de la "
-"CNIL ou Wikipédia.\n"
-" "
-msgstr ""
-
-#: templates/pages/cookies.html:37
-msgid "À quoi servent les cookies"
-msgstr ""
-
-#: templates/pages/cookies.html:38
-msgid ""
-"Les cookies se répartissent en deux grands types : les impératifs techniques "
-"et la mesure d'audience"
-msgstr ""
-
-#: templates/pages/cookies.html:39
-msgid ""
-"En aucun cas les cookies servent à recueillir des "
-"renseignements personnels, transmettre des données sensibles ou transmettre "
-"des données personnelles à des tiers."
-msgstr ""
-
-#: templates/pages/cookies.html:41 templates/pages/cookies.html.py:63
-msgid "Cookies techniques"
-msgstr ""
-
-#: templates/pages/cookies.html:42
-msgid ""
-"Certaines fonctionnalités du site nécessitent des cookies pour pouvoir être "
-"opérationnelles. L'exemple typique est la connexion aux parties privées de"
-msgstr ""
-
-#: templates/pages/cookies.html:43
-msgid "La liste complète des cookies techniques utilisés sur"
-msgstr ""
-
-#: templates/pages/cookies.html:43
-msgid "et leur utilité est détaillée un peu plus bas"
-msgstr ""
-
-#: templates/pages/cookies.html:44
-#, python-format
-msgid ""
-"Ces cookies, purement techniques, sont indispensables au "
-"fonctionnement de %(site_name)s. Si vous les refusez, les éléments "
-"qui en dépendent ne fonctionneront tout simplement pas !"
-msgstr ""
-
-#: templates/pages/cookies.html:46 templates/pages/cookies.html.py:73
-msgid "Cookies d'analyse d'audience"
-msgstr ""
-
-#: templates/pages/cookies.html:47
-#, python-format
-msgid ""
-" %(site_name)s analyse son audience. Que signifie ce terme barbare ? Tout "
-"simplement que nous étudions la manière dont le site est utilisé :"
-msgstr ""
-
-#: templates/pages/cookies.html:49
-msgid "Quelles fonctionnalités sont utilisées"
-msgstr ""
-
-#: templates/pages/cookies.html:50
-msgid "quelle fréquence"
-msgstr ""
-
-#: templates/pages/cookies.html:51
-msgid "D'où viennent nos utilisateurs ? (oui, c'est de vous dont je parle"
-msgstr ""
-
-#: templates/pages/cookies.html:52
-msgid "Comment naviguent-ils dans le site"
-msgstr ""
-
-#: templates/pages/cookies.html:53
-msgid "Etc"
-msgstr ""
-
-#: templates/pages/cookies.html:55
-msgid "quoi cela peut-il bien servir"
-msgstr ""
-
-#: templates/pages/cookies.html:55
-msgid "allez-vous me demander avec sagacit"
-msgstr ""
-
-#: templates/pages/cookies.html:56
-msgid ""
-"Tout simplement à améliorer l'expérience utilisateur du site"
-"strong>. Les développeurs, aussi ingénieux soient-ils, ne peuvent "
-"jamais deviner l'utilisation réelle qui sera faite du "
-"site. Telle ou telle fonctionnalité qui leur paraîtra mineure sera en fait "
-"utilisée par une grande majorité, ou telle autre qui leur paraissait "
-"cruciale sera ignorée. "
-msgstr ""
-
-#: templates/pages/cookies.html:57
-msgid ""
-"Le seul moyen fiable de savoir ce qui est réellement utilisé - et "
-"donc ce qu'il faut travailler - est d'analyser l'audience réelle. "
-msgstr ""
-
-#: templates/pages/cookies.html:58
-msgid ""
-"Ceci implique de suivre les utilisateurs à travers le site, ce qui se fait "
-"grâce à un cookie dédié;"
-msgstr ""
-
-#: templates/pages/cookies.html:59
-msgid ""
-"C'est cette analyse qui peut être désactivée, puisqu'elle n'est pas "
-"strictement indispensable au bon fonctionnement du site"
-msgstr ""
-
-#: templates/pages/cookies.html:61
-msgid "Les cookies sur ce site"
-msgstr ""
-
-#: templates/pages/cookies.html:62
-#, python-format
-msgid ""
-" Pour être tout à fait précis, %(site_name)s utilise les cookies suivants :"
-msgstr ""
-
-#: templates/pages/cookies.html:66
-#, python-format
-msgid ""
-" Ce cookie est un identifiant unique qui permet de faire le lien entre votre "
-"session de navigation et les différentes pages que vous visitez. Il permet "
-"en particulier de vous connecter à %(site_name)s. Il ne contient qu'une "
-"chaîne de caractères aléatoires."
-msgstr ""
-
-#: templates/pages/cookies.html:68
-msgid ""
-"Ce cookie contient une chaîne de caractères aléatoires qui permet de se "
-"prémunir des attaques CSRF. Composant indispensable de la sécurité du "
-"site, vous ne pourrez rien poster sans ce cookie. "
-msgstr ""
-
-#: templates/pages/cookies.html:70
-msgid ""
-"Ce cookie indique si vous acceptez l'analyse d'audience. Il peut prendre les "
-"valeurs true (analyse acceptée) ou false (analyse refusée)."
-msgstr ""
-
-#: templates/pages/cookies.html:76
-msgid ""
-"Ces cookies sont les cookies d'analyse d'audience de Google Analytics. Leur présence et leur "
-"contenu exact est géré par Google Analytics."
-msgstr ""
-
-#: templates/pages/cookies.html:79
-msgid "Comment refuser les cookies tiers"
-msgstr ""
-
-#: templates/pages/cookies.html:80
-msgid "Refus pur et simple des cookies tiers dans le navigateur"
-msgstr ""
-
-#: templates/pages/cookies.html:81
-msgid ""
-" Vous pouvez bloquer purement et simplement les cookies tiers"
-"strong> dans votre navigateur, en suivant la procédure décrite sur le site de la CNIL dans le Conseil 1."
-msgstr ""
-
-#: templates/pages/cookies.html:82
-#, python-format
-msgid ""
-"Cette manœuvre n'empêchera pas %(site_name)s de fonctionner, puisque "
-"les cookies techniques ne sont pas des cookies tiers."
-msgstr ""
-
-#: templates/pages/cookies.html:83
-msgid ""
-"Toutefois, devant le manque de finesse de contrôle d'une telle solution, "
-"vous pourriez préférer utiliser une solution présentée au paragraphe suivant"
-msgstr ""
-
-#: templates/pages/cookies.html:85
-msgid "Utilisation d'un logiciel 'anti-espions' "
-msgstr ""
-
-#: templates/pages/cookies.html:86
-msgid ""
-"Il existe différents logiciels \"anti-espions\", qui empêchent "
-"l'installation des cookies d'analyse d'audience, et bien d'autres encore."
-msgstr ""
-
-#: templates/pages/cookies.html:87
-msgid ""
-"La CNIL indique quelles solutions sont disponibles avec "
-"votre navigateur, dans son Conseil 2."
-msgstr ""
-
-#: templates/pages/cookies.html:89
-msgid "Licence de cette page"
-msgstr ""
-
-#: templates/pages/cookies.html:93
-#, python-format
-msgid ""
-"\n"
-" \n"
-" À propos des "
-"cookies de %(site_name)s est mis à "
-"disposition selon les termes de la %(cook_descr)s.\n"
-" "
-msgstr ""
-
-#: templates/pages/cookies.html:100
-#, python-format
-msgid ""
-"\n"
-" \n"
-" À propos des "
-"cookies de Zeste de Savoir est mis à disposition selon les termes de la licence "
-"Creative Commons Attribution 4.0 International.\n"
-" "
-msgstr ""
-
-#: templates/pages/cookies.html:106
-msgid ""
-"N'oubliez pas d'adapter les cookies réellement utilisés à votre cas si vous "
-"reprenez cette page"
-msgstr ""
-
-#: templates/pages/cookies.html:110
-msgid "Une recette de cookies"
-msgstr ""
-
-#: templates/pages/cookies.html:111
-msgid ""
-"Puisque vous avez réussi à trouver cette page et que vous avez eu le courage "
-"de lire jusqu'ici, vous avez bien droit à une récompense : une recette de "
-"cookies"
-msgstr ""
-
-#: templates/pages/cookies.html:112
-msgid "Ingrédients"
-msgstr ""
-
-#: templates/pages/cookies.html:113
-msgid "Pour 30 cookies environ (parce que c'est bon, on va en faire plein"
-msgstr ""
-
-#: templates/pages/cookies.html:115
-msgid "500 g de farine"
-msgstr ""
-
-#: templates/pages/cookies.html:116
-msgid "250 g de beurre"
-msgstr ""
-
-#: templates/pages/cookies.html:117
-msgid "300 g de chocolat à pâtisser"
-msgstr ""
-
-#: templates/pages/cookies.html:118
-msgid "200 g de cassonade, ou à défaut de sucre roux"
-msgstr ""
-
-#: templates/pages/cookies.html:119
-msgid "2œufs"
-msgstr ""
-
-#: templates/pages/cookies.html:120
-msgid "2 sachets de sucre vanillé"
-msgstr ""
-
-#: templates/pages/cookies.html:121
-msgid "1 pincée de sel"
-msgstr ""
-
-#: templates/pages/cookies.html:122
-msgid "1 sachet de levure"
-msgstr ""
-
-#: templates/pages/cookies.html:124
-msgid "Préparation : 10 minutes"
-msgstr ""
-
-#: templates/pages/cookies.html:125
-msgid "Cuisson : 10 minutes"
-msgstr ""
-
-#: templates/pages/cookies.html:126
-msgid "Préparation"
-msgstr ""
-
-#: templates/pages/cookies.html:127
-msgid ""
-"Avec un grand couteau bien aiguisé, découpez le chocolat en petits morceaux"
-msgstr ""
-
-#: templates/pages/cookies.html:128
-msgid ""
-"Dans un grand saladier, mélangez la farine, la cassonade, le sucre vanillé, "
-"la levure et le sel"
-msgstr ""
-
-#: templates/pages/cookies.html:129
-msgid ""
-"Faites fondre le beurre, ajoutez-y les œufs. Incorporez le tout à la "
-"préparation"
-msgstr ""
-
-#: templates/pages/cookies.html:130
-msgid "Ajoutez les morceaux de chocolat et mélangez avec soin"
-msgstr ""
-
-#: templates/pages/cookies.html:131
-msgid "Cuisson"
-msgstr ""
-
-#: templates/pages/cookies.html:132
-msgid ""
-"Préchauffez votre four à 220°C / thermostat 7-8, grille en position basse"
-msgstr ""
-
-#: templates/pages/cookies.html:133
-msgid ""
-"Façonnez des cookies d'environ 10 cm de côté sur la plaque recouverte de "
-"papier sulfurisé. Attention, espacez-les parce qu'ils s'étalent à la cuisson"
-msgstr ""
-
-#: templates/pages/cookies.html:134
-msgid ""
-"Enfournez-les environ 10 minutes, ils sont cuits lorsqu'ils prennent une "
-"belle couleur dorée"
-msgstr ""
-
-#: templates/pages/cookies.html:135
-msgid "Conseils divers"
-msgstr ""
-
-#: templates/pages/cookies.html:136
-msgid ""
-"Si vous avez la flemme de découper le chocolat, vous pouvez utiliser des "
-"pépites de chocolat mais en général c'est moins bon. Surtout pas de chocolat "
-"à déguster : ces chocolats manquent de sucre pour la patisserie"
-msgstr ""
-
-#: templates/pages/cookies.html:137
-msgid ""
-"La cuisson parfaite se joue à quelques secondes près (sérieusement), alors "
-"surveillez-les bien ! Un SMS de trop, et vous obtenez des cookies en béton. "
-"Ce qui serait dommage"
-msgstr ""
-
-#: templates/pages/cookies.html:138
-msgid ""
-" On peut faire des cookies à beaucoup de parfums, mais le must "
-"reste le cookie au chocolat\" "
-msgstr ""
-
-#: templates/pages/index.html:12
-msgid "Liste des pages"
-msgstr ""
-
-#: templates/pages/index.html:25
-msgid "Conditions générales d utilisation"
-msgstr ""
-
-#: templates/pages/index.html:32
-msgid "Les cookies"
-msgstr ""
-
-#: templates/search/search.html:36
-msgid "Résultats"
-msgstr ""
-
-#: templates/search/search.html:43
-msgid "Filtrer les résultats"
-msgstr ""
-
-#: templates/search/search.html:53
-msgid "Rechercher"
-msgstr ""
-
-#: templates/search/search.html:151
-msgid "Aucun résultat trouvé"
-msgstr ""
-
-#: templates/tutorial/base.html:66
-msgid "Markdown"
-msgstr ""
-
-#: templates/tutorial/base.html:74
-msgid "HTML"
-msgstr ""
-
-#: templates/tutorial/base.html:81
-msgid "PDF"
-msgstr ""
-
-#: templates/tutorial/base.html:88
-msgid "EPUB"
-msgstr ""
-
-#: templates/tutorial/export.html:17
-msgid "étendu"
-msgstr ""
-
-#: templates/tutorial/export.html:19
-msgid "rédigé par"
-msgstr ""
-
-#: templates/tutorial/export.html:23
-msgid "et"
-msgstr ""
-
-#: templates/tutorial/export.html:49
-msgid "Aucune introduction"
-msgstr ""
-
-#: templates/tutorial/export.html:63 templates/tutorial/part/view.html:155
-#: templates/tutorial/part/view.html:170
-#: templates/tutorial/tutorial/view_online.html:85
-msgid "Partie"
-msgstr ""
-
-#: templates/tutorial/export.html:70 templates/tutorial/part/view.html:85
-#: templates/tutorial/tutorial/view.html:130
-#: templates/tutorial/tutorial/view_online.html:92
-msgid "Il n'y a actuellement aucune partie dans ce tutoriel"
-msgstr ""
-
-#: templates/tutorial/export.html:80
-msgid "Aucune conclusion"
-msgstr ""
-
-#: templates/tutorial/index.html:18
-msgid "Découvrez tous nos tutoriels sur"
-msgstr ""
-
-#: templates/tutorial/index.html:18
-msgid ""
-"Vous pourrez également découvrir divers sujets tous plus intéressants les "
-"uns que les autres"
-msgstr ""
-
-#: templates/tutorial/index.html:59 templates/tutorial/member/beta.html:40
-#: templates/tutorial/member/index.html:92
-#: templates/tutorial/member/online.html:39
-msgid "Aucun tutoriel disponible"
-msgstr ""
-
-#: templates/tutorial/index.html:72 templates/tutorial/member/index.html:102
-#: templates/tutorial/tutorial/new.html:7
-#: templates/tutorial/tutorial/new.html:13
-msgid "Nouveau tutoriel"
-msgstr ""
-
-#: templates/tutorial/index.html:75
-msgid " Catégories de tutoriels "
-msgstr ""
-
-#: templates/tutorial/index.html:96
-msgid "Nouveaux tutoriels (RSS)"
-msgstr ""
-
-#: templates/tutorial/index.html:101
-msgid "Nouveaux tutoriels (ATOM)"
-msgstr ""
-
-#: templates/tutorial/chapter/edit.html:8
-#: templates/tutorial/chapter/edit.html:21
-#: templates/tutorial/chapter/edit.html:31
-#: templates/tutorial/chapter/view.html:68
-msgid "Éditer le chapitre"
-msgstr ""
-
-#: templates/tutorial/chapter/edit.html:46
-#: templates/tutorial/extract/edit.html:34
-#: templates/tutorial/part/edit.html:41
-#: templates/tutorial/tutorial/edit.html:36
-msgid "Une nouvelle version a été postée avant que vous ne validiez"
-msgstr ""
-
-#: templates/tutorial/chapter/new.html:8
-#: templates/tutorial/chapter/new.html:13
-#: templates/tutorial/chapter/new.html:21
-msgid "Nouveau chapitre"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:40
-msgid "Cette version du tutoriel est en BÊTA !"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:63
-#: templates/tutorial/extract/new.html:20
-#: templates/tutorial/tutorial/view.html:158
-msgid "Ajouter un extrait"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:80
-msgid ""
-"\n"
-" Déplacer le chapitre\n"
-" "
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:87
-#: templates/tutorial/chapter/view.html:137
-#: templates/tutorial/includes/chapter.part.html:50
-#: templates/tutorial/includes/chapter.part.html:53
-#: templates/tutorial/includes/chapter.part.html:85
-#: templates/tutorial/part/view.html:130 templates/tutorial/part/view.html:180
-msgid "Déplacer"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:92
-#: templates/tutorial/includes/chapter.part.html:55
-#: templates/tutorial/part/view.html:135
-msgid "Monter"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:98
-#: templates/tutorial/includes/chapter.part.html:59
-#: templates/tutorial/part/view.html:141
-msgid "Descendre"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:102
-#: templates/tutorial/includes/chapter.part.html:62
-#: templates/tutorial/part/view.html:145
-msgid "Déplacer avant"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:112
-#: templates/tutorial/chapter/view.html:127
-#: templates/tutorial/includes/part_export.part.html:23
-msgid "Chapitre"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:117
-#: templates/tutorial/includes/chapter.part.html:71
-#: templates/tutorial/part/view.html:160
-msgid "Déplacer après"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:152
-#: templates/tutorial/tutorial/view.html:443
-msgid "Suppression"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:156
-msgid "Supprimer le chapitre"
-msgstr ""
-
-#: templates/tutorial/chapter/view.html:160
-#, python-format
-msgid ""
-"\n"
-" Attention, vous vous apprêtez à "
-"supprimer définitivement le chapitre %(chapter_title)s.\n"
-" "
-msgstr ""
-
-#: templates/tutorial/chapter/view_online.html:61
-#: templates/tutorial/part/view_online.html:48
-#: templates/tutorial/tutorial/history.html:31
-msgid "Licence"
-msgstr ""
-
-#: templates/tutorial/chapter/view_online.html:85
-#: templates/tutorial/part/view_online.html:66
-#: templates/tutorial/tutorial/view_online.html:172
-msgid "Administration"
-msgstr ""
-
-#: templates/tutorial/chapter/view_online.html:87
-#: templates/tutorial/part/view_online.html:70
-#: templates/tutorial/tutorial/view_online.html:176
-msgid "Version hors-ligne"
-msgstr ""
-
-#: templates/tutorial/comment/edit.html:8
-#: templates/tutorial/comment/edit.html:15
-msgid "Éditer un commentaire"
-msgstr ""
-
-#: templates/tutorial/comment/edit.html:21
-msgid "Éditer le commentaire du tutoriel"
-msgstr ""
-
-#: templates/tutorial/comment/new.html:9
-#: templates/tutorial/comment/new.html:16
-msgid "Commenter le tutoriel"
-msgstr ""
-
-#: templates/tutorial/comment/new.html:22
-msgid "Ajouter un commentaire au tutoriel"
-msgstr ""
-
-#: templates/tutorial/comment/new.html:36
-msgid ""
-"\n"
-" Au moins un nouveau message a été posté dans la "
-"discussion pendant que vous rédigiez le votre.\n"
-" "
-msgstr ""
-
-#: templates/tutorial/extract/edit.html:7
-#: templates/tutorial/extract/edit.html:20
-#: templates/tutorial/extract/edit.html:26
-msgid "Éditer l'extrait"
-msgstr ""
-
-#: templates/tutorial/extract/new.html:7
-#: templates/tutorial/extract/new.html:26
-msgid "Nouvel extrait"
-msgstr ""
-
-#: templates/tutorial/includes/chapter.part.html:12
-#: templates/tutorial/part/view.html:50
-#: templates/tutorial/tutorial/view.html:108
-msgid "Il n'y a pas d'introduction"
-msgstr ""
-
-#: templates/tutorial/includes/chapter.part.html:21
-msgid "Il n'y a aucun extrait"
-msgstr ""
-
-#: templates/tutorial/includes/chapter.part.html:39
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certain de vouloir supprimer "
-"définitivement l'extrait %(extract_title)s ?\n"
-" "
-msgstr ""
-
-#: templates/tutorial/includes/chapter.part.html:99
-msgid "Cet extrait est vide"
-msgstr ""
-
-#: templates/tutorial/includes/chapter.part.html:111
-#: templates/tutorial/part/view.html:97
-#: templates/tutorial/tutorial/view.html:142
-msgid "Il n'y a pas de conclusion"
-msgstr ""
-
-#: templates/tutorial/includes/part_export.part.html:11
-msgid "Pas d'introduction"
-msgstr ""
-
-#: templates/tutorial/includes/part_export.part.html:16
-msgid "Il n'y a aucun chapitre dans cette partie"
-msgstr ""
-
-#: templates/tutorial/includes/part_export.part.html:41
-msgid "Pas de conclusion"
-msgstr ""
-
-#: templates/tutorial/includes/summary.part.html:9
-msgid "Sommaire"
-msgstr ""
-
-#: templates/tutorial/includes/summary.part.html:29
-msgid "Aucun extrait actuellement"
-msgstr ""
-
-#: templates/tutorial/includes/summary.part.html:87
-msgid "Aucune partie actuellement"
-msgstr ""
-
-#: templates/tutorial/includes/tags_authors.part.html:18
-msgid "Dernière mise à jour"
-msgstr ""
-
-#: templates/tutorial/member/beta.html:10
-#: templates/tutorial/member/beta.html:26
-#: templates/tutorial/member/online.html:46
-msgid "Tutoriels en bêta par"
-msgstr ""
-
-#: templates/tutorial/member/beta.html:19
-msgid "Tutoriels en bêta"
-msgstr ""
-
-#: templates/tutorial/member/beta.html:47
-msgid "Tutoriels en ligne par"
-msgstr ""
-
-#: templates/tutorial/member/index.html:13
-#: templates/tutorial/member/index.html:33
-#: templates/tutorial/member/index.html:53
-#: templates/tutorial/member/index.html:127
-#: templates/tutorial/tutorial/history.html:134
-msgid "En bêta"
-msgstr ""
-
-#: templates/tutorial/member/index.html:37
-msgid "Tous mes tutoriels"
-msgstr ""
-
-#: templates/tutorial/member/index.html:83
-msgid "Créé"
-msgstr ""
-
-#: templates/tutorial/member/index.html:105
-#: templates/tutorial/tutorial/import.html:77 zds/gallery/forms.py:169
-msgid "Importer"
-msgstr ""
-
-#: templates/tutorial/member/online.html:9
-#: templates/tutorial/member/online.html:25
-msgid "Tutoriels publiés par"
-msgstr ""
-
-#: templates/tutorial/member/online.html:18
-msgid "Tutoriels publiés"
-msgstr ""
-
-#: templates/tutorial/part/edit.html:8 templates/tutorial/part/edit.html:16
-msgid "Éditer une partie"
-msgstr ""
-
-#: templates/tutorial/part/edit.html:26 templates/tutorial/part/view.html:110
-msgid "Éditer la partie"
-msgstr ""
-
-#: templates/tutorial/part/new.html:7 templates/tutorial/part/new.html:14
-#: templates/tutorial/part/new.html:22
-msgid "Nouvelle partie"
-msgstr ""
-
-#: templates/tutorial/part/view.html:35
-msgid ""
-"\n"
-" Cette version du tutoriel est en BÊTA !\n"
-" "
-msgstr ""
-
-#: templates/tutorial/part/view.html:107
-msgid "Ajouter un chapitre"
-msgstr ""
-
-#: templates/tutorial/part/view.html:122
-msgid ""
-"\n"
-" Déplacer la partie\n"
-" "
-msgstr ""
-
-#: templates/tutorial/part/view.html:185
-msgid "Supprimer la partie"
-msgstr ""
-
-#: templates/tutorial/part/view.html:190
-msgid "Attention, vous vous apprêtez à supprimer définitivement la partie"
-msgstr ""
-
-#: templates/tutorial/tutorial/diff.html:41
-msgid "Nouveaux Fichiers"
-msgstr ""
-
-#: templates/tutorial/tutorial/diff.html:51
-msgid "Fichiers Modifiés"
-msgstr ""
-
-#: templates/tutorial/tutorial/edit.html:7
-#: templates/tutorial/tutorial/edit.html:17
-#: templates/tutorial/tutorial/edit.html:28
-msgid "Éditer le tutoriel"
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:48
-msgid "Etat"
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:53
-msgid "Bêta"
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:67
-msgid "Draft"
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:96
-msgid "Activer"
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:104
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certain de vouloir "
-"activer la bêta sur le tutoriel \n"
-" \"%(tutorial_title)s\" "
-"dans sa version du %(date_version)s ?\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:115 zds/gallery/forms.py:206
-msgid "Mettre à jour"
-msgstr ""
-
-#: templates/tutorial/tutorial/history.html:123
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certain de vouloir "
-"mettre à jour la bêta du tutoriel \n"
-" \"%(tutorial_title)s\" "
-"dans sa version du %(date_version)s ?\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:7
-#: templates/tutorial/tutorial/import.html:13
-#: templates/tutorial/tutorial/import.html:20
-msgid "Importer un tutoriel"
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:27
-msgid "Envoi d'une archive"
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:29
-#, python-format
-msgid ""
-"\n"
-" Vous avez commencé a rédiger votre tutoriel sur l'éditeur en ligne "
-"de %(site_name)s, vous avez téléchargé l'archive correspondate et vous avez "
-"fait des modifications sur les fichiers en hors-ligne, et vous souhaitez "
-"maintenant importer ces modifications sur le site ? Faites une archive zip "
-"(seul format supporté actuellement) du répertoire dans lequel se trouve les "
-"fichiers de votre tutoriel et renseignez les deux champs ci-dessous, puis "
-"cliquez sur importer.\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:35
-msgid "Envoi de fichiers .tuto"
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:37
-msgid ""
-"\n"
-" Vous êtes l'auteur d'un cours sur le SdZ ? Nous l'avons récupéré "
-"pour vous ! Il est disponible en hors-ligne et n'attend plus que votre "
-"accord pour être publié. Il vous suffit d'en faire la demande à un membre du "
-"Staff via le forum ou directement par MP.\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:43
-msgid ""
-"\n"
-" Attention, le fichier attendu n'est pas un .tuto du "
-"Site du Zéro, mais un format intermédiaire qui contient du Markdown et non "
-"du zCode. Contactez un membre du Staff pour demander la conversion de votre "
-"fichier.\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:48
-msgid ""
-"\n"
-" Le fichier zip est celui qui contient les ressources de votre "
-"tutoriel. Il est également issu du convertisseur Markdown > zCode.\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:56
-msgid "Récupérer un tutoriel du Site du Zéro"
-msgstr ""
-
-#: templates/tutorial/tutorial/import.html:58
-msgid ""
-"Ci-dessous se trouve la liste des tutoriels que vous aviez rédigé sur le "
-"Site du Zéro et que nous avons récupéré. Vous pouvez les importer pour "
-"continuer leur rédaction et les soumettre à la validation. Si vous pensez "
-"qu'il en manque un, vous pouvez contacter un membre du Staff"
-msgstr ""
-
-#: templates/tutorial/tutorial/new.html:20
-msgid "Nouveau Tutoriel"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:53
-msgid "Ce tutoriel est en attente d'un validateur"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:57
-msgid "Le tutoriel est en cours de validation par"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:76
-#: templates/tutorial/tutorial/view.html:82
-msgid "Une autre version de ce tutoriel"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:94
-msgid ""
-"\n"
-" Cette version du tutoriel est en \"BÊTA\""
-"strong> !\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:154
-msgid "Ajouter une partie"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:226
-msgid ""
-"\n"
-" Voir la version en "
-"ligne\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:236
-msgid "Mettre cette version en bêta"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:244
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certain de vouloir activer"
-"strong> la bêta du tutoriel\n"
-" \"%(tutorial_title)s\" dans la version que "
-"vous voyez actuellement ?\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:258
-msgid ""
-"\n"
-" Voir la version en "
-"bêta\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:265
-msgid "Mettre à jour la bêta avec cette version"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:273
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certain de vouloir mettre à "
-"jour la bêta du tutoriel\n"
-" \"%(tutorial_title)s\" dans la version "
-"que vous voyez actuellement ?\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:286
-msgid "Cette version est déjà en bêta"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:292
-msgid "Désactiver la bêta"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:300
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certain de vouloir désactiver"
-"strong> la bêta du tutoriel \"%(tutorial_title)s\" ?\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:350
-#: templates/tutorial/tutorial/view_online.html:181
-msgid "Historique validation"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:361
-msgid "l'auteur"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:372
-#, python-format
-msgid ""
-"\n"
-" Êtes-vous certains de vouloir "
-"dépublier le tutoriel \"%(tutorial_title)s\"\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:404
-msgid "Valider et publier"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:418
-#, python-format
-msgid ""
-"\n"
-" Réservé par "
-"%(validator_name)s, le retirer\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:425
-msgid "La validation de ce tutoriel est actuellement réservé par"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:448
-msgid "Supprimer le tutoriel"
-msgstr ""
-
-#: templates/tutorial/tutorial/view.html:453
-#, python-format
-msgid ""
-"\n"
-" Attention, vous vous apprêtez à "
-"supprimer définitivement le tutoriel \""
-"%(tutorial_title)s\".\n"
-" "
-msgstr ""
-
-#: templates/tutorial/tutorial/view_online.html:112
-msgid "commentaire"
-msgstr ""
-
-#: templates/tutorial/tutorial/view_online.html:114
-msgid "Aucun commentaire"
-msgstr ""
-
-#: templates/tutorial/tutorial/view_online.html:191
-msgid "Êtes-vous certains de vouloir dépublier le tutoriel"
-msgstr ""
-
-#: templates/tutorial/validation/history.html:73
-msgid "Ce tutoriel n'a jamais été soumis en validation"
-msgstr ""
-
-#: templates/tutorial/validation/index.html:10
-#: templates/tutorial/validation/index.html:30
-msgid "Reservés"
-msgstr ""
-
-#: templates/tutorial/validation/index.html:12
-#: templates/tutorial/validation/index.html:32
-msgid "Non-reservés"
-msgstr ""
-
-#: templates/tutorial/validation/index.html:52
-msgid "Propos"
-msgstr ""
-
-#: zds/settings.py:52
-msgid "Français"
-msgstr ""
-
-#: zds/settings.py:53
-msgid "Anglais"
-msgstr ""
-
-#: zds/article/forms.py:28 zds/tutorial/forms.py:46
-msgid "Description"
-msgstr ""
-
-#: zds/article/forms.py:38 zds/tutorial/forms.py:310
-msgid "Texte"
-msgstr ""
-
-#: zds/article/forms.py:41 zds/article/forms.py:125 zds/forum/forms.py:39
-#: zds/forum/forms.py:106 zds/mp/forms.py:45 zds/mp/forms.py:102
-#: zds/tutorial/forms.py:62 zds/tutorial/forms.py:72 zds/tutorial/forms.py:147
-#: zds/tutorial/forms.py:157 zds/tutorial/forms.py:210
-#: zds/tutorial/forms.py:220 zds/tutorial/forms.py:314
-#: zds/tutorial/forms.py:423
-msgid "Votre message au format Markdown."
-msgstr ""
-
-#: zds/article/forms.py:48
-msgid "Selectionnez une image"
-msgstr ""
-
-#: zds/article/forms.py:53
-msgid ""
-"Sous catégories de votre article. Si aucune catégorie ne convient n'hésitez "
-"pas à en demander une nouvelle lors de la validation !"
-msgstr ""
-
-#: zds/article/forms.py:60 zds/tutorial/forms.py:95
-msgid "Licence de votre publication"
-msgstr ""
-
-#: zds/article/forms.py:67 zds/tutorial/forms.py:102 zds/tutorial/forms.py:163
-#: zds/tutorial/forms.py:226 zds/tutorial/forms.py:276
-#: zds/tutorial/forms.py:320
-msgid "Message de suivi"
-msgstr ""
-
-#: zds/article/forms.py:72 zds/tutorial/forms.py:107 zds/tutorial/forms.py:168
-#: zds/tutorial/forms.py:231 zds/tutorial/forms.py:281
-#: zds/tutorial/forms.py:325
-msgid "Un résumé de vos ajouts et modifications"
-msgstr ""
-
-#: zds/article/forms.py:147 zds/forum/forms.py:125 zds/tutorial/forms.py:445
-msgid ""
-"Vous venez de poster. Merci de patienter au moins 15 minutes entre deux "
-"messages consécutifs afin de limiter le flood."
-msgstr ""
-
-#: zds/article/forms.py:154
-msgid "Cet article est verrouillé."
-msgstr ""
-
-#: zds/article/forms.py:165 zds/forum/forms.py:144 zds/tutorial/forms.py:463
-msgid "Vous devez écrire une réponse !"
-msgstr ""
-
-#: zds/article/forms.py:171 zds/forum/forms.py:95 zds/forum/forms.py:150
-#: zds/tutorial/forms.py:469
-msgid "Ce message est trop long, il ne doit pas dépasser {0} caractères"
-msgstr ""
-
-#: zds/forum/forms.py:23
-msgid "[Tag 1][Tag 2] Titre de mon sujet"
-msgstr ""
-
-#: zds/forum/forms.py:30 zds/gallery/forms.py:24 zds/mp/forms.py:35
-msgid "Sous-titre"
-msgstr ""
-
-#: zds/forum/forms.py:67 zds/gallery/forms.py:51 zds/mp/forms.py:88
-msgid "Le champ titre ne peut être vide"
-msgstr ""
-
-#: zds/forum/forms.py:73
-msgid "Le titre ne peux pas contenir uniquement des tags"
-msgstr ""
-
-#: zds/forum/forms.py:80
-msgid "Un tag ne peut être vide"
-msgstr ""
-
-#: zds/forum/forms.py:85
-msgid "Un tag doit faire moins de {0} caractères"
-msgstr ""
-
-#: zds/forum/forms.py:89 zds/mp/forms.py:92 zds/mp/forms.py:134
-msgid "Le champ text ne peut être vide"
-msgstr ""
-
-#: zds/forum/forms.py:133
-msgid "Ce topic est verrouillé."
-msgstr ""
-
-#: zds/forum/forms.py:159
-msgid "Forum"
-msgstr ""
-
-#: zds/forum/forms.py:174 zds/member/forms.py:598 zds/pages/forms.py:66
-#: zds/tutorial/forms.py:187 zds/tutorial/forms.py:251
-#: zds/tutorial/forms.py:301
-msgid "Valider"
-msgstr ""
-
-#: zds/gallery/forms.py:40
-msgid "Créer"
-msgstr ""
-
-#: zds/gallery/forms.py:65
-msgid "Nom de l'utilisateur"
-msgstr ""
-
-#: zds/gallery/forms.py:103 zds/member/forms.py:506
-msgid "Ce nom d'utilisateur n'existe pas"
-msgstr ""
-
-#: zds/gallery/forms.py:116
-msgid "Légende"
-msgstr ""
-
-#: zds/gallery/forms.py:122
-msgid "Sélectionnez votre image"
-msgstr ""
-
-#: zds/gallery/forms.py:124
-msgid "Taille maximum : {0} Ko"
-msgstr ""
-
-#: zds/gallery/forms.py:149
-msgid "Votre image est trop lourde, la limite autorisée est de {0} Ko"
-msgstr ""
-
-#: zds/gallery/forms.py:156
-msgid "Sélectionnez l'archive contenant les images à charger"
-msgstr ""
-
-#: zds/gallery/forms.py:183
-msgid "Le champ n'accepte que les fichiers zip"
-msgstr ""
-
-#: zds/gallery/forms.py:225
-msgid "Utiliser comme avatar"
-msgstr ""
-
-#: zds/gallery/views.py:113
-msgid ""
-"La galerie '{}' ne peut pas être supprimée car elle est liée à un tutoriel "
-"existant."
-msgstr ""
-
-#: zds/gallery/views.py:208 zds/gallery/views.py:364
-msgid ""
-"Votre image est beaucoup trop lourde, réduisez sa taille à moins de {} Kio avant de l'envoyer."
-msgstr ""
-
-#: zds/member/forms.py:30
-msgid "Ancien Tutoriel"
-msgstr ""
-
-#: zds/member/forms.py:46
-msgid "Attribuer"
-msgstr ""
-
-#: zds/member/forms.py:53 zds/member/forms.py:101 zds/member/forms.py:480
-msgid "Nom d'utilisateur"
-msgstr ""
-
-#: zds/member/forms.py:64 zds/member/forms.py:107 zds/member/forms.py:513
-msgid "Mot de passe"
-msgstr ""
-
-#: zds/member/forms.py:72
-msgid "Se souvenir de moi"
-msgstr ""
-
-#: zds/member/forms.py:88
-msgid "Se connecter"
-msgstr ""
-
-#: zds/member/forms.py:115
-msgid "Confirmation du mot de passe"
-msgstr ""
-
-#: zds/member/forms.py:134
-msgid "Valider mon inscription"
-msgstr ""
-
-#: zds/member/forms.py:145 zds/member/forms.py:548
-msgid "Les mots de passe sont différents"
-msgstr ""
-
-#: zds/member/forms.py:160
-msgid "Le nom d'utilisateur ne peut-être vide"
-msgstr ""
-
-#: zds/member/forms.py:163 zds/member/forms.py:368
-msgid "Ce nom d'utilisateur est déjà utilisé"
-msgstr ""
-
-#: zds/member/forms.py:167 zds/member/forms.py:374
-msgid "Le nom d'utilisateur ne peut contenir de virgules"
-msgstr ""
-
-#: zds/member/forms.py:170 zds/member/forms.py:370
-msgid "Le nom d'utilisateur ne peut commencer/finir par des espaces"
-msgstr ""
-
-#: zds/member/forms.py:175
-msgid "Le mot de passe doit être différent du pseudo"
-msgstr ""
-
-#: zds/member/forms.py:189
-msgid "Utilisez un autre fournisseur d'adresses courriel."
-msgstr ""
-
-#: zds/member/forms.py:195 zds/member/forms.py:380
-msgid "Votre adresse courriel est déjà utilisée"
-msgstr ""
-
-#: zds/member/forms.py:207
-msgid "Votre biographie au format Markdown."
-msgstr ""
-
-#: zds/member/forms.py:218
-msgid ""
-"Lien vers votre site internet personnel (ne pas oublier le http:// ou "
-"https:// devant)."
-msgstr ""
-
-#: zds/member/forms.py:230
-msgid "Lien vers un avatar externe (laissez vide pour utiliser Gravatar)."
-msgstr ""
-
-#: zds/member/forms.py:242
-msgid "Elle apparaitra dans les messages de forums. "
-msgstr ""
-
-#: zds/member/forms.py:259 zds/member/forms.py:312 zds/member/forms.py:353
-#: zds/member/forms.py:429
-msgid "Enregistrer"
-msgstr ""
-
-#: zds/member/forms.py:269
-msgid "Afficher mon adresse courriel publiquement"
-msgstr ""
-
-#: zds/member/forms.py:270
-msgid "Afficher les signatures"
-msgstr ""
-
-#: zds/member/forms.py:271
-msgid "Cochez pour dérouler les menus au survol"
-msgstr ""
-
-#: zds/member/forms.py:272
-msgid "Recevez un courriel lorsque vous recevez une réponse à un message privé"
-msgstr ""
-
-#: zds/member/forms.py:320
-msgid "Nouveau pseudo"
-msgstr ""
-
-#: zds/member/forms.py:326 zds/member/forms.py:337
-msgid "Ne mettez rien pour conserver l'ancien"
-msgstr ""
-
-#: zds/member/forms.py:332
-msgid "Nouvelle adresse courriel"
-msgstr ""
-
-#: zds/member/forms.py:340
-msgid "Veuillez entrer une adresse email valide."
-msgstr ""
-
-#: zds/member/forms.py:386
-msgid "Utilisez un autre fournisseur d'adresses mail."
-msgstr ""
-
-#: zds/member/forms.py:403
-msgid "Mot de passe actuel"
-msgstr ""
-
-#: zds/member/forms.py:410
-msgid "Confirmer le nouveau mot de passe"
-msgstr ""
-
-#: zds/member/forms.py:448
-msgid "Mot de passe incorrect."
-msgstr ""
-
-#: zds/member/forms.py:454
-msgid "Les mots de passe sont différents."
-msgstr ""
-
-#: zds/member/forms.py:466 zds/member/forms.py:560
-msgid "Le mot de passe doit être différent de votre pseudo"
-msgstr ""
-
-#: zds/member/forms.py:573
-msgid "Groupe de l'utilisateur"
-msgstr ""
-
-#: zds/member/forms.py:579
-msgid "Super-user"
-msgstr ""
-
-#: zds/member/forms.py:584
-msgid "Compte actif"
-msgstr ""
-
-#: zds/member/views.py:112
-msgid "# Le tutoriel présenté par ce topic n'existe plus."
-msgstr ""
-
-#: zds/member/views.py:198
-msgid "Messages postés par période"
-msgstr ""
-
-#: zds/member/views.py:282
-msgid "Lecture Seule"
-msgstr ""
-
-#: zds/member/views.py:284
-msgid ""
-"Vous ne pouvez plus poster dans les forums, ni dans les commentaires "
-"d'articles et de tutoriels."
-msgstr ""
-
-#: zds/member/views.py:287
-msgid "Lecture Seule Temporaire"
-msgstr ""
-
-#: zds/member/views.py:293
-msgid ""
-"Vous ne pouvez plus poster dans les forums, ni dans les commentaires "
-"d'articles et de tutoriels pendant {0} jours."
-msgstr ""
-
-#: zds/member/views.py:297
-msgid "Ban Temporaire"
-msgstr ""
-
-#: zds/member/views.py:303
-msgid "Vous ne pouvez plus vous connecter sur {} pendant {} jours."
-msgstr ""
-
-#: zds/member/views.py:309
-msgid "Ban définitif"
-msgstr ""
-
-#: zds/member/views.py:312
-msgid "vous ne pouvez plus vous connecter sur {}."
-msgstr ""
-
-#: zds/member/views.py:316
-msgid "Autorisation d'écrire"
-msgstr ""
-
-#: zds/member/views.py:319
-msgid ""
-"Vous pouvez désormais poster sur les forums, dans les commentaires "
-"d'articles et tutoriels."
-msgstr ""
-
-#: zds/member/views.py:322
-msgid "Autorisation de se connecter"
-msgstr ""
-
-#: zds/member/views.py:325
-msgid "vous pouvez désormais vous connecter sur le site."
-msgstr ""
-
-#: zds/member/views.py:332
-msgid ""
-"Bonjour **{0}**,\n"
-"\n"
-"**Bonne Nouvelle**, la sanction qui pesait sur vous a été levée par **{1}"
-"**.\n"
-"\n"
-"Ce qui signifie que {2}\n"
-"\n"
-"Le motif de votre sanction est :\n"
-"\n"
-"> {3}\n"
-"\n"
-"Cordialement, L'équipe {4}."
-msgstr ""
-
-#: zds/member/views.py:345
-msgid ""
-"Bonjour **{0}**,\n"
-"\n"
-"Vous avez été santionné par **{1}**.\n"
-"\n"
-"La sanction est de type *{2}*, ce qui signifie que {3}\n"
-"\n"
-"Le motif de votre sanction est :\n"
-"\n"
-"> {4}\n"
-"\n"
-"Cordialement, L'équipe {5}."
-msgstr ""
-
-#: zds/member/views.py:362
-msgid "Sanction"
-msgstr ""
-
-#: zds/member/views.py:456 zds/member/views.py:505
-msgid "Le profil a correctement été mis à jour."
-msgstr ""
-
-#: zds/member/views.py:502 zds/member/views.py:539 zds/member/views.py:563
-msgid "Une erreur est survenue."
-msgstr ""
-
-#: zds/member/views.py:541
-msgid "L'avatar a correctement été mis à jour."
-msgstr ""
-
-#: zds/member/views.py:559
-msgid "Le mot de passe a bien été modifié."
-msgstr ""
-
-#: zds/member/views.py:633
-msgid ""
-"Vous n'êtes pas autorisé à vous connecter sur le site, vous avez été banni "
-"par un modérateur."
-msgstr ""
-
-#: zds/member/views.py:638
-msgid ""
-"Vous n'avez pas encore activé votre compte, vous devez le faire pour pouvoir "
-"vous connecter sur le site. Regardez dans vos mails : {}."
-msgstr ""
-
-#: zds/member/views.py:644
-msgid "Les identifiants fournis ne sont pas valides."
-msgstr ""
-
-#: zds/member/views.py:696 zds/member/views.py:875
-msgid "{} - Confirmation d'inscription"
-msgstr ""
-
-#: zds/member/views.py:737
-msgid "{} - Mot de passe oublié"
-msgstr ""
-
-#: zds/member/views.py:810
-msgid ""
-"Bonjour **{0}**,\n"
-"\n"
-"Ton compte a été activé, et tu es donc officiellement membre de la "
-"communauté de {4}.\n"
-"\n"
-"{4} est une communauté dont le but est de diffuser des connaissances au plus "
-"grand nombre.\n"
-"\n"
-"Sur ce site, tu trouveras un ensemble de [tutoriels]({1}) dans plusieurs "
-"domaines et plus particulièrement autour de l'informatique et des sciences. "
-"Tu y retrouveras aussi des [articles]({2}) traitant de sujets d'actualité ou "
-"non, qui, tout comme les tutoriels, sont écrits par des [membres]({3}) de la "
-"communauté. Pendant tes lectures et ton apprentissage, si jamais tu as des "
-"questions à poser, tu retrouveras sur les [forums]({4}) des personnes prêtes "
-"à te filer un coup de main et ainsi t'éviter de passer plusieurs heures sur "
-"un problème.\n"
-"\n"
-"L'ensemble du contenu disponible sur le site est et sera toujours gratuit, "
-"car la communauté de {4} est attachée aux valeurs du libre partage et désire "
-"apporter le savoir à tout le monde quels que soient ses moyens.\n"
-"\n"
-"En espérant que tu te plairas ici, je te laisse maintenant faire un petit "
-"tour.\n"
-"\n"
-"Clem'"
-msgstr ""
-
-#: zds/member/views.py:845
-msgid "Bienvenue sur {}"
-msgstr ""
-
-#: zds/member/views.py:846
-msgid "Le manuel du nouveau membre"
-msgstr ""
-
-#: zds/member/views.py:936
-msgid "Le tutoriel a bien été lié au membre {0}."
-msgstr ""
-
-#: zds/member/views.py:968
-msgid "Le tutoriel a bien été retiré au membre {0}."
-msgstr ""
-
-#: zds/member/views.py:996
-msgid "{0} appartient maintenant au groupe {1}."
-msgstr ""
-
-#: zds/member/views.py:1001
-msgid "{0} n'appartient maintenant plus au groupe {1}."
-msgstr ""
-
-#: zds/member/views.py:1014
-msgid "{0} n'appartient (plus ?) à aucun groupe."
-msgstr ""
-
-#: zds/member/views.py:1020
-msgid "{0} est maintenant super-utilisateur."
-msgstr ""
-
-#: zds/member/views.py:1024
-msgid "Un super-utilisateur ne peux pas se retirer des super-utilisateurs."
-msgstr ""
-
-#: zds/member/views.py:1028
-msgid "{0} n'est maintenant plus super-utilisateur."
-msgstr ""
-
-#: zds/member/views.py:1033
-msgid "{0} est maintenant activé."
-msgstr ""
-
-#: zds/member/views.py:1037
-msgid "{0} est désactivé."
-msgstr ""
-
-#: zds/member/views.py:1044
-msgid ""
-"Bonjour {0},\n"
-"\n"
-"Un administrateur vient de modifier les groupes auxquels vous appartenez. \n"
-msgstr ""
-
-#: zds/member/views.py:1048
-msgid ""
-"Voici la liste des groupes dont vous faites dorénavant partie :\n"
-"\n"
-msgstr ""
-
-#: zds/member/views.py:1052
-msgid "* Vous ne faites partie d'aucun groupe"
-msgstr ""
-
-#: zds/member/views.py:1055
-msgid ""
-"Vous avez aussi rejoint le rang des super utilisateurs. N'oubliez pas, un "
-"grand pouvoir entraine de grandes responsabiltiés !"
-msgstr ""
-
-#: zds/member/views.py:1060
-msgid "Modification des groupes"
-msgstr ""
-
-#: zds/mp/forms.py:19
-msgid "Les participants doivent être séparés par une virgule."
-msgstr ""
-
-#: zds/mp/forms.py:74
-msgid "Le champ participants ne peut être vide"
-msgstr ""
-
-#: zds/mp/forms.py:81
-msgid "Un des participants saisi est introuvable"
-msgstr ""
-
-#: zds/mp/forms.py:84
-msgid "Vous ne pouvez pas vous écrire à vous-même !"
-msgstr ""
-
-#: zds/mp/forms.py:123
-msgid "Vous êtes seul dans cette conversation, vous ne pouvez plus y écrire."
-msgstr ""
-
-#: zds/mp/views.py:188
-msgid "Vous êtes déjà auteur du message"
-msgstr ""
-
-#: zds/mp/views.py:482
-msgid "Vous avez quitté la conversation avec succès."
-msgstr ""
-
-#: zds/mp/views.py:503
-msgid "Le membre que vous essayez d'ajouter à la conversation y est déjà."
-msgstr ""
-
-#: zds/mp/views.py:511
-msgid "Le membre a bien été ajouté à la conversation."
-msgstr ""
-
-#: zds/mp/views.py:514
-msgid "Le membre que vous avez essayé d'ajouter n'existe pas."
-msgstr ""
-
-#: zds/pages/forms.py:12
-msgid "Qui êtes vous ?"
-msgstr ""
-
-#: zds/pages/forms.py:17
-msgid "M/Mme Prénom Nom"
-msgstr ""
-
-#: zds/pages/forms.py:37
-msgid "Votre adresse complète (rue, code postal, ville, pays...)"
-msgstr ""
-
-#: zds/pages/forms.py:43
-msgid "Pourquoi voulez-vous adhérer à l'association ?"
-msgstr ""
-
-#: zds/pages/forms.py:48
-msgid "Décrivez ici la raison de votre demande d'adhésion à l'association."
-msgstr ""
-
-#: zds/pages/forms.py:76
-msgid "Ce message est trop long, il ne doit pas dépasser 3000 caractères"
-msgstr ""
-
-#: zds/pages/views.py:95
-msgid "Votre demande d'adhésion a bien été envoyée et va être étudiée."
-msgstr ""
-
-#: zds/tutorial/forms.py:36
-msgid "Le champ Titre ne peut être vide"
-msgstr ""
-
-#: zds/tutorial/forms.py:52
-msgid "Sélectionnez le logo du tutoriel (max. {} Ko)"
-msgstr ""
-
-#: zds/tutorial/forms.py:58 zds/tutorial/forms.py:143
-#: zds/tutorial/forms.py:206
-msgid "Introduction"
-msgstr ""
-
-#: zds/tutorial/forms.py:68 zds/tutorial/forms.py:153
-#: zds/tutorial/forms.py:216
-msgid "Conclusion"
-msgstr ""
-
-#: zds/tutorial/forms.py:83
-msgid ""
-"Sous catégories de votre tutoriel. Si aucune catégorie ne convient n'hésitez "
-"pas à en demander une nouvelle lors de la validation !"
-msgstr ""
-
-#: zds/tutorial/forms.py:190 zds/tutorial/forms.py:254
-msgid "Ajouter et continuer"
-msgstr ""
-
-#: zds/tutorial/forms.py:200
-msgid "Selectionnez le logo du tutoriel (max. {0} Ko)"
-msgstr ""
-
-#: zds/tutorial/forms.py:267
-msgid "Sélectionnez une image"
-msgstr ""
-
-#: zds/tutorial/forms.py:293
-msgid "Contenu"
-msgstr ""
-
-#: zds/tutorial/forms.py:346
-msgid "Sélectionnez le tutoriel à importer"
-msgstr ""
-
-#: zds/tutorial/forms.py:350
-msgid "Fichier zip contenant les images du tutoriel"
-msgstr ""
-
-#: zds/tutorial/forms.py:362
-msgid "Importer le .tuto"
-msgstr ""
-
-#: zds/tutorial/forms.py:377
-msgid "Le fichier doit être au format .tuto"
-msgstr ""
-
-#: zds/tutorial/forms.py:384
-msgid "Le fichier doit être au format .zip"
-msgstr ""
-
-#: zds/tutorial/forms.py:391
-msgid "Sélectionnez l'archive de votre tutoriel"
-msgstr ""
-
-#: zds/tutorial/forms.py:396
-msgid "Tutoriel vers lequel vous souhaitez importer votre archive"
-msgstr ""
-
-#: zds/tutorial/forms.py:411
-msgid "Importer l'archive"
-msgstr ""
-
-#: zds/tutorial/forms.py:452
-msgid "Ce tutoriel est verrouillé."
-msgstr ""
-
-#: zds/tutorial/forms.py:484
-msgid "Commentaire pour votre demande."
-msgstr ""
-
-#: zds/tutorial/forms.py:494 zds/tutorial/forms.py:537
-msgid "URL de la version originale"
-msgstr ""
-
-#: zds/tutorial/forms.py:522
-msgid "Commentaire de publication."
-msgstr ""
-
-#: zds/tutorial/forms.py:528
-msgid "Version majeure ?"
-msgstr ""
-
-#: zds/tutorial/forms.py:565
-msgid "Commentaire de rejet."
-msgstr ""
-
-#: zds/tutorial/views.py:188
-msgid "Le tutoriel n'est plus sous réserve."
-msgstr ""
-
-#: zds/tutorial/views.py:196
-msgid "Le tutoriel a bien été réservé par {0}."
-msgstr ""
-
-#: zds/tutorial/views.py:298
-msgid "Le tutoriel a bien été refusé."
-msgstr ""
-
-#: zds/tutorial/views.py:302
-msgid ""
-"Désolé, le zeste **{0}** n'a malheureusement pas passé l’étape de "
-"validation. Mais ne désespère pas, certaines corrections peuvent surement "
-"être faite pour l’améliorer et repasser la validation plus tard. Voici le "
-"message que [{1}]({2}), ton validateur t'a laissé:\n"
-"\n"
-"`{3}`\n"
-"\n"
-"N'hésite pas a lui envoyer un petit message pour discuter de la décision ou "
-"demander plus de détail si tout cela te semble injuste ou manque de clarté."
-msgstr ""
-
-#: zds/tutorial/views.py:318
-msgid "Refus de Validation : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:328
-msgid "Vous devez avoir réservé ce tutoriel pour pouvoir le refuser."
-msgstr ""
-
-#: zds/tutorial/views.py:370
-msgid "Le tutoriel a bien été validé."
-msgstr ""
-
-#: zds/tutorial/views.py:375
-msgid ""
-"Félicitations ! Le zeste [{0}]({1}) a été publié par [{2}]({3}) ! Les "
-"lecteurs du monde entier peuvent venir l'éplucher et réagir a son sujet. Je "
-"te conseille de rester a leur écoute afin d'apporter des corrections/"
-"compléments.Un Tutoriel vivant et a jour est bien plus lu qu'un sujet "
-"abandonné !"
-msgstr ""
-
-#: zds/tutorial/views.py:390
-msgid "Publication : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:400
-msgid "Vous devez avoir réservé ce tutoriel pour pouvoir le valider."
-msgstr ""
-
-#: zds/tutorial/views.py:431
-msgid "Le tutoriel a bien été dépublié."
-msgstr ""
-
-#: zds/tutorial/views.py:481
-msgid ""
-"Bonjour {0},Le tutoriel *{1}* que tu as réservé a été mis à jour en zone de "
-"validation, Pour retrouver les modifications qui ont été faites, je t'invite "
-"à consulter l'historique des versions\n"
-"\n"
-"> Merci"
-msgstr ""
-
-#: zds/tutorial/views.py:489
-msgid "Mise à jour de tuto : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:499
-msgid "Votre demande de validation a été envoyée à l'équipe."
-msgstr ""
-
-#: zds/tutorial/views.py:539
-msgid "Le tutoriel {0} a bien été supprimé."
-msgstr ""
-
-#: zds/tutorial/views.py:556
-msgid "Vous ne faites plus partie des rédacteurs de ce tutoriel."
-msgstr ""
-
-#: zds/tutorial/views.py:591
-msgid "L'auteur {0} a bien été ajouté à la rédaction du tutoriel."
-msgstr ""
-
-#: zds/tutorial/views.py:597
-msgid ""
-"Bonjour **{0}**,\n"
-"\n"
-"Tu as été ajouté comme auteur du tutoriel [{1}]({2}).\n"
-"Tu peux retrouver ce tutoriel en [cliquant ici]({3}), ou *via* le lien \"En "
-"rédaction\" du menu \"Tutoriels\" sur la page de ton profil.\n"
-"\n"
-"Tu peux maintenant commencer à rédiger !"
-msgstr ""
-
-#: zds/tutorial/views.py:611
-msgid "Ajout en tant qu'auteur : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:643
-msgid "L'auteur {0} a bien été retiré du tutoriel."
-msgstr ""
-
-#: zds/tutorial/views.py:649
-msgid ""
-"Bonjour **{0}**,\n"
-"\n"
-"Tu as été supprimé des auteurs du tutoriel [{1}]({2}). Tant qu'il ne sera "
-"pas publié, tu ne pourra plus y accéder.\n"
-msgstr ""
-
-#: zds/tutorial/views.py:660
-msgid "Suppression des auteurs : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:675
-msgid ""
-"Bonjour à tous,\n"
-"\n"
-"J'ai commencé ({0}) la rédaction d'un tutoriel dont l'intitulé est **{1}**.\n"
-"\n"
-"J'aimerais obtenir un maximum de retour sur celui-ci, sur le fond ainsi que "
-"sur la forme, afin de proposer en validation un texte de qualité.\n"
-"\n"
-"Si vous êtes intéressé, cliquez ci-dessous \n"
-"\n"
-"-> [Lien de la beta du tutoriel : {1}]({2}) <-\n"
-"\n"
-"\n"
-"\n"
-"Merci d'avance pour votre aide"
-msgstr ""
-
-#: zds/tutorial/views.py:690
-msgid "[beta][tutoriel]{0}"
-msgstr ""
-
-#: zds/tutorial/views.py:698
-msgid ""
-"Bonjour {},\n"
-"\n"
-"Vous venez de mettre votre tutoriel **{}** en beta. La communauté pourra le "
-"consulter afin de vous faire des retours constructifs avant sa soumission en "
-"validation.\n"
-"\n"
-"Un sujet dédié pour la beta de votre tutoriel a été crée dans le forum et "
-"est accessible [ici]({})"
-msgstr ""
-
-#: zds/tutorial/views.py:710
-msgid "Tutoriel en beta : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:717
-msgid ""
-"Bonjour,\n"
-"\n"
-"La beta du tutoriel est de nouveau active.\n"
-"\n"
-"-> [Lien de la beta du tutoriel : {0}]({1}) <-\n"
-"\n"
-"\n"
-"\n"
-"Merci pour vos relectures"
-msgstr ""
-
-#: zds/tutorial/views.py:726
-msgid "La BETA sur ce tutoriel est bien activée."
-msgstr ""
-
-#: zds/tutorial/views.py:728
-msgid "La BETA sur ce tutoriel n'a malheureusement pas pu être activée."
-msgstr ""
-
-#: zds/tutorial/views.py:737
-msgid ""
-"Bonjour à tous,\n"
-"\n"
-"J'ai commencé ({0}) la rédaction d'un tutoriel dont l'intitulé est **{1}**.\n"
-"\n"
-"J'aimerai obtenir un maximum de retour sur celui-ci, sur le fond ainsi que "
-"sur la forme, afin de proposer en validation un texte de qualité.\n"
-"\n"
-"Si vous êtes intéressé, cliquez ci-dessous \n"
-"\n"
-"-> [Lien de la beta du tutoriel : {1}]({2}) <-\n"
-"\n"
-"\n"
-"\n"
-"Merci d'avance pour votre aide"
-msgstr ""
-
-#: zds/tutorial/views.py:759
-msgid ""
-"Bonjour, !\n"
-"\n"
-"La beta du tutoriel a été mise à jour.\n"
-"\n"
-"-> [Lien de la beta du tutoriel : {0}]({1}) <-\n"
-"\n"
-"\n"
-"\n"
-"Merci pour vos relectures"
-msgstr ""
-
-#: zds/tutorial/views.py:767
-msgid "La BETA sur ce tutoriel a bien été mise à jour."
-msgstr ""
-
-#: zds/tutorial/views.py:769
-msgid "La BETA sur ce tutoriel n'a malheureusement pas pu être mise à jour."
-msgstr ""
-
-#: zds/tutorial/views.py:777
-msgid ""
-"Désactivation de la beta du tutoriel **{}**\n"
-"\n"
-"Pour plus d'informations envoyez moi un message privé."
-msgstr ""
-
-#: zds/tutorial/views.py:781
-msgid "La BETA sur ce tutoriel a bien été désactivée."
-msgstr ""
-
-#: zds/tutorial/views.py:1448
-msgid "La partie « {0} » a été ajoutée avec succès."
-msgstr ""
-
-#: zds/tutorial/views.py:1489
-msgid "Déplacement de la partie {} "
-msgstr ""
-
-#: zds/tutorial/views.py:1516
-msgid "Suppression de la partie {} "
-msgstr ""
-
-#: zds/tutorial/views.py:1871
-msgid "Le chapitre « {0} » a été ajouté avec succès."
-msgstr ""
-
-#: zds/tutorial/views.py:1920
-msgid "Déplacement du chapitre {}"
-msgstr ""
-
-#: zds/tutorial/views.py:1921
-msgid "Le chapitre a bien été déplacé."
-msgstr ""
-
-#: zds/tutorial/views.py:1957
-msgid "Suppression du chapitre {}"
-msgstr ""
-
-#: zds/tutorial/views.py:1958
-msgid "Le chapitre a bien été supprimé."
-msgstr ""
-
-#: zds/tutorial/views.py:2240
-msgid "Suppression de l'extrait {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2266
-msgid "Déplacement de l'extrait {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2652
-msgid "Modification du tutoriel : «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2659
-msgid "Création du tutoriel «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2706
-msgid "Suppresion de la partie : «{}»"
-msgstr ""
-
-#: zds/tutorial/views.py:2712
-msgid "Modification de la partie «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2717
-msgid "Création de la partie «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2771
-msgid "Suppresion du chapitre : «{}»"
-msgstr ""
-
-#: zds/tutorial/views.py:2777
-msgid "Modification du tutoriel «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2780
-msgid "Modification du chapitre «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2785
-msgid "Création du chapitre «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2850
-msgid "Suppression de l'extrait : «{}»"
-msgstr ""
-
-#: zds/tutorial/views.py:2858
-msgid "Mise à jour de l'extrait «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:2861
-msgid "Création de l'extrait «{}» {} {}"
-msgstr ""
-
-#: zds/tutorial/views.py:3357
-msgid ""
-"Bonjour {0},Vous recevez ce message car vous avez signalé le message de *{1}"
-"*, dans le tutoriel [{2}]({3}). Votre alerte a été traitée par **{4}** et il "
-"vous a laissé le message suivant :\n"
-"\n"
-"> {5}\n"
-"\n"
-"Toute l'équipe de la modération vous remercie !"
-msgstr ""
-
-#: zds/tutorial/views.py:3371
-msgid "Résolution d'alerte : {0}"
-msgstr ""
-
-#: zds/tutorial/views.py:3377
-msgid "L'alerte a bien été résolue."
-msgstr ""
-
-#: zds/tutorial/views.py:3405
-msgid ""
-"Vous éditez ce message en tant que modérateur (auteur : {}). Soyez encore "
-"plus prudent lors de l'édition de celui-ci !"
-msgstr ""
-
-#: zds/utils/tutorials.py:292
-msgid "Impossible de déplacer l'objet en position {0}"
-msgstr ""
-
-#: zds/utils/tutorials.py:319
-msgid "Le tutoriel que vous souhaitez importer manque de titre"
-msgstr ""
-
-#: zds/utils/tutorials.py:321
-msgid ""
-"Les métadonnées du tutoriel à importer ne nous permettent pas de connaître "
-"son type"
-msgstr ""
-
-#: zds/utils/tutorials.py:324
-msgid "Vous essayez d'importer un big tutoriel dans un mini tutoriel"
-msgstr ""
-
-#: zds/utils/tutorials.py:326 zds/utils/tutorials.py:359
-msgid "La structure de vos métadonnées est incohérente"
-msgstr ""
-
-#: zds/utils/tutorials.py:328
-msgid "La structure de vos extraits est incohérente"
-msgstr ""
-
-#: zds/utils/tutorials.py:332 zds/utils/tutorials.py:383
-msgid "Un de vos extraits est mal renseigné"
-msgstr ""
-
-#: zds/utils/tutorials.py:334 zds/utils/tutorials.py:385
-msgid "L'extrait « {} » n'existe pas dans notre base"
-msgstr ""
-
-#: zds/utils/tutorials.py:336
-msgid "Vous n'êtes pas autorisé à modifier l'extrait « {} »"
-msgstr ""
-
-#: zds/utils/tutorials.py:341 zds/utils/tutorials.py:395
-msgid ""
-"Le fichier « {} » renseigné dans vos métadonnées pour l'extrait « {} » ne se "
-"trouve pas dans votre zip"
-msgstr ""
-
-#: zds/utils/tutorials.py:352 zds/utils/tutorials.py:425
-msgid ""
-"Le fichier « {} » renseigné dans vos métadonnées pour le tutoriel « {} » ne "
-"se trouve pas dans votre zip"
-msgstr ""
-
-#: zds/utils/tutorials.py:357
-msgid "Vous essayez d'importer un mini tutoriel dans un big tutoriel"
-msgstr ""
-
-#: zds/utils/tutorials.py:363
-msgid "La structure de vos parties est incohérente"
-msgstr ""
-
-#: zds/utils/tutorials.py:365
-msgid "La partie « {} » n'existe pas dans notre base"
-msgstr ""
-
-#: zds/utils/tutorials.py:368
-msgid "La partie « {} » n'est pas dans le tutoriel à modifier "
-msgstr ""
-
-#: zds/utils/tutorials.py:373
-msgid "La structure de vos chapitres est incohérente"
-msgstr ""
-
-#: zds/utils/tutorials.py:375
-msgid "Le chapitre « {} » n'existe pas dans notre base"
-msgstr ""
-
-#: zds/utils/tutorials.py:378
-msgid "Le chapitre « {} » n'est pas dans le tutoriel a modifier"
-msgstr ""
-
-#: zds/utils/tutorials.py:389
-msgid "Vous n'êtes pas autorisé à modifier l'extrait « {} » "
-msgstr ""
-
-#: zds/utils/tutorials.py:405
-msgid ""
-"Le fichier « {} » renseigné dans vos métadonnées pour le chapitre « {} » ne "
-"se trouve pas dans votre zip"
-msgstr ""
-
-#: zds/utils/tutorials.py:415
-msgid ""
-"Le fichier « {} » renseigné dans vos métadonnées pour la partie « {} » ne se "
-"trouve pas dans votre zip"
-msgstr ""
-
-#: zds/utils/tutorials.py:475
-msgid ""
-"L'archive n'a pas pu être importée car le fichier manifest.json (fichier de "
-"métadonnées est introuvable)."
-msgstr ""
-
-#: zds/utils/tutorials.py:509
-msgid "Import du tutoriel"
-msgstr ""
-
-#: zds/utils/tutorials.py:521
-msgid "Le tutoriel {} a été importé avec succès"
-msgstr ""
-
-#: zds/utils/tutorials.py:523
-msgid "L'archive n'a pas pu être importée car elle n'est pas au format zip"
-msgstr ""
diff --git a/doc/install-linux.md b/doc/install-linux.md
index 4a9e66c37d..b059c846b9 100644
--- a/doc/install-linux.md
+++ b/doc/install-linux.md
@@ -47,7 +47,7 @@ Une documentation plus complète de cet outil [est disponible ici](http://docs.p
Si vous ne comptez qu'au back-end du site, téléchargez le zip des ressources ici : http://zestedesavoir.com/static/pack.zip
Il faudra l'extraire dans le dossier `dist/` à la racine de votre projet.
-Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédiée](gulp.md).
+Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédiée](http://zestedesavoir.github.io/zds-site/).
## Lancer ZdS
diff --git a/doc/install-os-x.md b/doc/install-os-x.md
index cb149f6337..d0aaae0361 100644
--- a/doc/install-os-x.md
+++ b/doc/install-os-x.md
@@ -46,7 +46,7 @@ export CPPFLAGS=-Qunused-arguments
Si vous ne comptez qu'au back-end du site, téléchargez le zip des ressources ici : http://zestedesavoir.com/static/pack.zip
Il faudra l'extraire dans le dossier `dist/` à la racine de votre projet.
-Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédiée](gulp.md).
+Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédiée](http://zestedesavoir.github.io/zds-site/).
## Installation de toutes les dépendances
diff --git a/doc/install-windows.md b/doc/install-windows.md
index 798be615a5..71539d7737 100644
--- a/doc/install-windows.md
+++ b/doc/install-windows.md
@@ -13,7 +13,7 @@ Si une commande ne passe pas, essayez de savoir pourquoi avant de continuer.
- Redémarrez Powershell
- Installez pip : `easy_install pip`
- Désactivez la sécurité sur les script powershell `Set-ExecutionPolicy RemoteSigned`
-- Installez Virtualenv avec les commandes suivante :
+- Installez Virtualenv avec les commandes suivante :
- `pip install virtualenv`
- `pip install virtualenvwrapper-powershell`
- Créez votre workspace dédié à ZdS
@@ -28,7 +28,7 @@ Si une commande ne passe pas, essayez de savoir pourquoi avant de continuer.
Si vous ne comptez qu'au back-end du site, téléchargez le zip des ressources ici : http://zestedesavoir.com/static/pack.zip
Il faudra l'extraire dans le dossier `dist/` à la racine de votre projet.
-Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédiée](gulp.md).
+Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédiée](http://zestedesavoir.github.io/zds-site/).
## Suite de l'installation
@@ -38,7 +38,7 @@ Si vous comptez contribuer au front-end, rendez-vous sur [la documentation dédi
- `python manage.py syncdb`
- `python manage.py migrate`
- `python manage.py runserver`
-- Pour redémarrer virtualenv les fois suivantes : `~\.virtualenvs\zdsenv\Scripts\activate.ps1`
+- Pour redémarrer virtualenv les fois suivantes : `~\.virtualenvs\zdsenv\Scripts\activate.ps1`
Pour faire fonctionner ZdS dans son ensemble vous devez installer les outils LateX et Pandoc.
diff --git a/doc/sphinx/source/forum/forum.rst b/doc/sphinx/source/forum/forum.rst
index c238505599..cffcd3be95 100644
--- a/doc/sphinx/source/forum/forum.rst
+++ b/doc/sphinx/source/forum/forum.rst
@@ -11,12 +11,56 @@ Le découpage des forums
La modération des forums
========================
+Sur Zeste de Savoir, une modération des forums, autant sur les sujets, que sur les messages inclus, est faite par les membres possèdant un certain rang. Cette dernière, permet d'éviter tout débordement ou autre.
+
La modération des sujets
------------------------
+Tout d'abord, il y a une posibilité de faire de la modération par sujet. Ici, cette modération s'effectue grâce aux liens se trouvant dans *sidebar* (zone se trouvant sur le côté gauche de la page).
+
+ .. figure:: images/modo_forum_sujet.png
+ :align: center
+
+Nous retrouvons ici, trois items :
+
+- **Fermer le sujet** : ici, le but est de fermer le sujet. Ce qui empêchera quiconque de poster dedans. Un cadena, apparaîtra aussi à côté du sujet sur la liste des sujets de la catégorie, et, l'encart suivant fera alors son apparition sur le sujet en lui-même :
+
+ .. figure:: images/sujet_ferme.png
+ :align: center
+
+- **Marquer en post-it** : le sujet sera mis en post-it sur la catégorie dans laquelle il se trouve. Ce qui fait qu'il surpassera tout les autres sujets et cela, même si une réponse plus récente vient d'être posté dans un autre sujet. Il ne **pourra jamais se retrouver en-dessous des autres**. Lors de la mise en post-it, une épingle apparaît à côté du sujet dans la catégorie où il se trouve.
+
+ .. figure:: images/post_it.png
+ :align: center
+
+- **Déplacer le sujet** : cet item permet de faire un déplacement de sujet, au cas-où un membre se serait trompé en postant. Cela évite qu'il ait à recréer un sujet et donc un doublon de celui-ci. Le déplacement, se fait via une modale :
+
+ .. figure:: images/deplacement.png
+ :align: center
+
La modération des messages
--------------------------
+Il est aussi possible d'effectuer la modération plus finement, en ciblant des messages en particulier dans des sujets. Cela se fait grâce aux différents liens qui se trouvent sur les messages :
+
+ .. figure:: images/modo_message.png
+ :align: center
+
+Ici, les différents choses que vous pouvez faire, sont :
+
+- **Masquer** : cela, rend la lecture du message impossible par les autres membres. Mais l'emplacement du message reste présent, comme le montre la capture ci-dessous. Vous pouvez également contaster sur cette capture, que vous avez, avec un certain rang, la possibilité de démasquer le message. Avec ce dernier, vous avez la possiblité de masquer tout les messages des forums. Mais un membre, peut masquer de lui-même, ces propres messages.
+
+ .. figure:: images/message_masque.png
+ :align: center
+
+- **Éditer** : en cliquant ici, vous accèderez à l'interface d'édition des messages. En tant que modérateur, vous pouvez éditer tout les messages des forums, dès lors, cette encart apparaît :
+
+ .. figure:: images/edit_modo.png
+ :align: center
+
+- **Signaler** : cela permet d'envoyer une demande d'intervention à l'équipe modératrice du site. Ce bouton, n'est pas un résultant de votr rang, tout les membres le possèdes.
+- **Citer** : permet de citer un message lors de la rédaction d'une réponse. Ce bouton, n'est pas un résultant de votre rang.
+
Les filtres sur les sujets
==========================
diff --git a/doc/sphinx/source/forum/images/deplacement.png b/doc/sphinx/source/forum/images/deplacement.png
new file mode 100644
index 0000000000..512309700d
Binary files /dev/null and b/doc/sphinx/source/forum/images/deplacement.png differ
diff --git a/doc/sphinx/source/forum/images/edit_modo.png b/doc/sphinx/source/forum/images/edit_modo.png
new file mode 100644
index 0000000000..872cc86a21
Binary files /dev/null and b/doc/sphinx/source/forum/images/edit_modo.png differ
diff --git a/doc/sphinx/source/forum/images/message_masque.png b/doc/sphinx/source/forum/images/message_masque.png
new file mode 100644
index 0000000000..b36de30021
Binary files /dev/null and b/doc/sphinx/source/forum/images/message_masque.png differ
diff --git a/doc/sphinx/source/forum/images/modo_forum_sujet.png b/doc/sphinx/source/forum/images/modo_forum_sujet.png
new file mode 100644
index 0000000000..99e6338f92
Binary files /dev/null and b/doc/sphinx/source/forum/images/modo_forum_sujet.png differ
diff --git a/doc/sphinx/source/forum/images/modo_message.png b/doc/sphinx/source/forum/images/modo_message.png
new file mode 100644
index 0000000000..12d823a819
Binary files /dev/null and b/doc/sphinx/source/forum/images/modo_message.png differ
diff --git a/doc/sphinx/source/forum/images/post_it.png b/doc/sphinx/source/forum/images/post_it.png
new file mode 100644
index 0000000000..53bf0a883f
Binary files /dev/null and b/doc/sphinx/source/forum/images/post_it.png differ
diff --git a/doc/sphinx/source/forum/images/sujet_ferme.png b/doc/sphinx/source/forum/images/sujet_ferme.png
new file mode 100644
index 0000000000..ed59bf8345
Binary files /dev/null and b/doc/sphinx/source/forum/images/sujet_ferme.png differ
diff --git a/doc/sphinx/source/install/fixtures.rst b/doc/sphinx/source/install/fixtures.rst
new file mode 100644
index 0000000000..c36812b203
--- /dev/null
+++ b/doc/sphinx/source/install/fixtures.rst
@@ -0,0 +1,36 @@
+====================================
+Création d'un jeu de données de test
+====================================
+
+Afin de vous permettre de tester rapidement l'application zeste de savoir, nous mettons à votre disposition un jeu complet de données de test.
+Ces données sont à séparer en deux types :
+
+- les données totalement sérialisables (les utilisateurs, les forums, les catégories...)
+- les données qui nécessitent un traitement lors de leur création (indexation git des tuto, import d'image des galleries...)
+
+Chacun des jeux de données est géré par deux outils différents :
+
+Les fixtures django
+===================
+
+Pour les données totalement sérialisables, nous utilisons la commande `python manage.py loaddata` de django.
+Cette commande prend des fichiers yaml en entrée et crée les données ainsi sérialisées.
+Le format est documenté sur le site officiel de django.
+
+Les fixtures ad hoc
+===================
+
+Certaines données nécessitent des traitement complexes avant d'être utilisables et donc ne peuvent être plainement sérialisées et utilisées par l'outil de django.
+Pour cela, nous avons mis en place un script qui permet d'utiliser les factories pour créer ces objets et y appliquer les traitements nécessaires.
+
+Pour utiliser les fixtures de ce type, il vous suffira de lancer le script `python load_factory_data.py fichier_fixtures.yaml`.
+
+Tout comme l'outil django, nous utilisons yaml pour configurer les données, le format d'une fixture sera celui-ci
+
+.. sourcecode:: yaml
+
+ - factory: nom_factory
+ fields:
+ champ1: "valeur1"
+ champ2: "valeur2"
+ champN: "valeurN"
diff --git a/doc/sphinx/source/install/install-linux.rst b/doc/sphinx/source/install/install-linux.rst
index f308735dbd..284ae9bb08 100644
--- a/doc/sphinx/source/install/install-linux.rst
+++ b/doc/sphinx/source/install/install-linux.rst
@@ -67,7 +67,7 @@ Une fois dans votre environnement python (``source ../bin/activate`` si vous uti
.. sourcecode:: bash
- pip install --upgrade -r requirements.txt
+ pip install --upgrade -r requirements.txt -r requirements-dev.txt
python manage.py syncdb
python manage.py migrate
python manage.py runserver
diff --git a/doc/sphinx/source/install/install-os-x.rst b/doc/sphinx/source/install/install-os-x.rst
index ee6d311f8e..4969d7ea8f 100644
--- a/doc/sphinx/source/install/install-os-x.rst
+++ b/doc/sphinx/source/install/install-os-x.rst
@@ -66,7 +66,7 @@ Installation de toutes les dépendances
.. sourcecode:: bash
- pip install --upgrade -r requirements.txt
+ pip install --upgrade -r requirements.txt -r requirements-dev.txt
npm install
gulp build
diff --git a/doc/sphinx/source/install/install-windows.rst b/doc/sphinx/source/install/install-windows.rst
index 38f3d53e46..bcc6e9387e 100644
--- a/doc/sphinx/source/install/install-windows.rst
+++ b/doc/sphinx/source/install/install-windows.rst
@@ -40,7 +40,7 @@ Suite de l'installation
- Dans la console PowerShell via l'environnement zdsenv installez les dépendances.
- ``easy_install lxml``
- - ``pip install -r requirements.txt``
+ - ``pip install -r requirements.txt -r requirements-dev.txt``
- ``python manage.py syncdb``
- ``python manage.py migrate``
- ``python manage.py runserver``
diff --git a/doc/sphinx/source/introduction.rst b/doc/sphinx/source/introduction.rst
index c57b6ed25f..2832eb6894 100644
--- a/doc/sphinx/source/introduction.rst
+++ b/doc/sphinx/source/introduction.rst
@@ -50,11 +50,13 @@ Il est possible de personnaliser ZdS pour n'importe quel site communautaire de p
},
'article': {
'repo_path': os.path.join(SITE_ROOT, 'articles-data'),
+ 'home_number': 5,
},
'tutorial': {
'repo_path': os.path.join(SITE_ROOT, 'tutoriels-private'),
'repo_public_path': os.path.join(SITE_ROOT, 'tutoriels-public'),
- 'default_license_pk': 7
+ 'default_license_pk': 7,
+ 'home_number': 5,
},
'forum': {
'posts_per_page': 21,
diff --git a/doc/sphinx/source/tutorial/tutorial.rst b/doc/sphinx/source/tutorial/tutorial.rst
index 7387f892a5..00a1ef7111 100644
--- a/doc/sphinx/source/tutorial/tutorial.rst
+++ b/doc/sphinx/source/tutorial/tutorial.rst
@@ -74,12 +74,12 @@ On pourrait le représenter ainsi :
Tutoriels -> chapitre -
|-> introduction
- |->
+ |->
|-> extrait 1
|-> extrait 2
|-> extrait ...
|-> extrait n
- |->
+ |->
|-> conclusion
@@ -222,7 +222,7 @@ adéquate.
La bêta
-------
-Lorsque les auteurs estiment que leur tutoriel est arrivé à un certain niveau de maturité, et qu'ils souhaitent
+Lorsque les auteurs estiment que leur tutoriel est arrivé à un certain niveau de maturité, et qu'ils souhaitent
recueillir les premiers retours de lecteurs, ils se doivent de mettre à disposition de la communauté le tutoriel en
lecture seule. C'est le mode bêta.
@@ -233,7 +233,7 @@ en bêta, en postant le lien vers la version bêta du tutoriel.
Le lien de la bêta, peut être trouvé via votre profil utilisateur, vous devez recopier tout le lien avec la partie ``?version=blablabla``. Et pensez bien à modifier ce lien lorsque vous mettez à jour votre version bêta.
-En fait lorsqu'un tutoriel est en mode bêta, il s'agit d'une version précise qui est mise
+En fait lorsqu'un tutoriel est en mode bêta, il s'agit d'une version précise qui est mise
dans ce mode. On peut continuer à mettre à jour la version brouillon pour rajouter de nouveaux chapitres
à notre tutoriel, pendant ce temps, la communauté lit une version figée de notre tutoriel. L'avantage étant que
si le tutoriel prend beaucoup de temps à lire, le lecteur n'a pas de mauvaise surprise de mise à jour
@@ -252,7 +252,7 @@ votre tutoriel, il devra recommencer son travail si vous faites une mise à jour
ralentir le processus de validation de votre tutoriel, mais décourager aussi le validateur. Donc un conseil à donner serait
de n'envoyer que du contenu sûr en validation.
-Comme pour la bêta, la version brouillon du tutoriel peut continuer à être améliorée pendant que la version
+Comme pour la bêta, la version brouillon du tutoriel peut continuer à être améliorée pendant que la version
de validation reste figée. Auteurs et validateurs peuvent donc continuer à travailler chacun de son côté.
La publication
@@ -275,6 +275,30 @@ Pour différentes raisons, il se peut que l'export dans divers formats échoue.
Aujourd'hui il existe des bugs dans la conversion en PDF (blocs custom), qui devront être réglés plus tard avec la `ZEP 05 `_)
+L'entraide
+----------
+
+Afin d'aider les auteurs de tutoriels à rédiger ces derniers, des options lors de la création/édition de ce dernier sont disponibles. L'auteur peut ainsi faire aisément une demande d'aide pour les compétences suivantes (liste non exhaustive) :
+
+- Besoin d'aide à l'écriture
+- Besoin d'aide à la correction/relecture
+- Besoin d'aide pour illustrer
+- Désir d'abandonner le tutoriel et recherche d'un repreneur
+
+L'ensemble des tutoriels à la recherche d'aide est visible via la page "help.html" (template dans le fichier `templates/tutorial/tutorial/help.html`). Cette page génère un tableau récapitulatif de toutes les demandes d'aides pour les différents tutoriels et des filtres peuvent être appliqués. Toutes les données servant à peupler ce tableau sont renvoyées via la méthode `help_tutorial` dans le fichier `zds/tutorial/views.py`. Cette méthode peut prendre en compte un argument en GET nommé `type` désignant le filtre à appliquer. Cet argument représente le slug d'une des options de la liste précédentes.
+En cas d'absence du paramètre, tout les tutoriels ayant au moins une demande d'aide d'activées ou en bêta sont renvoyé au template.
+De nouveau type de demande d'aide peuvent-être rajouté via l'interface d'administration Django dans la classe `Utils.HelpWriting`.
+
+Les fixtures d'aides
+++++++++++++++++++++
+
+Quelques données de test sont présentes dans le fichier `fixtures/aide_tuto_media.yaml`. En chargeant ces dernières, un tuto peut alors être modifié pour recevoir des demandes d'aides (en allant les sélectionner dans la liste à cet effet lors de l'édition du tuto).
+Pour chaque données de test, il faut aussi passer par l'interface d'administration Django pour ajouter les images relatives à ces aides (limites techniques du chargement automatique). Quatres illustrations sont présentes dans le dossier de fixtures correspondant aux quatres aides présentes dans les fixtures.
+
+Pour charger ces fixtures, il ne faut pas utiliser la routine habituelle `manage.py loaddata`. En effet, les demandes d'aide ont besoin d'être liées à des images.
+C'est pourquoi, nous utilisons la factory `zds.utils.factories.HelpWritingFactory` pour mettre en place ces fixtures.
+Le code sera donc `python manage.py load_factory_data fixtures/advanced/aide_tuto_media.yaml`.
+
L'aspect technique
==================
@@ -340,3 +364,17 @@ Les tutoriels en *offline* sont tous versionnés, et sont dans le répertoire ``
- On stocke les fichiers html sur le serveur.
Ainsi, pour lire un tutoriel public, on a juste besoin de lire les fichiers html déjà convertis.
+
+Et si un auteur a besoin d'aide ?
++++++++++++++++++++++++++++++++++
+
+Afin d'aider les auteurs de tutoriels à rédiger ces derniers, des options lors de la création/édition de ce dernier sont disponibles. L'auteur peut ainsi faire aisément une demande d'aide pour les compétences suivantes (liste non exhaustive) :
+
+- Besoin d'aide à l'écriture
+- Besoin d'aide à la correction/relecture
+- Besoin d'aide pour illustrer
+- Désir d'abandonner le tutoriel et recherche d'un repreneur
+
+L'ensemble des tutoriels à la recherche d'aide est visible via la page "help.html" (template dans le fichier `templates/tutorial/tutorial/help.html`). Cette page génère un tableau récapitulatif de toutes les demandes d'aides pour les différents tutoriels et des filtres peuvent être appliqués. Toutes les données servant à peupler ce tableau sont renvoyées via la méthode `help_tutorial` dans le fichier `zds/tutorial/views.py`. Cette méthode peut prendre en compte un argument en GET nommé type désignant le filtre à appliquer. Cet argument représente le slug d'une des options de la liste précédentes.
+En cas d'absence du paramètre, tout les tutoriels ayant au moins une demande d'aide d'activées ou en bêta sont renvoyé au template.
+De nouveau type de demande d'aide peuvent-être rajouté via l'interface d'administration Django dans la classe `Utils.HelpWriting`.
\ No newline at end of file
diff --git a/doc/sphinx/source/utils/context_processors.rst b/doc/sphinx/source/utils/context_processors.rst
new file mode 100644
index 0000000000..9f78370d81
--- /dev/null
+++ b/doc/sphinx/source/utils/context_processors.rst
@@ -0,0 +1,19 @@
+
+Les context_processors (processeurs de contexte)
+================================================
+
+La doc de Django explique le principe des context_processors comme ceci :
+
+ Un processeur de contexte possède une interface très simple : ce n’est qu’une fonction Python acceptant un paramètre, un objet HttpRequest, et renvoyant un dictionnaire qui est ensuite ajouté au contexte de gabarit. Chaque processeur de contexte doit renvoyer un dictionnaire.
+
+ Les processeurs de contexte personnalisés peuvent se trouver n’importe où dans le code. Tout ce que Django demande, c’est que le réglage TEMPLATE_CONTEXT_PROCESSORS contienne le chemin vers le processeur personnalisé.
+
+git_version
+-----------
+
+``git_version`` permet d'ajouter les informations sur la branche et le commit de la version actuelle.
+
+app_settings
+------------
+
+``app_settings`` permet d'accéder aux variables de ``ZDS_APP`` qui se trouve dans ``settings.py``.
diff --git a/doc/sphinx/source/utils/utils.rst b/doc/sphinx/source/utils/utils.rst
index 95bd39789d..42f807b41b 100644
--- a/doc/sphinx/source/utils/utils.rst
+++ b/doc/sphinx/source/utils/utils.rst
@@ -4,8 +4,18 @@ Autres outils
Le package ``zds/utils`` contient un certains nombres d'outils transverses.
+pdf_generator
+-------------
+
+Il s'agit d'une commande qui a pour objectif de donner la possibilité via une ligne de commande de regénerer un ou plusieurs pdf de tutoriels déjà publiés.
+
+La commande à lancer est : ``python manage.py pdf_generator``.
+
+Pour préciser le tutoriel à regenerer, il suffit de rajouter l'argument ``id=125,142,56`` pour regenerer les pdfs des tutos dont l'id est ``125``, ``142``, et ``56``.
+
.. toctree::
:maxdepth: 2
translate
- templatetags
\ No newline at end of file
+ templatetags
+ context_processors
diff --git a/fixtures/advanced/aide_tuto_media.yaml b/fixtures/advanced/aide_tuto_media.yaml
new file mode 100755
index 0000000000..cc24431f54
--- /dev/null
+++ b/fixtures/advanced/aide_tuto_media.yaml
@@ -0,0 +1,27 @@
+- factory: zds.utils.factories.HelpWritingFactory
+ fields:
+ title: "Rédacteur"
+ tablelabel: "Besoin d'aide pour la rédaction"
+ slug: "redacteur"
+ fixture_image_path: "aide_redacteur.png"
+
+- factory: zds.utils.factories.HelpWritingFactory
+ fields:
+ title: "Correcteur"
+ tablelabel: "Besoin d'aide pour la correction"
+ slug: "correcteur"
+ fixture_image_path: "aide_correcteur.png"
+
+- factory: zds.utils.factories.HelpWritingFactory
+ fields:
+ title: "Illustrateur"
+ tablelabel: "Besoin d'aide pour l'illustration"
+ slug: "illustrateur"
+ fixture_image_path: "aide_illustrateur.png"
+
+- factory: zds.utils.factories.HelpWritingFactory
+ fields:
+ title: "Repreneur"
+ tablelabel: "Cherche un repreneur"
+ slug: "repreneur"
+ fixture_image_path: "aide_repreneur.png"
\ No newline at end of file
diff --git a/fixtures/aide_correcteur.png b/fixtures/aide_correcteur.png
new file mode 100644
index 0000000000..9eb7f780d1
Binary files /dev/null and b/fixtures/aide_correcteur.png differ
diff --git a/fixtures/aide_illustrateur.png b/fixtures/aide_illustrateur.png
new file mode 100644
index 0000000000..5aba96e4e7
Binary files /dev/null and b/fixtures/aide_illustrateur.png differ
diff --git a/fixtures/aide_redacteur.png b/fixtures/aide_redacteur.png
new file mode 100644
index 0000000000..b242979804
Binary files /dev/null and b/fixtures/aide_redacteur.png differ
diff --git a/fixtures/aide_repreneur.png b/fixtures/aide_repreneur.png
new file mode 100644
index 0000000000..a0f63f0e34
Binary files /dev/null and b/fixtures/aide_repreneur.png differ
diff --git a/fixtures/licences.yaml b/fixtures/licences.yaml
index bc922f8794..43d7819254 100644
--- a/fixtures/licences.yaml
+++ b/fixtures/licences.yaml
@@ -2,13 +2,13 @@
pk: 1
fields:
code : Beerware
- title : Beerware
+ title : Licence Beerware
description : Si l'utilisateur rencontre l'auteur et considère que le logiciel de ce dernier est utile, il est encouragé à lui offrir une bière « en retour ».
- model: utils.Licence
pk: 2
fields:
code : GNU GPL
- title : GNU GPL
+ title : Licence GNU GPL
description : Chaque personne qui adhère aux termes et aux conditions de la GPL a la permission de modifier le travail, de l'étudier et de redistribuer le travail ou un travail dérivé.
- model: utils.Licence
pk: 7
diff --git a/load_factory_data.py b/load_factory_data.py
new file mode 100644
index 0000000000..fcd3e6eb81
--- /dev/null
+++ b/load_factory_data.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+import argparse
+import yaml
+import zds
+import os
+from zds import settings
+
+parser = argparse.ArgumentParser(description='Give yaml fixture files.')
+
+parser.add_argument('files', type=str, nargs='+', help="The fixture file name.")
+
+args = parser.parse_args()
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zds.settings")
+
+for filename in args.files:
+ stream = open(filename, 'r')
+ fixture_list = yaml.load(stream)
+ for fixture in fixture_list:
+ splitted = str(fixture["factory"]).split(".")
+ module_part = ".".join(splitted[:-1])
+ m = __import__(module_part)
+ for comp in splitted[1:-1]:
+ m = getattr(m, comp)
+
+ obj = getattr(m, splitted[-1])(**fixture["fields"])
+ print(obj)
\ No newline at end of file
diff --git a/package.json b/package.json
index 2c518de005..d91ec4e69d 100644
--- a/package.json
+++ b/package.json
@@ -24,27 +24,26 @@
"homepage": "https://github.com/zestedesavoir/zds-site",
"dependencies": {
"bower": "^1.3.12",
+ "del": "^0.1.3",
"gulp": "^3.7.0",
- "gulp-autoprefixer": "0.0.9",
- "gulp-cache": "^0.2.1",
- "gulp-compass": "^1.1.9",
+ "gulp-autoprefixer": "^2.0.0",
+ "gulp-cache": "^0.2.4",
"gulp-concat": "^2.2.0",
"gulp-filter": "^1.0.0",
- "gulp-flatten": "0.0.2",
- "gulp-imagemin": "^1.0.1",
+ "gulp-flatten": "0.0.4",
+ "gulp-imagemin": "^2.0.0",
"gulp-jshint": "^1.6.2",
"gulp-livereload": "^2.0.0",
- "gulp-load-plugins": "^0.5.1",
- "gulp-minify-css": "^0.3.4",
- "gulp-newer": "^0.3.0",
+ "gulp-load-plugins": "^0.8.0",
+ "gulp-minify-css": "^0.3.11",
+ "gulp-newer": "^0.5.0",
"gulp-rename": "^1.2.0",
- "gulp-rimraf": "^0.1.0",
- "gulp-sass": "^0.7.2",
+ "gulp-sass": "^1.2.3",
"gulp-size": "^1.0.0",
- "gulp-uglify": "^0.3.0",
+ "gulp-uglify": "^1.0.1",
"gulp-zip": "^2.0.1",
"gulp.spritesmith": "^1.1.0",
- "jshint-stylish": "^0.4.0",
+ "jshint-stylish": "^1.0.0",
"main-bower-files": "^2.0.0"
}
}
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 0000000000..65854da45d
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,6 @@
+PyYAML==3.11
+django-debug-toolbar==1.2.2
+flake8==2.2.5
+autopep8==1.0.4
+sphinx==1.2.3
+faker==0.0.4
diff --git a/requirements.txt b/requirements.txt
index e690b7a656..6ac89bdd60 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
-# Implicit dependencies (facutlative dependencies of dependencies)
+# Implicit dependencies (optional dependencies of dependencies)
pysolr==3.2.0
pygments==2.0.1
-
+python-social-auth==0.1.26
# Explicit dependencies (references in code)
django==1.6.8
coverage==3.7.1
@@ -18,12 +18,5 @@ factory-boy==2.4.1
pygeoip==0.3.2
pillow==2.6.1
https://github.com/zestedesavoir/GitPython/archive/0.3.2-RC2.zip
-https://github.com/zestedesavoir/Python-ZMarkdown/archive/2.4.1-zds.10.zip
+https://github.com/zestedesavoir/Python-ZMarkdown/archive/2.4.1-zds.11.zip
easy-thumbnails==2.2
-
-# Development tools
-PyYAML==3.11
-django-debug-toolbar==1.2.2
-flake8==2.2.5
-autopep8==1.0.4
-sphinx==1.2.3
diff --git a/templates/article/includes/sidebar_actions.part.html b/templates/article/includes/sidebar_actions.part.html
index 34102acef0..8cbd8f35fe 100644
--- a/templates/article/includes/sidebar_actions.part.html
+++ b/templates/article/includes/sidebar_actions.part.html
@@ -1,4 +1,6 @@
{% load i18n %}
+{% load crispy_forms_tags %}
+
{% if user in authors.all or perms.article.change_article %}
{% if article.sha_draft = version %}
@@ -110,7 +112,7 @@
\ No newline at end of file
diff --git a/templates/pages/about.html b/templates/pages/about.html
index 12780fbd2c..fbe0f13f83 100644
--- a/templates/pages/about.html
+++ b/templates/pages/about.html
@@ -47,7 +47,7 @@
{% trans "Cet extrait est vide" %}.
@@ -104,8 +104,8 @@
{% if not chapter.type = 'MINI' %}
- {% if chapter.conclu and chapter.conclu != "None" %}
- {{ chapter.conclu|emarkdown }}
+ {% if chapter.conclu and chapter.conclu != None %}
+ {{ chapter.conclu|emarkdown:is_js }}
{% elif not tutorial.is_beta %}
{% trans "Il n'y a pas de conclusion" %}.
diff --git a/templates/tutorial/index.html b/templates/tutorial/index.html
index e322b77ebf..5941470c66 100644
--- a/templates/tutorial/index.html
+++ b/templates/tutorial/index.html
@@ -17,7 +17,7 @@
{% if tag %}
{% trans "Découvrez tous nos tutoriels sur" %} {{ tag }}. {% trans "Vous pourrez également découvrir divers sujets tous plus intéressants les uns que les autres" %}.
{% else %}
- {% trans "Les tutoriels vous permettent d'apprendre divers sujets tous plus intéressants
+ {% trans "Les tutoriels vous permettent d'apprendre divers sujets tous plus intéressants
les uns que les autres" %}.
{% endif %}
{% endblock %}
@@ -45,7 +45,7 @@
{% blocktrans %} Catégories de tutoriels {% endblocktrans %}
{% with categories='.'|top_categories_tuto %}
diff --git a/templates/tutorial/part/view.html b/templates/tutorial/part/view.html
index b33d027905..b74cb303f9 100644
--- a/templates/tutorial/part/view.html
+++ b/templates/tutorial/part/view.html
@@ -44,7 +44,7 @@
{% block content %}
{% if part.intro and part.intro != "None" %}
- {{ part.intro|emarkdown }}
+ {{ part.intro|emarkdown:is_js }}
{% elif not tutorial.is_beta %}
{% trans "Il n'y a pas d'introduction" %}.
@@ -91,7 +91,7 @@
{% if part.conclu and part.conclu != "None" %}
- {{ part.conclu|emarkdown }}
+ {{ part.conclu|emarkdown:is_js }}
{% elif not tutorial.is_beta %}
{% trans "Il n'y a pas de conclusion" %}.
diff --git a/templates/tutorial/part/view_online.html b/templates/tutorial/part/view_online.html
index d999d65d79..6ccc3fd876 100644
--- a/templates/tutorial/part/view_online.html
+++ b/templates/tutorial/part/view_online.html
@@ -45,7 +45,7 @@
+{% endblock %}
\ No newline at end of file
diff --git a/templates/tutorial/tutorial/history.html b/templates/tutorial/tutorial/history.html
index c5792664ef..2801282fa6 100644
--- a/templates/tutorial/tutorial/history.html
+++ b/templates/tutorial/tutorial/history.html
@@ -28,7 +28,7 @@
{% blocktrans with date_version=log.time.0|humane_time tutorial_title=tutorial.title %}
- Êtes-vous certain de vouloir activer la bêta sur le tutoriel
+ Êtes-vous certain de vouloir activer la bêta sur le tutoriel
"{{ tutorial_title }}" dans sa version du {{ date_version }} ?
{% endblocktrans %}
@@ -121,7 +121,7 @@
{% blocktrans with date_version=log.time.0|humane_time tutorial_title=tutorial.title %}
- Êtes-vous certain de vouloir mettre à jour la bêta du tutoriel
+ Êtes-vous certain de vouloir mettre à jour la bêta du tutoriel
"{{ tutorial_title }}" dans sa version du {{ date_version }} ?
{% endblocktrans %}
{% url 'zds.tutorial.views.answer' %}?tutorial={{ tutorial.pk }}
{% endcaptureas %}
- {% include "misc/message_form.html" with member=user %}
+ {% include "misc/message_form.html" with member=user topic=tutorial %}
{% endblock %}
@@ -198,4 +198,6 @@
{% blocktrans %}Administration{% endblocktrans %}<
{% endif %}
+
+ {% include "misc/social_buttons.part.html" with link=tutorial.get_absolute_url_online text=tutorial.title %}
{% endblock %}
\ No newline at end of file
diff --git a/update.md b/update.md
index b56a381946..b062391650 100644
--- a/update.md
+++ b/update.md
@@ -1,9 +1,9 @@
-Ce fichier liste les actions faire pour mettre en production les diffrentes
+Ce fichier liste les actions à faire pour mettre en production les différentes
versions de Zeste de Savoir.
-Ajoutez tout simplement vos instructions la suite de ce fichier.
+Ajoutez tout simplement vos instructions à la suite de ce fichier.
-Actions faire pour mettre en prod la version : v1.2
+Actions à faire pour mettre en prod la version : v1.2
=====================================================
Issue #1520
@@ -27,16 +27,74 @@ apt-get install optipng
apt-get install jpegoptim
```
-Mettre jour le fichier `settings_prod.py` :
+Mettre à jour le fichier `settings_prod.py` :
```python
-THUMBNAIL_OPTIMIZE_COMMAND = {
+THUMBNAIL_OPTIMIZE_COMMAND = {
'png': '/usr/bin/optipng {filename}',
- 'gif': '/usr/bin/optipng {filename}',
-'jpeg': '/usr/bin/jpegoptim {filename}'
+ 'gif': '/usr/bin/optipng {filename}',
+'jpeg': '/usr/bin/jpegoptim {filename}'
}
```
-Actions faire pour mettre en prod la version : v1.3
+Actions à faire pour mettre en prod la version : v1.3
=====================================================
+
+Actions à faire pour mettre en prod la version : v1.4
+=====================================================
+
+Issue #381
+----------
+
+1. Pour un compte **facebook** :
+ - allez sur https://developers.facebook.com/apps/?action=create et cliquer sur "Create New App" en vert
+ - Dans les paramètre de l'application crée cliquez sur “Add Platform”. Dans les options fournies, choisissez Web, et remplissez l'url du site avec "http://zestedesavoir.com" (adaptez l'adresse en fonction de l'adresse sur laquelle vous déployez)
+ - dans votre fichier `settings_prod.py` rajouter les variables `SOCIAL_AUTH_FACEBOOK_KEY = "clé"`
+et `SOCIAL_AUTH_FACEBOOK_SECRET = "secret"` obtenu via l'application facebook
+
+2. Pour un compte **twitter** :
+ - allez sur https://apps.twitter.com/app/new et creez une nouvelle application
+ - remplissez les informations, et dans votre url de callback pensez à renseigner `http://zestedesavoir.com/complete/twitter/` (adaptez l'adresse en fonction de l'adresse sur laquelle vous déployez)
+ - dans votre fichier `settings_prod.py` rajouter les variables `SOCIAL_AUTH_TWITTER_KEY = "clé"`
+et `SOCIAL_AUTH_TWITTER_SECRET = "secret"` obtenu via l'application twitter
+
+3. Pour un compte **google plus** :
+ - allez sur https://console.developers.google.com/ et creez une nouvelle application
+ - remplissez les informations, et dans votre url de callback pensez à renseigner `http://zestedesavoir.com/complete/google-oauth2/` (adaptez l'adrese en fonction de l'adresse sur laquelle vous testez déployez)
+ - dans votre fichier `settings_prod.py` rajouter les variables `SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "clé"` et `SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "secret"` obtenu via l'application google
+
+Issue #1487
+-----------
+
+Définir des positions pour les catégories de tutoriels dans la partie admin du site (par défaut toutes à 0). L'odre d'affichage se fait par ordre croissant. Les sous-catégories sont triées automatiquement par ordre alphabétique.
+
+ZEP-3
+-----
+
+#### Schéma
+
+Mettre à jour le modèle de données.
+```
+python manage.py migrate
+```
+
+Si un souci apparait via South qui grogne avec un message comme celui-ci pas de panique !
+```
+Inconsistent migration history
+The following options are available:
+ --merge: will just attempt the migration ignoring any potential dependency
+ conflicts.
+```
+Il suffit de lui obéir et tout devrait rentrer dans l'ordre
+```
+python manage.py migrate --merge
+```
+
+#### Données
+
+Pour la ZEP, il faut aussi générer les "aides" de base : rédacteur, correcteur, repreneur, illustrateur.
+Tout est déjà prêt dans les fixtures dédiées à cela :
+```
+python load_factory_data.py fixtures/advanced/aide_tuto_media.yaml
+```
diff --git a/zds/article/factories.py b/zds/article/factories.py
index e2e1ec92c3..ed43a8c49d 100644
--- a/zds/article/factories.py
+++ b/zds/article/factories.py
@@ -9,6 +9,7 @@
from zds.article.models import Article, Reaction, \
Validation, Licence
from zds.utils.articles import export_article
+from zds.article.views import mep
class ArticleFactory(factory.DjangoModelFactory):
@@ -61,7 +62,7 @@ def _prepare(cls, create, **kwargs):
return reaction
-class VaidationFactory(factory.DjangoModelFactory):
+class ValidationFactory(factory.DjangoModelFactory):
FACTORY_FOR = Validation
@@ -75,3 +76,16 @@ class LicenceFactory(factory.DjangoModelFactory):
def _prepare(cls, create, **kwargs):
licence = super(LicenceFactory, cls)._prepare(create, **kwargs)
return licence
+
+
+class PublishedArticleFactory(ArticleFactory):
+ FACTORY_FOR = Article
+
+ @classmethod
+ def _prepare(cls, create, **kwargs):
+ article = super(PublishedArticleFactory, cls)._prepare(create, **kwargs)
+ mep(article, article.sha_draft)
+ article.sha_public = article.sha_draft
+ article.pubdate = datetime.now()
+ article.save()
+ return article
diff --git a/zds/article/forms.py b/zds/article/forms.py
index b52aa91511..7e30aa373a 100644
--- a/zds/article/forms.py
+++ b/zds/article/forms.py
@@ -2,8 +2,9 @@
from django.conf import settings
+from crispy_forms.bootstrap import StrictButton
from crispy_forms.helper import FormHelper
-from crispy_forms.layout import Layout, Field, Hidden
+from crispy_forms.layout import Layout, Field, Hidden, ButtonHolder
from django import forms
from django.core.urlresolvers import reverse
@@ -57,7 +58,14 @@ class ArticleForm(forms.Form):
)
licence = forms.ModelChoiceField(
- label=_(u"Licence de votre publication"),
+ label=_(
+ _(u'Licence de votre publication (En savoir plus sur les licences et {2})')
+ .format(
+ settings.ZDS_APP['site']['licenses']['licence_info_title'],
+ settings.ZDS_APP['site']['licenses']['licence_info_link'],
+ settings.ZDS_APP['site']['name']
+ )
+ ),
queryset=Licence.objects.all(),
required=True,
empty_label=None
@@ -172,3 +180,26 @@ def clean(self):
u'caractères').format(settings.ZDS_APP['forum']['max_post_length'])])
return cleaned_data
+
+
+class ActivJsForm(forms.Form):
+
+ js_support = forms.BooleanField(
+ label='Cocher pour activer JSFiddle',
+ required=False,
+ initial=True
+ )
+
+ def __init__(self, *args, **kwargs):
+ super(ActivJsForm, self).__init__(*args, **kwargs)
+ self.helper = FormHelper()
+ self.helper.form_action = reverse('zds.article.views.activ_js')
+ self.helper.form_method = 'post'
+
+ self.helper.layout = Layout(
+ Field('js_support'),
+ ButtonHolder(
+ StrictButton(
+ _(u'Valider'),
+ type='submit'),),
+ Hidden('article', '{{ article.pk }}'), )
diff --git a/zds/article/migrations/0004_auto__add_field_article_js_support.py b/zds/article/migrations/0004_auto__add_field_article_js_support.py
new file mode 100644
index 0000000000..0f8d0b7c21
--- /dev/null
+++ b/zds/article/migrations/0004_auto__add_field_article_js_support.py
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'Article.js_support'
+ db.add_column(u'article_article', 'js_support',
+ self.gf('django.db.models.fields.BooleanField')(default=False),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'Article.js_support'
+ db.delete_column(u'article_article', 'js_support')
+
+
+ models = {
+ u'article.article': {
+ 'Meta': {'object_name': 'Article'},
+ 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'db_index': 'True', 'symmetrical': 'False'}),
+ 'create_at': ('django.db.models.fields.DateTimeField', [], {}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'is_locked': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_visible': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}),
+ 'js_support': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_reaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'last_reaction'", 'null': 'True', 'to': u"orm['article.Reaction']"}),
+ 'licence': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['utils.Licence']", 'null': 'True', 'blank': 'True'}),
+ 'pubdate': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+ 'sha_draft': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
+ 'sha_public': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
+ 'sha_validation': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '80'}),
+ 'subcategory': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['utils.SubCategory']", 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'text': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
+ },
+ u'article.articleread': {
+ 'Meta': {'object_name': 'ArticleRead'},
+ 'article': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['article.Article']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'reaction': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['article.Reaction']"}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'reactions_read'", 'to': u"orm['auth.User']"})
+ },
+ u'article.reaction': {
+ 'Meta': {'object_name': 'Reaction', '_ormbases': [u'utils.Comment']},
+ 'article': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['article.Article']"}),
+ u'comment_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['utils.Comment']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ u'article.validation': {
+ 'Meta': {'object_name': 'Validation'},
+ 'article': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['article.Article']", 'null': 'True', 'blank': 'True'}),
+ 'comment_authors': ('django.db.models.fields.TextField', [], {}),
+ 'comment_validator': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'date_proposition': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+ 'date_reserve': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'date_validation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'status': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '10'}),
+ 'validator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'articles_author_validations'", 'null': 'True', 'to': u"orm['auth.User']"}),
+ 'version': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '80', 'null': 'True', 'blank': 'True'})
+ },
+ u'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ u'auth.permission': {
+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ u'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ u'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ u'utils.comment': {
+ 'Meta': {'object_name': 'Comment'},
+ 'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'comments'", 'to': u"orm['auth.User']"}),
+ 'dislike': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'editor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments-editor'", 'null': 'True', 'to': u"orm['auth.User']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ip_address': ('django.db.models.fields.CharField', [], {'max_length': '39'}),
+ 'is_visible': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'like': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'position': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+ 'pubdate': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'text': ('django.db.models.fields.TextField', [], {}),
+ 'text_hidden': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '80'}),
+ 'text_html': ('django.db.models.fields.TextField', [], {}),
+ 'update': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'})
+ },
+ u'utils.licence': {
+ 'Meta': {'object_name': 'Licence'},
+ 'code': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+ 'description': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '80'})
+ },
+ u'utils.subcategory': {
+ 'Meta': {'object_name': 'SubCategory'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '80'}),
+ 'subtitle': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '80'})
+ }
+ }
+
+ complete_apps = ['article']
\ No newline at end of file
diff --git a/zds/article/models.py b/zds/article/models.py
index 0ddef61969..2bccbb1a3f 100644
--- a/zds/article/models.py
+++ b/zds/article/models.py
@@ -13,10 +13,10 @@
try:
import ujson as json_reader
-except:
+except ImportError:
try:
import simplejson as json_reader
- except:
+ except ImportError:
import json as json_reader
import json as json_writer
@@ -84,6 +84,7 @@ class Meta:
related_name='last_reaction',
verbose_name='Derniere réaction')
is_locked = models.BooleanField('Est verrouillé', default=False)
+ js_support = models.BooleanField('Support du Javascript', default=False)
licence = models.ForeignKey(Licence,
verbose_name='Licence',
@@ -141,7 +142,8 @@ def load_json(self, path=None, online=False):
json_data = open(man_path)
data = json_reader.load(json_data)
json_data.close()
-
+ if 'licence' in data:
+ data['licence'] = Licence.objects.get(code=data['licence'])
return data
else:
return None
@@ -150,7 +152,8 @@ def load_json_for_public(self):
repo = Repo(self.get_path())
manarticle = get_blob(repo.commit(self.sha_public).tree, 'manifest.json')
data = json_reader.loads(manarticle)
-
+ if 'licence' in data:
+ data['licence'] = Licence.objects.get(code=data['licence'])
return data
def load_dic(self, article_version):
@@ -298,10 +301,11 @@ def get_old_field_value(instance, field, manager):
def get_last_articles():
+ n = settings.ZDS_APP['article']['home_number']
return Article.objects.all()\
.exclude(sha_public__isnull=True)\
.exclude(sha_public__exact='')\
- .order_by('-pubdate')[:5]
+ .order_by('-pubdate')[:n]
def get_prev_article(g_article):
diff --git a/zds/article/tests/tests.py b/zds/article/tests/tests.py
index ac4282562e..a0c5b288b4 100644
--- a/zds/article/tests/tests.py
+++ b/zds/article/tests/tests.py
@@ -426,7 +426,7 @@ def test_workflow_licence(self):
# test change in JSON :
json = article.load_json()
- self.assertEquals(json['licence'], new_licence.code)
+ self.assertEquals(json['licence'].code, new_licence.code)
# then logout ...
self.client.logout()
@@ -458,7 +458,7 @@ def test_workflow_licence(self):
# test change in JSON :
json = article.load_json()
- self.assertEquals(json['licence'], self.licence.code)
+ self.assertEquals(json['licence'].code, self.licence.code)
# then logout ...
self.client.logout()
@@ -511,7 +511,7 @@ def test_workflow_licence(self):
# test change in JSON (normaly, nothing has) :
json = article.load_json()
- self.assertEquals(json['licence'], self.licence.code)
+ self.assertEquals(json['licence'].code, self.licence.code)
def test_workflow_archive_article(self):
"""ensure the behavior of archive with an article"""
diff --git a/zds/article/urls.py b/zds/article/urls.py
index 40c472c366..0797113cef 100644
--- a/zds/article/urls.py
+++ b/zds/article/urls.py
@@ -14,7 +14,7 @@
url(r'^flux/atom/$', feeds.LastArticlesFeedATOM(),
name='article-feed-atom'),
- # TODO: Handle redirect
+
# Moderation
url(r'^resolution_alerte/$',
@@ -45,6 +45,8 @@
'zds.article.views.reservation'),
url(r'^validation/historique/(?P\d+)/$',
'zds.article.views.history_validation'),
+ url(r'^activation_js/$',
+ 'zds.article.views.activ_js'),
# Reactions
url(r'^message/editer/$',
diff --git a/zds/article/views.py b/zds/article/views.py
index 12b3463672..adda67d48f 100644
--- a/zds/article/views.py
+++ b/zds/article/views.py
@@ -4,12 +4,12 @@
from operator import attrgetter
try:
import ujson as json_reader
-except:
+except ImportError:
try:
import simplejson as json_reader
- except:
+ except ImportError:
import json as json_reader
-
+import json
import json as json_writer
import os
import shutil
@@ -26,14 +26,13 @@
from django.db import transaction
from django.db.models import Q
from django.http import Http404, HttpResponse
-from django.shortcuts import get_object_or_404, redirect
+from django.shortcuts import get_object_or_404, redirect, render
from django.utils.encoding import smart_str
from django.views.decorators.http import require_POST
from git import Repo, Actor
from zds.member.decorator import can_write_and_read_now
from zds.member.views import get_client_ip
-from zds.utils import render_template
from zds.utils import slugify
from zds.utils.articles import get_blob
from zds.utils.mps import send_mp
@@ -43,7 +42,7 @@
from zds.utils.tutorials import get_sep, get_text_is_empty
from zds.utils.templatetags.emarkdown import emarkdown
-from .forms import ArticleForm, ReactionForm
+from .forms import ArticleForm, ReactionForm, ActivJsForm
from .models import Article, get_prev_article, get_next_article, Validation, \
Reaction, never_read, mark_read
@@ -76,7 +75,7 @@ def index(request):
article_version = article.load_dic(article_version)
article_versions.append(article_version)
- return render_template('article/index.html', {
+ return render(request, 'article/index.html', {
'articles': article_versions,
'tag': tag,
})
@@ -117,12 +116,20 @@ def view(request, article_pk, article_slug):
.order_by("-date_proposition")\
.first()
- return render_template('article/member/view.html', {
+ if article.js_support:
+ is_js = "js"
+ else:
+ is_js = ""
+ form_js = ActivJsForm(initial={"js_support": article.js_support})
+
+ return render(request, 'article/member/view.html', {
'article': article_version,
'authors': article.authors,
'tags': article.subcategory,
'version': sha,
- 'validation': validation
+ 'validation': validation,
+ 'is_js': is_js,
+ 'formJs': form_js,
})
@@ -194,7 +201,7 @@ def view_online(request, article_pk, article_slug):
# Build form to send a reaction for the current article.
form = ReactionForm(article, request.user)
- return render_template('article/view.html', {
+ return render(request, 'article/view.html', {
'article': article_version,
'authors': article.authors,
'tags': article.subcategory,
@@ -224,9 +231,10 @@ def new(request):
'text': request.POST['text'],
'image': image,
'subcategory': request.POST.getlist('subcategory'),
- 'licence': request.POST['licence']
+ 'licence': request.POST['licence'],
+ 'msg_commit': request.POST['msg_commit']
})
- return render_template('article/member/new.html', {
+ return render(request, 'article/member/new.html', {
'text': request.POST['text'],
'form': form
})
@@ -283,7 +291,7 @@ def new(request):
}
)
- return render_template('article/member/new.html', {
+ return render(request, 'article/member/new.html', {
'form': form
})
@@ -320,12 +328,15 @@ def edit(request):
'text': request.POST['text'],
'image': image,
'subcategory': request.POST.getlist('subcategory'),
- 'licence': licence
+ 'licence': licence,
+ 'msg_commit': request.POST['msg_commit']
})
- return render_template('article/member/edit.html', {
+ form_js = ActivJsForm(initial={"js_support": article.js_support})
+ return render(request, 'article/member/edit.html', {
'article': article,
'text': request.POST['text'],
- 'form': form
+ 'form': form,
+ 'formJs': form_js
})
form = ArticleForm(request.POST, request.FILES)
@@ -368,7 +379,7 @@ def edit(request):
return redirect(article.get_absolute_url())
else:
if "licence" in json:
- licence = Licence.objects.filter(code=json["licence"]).all()[0]
+ licence = json['licence']
else:
licence = Licence.objects.get(
pk=settings.ZDS_APP['tutorial']['default_license_pk']
@@ -381,8 +392,9 @@ def edit(request):
'licence': licence
})
- return render_template('article/member/edit.html', {
- 'article': article, 'form': form
+ form_js = ActivJsForm(initial={"js_support": article.js_support})
+ return render(request, 'article/member/edit.html', {
+ 'article': article, 'form': form, 'formJs': form_js
})
@@ -401,7 +413,7 @@ def find_article(request, pk_user):
article_versions.append(article_version)
# Paginator
- return render_template('article/find.html', {
+ return render(request, 'article/find.html', {
'articles': article_versions, 'usr': user,
})
@@ -850,7 +862,7 @@ def list_validation(request):
article__subcategory__in=[subcategory]) \
.order_by("date_proposition") \
.all()
- return render_template('article/validation/index.html', {
+ return render(request, 'article/validation/index.html', {
'validations': validations,
})
@@ -881,7 +893,7 @@ def history_validation(request, article_pk):
.order_by("date_proposition") \
.all()
- return render_template('article/validation/history.html', {
+ return render(request, 'article/validation/history.html', {
'validations': validations,
'article': article,
'authors': article.authors,
@@ -935,7 +947,7 @@ def history(request, article_pk, article_slug):
logs = repo.head.reference.log()
logs = sorted(logs, key=attrgetter('time'), reverse=True)
- return render_template('article/member/history.html', {
+ return render(request, 'article/member/history.html', {
'article': article, 'logs': logs
})
@@ -956,7 +968,11 @@ def mep(article, sha):
article_version['text'] +
'.html'),
"w")
- html_file.write(emarkdown(md_file_contenu))
+ if article.js_support:
+ is_js = "js"
+ else:
+ is_js = ""
+ html_file.write(emarkdown(md_file_contenu, is_js))
html_file.close()
@@ -1002,13 +1018,17 @@ def answer(request):
form = ReactionForm(article, request.user, initial={
'text': data['text']
})
- return render_template('article/reaction/new.html', {
- 'article': article,
- 'last_reaction_pk': last_reaction_pk,
- 'newreaction': newreaction,
- 'reactions': reactions,
- 'form': form
- })
+ if request.is_ajax():
+ return HttpResponse(json.dumps({"text": emarkdown(data["text"])}),
+ content_type='application/json')
+ else:
+ return render(request, 'article/reaction/new.html', {
+ 'article': article,
+ 'last_reaction_pk': last_reaction_pk,
+ 'newreaction': newreaction,
+ 'reactions': reactions,
+ 'form': form
+ })
# Saving the message
else:
@@ -1031,7 +1051,7 @@ def answer(request):
return redirect(reaction.get_absolute_url())
else:
- return render_template('article/reaction/new.html', {
+ return render(request, 'article/reaction/new.html', {
'article': article,
'last_reaction_pk': last_reaction_pk,
'newreaction': newreaction,
@@ -1062,7 +1082,7 @@ def answer(request):
form = ReactionForm(article, request.user, initial={
'text': text
})
- return render_template('article/reaction/new.html', {
+ return render(request, 'article/reaction/new.html', {
'article': article,
'reactions': reactions,
'last_reaction_pk': last_reaction_pk,
@@ -1113,6 +1133,21 @@ def solve_alert(request):
return redirect(reaction.get_absolute_url())
+@login_required
+@require_POST
+def activ_js(request):
+
+ # only for staff
+
+ if not request.user.has_perm("tutorial.change_tutorial"):
+ raise PermissionDenied
+ article = get_object_or_404(Article, pk=request.POST["article"])
+ article.js_support = "js_support" in request.POST
+ article.save()
+
+ return redirect(article.get_absolute_url())
+
+
@can_write_and_read_now
@login_required
def edit_reaction(request):
@@ -1179,11 +1214,15 @@ def edit_reaction(request):
'zds.article.views.edit_reaction') + \
'?message=' + \
str(reaction_pk)
- return render_template('article/reaction/edit.html', {
- 'reaction': reaction,
- 'article': g_article,
- 'form': form
- })
+ if request.is_ajax():
+ return HttpResponse(json.dumps({"text": emarkdown(request.POST["text"])}),
+ content_type='application/json')
+ else:
+ return render(request, 'article/reaction/edit.html', {
+ 'reaction': reaction,
+ 'article': g_article,
+ 'form': form
+ })
if 'delete_message' not in request.POST \
and 'signal_message' not in request.POST \
@@ -1205,7 +1244,7 @@ def edit_reaction(request):
})
form.helper.form_action = reverse(
'zds.article.views.edit_reaction') + '?message=' + str(reaction_pk)
- return render_template('article/reaction/edit.html', {
+ return render(request, 'article/reaction/edit.html', {
'reaction': reaction,
'article': g_article,
'form': form
diff --git a/zds/forum/factories.py b/zds/forum/factories.py
index 7ec2f295af..4b0a1ddb63 100644
--- a/zds/forum/factories.py
+++ b/zds/forum/factories.py
@@ -47,6 +47,7 @@ def _prepare(cls, create, **kwargs):
post = super(PostFactory, cls)._prepare(create, **kwargs)
topic = kwargs.pop('topic', None)
if topic:
+ post.save()
topic.last_message = post
topic.save()
return post
diff --git a/zds/forum/models.py b/zds/forum/models.py
index 93239ef780..d04129be78 100644
--- a/zds/forum/models.py
+++ b/zds/forum/models.py
@@ -108,7 +108,6 @@ def get_last_message(self):
def can_read(self, user):
"""Checks if the forum can be read by the user."""
- # TODO These prints is used to debug this method. Remove them later.
if self.group.count() == 0:
return True
@@ -231,7 +230,6 @@ def first_unread_post(self):
topic__pk=self.pk,
position__gt=last_post.position)\
.select_related("author").first()
-
return next_post
except:
return self.first_post()
diff --git a/zds/forum/tests/tests.py b/zds/forum/tests/tests.py
index 4ea6f1b8a6..d41510bcbc 100644
--- a/zds/forum/tests/tests.py
+++ b/zds/forum/tests/tests.py
@@ -259,6 +259,50 @@ def test_edit_main_post(self):
# check edit data
self.assertEqual(Post.objects.get(pk=post1.pk).editor, self.user)
+ # check if topic is valid (no topic)
+ result = self.client.post(
+ reverse('zds.forum.views.edit_post') + '?message={0}'
+ .format(post2.pk),
+ {'title': u'',
+ 'subtitle': u'Encore ces lombards en plein été',
+ 'text': u'C\'est tout simplement l\'histoire de la ville de Paris que je voudrais vous conter '
+ },
+ follow=False)
+ self.assertEqual(Topic.objects.get(pk=topic2.pk).title, topic2.title)
+
+ # check if topic is valid (tags only)
+ result = self.client.post(
+ reverse('zds.forum.views.edit_post') + '?message={0}'
+ .format(post2.pk),
+ {'title': u'[foo][bar]',
+ 'subtitle': u'Encore ces lombards en plein été',
+ 'text': u'C\'est tout simplement l\'histoire de la ville de Paris que je voudrais vous conter '
+ },
+ follow=False)
+ self.assertEqual(Topic.objects.get(pk=topic2.pk).title, topic2.title)
+
+ # check if topic is valid (spaces only)
+ result = self.client.post(
+ reverse('zds.forum.views.edit_post') + '?message={0}'
+ .format(post2.pk),
+ {'title': u' ',
+ 'subtitle': u'Encore ces lombards en plein été',
+ 'text': u'C\'est tout simplement l\'histoire de la ville de Paris que je voudrais vous conter '
+ },
+ follow=False)
+ self.assertEqual(Topic.objects.get(pk=topic2.pk).title, topic2.title)
+
+ # check if topic is valid (valid title)
+ result = self.client.post(
+ reverse('zds.forum.views.edit_post') + '?message={0}'
+ .format(post2.pk),
+ {'title': u'Un titre valide',
+ 'subtitle': u'Encore ces lombards en plein été',
+ 'text': u'C\'est tout simplement l\'histoire de la ville de Paris que je voudrais vous conter '
+ },
+ follow=False)
+ self.assertEqual(Topic.objects.get(pk=topic2.pk).title, u'Un titre valide')
+
def test_edit_post(self):
"""To test all aspects of the edition of simple post by member."""
topic1 = TopicFactory(forum=self.forum11, author=self.user)
diff --git a/zds/forum/views.py b/zds/forum/views.py
index a0cc1626ac..e501cd3873 100644
--- a/zds/forum/views.py
+++ b/zds/forum/views.py
@@ -14,7 +14,7 @@
from django.core.urlresolvers import reverse
from django.db import transaction
from django.http import Http404, HttpResponse
-from django.shortcuts import redirect, get_object_or_404
+from django.shortcuts import redirect, get_object_or_404, render
from django.template import Context
from django.template.loader import get_template
from django.views.decorators.http import require_POST
@@ -28,7 +28,7 @@
from zds.forum.models import TopicRead
from zds.member.decorator import can_write_and_read_now
from zds.member.views import get_client_ip
-from zds.utils import render_template, slugify
+from zds.utils import slugify
from zds.utils.models import Alert, CommentLike, CommentDislike, Tag
from zds.utils.mps import send_mp
from zds.utils.paginator import paginator_range
@@ -41,7 +41,7 @@ def index(request):
categories = top_categories(request.user)
- return render_template("forum/index.html", {"categories": categories,
+ return render(request, "forum/index.html", {"categories": categories,
"user": request.user})
@@ -72,7 +72,7 @@ def details(request, cat_slug, forum_slug):
shown_topics = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template("forum/category/forum.html", {
+ return render(request, "forum/category/forum.html", {
"forum": forum,
"sticky_topics": sticky_topics,
"topics": shown_topics,
@@ -101,7 +101,7 @@ def cat_details(request, cat_slug):
else:
forums = forums_pub
- return render_template("forum/category/index.html", {"category": category,
+ return render(request, "forum/category/index.html", {"category": category,
"forums": forums})
@@ -143,7 +143,7 @@ def topic(request, topic_pk, topic_slug):
if "page" in request.GET:
try:
page_nbr = int(request.GET["page"])
- except:
+ except (KeyError, ValueError):
# problem in variable format
raise Http404
else:
@@ -172,7 +172,7 @@ def topic(request, topic_pk, topic_slug):
+ str(topic.pk)
form_move = MoveTopicForm(topic=topic)
- return render_template("forum/topic/index.html", {
+ return render(request, "forum/topic/index.html", {
"topic": topic,
"posts": res,
"categories": categories,
@@ -226,7 +226,7 @@ def new(request):
try:
forum_pk = request.GET["forum"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
forum = get_object_or_404(Forum, pk=forum_pk)
@@ -237,13 +237,18 @@ def new(request):
# If the client is using the "preview" button
if "preview" in request.POST:
- form = TopicForm(initial={"title": request.POST["title"],
- "subtitle": request.POST["subtitle"],
- "text": request.POST["text"]})
- return render_template("forum/topic/new.html",
- {"forum": forum,
- "form": form,
- "text": request.POST["text"]})
+ if request.is_ajax():
+ return HttpResponse(json.dumps({"text": emarkdown(request.POST["text"])}),
+ content_type='application/json')
+ else:
+ form = TopicForm(initial={"title": request.POST["title"],
+ "subtitle": request.POST["subtitle"],
+ "text": request.POST["text"]})
+
+ return render(request, "forum/topic/new.html",
+ {"forum": forum,
+ "form": form,
+ "text": request.POST["text"]})
form = TopicForm(request.POST)
data = form.data
if form.is_valid():
@@ -284,7 +289,7 @@ def new(request):
else:
form = TopicForm()
- return render_template("forum/topic/new.html", {"forum": forum, "form": form})
+ return render(request, "forum/topic/new.html", {"forum": forum, "form": form})
@can_write_and_read_now
@@ -341,7 +346,7 @@ def move_topic(request):
raise PermissionDenied
try:
topic_pk = request.GET["sujet"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
forum = get_object_or_404(Forum, pk=request.POST["forum"])
@@ -372,13 +377,13 @@ def edit(request):
try:
topic_pk = request.POST["topic"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
if "page" in request.POST:
try:
page = int(request.POST["page"])
- except:
+ except (KeyError, ValueError):
# problem in variable format
raise Http404
else:
@@ -398,8 +403,6 @@ def edit(request):
resp["solved"] = g_topic.is_solved
if request.user.has_perm("forum.change_topic"):
- # Staff actions using AJAX TODO: Do not redirect on AJAX requests
-
if "lock" in data:
g_topic.is_locked = data["lock"] == "true"
messages.success(request,
@@ -413,14 +416,14 @@ def edit(request):
if "move" in data:
try:
forum_pk = int(request.POST["move_target"])
- except:
+ except (KeyError, ValueError):
# problem in variable format
raise Http404
forum = get_object_or_404(Forum, pk=forum_pk)
g_topic.forum = forum
g_topic.save()
if request.is_ajax():
- return HttpResponse(json.dumps(resp))
+ return HttpResponse(json.dumps(resp), content_type='application/json')
else:
if not g_topic.forum.can_read(request.user):
return redirect(reverse("zds.forum.views.index"))
@@ -437,7 +440,7 @@ def answer(request):
try:
topic_pk = request.GET["sujet"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
@@ -475,14 +478,18 @@ def answer(request):
form = PostForm(g_topic, request.user, initial={"text": data["text"]})
form.helper.form_action = reverse("zds.forum.views.answer") \
+ "?sujet=" + str(g_topic.pk)
- return render_template("forum/post/new.html", {
- "text": data["text"],
- "topic": g_topic,
- "posts": posts,
- "last_post_pk": last_post_pk,
- "newpost": newpost,
- "form": form,
- })
+ if request.is_ajax():
+ return HttpResponse(json.dumps({"text": emarkdown(request.POST["text"])}),
+ content_type='application/json')
+ else:
+ return render(request, "forum/post/new.html", {
+ "text": data["text"],
+ "topic": g_topic,
+ "posts": posts,
+ "last_post_pk": last_post_pk,
+ "newpost": newpost,
+ "form": form,
+ })
else:
# Saving the message
@@ -543,7 +550,7 @@ def answer(request):
follow(g_topic)
return redirect(post.get_absolute_url())
else:
- return render_template("forum/post/new.html", {
+ return render(request, "forum/post/new.html", {
"text": data["text"],
"topic": g_topic,
"posts": posts,
@@ -560,6 +567,7 @@ def answer(request):
# Using the quote button
if "cite" in request.GET:
+ resp = {}
post_cite_pk = request.GET["cite"]
post_cite = Post.objects.get(pk=post_cite_pk)
if not post_cite.is_visible:
@@ -572,10 +580,14 @@ def answer(request):
settings.ZDS_APP['site']['url'],
post_cite.get_absolute_url())
+ if request.is_ajax():
+ resp["text"] = text
+ return HttpResponse(json.dumps(resp), content_type='application/json')
+
form = PostForm(g_topic, request.user, initial={"text": text})
form.helper.form_action = reverse("zds.forum.views.answer") \
+ "?sujet=" + str(g_topic.pk)
- return render_template("forum/post/new.html", {
+ return render(request, "forum/post/new.html", {
"topic": g_topic,
"posts": posts,
"last_post_pk": last_post_pk,
@@ -591,7 +603,7 @@ def edit_post(request):
try:
post_pk = request.GET["message"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
post = get_object_or_404(Post, pk=post_pk)
@@ -645,27 +657,42 @@ def edit_post(request):
# Using the preview button
if "preview" in request.POST:
- if g_topic:
- form = TopicForm(initial={"title": request.POST["title"],
- "subtitle": request.POST["subtitle"],
- "text": request.POST["text"]})
+ if request.is_ajax():
+ return HttpResponse(json.dumps({"text": emarkdown(request.POST["text"])}),
+ content_type='application/json')
else:
- form = PostForm(post.topic, request.user,
- initial={"text": request.POST["text"]})
- form.helper.form_action = reverse("zds.forum.views.edit_post") \
- + "?message=" + str(post_pk)
- return render_template("forum/post/edit.html", {
- "post": post,
- "topic": post.topic,
- "text": request.POST["text"],
- "form": form,
- })
+ if g_topic:
+ form = TopicForm(initial={"title": request.POST["title"],
+ "subtitle": request.POST["subtitle"],
+ "text": request.POST["text"]})
+ else:
+ form = PostForm(post.topic, request.user,
+ initial={"text": request.POST["text"]})
+
+ form.helper.form_action = reverse("zds.forum.views.edit_post") \
+ + "?message=" + str(post_pk)
+
+ return render(request, "forum/post/edit.html", {
+ "post": post,
+ "topic": post.topic,
+ "text": request.POST["text"],
+ "form": form,
+ })
if "delete_message" not in request.POST and "signal_message" \
not in request.POST and "show_message" not in request.POST:
# The user just sent data, handle them
if request.POST["text"].strip() != "":
+ # check if the form is valid
+ form = TopicForm(request.POST)
+ if not form.is_valid() and g_topic:
+ return render(request, "forum/post/edit.html", {
+ "post": post,
+ "topic": post.topic,
+ "text": post.text,
+ "form": form,
+ })
post.text = request.POST["text"]
post.text_html = emarkdown(request.POST["text"])
post.update = datetime.now()
@@ -702,7 +729,7 @@ def edit_post(request):
initial={"text": post.text})
form.helper.form_action = reverse("zds.forum.views.edit_post") \
+ "?message=" + str(post_pk)
- return render_template("forum/post/edit.html", {
+ return render(request, "forum/post/edit.html", {
"post": post,
"topic": post.topic,
"text": post.text,
@@ -718,7 +745,7 @@ def useful_post(request):
try:
post_pk = request.GET["message"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
post = get_object_or_404(Post, pk=post_pk)
@@ -745,7 +772,7 @@ def unread_post(request):
try:
post_pk = request.GET["message"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
post = get_object_or_404(Post, pk=post_pk)
@@ -754,6 +781,8 @@ def unread_post(request):
if not post.topic.forum.can_read(request.user):
raise PermissionDenied
+ if TopicFollowed.objects.filter(user=request.user, topic=post.topic).count() == 0:
+ TopicFollowed(user=request.user, topic=post.topic).save()
t = TopicRead.objects.filter(topic=post.topic, user=request.user).first()
if t is None:
@@ -780,7 +809,7 @@ def like_post(request):
try:
post_pk = request.GET["message"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
resp = {}
@@ -828,7 +857,7 @@ def dislike_post(request):
try:
post_pk = request.GET["message"]
- except:
+ except KeyError:
# problem in variable format
raise Http404
resp = {}
@@ -913,7 +942,7 @@ def find_topic_by_tag(request, tag_pk, tag_slug):
except EmptyPage:
shown_topics = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template("forum/find/topic_by_tag.html", {
+ return render(request, "forum/find/topic_by_tag.html", {
"topics": shown_topics,
"tag": tag,
"pages": paginator_range(page, paginator.num_pages),
@@ -946,7 +975,7 @@ def find_topic(request, user_pk):
shown_topics = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template("forum/find/topic.html", {
+ return render(request, "forum/find/topic.html", {
"topics": shown_topics,
"usr": displayed_user,
"pages": paginator_range(page, paginator.num_pages),
@@ -986,7 +1015,7 @@ def find_post(request, user_pk):
shown_posts = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template("forum/find/post.html", {
+ return render(request, "forum/find/post.html", {
"posts": shown_posts,
"usr": displayed_user,
"pages": paginator_range(page, paginator.num_pages),
@@ -1011,7 +1040,7 @@ def followed_topics(request):
except EmptyPage:
shown_topics = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template("forum/topic/followed.html",
+ return render(request, "forum/topic/followed.html",
{"followed_topics": shown_topics,
"pages": paginator_range(page,
paginator.num_pages),
diff --git a/zds/gallery/models.py b/zds/gallery/models.py
index c691c3ed6e..3e2524aa8c 100644
--- a/zds/gallery/models.py
+++ b/zds/gallery/models.py
@@ -117,8 +117,8 @@ def get_gallery_path(self):
"""get the physical path to this gallery root"""
return os.path.join(MEDIA_ROOT, 'galleries', str(self.pk))
- # TODO rename function to get_users_galleries
- def get_users(self):
+ def get_linked_users(self):
+ """get all the linked users for this gallery whatever their rights"""
return UserGallery.objects.all()\
.filter(gallery=self)
diff --git a/zds/gallery/tests/tests_models.py b/zds/gallery/tests/tests_models.py
index 33f81bf05b..b41a9d0ec2 100644
--- a/zds/gallery/tests/tests_models.py
+++ b/zds/gallery/tests/tests_models.py
@@ -107,9 +107,9 @@ def test_get_absolute_url(self):
args=[self.gallery.pk, self.gallery.slug])
self.assertEqual(absolute_url, self.gallery.get_absolute_url())
- def test_get_users(self):
- self.assertEqual(1, len(self.gallery.get_users()))
- self.assertEqual(self.user_gallery, self.gallery.get_users()[0])
+ def test_get_linked_users(self):
+ self.assertEqual(1, len(self.gallery.get_linked_users()))
+ self.assertEqual(self.user_gallery, self.gallery.get_linked_users()[0])
def test_get_images(self):
self.assertEqual(2, len(self.gallery.get_images()))
diff --git a/zds/gallery/views.py b/zds/gallery/views.py
index dd417fd3bd..170485d590 100644
--- a/zds/gallery/views.py
+++ b/zds/gallery/views.py
@@ -11,12 +11,11 @@
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
-from django.shortcuts import redirect, get_object_or_404
+from django.shortcuts import redirect, get_object_or_404, render
from zds.gallery.forms import ArchiveImageForm, ImageForm, UpdateImageForm, \
GalleryForm, UserGalleryForm, ImageAsAvatarForm
from zds.gallery.models import UserGallery, Image, Gallery
from zds.member.decorator import can_write_and_read_now
-from zds.utils import render_template
from zds.utils import slugify
from django.core.exceptions import ObjectDoesNotExist
@@ -34,7 +33,7 @@ def gallery_list(request):
"""Display the gallery list with all their images."""
galleries = UserGallery.objects.all().filter(user=request.user)
- return render_template("gallery/gallery/list.html",
+ return render(request, "gallery/gallery/list.html",
{"galleries": galleries})
@@ -50,7 +49,7 @@ def gallery_details(request, gal_pk, gal_slug):
images = gal.get_images()
form = UserGalleryForm()
- return render_template("gallery/gallery/details.html", {
+ return render(request, "gallery/gallery/details.html", {
"gallery": gal,
"gallery_mode": gal_mode,
"images": images,
@@ -86,10 +85,10 @@ def new_gallery(request):
userg.save()
return redirect(gal.get_absolute_url())
else:
- return render_template("gallery/gallery/new.html", {"form": form})
+ return render(request, "gallery/gallery/new.html", {"form": form})
else:
form = GalleryForm()
- return render_template("gallery/gallery/new.html", {"form": form})
+ return render(request, "gallery/gallery/new.html", {"form": form})
@can_write_and_read_now
@@ -170,7 +169,7 @@ def modify_gallery(request):
ug.mode = request.POST["mode"]
ug.save()
else:
- return render_template("gallery/gallery/details.html", {
+ return render(request, "gallery/gallery/details.html", {
"gallery": gallery,
"gallery_mode": gal_mode,
"images": gallery.get_images(),
@@ -236,7 +235,8 @@ def edit_image(request, gal_pk, img_pk):
})
as_avatar_form = ImageAsAvatarForm()
- return render_template(
+ return render(
+ request,
"gallery/image/edit.html", {
"form": form,
"gallery_mode": gal_mode,
@@ -269,6 +269,8 @@ def delete_image(request):
try:
img = Image.objects.get(pk=request.POST["image"], gallery=gal)
img.delete()
+ except KeyError:
+ pass
except:
pass
elif "delete_multi" in request.POST:
@@ -309,12 +311,12 @@ def new_image(request, gal_pk):
return redirect(reverse("zds.gallery.views.edit_image",
args=[gal.pk, img.pk]))
else:
- return render_template("gallery/image/new.html", {"form": form,
+ return render(request, "gallery/image/new.html", {"form": form,
"gallery_mode": gal_mode,
"gallery": gal})
else:
form = ImageForm(initial={"new_image": True}) # A empty, unbound form
- return render_template("gallery/image/new.html", {"form": form,
+ return render(request, "gallery/image/new.html", {"form": form,
"gallery_mode": gal_mode,
"gallery": gal})
@@ -392,11 +394,11 @@ def import_image(request, gal_pk):
return redirect(reverse("zds.gallery.views.gallery_details",
args=[gal.pk, gal.slug]))
else:
- return render_template("gallery/image/new.html", {"form": form,
+ return render(request, "gallery/image/new.html", {"form": form,
"gallery_mode": gal_mode,
"gallery": gal})
else:
form = ArchiveImageForm(initial={"new_image": True}) # A empty, unbound form
- return render_template("gallery/image/new.html", {"form": form,
+ return render(request, "gallery/image/new.html", {"form": form,
"gallery_mode": gal_mode,
"gallery": gal})
diff --git a/zds/member/factories.py b/zds/member/factories.py
index 609968a267..5a0b80fe60 100644
--- a/zds/member/factories.py
+++ b/zds/member/factories.py
@@ -1,6 +1,6 @@
# coding: utf-8
-from django.contrib.auth.models import User, Permission
+from django.contrib.auth.models import User, Permission, Group
import factory
from zds.member.models import Profile
@@ -50,13 +50,14 @@ def _prepare(cls, create, **kwargs):
user.set_password(password)
if create:
user.save()
- perms = Permission.objects.filter(codename__startswith='change_').all()
+ group_staff = Group.objects.filter(name="staff").first()
+ if group_staff is None:
+ group_staff = Group(name="staff")
+ group_staff.save()
- user.user_permissions = list(perms)
- user.user_permissions.add(
- Permission.objects.get(
- codename='moderation'))
- user.user_permissions.add(Permission.objects.get(codename='show_ip'))
+ perms = Permission.objects.filter(codename__startswith='change_').all()
+ group_staff.permissions = perms
+ user.groups.add(group_staff)
user.save()
return user
diff --git a/zds/member/forms.py b/zds/member/forms.py
index c66e3ebab2..b863896b43 100644
--- a/zds/member/forms.py
+++ b/zds/member/forms.py
@@ -27,7 +27,7 @@
class OldTutoForm(forms.Form):
id = forms.ChoiceField(
- label=_('Ancien Tutoriel'),
+ label=_(u'Ancien Tutoriel'),
required=True,
choices=listing(),
)
@@ -43,14 +43,14 @@ def __init__(self, profile, *args, **kwargs):
Field('id'),
Hidden('profile_pk', '{{ profile.pk }}'),
ButtonHolder(
- StrictButton(_('Attribuer'), type='submit'),
+ StrictButton(_(u'Attribuer'), type='submit'),
),
)
class LoginForm(forms.Form):
username = forms.CharField(
- label=_("Nom d'utilisateur"),
+ label=_(u"Nom d'utilisateur"),
max_length=User._meta.get_field('username').max_length,
required=True,
widget=forms.TextInput(
@@ -61,7 +61,7 @@ class LoginForm(forms.Form):
)
password = forms.CharField(
- label=_('Mot de passe'),
+ label=_(u'Mot de passe'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
required=True,
@@ -69,7 +69,7 @@ class LoginForm(forms.Form):
)
remember = forms.BooleanField(
- label=_('Se souvenir de moi'),
+ label=_(u'Se souvenir de moi'),
initial=True,
)
@@ -78,6 +78,7 @@ def __init__(self, next=None, *args, **kwargs):
self.helper = FormHelper()
self.helper.form_action = reverse('zds.member.views.login_view')
self.helper.form_method = 'post'
+ self.helper.form_class = 'content-wrapper'
self.helper.layout = Layout(
Field('username'),
@@ -85,26 +86,28 @@ def __init__(self, next=None, *args, **kwargs):
Field('remember'),
HTML('{% csrf_token %}'),
ButtonHolder(
- StrictButton(_('Se connecter'), type='submit'),
+ StrictButton(_(u'Se connecter'), type='submit'),
),
+ HTML(u'Mot de passe oublié ?'),
)
class RegisterForm(forms.Form):
email = forms.EmailField(
- label=_('Adresse courriel'),
+ label=_(u'Adresse courriel'),
max_length=User._meta.get_field('email').max_length,
required=True,
)
username = forms.CharField(
- label=_('Nom d\'utilisateur'),
+ label=_(u'Nom d\'utilisateur'),
max_length=User._meta.get_field('username').max_length,
required=True,
)
password = forms.CharField(
- label=_('Mot de passe'),
+ label=_(u'Mot de passe'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
required=True,
@@ -112,7 +115,7 @@ class RegisterForm(forms.Form):
)
password_confirm = forms.CharField(
- label=_('Confirmation du mot de passe'),
+ label=_(u'Confirmation du mot de passe'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
required=True,
@@ -131,7 +134,7 @@ def __init__(self, *args, **kwargs):
Field('password_confirm'),
Field('email'),
ButtonHolder(
- Submit('submit', _('Valider mon inscription')),
+ Submit('submit', _(u'Valider mon inscription')),
))
def clean(self):
@@ -204,7 +207,7 @@ class MiniProfileForm(forms.Form):
required=False,
widget=forms.Textarea(
attrs={
- 'placeholder': _('Votre biographie au format Markdown.')
+ 'placeholder': _(u'Votre biographie au format Markdown.')
}
)
)
@@ -239,7 +242,7 @@ class MiniProfileForm(forms.Form):
max_length=Profile._meta.get_field('sign').max_length,
widget=forms.TextInput(
attrs={
- 'placeholder': _('Elle apparaitra dans les messages de forums. ')
+ 'placeholder': _(u'Elle apparaitra dans les messages de forums. ')
}
)
)
@@ -266,9 +269,9 @@ class ProfileForm(MiniProfileForm):
label='',
required=False,
choices=(
- ('show_email', _("Afficher mon adresse courriel publiquement")),
- ('show_sign', _("Afficher les signatures")),
- ('hover_or_click', _("Cochez pour dérouler les menus au survol")),
+ ('show_email', _(u"Afficher mon adresse courriel publiquement")),
+ ('show_sign', _(u"Afficher les signatures")),
+ ('hover_or_click', _(u"Cochez pour dérouler les menus au survol")),
('email_for_answer', _(u'Recevez un courriel lorsque vous '
u'recevez une réponse à un message privé')),
),
@@ -317,19 +320,19 @@ def __init__(self, *args, **kwargs):
class ChangeUserForm(forms.Form):
username_new = forms.CharField(
- label=_('Nouveau pseudo'),
+ label=_(u'Nouveau pseudo'),
max_length=User._meta.get_field('username').max_length,
min_length=1,
required=False,
widget=forms.TextInput(
attrs={
- 'placeholder': _('Ne mettez rien pour conserver l\'ancien')
+ 'placeholder': _(u'Ne mettez rien pour conserver l\'ancien')
}
)
)
email_new = forms.EmailField(
- label=_('Nouvelle adresse courriel'),
+ label=_(u'Nouvelle adresse courriel'),
max_length=User._meta.get_field('email').max_length,
required=False,
widget=forms.TextInput(
@@ -350,7 +353,7 @@ def __init__(self, *args, **kwargs):
Field('username_new'),
Field('email_new'),
ButtonHolder(
- StrictButton(_('Enregistrer'), type='submit'),
+ StrictButton(_(u'Enregistrer'), type='submit'),
),
)
@@ -393,21 +396,21 @@ def clean(self):
# to update a password
class ChangePasswordForm(forms.Form):
password_new = forms.CharField(
- label=_('Nouveau mot de passe'),
+ label=_(u'Nouveau mot de passe'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
widget=forms.PasswordInput
)
password_old = forms.CharField(
- label=_('Mot de passe actuel'),
+ label=_(u'Mot de passe actuel'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
widget=forms.PasswordInput
)
password_confirm = forms.CharField(
- label=_('Confirmer le nouveau mot de passe'),
+ label=_(u'Confirmer le nouveau mot de passe'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
widget=forms.PasswordInput
@@ -426,7 +429,7 @@ def __init__(self, user, *args, **kwargs):
Field('password_new'),
Field('password_confirm'),
ButtonHolder(
- StrictButton(_('Enregistrer'), type='submit'),
+ StrictButton(_(u'Enregistrer'), type='submit'),
)
)
@@ -477,7 +480,7 @@ def clean(self):
# Reset the password
class ForgotPasswordForm(forms.Form):
username = forms.CharField(
- label=_('Nom d\'utilisateur'),
+ label=_(u'Nom d\'utilisateur'),
max_length=User._meta.get_field('username').max_length,
required=True
)
@@ -491,7 +494,7 @@ def __init__(self, *args, **kwargs):
self.helper.layout = Layout(
Field('username'),
ButtonHolder(
- StrictButton(_('Envoyer'), type='submit'),
+ StrictButton(_(u'Envoyer'), type='submit'),
)
)
@@ -510,13 +513,13 @@ def clean(self):
class NewPasswordForm(forms.Form):
password = forms.CharField(
- label=_('Mot de passe'),
+ label=_(u'Mot de passe'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
widget=forms.PasswordInput
)
password_confirm = forms.CharField(
- label=_('Confirmation'),
+ label=_(u'Confirmation'),
max_length=MAX_PASSWORD_LENGTH,
min_length=MIN_PASSWORD_LENGTH,
widget=forms.PasswordInput
@@ -533,7 +536,7 @@ def __init__(self, identifier, *args, **kwargs):
Field('password'),
Field('password_confirm'),
ButtonHolder(
- StrictButton(_('Envoyer'), type='submit'),
+ StrictButton(_(u'Envoyer'), type='submit'),
)
)
@@ -570,18 +573,18 @@ def clean(self):
class PromoteMemberForm(forms.Form):
groups = forms.ModelMultipleChoiceField(
- label=_("Groupe de l'utilisateur"),
+ label=_(u"Groupe de l'utilisateur"),
queryset=Group.objects.all(),
required=False,
)
superuser = forms.BooleanField(
- label=_("Super-user"),
+ label=_(u"Super-user"),
required=False,
)
activation = forms.BooleanField(
- label=_("Compte actif"),
+ label=_(u"Compte actif"),
required=False,
)
@@ -595,7 +598,7 @@ def __init__(self, *args, **kwargs):
Field('groups'),
Field('superuser'),
Field('activation'),
- StrictButton(_('Valider'), type='submit'),
+ StrictButton(_(u'Valider'), type='submit'),
)
@@ -604,7 +607,7 @@ class KarmaForm(forms.Form):
max_length=KarmaNote._meta.get_field('comment').max_length,
widget=forms.TextInput(
attrs={
- 'placeholder': 'Commentaire sur le comportement de ce membre'
+ 'placeholder': u'Commentaire sur le comportement de ce membre'
}),
required=True,
)
@@ -628,6 +631,6 @@ def __init__(self, profile, *args, **kwargs):
Field('points'),
Hidden('profile_pk', '{{ profile.pk }}'),
ButtonHolder(
- StrictButton('Valider', type='submit'),
+ StrictButton(u'Valider', type='submit'),
),
)
diff --git a/zds/member/models.py b/zds/member/models.py
index 1801cb71f5..7f34352172 100644
--- a/zds/member/models.py
+++ b/zds/member/models.py
@@ -271,6 +271,18 @@ def __unicode__(self):
return u"{0} - {1}".format(self.user.username, self.date_end)
+def save_profile(backend, user, response, *args, **kwargs):
+ profile = Profile.objects.filter(user=user).first()
+ if profile is None:
+ profile = Profile(user=user,
+ show_email=False,
+ show_sign=True,
+ hover_or_click=True,
+ email_for_answer=False)
+ profile.last_ip_address = "0.0.0.0"
+ profile.save()
+
+
class Ban(models.Model):
class Meta:
diff --git a/zds/member/tests/tests_views.py b/zds/member/tests/tests_views.py
index 64df73f2dc..4de90c80dd 100644
--- a/zds/member/tests/tests_views.py
+++ b/zds/member/tests/tests_views.py
@@ -17,13 +17,12 @@
from zds.member.models import Profile, KarmaNote
from zds.mp.models import PrivatePost, PrivateTopic
from zds.member.models import TokenRegister, Ban
-from zds.tutorial.factories import MiniTutorialFactory
-from zds.tutorial.models import Tutorial, Validation
-from zds.article.factories import ArticleFactory
+from zds.tutorial.factories import MiniTutorialFactory, PublishedMiniTutorial
+from zds.tutorial.models import Tutorial
+from zds.article.factories import ArticleFactory, PublishedArticleFactory
from zds.article.models import Article
from zds.forum.factories import CategoryFactory, ForumFactory, TopicFactory, PostFactory
from zds.forum.models import Topic, Post
-from zds.article.models import Validation as ArticleValidation
from zds.gallery.factories import GalleryFactory, UserGalleryFactory
from zds.gallery.models import Gallery, UserGallery
@@ -66,8 +65,26 @@ def test_login(self):
'password': 'hostel77',
'remember': 'remember'},
follow=False)
- # good password then redirection
- self.assertEqual(result.status_code, 302)
+ # good password then redirection to the homepage
+ self.assertRedirects(result, reverse('zds.pages.views.home'))
+
+ result = self.client.post(
+ reverse('zds.member.views.login_view')
+ + '?next=' + reverse('zds.gallery.views.gallery_list'),
+ {'username': user.user.username,
+ 'password': 'hostel77',
+ 'remember': 'remember'},
+ follow=False)
+ # good password and ?next= then redirection to the "next" page
+ self.assertRedirects(result, reverse('zds.gallery.views.gallery_list'))
+
+ self.client.logout()
+ result = self.client.get(reverse('zds.member.views.login_view')
+ + '?next=' + reverse('zds.gallery.views.gallery_list'))
+ # check if the login form will redirect if there is a ?next=
+ self.assertContains(result, reverse('zds.member.views.login_view')
+ + '?next=' + reverse('zds.gallery.views.gallery_list'),
+ count=1)
def test_register(self):
"""To test user registration."""
@@ -127,11 +144,11 @@ def test_unregister(self):
UserGalleryFactory(gallery=sharedGallery, user=user.user)
UserGalleryFactory(gallery=sharedGallery, user=user2.user)
# first case : a published tutorial with only one author
- publishedTutorialAlone = MiniTutorialFactory(light=True)
+ publishedTutorialAlone = PublishedMiniTutorial(light=True)
publishedTutorialAlone.authors.add(user.user)
publishedTutorialAlone.save()
# second case : a published tutorial with two authors
- publishedTutorial2 = MiniTutorialFactory(light=True)
+ publishedTutorial2 = PublishedMiniTutorial(light=True)
publishedTutorial2.authors.add(user.user)
publishedTutorial2.authors.add(user2.user)
publishedTutorial2.save()
@@ -147,65 +164,11 @@ def test_unregister(self):
writingTutorial2.authors.add(user2.user)
writingTutorial2.save()
self.client.login(username=self.staff.username, password="hostel77")
- pub = self.client.post(
- reverse('zds.tutorial.views.ask_validation'),
- {
- 'tutorial': publishedTutorialAlone.pk,
- 'text': u'Ce tuto est excellent',
- 'version': publishedTutorialAlone.sha_draft,
- 'source': 'http://zestedesavoir.com',
- },
- follow=False)
- self.assertEqual(pub.status_code, 302)
- # reserve tutorial
- validation = Validation.objects.get(
- tutorial__pk=publishedTutorialAlone.pk)
- pub = self.client.post(
- reverse('zds.tutorial.views.reservation', args=[validation.pk]),
- follow=False)
- self.assertEqual(pub.status_code, 302)
- # publish tutorial
- pub = self.client.post(
- reverse('zds.tutorial.views.valid_tutorial'),
- {
- 'tutorial': publishedTutorialAlone.pk,
- 'text': u'Ce tuto est excellent',
- 'is_major': True,
- 'source': 'http://zestedesavoir.com',
- },
- follow=False)
- pub = self.client.post(
- reverse('zds.tutorial.views.ask_validation'),
- {
- 'tutorial': publishedTutorial2.pk,
- 'text': u'Ce tuto est excellent',
- 'version': publishedTutorial2.sha_draft,
- 'source': 'http://zestedesavoir.com',
- },
- follow=False)
- self.assertEqual(pub.status_code, 302)
- # reserve tutorial
- validation = Validation.objects.get(
- tutorial__pk=publishedTutorial2.pk)
- pub = self.client.post(
- reverse('zds.tutorial.views.reservation', args=[validation.pk]),
- follow=False)
- self.assertEqual(pub.status_code, 302)
- # publish tutorial
- pub = self.client.post(
- reverse('zds.tutorial.views.valid_tutorial'),
- {
- 'tutorial': publishedTutorial2.pk,
- 'text': u'Ce tuto est excellent',
- 'is_major': True,
- 'source': 'http://zestedesavoir.com',
- },
- follow=False)
# same thing for articles
- publishedArticleAlone = ArticleFactory()
+ publishedArticleAlone = PublishedArticleFactory()
publishedArticleAlone.authors.add(user.user)
publishedArticleAlone.save()
- publishedArticle2 = ArticleFactory()
+ publishedArticle2 = PublishedArticleFactory()
publishedArticle2.authors.add(user.user)
publishedArticle2.authors.add(user2.user)
publishedArticle2.save()
@@ -217,80 +180,6 @@ def test_unregister(self):
writingArticle2.authors.add(user.user)
writingArticle2.authors.add(user2.user)
writingArticle2.save()
- # ask public article
- pub = self.client.post(
- reverse('zds.article.views.modify'),
- {
- 'article': publishedArticleAlone.pk,
- 'comment': u'Valides moi ce bébé',
- 'pending': 'Demander validation',
- 'version': publishedArticleAlone.sha_draft,
- 'is_major': True
- },
- follow=False)
- self.assertEqual(pub.status_code, 302)
-
- login_check = self.client.login(
- username=self.staff.username,
- password='hostel77')
- self.assertEqual(login_check, True)
-
- # reserve article
- validation = ArticleValidation.objects.get(
- article__pk=publishedArticleAlone.pk)
- pub = self.client.post(
- reverse('zds.article.views.reservation', args=[validation.pk]),
- follow=False)
- self.assertEqual(pub.status_code, 302)
-
- # publish article
- pub = self.client.post(
- reverse('zds.article.views.modify'),
- {
- 'article': publishedArticleAlone.pk,
- 'comment-v': u'Cet article est excellent',
- 'valid-article': 'Demander validation',
- 'is_major': True
- },
- follow=False)
- self.assertEqual(pub.status_code, 302)
- # ask public article
- pub = self.client.post(
- reverse('zds.article.views.modify'),
- {
- 'article': publishedArticle2.pk,
- 'comment': u'Valides moi ce bébé',
- 'pending': 'Demander validation',
- 'version': publishedArticle2.sha_draft,
- 'is_major': True
- },
- follow=False)
- self.assertEqual(pub.status_code, 302)
-
- login_check = self.client.login(
- username=self.staff.username,
- password='hostel77')
- self.assertEqual(login_check, True)
-
- # reserve article
- validation = ArticleValidation.objects.get(
- article__pk=publishedArticle2.pk)
- pub = self.client.post(
- reverse('zds.article.views.reservation', args=[validation.pk]),
- follow=False)
- self.assertEqual(pub.status_code, 302)
-
- # publish article
- pub = self.client.post(
- reverse('zds.article.views.modify'),
- {
- 'article': publishedArticle2.pk,
- 'comment-v': u'Cet article est excellent',
- 'valid-article': 'Demander validation',
- 'is_major': True
- },
- follow=False)
- self.assertEqual(pub.status_code, 302)
# about posts and topics
authoredTopic = TopicFactory(author=user.user, forum=self.forum11)
answeredTopic = TopicFactory(author=user2.user, forum=self.forum11)
@@ -369,8 +258,8 @@ def test_unregister(self):
self.assertIsNotNone(Topic.objects.get(pk=authoredTopic.pk))
self.assertIsNotNone(PrivateTopic.objects.get(pk=privateTopic.pk))
self.assertIsNotNone(Gallery.objects.get(pk=aloneGallery.pk))
- self.assertEquals(aloneGallery.get_users().count(), 1)
- self.assertEquals(sharedGallery.get_users().count(), 1)
+ self.assertEquals(aloneGallery.get_linked_users().count(), 1)
+ self.assertEquals(sharedGallery.get_linked_users().count(), 1)
self.assertEquals(UserGallery.objects.filter(user=user.user).count(), 0)
def test_sanctions(self):
diff --git a/zds/member/views.py b/zds/member/views.py
index ac6ca3b75c..5e1afaa6d8 100644
--- a/zds/member/views.py
+++ b/zds/member/views.py
@@ -16,7 +16,7 @@
from django.db import transaction
from django.db.models import Q
from django.http import Http404, HttpResponse
-from django.shortcuts import redirect, get_object_or_404
+from django.shortcuts import redirect, get_object_or_404, render
from django.template import Context
from django.template.loader import get_template
from django.views.decorators.http import require_POST
@@ -36,7 +36,6 @@
from zds.forum.models import Topic, follow, TopicFollowed
from zds.member.decorator import can_write_and_read_now
from zds.tutorial.models import Tutorial
-from zds.utils import render_template
from zds.utils.mps import send_mp
from zds.utils.paginator import paginator_range
from zds.utils.tokens import generate_token
@@ -80,7 +79,7 @@ def index(request):
except EmptyPage:
shown_members = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template("member/index.html", {
+ return render(request, "member/index.html", {
"members": shown_members,
"count": members.count(),
"pages": paginator_range(page, paginator.num_pages),
@@ -91,7 +90,7 @@ def index(request):
@login_required
def warning_unregister(request):
"""displays a warning page showing what will happen when user unregisters"""
- return render_template("member/settings/unregister.html", {"user": request.user})
+ return render(request, "member/settings/unregister.html", {"user": request.user})
@login_required
@@ -169,7 +168,7 @@ def unregister(request):
# so we will just delete the unretistering user ownership and give it to anonymous in the only case
# he was alone so that gallery is not lost
for gallery in UserGallery.objects.filter(user=current):
- if gallery.gallery.get_users().count() == 1:
+ if gallery.gallery.get_linked_users().count() == 1:
anonymousGallery = UserGallery()
anonymousGallery.user = external
anonymousGallery.mode = "w"
@@ -250,7 +249,7 @@ def details(request, user_name):
olds = []
for old in olds:
oldtutos.append(get_info_old_tuto(old))
- return render_template("member/profile.html", {
+ return render(request, "member/profile.html", {
"usr": usr,
"profile": profile,
"bans": bans,
@@ -393,7 +392,7 @@ def tutorials(request):
else:
user_tutorials = profile.get_tutos()
- return render_template("tutorial/member/index.html",
+ return render(request, "tutorial/member/index.html",
{"tutorials": user_tutorials, "type": type})
@@ -421,7 +420,7 @@ def articles(request):
else:
user_articles = profile.get_articles()
- return render_template('article/member/index.html', {'articles': user_articles, 'type': state})
+ return render(request, 'article/member/index.html', {'articles': user_articles, 'type': state})
# settings for public profile
@@ -457,7 +456,7 @@ def settings_mini_profile(request, user_name):
return redirect(reverse("zds.member.views.details",
args=[profile.user.username]))
else:
- return render_template("member/settings/profile.html", c)
+ return render(request, "member/settings/profile.html", c)
else:
form = MiniProfileForm(initial={
"biography": profile.biography,
@@ -466,7 +465,7 @@ def settings_mini_profile(request, user_name):
"sign": profile.sign,
})
c = {"form": form, "profile": profile}
- return render_template("member/settings/profile.html", c)
+ return render(request, "member/settings/profile.html", c)
@can_write_and_read_now
@@ -505,7 +504,7 @@ def settings_profile(request):
_(u"Le profil a correctement été mis à jour."))
return redirect(reverse("zds.member.views.settings_profile"))
else:
- return render_template("member/settings/profile.html", c)
+ return render(request, "member/settings/profile.html", c)
else:
form = ProfileForm(initial={
"biography": profile.biography,
@@ -518,7 +517,7 @@ def settings_profile(request):
"sign": profile.sign,
})
c = {"form": form}
- return render_template("member/settings/profile.html", c)
+ return render(request, "member/settings/profile.html", c)
@can_write_and_read_now
@@ -563,11 +562,11 @@ def settings_account(request):
messages.error(request, _(u"Une erreur est survenue."))
return redirect(reverse("zds.member.views.settings_account"))
else:
- return render_template("member/settings/account.html", c)
+ return render(request, "member/settings/account.html", c)
else:
form = ChangePasswordForm(request.user)
c = {"form": form}
- return render_template("member/settings/account.html", c)
+ return render(request, "member/settings/account.html", c)
@can_write_and_read_now
@@ -588,11 +587,11 @@ def settings_user(request):
old.save()
return redirect(old.profile.get_absolute_url())
else:
- return render_template("member/settings/user.html", c)
+ return render(request, "member/settings/user.html", c)
else:
form = ChangeUserForm()
c = {"form": form}
- return render_template("member/settings/user.html", c)
+ return render(request, "member/settings/user.html", c)
def login_view(request):
@@ -642,17 +641,19 @@ def login_view(request):
else:
messages.error(request,
_(u"Les identifiants fournis ne sont pas valides."))
- form = LoginForm()
- form.helper.form_action = reverse("zds.member.views.login_view")
+
if next_page is not None:
+ form = LoginForm()
form.helper.form_action += "?next=" + next_page
+ else:
+ form = LoginForm()
+
csrf_tk["error"] = error
csrf_tk["form"] = form
csrf_tk["next_page"] = next_page
- return render_template("member/login.html",
+ return render(request, "member/login.html",
{"form": form,
- "csrf_tk": csrf_tk,
- "next_page": next_page})
+ "csrf_tk": csrf_tk})
@login_required
@@ -707,11 +708,11 @@ def register_view(request):
msg.send()
except:
msg = None
- return render_template("member/register/success.html", {})
+ return render(request, "member/register/success.html", {})
else:
- return render_template("member/register/index.html", {"form": form})
+ return render(request, "member/register/index.html", {"form": form})
form = RegisterForm()
- return render_template("member/register/index.html", {"form": form})
+ return render(request, "member/register/index.html", {"form": form})
def forgot_password(request):
@@ -745,12 +746,12 @@ def forgot_password(request):
[usr.email])
msg.attach_alternative(message_html, "text/html")
msg.send()
- return render_template("member/forgot_password/success.html")
+ return render(request, "member/forgot_password/success.html")
else:
- return render_template("member/forgot_password/index.html",
+ return render(request, "member/forgot_password/index.html",
{"form": form})
form = ForgotPasswordForm()
- return render_template("member/forgot_password/index.html", {"form": form})
+ return render(request, "member/forgot_password/index.html", {"form": form})
def new_password(request):
@@ -769,15 +770,15 @@ def new_password(request):
# User can't confirm his request if it is too late.
if datetime.now() > token.date_end:
- return render_template("member/new_password/failed.html")
+ return render(request, "member/new_password/failed.html")
token.user.set_password(password)
token.user.save()
token.delete()
- return render_template("member/new_password/success.html")
+ return render(request, "member/new_password/success.html")
else:
- return render_template("member/new_password.html", {"form": form})
+ return render(request, "member/new_password.html", {"form": form})
form = NewPasswordForm(identifier=token.user.username)
- return render_template("member/new_password/index.html", {"form": form})
+ return render(request, "member/new_password/index.html", {"form": form})
def active_account(request):
@@ -793,12 +794,12 @@ def active_account(request):
# User can't confirm his request if he is already activated.
if usr.is_active:
- return render_template("member/register/token_already_used.html")
+ return render(request, "member/register/token_already_used.html")
# User can't confirm his request if it is too late.
if datetime.now() > token.date_end:
- return render_template("member/register/token_failed.html",
+ return render(request, "member/register/token_failed.html",
{"token": token})
usr.is_active = True
usr.save()
@@ -807,38 +808,38 @@ def active_account(request):
bot = get_object_or_404(User, username=settings.ZDS_APP['member']['bot_account'])
msg = _(
- u'Bonjour **{0}**,'
+ u'Bonjour **{username}**,'
u'\n\n'
u'Ton compte a été activé, et tu es donc officiellement '
- u'membre de la communauté de {4}.'
+ u'membre de la communauté de {site_name}.'
u'\n\n'
- u'{4} est une communauté dont le but est de diffuser des '
+ u'{site_name} est une communauté dont le but est de diffuser des '
u'connaissances au plus grand nombre.'
u'\n\n'
- u'Sur ce site, tu trouveras un ensemble de [tutoriels]({1}) dans '
+ u'Sur ce site, tu trouveras un ensemble de [tutoriels]({tutorials_url}) dans '
u'plusieurs domaines et plus particulièrement autour de l\'informatique '
- u'et des sciences. Tu y retrouveras aussi des [articles]({2}) '
+ u'et des sciences. Tu y retrouveras aussi des [articles]({articles_url}) '
u'traitant de sujets d\'actualité ou non, qui, tout comme les tutoriels, '
- u'sont écrits par des [membres]({3}) de la communauté. '
+ u'sont écrits par des [membres]({members_url}) de la communauté. '
u'Pendant tes lectures et ton apprentissage, si jamais tu as des '
- u'questions à poser, tu retrouveras sur les [forums]({4}) des personnes '
+ u'questions à poser, tu retrouveras sur les [forums]({forums_url}) des personnes '
u'prêtes à te filer un coup de main et ainsi t\'éviter de passer '
u'plusieurs heures sur un problème.'
u'\n\n'
u'L\'ensemble du contenu disponible sur le site est et sera toujours gratuit, '
- u'car la communauté de {4} est attachée aux valeurs du libre '
+ u'car la communauté de {site_name} est attachée aux valeurs du libre '
u'partage et désire apporter le savoir à tout le monde quels que soient ses moyens.'
u'\n\n'
u'En espérant que tu te plairas ici, '
u'je te laisse maintenant faire un petit tour.'
u'\n\n'
u'Clem\'')\
- .format(usr.username,
- settings.ZDS_APP['site']['url'] + reverse("zds.tutorial.views.index"),
- settings.ZDS_APP['site']['url'] + reverse("zds.article.views.index"),
- settings.ZDS_APP['site']['url'] + reverse("zds.member.views.index"),
- settings.ZDS_APP['site']['url'] + reverse("zds.forum.views.index"),
- settings.ZDS_APP['site']['litteral_name'])
+ .format(username=usr.username,
+ tutorials_url=settings.ZDS_APP['site']['url'] + reverse("zds.tutorial.views.index"),
+ articles_url=settings.ZDS_APP['site']['url'] + reverse("zds.article.views.index"),
+ members_url=settings.ZDS_APP['site']['url'] + reverse("zds.member.views.index"),
+ forums_url=settings.ZDS_APP['site']['url'] + reverse("zds.forum.views.index"),
+ site_name=settings.ZDS_APP['site']['litteral_name'])
send_mp(
bot,
[usr],
@@ -851,7 +852,7 @@ def active_account(request):
)
token.delete()
form = LoginForm(initial={'username': usr.username})
- return render_template("member/register/token_success.html", {"usr": usr, "form": form})
+ return render(request, "member/register/token_success.html", {"usr": usr, "form": form})
def generate_token_account(request):
@@ -890,7 +891,7 @@ def generate_token_account(request):
msg.send()
except:
msg = None
- return render_template('member/register/success.html', {})
+ return render(request, 'member/register/success.html', {})
def get_client_ip(request):
@@ -1070,7 +1071,7 @@ def settings_promote(request, user_pk):
'groups': user.groups.all(),
'activation': user.is_active
})
- return render_template('member/settings/promote.html', {
+ return render(request, 'member/settings/promote.html', {
"usr": user,
"profile": profile,
"form": form
@@ -1085,7 +1086,7 @@ def member_from_ip(request, ip):
raise PermissionDenied
members = Profile.objects.filter(last_ip_address=ip).order_by('-last_visit')
- return render_template('member/settings/memberip.html', {
+ return render(request, 'member/settings/memberip.html', {
"members": members,
"ip": ip
})
@@ -1108,7 +1109,7 @@ def modify_karma(request):
note.comment = request.POST["warning"]
try:
note.value = int(request.POST["points"])
- except:
+ except (KeyError, ValueError):
note.value = 0
note.save()
diff --git a/zds/mp/tests/tests_views.py b/zds/mp/tests/tests_views.py
index 0b2295af48..c4e197df0f 100644
--- a/zds/mp/tests/tests_views.py
+++ b/zds/mp/tests/tests_views.py
@@ -339,6 +339,23 @@ def test_success_get_with_and_without_username(self):
self.profile2.user.username,
response2.context['form'].initial['participants'])
+ def test_success_get_with_and_without_title(self):
+
+ response = self.client.get(reverse('zds.mp.views.new'))
+
+ self.assertEqual(200, response.status_code)
+ self.assertIsNone(
+ response.context['form'].initial['title'])
+
+ response2 = self.client.get(
+ reverse('zds.mp.views.new')
+ + '?title=Test titre')
+
+ self.assertEqual(200, response2.status_code)
+ self.assertEqual(
+ 'Test titre',
+ response2.context['form'].initial['title'])
+
def test_fail_get_with_username_not_exist(self):
response2 = self.client.get(
diff --git a/zds/mp/views.py b/zds/mp/views.py
index 333f4beda6..79e306e31d 100644
--- a/zds/mp/views.py
+++ b/zds/mp/views.py
@@ -13,13 +13,13 @@
from django.db import transaction
from django.db.models import Q
from django.http import Http404
-from django.shortcuts import redirect, get_object_or_404
+from django.shortcuts import redirect, get_object_or_404, render
from django.template import Context
from django.template.loader import get_template
from django.views.decorators.http import require_POST
from django.forms.util import ErrorList
-from zds.utils import render_template, slugify
+from zds.utils import slugify
from zds.utils.mps import send_mp
from zds.utils.paginator import paginator_range
from zds.utils.templatetags.emarkdown import emarkdown
@@ -73,7 +73,7 @@ def index(request):
shown_privatetopics = paginator.page(paginator.num_pages)
page = paginator.num_pages
- return render_template('mp/index.html', {
+ return render(request, 'mp/index.html', {
'privatetopics': shown_privatetopics,
'pages': paginator_range(page, paginator.num_pages), 'nb': page
})
@@ -134,7 +134,7 @@ def topic(request, topic_pk, topic_slug):
# Build form to add an answer for the current topid.
form = PrivatePostForm(g_topic, request.user)
- return render_template('mp/topic/index.html', {
+ return render(request, 'mp/topic/index.html', {
'topic': g_topic,
'posts': res,
'pages': paginator_range(page_nbr, paginator.num_pages),
@@ -158,7 +158,7 @@ def new(request):
'subtitle': request.POST['subtitle'],
'text': request.POST['text'],
})
- return render_template('mp/topic/new.html', {
+ return render(request, 'mp/topic/new.html', {
'form': form,
})
@@ -186,7 +186,7 @@ def new(request):
and list_part[0] == request.user.username):
errors = form._errors.setdefault("participants", ErrorList())
errors.append(_(u'Vous êtes déjà auteur du message'))
- return render_template('mp/topic/new.html', {
+ return render(request, 'mp/topic/new.html', {
'form': form,
})
@@ -201,7 +201,7 @@ def new(request):
return redirect(p_topic.get_absolute_url())
else:
- return render_template('mp/topic/new.html', {
+ return render(request, 'mp/topic/new.html', {
'form': form,
})
else:
@@ -217,11 +217,16 @@ def new(request):
if len(dest_list) > 0:
dest = ', '.join(dest_list)
+ title = None
+ if 'title' in request.GET:
+ title = request.GET['title']
+
form = PrivateTopicForm(username=request.user.username,
initial={
'participants': dest,
+ 'title': title
})
- return render_template('mp/topic/new.html', {
+ return render(request, 'mp/topic/new.html', {
'form': form,
})
@@ -286,7 +291,7 @@ def answer(request):
form = PrivatePostForm(g_topic, request.user, initial={
'text': data['text']
})
- return render_template('mp/post/new.html', {
+ return render(request, 'mp/post/new.html', {
'topic': g_topic,
'last_post_pk': last_post_pk,
'posts': posts,
@@ -352,7 +357,7 @@ def answer(request):
return redirect(post.get_absolute_url())
else:
- return render_template('mp/post/new.html', {
+ return render(request, 'mp/post/new.html', {
'topic': g_topic,
'last_post_pk': last_post_pk,
'newpost': newpost,
@@ -380,7 +385,7 @@ def answer(request):
form = PrivatePostForm(g_topic, request.user, initial={
'text': text
})
- return render_template('mp/post/new.html', {
+ return render(request, 'mp/post/new.html', {
'topic': g_topic,
'posts': posts,
'last_post_pk': last_post_pk,
@@ -433,7 +438,7 @@ def edit_post(request):
form.helper.form_action = reverse(
'zds.mp.views.edit_post') + '?message=' + str(post_pk)
- return render_template('mp/post/edit.html', {
+ return render(request, 'mp/post/edit.html', {
'post': post,
'topic': g_topic,
'form': form,
@@ -453,7 +458,7 @@ def edit_post(request):
})
form.helper.form_action = reverse(
'zds.mp.views.edit_post') + '?message=' + str(post_pk)
- return render_template('mp/post/edit.html', {
+ return render(request, 'mp/post/edit.html', {
'post': post,
'topic': g_topic,
'text': post.text,
@@ -488,10 +493,14 @@ def leave(request):
@require_POST
@transaction.atomic
def add_participant(request):
- ptopic = get_object_or_404(PrivateTopic, pk=request.POST['topic_pk'])
+ try:
+ ptopic = get_object_or_404(PrivateTopic, pk=request.POST['topic_pk'])
+ except KeyError:
+ messages.warning(
+ request, _(u'La conversation que vous avez essayé d\'utiliser n\'existe pas.'))
# check if user is the author of topic
- if not ptopic.author == request.user:
+ if ptopic is not None and not ptopic.author == request.user:
raise PermissionDenied
try:
@@ -509,6 +518,9 @@ def add_participant(request):
messages.success(
request,
_(u'Le membre a bien été ajouté à la conversation.'))
+ except KeyError:
+ messages.warning(
+ request, _(u'Le membre que vous avez essayé d\'ajouter n\'existe pas.'))
except:
messages.warning(
request, _(u'Le membre que vous avez essayé d\'ajouter n\'existe pas.'))
diff --git a/zds/pages/views.py b/zds/pages/views.py
index a0367f7612..fff7004529 100644
--- a/zds/pages/views.py
+++ b/zds/pages/views.py
@@ -11,6 +11,7 @@
from django.core.urlresolvers import reverse
from django.template import Context
from django.template.loader import get_template
+from django.shortcuts import render
from zds import settings
from zds.article.models import get_last_articles
@@ -18,7 +19,6 @@
from zds.pages.forms import AssocSubscribeForm
from zds.settings import SITE_ROOT
from zds.tutorial.models import get_last_tutorials
-from zds.utils import render_template
from zds.utils.models import Alert
from django.utils.translation import ugettext as _
@@ -41,10 +41,10 @@ def home(request):
try:
with open(os.path.join(SITE_ROOT, 'quotes.txt'), 'r') as fh:
quote = random.choice(fh.readlines())
- except:
+ except IOError:
quote = settings.ZDS_APP['site']['slogan']
- return render_template('home.html', {
+ return render(request, 'home.html', {
'last_tutorials': tutos,
'last_articles': articles,
'quote': quote,
@@ -52,12 +52,12 @@ def home(request):
def index(request):
- return render_template('pages/index.html')
+ return render(request, 'pages/index.html')
def about(request):
"""Display many informations about the website."""
- return render_template('pages/about.html')
+ return render(request, 'pages/about.html')
@can_write_and_read_now
@@ -99,15 +99,15 @@ def assoc_subscribe(request):
# reset the form after successfull validation
form = AssocSubscribeForm()
- return render_template("pages/assoc_subscribe.html", {"form": form})
+ return render(request, "pages/assoc_subscribe.html", {"form": form})
form = AssocSubscribeForm(initial={'email': request.user.email})
- return render_template("pages/assoc_subscribe.html", {"form": form})
+ return render(request, "pages/assoc_subscribe.html", {"form": form})
def association(request):
"""Display association's presentation."""
- return render_template('pages/association.html')
+ return render(request, 'pages/association.html')
def contact(request):
@@ -118,7 +118,7 @@ def contact(request):
devs = User.objects.filter(
groups__in=Group.objects.filter(
name__contains='dev')).all()
- return render_template('pages/contact.html', {
+ return render(request, 'pages/contact.html', {
'staffs': staffs,
'devs': devs
})
@@ -126,12 +126,12 @@ def contact(request):
def eula(request):
"""End-User Licence Agreement."""
- return render_template('pages/eula.html')
+ return render(request, 'pages/eula.html')
def cookies(request):
"""Cookies explaination page."""
- return render_template('pages/cookies.html')
+ return render(request, 'pages/cookies.html')
@can_write_and_read_now
@@ -143,6 +143,6 @@ def alerts(request):
alerts = Alert.objects.all().order_by('-pubdate')
- return render_template('pages/alerts.html', {
+ return render(request, 'pages/alerts.html', {
'alerts': alerts,
})
diff --git a/zds/search/views.py b/zds/search/views.py
index efb28c5693..c5e4befda3 100644
--- a/zds/search/views.py
+++ b/zds/search/views.py
@@ -1,9 +1,11 @@
# coding: utf-8
+from django.shortcuts import render
+
from haystack.views import SearchView
+
from zds.search.constants import MODEL_NAMES
from zds.utils.paginator import paginator_range
-from zds.utils import render_template
class CustomSearchView(SearchView):
@@ -28,4 +30,4 @@ def create_response(self):
context['suggestion'] = self.form.get_suggestion()
context.update(self.extra_context())
- return render_template(self.template, context)
+ return render(self.request, self.template, context)
diff --git a/zds/settings.py b/zds/settings.py
index c5d92c25d4..785033ab0b 100644
--- a/zds/settings.py
+++ b/zds/settings.py
@@ -142,7 +142,12 @@
'django.core.context_processors.static',
'django.core.context_processors.request',
'django.core.context_processors.tz',
- 'django.contrib.messages.context_processors.messages'
+ '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'
@@ -164,6 +169,7 @@
'email_obfuscator',
'haystack',
'munin',
+ 'social.apps.django_app.default',
# Apps DB tables are created in THIS order by default
# --> Order is CRITICAL to properly handle foreign keys
@@ -191,6 +197,8 @@
'avatar_mini': {'size': (24, 24), 'crop': True},
'tutorial_illu': {'size': (60, 60), 'crop': True},
'article_illu': {'size': (60, 60), 'crop': True},
+ 'help_illu': {'size': (48, 48), 'crop': True},
+ 'help_mini_illu': {'size': (26, 26), 'crop': True},
'gallery': {'size': (120, 120), 'crop': True},
'content': {'size': (960, 960), 'crop': False},
},
@@ -251,6 +259,7 @@
SERVE = False
PANDOC_LOC = ''
+PANDOC_PDF_PARAM = "--latex-engine=xelatex --template=../../assets/tex/template.tex -s -S -N --toc -V documentclass=scrbook -V lang=francais -V mainfont=Merriweather -V monofont=\"Andale Mono\" -V fontsize=12pt -V geometry:margin=1in "
# LOG PATH FOR PANDOC LOGGING
PANDOC_LOG = './pandoc.log'
PANDOC_LOG_STATE = False
@@ -308,7 +317,8 @@
'logo': {
'code': u"CC-BY",
'title': u"Creative Commons License",
- 'description': u"Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.",
+ 'description': u"Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - "
+ u"Partage dans les Mêmes Conditions 4.0 International.",
'url_image': u"http://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png",
'url_license': u"http://creativecommons.org/licenses/by-nc-sa/4.0/",
'author': u"MaxRoyo"
@@ -321,11 +331,13 @@
'url_license': u"http://creativecommons.org/licenses/by-nc-sa/4.0/"
},
'source': {
- 'code' : u"GPL v3",
+ 'code': u"GPL v3",
'url_license': u"http://www.gnu.org/licenses/gpl-3.0.html",
'provider_name': u"Progdupeupl",
'provider_url': u"http://progdupeu.pl",
- }
+ },
+ 'licence_info_title': u'http://zestedesavoir.com/tutoriels/281/le-droit-dauteur-creative-commons-et-les-licences-sur-zeste-de-savoir/',
+ 'licence_info_link': u'Le droit d\'auteur, Creative Commons et les licences sur Zeste de Savoir'
},
'hosting': {
'name': u"OVH",
@@ -343,12 +355,15 @@
'image_max_size': 1024 * 1024,
},
'article': {
- 'repo_path': os.path.join(SITE_ROOT, 'articles-data'),
+ 'home_number': 5,
+ 'repo_path': os.path.join(SITE_ROOT, 'articles-data')
},
'tutorial': {
'repo_path': os.path.join(SITE_ROOT, 'tutoriels-private'),
'repo_public_path': os.path.join(SITE_ROOT, 'tutoriels-public'),
- 'default_license_pk': 7
+ 'default_license_pk': 7,
+ 'home_number': 5,
+ 'helps_per_page': 20
},
'forum': {
'posts_per_page': 21,
@@ -359,9 +374,41 @@
'beta_forum_id': 1,
'max_post_length': 1000000,
'top_tag_max': 5,
+ },
+ 'paginator':{
+ 'folding_limit': 4
}
}
+LOGIN_REDIRECT_URL = "/"
+
+AUTHENTICATION_BACKENDS = ('social.backends.facebook.FacebookOAuth2',
+ 'social.backends.google.GoogleOAuth2',
+ 'social.backends.twitter.TwitterOAuth',
+ 'django.contrib.auth.backends.ModelBackend')
+SOCIAL_AUTH_GOOGLE_OAUTH2_USE_DEPRECATED_API = True
+
+SOCIAL_AUTH_PIPELINE = (
+ 'social.pipeline.social_auth.social_details',
+ 'social.pipeline.social_auth.social_uid',
+ 'social.pipeline.social_auth.auth_allowed',
+ 'social.pipeline.social_auth.social_user',
+ 'social.pipeline.user.get_username',
+ 'social.pipeline.user.create_user',
+ 'zds.member.models.save_profile',
+ 'social.pipeline.social_auth.associate_user',
+ 'social.pipeline.social_auth.load_extra_data',
+ 'social.pipeline.user.user_details'
+)
+
+# redefine for real key and secret code
+SOCIAL_AUTH_FACEBOOK_KEY = ""
+SOCIAL_AUTH_FACEBOOK_SECRET = ""
+SOCIAL_AUTH_TWITTER_KEY = "bVWLd2pDe6F12SXRa5FQyVTze"
+SOCIAL_AUTH_TWITTER_SECRET = "pwdQ3trdMdT7Y669aKRwVM6tivrYsx3psbFnRJ5Tq4Wy1VjBNk"
+SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "696570367703-r6hc7mdd27t1sktdkivpnc5b25i0uip2.apps.googleusercontent.com"
+SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "mApWNh3stCsYHwsGuWdbZWP8"
+
# Load the production settings, overwrite the existing ones if needed
try:
from settings_prod import *
diff --git a/zds/settings_test.py b/zds/settings_test.py
index 2e216dd2b7..223d8a975c 100644
--- a/zds/settings_test.py
+++ b/zds/settings_test.py
@@ -1,10 +1,10 @@
DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'zds_test',
- 'USER': 'travis',
- 'PASSWORD': '',
- 'HOST': '127.0.0.1',
- 'PORT': '',
- }
-}
\ No newline at end of file
+ 'default': {
+ 'ENGINE': 'django.db.backends.mysql',
+ 'NAME': 'zds_test',
+ 'USER': 'travis',
+ 'PASSWORD': '',
+ 'HOST': '127.0.0.1',
+ 'PORT': '',
+ }
+}
diff --git a/zds/tutorial/factories.py b/zds/tutorial/factories.py
index 5a7ac99919..dd9147ee72 100644
--- a/zds/tutorial/factories.py
+++ b/zds/tutorial/factories.py
@@ -12,20 +12,21 @@
from zds.utils.models import SubCategory, Licence
from zds.gallery.factories import GalleryFactory, UserGalleryFactory
from zds.utils.tutorials import export_tutorial
+from zds.tutorial.views import mep
content = (
- u'Ceci est un contenu de tutoriel utile et à tester un peu partout'
- u'Ce contenu ira aussi bien dans les introductions, que dans les conclusions et les extraits '
- u'le gros intéret étant qu\'il renferme des images pour tester l\'execution coté pandoc '
- u'Exemple d\'image ![Ma pepite souris](http://blog.science-infuse.fr/public/souris.jpg)'
- u'\nExemple d\'image ![Image inexistante](http://blog.science-infuse.fr/public/inv_souris.jpg)'
- u'\nExemple de gif ![](http://corigif.free.fr/oiseau/img/oiseau_004.gif)'
- u'\nExemple de gif inexistant ![](http://corigif.free.fr/oiseau/img/ironman.gif)'
+ u'Ceci est un contenu de tutoriel utile et à tester un peu partout\n\n '
+ u'Ce contenu ira aussi bien dans les introductions, que dans les conclusions et les extraits \n\n '
+ u'le gros intéret étant qu\'il renferme des images pour tester l\'execution coté pandoc \n\n '
+ u'Exemple d\'image ![Ma pepite souris](http://blog.science-infuse.fr/public/souris.jpg)\n\n '
+ u'\nExemple d\'image ![Image inexistante](http://blog.science-infuse.fr/public/inv_souris.jpg)\n\n '
+ u'\nExemple de gif ![](http://corigif.free.fr/oiseau/img/oiseau_004.gif)\n\n '
+ u'\nExemple de gif inexistant ![](http://corigif.free.fr/oiseau/img/ironman.gif)\n\n '
u'Une image de type wikipedia qui fait tomber des tests ![](https://s.qwant.com/thumbr/?u=http%3A%2'
- u'F%2Fwww.blogoergosum.com%2Fwp-content%2Fuploads%2F2010%2F02%2Fwikipedia-logo.jpg&h=338&w=600)'
- u'Image dont le serveur n\'existe pas ![](http://unknown.image.zds)'
- u'\n Attention les tests ne doivent pas crasher '
- u'qu\'un sujet abandonné !')
+ u'F%2Fwww.blogoergosum.com%2Fwp-content%2Fuploads%2F2010%2F02%2Fwikipedia-logo.jpg&h=338&w=600)\n\n '
+ u'Image dont le serveur n\'existe pas ![](http://unknown.image.zds)\n\n '
+ u'\n Attention les tests ne doivent pas crasher \n\n \n\n \n\n '
+ u'qu\'un sujet abandonné !\n\n ')
content_light = u'Un contenu light pour quand ce n\'est pas vraiment ça qui est testé'
@@ -326,7 +327,7 @@ class SubCategoryFactory(factory.DjangoModelFactory):
slug = factory.Sequence(lambda n: 'sous-categorie-{0}'.format(n))
-class VaidationFactory(factory.DjangoModelFactory):
+class ValidationFactory(factory.DjangoModelFactory):
FACTORY_FOR = Validation
@@ -340,3 +341,18 @@ class LicenceFactory(factory.DjangoModelFactory):
def _prepare(cls, create, **kwargs):
licence = super(LicenceFactory, cls)._prepare(create, **kwargs)
return licence
+
+
+class PublishedMiniTutorial(MiniTutorialFactory):
+ FACTORY_FOR = Tutorial
+
+ @classmethod
+ def _prepare(cls, create, **kwargs):
+ tutorial = super(PublishedMiniTutorial, cls)._prepare(create, **kwargs)
+ tutorial.pubdate = datetime.now()
+ tutorial.sha_public = tutorial.sha_draft
+ tutorial.source = ''
+ tutorial.sha_validation = None
+ mep(tutorial, tutorial.sha_draft)
+ tutorial.save()
+ return tutorial
diff --git a/zds/tutorial/forms.py b/zds/tutorial/forms.py
index ab6c84ebd4..e2001098e8 100644
--- a/zds/tutorial/forms.py
+++ b/zds/tutorial/forms.py
@@ -4,14 +4,13 @@
from crispy_forms.bootstrap import StrictButton
from crispy_forms.helper import FormHelper
-from crispy_forms.layout import Layout, Fieldset, Submit, Field, \
+from crispy_forms.layout import HTML, Layout, Fieldset, Submit, Field, \
ButtonHolder, Hidden
from django.core.urlresolvers import reverse
-from zds.tutorial.models import TYPE_CHOICES
from zds.utils.forms import CommonLayoutModalText, CommonLayoutEditor, CommonLayoutVersionEditor
from zds.utils.models import SubCategory, Licence
-from zds.tutorial.models import Tutorial
+from zds.tutorial.models import Tutorial, TYPE_CHOICES, HelpWriting
from django.utils.translation import ugettext_lazy as _
@@ -92,7 +91,14 @@ class TutorialForm(FormWithTitle):
)
licence = forms.ModelChoiceField(
- label=_(u"Licence de votre publication"),
+ label=(
+ _(u'Licence de votre publication (En savoir plus sur les licences et {2})')
+ .format(
+ settings.ZDS_APP['site']['licenses']['licence_info_title'],
+ settings.ZDS_APP['site']['licenses']['licence_info_link'],
+ settings.ZDS_APP['site']['name']
+ )
+ ),
queryset=Licence.objects.all(),
required=True,
empty_label=None
@@ -109,6 +115,13 @@ class TutorialForm(FormWithTitle):
)
)
+ helps = forms.ModelMultipleChoiceField(
+ label=_(u"Pour m'aider je cherche un..."),
+ queryset=HelpWriting.objects.all(),
+ required=False,
+ widget=forms.SelectMultiple()
+ )
+
def __init__(self, *args, **kwargs):
super(TutorialForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
@@ -123,8 +136,15 @@ def __init__(self, *args, **kwargs):
Field('introduction', css_class='md-editor'),
Field('conclusion', css_class='md-editor'),
Hidden('last_hash', '{{ last_hash }}'),
- Field('subcategory'),
Field('licence'),
+ Field('subcategory'),
+ HTML(_(u"
Demander de l'aide à la communauté ! "
+ u"Si vous avez besoin d'un coup de main,"
+ u"sélectionnez une ou plusieurs catégories d'aide ci-dessous "
+ u"et votre tutoriel apparaitra alors sur la page d'aide.