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 %} - +
+ {% csrf_token %} +

+ | + | + | + +

+ +
{% 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