Commit 0859648b authored by Skia's avatar Skia

Add cut/paste function in files

parent 8b63fa9a
Pipeline #497 failed with stage
in 2 minutes and 27 seconds
# -*- 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'),
),
]
......@@ -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
......
......@@ -19,17 +19,27 @@
<p><input type="submit" value="{% trans %}Add{% endtrans %}"></p>
</form>
{% endif %}
<ul>
{% for f in file.children.order_by('-is_folder', 'name').all() %}
<li>
{% if f.is_folder %}
&#x1f4c1;
{% else %}
&#128462;
{% endif %}
<a href="{{ url('core:file_detail', file_id=f.id, popup=popup) }}">{{ f.get_display_name() }}</a></li>
{% endfor %}
</ul>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<p>
<input name="delete" type="submit" value="{% trans %}Delete{% endtrans %}"> |
<input name="clear" type="submit" value="{% trans %}Clear clipboard{% endtrans %}"> |
<input name="cut" type="submit" value="{% trans %}Cut{% endtrans %}"> |
<input name="paste" type="submit" value="{% trans %}Paste{% endtrans %}">
</p>
<ul>
{% for f in file.children.order_by('-is_folder', 'name').all() %}
<li>
<input type="checkbox" name="file_list" value="{{ f.id }}">
{% if f.is_folder %}
&#x1f4c1;
{% else %}
&#128462;
{% endif %}
<a href="{{ url('core:file_detail', file_id=f.id, popup=popup) }}">{{ f.get_display_name() }}</a></li>
{% endfor %}
</ul>
</form>
{% else %}
<p>{% trans %}Real name: {% endtrans %}{{ file.file.name.split('/')[-1] }}</p>
<p>{% trans %}Date: {% endtrans %}{{ file.date|localtime|date(DATETIME_FORMAT) }} -
......
......@@ -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)
......
......@@ -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 <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\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 : "