8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-12-23 15:33:45 +00:00

Merge branch 'advanced_search_email_state' into 'dev'

Add email state filter in advanced search

See merge request re2o/re2o!501
This commit is contained in:
chirac 2020-04-19 17:30:03 +02:00
commit 90dab4a380
16 changed files with 166 additions and 125 deletions

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2019-01-07 01:37+0100\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language: fr_FR\n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-06-23 16:01+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-06-23 16:35+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2019-11-16 00:22+0100\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-19 03:09+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-06-24 15:54+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -166,7 +166,8 @@ def contains_filter(attribute, word, case_sensitive=False):
def search_single_word(word, filters, user, start, end,
user_state, aff, case_sensitive=False):
user_state, email_state, aff,
case_sensitive=False):
""" Construct the correct filters to match differents fields of some models
with the given query according to the given filters.
The match field are either CharField or IntegerField that will be displayed
@ -199,6 +200,9 @@ def search_single_word(word, filters, user, start, end,
filter_clubs &= Q(state__in=user_state)
filter_users &= Q(state__in=user_state)
filter_clubs &= Q(email_state__in=email_state)
filter_users &= Q(email_state__in=email_state)
filters["users"] |= filter_users
filters["clubs"] |= filter_clubs
@ -207,7 +211,8 @@ def search_single_word(word, filters, user, start, end,
filter_machines = (
contains_filter("name", word, case_sensitive)
| (contains_filter("user__pseudo", word, case_sensitive)
& Q(user__state__in=user_state))
& Q(user__state__in=user_state)
& Q(user__email_state__in=email_state))
| contains_filter("interface__domain__name", word, case_sensitive)
| contains_filter("interface__domain__related_domain__name",
word, case_sensitive)
@ -228,6 +233,7 @@ def search_single_word(word, filters, user, start, end,
filter_factures = (
contains_filter("user__pseudo", word, case_sensitive)
& Q(user__state__in=user_state)
& Q(user__email_state__in=email_state)
)
if start is not None:
filter_factures &= Q(date__gte=start)
@ -240,6 +246,7 @@ def search_single_word(word, filters, user, start, end,
filter_bans = (
contains_filter("user__pseudo", word, case_sensitive)
& Q(user__state__in=user_state)
& Q(user__email_state__in=email_state)
) | contains_filter("raison", word, case_sensitive)
if start is not None:
filter_bans &= (
@ -260,6 +267,7 @@ def search_single_word(word, filters, user, start, end,
filter_whitelists = (
contains_filter("user__pseudo", word, case_sensitive)
& Q(user__state__in=user_state)
& Q(user__email_state__in=email_state)
) | contains_filter("raison", word, case_sensitive)
if start is not None:
filter_whitelists &= (
@ -397,7 +405,7 @@ def apply_filters(filters, user, aff):
return results
def search_single_query(query, filters, user, start, end, user_state, aff):
def search_single_query(query, filters, user, start, end, user_state, email_state, aff):
""" Handle different queries an construct the correct filters using
search_single_word"""
if query.operator == "+":
@ -406,7 +414,8 @@ def search_single_query(query, filters, user, start, end, user_state, aff):
for q in query.subqueries:
# Construct an independent filter for each subquery
subfilters = search_single_query(q, empty_filters(), user,
start, end, user_state, aff)
start, end, user_state,
email_state, aff)
# Apply the subfilter
for field in filter_fields():
@ -420,7 +429,8 @@ def search_single_query(query, filters, user, start, end, user_state, aff):
# Handle standard queries
return search_single_word(query.text, filters, user, start, end,
user_state, aff, query.case_sensitive)
user_state, email_state, aff,
query.case_sensitive)
def create_queries(query):

View file

@ -37,6 +37,12 @@ CHOICES_USER = (
("4", _("Fully archived")),
)
CHOICES_EMAILS = (
("0", _("Confirmed")),
("1", _("Not confirmed")),
("2", _("Waiting for email confirmation")),
)
CHOICES_AFF = (
("0", _("Users")),
("1", _("Machines")),
@ -93,6 +99,13 @@ class SearchFormPlus(Form):
choices=CHOICES_USER,
initial=initial_choices(CHOICES_USER),
)
m = forms.MultipleChoiceField(
label=_("Email state filter"),
required=False,
widget=forms.CheckboxSelectMultiple,
choices=CHOICES_EMAILS,
initial=initial_choices(CHOICES_EMAILS),
)
a = forms.MultipleChoiceField(
label=_("Display filter"),
required=False,

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-06-24 20:10+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"
@ -51,43 +51,55 @@ msgid "Fully archived"
msgstr "Complètement archivés"
#: search/forms.py:41
msgid "Confirmed"
msgstr "Confirmé"
#: search/forms.py:42
msgid "Not confirmed"
msgstr "Non confirmé"
#: search/forms.py:43
msgid "Waiting for email confirmation"
msgstr "En attente de confirmation du mail"
#: search/forms.py:47
msgid "Users"
msgstr "Utilisateurs"
#: search/forms.py:42
#: search/forms.py:48
msgid "Machines"
msgstr "Machines"
#: search/forms.py:43
#: search/forms.py:49
msgid "Invoices"
msgstr "Factures"
#: search/forms.py:44
#: search/forms.py:50
msgid "Bans"
msgstr "Bannissements"
#: search/forms.py:45
#: search/forms.py:51
msgid "Whitelists"
msgstr "Accès gracieux"
#: search/forms.py:46
#: search/forms.py:52
msgid "Rooms"
msgstr "Chambres"
#: search/forms.py:47
#: search/forms.py:53
msgid "Ports"
msgstr "Ports"
#: search/forms.py:48
#: search/forms.py:54
msgid "Switches"
msgstr "Commutateurs réseau"
#: search/forms.py:62 search/forms.py:78 search/templates/search/search.html:29
#: search/templates/search/search.html:48
#: search/forms.py:68 search/forms.py:84 search/templates/search/search.html:29
#: search/templates/search/search.html:51
msgid "Search"
msgstr "Rechercher"
#: search/forms.py:65 search/forms.py:81
#: search/forms.py:71 search/forms.py:87
msgid ""
"Use « » and «,» to specify distinct words, «\"query\"» for an exact search, "
"«\\» to escape a character and «+» to combine keywords."
@ -96,19 +108,23 @@ msgstr ""
"recherche exacte, «\\» pour échapper un caractère et «+» pour combiner des "
"mots clés."
#: search/forms.py:90
#: search/forms.py:96
msgid "Users filter"
msgstr "Filtre utilisateurs"
#: search/forms.py:97
#: search/forms.py:103
msgid "Email state filter"
msgstr "Filtre mails"
#: search/forms.py:110
msgid "Display filter"
msgstr "Filtre affichage"
#: search/forms.py:103
#: search/forms.py:116
msgid "Start date"
msgstr "Date de début"
#: search/forms.py:104
#: search/forms.py:117
msgid "End date"
msgstr "Date de fin"
@ -176,6 +192,3 @@ msgstr "Recherche avancée"
#~ msgid "Unverified"
#~ msgstr "Non-confirmé"
#~ msgid "Waiting for email confirmation"
#~ msgstr "En attente de confirmation du mail"

View file

@ -36,6 +36,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{% if search_form.u %}
{% include 'buttons/multiple_checkbox_alt.html' with field=search_form.u %}
{% endif %}
{% if search_form.m %}
{% include 'buttons/multiple_checkbox_alt.html' with field=search_form.m %}
{% endif %}
{% if search_form.a %}
{% include 'buttons/multiple_checkbox_alt.html' with field=search_form.a %}
{% endif %}

View file

@ -38,6 +38,7 @@ from search.forms import (
SearchForm,
SearchFormPlus,
CHOICES_USER,
CHOICES_EMAILS,
CHOICES_AFF,
initial_choices,
)
@ -56,6 +57,7 @@ def get_results(query, request, params):
start = params.get("s", None)
end = params.get("e", None)
user_state = params.get("u", initial_choices(CHOICES_USER))
email_state = params.get("m", initial_choices(CHOICES_EMAILS))
aff = params.get("a", initial_choices(CHOICES_AFF))
filters = empty_filters()
@ -63,7 +65,7 @@ def get_results(query, request, params):
queries = create_queries(query)
for q in queries:
filters = search_single_query(
q, filters, request.user, start, end, user_state, aff
q, filters, request.user, start, end, user_state, email_state, aff
)
results = apply_filters(filters, request.user, aff)

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-03-31 16:09+0002\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2019-11-16 00:35+0100\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-06-25 14:53+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"

View file

@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 2.5\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-04-18 01:38+0200\n"
"POT-Creation-Date: 2020-04-19 17:12+0200\n"
"PO-Revision-Date: 2018-06-27 23:35+0200\n"
"Last-Translator: Laouen Fernet <laouen.fernet@supelec.fr>\n"
"Language-Team: \n"
@ -39,7 +39,7 @@ msgstr "Vous n'avez pas le droit de voir cette application."
msgid "Current password"
msgstr "Mot de passe actuel"
#: users/forms.py:83 users/forms.py:613 users/forms.py:641
#: users/forms.py:83 users/forms.py:628 users/forms.py:656
msgid "New password"
msgstr "Nouveau mot de passe"
@ -55,12 +55,12 @@ msgstr "Les nouveaux mots de passe ne correspondent pas."
msgid "The current password is incorrect."
msgstr "Le mot de passe actuel est incorrect."
#: users/forms.py:132 users/forms.py:189 users/forms.py:410
#: users/models.py:1893
#: users/forms.py:132 users/forms.py:189 users/forms.py:425
#: users/models.py:1894
msgid "Password"
msgstr "Mot de passe"
#: users/forms.py:138 users/forms.py:192 users/forms.py:417
#: users/forms.py:138 users/forms.py:192 users/forms.py:432
msgid "Password confirmation"
msgstr "Confirmation du mot de passe"
@ -73,7 +73,7 @@ msgid "You can't use an internal address as your external address."
msgstr ""
"Vous ne pouvez pas utiliser une adresse interne pour votre adresse externe."
#: users/forms.py:169 users/forms.py:212 users/forms.py:491
#: users/forms.py:169 users/forms.py:212 users/forms.py:506
msgid "The passwords don't match."
msgstr "Les mots de passe ne correspondent pas."
@ -114,36 +114,36 @@ msgstr "Prénom"
msgid "Surname"
msgstr "Nom"
#: users/forms.py:329 users/forms.py:551 users/models.py:1893
#: users/forms.py:329 users/forms.py:566 users/models.py:1894
#: users/templates/users/aff_emailaddress.html:36
#: users/templates/users/profil.html:209
msgid "Email address"
msgstr "Adresse mail"
#: users/forms.py:330 users/forms.py:549 users/forms.py:694
#: users/forms.py:330 users/forms.py:564 users/forms.py:709
#: users/templates/users/aff_schools.html:37
#: users/templates/users/profil.html:230
msgid "School"
msgstr "Établissement"
#: users/forms.py:331 users/forms.py:550
#: users/forms.py:331 users/forms.py:565
#: users/templates/users/aff_serviceusers.html:34
#: users/templates/users/profil.html:235
msgid "Comment"
msgstr "Commentaire"
#: users/forms.py:333 users/forms.py:553
#: users/forms.py:333 users/forms.py:568
#: users/templates/users/aff_clubs.html:40
#: users/templates/users/aff_users.html:41
#: users/templates/users/profil.html:214
msgid "Room"
msgstr "Chambre"
#: users/forms.py:334 users/forms.py:554
#: users/forms.py:334 users/forms.py:569
msgid "No room"
msgstr "Pas de chambre"
#: users/forms.py:335 users/forms.py:555
#: users/forms.py:335 users/forms.py:570
msgid "Select a school"
msgstr "Sélectionnez un établissement"
@ -151,15 +151,15 @@ msgstr "Sélectionnez un établissement"
msgid "Force the move?"
msgstr "Forcer le déménagement ?"
#: users/forms.py:361 users/forms.py:845
#: users/forms.py:361 users/forms.py:860
msgid "You can't use a {} address."
msgstr "Vous ne pouvez pas utiliser une adresse {}."
#: users/forms.py:371 users/forms.py:578
#: users/forms.py:371 users/forms.py:593
msgid "A valid telephone number is required."
msgstr "Un numéro de téléphone valide est requis."
#: users/forms.py:390
#: users/forms.py:405
msgid ""
"If this options is set, you will receive a link to set your initial password "
"by email. If you do not have any means of accessing your emails, you can "
@ -174,11 +174,11 @@ msgstr ""
"votre adresse dans les délais impartis, votre connexion sera automatiquement "
"suspendue."
#: users/forms.py:404
#: users/forms.py:419
msgid "Send password reset link by email."
msgstr "Envoyer le lien de modification du mot de passe par mail."
#: users/forms.py:425
#: users/forms.py:440
msgid ""
"If you already have an account, please use it. If your lost access to it, "
"please consider using the forgotten password button on the login page or "
@ -189,101 +189,101 @@ msgstr ""
"passe oublié est à votre disposition. Si vous avez oublié votre login, "
"contactez le support."
#: users/forms.py:432
#: users/forms.py:447
msgid "I certify that I have not had an account before."
msgstr "Je certifie sur l'honneur ne pas déjà avoir de compte."
#: users/forms.py:457
#: users/forms.py:472
msgid "I commit to accept the"
msgstr "J'accepte les"
#: users/forms.py:459
#: users/forms.py:474
msgid "General Terms of Use"
msgstr "Conditions Générales d'Utilisation"
#: users/forms.py:477
#: users/forms.py:492
msgid "Password must contain at least 8 characters."
msgstr "Le mot de passe doit contenir au moins 8 caractères."
#: users/forms.py:518
#: users/forms.py:533
msgid "Leave empty if you don't have any GPG key."
msgstr "Laissez vide si vous n'avez pas de clé GPG."
#: users/forms.py:521
#: users/forms.py:536
msgid "Default shell"
msgstr "Interface en ligne de commande par défaut"
#: users/forms.py:548 users/templates/users/aff_clubs.html:36
#: users/forms.py:563 users/templates/users/aff_clubs.html:36
#: users/templates/users/aff_serviceusers.html:32
msgid "Name"
msgstr "Nom"
#: users/forms.py:556
#: users/forms.py:571
msgid "Use a mailing list"
msgstr "Utiliser une liste de diffusion"
#: users/forms.py:662 users/templates/users/profil.html:277
#: users/forms.py:677 users/templates/users/profil.html:277
msgid "State"
msgstr "État"
#: users/forms.py:663
#: users/forms.py:678
msgid "Email state"
msgstr "État du mail"
#: users/forms.py:681 users/templates/users/aff_listright.html:38
#: users/forms.py:696 users/templates/users/aff_listright.html:38
msgid "Superuser"
msgstr "Superutilisateur"
#: users/forms.py:707
#: users/forms.py:722
msgid "Shell name"
msgstr "Nom de l'interface en ligne de commande"
#: users/forms.py:727
#: users/forms.py:742
msgid "Name of the group of rights"
msgstr "Nom du groupe de droits"
#: users/forms.py:739
#: users/forms.py:754
msgid "GID. Warning: this field must not be edited after creation."
msgstr "GID. Attention : ce champ ne doit pas être modifié après création."
#: users/forms.py:748
#: users/forms.py:763
msgid "Current groups of rights"
msgstr "Groupes de droits actuels"
#: users/forms.py:766
#: users/forms.py:781
msgid "Current schools"
msgstr "Établissements actuels"
#: users/forms.py:785 users/forms.py:800 users/templates/users/aff_bans.html:41
#: users/forms.py:800 users/forms.py:815 users/templates/users/aff_bans.html:41
#: users/templates/users/aff_whitelists.html:41
msgid "End date"
msgstr "Date de fin"
#: users/forms.py:815
#: users/forms.py:830
msgid "Local part of the email address"
msgstr "Partie locale de l'adresse mail"
#: users/forms.py:816
#: users/forms.py:831
msgid "Can't contain @."
msgstr "Ne peut pas contenir @."
#: users/forms.py:832
#: users/forms.py:847
msgid "Main email address"
msgstr "Adresse mail principale"
#: users/forms.py:834
#: users/forms.py:849
msgid "Redirect local emails"
msgstr "Rediriger les mails locaux"
#: users/forms.py:836
#: users/forms.py:851
msgid "Use local emails"
msgstr "Utiliser les mails locaux"
#: users/forms.py:888
#: users/forms.py:903
msgid "This room is my room"
msgstr "Il s'agit bien de ma chambre"
#: users/forms.py:893
#: users/forms.py:908
msgid "This new connected device is mine"
msgstr "Ce nouvel appareil connecté m'appartient"
@ -336,7 +336,7 @@ msgstr "Non confirmé"
msgid "Waiting for email confirmation"
msgstr "En attente de confirmation"
#: users/models.py:204 users/models.py:1549
#: users/models.py:204 users/models.py:1550
msgid "Must only contain letters, numerals or dashes."
msgstr "Doit seulement contenir des lettres, chiffres ou tirets."
@ -487,7 +487,7 @@ msgstr "Vous n'avez pas le droit de voir ce club."
msgid "You don't have the right to view another user."
msgstr "Vous n'avez pas le droit de voir un autre utilisateur."
#: users/models.py:1283 users/models.py:1487
#: users/models.py:1283 users/models.py:1488
msgid "You don't have the right to view the list of users."
msgstr "Vous n'avez pas le droit de voir la liste des utilisateurs."
@ -527,183 +527,183 @@ msgstr "adhérents"
msgid "A GPG fingerprint must contain 40 hexadecimal characters."
msgstr "Une empreinte GPG doit contenir 40 caractères hexadécimaux."
#: users/models.py:1400
#: users/models.py:1401
msgid "Self registration is disabled."
msgstr "L'auto inscription est désactivée."
#: users/models.py:1410
#: users/models.py:1411
msgid "You don't have the right to create a user."
msgstr "Vous n'avez pas le droit de créer un utilisateur."
#: users/models.py:1440
#: users/models.py:1441
msgid "club"
msgstr "club"
#: users/models.py:1441
#: users/models.py:1442
msgid "clubs"
msgstr "clubs"
#: users/models.py:1452
#: users/models.py:1453
msgid "You must be authenticated."
msgstr "Vous devez être authentifié."
#: users/models.py:1460
#: users/models.py:1461
msgid "You don't have the right to create a club."
msgstr "Vous n'avez pas le droit de créer un club."
#: users/models.py:1553
#: users/models.py:1554
msgid "Comment."
msgstr "Commentaire."
#: users/models.py:1559
#: users/models.py:1560
msgid "Can view a service user object"
msgstr "Peut voir un objet utilisateur service"
#: users/models.py:1560 users/views.py:356
#: users/models.py:1561 users/views.py:356
msgid "service user"
msgstr "utilisateur service"
#: users/models.py:1561
#: users/models.py:1562
msgid "service users"
msgstr "utilisateurs service"
#: users/models.py:1565
#: users/models.py:1566
#, python-brace-format
msgid "Service user <{name}>"
msgstr "Utilisateur service <{name}>"
#: users/models.py:1632
#: users/models.py:1633
msgid "Can view a school object"
msgstr "Peut voir un objet établissement"
#: users/models.py:1633
#: users/models.py:1634
msgid "school"
msgstr "établissement"
#: users/models.py:1634
#: users/models.py:1635
msgid "schools"
msgstr "établissements"
#: users/models.py:1653
#: users/models.py:1654
msgid "UNIX group names can only contain lower case letters."
msgstr ""
"Les noms de groupe UNIX peuvent seulement contenir des lettres minuscules."
#: users/models.py:1659
#: users/models.py:1660
msgid "Description."
msgstr "Description."
#: users/models.py:1662
#: users/models.py:1663
msgid "Can view a group of rights object"
msgstr "Peut voir un objet groupe de droits"
#: users/models.py:1663
#: users/models.py:1664
msgid "group of rights"
msgstr "groupe de droits"
#: users/models.py:1664
#: users/models.py:1665
msgid "groups of rights"
msgstr "groupes de droits"
#: users/models.py:1709
#: users/models.py:1710
msgid "Can view a shell object"
msgstr "Peut voir un objet interface en ligne de commande"
#: users/models.py:1710 users/views.py:671
#: users/models.py:1711 users/views.py:671
msgid "shell"
msgstr "interface en ligne de commande"
#: users/models.py:1711
#: users/models.py:1712
msgid "shells"
msgstr "interfaces en ligne de commande"
#: users/models.py:1729
#: users/models.py:1730
msgid "HARD (no access)"
msgstr "HARD (pas d'accès)"
#: users/models.py:1730
#: users/models.py:1731
msgid "SOFT (local access only)"
msgstr "SOFT (accès local uniquement)"
#: users/models.py:1731
#: users/models.py:1732
msgid "RESTRICTED (speed limitation)"
msgstr "RESTRICTED (limitation de vitesse)"
#: users/models.py:1741
#: users/models.py:1742
msgid "Can view a ban object"
msgstr "Peut voir un objet bannissement"
#: users/models.py:1742 users/views.py:407
#: users/models.py:1743 users/views.py:407
msgid "ban"
msgstr "bannissement"
#: users/models.py:1743
#: users/models.py:1744
msgid "bans"
msgstr "bannissements"
#: users/models.py:1778
#: users/models.py:1779
msgid "You don't have the right to view other bans than yours."
msgstr ""
"Vous n'avez pas le droit de voir d'autres bannissements que les vôtres."
#: users/models.py:1826
#: users/models.py:1827
msgid "Can view a whitelist object"
msgstr "Peut voir un objet accès gracieux"
#: users/models.py:1827
#: users/models.py:1828
msgid "whitelist (free of charge access)"
msgstr "Accès gracieux"
#: users/models.py:1828
#: users/models.py:1829
msgid "whitelists (free of charge access)"
msgstr "Accès gracieux"
#: users/models.py:1848
#: users/models.py:1849
msgid "You don't have the right to view other whitelists than yours."
msgstr ""
"Vous n'avez pas le droit de voir d'autres accès gracieux que les vôtres."
#: users/models.py:2046
#: users/models.py:2047
msgid "User of the local email account."
msgstr "Utilisateur du compte mail local."
#: users/models.py:2049
#: users/models.py:2050
msgid "Local part of the email address."
msgstr "Partie locale de l'adresse mail."
#: users/models.py:2054
#: users/models.py:2055
msgid "Can view a local email account object"
msgstr "Peut voir un objet compte mail local"
#: users/models.py:2056
#: users/models.py:2057
msgid "local email account"
msgstr "compte mail local"
#: users/models.py:2057
#: users/models.py:2058
msgid "local email accounts"
msgstr "comptes mail locaux"
#: users/models.py:2085 users/models.py:2120 users/models.py:2154
#: users/models.py:2188
#: users/models.py:2086 users/models.py:2121 users/models.py:2155
#: users/models.py:2189
msgid "The local email accounts are not enabled."
msgstr "Les comptes mail locaux ne sont pas activés."
#: users/models.py:2090
#: users/models.py:2091
msgid "You don't have the right to add a local email account to another user."
msgstr ""
"Vous n'avez pas le droit d'ajouter un compte mail local à un autre "
"utilisateur."
#: users/models.py:2100
#: users/models.py:2101
msgid "You reached the limit of {} local email accounts."
msgstr "Vous avez atteint la limite de {} comptes mail locaux."
#: users/models.py:2126
#: users/models.py:2127
msgid "You don't have the right to view another user's local email account."
msgstr ""
"Vous n'avez pas le droit de voir le compte mail local d'un autre utilisateur."
#: users/models.py:2146
#: users/models.py:2147
msgid ""
"You can't delete a local email account whose local part is the same as the "
"username."
@ -711,13 +711,13 @@ msgstr ""
"Vous ne pouvez pas supprimer un compte mail local dont la partie locale est "
"la même que le pseudo."
#: users/models.py:2160
#: users/models.py:2161
msgid "You don't have the right to delete another user's local email account."
msgstr ""
"Vous n'avez pas le droit de supprimer le compte mail local d'un autre "
"utilisateur."
#: users/models.py:2180
#: users/models.py:2181
msgid ""
"You can't edit a local email account whose local part is the same as the "
"username."
@ -725,13 +725,13 @@ msgstr ""
"Vous ne pouvez pas modifier un compte mail local dont la partie locale est "
"la même que le pseudo."
#: users/models.py:2194
#: users/models.py:2195
msgid "You don't have the right to edit another user's local email account."
msgstr ""
"Vous n'avez pas le droit de modifier le compte mail local d'un autre "
"utilisateur."
#: users/models.py:2203
#: users/models.py:2204
msgid "The local part must not contain @ or +."
msgstr "La partie locale ne doit pas contenir @ ou +."