Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
AE UTBM
Sith
Commits
1d071958
Verified
Commit
1d071958
authored
May 01, 2019
by
Sli
Browse files
clubs: add bulk deletion on mailing lists
parent
24fb714c
Pipeline
#1743
passed with stage
in 16 minutes and 16 seconds
Changes
6
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
club/forms.py
View file @
1d071958
...
...
@@ -53,6 +53,7 @@ class MailingForm(forms.Form):
ACTION_NEW_MAILING
=
1
ACTION_NEW_SUBSCRIPTION
=
2
ACTION_REMOVE_SUBSCRIPTION
=
3
subscription_users
=
AutoCompleteSelectMultipleField
(
"users"
,
...
...
@@ -61,13 +62,14 @@ class MailingForm(forms.Form):
required
=
False
,
)
def
__init__
(
self
,
club_id
,
user_id
,
*
args
,
**
kwargs
):
def
__init__
(
self
,
club_id
,
user_id
,
mailings
,
*
args
,
**
kwargs
):
super
(
MailingForm
,
self
).
__init__
(
*
args
,
**
kwargs
)
self
.
fields
[
"action"
]
=
forms
.
TypedChoiceField
(
(
(
self
.
ACTION_NEW_MAILING
,
_
(
"New Mailing"
)),
(
self
.
ACTION_NEW_SUBSCRIPTION
,
_
(
"Subscribe"
)),
(
self
.
ACTION_REMOVE_SUBSCRIPTION
,
_
(
"Remove"
)),
),
coerce
=
int
,
label
=
_
(
"Action"
),
...
...
@@ -76,6 +78,15 @@ class MailingForm(forms.Form):
widget
=
forms
.
HiddenInput
(),
)
# Generate bulk removal forms, they are never required
for
mailing
in
mailings
:
self
.
fields
[
"removal_"
+
str
(
mailing
.
id
)]
=
forms
.
ModelMultipleChoiceField
(
mailing
.
subscriptions
.
all
(),
label
=
_
(
"Remove"
),
required
=
False
,
widget
=
forms
.
CheckboxSelectMultiple
,
)
# Include fields for handling mailing creation
mailing_fields
=
(
"email"
,
"club"
,
"moderator"
)
self
.
fields
.
update
(
forms
.
fields_for_model
(
Mailing
,
fields
=
mailing_fields
))
...
...
@@ -133,8 +144,6 @@ class MailingForm(forms.Form):
def
clean
(
self
):
cleaned_data
=
super
(
MailingForm
,
self
).
clean
()
print
(
cleaned_data
)
if
not
"action"
in
cleaned_data
:
# If there is no action provided, we can stop here
raise
forms
.
ValidationError
(
_
(
"An action is required"
),
code
=
"invalid"
)
...
...
club/models.py
View file @
1d071958
...
...
@@ -446,18 +446,20 @@ class MailingSubscription(models.Model):
def
can_be_edited_by
(
self
,
user
):
return
self
.
user
is
not
None
and
user
.
id
==
self
.
user
.
id
@
property
@
cached_
property
def
get_email
(
self
):
if
self
.
user
and
not
self
.
email
:
return
self
.
user
.
email
return
self
.
email
@
cached_property
def
get_username
(
self
):
if
self
.
user
:
return
str
(
self
.
user
)
return
_
(
"Unregistered user"
)
def
fetch_format
(
self
):
return
self
.
get_email
+
" "
def
__str__
(
self
):
if
self
.
user
:
user
=
str
(
self
.
user
)
else
:
user
=
_
(
"Unregistered user"
)
return
"(%s) - %s : %s"
%
(
self
.
mailing
,
user
,
self
.
email
)
return
"(%s) - %s : %s"
%
(
self
.
mailing
,
self
.
get_username
,
self
.
email
)
club/templates/club/mailing.jinja
View file @
1d071958
{%
extends
"core/base.jinja"
%}
{%
from
'core/macros.jinja'
import
select_all_checkbox
%}
{%
block
title
%}
{%
trans
%}
Mailing lists
{%
endtrans
%}
...
...
@@ -10,8 +11,7 @@
<b>
{%
trans
%}
Remember : mailing lists need to be moderated, if your new created list is not shown wait until moderation takes action
{%
endtrans
%}
</b>
{%
for
mailing
in
mailings
%}
{%
if
mailing.is_moderated
%}
<h2>
{%
trans
%}
Mailing
{%
endtrans
%}
{{
mailing.email_full
}}
<h2>
{%
trans
%}
Mailing
{%
endtrans
%}
{{
mailing.email_full
}}
{%
-
if
user.is_owner
(
mailing
)
-
%}
<a
href=
"
{{
url
(
'club:mailing_delete'
,
mailing_id
=
mailing.id
)
}}
"
>
-
{%
trans
%}
Delete
{%
endtrans
%}
</a>
{%
-
endif
-
%}
...
...
@@ -19,27 +19,38 @@
<form
method=
"GET"
action=
"
{{
url
(
'club:mailing_generate'
,
mailing_id
=
mailing.id
)
}}
"
style=
"display:inline-block;"
>
<input
type=
"submit"
name=
"generateMalingList"
value=
"
{%
trans
%}
Generate mailing list
{%
endtrans
%}
"
>
</form>
<form
method=
"GET"
action=
"
{{
url
(
'club:mailing_clean'
,
mailing_id
=
mailing.id
)
}}
"
style=
"display:inline-block;"
>
<input
type=
"submit"
name=
"cleanMailingList"
value=
"
{%
trans
%}
Clean mailing list
{%
endtrans
%}
"
>
{%
set
form_mailing_removal
=
form
[
"removal_"
+
mailing.id
|
string
]
%}
{%
if
form_mailing_removal.field.choices
%}
{%
set
ms
=
dict
(
mailing.subscriptions.all
()
|
groupby
(
'id'
))
%}
<form
action=
"
{{
url
(
'club:mailing'
,
club_id
=
club.id
)
}}
"
id=
"
{{
form_mailing_removal.auto_id
}}
"
method=
"post"
enctype=
"multipart/form-data"
>
<p
style=
"margin-bottom: 1em;"
>
{{
select_all_checkbox
(
form_mailing_removal.auto_id
)
}}
</p>
{%
csrf_token
%}
<input
hidden
type=
"number"
name=
"
{{
form.action.name
}}
"
value=
"
{{
form_actions.REMOVE_SUBSCRIPTION
}}
"
/>
<table>
<thead>
<tr>
<td>
{%
trans
%}
User
{%
endtrans
%}
</td>
<td>
{%
trans
%}
Email
{%
endtrans
%}
</td>
<td>
{%
trans
%}
Delete
{%
endtrans
%}
</td>
</tr>
</thead>
<tbody>
{%
for
widget
in
form_mailing_removal.subwidgets
%}
{%
set
user
=
ms
[
widget.data.value
][
0
]
%}
<tr>
<td>
{{
user.get_username
}}
</td>
<td>
{{
user.get_email
}}
</td>
<td>
{{
widget.tag
()
}}
</td>
</tr>
{%
endfor
%}
</tbody>
</table>
{{
form_mailing_removal.errors
}}
<p><input
type=
"submit"
value=
"
{%
trans
%}
Remove from mailing list
{%
endtrans
%}
"
/></p>
</form>
<hr>
<table>
<tr>
<th>
{%
trans
%}
User
{%
endtrans
%}
</th>
<th
colspan=
"2"
>
{%
trans
%}
Email
{%
endtrans
%}
</th>
</tr>
{%
for
subscriber
in
mailing.subscriptions.all
()
%}
<tr>
{%
if
subscriber.user
%}
<td>
{{
subscriber.user
}}
</td>
{%
else
%}
<td>
{%
trans
%}
Unregistered user
{%
endtrans
%}
</td>
{%
endif
%}
<td>
{{
subscriber.get_email
}}
</td>
<td><a
href=
"
{{
url
(
'club:mailing_subscription_delete'
,
mailing_subscription_id
=
subscriber.id
)
}}
"
>
{%
trans
%}
Delete
{%
endtrans
%}
</a></td>
</tr>
{%
endfor
%}
</table>
{%
else
%}
<p><b>
{%
trans
%}
There is no subscriber for this mailing list
{%
endtrans
%}
</b></p>
{%
endif
%}
{%
endfor
%}
...
...
club/urls.py
View file @
1d071958
...
...
@@ -70,11 +70,6 @@ urlpatterns = [
MailingAutoGenerationView
.
as_view
(),
name
=
"mailing_generate"
,
),
url
(
r
"^(?P<mailing_id>[0-9]+)/mailing/clean$"
,
MailingAutoCleanView
.
as_view
(),
name
=
"mailing_clean"
,
),
url
(
r
"^(?P<mailing_id>[0-9]+)/mailing/delete$"
,
MailingDeleteView
.
as_view
(),
...
...
club/views.py
View file @
1d071958
...
...
@@ -513,23 +513,29 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
template_name
=
"club/mailing.jinja"
current_tab
=
"mailing"
def
get_form_kwargs
(
self
,
*
args
,
**
kwargs
):
kwargs
=
super
(
ClubMailingView
,
self
).
get_form_kwargs
(
*
args
,
**
kwargs
)
def
get_form_kwargs
(
self
):
kwargs
=
super
(
ClubMailingView
,
self
).
get_form_kwargs
()
kwargs
[
"club_id"
]
=
self
.
get_object
().
id
kwargs
[
"user_id"
]
=
self
.
request
.
user
.
id
kwargs
[
"mailings"
]
=
self
.
mailings
return
kwargs
def
dispatch
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
mailings
=
Mailing
.
objects
.
filter
(
club_id
=
self
.
get_object
().
id
).
all
()
return
super
(
ClubMailingView
,
self
).
dispatch
(
request
,
*
args
,
**
kwargs
)
def
get_context_data
(
self
,
**
kwargs
):
kwargs
=
super
(
ClubMailingView
,
self
).
get_context_data
(
**
kwargs
)
kwargs
[
"club"
]
=
self
.
get_object
()
kwargs
[
"user"
]
=
self
.
request
.
user
kwargs
[
"mailings"
]
=
Mailing
.
objects
.
filter
(
club_id
=
self
.
get_object
().
id
).
all
()
kwargs
[
"mailings"
]
=
self
.
mailings
kwargs
[
"mailings_moderated"
]
=
(
kwargs
[
"mailings"
].
exclude
(
is_moderated
=
False
).
all
()
)
kwargs
[
"form_actions"
]
=
{
"NEW_MALING"
:
self
.
form_class
.
ACTION_NEW_MAILING
,
"NEW_SUBSCRIPTION"
:
self
.
form_class
.
ACTION_NEW_SUBSCRIPTION
,
"REMOVE_SUBSCRIPTION"
:
self
.
form_class
.
ACTION_REMOVE_SUBSCRIPTION
,
}
return
kwargs
...
...
@@ -565,6 +571,19 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
sub
.
clean
()
sub
.
save
()
def
remove_subscription
(
self
,
cleaned_data
):
"""
Remove specified users from a mailing list
"""
fields
=
[
cleaned_data
[
key
]
for
key
in
cleaned_data
.
keys
()
if
key
.
startswith
(
"removal_"
)
]
for
field
in
fields
:
for
sub
in
field
:
sub
.
delete
()
def
form_valid
(
self
,
form
):
resp
=
super
(
ClubMailingView
,
self
).
form_valid
(
form
)
...
...
@@ -576,6 +595,9 @@ class ClubMailingView(ClubTabsMixin, CanEditMixin, DetailFormView):
if
cleaned_data
[
"action"
]
==
self
.
form_class
.
ACTION_NEW_SUBSCRIPTION
:
self
.
add_new_subscription
(
cleaned_data
)
if
cleaned_data
[
"action"
]
==
self
.
form_class
.
ACTION_REMOVE_SUBSCRIPTION
:
self
.
remove_subscription
(
cleaned_data
)
return
resp
def
get_success_url
(
self
,
**
kwargs
):
...
...
@@ -634,18 +656,6 @@ class MailingAutoGenerationView(View):
return
redirect
(
"club:mailing"
,
club_id
=
club
.
id
)
class
MailingAutoCleanView
(
View
):
def
dispatch
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
mailing
=
get_object_or_404
(
Mailing
,
pk
=
kwargs
[
"mailing_id"
])
if
not
request
.
user
.
can_edit
(
self
.
mailing
):
raise
PermissionDenied
return
super
(
MailingAutoCleanView
,
self
).
dispatch
(
request
,
*
args
,
**
kwargs
)
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
mailing
.
subscriptions
.
all
().
delete
()
return
redirect
(
"club:mailing"
,
club_id
=
self
.
mailing
.
club
.
id
)
class
PosterListView
(
ClubTabsMixin
,
PosterListBaseView
,
CanViewMixin
):
"""List communication posters"""
...
...
locale/fr/LC_MESSAGES/django.po
View file @
1d071958
...
...
@@ -6,7 +6,7 @@
msgid
""
msgstr
""
"Report-Msgid-Bugs-To:
\n
"
"POT-Creation-Date: 2019-0
4-28 15:00
+0200
\n
"
"POT-Creation-Date: 2019-0
5-01 22:45
+0200
\n
"
"PO-Revision-Date: 2016-07-18
\n
"
"Last-Translator: Skia <skia@libskia.so>
\n
"
"Language-Team: AE info <ae.info@utbm.fr>
\n
"
...
...
@@ -177,7 +177,7 @@ msgstr "type de cible"
#: accounting/models.py:313 club/models.py:413
#: club/templates/club/club_members.jinja:16
#: club/templates/club/club_old_members.jinja:8
#: club/templates/club/mailing.jinja:
28 club/views.py:11
2
#: club/templates/club/mailing.jinja:
3
2
#: counter/templates/counter/cash_summary_list.jinja:32
#: counter/templates/counter/stats.jinja:15
#: counter/templates/counter/stats.jinja:52
...
...
@@ -345,7 +345,7 @@ msgstr "Compte en banque : "
#: accounting/templates/accounting/club_account_details.jinja:60
#: accounting/templates/accounting/label_list.jinja:26
#: club/templates/club/club_sellings.jinja:50
#: club/templates/club/mailing.jinja:16 club/templates/club/mailing.jinja:3
9
#: club/templates/club/mailing.jinja:16 club/templates/club/mailing.jinja:3
4
#: com/templates/com/mailing_admin.jinja:19
#: com/templates/com/news_admin_list.jinja:41
#: com/templates/com/news_admin_list.jinja:70
...
...
@@ -386,7 +386,7 @@ msgid "Delete"
msgstr
"Supprimer"
#: accounting/templates/accounting/bank_account_details.jinja:18
#: club/views.py:
129
core/views/user.py:205 sas/templates/sas/picture.jinja:86
#: club/views.py:
78
core/views/user.py:205 sas/templates/sas/picture.jinja:86
msgid
"Infos"
msgstr
"Infos"
...
...
@@ -405,7 +405,7 @@ msgstr "Nouveau compte club"
#: accounting/templates/accounting/bank_account_details.jinja:27
#: accounting/templates/accounting/bank_account_list.jinja:22
#: accounting/templates/accounting/club_account_details.jinja:58
#: accounting/templates/accounting/journal_details.jinja:89 club/views.py:1
75
#: accounting/templates/accounting/journal_details.jinja:89 club/views.py:1
24
#: com/templates/com/news_admin_list.jinja:39
#: com/templates/com/news_admin_list.jinja:68
#: com/templates/com/news_admin_list.jinja:115
...
...
@@ -893,6 +893,101 @@ msgstr "Opérations sans étiquette"
msgid
"Refound this account"
msgstr
"Rembourser ce compte"
#: club/forms.py:60 club/forms.py:197
msgid
"Users to add"
msgstr
"Utilisateurs à ajouter"
#: club/forms.py:61 club/forms.py:198 core/views/group.py:63
msgid
"Search users to add (one or more)."
msgstr
"Recherche les utilisateurs à ajouter (un ou plus)."
#: club/forms.py:70
#, fuzzy
#| msgid "New mailing"
msgid
"New Mailing"
msgstr
"Nouvelle mailing liste"
#: club/forms.py:71
#, fuzzy
#| msgid "Unsubscribe"
msgid
"Subscribe"
msgstr
"Se désabonner"
#: club/forms.py:72 club/forms.py:85 com/templates/com/news_admin_list.jinja:40
#: com/templates/com/news_admin_list.jinja:116
#: com/templates/com/news_admin_list.jinja:198
#: com/templates/com/news_admin_list.jinja:274
msgid
"Remove"
msgstr
"Retirer"
#: club/forms.py:75 launderette/views.py:228
msgid
"Action"
msgstr
"Action"
#: club/forms.py:122
#, fuzzy
#| msgid "This field is required."
msgid
"This field is required"
msgstr
"Ce champ est obligatoire."
#: club/forms.py:134 club/forms.py:259
msgid
"One of the selected users doesn't exist"
msgstr
"Un des utilisateurs sélectionné n'existe pas"
#: club/forms.py:138
#, fuzzy
#| msgid "One of the selected users doesn't exist"
msgid
"One of the selected users doesn't have an email address"
msgstr
"Un des utilisateurs sélectionné n'existe pas"
#: club/forms.py:149
#, fuzzy
#| msgid "This field is required."
msgid
"An action is required"
msgstr
"Ce champ est obligatoire."
#: club/forms.py:162
msgid
"You must specify at least an user or an email address"
msgstr
""
#: club/forms.py:172 counter/views.py:1481
msgid
"Begin date"
msgstr
"Date de début"
#: club/forms.py:178 com/views.py:85 com/views.py:221 counter/views.py:1487
#: election/views.py:190 subscription/views.py:52
msgid
"End date"
msgstr
"Date de fin"
#: club/forms.py:183 club/templates/club/club_sellings.jinja:21
#: core/templates/core/user_account_detail.jinja:18
#: core/templates/core/user_account_detail.jinja:51
#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:168
msgid
"Counter"
msgstr
"Comptoir"
#: club/forms.py:241 club/templates/club/club_members.jinja:21
#: club/templates/club/club_members.jinja:46
#: core/templates/core/user_clubs.jinja:29
msgid
"Mark as old"
msgstr
"Marquer comme ancien"
#: club/forms.py:263
msgid
"User must be subscriber to take part to a club"
msgstr
"L'utilisateur doit être cotisant pour faire partie d'un club"
#: club/forms.py:267 core/views/group.py:82
msgid
"You can not add the same user twice"
msgstr
"Vous ne pouvez pas ajouter deux fois le même utilisateur"
#: club/forms.py:288
msgid
"You should specify a role"
msgstr
"Vous devez choisir un rôle"
#: club/forms.py:299 sas/views.py:129 sas/views.py:195 sas/views.py:286
msgid
"You do not have the permission to do that"
msgstr
"Vous n'avez pas la permission de faire cela"
#: club/models.py:51
msgid
"unix name"
msgstr
"nom unix"
...
...
@@ -988,9 +1083,9 @@ msgstr "Au moins un utilisateur ou un email est nécessaire"
msgid
"This email is already suscribed in this mailing"
msgstr
"Cet email est déjà abonné à cette mailing"
#: club/models.py:4
62 club/templates/club/mailing.jinja:36
#: club/models.py:4
59
msgid
"Unregistered user"
msgstr
"
Désabonner un utilisateur
"
msgstr
"
Utilisateur non enregistré
"
#: club/templates/club/club_list.jinja:4 club/templates/club/club_list.jinja:37
msgid
"Club list"
...
...
@@ -1037,12 +1132,6 @@ msgstr "Description"
msgid
"Since"
msgstr
"Depuis"
#: club/templates/club/club_members.jinja:21
#: club/templates/club/club_members.jinja:46 club/views.py:363
#: core/templates/core/user_clubs.jinja:29
msgid
"Mark as old"
msgstr
"Marquer comme ancien"
#: club/templates/club/club_members.jinja:50
msgid
"There are no members in this club."
msgstr
"Il n'y a pas de membres dans ce club."
...
...
@@ -1067,8 +1156,8 @@ msgstr "Du"
msgid
"To"
msgstr
"Au"
#: club/templates/club/club_sellings.jinja:5 club/views.py:1
95
#: club/views.py:
563
counter/templates/counter/counter_main.jinja:19
#: club/templates/club/club_sellings.jinja:5 club/views.py:1
44
#: club/views.py:
378
counter/templates/counter/counter_main.jinja:19
#: counter/templates/counter/last_ops.jinja:35
msgid
"Sellings"
msgstr
"Ventes"
...
...
@@ -1094,13 +1183,6 @@ msgstr "unités"
msgid
"Benefit: "
msgstr
"Bénéfice : "
#: club/templates/club/club_sellings.jinja:21 club/views.py:502
#: core/templates/core/user_account_detail.jinja:18
#: core/templates/core/user_account_detail.jinja:51
#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:168
msgid
"Counter"
msgstr
"Comptoir"
#: club/templates/club/club_sellings.jinja:22
#: core/templates/core/user_account_detail.jinja:19
#: core/templates/core/user_account_detail.jinja:52
...
...
@@ -1189,11 +1271,11 @@ msgstr "Comptabilité : "
msgid
"Manage launderettes"
msgstr
"Gestion des laveries"
#: club/templates/club/mailing.jinja:
4
#: club/templates/club/mailing.jinja:
5
msgid
"Mailing lists"
msgstr
"Mailing listes"
#: club/templates/club/mailing.jinja:1
0
#: club/templates/club/mailing.jinja:1
1
msgid
""
"Remember : mailing lists need to be moderated, if your new created list is "
"not shown wait until moderation takes action"
...
...
@@ -1206,34 +1288,38 @@ msgstr ""
msgid
"Generate mailing list"
msgstr
"Générer la liste de diffusion"
#: club/templates/club/mailing.jinja:23
msgid
"Clean mailing list"
msgstr
"Néttoyer la liste de diffusion"
#: club/templates/club/mailing.jinja:29
#: club/templates/club/mailing.jinja:33
#: com/templates/com/mailing_admin.jinja:10
msgid
"Email"
msgstr
"Email"
#: club/templates/club/mailing.jinja:47
#: club/templates/club/mailing.jinja:49
msgid
"Remove from mailing list"
msgstr
"Supprimer de la liste de diffusion"
#: club/templates/club/mailing.jinja:53
msgid
"There is no subscriber for this mailing list"
msgstr
"Il n'y a pas d'abonnés dans cette liste de diffusion"
#: club/templates/club/mailing.jinja:58
msgid
"No mailing list existing for this club"
msgstr
"Aucune mailing liste n'existe pour ce club"
#: club/templates/club/mailing.jinja:
51
#: club/templates/club/mailing.jinja:
63
msgid
"New member"
msgstr
"Nouveau membre"
#: club/templates/club/mailing.jinja:
55
#: club/templates/club/mailing.jinja:
83
msgid
"Add to mailing list"
msgstr
"Ajouter à la mailing liste"
#: club/templates/club/mailing.jinja:
59
#: club/templates/club/mailing.jinja:
87
msgid
"New mailing"
msgstr
"Nouvelle
mailing liste
"
msgstr
"Nouvelle
liste de diffusion
"
#: club/templates/club/mailing.jinja:
63
#: club/templates/club/mailing.jinja:
100
msgid
"Create mailing list"
msgstr
"Créer une
mailing liste
"
msgstr
"Créer une
liste de diffusion
"
#: club/templates/club/page_history.jinja:8
msgid
"No page existing for this club"
...
...
@@ -1243,79 +1329,42 @@ msgstr "Aucune page n'existe pour ce club"
msgid
"Club stats"
msgstr
"Statistiques du club"
#: club/views.py:
139
#: club/views.py:
88
msgid
"Members"
msgstr
"Membres"
#: club/views.py:
148
#: club/views.py:
97
msgid
"Old members"
msgstr
"Anciens membres"
#: club/views.py:1
58
core/templates/core/page.jinja:33
#: club/views.py:1
07
core/templates/core/page.jinja:33
msgid
"History"
msgstr
"Historique"
#: club/views.py:1
66
core/templates/core/base.jinja:121 core/views/user.py:228
#: club/views.py:1
15
core/templates/core/base.jinja:121 core/views/user.py:228
#: sas/templates/sas/picture.jinja:95 trombi/views.py:60
msgid
"Tools"
msgstr
"Outils"
#: club/views.py:1
86
#: club/views.py:1
35
msgid
"Edit club page"
msgstr
"Éditer la page de club"
#: club/views.py:
202
#: club/views.py:
151
msgid
"Mailing list"
msgstr
"Listes de diffusion"
#: club/views.py:
211
com/views.py:141
#: club/views.py:
160
com/views.py:141
msgid
"Posters list"
msgstr
"Liste d'affiches"
#: club/views.py:
221
counter/templates/counter/counter_list.jinja:21
#: club/views.py:
170
counter/templates/counter/counter_list.jinja:21
#: counter/templates/counter/counter_list.jinja:43
#: counter/templates/counter/counter_list.jinja:59
msgid
"Props"
msgstr
"Propriétés"
#: club/views.py:319
msgid
"Users to add"
msgstr
"Utilisateurs à ajouter"
#: club/views.py:320 core/views/group.py:63
msgid
"Search users to add (one or more)."
msgstr
"Recherche les utilisateurs à ajouter (un ou plus)."
#: club/views.py:381
msgid
"One of the selected users doesn't exist"
msgstr
"Un des utilisateurs sélectionné n'existe pas"
#: club/views.py:385
msgid
"User must be subscriber to take part to a club"
msgstr
"L'utilisateur doit être cotisant pour faire partie d'un club"
#: club/views.py:389 core/views/group.py:82
msgid
"You can not add the same user twice"
msgstr
"Vous ne pouvez pas ajouter deux fois le même utilisateur"
#: club/views.py:410
msgid
"You should specify a role"
msgstr
"Vous devez choisir un rôle"
#: club/views.py:421 sas/views.py:129 sas/views.py:195 sas/views.py:286
msgid
"You do not have the permission to do that"
msgstr
"Vous n'avez pas la permission de faire cela"
#: club/views.py:491 counter/views.py:1481
msgid
"Begin date"
msgstr
"Date de début"
#: club/views.py:497 com/views.py:85 com/views.py:221 counter/views.py:1487
#: election/views.py:190 subscription/views.py:52
msgid
"End date"
msgstr
"Date de fin"
#: club/views.py:520 core/templates/core/user_stats.jinja:27
#: club/views.py:335 core/templates/core/user_stats.jinja:27
#: counter/views.py:1635
msgid
"Product"
msgstr
"Produit"
...
...
@@ -1547,13 +1596,6 @@ msgstr "Auteur"
msgid
"Moderator"
msgstr
"Modérateur"
#: com/templates/com/news_admin_list.jinja:40
#: com/templates/com/news_admin_list.jinja:116
#: com/templates/com/news_admin_list.jinja:198
#: com/templates/com/news_admin_list.jinja:274
msgid
"Remove"
msgstr
"Retirer"
#: com/templates/com/news_admin_list.jinja:47
msgid
"Notices to moderate"
msgstr
"Informations à modérer"
...
...
@@ -4612,10 +4654,6 @@ msgstr "Éditer la page de présentation"
msgid
"Book launderette slot"
msgstr
"Réserver un créneau de laverie"
#: launderette/views.py:228
msgid
"Action"
msgstr
"Action"
#: launderette/views.py:240
msgid
"Tokens, separated by spaces"
msgstr
"Jetons, séparés par des espaces"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment