forum: add favorite topics

Signed-off-by: Skia <skia@libskia.so>
This commit is contained in:
Skia 2018-02-22 22:19:17 +01:00
parent f47f846d26
commit 606f1af4d5
9 changed files with 231 additions and 114 deletions

View File

@ -1,6 +1,6 @@
# -*- coding:utf-8 -* # -*- coding:utf-8 -*
# #
# Copyright 2016,2017 # Copyright 2016,2017,2018
# - Skia <skia@libskia.so> # - Skia <skia@libskia.so>
# - Sli <antoine@bartuccio.fr> # - Sli <antoine@bartuccio.fr>
# #
@ -567,6 +567,10 @@ class AnonymousUser(AuthAnonymousUser):
def forum_infos(self): def forum_infos(self):
raise PermissionDenied raise PermissionDenied
@property
def favorite_topics(self):
raise PermissionDenied
def is_in_group(self, group_name): def is_in_group(self, group_name):
""" """
The anonymous user is only the public group The anonymous user is only the public group

View File

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('forum', '0004_auto_20170531_1949'),
]
operations = [
migrations.AddField(
model_name='forumtopic',
name='subscribed_users',
field=models.ManyToManyField(verbose_name='subscribed users', related_name='favorite_topics', to=settings.AUTH_USER_MODEL),
),
]

View File

@ -1,6 +1,6 @@
# -*- coding:utf-8 -* # -*- coding:utf-8 -*
# #
# Copyright 2016,2017 # Copyright 2016,2017,2018
# - Skia <skia@libskia.so> # - Skia <skia@libskia.so>
# #
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, # Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
@ -184,6 +184,7 @@ class ForumTopic(models.Model):
forum = models.ForeignKey(Forum, related_name='topics') forum = models.ForeignKey(Forum, related_name='topics')
author = models.ForeignKey(User, related_name='forum_topics') author = models.ForeignKey(User, related_name='forum_topics')
description = models.CharField(_('description'), max_length=256, default="") description = models.CharField(_('description'), max_length=256, default="")
subscribed_users = models.ManyToManyField(User, related_name='favorite_topics', verbose_name=_("subscribed users"))
_last_message = models.ForeignKey('ForumMessage', related_name="+", verbose_name=_("the last message"), _last_message = models.ForeignKey('ForumMessage', related_name="+", verbose_name=_("the last message"),
null=True, on_delete=models.SET_NULL) null=True, on_delete=models.SET_NULL)
_title = models.CharField(_('title'), max_length=64, blank=True) _title = models.CharField(_('title'), max_length=64, blank=True)

View File

@ -0,0 +1,33 @@
{% extends "core/base.jinja" %}
{% from 'forum/macros.jinja' import display_topic %}
{% block title %}
{% trans %}Favorite topics{% endtrans %}
{% endblock %}
{% block content %}
<p>
<a href="{{ url('forum:main') }}">Forum</a> >
<a href="{{ url('forum:favorite_topics') }}">{% trans %}Favorite topics{% endtrans %}</a>
</p>
<div id="forum">
<h3>{% trans %}Forum{% endtrans %}</h3>
<h4>{% trans %}Favorite topics{% endtrans %}</h4>
{% for t in page_obj.object_list %}
{% if user.can_view(t) %}
{{ display_topic(t, user) }}
{% endif %}
{% endfor %}
<p style="text-align: right; background: #d8e7f3;">
{% for p in paginator.page_range %}
<span class="ib" style="background: {% if p == paginator.number %}white{% endif %}; margin: 0;">
<a href="?page={{ p }}">{{ p }}</a>
</span>
{% endfor %}
</p>
</div>
{% endblock %}

View File

@ -14,6 +14,7 @@
<h3>{% trans %}Forum{% endtrans %}</h3> <h3>{% trans %}Forum{% endtrans %}</h3>
<p> <p>
<a class="ib button" href="{{ url('forum:last_unread') }}">{% trans %}View last unread messages{% endtrans %}</a> <a class="ib button" href="{{ url('forum:last_unread') }}">{% trans %}View last unread messages{% endtrans %}</a>
<a class="ib button" href="{{ url('forum:favorite_topics') }}">{% trans %}Favorite topics{% endtrans %}</a>
</p> </p>
{% if user.is_in_group(settings.SITH_GROUP_FORUM_ADMIN_ID) or user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) %} {% if user.is_in_group(settings.SITH_GROUP_FORUM_ADMIN_ID) or user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) %}
<p> <p>

View File

@ -37,7 +37,14 @@
<h3>{{ topic.title }}</h3> <h3>{{ topic.title }}</h3>
<div id="forum"> <div id="forum">
<p>{{ topic.description }}</p> <p>{{ topic.description }}</p>
<p><a href="{{ url('forum:new_message', topic_id=topic.id) }}">{% trans %}Reply{% endtrans %}</a></p> <p>
<a class="ib button" href="{{ url('forum:new_message', topic_id=topic.id) }}">{% trans %}Reply{% endtrans %}</a>
{% if user in topic.subscribed_users.all() %}
<a class="ib button" href="{{ url('forum:toggle_subscribe_topic', topic_id=topic.id) }}">{% trans %}Unmark as favorite{% endtrans %}</a>
{% else %}
<a class="ib button" href="{{ url('forum:toggle_subscribe_topic', topic_id=topic.id) }}">{% trans %}Mark as favorite{% endtrans %}</a>
{% endif %}
</p>
<p style="text-align: right; background: #d8e7f3;"> <p style="text-align: right; background: #d8e7f3;">
{% for p in msgs.paginator.page_range %} {% for p in msgs.paginator.page_range %}
@ -56,7 +63,7 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
<p><a href="{{ url('forum:new_message', topic_id=topic.id) }}">{% trans %}Reply{% endtrans %}</a></p> <p><a class="ib button" href="{{ url('forum:new_message', topic_id=topic.id) }}">{% trans %}Reply{% endtrans %}</a></p>
<p style="text-align: right; background: #d8e7f3;"> <p style="text-align: right; background: #d8e7f3;">
{% for p in msgs.paginator.page_range %} {% for p in msgs.paginator.page_range %}

View File

@ -1,6 +1,6 @@
# -*- coding:utf-8 -* # -*- coding:utf-8 -*
# #
# Copyright 2016,2017 # Copyright 2016,2017,2018
# - Skia <skia@libskia.so> # - Skia <skia@libskia.so>
# #
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, # Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
@ -31,6 +31,7 @@ urlpatterns = [
url(r'^new_forum$', ForumCreateView.as_view(), name='new_forum'), url(r'^new_forum$', ForumCreateView.as_view(), name='new_forum'),
url(r'^mark_all_as_read$', ForumMarkAllAsRead.as_view(), name='mark_all_as_read'), url(r'^mark_all_as_read$', ForumMarkAllAsRead.as_view(), name='mark_all_as_read'),
url(r'^last_unread$', ForumLastUnread.as_view(), name='last_unread'), url(r'^last_unread$', ForumLastUnread.as_view(), name='last_unread'),
url(r'^favorite_topics$', ForumFavoriteTopics.as_view(), name='favorite_topics'),
url(r'^(?P<forum_id>[0-9]+)$', ForumDetailView.as_view(), name='view_forum'), url(r'^(?P<forum_id>[0-9]+)$', ForumDetailView.as_view(), name='view_forum'),
url(r'^(?P<forum_id>[0-9]+)/edit$', ForumEditView.as_view(), name='edit_forum'), url(r'^(?P<forum_id>[0-9]+)/edit$', ForumEditView.as_view(), name='edit_forum'),
url(r'^(?P<forum_id>[0-9]+)/delete$', ForumDeleteView.as_view(), name='delete_forum'), url(r'^(?P<forum_id>[0-9]+)/delete$', ForumDeleteView.as_view(), name='delete_forum'),
@ -38,6 +39,7 @@ urlpatterns = [
url(r'^topic/(?P<topic_id>[0-9]+)$', ForumTopicDetailView.as_view(), name='view_topic'), url(r'^topic/(?P<topic_id>[0-9]+)$', ForumTopicDetailView.as_view(), name='view_topic'),
url(r'^topic/(?P<topic_id>[0-9]+)/edit$', ForumTopicEditView.as_view(), name='edit_topic'), url(r'^topic/(?P<topic_id>[0-9]+)/edit$', ForumTopicEditView.as_view(), name='edit_topic'),
url(r'^topic/(?P<topic_id>[0-9]+)/new_message$', ForumMessageCreateView.as_view(), name='new_message'), url(r'^topic/(?P<topic_id>[0-9]+)/new_message$', ForumMessageCreateView.as_view(), name='new_message'),
url(r'^topic/(?P<topic_id>[0-9]+)/toggle_subscribe$', ForumTopicSubscribeView.as_view(), name='toggle_subscribe_topic'),
url(r'^message/(?P<message_id>[0-9]+)$', ForumMessageView.as_view(), name='view_message'), url(r'^message/(?P<message_id>[0-9]+)$', ForumMessageView.as_view(), name='view_message'),
url(r'^message/(?P<message_id>[0-9]+)/edit$', ForumMessageEditView.as_view(), name='edit_message'), url(r'^message/(?P<message_id>[0-9]+)/edit$', ForumMessageEditView.as_view(), name='edit_message'),
url(r'^message/(?P<message_id>[0-9]+)/delete$', ForumMessageDeleteView.as_view(), name='delete_message'), url(r'^message/(?P<message_id>[0-9]+)/delete$', ForumMessageDeleteView.as_view(), name='delete_message'),

View File

@ -1,6 +1,6 @@
# -*- coding:utf-8 -* # -*- coding:utf-8 -*
# #
# Copyright 2016,2017 # Copyright 2016,2017,2018
# - Skia <skia@libskia.so> # - Skia <skia@libskia.so>
# #
# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, # Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM,
@ -62,6 +62,15 @@ class ForumMarkAllAsRead(RedirectView):
return super(ForumMarkAllAsRead, self).get(request, *args, **kwargs) return super(ForumMarkAllAsRead, self).get(request, *args, **kwargs)
class ForumFavoriteTopics(ListView):
model = ForumTopic
template_name = "forum/favorite_topics.jinja"
paginate_by = settings.SITH_FORUM_PAGE_LENGTH / 2
def get_queryset(self):
topic_list = self.request.user.favorite_topics.all()
return topic_list
class ForumLastUnread(ListView): class ForumLastUnread(ListView):
model = ForumTopic model = ForumTopic
template_name = "forum/last_unread.jinja" template_name = "forum/last_unread.jinja"
@ -184,6 +193,22 @@ class ForumTopicEditView(CanEditMixin, UpdateView):
pk_url_kwarg = "topic_id" pk_url_kwarg = "topic_id"
template_name = "core/edit.jinja" template_name = "core/edit.jinja"
class ForumTopicSubscribeView(CanViewMixin, SingleObjectMixin, RedirectView):
model = ForumTopic
pk_url_kwarg = "topic_id"
permanent = False
def get(self, request, *args, **kwargs):
self.object = self.get_object()
if request.user in self.object.subscribed_users.all():
self.object.subscribed_users.remove(request.user)
else:
self.object.subscribed_users.add(request.user)
return super().get(request, *args, **kwargs)
def get_redirect_url(self, *args, **kwargs):
return self.object.get_absolute_url()
class ForumTopicDetailView(CanViewMixin, DetailView): class ForumTopicDetailView(CanViewMixin, DetailView):
model = ForumTopic model = ForumTopic

View File

@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-12-22 12:14+0100\n" "POT-Creation-Date: 2018-02-22 22:25+0100\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia <skia@libskia.so>\n" "Last-Translator: Skia <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@ -127,10 +127,10 @@ msgstr "numéro"
msgid "journal" msgid "journal"
msgstr "classeur" msgstr "classeur"
#: accounting/models.py:258 core/models.py:653 core/models.py:1054 #: accounting/models.py:258 core/models.py:657 core/models.py:1058
#: core/models.py:1098 core/models.py:1125 counter/models.py:301 #: core/models.py:1102 core/models.py:1129 counter/models.py:301
#: counter/models.py:351 counter/models.py:484 eboutic/models.py:39 #: counter/models.py:351 counter/models.py:484 eboutic/models.py:39
#: eboutic/models.py:73 forum/models.py:239 forum/models.py:314 #: eboutic/models.py:73 forum/models.py:240 forum/models.py:315
#: stock/models.py:76 #: stock/models.py:76
msgid "date" msgid "date"
msgstr "date" msgstr "date"
@ -166,7 +166,7 @@ msgid "accounting type"
msgstr "type comptable" msgstr "type comptable"
#: accounting/models.py:269 accounting/models.py:371 accounting/models.py:398 #: accounting/models.py:269 accounting/models.py:371 accounting/models.py:398
#: accounting/models.py:422 core/models.py:1124 counter/models.py:343 #: accounting/models.py:422 core/models.py:1128 counter/models.py:343
msgid "label" msgid "label"
msgstr "étiquette" msgstr "étiquette"
@ -973,7 +973,7 @@ msgid "Enter a valid address. Only the root of the address is needed."
msgstr "" msgstr ""
"Entrez une adresse valide. Seule la racine de l'adresse est nécessaire." "Entrez une adresse valide. Seule la racine de l'adresse est nécessaire."
#: club/models.py:276 com/models.py:75 com/models.py:216 core/models.py:654 #: club/models.py:276 com/models.py:75 com/models.py:216 core/models.py:658
msgid "is moderated" msgid "is moderated"
msgstr "est modéré" msgstr "est modéré"
@ -1266,7 +1266,7 @@ msgstr "Éditer la page de club"
msgid "Mailing list" msgid "Mailing list"
msgstr "Listes de diffusion" msgstr "Listes de diffusion"
#: club/views.py:150 com/views.py:111 #: club/views.py:150 com/views.py:116
msgid "Posters list" msgid "Posters list"
msgstr "Liste d'affiches" msgstr "Liste d'affiches"
@ -1289,7 +1289,7 @@ msgstr "Vous n'avez pas la permission de faire cela"
msgid "Begin date" msgid "Begin date"
msgstr "Date de début" msgstr "Date de début"
#: club/views.py:321 com/views.py:172 counter/views.py:1098 #: club/views.py:321 com/views.py:66 com/views.py:177 counter/views.py:1098
#: election/views.py:135 subscription/views.py:47 #: election/views.py:135 subscription/views.py:47
msgid "End date" msgid "End date"
msgstr "Date de fin" msgstr "Date de fin"
@ -1332,8 +1332,8 @@ msgid "Call"
msgstr "Appel" msgstr "Appel"
#: com/models.py:69 com/models.py:133 com/models.py:181 election/models.py:13 #: com/models.py:69 com/models.py:133 com/models.py:181 election/models.py:13
#: election/models.py:98 election/models.py:134 forum/models.py:189 #: election/models.py:98 election/models.py:134 forum/models.py:190
#: forum/models.py:237 #: forum/models.py:238
msgid "title" msgid "title"
msgstr "titre" msgstr "titre"
@ -1345,7 +1345,7 @@ msgstr "résumé"
msgid "content" msgid "content"
msgstr "contenu" msgstr "contenu"
#: com/models.py:72 core/models.py:1097 launderette/models.py:86 #: com/models.py:72 core/models.py:1101 launderette/models.py:86
#: launderette/models.py:112 launderette/models.py:149 stock/models.py:59 #: launderette/models.py:112 launderette/models.py:149 stock/models.py:59
#: stock/models.py:98 #: stock/models.py:98
msgid "type" msgid "type"
@ -1395,7 +1395,7 @@ msgstr "weekmail"
msgid "rank" msgid "rank"
msgstr "rang" msgstr "rang"
#: com/models.py:210 core/models.py:644 core/models.py:660 #: com/models.py:210 core/models.py:648 core/models.py:664
msgid "file" msgid "file"
msgstr "fichier" msgstr "fichier"
@ -1403,11 +1403,11 @@ msgstr "fichier"
msgid "display time" msgid "display time"
msgstr "temps d'affichage" msgstr "temps d'affichage"
#: com/models.py:221 #: com/models.py:228
msgid "Begin date should be before end date" msgid "Begin date should be before end date"
msgstr "La date de début doit être avant celle de fin" msgstr "La date de début doit être avant celle de fin"
#: com/templates/com/mailing_admin.jinja:4 com/views.py:106 #: com/templates/com/mailing_admin.jinja:4 com/views.py:111
#: core/templates/core/user_tools.jinja:89 #: core/templates/core/user_tools.jinja:89
msgid "Mailing lists administration" msgid "Mailing lists administration"
msgstr "Administration des mailing listes" msgstr "Administration des mailing listes"
@ -1491,8 +1491,8 @@ msgstr "Type"
#: com/templates/com/news_admin_list.jinja:286 #: com/templates/com/news_admin_list.jinja:286
#: com/templates/com/weekmail.jinja:19 com/templates/com/weekmail.jinja:48 #: com/templates/com/weekmail.jinja:19 com/templates/com/weekmail.jinja:48
#: core/templates/core/base.jinja:307 forum/templates/forum/forum.jinja:29 #: core/templates/core/base.jinja:307 forum/templates/forum/forum.jinja:29
#: forum/templates/forum/forum.jinja:48 forum/templates/forum/main.jinja:25 #: forum/templates/forum/forum.jinja:48 forum/templates/forum/main.jinja:26
#: forum/views.py:159 #: forum/views.py:168
msgid "Title" msgid "Title"
msgstr "Titre" msgstr "Titre"
@ -1723,7 +1723,7 @@ msgid "Slideshow"
msgstr "Diaporama" msgstr "Diaporama"
#: com/templates/com/weekmail.jinja:5 com/templates/com/weekmail.jinja.py:9 #: com/templates/com/weekmail.jinja:5 com/templates/com/weekmail.jinja.py:9
#: com/views.py:81 core/templates/core/user_tools.jinja:81 #: com/views.py:86 core/templates/core/user_tools.jinja:81
msgid "Weekmail" msgid "Weekmail"
msgstr "Weekmail" msgstr "Weekmail"
@ -1810,59 +1810,60 @@ msgstr "Astuce"
msgid "Final word" msgid "Final word"
msgstr "Le mot de la fin" msgstr "Le mot de la fin"
#: com/views.py:74 #: com/views.py:64 com/views.py:176 election/views.py:133
msgid "Communication administration" #: subscription/views.py:44
msgstr "Administration de la communication"
#: com/views.py:86 core/templates/core/user_tools.jinja:82
msgid "Weekmail destinations"
msgstr "Destinataires du Weekmail"
#: com/views.py:91
msgid "Index page"
msgstr "Page d'accueil"
#: com/views.py:96
msgid "Info message"
msgstr "Message d'info"
#: com/views.py:101
msgid "Alert message"
msgstr "Message d'alerte"
#: com/views.py:116
msgid "Screens list"
msgstr "Liste d'écrans"
#: com/views.py:171 election/views.py:133 subscription/views.py:44
msgid "Start date" msgid "Start date"
msgstr "Date de début" msgstr "Date de début"
#: com/views.py:173 #: com/views.py:79
msgid "Communication administration"
msgstr "Administration de la communication"
#: com/views.py:91 core/templates/core/user_tools.jinja:82
msgid "Weekmail destinations"
msgstr "Destinataires du Weekmail"
#: com/views.py:96
msgid "Index page"
msgstr "Page d'accueil"
#: com/views.py:101
msgid "Info message"
msgstr "Message d'info"
#: com/views.py:106
msgid "Alert message"
msgstr "Message d'alerte"
#: com/views.py:121
msgid "Screens list"
msgstr "Liste d'écrans"
#: com/views.py:178
msgid "Until" msgid "Until"
msgstr "Jusqu'à" msgstr "Jusqu'à"
#: com/views.py:174 #: com/views.py:179
msgid "Automoderation" msgid "Automoderation"
msgstr "Automodération" msgstr "Automodération"
#: com/views.py:180 com/views.py:182 com/views.py:186 #: com/views.py:185 com/views.py:187 com/views.py:191
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est obligatoire." msgstr "Ce champ est obligatoire."
#: com/views.py:184 #: com/views.py:189
msgid "You crazy? You can not finish an event before starting it." msgid "You crazy? You can not finish an event before starting it."
msgstr "T'es fou? Un événement ne peut pas finir avant même de commencer." msgstr "T'es fou? Un événement ne peut pas finir avant même de commencer."
#: com/views.py:366 #: com/views.py:371
msgid "Delete and save to regenerate" msgid "Delete and save to regenerate"
msgstr "Supprimer et sauver pour regénérer" msgstr "Supprimer et sauver pour regénérer"
#: com/views.py:374 #: com/views.py:379
msgid "Weekmail of the " msgid "Weekmail of the "
msgstr "Weekmail du " msgstr "Weekmail du "
#: com/views.py:454 #: com/views.py:459
msgid "" msgid ""
"You must be a board member of the selected club to post in the Weekmail." "You must be a board member of the selected club to post in the Weekmail."
msgstr "" msgstr ""
@ -2107,109 +2108,109 @@ msgstr "Un utilisateur de ce nom d'utilisateur existe déjà"
msgid "Profile" msgid "Profile"
msgstr "Profil" msgstr "Profil"
#: core/models.py:600 #: core/models.py:604
msgid "Visitor" msgid "Visitor"
msgstr "Visiteur" msgstr "Visiteur"
#: core/models.py:606 #: core/models.py:610
msgid "do you want to receive the weekmail" msgid "do you want to receive the weekmail"
msgstr "voulez-vous recevoir le Weekmail" msgstr "voulez-vous recevoir le Weekmail"
#: core/models.py:610 #: core/models.py:614
msgid "show your stats to others" msgid "show your stats to others"
msgstr "montrez vos statistiques aux autres" msgstr "montrez vos statistiques aux autres"
#: core/models.py:614 #: core/models.py:618
msgid "get a notification for every click" msgid "get a notification for every click"
msgstr "recevez une notification pour chaque click" msgstr "recevez une notification pour chaque click"
#: core/models.py:618 #: core/models.py:622
msgid "get a notification for every refilling" msgid "get a notification for every refilling"
msgstr "recevez une notification pour chaque rechargement" msgstr "recevez une notification pour chaque rechargement"
#: core/models.py:642 #: core/models.py:646
msgid "file name" msgid "file name"
msgstr "nom du fichier" msgstr "nom du fichier"
#: core/models.py:643 core/models.py:858 #: core/models.py:647 core/models.py:862
msgid "parent" msgid "parent"
msgstr "parent" msgstr "parent"
#: core/models.py:645 #: core/models.py:649
msgid "compressed file" msgid "compressed file"
msgstr "version allégée" msgstr "version allégée"
#: core/models.py:646 #: core/models.py:650
msgid "thumbnail" msgid "thumbnail"
msgstr "miniature" msgstr "miniature"
#: core/models.py:647 core/models.py:655 #: core/models.py:651 core/models.py:659
msgid "owner" msgid "owner"
msgstr "propriétaire" msgstr "propriétaire"
#: core/models.py:648 core/models.py:864 core/views/files.py:149 #: core/models.py:652 core/models.py:868 core/views/files.py:149
msgid "edit group" msgid "edit group"
msgstr "groupe d'édition" msgstr "groupe d'édition"
#: core/models.py:649 core/models.py:865 core/views/files.py:150 #: core/models.py:653 core/models.py:869 core/views/files.py:150
msgid "view group" msgid "view group"
msgstr "groupe de vue" msgstr "groupe de vue"
#: core/models.py:650 #: core/models.py:654
msgid "is folder" msgid "is folder"
msgstr "est un dossier" msgstr "est un dossier"
#: core/models.py:651 #: core/models.py:655
msgid "mime type" msgid "mime type"
msgstr "type mime" msgstr "type mime"
#: core/models.py:652 #: core/models.py:656
msgid "size" msgid "size"
msgstr "taille" msgstr "taille"
#: core/models.py:656 #: core/models.py:660
msgid "asked for removal" msgid "asked for removal"
msgstr "retrait demandé" msgstr "retrait demandé"
#: core/models.py:657 #: core/models.py:661
msgid "is in the SAS" msgid "is in the SAS"
msgstr "est dans le SAS" msgstr "est dans le SAS"
#: core/models.py:696 #: core/models.py:700
msgid "Character '/' not authorized in name" msgid "Character '/' not authorized in name"
msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier" msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier"
#: core/models.py:699 core/models.py:704 #: core/models.py:703 core/models.py:708
msgid "Loop in folder tree" msgid "Loop in folder tree"
msgstr "Boucle dans l'arborescence des dossiers" msgstr "Boucle dans l'arborescence des dossiers"
#: core/models.py:708 #: core/models.py:712
msgid "You can not make a file be a children of a non folder file" msgid "You can not make a file be a children of a non folder file"
msgstr "" msgstr ""
"Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas " "Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas "
"un dossier" "un dossier"
#: core/models.py:712 #: core/models.py:716
msgid "Duplicate file" msgid "Duplicate file"
msgstr "Un fichier de ce nom existe déjà" msgstr "Un fichier de ce nom existe déjà"
#: core/models.py:726 #: core/models.py:730
msgid "You must provide a file" msgid "You must provide a file"
msgstr "Vous devez fournir un fichier" msgstr "Vous devez fournir un fichier"
#: core/models.py:796 #: core/models.py:800
msgid "Folder: " msgid "Folder: "
msgstr "Dossier : " msgstr "Dossier : "
#: core/models.py:798 #: core/models.py:802
msgid "File: " msgid "File: "
msgstr "Fichier : " msgstr "Fichier : "
#: core/models.py:850 #: core/models.py:854
msgid "page unix name" msgid "page unix name"
msgstr "nom unix de la page" msgstr "nom unix de la page"
#: core/models.py:854 #: core/models.py:858
msgid "" msgid ""
"Enter a valid page name. This value may contain only unaccented letters, " "Enter a valid page name. This value may contain only unaccented letters, "
"numbers and ./+/-/_ characters." "numbers and ./+/-/_ characters."
@ -2217,51 +2218,51 @@ msgstr ""
"Entrez un nom de page correct. Uniquement des lettres non accentuées, " "Entrez un nom de page correct. Uniquement des lettres non accentuées, "
"numéros, et ./+/-/_" "numéros, et ./+/-/_"
#: core/models.py:861 #: core/models.py:865
msgid "page name" msgid "page name"
msgstr "nom de la page" msgstr "nom de la page"
#: core/models.py:862 #: core/models.py:866
msgid "owner group" msgid "owner group"
msgstr "groupe propriétaire" msgstr "groupe propriétaire"
#: core/models.py:866 #: core/models.py:870
msgid "lock user" msgid "lock user"
msgstr "utilisateur bloquant" msgstr "utilisateur bloquant"
#: core/models.py:867 #: core/models.py:871
msgid "lock_timeout" msgid "lock_timeout"
msgstr "décompte du déblocage" msgstr "décompte du déblocage"
#: core/models.py:894 #: core/models.py:898
msgid "Duplicate page" msgid "Duplicate page"
msgstr "Une page de ce nom existe déjà" msgstr "Une page de ce nom existe déjà"
#: core/models.py:900 #: core/models.py:904
msgid "Loop in page tree" msgid "Loop in page tree"
msgstr "Boucle dans l'arborescence des pages" msgstr "Boucle dans l'arborescence des pages"
#: core/models.py:1051 #: core/models.py:1055
msgid "revision" msgid "revision"
msgstr "révision" msgstr "révision"
#: core/models.py:1052 #: core/models.py:1056
msgid "page title" msgid "page title"
msgstr "titre de la page" msgstr "titre de la page"
#: core/models.py:1053 #: core/models.py:1057
msgid "page content" msgid "page content"
msgstr "contenu de la page" msgstr "contenu de la page"
#: core/models.py:1095 #: core/models.py:1099
msgid "url" msgid "url"
msgstr "url" msgstr "url"
#: core/models.py:1096 #: core/models.py:1100
msgid "param" msgid "param"
msgstr "param" msgstr "param"
#: core/models.py:1099 #: core/models.py:1103
msgid "viewed" msgid "viewed"
msgstr "vue" msgstr "vue"
@ -2306,7 +2307,7 @@ msgid "View more"
msgstr "Voir plus" msgstr "Voir plus"
#: core/templates/core/base.jinja:108 #: core/templates/core/base.jinja:108
#: forum/templates/forum/last_unread.jinja:16 #: forum/templates/forum/last_unread.jinja:17
msgid "Mark all as read" msgid "Mark all as read"
msgstr "Marquer tout commme lu" msgstr "Marquer tout commme lu"
@ -2337,8 +2338,10 @@ msgstr "Wiki"
msgid "SAS" msgid "SAS"
msgstr "SAS" msgstr "SAS"
#: core/templates/core/base.jinja:156 forum/templates/forum/forum.jinja:10 #: core/templates/core/base.jinja:156
#: forum/templates/forum/last_unread.jinja:13 #: forum/templates/forum/favorite_topics.jinja:14
#: forum/templates/forum/forum.jinja:10
#: forum/templates/forum/last_unread.jinja:14
#: forum/templates/forum/main.jinja:6 forum/templates/forum/main.jinja.py:11 #: forum/templates/forum/main.jinja:6 forum/templates/forum/main.jinja.py:11
#: forum/templates/forum/main.jinja:14 forum/templates/forum/reply.jinja:15 #: forum/templates/forum/main.jinja:14 forum/templates/forum/reply.jinja:15
#: forum/templates/forum/topic.jinja:30 #: forum/templates/forum/topic.jinja:30
@ -4188,7 +4191,7 @@ msgstr "club propriétaire"
msgid "number to choose a specific forum ordering" msgid "number to choose a specific forum ordering"
msgstr "numéro spécifiant l'ordre d'affichage" msgstr "numéro spécifiant l'ordre d'affichage"
#: forum/models.py:61 forum/models.py:187 #: forum/models.py:61 forum/models.py:188
msgid "the last message" msgid "the last message"
msgstr "le dernier message" msgstr "le dernier message"
@ -4200,43 +4203,54 @@ msgstr "nombre de sujets"
msgid "You can not make loops in forums" msgid "You can not make loops in forums"
msgstr "Vous ne pouvez pas faire de boucles dans les forums" msgstr "Vous ne pouvez pas faire de boucles dans les forums"
#: forum/models.py:190 #: forum/models.py:187
msgid "subscribed users"
msgstr "utilisateurs abonnés"
#: forum/models.py:191
msgid "number of messages" msgid "number of messages"
msgstr "nombre de messages" msgstr "nombre de messages"
#: forum/models.py:238 #: forum/models.py:239
msgid "message" msgid "message"
msgstr "message" msgstr "message"
#: forum/models.py:240 #: forum/models.py:241
msgid "readers" msgid "readers"
msgstr "lecteurs" msgstr "lecteurs"
#: forum/models.py:241 #: forum/models.py:242
msgid "is deleted" msgid "is deleted"
msgstr "est supprimé" msgstr "est supprimé"
#: forum/models.py:305 #: forum/models.py:306
msgid "Message edited by" msgid "Message edited by"
msgstr "Message édité par" msgstr "Message édité par"
#: forum/models.py:306 #: forum/models.py:307
msgid "Message deleted by" msgid "Message deleted by"
msgstr "Message supprimé par" msgstr "Message supprimé par"
#: forum/models.py:307 #: forum/models.py:308
msgid "Message undeleted by" msgid "Message undeleted by"
msgstr "Message restauré par" msgstr "Message restauré par"
#: forum/models.py:315 #: forum/models.py:316
msgid "action" msgid "action"
msgstr "action" msgstr "action"
#: forum/models.py:330 #: forum/models.py:331
msgid "last read date" msgid "last read date"
msgstr "dernière date de lecture" msgstr "dernière date de lecture"
#: forum/templates/forum/forum.jinja:20 forum/templates/forum/main.jinja:20 #: forum/templates/forum/favorite_topics.jinja:5
#: forum/templates/forum/favorite_topics.jinja:11
#: forum/templates/forum/favorite_topics.jinja:15
#: forum/templates/forum/main.jinja:17
msgid "Favorite topics"
msgstr "Topics favoris"
#: forum/templates/forum/forum.jinja:20 forum/templates/forum/main.jinja:21
msgid "New forum" msgid "New forum"
msgstr "Nouveau forum" msgstr "Nouveau forum"
@ -4245,12 +4259,12 @@ msgstr "Nouveau forum"
msgid "New topic" msgid "New topic"
msgstr "Nouveau sujet" msgstr "Nouveau sujet"
#: forum/templates/forum/forum.jinja:33 forum/templates/forum/main.jinja:29 #: forum/templates/forum/forum.jinja:33 forum/templates/forum/main.jinja:30
msgid "Topics" msgid "Topics"
msgstr "Sujets" msgstr "Sujets"
#: forum/templates/forum/forum.jinja:36 forum/templates/forum/forum.jinja:58 #: forum/templates/forum/forum.jinja:36 forum/templates/forum/forum.jinja:58
#: forum/templates/forum/main.jinja:32 #: forum/templates/forum/main.jinja:33
msgid "Last message" msgid "Last message"
msgstr "Dernier message" msgstr "Dernier message"
@ -4259,11 +4273,12 @@ msgid "Messages"
msgstr "Messages" msgstr "Messages"
#: forum/templates/forum/last_unread.jinja:5 #: forum/templates/forum/last_unread.jinja:5
#: forum/templates/forum/last_unread.jinja:14 #: forum/templates/forum/last_unread.jinja:11
#: forum/templates/forum/last_unread.jinja:15
msgid "Last unread messages" msgid "Last unread messages"
msgstr "Derniers messages non lus" msgstr "Derniers messages non lus"
#: forum/templates/forum/last_unread.jinja:17 #: forum/templates/forum/last_unread.jinja:18
msgid "Refresh" msgid "Refresh"
msgstr "Rafraîchir" msgstr "Rafraîchir"
@ -4288,15 +4303,23 @@ msgid "View last unread messages"
msgstr "Voir les derniers messages non lus" msgstr "Voir les derniers messages non lus"
#: forum/templates/forum/reply.jinja:6 forum/templates/forum/reply.jinja:24 #: forum/templates/forum/reply.jinja:6 forum/templates/forum/reply.jinja:24
#: forum/templates/forum/topic.jinja:40 forum/templates/forum/topic.jinja:59 #: forum/templates/forum/topic.jinja:41 forum/templates/forum/topic.jinja:66
msgid "Reply" msgid "Reply"
msgstr "Répondre" msgstr "Répondre"
#: forum/views.py:106 #: forum/templates/forum/topic.jinja:43
msgid "Unmark as favorite"
msgstr "Enlever des favoris"
#: forum/templates/forum/topic.jinja:45
msgid "Mark as favorite"
msgstr "Ajouter aux favoris"
#: forum/views.py:115
msgid "Apply rights and club owner recursively" msgid "Apply rights and club owner recursively"
msgstr "Appliquer les droits et le club propriétaire récursivement" msgstr "Appliquer les droits et le club propriétaire récursivement"
#: forum/views.py:280 #: forum/views.py:305
#, python-format #, python-format
msgid "%(author)s said" msgid "%(author)s said"
msgstr "Citation de %(author)s" msgstr "Citation de %(author)s"