diff --git a/core/migrations/0016_auto_20161212_1922.py b/core/migrations/0016_auto_20161212_1922.py
new file mode 100644
index 00000000..6785eb32
--- /dev/null
+++ b/core/migrations/0016_auto_20161212_1922.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+from django.conf import settings
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0015_sithfile_moderator'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='sithfile',
+ name='moderator',
+ field=models.ForeignKey(related_name='moderated_files', blank=True, null=True, to=settings.AUTH_USER_MODEL, verbose_name='owner'),
+ ),
+ ]
diff --git a/core/models.py b/core/models.py
index af7d6222..9fda8768 100644
--- a/core/models.py
+++ b/core/models.py
@@ -529,7 +529,7 @@ class SithFile(models.Model):
size = models.IntegerField(_("size"), default=0)
date = models.DateTimeField(_('date'), default=timezone.now)
is_moderated = models.BooleanField(_("is moderated"), default=False)
- moderator = models.ForeignKey(User, related_name="moderated_files", verbose_name=_("owner"))
+ moderator = models.ForeignKey(User, related_name="moderated_files", verbose_name=_("owner"), null=True, blank=True)
asked_for_removal = models.BooleanField(_("asked for removal"), default=False)
is_in_sas = models.BooleanField(_("is in the SAS"), default=False) # Allows to query this flag, updated at each call to save()
@@ -617,6 +617,27 @@ class SithFile(models.Model):
self.view_groups = self.parent.view_groups.all()
self.save()
+ def move_to(self, parent):
+ """Move a file to somewhere else"""
+ if not parent.is_folder:
+ return
+ import shutil
+ import os
+ with transaction.atomic():
+ if self.is_folder:
+ old_file_name = self.get_full_path()
+ else:
+ old_file_name = self.file.name
+ self.parent = parent
+ self.save()
+ if self.is_folder:
+ for c in self.children.all():
+ c.move_to(self)
+ shutil.rmtree(settings.MEDIA_ROOT + old_file_name)
+ else:
+ self.file.save(name=self.name, content=self.file)
+ os.remove(settings.MEDIA_ROOT + old_file_name)
+
def __getattribute__(self, attr):
if attr == "is_file":
return not self.is_folder
@@ -645,6 +666,9 @@ class SithFile(models.Model):
def get_parent_path(self):
return '/' + '/'.join([p.name for p in self.get_parent_list()[::-1]])
+ def get_full_path(self):
+ return self.get_parent_path() + '/' + self.name
+
def get_display_name(self):
return self.name
diff --git a/core/templates/core/file_detail.jinja b/core/templates/core/file_detail.jinja
index d2ff8def..0a685e20 100644
--- a/core/templates/core/file_detail.jinja
+++ b/core/templates/core/file_detail.jinja
@@ -19,17 +19,27 @@
{% endif %}
-
- {% for f in file.children.order_by('-is_folder', 'name').all() %}
- -
- {% if f.is_folder %}
- 📁
- {% else %}
- 🗎
- {% endif %}
- {{ f.get_display_name() }}
- {% endfor %}
-
+
{% else %}
{% trans %}Real name: {% endtrans %}{{ file.file.name.split('/')[-1] }}
{% trans %}Date: {% endtrans %}{{ file.date|localtime|date(DATETIME_FORMAT) }} -
diff --git a/core/views/files.py b/core/views/files.py
index 6128d0f7..45775ebd 100644
--- a/core/views/files.py
+++ b/core/views/files.py
@@ -58,7 +58,7 @@ class AddFilesForm(forms.Form):
notif = True
except Exception as e:
self.add_error(None, _("Error creating folder %(folder_name)s: %(msg)s") %
- {'folder_name': self.cleaned_data['folder_name'], 'msg': str(e.message)})
+ {'folder_name': self.cleaned_data['folder_name'], 'msg': repr(e)})
for f in files:
new_file = SithFile(parent=parent, name=f.name, file=f, owner=owner, is_folder=False,
mime_type=f.content_type, size=f._size)
@@ -69,11 +69,10 @@ class AddFilesForm(forms.Form):
except Exception as e:
self.add_error(None, _("Error uploading file %(file_name)s: %(msg)s") % {'file_name': f, 'msg': repr(e)})
if notif:
- for u in RealGroup.objects.filter(id=settings.SITH_GROUP_SAS_ADMIN_ID).first().users.all():
+ for u in RealGroup.objects.filter(id=settings.SITH_GROUP_COM_ADMIN_ID).first().users.all():
if not u.notifications.filter(type="FILE_MODERATION").exists():
Notification(user=u, url=reverse("core:file_moderation"), type="FILE_MODERATION").save()
-
class FileListView(ListView):
template_name = 'core/file_list.jinja'
context_object_name = "file_list"
@@ -148,7 +147,29 @@ class FileView(CanViewMixin, DetailView, FormMixin):
def post(self, request, *args, **kwargs):
self.object = self.get_object()
- self.form = self.get_form()
+ if request.user.can_edit(self.object):
+ if 'delete' in request.POST.keys():
+ for f_id in request.POST.getlist('file_list'):
+ sf = SithFile.objects.filter(id=f_id).first()
+ if sf:
+ sf.delete()
+ if 'clear' in request.POST.keys():
+ request.session['clipboard'] = []
+ if 'cut' in request.POST.keys():
+ request.session['clipboard'] = request.session['clipboard'] or []
+ for f_id in request.POST.getlist('file_list'):
+ f_id = int(f_id)
+ if f_id in [c.id for c in self.object.children.all()] and f_id not in request.session['clipboard']:
+ request.session['clipboard'].append(f_id)
+ if 'paste' in request.POST.keys():
+ for f_id in request.session['clipboard']:
+ sf = SithFile.objects.filter(id=f_id).first()
+ print(sf)
+ if sf:
+ sf.move_to(self.object)
+ request.session['clipboard'] = []
+ print(request.session['clipboard'])
+ self.form = self.get_form() # The form handle only the file upload
files = request.FILES.getlist('file_field')
if request.user.is_authenticated() and request.user.can_edit(self.object) and self.form.is_valid():
self.form.process(parent=self.object, owner=request.user, files=files)
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index cf21d0d5..eef7d912 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-12-09 23:50+0100\n"
+"POT-Creation-Date: 2016-12-13 00:42+0100\n"
"PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia \n"
"Language-Team: AE info \n"
@@ -17,9 +17,9 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: accounting/models.py:36 accounting/models.py:58 accounting/models.py:85
-#: accounting/models.py:144 club/models.py:19 counter/models.py:71
-#: counter/models.py:96 counter/models.py:131 launderette/models.py:15
-#: launderette/models.py:60 launderette/models.py:85
+#: accounting/models.py:144 club/models.py:18 counter/models.py:70
+#: counter/models.py:95 counter/models.py:130 launderette/models.py:13
+#: launderette/models.py:58 launderette/models.py:83
msgid "name"
msgstr "nom"
@@ -63,8 +63,8 @@ msgstr "IBAN"
msgid "account number"
msgstr "numero de compte"
-#: accounting/models.py:61 accounting/models.py:86 club/models.py:146
-#: counter/models.py:105 counter/models.py:132
+#: accounting/models.py:61 accounting/models.py:86 club/models.py:145
+#: counter/models.py:104 counter/models.py:131
msgid "club"
msgstr "club"
@@ -85,12 +85,12 @@ msgstr "Compte club"
msgid "%(club_account)s on %(bank_account)s"
msgstr "%(club_account)s sur %(bank_account)s"
-#: accounting/models.py:142 club/models.py:147 counter/models.py:400
-#: launderette/models.py:122
+#: accounting/models.py:142 club/models.py:146 counter/models.py:399
+#: launderette/models.py:120
msgid "start date"
msgstr "date de début"
-#: accounting/models.py:143 club/models.py:148 counter/models.py:401
+#: accounting/models.py:143 club/models.py:147 counter/models.py:400
msgid "end date"
msgstr "date de fin"
@@ -102,8 +102,8 @@ msgstr "est fermé"
msgid "club account"
msgstr "compte club"
-#: accounting/models.py:147 accounting/models.py:193 counter/models.py:29
-#: counter/models.py:241
+#: accounting/models.py:147 accounting/models.py:193 counter/models.py:28
+#: counter/models.py:240
msgid "amount"
msgstr "montant"
@@ -123,18 +123,18 @@ msgstr "numéro"
msgid "journal"
msgstr "classeur"
-#: accounting/models.py:194 core/models.py:515 core/models.py:818
-#: core/models.py:858 counter/models.py:244 counter/models.py:292
-#: counter/models.py:417 eboutic/models.py:15 eboutic/models.py:48
+#: accounting/models.py:194 core/models.py:530 core/models.py:858
+#: core/models.py:898 counter/models.py:243 counter/models.py:291
+#: counter/models.py:416 eboutic/models.py:15 eboutic/models.py:48
msgid "date"
msgstr "date"
-#: accounting/models.py:195 counter/models.py:418
+#: accounting/models.py:195 counter/models.py:417
msgid "comment"
msgstr "commentaire"
-#: accounting/models.py:196 counter/models.py:245 counter/models.py:293
-#: subscription/models.py:57
+#: accounting/models.py:196 counter/models.py:244 counter/models.py:292
+#: subscription/models.py:29
msgid "payment method"
msgstr "méthode de paiement"
@@ -159,7 +159,7 @@ msgid "accounting type"
msgstr "type comptable"
#: accounting/models.py:205 accounting/models.py:299 accounting/models.py:325
-#: accounting/models.py:348 counter/models.py:284
+#: accounting/models.py:348 counter/models.py:283
msgid "label"
msgstr "intitulé"
@@ -190,7 +190,7 @@ msgstr "Compte"
msgid "Company"
msgstr "Entreprise"
-#: accounting/models.py:207 sith/settings.py:306
+#: accounting/models.py:207 sith/settings.py:281
msgid "Other"
msgstr "Autre"
@@ -232,7 +232,7 @@ msgstr ""
"Vous devez fournir soit un type comptable simplifié ou un type comptable "
"standard"
-#: accounting/models.py:294 counter/models.py:100
+#: accounting/models.py:294 counter/models.py:99
msgid "code"
msgstr "code"
@@ -304,7 +304,8 @@ msgstr "Compte en banque : "
#: accounting/templates/accounting/club_account_details.jinja:16
#: accounting/templates/accounting/label_list.jinja:21
#: club/templates/club/club_sellings.jinja:49
-#: core/templates/core/file_detail.jinja:43
+#: core/templates/core/file_detail.jinja:25
+#: core/templates/core/file_detail.jinja:53
#: core/templates/core/file_moderation.jinja:24
#: core/templates/core/group_list.jinja:13 core/templates/core/macros.jinja:66
#: core/templates/core/user_account_detail.jinja:38
@@ -312,8 +313,8 @@ msgstr "Compte en banque : "
#: counter/templates/counter/last_ops.jinja:29
#: counter/templates/counter/last_ops.jinja:59
#: launderette/templates/launderette/launderette_admin.jinja:16
-#: launderette/views.py:146 sas/templates/sas/moderation.jinja:36
-#: sas/templates/sas/picture.jinja:66 sas/templates/sas/picture.jinja:109
+#: launderette/views.py:144 sas/templates/sas/moderation.jinja:36
+#: sas/templates/sas/picture.jinja:66 sas/templates/sas/picture.jinja:111
msgid "Delete"
msgstr "Supprimer"
@@ -345,7 +346,7 @@ msgstr "Nouveau compte club"
#: counter/templates/counter/counter_list.jinja:32
#: counter/templates/counter/counter_list.jinja:47
#: launderette/templates/launderette/launderette_list.jinja:16
-#: sas/templates/sas/album.jinja:18 sas/templates/sas/picture.jinja:88
+#: sas/templates/sas/album.jinja:18 sas/templates/sas/picture.jinja:90
msgid "Edit"
msgstr "Éditer"
@@ -513,7 +514,7 @@ msgid "Done"
msgstr "Effectué"
#: accounting/templates/accounting/journal_details.jinja:37
-#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:711
+#: counter/templates/counter/cash_summary_list.jinja:37 counter/views.py:710
msgid "Comment"
msgstr "Commentaire"
@@ -620,11 +621,11 @@ msgstr "Commentaire :"
msgid "Refound this account"
msgstr "Rembourser ce compte"
-#: club/models.py:21
+#: club/models.py:20
msgid "unix name"
msgstr "nom unix"
-#: club/models.py:25
+#: club/models.py:24
msgid ""
"Enter a valid unix name. This value may contain only letters, numbers ./-/_ "
"characters."
@@ -632,50 +633,50 @@ msgstr ""
"Entrez un nom UNIX valide. Cette valeur peut contenir uniquement des "
"lettres, des nombres, et les caractères ./-/_"
-#: club/models.py:30
+#: club/models.py:29
msgid "A club with that unix name already exists."
msgstr "Un club avec ce nom UNIX existe déjà."
-#: club/models.py:33 core/models.py:170
+#: club/models.py:32 core/models.py:170
msgid "address"
msgstr "Adresse"
-#: club/models.py:39 core/models.py:118
+#: club/models.py:38 core/models.py:118
msgid "home"
msgstr "home"
-#: club/models.py:48
+#: club/models.py:47
msgid "You can not make loops in clubs"
msgstr "Vous ne pouvez pas faire de boucles dans les clubs"
-#: club/models.py:62
+#: club/models.py:61
msgid "A club with that unix_name already exists"
msgstr "Un club avec ce nom UNIX existe déjà."
-#: club/models.py:145 counter/models.py:398 counter/models.py:415
-#: eboutic/models.py:14 eboutic/models.py:47 launderette/models.py:89
-#: launderette/models.py:126 sas/models.py:108
+#: club/models.py:144 counter/models.py:397 counter/models.py:414
+#: eboutic/models.py:14 eboutic/models.py:47 launderette/models.py:87
+#: launderette/models.py:124 sas/models.py:107
msgid "user"
msgstr "nom d'utilisateur"
-#: club/models.py:149 core/models.py:137
+#: club/models.py:148 core/models.py:137
msgid "role"
msgstr "rôle"
-#: club/models.py:151 core/models.py:33 counter/models.py:72
-#: counter/models.py:97
+#: club/models.py:150 core/models.py:33 counter/models.py:71
+#: counter/models.py:96
msgid "description"
msgstr "description"
-#: club/models.py:156
+#: club/models.py:155
msgid "User must be subscriber to take part to a club"
msgstr "L'utilisateur doit être cotisant pour faire partie d'un club"
-#: club/models.py:158
+#: club/models.py:157
msgid "User is already member of that club"
msgstr "L'utilisateur est déjà membre de ce club"
-#: club/models.py:167
+#: club/models.py:166
msgid "past member"
msgstr "Anciens membres"
@@ -724,7 +725,7 @@ msgstr "Marquer comme ancien"
#: club/templates/club/club_members.jinja:30
#: core/templates/core/file_detail.jinja:19 core/views/forms.py:203
-#: launderette/views.py:146
+#: launderette/views.py:144
msgid "Add"
msgstr "Ajouter"
@@ -775,7 +776,7 @@ msgstr "Total : "
#: club/templates/club/club_sellings.jinja:20 club/views.py:167
#: 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:78
+#: counter/templates/counter/cash_summary_list.jinja:33 counter/views.py:77
msgid "Counter"
msgstr "Comptoir"
@@ -843,8 +844,8 @@ msgstr "Membres"
msgid "Old members"
msgstr "Anciens membres"
-#: club/views.py:49 core/templates/core/base.jinja:54 core/views/user.py:146
-#: sas/templates/sas/picture.jinja:83
+#: club/views.py:49 core/templates/core/base.jinja:52 core/views/user.py:146
+#: sas/templates/sas/picture.jinja:85
msgid "Tools"
msgstr "Outils"
@@ -854,7 +855,7 @@ msgstr "Outils"
msgid "Props"
msgstr "Propriétés"
-#: club/views.py:103 core/views/forms.py:204 counter/views.py:39
+#: club/views.py:103 core/views/forms.py:204 counter/views.py:38
msgid "Select user"
msgstr "Choisir un utilisateur"
@@ -862,16 +863,16 @@ msgstr "Choisir un utilisateur"
msgid "You do not have the permission to do that"
msgstr "Vous n'avez pas la permission de faire cela"
-#: club/views.py:165 counter/views.py:909
+#: club/views.py:165 counter/views.py:908
msgid "Begin date"
msgstr "Date de début"
-#: club/views.py:166 counter/views.py:910
+#: club/views.py:166 counter/views.py:909
msgid "End date"
msgstr "Date de fin"
#: club/views.py:180 core/templates/core/user_stats.jinja:27
-#: counter/views.py:990
+#: counter/views.py:989
msgid "Product"
msgstr "Produit"
@@ -1150,165 +1151,165 @@ msgstr "adresse des parents"
msgid "is subscriber viewable"
msgstr "profil visible par les cotisants"
-#: core/models.py:301
+#: core/models.py:305
msgid "A user with that username already exists"
msgstr "Un utilisateur de ce nom d'utilisateur existe déjà"
-#: core/models.py:426 core/templates/core/macros.jinja:17
+#: core/models.py:430 core/templates/core/macros.jinja:17
#: core/templates/core/user_detail.jinja:14
#: core/templates/core/user_detail.jinja:16
#: core/templates/core/user_edit.jinja:17
msgid "Profile"
msgstr "Profil"
-#: core/models.py:484
+#: core/models.py:499
msgid "Visitor"
msgstr "Visiteur"
-#: core/models.py:489
+#: core/models.py:504
msgid "define if we show a users stats"
msgstr "Definit si l'on montre les statistiques de l'utilisateur"
-#: core/models.py:491
+#: core/models.py:506
msgid "Show your account statistics to others"
msgstr "Montrez vos statistiques de compte aux autres"
-#: core/models.py:504
+#: core/models.py:519
msgid "file name"
msgstr "nom du fichier"
-#: core/models.py:505 core/models.py:665
+#: core/models.py:520 core/models.py:705
msgid "parent"
msgstr "parent"
-#: core/models.py:506 core/models.py:521
+#: core/models.py:521 core/models.py:537
msgid "file"
msgstr "fichier"
-#: core/models.py:507
+#: core/models.py:522
msgid "compressed file"
msgstr "version allégée"
-#: core/models.py:508
+#: core/models.py:523
msgid "thumbnail"
msgstr "miniature"
-#: core/models.py:509
+#: core/models.py:524 core/models.py:532
msgid "owner"
msgstr "propriétaire"
-#: core/models.py:510 core/models.py:671
+#: core/models.py:525 core/models.py:711
msgid "edit group"
msgstr "groupe d'édition"
-#: core/models.py:511 core/models.py:672
+#: core/models.py:526 core/models.py:712
msgid "view group"
msgstr "groupe de vue"
-#: core/models.py:512
+#: core/models.py:527
msgid "is folder"
msgstr "est un dossier"
-#: core/models.py:513
+#: core/models.py:528
msgid "mime type"
msgstr "type mime"
-#: core/models.py:514
+#: core/models.py:529
msgid "size"
msgstr "taille"
-#: core/models.py:516
+#: core/models.py:531
msgid "is moderated"
msgstr "est modéré"
-#: core/models.py:517
+#: core/models.py:533
msgid "asked for removal"
msgstr "retrait demandé"
-#: core/models.py:518
+#: core/models.py:534
msgid "is in the SAS"
msgstr "est dans le SAS"
-#: core/models.py:555
+#: core/models.py:571
msgid "Character '/' not authorized in name"
msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier"
-#: core/models.py:558 core/models.py:563
+#: core/models.py:574 core/models.py:579
msgid "Loop in folder tree"
msgstr "Boucle dans l'arborescence des dossiers"
-#: core/models.py:567
+#: core/models.py:583
msgid "You can not make a file be a children of a non folder file"
msgstr ""
"Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas "
"un dossier"
-#: core/models.py:571
+#: core/models.py:587
msgid "Duplicate file"
msgstr "Un fichier de ce nom existe déjà"
-#: core/models.py:585
+#: core/models.py:601
msgid "You must provide a file"
msgstr "Vous devez fournir un fichier"
-#: core/models.py:617
+#: core/models.py:654
msgid "Folder: "
msgstr "Dossier : "
-#: core/models.py:619
+#: core/models.py:656
msgid "File: "
msgstr "Fichier : "
-#: core/models.py:664 core/models.py:668
+#: core/models.py:704 core/models.py:708
msgid "page name"
msgstr "nom de la page"
-#: core/models.py:669
+#: core/models.py:709
msgid "owner group"
msgstr "groupe propriétaire"
-#: core/models.py:673
+#: core/models.py:713
msgid "lock user"
msgstr "utilisateur bloquant"
-#: core/models.py:674
+#: core/models.py:714
msgid "lock_timeout"
msgstr "décompte du déblocage"
-#: core/models.py:701
+#: core/models.py:741
msgid "Duplicate page"
msgstr "Une page de ce nom existe déjà"
-#: core/models.py:707
+#: core/models.py:747
msgid "Loop in page tree"
msgstr "Boucle dans l'arborescence des pages"
-#: core/models.py:815
+#: core/models.py:855
msgid "revision"
msgstr "révision"
-#: core/models.py:816
+#: core/models.py:856
msgid "page title"
msgstr "titre de la page"
-#: core/models.py:817
+#: core/models.py:857
msgid "page content"
msgstr "contenu de la page"
-#: core/models.py:855
+#: core/models.py:895
msgid "url"
msgstr "url"
-#: core/models.py:856
+#: core/models.py:896
msgid "param"
-msgstr ""
+msgstr "param"
-#: core/models.py:857 launderette/models.py:62 launderette/models.py:87
-#: launderette/models.py:123
+#: core/models.py:897 launderette/models.py:60 launderette/models.py:85
+#: launderette/models.py:121
msgid "type"
msgstr "type"
-#: core/models.py:859
+#: core/models.py:899
msgid "viewed"
msgstr "vue"
@@ -1337,78 +1338,78 @@ msgstr "Connexion"
msgid "Register"
msgstr "S'enregister"
-#: core/templates/core/base.jinja:51
+#: core/templates/core/base.jinja:50
msgid "View more"
msgstr "Voir plus"
-#: core/templates/core/base.jinja:55
+#: core/templates/core/base.jinja:53
msgid "Logout"
msgstr "Déconnexion"
-#: core/templates/core/base.jinja:57 core/templates/core/base.jinja.py:58
+#: core/templates/core/base.jinja:55 core/templates/core/base.jinja.py:56
msgid "Search"
msgstr "Recherche"
-#: core/templates/core/base.jinja:80
+#: core/templates/core/base.jinja:78
msgid "Main"
msgstr "Accueil"
-#: core/templates/core/base.jinja:81
+#: core/templates/core/base.jinja:79
msgid "Matmatronch"
msgstr "Matmatronch"
-#: core/templates/core/base.jinja:82
+#: core/templates/core/base.jinja:80
msgid "Wiki"
msgstr "Wiki"
-#: core/templates/core/base.jinja:83 sas/templates/sas/album.jinja:4
+#: core/templates/core/base.jinja:81 sas/templates/sas/album.jinja:4
#: sas/templates/sas/main.jinja:4 sas/templates/sas/main.jinja.py:8
#: sas/templates/sas/picture.jinja:26
msgid "SAS"
msgstr "SAS"
-#: core/templates/core/base.jinja:84
+#: core/templates/core/base.jinja:82
msgid "Forum"
msgstr "Forum"
-#: core/templates/core/base.jinja:85
+#: core/templates/core/base.jinja:83
msgid "Services"
msgstr "Services"
-#: core/templates/core/base.jinja:86 core/templates/core/file.jinja:20
+#: core/templates/core/base.jinja:84 core/templates/core/file.jinja:20
#: core/views/files.py:48
msgid "Files"
msgstr "Fichiers"
-#: core/templates/core/base.jinja:87
+#: core/templates/core/base.jinja:85
msgid "Sponsors"
msgstr "Partenaires"
-#: core/templates/core/base.jinja:88
+#: core/templates/core/base.jinja:86
msgid "Help"
msgstr "Aide"
-#: core/templates/core/base.jinja:121
+#: core/templates/core/base.jinja:119
msgid "Contacts"
msgstr "Contacts"
-#: core/templates/core/base.jinja:122
+#: core/templates/core/base.jinja:120
msgid "Legal notices"
msgstr "Mentions légales"
-#: core/templates/core/base.jinja:123
+#: core/templates/core/base.jinja:121
msgid "Intellectual property"
msgstr "Propriété intellectuelle"
-#: core/templates/core/base.jinja:124
+#: core/templates/core/base.jinja:122
msgid "Help & Documentation"
msgstr "Aide & Documentation"
-#: core/templates/core/base.jinja:125
+#: core/templates/core/base.jinja:123
msgid "R&D"
msgstr "R&D"
-#: core/templates/core/base.jinja:127
+#: core/templates/core/base.jinja:125
msgid "Site made by good people"
msgstr "Site réalisé par des gens bons"
@@ -1470,39 +1471,51 @@ msgstr "Propriétés"
#: core/templates/core/file_detail.jinja:13
#: core/templates/core/file_moderation.jinja:20
-#: sas/templates/sas/moderation.jinja:24
+#: sas/templates/sas/moderation.jinja:24 sas/templates/sas/picture.jinja:80
msgid "Owner: "
msgstr "Propriétaire : "
-#: core/templates/core/file_detail.jinja:34
+#: core/templates/core/file_detail.jinja:26
+msgid "Clear clipboard"
+msgstr "Vider le presse-papier"
+
+#: core/templates/core/file_detail.jinja:27
+msgid "Cut"
+msgstr "Couper"
+
+#: core/templates/core/file_detail.jinja:28
+msgid "Paste"
+msgstr "Coller"
+
+#: core/templates/core/file_detail.jinja:44
msgid "Real name: "
msgstr "Nom réel : "
-#: core/templates/core/file_detail.jinja:35
+#: core/templates/core/file_detail.jinja:45
#: core/templates/core/file_moderation.jinja:21
#: sas/templates/sas/moderation.jinja:25 sas/templates/sas/picture.jinja:79
msgid "Date: "
msgstr "Date : "
-#: core/templates/core/file_detail.jinja:37
+#: core/templates/core/file_detail.jinja:47
msgid "Type: "
msgstr "Type : "
-#: core/templates/core/file_detail.jinja:38
+#: core/templates/core/file_detail.jinja:48
msgid "Size: "
msgstr "Taille : "
-#: core/templates/core/file_detail.jinja:38
+#: core/templates/core/file_detail.jinja:48
msgid "bytes"
msgstr "octets"
-#: core/templates/core/file_detail.jinja:40
+#: core/templates/core/file_detail.jinja:50
msgid "Download"
msgstr "Télécharger"
-#: core/templates/core/file_detail.jinja:46
+#: core/templates/core/file_detail.jinja:56
#: core/templates/core/file_moderation.jinja:23
-#: sas/templates/sas/moderation.jinja:32 sas/templates/sas/picture.jinja:107
+#: sas/templates/sas/moderation.jinja:32 sas/templates/sas/picture.jinja:109
msgid "Moderate"
msgstr "Modérer"
@@ -1593,7 +1606,7 @@ msgstr "Cotisant jusqu'au %(subscription_end)s"
msgid "Account number: "
msgstr "Numero de compte : "
-#: core/templates/core/macros.jinja:44 launderette/models.py:129
+#: core/templates/core/macros.jinja:44 launderette/models.py:127
msgid "Slot"
msgstr "Créneau"
@@ -1846,7 +1859,7 @@ msgstr "Rechargements"
msgid "Eboutic invoices"
msgstr "Facture eboutic"
-#: core/templates/core/user_account.jinja:53 counter/views.py:479
+#: core/templates/core/user_account.jinja:53 counter/views.py:478
msgid "Etickets"
msgstr "Etickets"
@@ -1856,7 +1869,7 @@ msgid "User has no account"
msgstr "L'utilisateur n'a pas de compte"
#: core/templates/core/user_account_detail.jinja:11
-#: core/templates/core/user_account_detail.jinja:104 launderette/views.py:146
+#: core/templates/core/user_account_detail.jinja:104 launderette/views.py:144
msgid "Back"
msgstr "Retour"
@@ -2022,8 +2035,8 @@ msgstr "Fusionner deux utilisateurs"
msgid "Subscriptions"
msgstr "Cotisations"
-#: core/templates/core/user_tools.jinja:24 counter/views.py:449
-#: counter/views.py:598
+#: core/templates/core/user_tools.jinja:24 counter/views.py:448
+#: counter/views.py:597
msgid "Counters"
msgstr "Comptoirs"
@@ -2044,7 +2057,7 @@ msgid "Product types management"
msgstr "Gestion des types de produit"
#: core/templates/core/user_tools.jinja:31
-#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:469
+#: counter/templates/counter/cash_summary_list.jinja:23 counter/views.py:468
msgid "Cash register summaries"
msgstr "Relevés de caisse"
@@ -2142,148 +2155,148 @@ msgstr "Photos"
msgid "User already has a profile picture"
msgstr "L'utilisateur a déjà une photo de profil"
-#: counter/models.py:28
+#: counter/models.py:27
msgid "account id"
msgstr "numéro de compte"
-#: counter/models.py:32
+#: counter/models.py:31
msgid "customer"
msgstr "client"
-#: counter/models.py:33
+#: counter/models.py:32
msgid "customers"
msgstr "clients"
-#: counter/models.py:48 counter/templates/counter/counter_click.jinja:48
+#: counter/models.py:47 counter/templates/counter/counter_click.jinja:48
#: counter/templates/counter/counter_click.jinja:82
msgid "Not enough money"
msgstr "Solde insuffisant"
-#: counter/models.py:76 counter/models.py:98
+#: counter/models.py:75 counter/models.py:97
msgid "product type"
msgstr "type du produit"
-#: counter/models.py:101
+#: counter/models.py:100
msgid "purchase price"
msgstr "prix d'achat"
-#: counter/models.py:102
+#: counter/models.py:101
msgid "selling price"
msgstr "prix de vente"
-#: counter/models.py:103
+#: counter/models.py:102
msgid "special selling price"
msgstr "prix de vente spécial"
-#: counter/models.py:104
+#: counter/models.py:103
msgid "icon"
msgstr "icône"
-#: counter/models.py:106
+#: counter/models.py:105
msgid "limit age"
msgstr "âge limite"
-#: counter/models.py:107
+#: counter/models.py:106
msgid "tray price"
msgstr "prix plateau"
-#: counter/models.py:108
+#: counter/models.py:107
msgid "parent product"
msgstr "produit parent"
-#: counter/models.py:110
+#: counter/models.py:109
msgid "buying groups"
msgstr "groupe d'achat"
-#: counter/models.py:111
+#: counter/models.py:110
msgid "archived"
msgstr "archivé"
-#: counter/models.py:114 counter/models.py:498
+#: counter/models.py:113 counter/models.py:497
msgid "product"
msgstr "produit"
-#: counter/models.py:133
+#: counter/models.py:132
msgid "products"
msgstr "produits"
-#: counter/models.py:134
+#: counter/models.py:133
msgid "counter type"
msgstr "type de comptoir"
-#: counter/models.py:136
+#: counter/models.py:135
msgid "Bar"
msgstr "Bar"
-#: counter/models.py:136
+#: counter/models.py:135
msgid "Office"
msgstr "Bureau"
-#: counter/models.py:136 counter/templates/counter/counter_list.jinja:11
+#: counter/models.py:135 counter/templates/counter/counter_list.jinja:11
#: eboutic/templates/eboutic/eboutic_main.jinja:4
#: eboutic/templates/eboutic/eboutic_main.jinja:24
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:8
#: eboutic/templates/eboutic/eboutic_payment_result.jinja:4
-#: sith/settings.py:305 sith/settings.py:313
+#: sith/settings.py:280 sith/settings.py:288
msgid "Eboutic"
msgstr "Eboutic"
-#: counter/models.py:137
+#: counter/models.py:136
msgid "sellers"
msgstr "vendeurs"
-#: counter/models.py:140 launderette/models.py:125
+#: counter/models.py:139 launderette/models.py:123
msgid "token"
msgstr "jeton"
-#: counter/models.py:143 counter/models.py:399 counter/models.py:416
-#: launderette/models.py:16
+#: counter/models.py:142 counter/models.py:398 counter/models.py:415
+#: launderette/models.py:14
msgid "counter"
msgstr "comptoir"
-#: counter/models.py:247
+#: counter/models.py:246
msgid "bank"
msgstr "banque"
-#: counter/models.py:249 counter/models.py:295
+#: counter/models.py:248 counter/models.py:294
msgid "is validated"
msgstr "est validé"
-#: counter/models.py:252
+#: counter/models.py:251
msgid "refilling"
msgstr "rechargement"
-#: counter/models.py:288 eboutic/models.py:103
+#: counter/models.py:287 eboutic/models.py:103
msgid "unit price"
msgstr "prix unitaire"
-#: counter/models.py:289 counter/models.py:488 eboutic/models.py:104
+#: counter/models.py:288 counter/models.py:487 eboutic/models.py:104
msgid "quantity"
msgstr "quantité"
-#: counter/models.py:294
+#: counter/models.py:293
msgid "Sith account"
msgstr "Compte utilisateur"
-#: counter/models.py:294 sith/settings.py:298 sith/settings.py:303
-#: sith/settings.py:325
+#: counter/models.py:293 sith/settings.py:273 sith/settings.py:278
+#: sith/settings.py:300
msgid "Credit card"
msgstr "Carte bancaire"
-#: counter/models.py:298
+#: counter/models.py:297
msgid "selling"
msgstr "vente"
-#: counter/models.py:317
+#: counter/models.py:316
msgid "Unknown event"
msgstr "Événement inconnu"
-#: counter/models.py:318
+#: counter/models.py:317
#, python-format
msgid "Eticket bought for the event %(event)s"
msgstr "Eticket acheté pour l'événement %(event)s"
-#: counter/models.py:320 counter/models.py:332
+#: counter/models.py:319 counter/models.py:331
#, python-format
msgid ""
"You bought an eticket for the event %(event)s.\n"
@@ -2292,51 +2305,51 @@ msgstr ""
"Vous avez acheté un Eticket pour l'événement %(event)s.\n"
"Vous pouvez le télécharger sur cette page: %(url)s"
-#: counter/models.py:402
+#: counter/models.py:401
msgid "last activity date"
msgstr "dernière activité"
-#: counter/models.py:405
+#: counter/models.py:404
msgid "permanency"
msgstr "permanence"
-#: counter/models.py:419
+#: counter/models.py:418
msgid "emptied"
msgstr "coffre vidée"
-#: counter/models.py:422
+#: counter/models.py:421
msgid "cash register summary"
msgstr "relevé de caisse"
-#: counter/models.py:486
+#: counter/models.py:485
msgid "cash summary"
msgstr "relevé"
-#: counter/models.py:487
+#: counter/models.py:486
msgid "value"
msgstr "valeur"
-#: counter/models.py:489
+#: counter/models.py:488
msgid "check"
msgstr "chèque"
-#: counter/models.py:492
+#: counter/models.py:491
msgid "cash register summary item"
msgstr "élément de relevé de caisse"
-#: counter/models.py:499
+#: counter/models.py:498
msgid "banner"
msgstr "bannière"
-#: counter/models.py:500
+#: counter/models.py:499
msgid "event date"
msgstr "date de l'événement"
-#: counter/models.py:501
+#: counter/models.py:500
msgid "event title"
msgstr "titre de l'événement"
-#: counter/models.py:502
+#: counter/models.py:501
msgid "secret"
msgstr "secret"
@@ -2384,7 +2397,7 @@ msgstr "Liste des relevés de caisse"
msgid "Theoric sums"
msgstr "Sommes théoriques"
-#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:712
+#: counter/templates/counter/cash_summary_list.jinja:36 counter/views.py:711
msgid "Emptied"
msgstr "Coffre vidé"
@@ -2508,7 +2521,7 @@ msgstr "Nouveau eticket"
msgid "There is no eticket in this website."
msgstr "Il n'y a pas de eticket sur ce site web."
-#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:474
+#: counter/templates/counter/invoices_call.jinja:4 counter/views.py:473
msgid "Invoices call"
msgstr "Appels à facture"
@@ -2580,117 +2593,117 @@ msgstr "Promo"
msgid "Percentage"
msgstr "Pourcentage"
-#: counter/views.py:55
+#: counter/views.py:54
msgid "User not found"
msgstr "Utilisateur non trouvé"
-#: counter/views.py:84
+#: counter/views.py:83
msgid "Cash summary"
msgstr "Relevé de caisse"
-#: counter/views.py:89
+#: counter/views.py:88
msgid "Last operations"
msgstr "Dernières opérations"
-#: counter/views.py:123
+#: counter/views.py:122
msgid "Bad credentials"
msgstr "Mauvais identifiants"
-#: counter/views.py:125
+#: counter/views.py:124
msgid "User is not barman"
msgstr "L'utilisateur n'est pas barman."
-#: counter/views.py:129
+#: counter/views.py:128
msgid "Bad location, someone is already logged in somewhere else"
msgstr "Mauvais comptoir, quelqu'un est déjà connecté ailleurs"
-#: counter/views.py:319
+#: counter/views.py:318
msgid "END"
msgstr "FIN"
-#: counter/views.py:321
+#: counter/views.py:320
msgid "CAN"
msgstr "ANN"
-#: counter/views.py:351
+#: counter/views.py:350
msgid "You have not enough money to buy all the basket"
msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
-#: counter/views.py:444
+#: counter/views.py:443
msgid "Counter administration"
msgstr "Administration des comptoirs"
-#: counter/views.py:454
+#: counter/views.py:453
msgid "Products"
msgstr "Produits"
-#: counter/views.py:459
+#: counter/views.py:458
msgid "Archived products"
msgstr "Produits archivés"
-#: counter/views.py:464
+#: counter/views.py:463
msgid "Product types"
msgstr "Types de produit"
-#: counter/views.py:595
+#: counter/views.py:594
msgid "Parent product"
msgstr "Produit parent"
-#: counter/views.py:596
+#: counter/views.py:595
msgid "Buying groups"
msgstr "Groupes d'achat"
-#: counter/views.py:691
+#: counter/views.py:690
msgid "10 cents"
msgstr "10 centimes"
-#: counter/views.py:692
+#: counter/views.py:691
msgid "20 cents"
msgstr "20 centimes"
-#: counter/views.py:693
+#: counter/views.py:692
msgid "50 cents"
msgstr "50 centimes"
-#: counter/views.py:694
+#: counter/views.py:693
msgid "1 euro"
msgstr "1 €"
-#: counter/views.py:695
+#: counter/views.py:694
msgid "2 euros"
msgstr "2 €"
-#: counter/views.py:696
+#: counter/views.py:695
msgid "5 euros"
msgstr "5 €"
-#: counter/views.py:697
+#: counter/views.py:696
msgid "10 euros"
msgstr "10 €"
-#: counter/views.py:698
+#: counter/views.py:697
msgid "20 euros"
msgstr "20 €"
-#: counter/views.py:699
+#: counter/views.py:698
msgid "50 euros"
msgstr "50 €"
-#: counter/views.py:700
+#: counter/views.py:699
msgid "100 euros"
msgstr "100 €"
-#: counter/views.py:701 counter/views.py:703 counter/views.py:705
-#: counter/views.py:707 counter/views.py:709
+#: counter/views.py:700 counter/views.py:702 counter/views.py:704
+#: counter/views.py:706 counter/views.py:708
msgid "Check amount"
msgstr "Montant du chèque"
-#: counter/views.py:702 counter/views.py:704 counter/views.py:706
-#: counter/views.py:708 counter/views.py:710
+#: counter/views.py:701 counter/views.py:703 counter/views.py:705
+#: counter/views.py:707 counter/views.py:709
msgid "Check quantity"
msgstr "Nombre de chèque"
-#: counter/views.py:1061
+#: counter/views.py:1060
msgid "people(s)"
msgstr "personne(s)"
@@ -2757,38 +2770,38 @@ msgstr "Retourner à l'eboutic"
msgid "You do not have enough money to buy the basket"
msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
-#: launderette/models.py:19
+#: launderette/models.py:17
#: launderette/templates/launderette/launderette_book.jinja:5
#: launderette/templates/launderette/launderette_book_choose.jinja:4
#: launderette/templates/launderette/launderette_main.jinja:4
msgid "Launderette"
msgstr "Laverie"
-#: launderette/models.py:61 launderette/models.py:86
+#: launderette/models.py:59 launderette/models.py:84
msgid "launderette"
msgstr "laverie"
-#: launderette/models.py:63
+#: launderette/models.py:61
msgid "is working"
msgstr "fonctionne"
-#: launderette/models.py:66
+#: launderette/models.py:64
msgid "Machine"
msgstr "Machine"
-#: launderette/models.py:88
+#: launderette/models.py:86
msgid "borrow date"
msgstr "date d'emprunt"
-#: launderette/models.py:92
+#: launderette/models.py:90
msgid "Token"
msgstr "Jeton"
-#: launderette/models.py:98
+#: launderette/models.py:96
msgid "Token name can not be blank"
msgstr "Le nom du jeton ne peut pas être vide"
-#: launderette/models.py:124
+#: launderette/models.py:122
msgid "machine"
msgstr "machine"
@@ -2809,7 +2822,7 @@ msgid "New machine"
msgstr "Nouvelle machine"
#: launderette/templates/launderette/launderette_admin.jinja:42
-#: launderette/views.py:148
+#: launderette/views.py:146
msgid "Type"
msgstr "Type"
@@ -2822,12 +2835,12 @@ msgid "Washing and drying"
msgstr "Lavage et séchage"
#: launderette/templates/launderette/launderette_book.jinja:27
-#: sith/settings.py:445
+#: sith/settings.py:420
msgid "Washing"
msgstr "Lavage"
#: launderette/templates/launderette/launderette_book.jinja:31
-#: sith/settings.py:445
+#: sith/settings.py:420
msgid "Drying"
msgstr "Séchage"
@@ -2852,29 +2865,29 @@ msgstr "Éditer la page de présentation"
msgid "Book launderette slot"
msgstr "Réserver un créneau de laverie"
-#: launderette/views.py:147
+#: launderette/views.py:145
msgid "Action"
msgstr "Action"
-#: launderette/views.py:150
+#: launderette/views.py:148
msgid "Tokens, separated by spaces"
msgstr "Jetons, séparés par des espaces"
-#: launderette/views.py:165 launderette/views.py:179
+#: launderette/views.py:163 launderette/views.py:177
#, python-format
msgid "Token %(token_name)s does not exists"
msgstr "Le jeton %(token_name)s n'existe pas"
-#: launderette/views.py:173
+#: launderette/views.py:171
#, python-format
msgid "Token %(token_name)s already exists"
msgstr "Un jeton %(token_name)s existe déjà"
-#: launderette/views.py:229
+#: launderette/views.py:227
msgid "User has booked no slot"
msgstr "L'utilisateur n'a pas réservé de créneau"
-#: launderette/views.py:319
+#: launderette/views.py:317
msgid "Token not found"
msgstr "Jeton non trouvé"
@@ -2886,15 +2899,15 @@ msgstr "Fusionner deux utilisateurs"
msgid "Merge"
msgstr "Fusion"
-#: rootplace/views.py:66
+#: rootplace/views.py:65
msgid "User that will be kept"
msgstr "Utilisateur qui sera conservé"
-#: rootplace/views.py:67
+#: rootplace/views.py:66
msgid "User that will be deleted"
msgstr "Utilisateur qui sera supprimé"
-#: sas/models.py:109
+#: sas/models.py:108
msgid "picture"
msgstr "photo"
@@ -2936,19 +2949,23 @@ msgstr "Ne rien faire"
msgid "People"
msgstr "Personne(s)"
-#: sas/templates/sas/picture.jinja:85
+#: sas/templates/sas/picture.jinja:81
+msgid "Moderator: "
+msgstr "Modérateur"
+
+#: sas/templates/sas/picture.jinja:87
msgid "HD version"
msgstr "Version HD"
-#: sas/templates/sas/picture.jinja:89
+#: sas/templates/sas/picture.jinja:91
msgid "Rotate left"
msgstr "Tourner vers la gauche"
-#: sas/templates/sas/picture.jinja:90
+#: sas/templates/sas/picture.jinja:92
msgid "Rotate right"
msgstr "Tourner vers la droite"
-#: sas/templates/sas/picture.jinja:91
+#: sas/templates/sas/picture.jinja:93
msgid "Ask for removal"
msgstr "Demander le retrait"
@@ -2969,141 +2986,141 @@ msgstr "Erreur de création de l'album %(album)s : %(msg)s"
msgid "Add user"
msgstr "Ajouter une personne"
-#: sith/settings.py:166
+#: sith/settings.py:165
msgid "English"
msgstr "Anglais"
-#: sith/settings.py:167
+#: sith/settings.py:166
msgid "French"
msgstr "Français"
-#: sith/settings.py:295 sith/settings.py:302 sith/settings.py:323
+#: sith/settings.py:270 sith/settings.py:277 sith/settings.py:298
msgid "Check"
msgstr "Chèque"
-#: sith/settings.py:296 sith/settings.py:304 sith/settings.py:324
+#: sith/settings.py:271 sith/settings.py:279 sith/settings.py:299
msgid "Cash"
msgstr "Espèces"
-#: sith/settings.py:297
+#: sith/settings.py:272
msgid "Transfert"
msgstr "Virement"
-#: sith/settings.py:310
+#: sith/settings.py:285
msgid "Belfort"
msgstr "Belfort"
-#: sith/settings.py:311
+#: sith/settings.py:286
msgid "Sevenans"
msgstr "Sevenans"
-#: sith/settings.py:312
+#: sith/settings.py:287
msgid "Montbéliard"
msgstr "Montbéliard"
-#: sith/settings.py:352
+#: sith/settings.py:327
msgid "One semester"
msgstr "Un semestre, 15 €"
-#: sith/settings.py:357
+#: sith/settings.py:332
msgid "Two semesters"
msgstr "Deux semestres, 28 €"
-#: sith/settings.py:362
+#: sith/settings.py:337
msgid "Common core cursus"
msgstr "Cursus tronc commun, 45 €"
-#: sith/settings.py:367
+#: sith/settings.py:342
msgid "Branch cursus"
msgstr "Cursus branche, 45 €"
-#: sith/settings.py:372
+#: sith/settings.py:347
msgid "Alternating cursus"
msgstr "Cursus alternant, 30 €"
-#: sith/settings.py:377
+#: sith/settings.py:352
msgid "Honorary member"
msgstr "Membre honoraire, 0 €"
-#: sith/settings.py:382
+#: sith/settings.py:357
msgid "Assidu member"
msgstr "Membre d'Assidu, 0 €"
-#: sith/settings.py:387
+#: sith/settings.py:362
msgid "Amicale/DOCEO member"
msgstr "Membre de l'Amicale/DOCEO, 0 €"
-#: sith/settings.py:392
+#: sith/settings.py:367
msgid "UT network member"
msgstr "Cotisant du réseau UT, 0 €"
-#: sith/settings.py:397
+#: sith/settings.py:372
msgid "CROUS member"
msgstr "Membres du CROUS, 0 €"
-#: sith/settings.py:402
+#: sith/settings.py:377
msgid "Sbarro/ESTA member"
msgstr "Membre de Sbarro ou de l'ESTA, 15 €"
-#: sith/settings.py:410
+#: sith/settings.py:385
msgid "President"
msgstr "Président"
-#: sith/settings.py:411
+#: sith/settings.py:386
msgid "Vice-President"
msgstr "Vice-Président"
-#: sith/settings.py:412
+#: sith/settings.py:387
msgid "Treasurer"
msgstr "Trésorier"
-#: sith/settings.py:413
+#: sith/settings.py:388
msgid "Communication supervisor"
msgstr "Responsable com"
-#: sith/settings.py:414
+#: sith/settings.py:389
msgid "Secretary"
msgstr "Secrétaire"
-#: sith/settings.py:415
+#: sith/settings.py:390
msgid "IT supervisor"
msgstr "Responsable info"
-#: sith/settings.py:416
+#: sith/settings.py:391
msgid "Board member"
msgstr "Membre du bureau"
-#: sith/settings.py:417
+#: sith/settings.py:392
msgid "Active member"
msgstr "Membre actif"
-#: sith/settings.py:418
+#: sith/settings.py:393
msgid "Curious"
msgstr "Curieux"
-#: sith/settings.py:456
+#: sith/settings.py:427
msgid "New files to be moderated"
msgstr "Nouveaux fichiers à modérer"
-#: sith/settings.py:457
+#: sith/settings.py:428
msgid "New pictures/album to be moderated in the SAS"
msgstr "Nouvelles photos/albums à modérer dans le SAS"
-#: sith/settings.py:458
+#: sith/settings.py:429
msgid "You've been identified on some pictures"
msgstr "Vous avez été identifié sur des photos"
-#: sith/settings.py:459
+#: sith/settings.py:430
#, python-format
msgid "You just refilled of %s €"
msgstr "Vous avez rechargé votre compte de %s €"
-#: sith/settings.py:460
+#: sith/settings.py:431
#, python-format
msgid "You just bought %s"
msgstr "Vous avez acheté %s"
-#: sith/settings.py:461
+#: sith/settings.py:432
msgid "You have a notification"
msgstr "Vous avez une notification"
@@ -3115,35 +3132,35 @@ msgstr "Mauvais type de cotisation"
msgid "Bad payment method"
msgstr "Mauvais type de paiement"
-#: subscription/models.py:52
+#: subscription/models.py:24
msgid "subscription type"
msgstr "type d'inscription"
-#: subscription/models.py:55
+#: subscription/models.py:27
msgid "subscription start"
msgstr "début de la cotisation"
-#: subscription/models.py:56
+#: subscription/models.py:28
msgid "subscription end"
msgstr "fin de la cotisation"
-#: subscription/models.py:59
+#: subscription/models.py:31
msgid "location"
msgstr "lieu"
-#: subscription/models.py:68
+#: subscription/models.py:40
msgid "You can not subscribe many time for the same period"
msgstr "Vous ne pouvez pas cotiser plusieurs fois pour la même période"
-#: subscription/models.py:72
+#: subscription/models.py:44
msgid "Subscription error"
msgstr "Erreur de cotisation"
-#: subscription/views.py:54
+#: subscription/views.py:50
msgid "A user with that email address already exists"
msgstr "Un utilisateur avec cette adresse email existe déjà"
-#: subscription/views.py:70
+#: subscription/views.py:66
msgid "You must either choose an existing user or create a new one properly"
msgstr ""
"Vous devez soit choisir un utilisateur existant, ou en créer un proprement."
diff --git a/sas/models.py b/sas/models.py
index c5513a89..afaf25b0 100644
--- a/sas/models.py
+++ b/sas/models.py
@@ -24,7 +24,7 @@ class Picture(SithFile):
return False
def can_be_edited_by(self, user):
- return user.is_in_group(settings.SITH_GROUP_SAS_ADMIN_ID)
+ return user.is_in_group(settings.SITH_GROUP_SAS_ADMIN_ID) or super(Picture, self).can_be_edited_by(user)
def can_be_viewed_by(self, user):
return self.can_be_edited_by(user) or (self.is_in_sas and self.is_moderated and
@@ -87,7 +87,7 @@ class Album(SithFile):
proxy = True
def can_be_edited_by(self, user):
- return user.is_in_group(settings.SITH_GROUP_SAS_ADMIN_ID)
+ return user.is_in_group(settings.SITH_GROUP_SAS_ADMIN_ID) or super(Album, self).can_be_edited_by(user)
def can_be_viewed_by(self, user):
return self.can_be_edited_by(user) or (self.is_in_sas and self.is_moderated and