Commit 748e3ae3 authored by Sli's avatar Sli
Browse files

Refactor and migration corrections

parent 240b68f9
Pipeline #1121 passed with stage
in 4 minutes and 25 seconds
...@@ -486,7 +486,7 @@ Welcome to the wiki page! ...@@ -486,7 +486,7 @@ Welcome to the wiki page!
s.save() s.save()
Selling(label=dcons.name, product=dcons, counter=mde, unit_price=dcons.selling_price, club=main_club, Selling(label=dcons.name, product=dcons, counter=mde, unit_price=dcons.selling_price, club=main_club,
quantity=settings.SITH_RECORD_LIMIT + 3, seller=skia, customer=krophil.customer).save() quantity=settings.SITH_ECOCUP_LIMIT + 3, seller=skia, customer=krophil.customer).save()
# Add barman to counter # Add barman to counter
c = Counter.objects.get(id=2) c = Counter.objects.get(id=2)
......
...@@ -12,18 +12,18 @@ from counter.models import Customer, Product, Selling, Counter ...@@ -12,18 +12,18 @@ from counter.models import Customer, Product, Selling, Counter
def balance_ecocups(apps, schema_editor): def balance_ecocups(apps, schema_editor):
for customer in Customer.objects.all(): for customer in Customer.objects.all():
customer.recorded_products = 0 customer.recorded_products = 0
for selling in customer.buyings.filter(product__id__in=[settings.SITH_RECORD_PRODUCT, settings.SITH_UNRECORD_PRODUCT]).all(): for selling in customer.buyings.filter(product__id__in=[settings.SITH_ECOCUP_CONS, settings.SITH_ECOCUP_DECO]).all():
if selling.product.id == settings.SITH_RECORD_PRODUCT: if selling.product.is_record_product:
customer.recorded_products -= selling.quantity
elif selling.product.id == settings.SITH_UNRECORD_PRODUCT:
customer.recorded_products += selling.quantity customer.recorded_products += selling.quantity
if customer.recorded_products > settings.SITH_RECORD_LIMIT: elif selling.product.is_unrecord_product:
qt = customer.recorded_products - settings.SITH_RECORD_LIMIT customer.recorded_products -= selling.quantity
cons = Product.objects.get(id=settings.SITH_RECORD_PRODUCT) if customer.recorded_products < -settings.SITH_ECOCUP_LIMIT:
Selling(label=_("Record regularization"), product=cons, unit_price=cons.selling_price, qt = -(customer.recorded_products + settings.SITH_ECOCUP_LIMIT)
cons = Product.objects.get(id=settings.SITH_ECOCUP_CONS)
Selling(label=_("Ecocup regularization"), product=cons, unit_price=cons.selling_price,
club=cons.club, counter=Counter.objects.filter(name='Foyer').first(), club=cons.club, counter=Counter.objects.filter(name='Foyer').first(),
quantity=qt, seller=User.objects.get(id=0), customer=customer).save(allow_negative=True) quantity=qt, seller=User.objects.get(id=0), customer=customer).save(allow_negative=True)
customer.recorded_products -= qt customer.recorded_products += qt
customer.save() customer.save()
......
...@@ -63,10 +63,10 @@ class Customer(models.Model): ...@@ -63,10 +63,10 @@ class Customer(models.Model):
@property @property
def can_record(self): def can_record(self):
return self.recorded_products > -settings.SITH_RECORD_LIMIT return self.recorded_products > -settings.SITH_ECOCUP_LIMIT
def can_record_more(self, number): def can_record_more(self, number):
return self.recorded_products - number >= -settings.SITH_RECORD_LIMIT return self.recorded_products - number >= -settings.SITH_ECOCUP_LIMIT
@property @property
def can_buy(self): def can_buy(self):
...@@ -80,8 +80,8 @@ class Customer(models.Model): ...@@ -80,8 +80,8 @@ class Customer(models.Model):
letter = random.choice(string.ascii_lowercase) letter = random.choice(string.ascii_lowercase)
return number + letter return number + letter
def save(self, allow_negative=False, is_purchase=False, *args, **kwargs): def save(self, allow_negative=False, is_selling=False, *args, **kwargs):
if self.amount < 0 and (is_purchase and not allow_negative): if self.amount < 0 and (is_selling and not allow_negative):
raise ValidationError(_("Not enough money")) raise ValidationError(_("Not enough money"))
super(Customer, self).save(*args, **kwargs) super(Customer, self).save(*args, **kwargs)
...@@ -153,11 +153,11 @@ class Product(models.Model): ...@@ -153,11 +153,11 @@ class Product(models.Model):
@property @property
def is_record_product(self): def is_record_product(self):
return settings.SITH_RECORD_PRODUCT == self.id return settings.SITH_ECOCUP_CONS == self.id
@property @property
def is_unrecord_product(self): def is_unrecord_product(self):
return settings.SITH_UNRECORD_PRODUCT == self.id return settings.SITH_ECOCUP_DECO == self.id
def is_owned_by(self, user): def is_owned_by(self, user):
""" """
...@@ -398,7 +398,7 @@ class Selling(models.Model): ...@@ -398,7 +398,7 @@ class Selling(models.Model):
self.full_clean() self.full_clean()
if not self.is_validated: if not self.is_validated:
self.customer.amount -= self.quantity * self.unit_price self.customer.amount -= self.quantity * self.unit_price
self.customer.save(allow_negative=allow_negative, is_purchase=True) self.customer.save(allow_negative=allow_negative, is_selling=True)
self.is_validated = True self.is_validated = True
u = User.objects.filter(id=self.customer.user.id).first() u = User.objects.filter(id=self.customer.user.id).first()
if u.was_subscribed: if u.was_subscribed:
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-08-14 03:10+0200\n" "POT-Creation-Date: 2017-08-15 02:08+0200\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia <skia@libskia.so>\n" "Last-Translator: Skia <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
...@@ -18,7 +18,7 @@ msgstr "" ...@@ -18,7 +18,7 @@ msgstr ""
#: accounting/models.py:61 accounting/models.py:110 accounting/models.py:138 #: accounting/models.py:61 accounting/models.py:110 accounting/models.py:138
#: accounting/models.py:197 club/models.py:44 #: accounting/models.py:197 club/models.py:44
#: core/templates/core/base.jinja:234 counter/models.py:108 #: core/templates/core/base.jinja:233 counter/models.py:108
#: counter/models.py:134 counter/models.py:178 forum/models.py:49 #: counter/models.py:134 counter/models.py:178 forum/models.py:49
#: launderette/models.py:38 launderette/models.py:84 launderette/models.py:110 #: launderette/models.py:38 launderette/models.py:84 launderette/models.py:110
#: stock/models.py:38 stock/models.py:54 stock/models.py:77 stock/models.py:97 #: stock/models.py:38 stock/models.py:54 stock/models.py:77 stock/models.py:97
...@@ -65,7 +65,7 @@ msgstr "IBAN" ...@@ -65,7 +65,7 @@ msgstr "IBAN"
msgid "account number" msgid "account number"
msgstr "numero de compte" msgstr "numero de compte"
#: accounting/models.py:113 accounting/models.py:139 club/models.py:186 #: accounting/models.py:113 accounting/models.py:139 club/models.py:187
#: com/models.py:65 com/models.py:156 counter/models.py:143 #: com/models.py:65 com/models.py:156 counter/models.py:143
#: counter/models.py:179 trombi/models.py:149 #: counter/models.py:179 trombi/models.py:149
msgid "club" msgid "club"
...@@ -88,12 +88,12 @@ msgstr "Compte club" ...@@ -88,12 +88,12 @@ msgstr "Compte club"
msgid "%(club_account)s on %(bank_account)s" msgid "%(club_account)s on %(bank_account)s"
msgstr "%(club_account)s sur %(bank_account)s" msgstr "%(club_account)s sur %(bank_account)s"
#: accounting/models.py:195 club/models.py:187 counter/models.py:455 #: accounting/models.py:195 club/models.py:188 counter/models.py:455
#: election/models.py:16 launderette/models.py:148 #: election/models.py:16 launderette/models.py:148
msgid "start date" msgid "start date"
msgstr "date de début" msgstr "date de début"
#: accounting/models.py:196 club/models.py:188 counter/models.py:456 #: accounting/models.py:196 club/models.py:189 counter/models.py:456
#: election/models.py:17 #: election/models.py:17
msgid "end date" msgid "end date"
msgstr "date de fin" msgstr "date de fin"
...@@ -127,8 +127,8 @@ msgstr "numéro" ...@@ -127,8 +127,8 @@ msgstr "numéro"
msgid "journal" msgid "journal"
msgstr "classeur" msgstr "classeur"
#: accounting/models.py:258 core/models.py:616 core/models.py:991 #: accounting/models.py:258 core/models.py:628 core/models.py:1003
#: core/models.py:1032 counter/models.py:295 counter/models.py:344 #: core/models.py:1044 counter/models.py:295 counter/models.py:344
#: counter/models.py:473 eboutic/models.py:39 eboutic/models.py:73 #: counter/models.py:473 eboutic/models.py:39 eboutic/models.py:73
#: forum/models.py:239 forum/models.py:314 stock/models.py:76 #: forum/models.py:239 forum/models.py:314 stock/models.py:76
msgid "date" msgid "date"
...@@ -384,7 +384,7 @@ msgstr "Nouveau compte club" ...@@ -384,7 +384,7 @@ msgstr "Nouveau compte club"
#: com/templates/com/news_admin_list.jinja:72 #: com/templates/com/news_admin_list.jinja:72
#: com/templates/com/weekmail.jinja:32 com/templates/com/weekmail.jinja:61 #: com/templates/com/weekmail.jinja:32 com/templates/com/weekmail.jinja:61
#: core/templates/core/file.jinja:38 core/templates/core/page.jinja:31 #: core/templates/core/file.jinja:38 core/templates/core/page.jinja:31
#: core/templates/core/user_tools.jinja:40 core/views/user.py:186 #: core/templates/core/user_tools.jinja:42 core/views/user.py:186
#: counter/templates/counter/cash_summary_list.jinja:53 #: counter/templates/counter/cash_summary_list.jinja:53
#: counter/templates/counter/counter_list.jinja:17 #: counter/templates/counter/counter_list.jinja:17
#: counter/templates/counter/counter_list.jinja:32 #: counter/templates/counter/counter_list.jinja:32
...@@ -854,33 +854,33 @@ msgstr "Vous ne pouvez pas faire de boucles dans les clubs" ...@@ -854,33 +854,33 @@ msgstr "Vous ne pouvez pas faire de boucles dans les clubs"
msgid "A club with that unix_name already exists" msgid "A club with that unix_name already exists"
msgstr "Un club avec ce nom UNIX existe déjà." msgstr "Un club avec ce nom UNIX existe déjà."
#: club/models.py:185 counter/models.py:453 counter/models.py:471 #: club/models.py:186 counter/models.py:453 counter/models.py:471
#: eboutic/models.py:38 eboutic/models.py:72 election/models.py:140 #: eboutic/models.py:38 eboutic/models.py:72 election/models.py:140
#: launderette/models.py:114 launderette/models.py:152 sas/models.py:158 #: launderette/models.py:114 launderette/models.py:152 sas/models.py:158
#: trombi/models.py:148 #: trombi/models.py:148
msgid "user" msgid "user"
msgstr "nom d'utilisateur" msgstr "nom d'utilisateur"
#: club/models.py:189 core/models.py:178 election/models.py:139 #: club/models.py:190 core/models.py:178 election/models.py:139
#: election/models.py:155 trombi/models.py:150 #: election/models.py:155 trombi/models.py:150
msgid "role" msgid "role"
msgstr "rôle" msgstr "rôle"
#: club/models.py:191 core/models.py:64 counter/models.py:109 #: club/models.py:192 core/models.py:64 counter/models.py:109
#: counter/models.py:135 election/models.py:13 election/models.py:93 #: counter/models.py:135 election/models.py:13 election/models.py:93
#: election/models.py:141 forum/models.py:50 forum/models.py:186 #: election/models.py:141 forum/models.py:50 forum/models.py:186
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: club/models.py:196 #: club/models.py:197
msgid "User must be subscriber to take part to a club" msgid "User must be subscriber to take part to a club"
msgstr "L'utilisateur doit être cotisant pour faire partie d'un club" msgstr "L'utilisateur doit être cotisant pour faire partie d'un club"
#: club/models.py:198 #: club/models.py:199
msgid "User is already member of that club" msgid "User is already member of that club"
msgstr "L'utilisateur est déjà membre de ce club" msgstr "L'utilisateur est déjà membre de ce club"
#: club/models.py:202 #: club/models.py:203
msgid "past member" msgid "past member"
msgstr "Anciens membres" msgstr "Anciens membres"
...@@ -1073,7 +1073,7 @@ msgstr "Membres" ...@@ -1073,7 +1073,7 @@ msgstr "Membres"
msgid "Old members" msgid "Old members"
msgstr "Anciens membres" msgstr "Anciens membres"
#: club/views.py:68 core/templates/core/base.jinja:65 core/views/user.py:180 #: club/views.py:68 core/templates/core/base.jinja:64 core/views/user.py:180
#: sas/templates/sas/picture.jinja:95 trombi/views.py:55 #: sas/templates/sas/picture.jinja:95 trombi/views.py:55
msgid "Tools" msgid "Tools"
msgstr "Outils" msgstr "Outils"
...@@ -1153,7 +1153,7 @@ msgstr "résumé" ...@@ -1153,7 +1153,7 @@ msgstr "résumé"
msgid "content" msgid "content"
msgstr "contenu" msgstr "contenu"
#: com/models.py:64 core/models.py:1031 launderette/models.py:86 #: com/models.py:64 core/models.py:1043 launderette/models.py:86
#: launderette/models.py:112 launderette/models.py:149 stock/models.py:59 #: launderette/models.py:112 launderette/models.py:149 stock/models.py:59
#: stock/models.py:98 #: stock/models.py:98
msgid "type" msgid "type"
...@@ -1163,7 +1163,7 @@ msgstr "type" ...@@ -1163,7 +1163,7 @@ msgstr "type"
msgid "author" msgid "author"
msgstr "auteur" msgstr "auteur"
#: com/models.py:67 core/models.py:617 #: com/models.py:67 core/models.py:629
msgid "is moderated" msgid "is moderated"
msgstr "est modéré" msgstr "est modéré"
...@@ -1235,7 +1235,7 @@ msgstr "Type" ...@@ -1235,7 +1235,7 @@ msgstr "Type"
#: com/templates/com/news_admin_list.jinja:15 #: com/templates/com/news_admin_list.jinja:15
#: com/templates/com/news_admin_list.jinja:50 #: com/templates/com/news_admin_list.jinja:50
#: com/templates/com/weekmail.jinja:19 com/templates/com/weekmail.jinja:48 #: com/templates/com/weekmail.jinja:19 com/templates/com/weekmail.jinja:48
#: core/templates/core/base.jinja:244 forum/templates/forum/forum.jinja:29 #: core/templates/core/base.jinja:243 forum/templates/forum/forum.jinja:29
#: forum/templates/forum/forum.jinja:48 forum/templates/forum/main.jinja:25 #: forum/templates/forum/forum.jinja:48 forum/templates/forum/main.jinja:25
#: forum/views.py:159 #: forum/views.py:159
msgid "Title" msgid "Title"
...@@ -1340,7 +1340,7 @@ msgid "Coming soon... don't miss!" ...@@ -1340,7 +1340,7 @@ msgid "Coming soon... don't miss!"
msgstr "Prochainement... à ne pas rater!" msgstr "Prochainement... à ne pas rater!"
#: com/templates/com/weekmail.jinja:5 com/templates/com/weekmail.jinja.py:9 #: com/templates/com/weekmail.jinja:5 com/templates/com/weekmail.jinja.py:9
#: com/views.py:62 core/templates/core/user_tools.jinja:80 #: com/views.py:62 core/templates/core/user_tools.jinja:82
msgid "Weekmail" msgid "Weekmail"
msgstr "Weekmail" msgstr "Weekmail"
...@@ -1431,7 +1431,7 @@ msgstr "Le mot de la fin" ...@@ -1431,7 +1431,7 @@ msgstr "Le mot de la fin"
msgid "Communication administration" msgid "Communication administration"
msgstr "Administration de la communication" msgstr "Administration de la communication"
#: com/views.py:67 core/templates/core/user_tools.jinja:81 #: com/views.py:67 core/templates/core/user_tools.jinja:83
msgid "Weekmail destinations" msgid "Weekmail destinations"
msgstr "Destinataires du Weekmail" msgstr "Destinataires du Weekmail"
...@@ -1607,7 +1607,7 @@ msgstr "-" ...@@ -1607,7 +1607,7 @@ msgstr "-"
msgid "XS" msgid "XS"
msgstr "XS" msgstr "XS"
#: core/models.py:171 core/templates/core/base.jinja:257 #: core/models.py:171 core/templates/core/base.jinja:256
msgid "S" msgid "S"
msgstr "S" msgstr "S"
...@@ -1703,11 +1703,11 @@ msgstr "adresse des parents" ...@@ -1703,11 +1703,11 @@ msgstr "adresse des parents"
msgid "is subscriber viewable" msgid "is subscriber viewable"
msgstr "profil visible par les cotisants" msgstr "profil visible par les cotisants"
#: core/models.py:359 #: core/models.py:367
msgid "A user with that username already exists" msgid "A user with that username already exists"
msgstr "Un utilisateur de ce nom d'utilisateur existe déjà" msgstr "Un utilisateur de ce nom d'utilisateur existe déjà"
#: core/models.py:484 core/templates/core/macros.jinja:21 #: core/models.py:492 core/templates/core/macros.jinja:21
#: core/templates/core/user_detail.jinja:14 #: core/templates/core/user_detail.jinja:14
#: core/templates/core/user_detail.jinja:16 #: core/templates/core/user_detail.jinja:16
#: core/templates/core/user_edit.jinja:17 #: core/templates/core/user_edit.jinja:17
...@@ -1718,109 +1718,109 @@ msgstr "Un utilisateur de ce nom d'utilisateur existe déjà" ...@@ -1718,109 +1718,109 @@ msgstr "Un utilisateur de ce nom d'utilisateur existe déjà"
msgid "Profile" msgid "Profile"
msgstr "Profil" msgstr "Profil"
#: core/models.py:569 #: core/models.py:581
msgid "Visitor" msgid "Visitor"
msgstr "Visiteur" msgstr "Visiteur"
#: core/models.py:575 #: core/models.py:587
msgid "do you want to receive the weekmail" msgid "do you want to receive the weekmail"
msgstr "voulez-vous recevoir le Weekmail" msgstr "voulez-vous recevoir le Weekmail"
#: core/models.py:580 #: core/models.py:592
msgid "define if we show a users stats" msgid "define if we show a users stats"
msgstr "Definit si l'on montre les statistiques de l'utilisateur" msgstr "Definit si l'on montre les statistiques de l'utilisateur"
#: core/models.py:582 #: core/models.py:594
msgid "Show your account statistics to others" msgid "Show your account statistics to others"
msgstr "Montrez vos statistiques de compte aux autres" msgstr "Montrez vos statistiques de compte aux autres"
#: core/models.py:605 #: core/models.py:617
msgid "file name" msgid "file name"
msgstr "nom du fichier" msgstr "nom du fichier"
#: core/models.py:606 core/models.py:817 #: core/models.py:618 core/models.py:829
msgid "parent" msgid "parent"
msgstr "parent" msgstr "parent"
#: core/models.py:607 core/models.py:623 #: core/models.py:619 core/models.py:635
msgid "file" msgid "file"
msgstr "fichier" msgstr "fichier"
#: core/models.py:608 #: core/models.py:620
msgid "compressed file" msgid "compressed file"
msgstr "version allégée" msgstr "version allégée"
#: core/models.py:609 #: core/models.py:621
msgid "thumbnail" msgid "thumbnail"
msgstr "miniature" msgstr "miniature"
#: core/models.py:610 core/models.py:618 #: core/models.py:622 core/models.py:630
msgid "owner" msgid "owner"
msgstr "propriétaire" msgstr "propriétaire"
#: core/models.py:611 core/models.py:823 core/views/files.py:149 #: core/models.py:623 core/models.py:835 core/views/files.py:149
msgid "edit group" msgid "edit group"
msgstr "groupe d'édition" msgstr "groupe d'édition"
#: core/models.py:612 core/models.py:824 core/views/files.py:150 #: core/models.py:624 core/models.py:836 core/views/files.py:150
msgid "view group" msgid "view group"
msgstr "groupe de vue" msgstr "groupe de vue"
#: core/models.py:613 #: core/models.py:625
msgid "is folder" msgid "is folder"
msgstr "est un dossier" msgstr "est un dossier"
#: core/models.py:614 #: core/models.py:626
msgid "mime type" msgid "mime type"
msgstr "type mime" msgstr "type mime"
#: core/models.py:615 #: core/models.py:627
msgid "size" msgid "size"
msgstr "taille" msgstr "taille"
#: core/models.py:619 #: core/models.py:631
msgid "asked for removal" msgid "asked for removal"
msgstr "retrait demandé" msgstr "retrait demandé"
#: core/models.py:620 #: core/models.py:632
msgid "is in the SAS" msgid "is in the SAS"
msgstr "est dans le SAS" msgstr "est dans le SAS"
#: core/models.py:659 #: core/models.py:671
msgid "Character '/' not authorized in name" msgid "Character '/' not authorized in name"
msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier" msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier"
#: core/models.py:662 core/models.py:667 #: core/models.py:674 core/models.py:679
msgid "Loop in folder tree" msgid "Loop in folder tree"
msgstr "Boucle dans l'arborescence des dossiers" msgstr "Boucle dans l'arborescence des dossiers"
#: core/models.py:671 #: core/models.py:683
msgid "You can not make a file be a children of a non folder file" msgid "You can not make a file be a children of a non folder file"
msgstr "" msgstr ""
"Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas " "Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas "
"un dossier" "un dossier"
#: core/models.py:675 #: core/models.py:687
msgid "Duplicate file" msgid "Duplicate file"
msgstr "Un fichier de ce nom existe déjà" msgstr "Un fichier de ce nom existe déjà"
#: core/models.py:689 #: core/models.py:701
msgid "You must provide a file" msgid "You must provide a file"
msgstr "Vous devez fournir un fichier" msgstr "Vous devez fournir un fichier"
#: core/models.py:755 #: core/models.py:767
msgid "Folder: " msgid "Folder: "
msgstr "Dossier : " msgstr "Dossier : "
#: core/models.py:757 #: core/models.py:769
msgid "File: " msgid "File: "
msgstr "Fichier : " msgstr "Fichier : "
#: core/models.py:809 #: core/models.py:821
msgid "page unix name" msgid "page unix name"
msgstr "nom unix de la page" msgstr "nom unix de la page"
#: core/models.py:813 #: core/models.py:825
msgid "" msgid ""
"Enter a valid page name. This value may contain only unaccented letters, " "Enter a valid page name. This value may contain only unaccented letters, "
"numbers and ./+/-/_ characters." "numbers and ./+/-/_ characters."
...@@ -1828,51 +1828,51 @@ msgstr "" ...@@ -1828,51 +1828,51 @@ msgstr ""
"Entrez un nom de page correct. Uniquement des lettres non accentuées, " "Entrez un nom de page correct. Uniquement des lettres non accentuées, "
"numéros, et ./+/-/_" "numéros, et ./+/-/_"
#: core/models.py:820 #: core/models.py:832
msgid "page name" msgid "page name"
msgstr "nom de la page" msgstr "nom de la page"
#: core/models.py:821 #: core/models.py:833
msgid "owner group" msgid "owner group"
msgstr "groupe propriétaire" msgstr "groupe propriétaire"
#: core/models.py:825 #: core/models.py:837
msgid "lock user" msgid "lock user"
msgstr "utilisateur bloquant" msgstr "utilisateur bloquant"
#: core/models.py:826 #: core/models.py:838
msgid "lock_timeout" msgid "lock_timeout"
msgstr "décompte du déblocage" msgstr "décompte du déblocage"
#: core/models.py:853 #: core/models.py:865
msgid "Duplicate page" msgid "Duplicate page"
msgstr "Une page de ce nom existe déjà" msgstr "Une page de ce nom existe déjà"
#: core/models.py:859 #: core/models.py:871
msgid "Loop in page tree" msgid "Loop in page tree"
msgstr "Boucle dans l'arborescence des pages" msgstr "Boucle dans l'arborescence des pages"