diff --git a/accounting/migrations/0013_auto_20160807_1923.py b/accounting/migrations/0013_auto_20160807_1923.py new file mode 100644 index 00000000..15f7ee91 --- /dev/null +++ b/accounting/migrations/0013_auto_20160807_1923.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounting', '0012_auto_20160720_1847'), + ] + + operations = [ + migrations.CreateModel( + name='Company', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')), + ('name', models.CharField(max_length=60, verbose_name='name')), + ], + options={ + 'verbose_name': 'company', + }, + ), + migrations.AddField( + model_name='operation', + name='target_id', + field=models.IntegerField(blank=True, null=True, verbose_name='target id'), + ), + migrations.AddField( + model_name='operation', + name='target_label', + field=models.CharField(max_length=32, blank=True, default='', verbose_name='target label'), + ), + migrations.AddField( + model_name='operation', + name='target_type', + field=models.CharField(max_length=10, default='OTHER', choices=[('USER', 'User'), ('CLUB', 'Club'), ('ACCOUNT', 'Account'), ('COMPANY', 'Company'), ('OTHER', 'Other')], verbose_name='target type'), + preserve_default=False, + ), + ] diff --git a/accounting/migrations/0015_auto_20160807_1959.py b/accounting/migrations/0015_auto_20160807_1959.py new file mode 100644 index 00000000..3bb17ae0 --- /dev/null +++ b/accounting/migrations/0015_auto_20160807_1959.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounting', '0014_auto_20160807_1954'), + ] + + operations = [ + migrations.AlterField( + model_name='operation', + name='accounting_type', + field=models.ForeignKey(related_name='operations', verbose_name='accounting type', to='accounting.AccountingType'), + ), + migrations.AlterField( + model_name='operation', + name='invoice', + field=models.FileField(upload_to='invoices', verbose_name='invoice', null=True, blank=True), + ), + ] diff --git a/accounting/migrations/0016_auto_20160807_2000.py b/accounting/migrations/0016_auto_20160807_2000.py new file mode 100644 index 00000000..64767ee7 --- /dev/null +++ b/accounting/migrations/0016_auto_20160807_2000.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounting', '0015_auto_20160807_1959'), + ] + + operations = [ + migrations.AlterModelOptions( + name='accountingtype', + options={'verbose_name': 'accounting type'}, + ), + ] diff --git a/accounting/models.py b/accounting/models.py index 616b5352..370b3bc4 100644 --- a/accounting/models.py +++ b/accounting/models.py @@ -27,6 +27,19 @@ class CurrencyField(models.DecimalField): except AttributeError: return None +# Accounting classes + +class Company(models.Model): + name = models.CharField(_('name'), max_length=60) + + class Meta: + verbose_name = _("company") + + def get_absolute_url(self): + return reverse('accounting:co_edit', kwargs={'co_id': self.id}) + + def get_display_name(self): + return self.name class BankAccount(models.Model): name = models.CharField(_('name'), max_length=30) @@ -85,6 +98,10 @@ class ClubAccount(models.Model): def __str__(self): return self.name + def get_display_name(self): + return _("%(club_account)s on %(bank_account)s") % {"club_account": self.name, "bank_account": self.bank_account} + + class GeneralJournal(models.Model): """ Class storing all the operations for a period of time @@ -139,19 +156,45 @@ class Operation(models.Model): remark = models.TextField(_('remark'), max_length=255) mode = models.CharField(_('payment method'), max_length=255, choices=settings.SITH_ACCOUNTING_PAYMENT_METHOD) cheque_number = models.IntegerField(_('cheque number'), default=-1) - invoice = models.FileField(upload_to='invoices', null=True, blank=True) + invoice = models.FileField(upload_to='invoices', verbose_name=_("invoice"), null=True, blank=True) done = models.BooleanField(_('is done'), default=False) - accounting_type = models.ForeignKey('AccountingType', related_name="operations") + accounting_type = models.ForeignKey('AccountingType', related_name="operations", verbose_name=_("accounting type")) + target_type = models.CharField(_('target type'), max_length=10, + choices=[('USER', _('User')), ('CLUB', _('Club')), ('ACCOUNT', _('Account')), ('COMPANY', _('Company')), ('OTHER', _('Other'))]) + target_id = models.IntegerField(_('target id'), null=True, blank=True) + target_label = models.CharField(_('target label'), max_length=32, default="", blank=True) class Meta: unique_together = ('number', 'journal') ordering = ['-number'] + def __getattribute__(self, attr): + if attr == "target": + return self.get_target() + else: + return object.__getattribute__(self, attr) + def clean(self): super(Operation, self).clean() if self.date < self.journal.start_date: raise ValidationError(_("""The date can not be before the start date of the journal, which is %(start_date)s.""") % {'start_date': defaultfilters.date(self.journal.start_date, settings.DATE_FORMAT)}) + if self.target_type != "OTHER" and self.get_target() is None: + raise ValidationError(_("Target does not exists")) + if self.target_type == "OTHER" and self.target_label == "": + raise ValidationError(_("Please add a target label if you set no existing target")) + + def get_target(self): + tar = None + if self.target_type == "USER": + tar = User.objects.filter(id=self.target_id).first() + elif self.target_type == "CLUB": + tar = Club.objects.filter(id=self.target_id).first() + elif self.target_type == "ACCOUNT": + tar = ClubAccount.objects.filter(id=self.target_id).first() + elif self.target_type == "COMPANY": + tar = Company.objects.filter(id=self.target_id).first() + return tar def save(self): if self.number is None: @@ -198,6 +241,9 @@ class AccountingType(models.Model): label = models.CharField(_('label'), max_length=60) movement_type = models.CharField(_('movement type'), choices=[('credit', 'Credit'), ('debit', 'Debit'), ('neutral', 'Neutral')], max_length=12) + class Meta: + verbose_name = _("accounting type") + def is_owned_by(self, user): """ Method to see if that object can be edited by the given user @@ -211,4 +257,3 @@ class AccountingType(models.Model): def __str__(self): return self.movement_type+" - "+self.code+" - "+self.label - diff --git a/accounting/templates/accounting/journal_details.jinja b/accounting/templates/accounting/journal_details.jinja index ae4286d0..bcc8ba1c 100644 --- a/accounting/templates/accounting/journal_details.jinja +++ b/accounting/templates/accounting/journal_details.jinja @@ -22,7 +22,7 @@ {% trans %}Label{% endtrans %} {% trans %}Amount{% endtrans %} {% trans %}Payment mode{% endtrans %} - + {% trans %}Target{% endtrans %} {% trans %}Code{% endtrans %} {% trans %}Nature{% endtrans %} {% trans %}Done{% endtrans %} @@ -37,7 +37,12 @@ {{ o.date }} {{ o.label }} {{ o.amount }} € - {{ o.mode }} + {{ o.get_mode_display() }} + {% if o.target_type == "OTHER" %} + {{ o.target_label }} + {% else %} + {{ o.target.get_display_name() }} + {% endif %} {{ o.accounting_type.code }} {{ o.accounting_type.label }} {% if o.done %} diff --git a/accounting/urls.py b/accounting/urls.py index 33e62379..e004d068 100644 --- a/accounting/urls.py +++ b/accounting/urls.py @@ -25,6 +25,9 @@ urlpatterns = [ # Operations url(r'^operation/create$', OperationCreateView.as_view(), name='op_new'), url(r'^operation/(?P[0-9]+)$', OperationEditView.as_view(), name='op_edit'), + # Companies + url(r'^company/create$', CompanyCreateView.as_view(), name='co_new'), + url(r'^company/(?P[0-9]+)$', CompanyEditView.as_view(), name='co_edit'), ] diff --git a/accounting/views.py b/accounting/views.py index 473e2457..109599dc 100644 --- a/accounting/views.py +++ b/accounting/views.py @@ -6,7 +6,7 @@ from django.forms.models import modelform_factory from django.forms import HiddenInput from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin -from accounting.models import BankAccount, ClubAccount, GeneralJournal, Operation, AccountingType +from accounting.models import BankAccount, ClubAccount, GeneralJournal, Operation, AccountingType, Company # Accounting types @@ -164,7 +164,8 @@ class OperationCreateView(CanCreateMixin, CreateView): """ model = Operation form_class = modelform_factory(Operation, - fields=['amount', 'label', 'remark', 'journal', 'date', 'mode', 'cheque_number', 'accounting_type', 'done'], + fields=['amount', 'label', 'remark', 'journal', 'target_type', 'target_id', 'target_label', 'date', 'mode', + 'cheque_number', 'invoice', 'accounting_type', 'done'], widgets={'journal': HiddenInput}) template_name = 'core/create.jinja' @@ -182,6 +183,26 @@ class OperationEditView(CanEditMixin, UpdateView): """ model = Operation pk_url_kwarg = "op_id" - fields = ['amount', 'label', 'remark', 'date', 'mode', 'cheque_number', 'accounting_type', 'done'] + fields = ['amount', 'label', 'remark', 'target_type', 'target_id', 'target_label', 'date', 'mode', 'cheque_number', + 'invoice', 'accounting_type', 'done'] + template_name = 'core/edit.jinja' + +# Company views + +class CompanyCreateView(CanCreateMixin, CreateView): + """ + Create a company + """ + model = Company + fields = ['name'] + template_name = 'core/create.jinja' + +class CompanyEditView(CanCreateMixin, UpdateView): + """ + Edit a company + """ + model = Company + pk_url_kwarg = "co_id" + fields = ['name'] template_name = 'core/edit.jinja' diff --git a/club/models.py b/club/models.py index f0dd07d0..9997b57e 100644 --- a/club/models.py +++ b/club/models.py @@ -61,6 +61,9 @@ class Club(models.Model): def get_absolute_url(self): return reverse('club:club_view', kwargs={'club_id': self.id}) + def get_display_name(self): + return self.name + def is_owned_by(self, user): """ Method to see if that object can be super edited by the given user diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index ed1d0bc5..bf1c6cb0 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -1,5 +1,5 @@ import os -from datetime import date +from datetime import date, datetime from io import StringIO from django.core.management.base import BaseCommand, CommandError @@ -9,7 +9,7 @@ from django.db import connection from core.models import Group, User, Page, PageRev -from accounting.models import GeneralJournal, BankAccount, ClubAccount, Operation, AccountingType +from accounting.models import GeneralJournal, BankAccount, ClubAccount, Operation, AccountingType, Company from club.models import Club, Membership from subscription.models import Subscription, Subscriber from counter.models import Customer, ProductType, Product, Counter @@ -239,6 +239,18 @@ Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site. ba.save() ca = ClubAccount(name="Troll Penché", bank_account=ba, club=troll) ca.save() - AccountingType(code=756, label="Someone gave us money", movement_type='credit').save() - AccountingType(code=8570, label="Had to pay for food", movement_type='debit').save() + gj = GeneralJournal(name="A16", start_date=date.today(), club_account=ca) + gj.save() + credit = AccountingType(code=74, label="Someone gave us money", movement_type='credit') + credit.save() + debit = AccountingType(code=607, label="Had to pay a beer", movement_type='debit') + debit.save() + Operation(journal=gj, date=date.today(), amount=666.42, label="Satanic answer", + remark="An answer to life...", mode="CASH", done=True, accounting_type=credit, target_type="USER", + target_id=skia.id).save() + Operation(journal=gj, date=date.today(), amount=42, label="Answer", + remark="An answer to life...", mode="CASH", done=False, accounting_type=debit, target_type="CLUB", + target_id=bar_club.id).save() + woenzco = Company(name="Woenzel & co") + woenzco.save() diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index 07e5df2f..a30f51fa 100644 Binary files a/locale/fr/LC_MESSAGES/django.mo and b/locale/fr/LC_MESSAGES/django.mo differ diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 1e55a982..d8aafeeb 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-08-06 15:08+0200\n" +"POT-Creation-Date: 2016-08-07 20:00+0200\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Skia \n" "Language-Team: AE info \n" @@ -16,74 +16,124 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: accounting/models.py:32 accounting/models.py:55 accounting/models.py:94 -#: club/models.py:18 counter/models.py:52 counter/models.py:77 -#: counter/models.py:105 launderette/models.py:14 launderette/models.py:42 -#: launderette/models.py:65 +#: accounting/models.py:33 accounting/models.py:45 accounting/models.py:68 +#: accounting/models.py:111 club/models.py:18 counter/models.py:52 +#: counter/models.py:77 counter/models.py:105 launderette/models.py:14 +#: launderette/models.py:42 launderette/models.py:65 msgid "name" msgstr "nom" -#: accounting/models.py:33 +#: accounting/models.py:36 +msgid "company" +msgstr "entreprise" + +#: accounting/models.py:46 msgid "iban" msgstr "IBAN" -#: accounting/models.py:34 +#: accounting/models.py:47 msgid "account number" msgstr "numero de compte" -#: accounting/models.py:92 club/models.py:109 counter/models.py:259 +#: accounting/models.py:102 +#, python-format +msgid "%(club_account)s on %(bank_account)s" +msgstr "%(club_account)s sur %(bank_account)s" + +#: accounting/models.py:109 club/models.py:112 counter/models.py:259 #: launderette/models.py:94 msgid "start date" msgstr "date de début" -#: accounting/models.py:93 club/models.py:110 counter/models.py:260 +#: accounting/models.py:110 club/models.py:113 counter/models.py:260 msgid "end date" msgstr "date de fin" -#: accounting/models.py:95 +#: accounting/models.py:112 msgid "is closed" msgstr "est fermé" -#: accounting/models.py:97 accounting/models.py:136 counter/models.py:25 +#: accounting/models.py:114 accounting/models.py:153 counter/models.py:25 #: counter/models.py:197 msgid "amount" msgstr "montant" -#: accounting/models.py:98 +#: accounting/models.py:115 msgid "effective_amount" msgstr "montant effectif" -#: accounting/models.py:134 +#: accounting/models.py:151 msgid "number" msgstr "numéro" -#: accounting/models.py:137 core/models.py:466 counter/models.py:200 +#: accounting/models.py:154 core/models.py:466 counter/models.py:200 #: counter/models.py:235 eboutic/models.py:13 eboutic/models.py:46 msgid "date" msgstr "date" -#: accounting/models.py:138 accounting/models.py:198 counter/models.py:228 +#: accounting/models.py:155 accounting/models.py:241 counter/models.py:228 msgid "label" msgstr "intitulé" -#: accounting/models.py:139 +#: accounting/models.py:156 msgid "remark" msgstr "remarque" -#: accounting/models.py:140 counter/models.py:201 eboutic/models.py:48 +#: accounting/models.py:157 counter/models.py:201 eboutic/models.py:48 #: subscription/models.py:34 msgid "payment method" msgstr "méthode de paiement" -#: accounting/models.py:141 +#: accounting/models.py:158 msgid "cheque number" msgstr "numéro de chèque" -#: accounting/models.py:143 +#: accounting/models.py:159 eboutic/models.py:92 +msgid "invoice" +msgstr "facture" + +#: accounting/models.py:160 msgid "is done" msgstr "est fait" -#: accounting/models.py:153 +#: accounting/models.py:161 accounting/models.py:245 +msgid "accounting type" +msgstr "type comptable" + +#: accounting/models.py:162 +msgid "target type" +msgstr "type de cible" + +#: accounting/models.py:163 +#: launderette/templates/launderette/launderette_admin.jinja:34 +msgid "User" +msgstr "Utilisateur" + +#: accounting/models.py:163 club/templates/club/club_detail.jinja:4 +msgid "Club" +msgstr "Club" + +#: accounting/models.py:163 core/templates/core/user_base.jinja:16 +msgid "Account" +msgstr "Compte" + +#: accounting/models.py:163 +msgid "Company" +msgstr "Entreprise" + +#: accounting/models.py:163 sith/settings.py:259 sith/settings_sample.py:259 +msgid "Other" +msgstr "Autre" + +#: accounting/models.py:164 +msgid "target id" +msgstr "id de la cible" + +#: accounting/models.py:165 +msgid "target label" +msgstr "nom de la cible" + +#: accounting/models.py:180 #, python-format msgid "" "The date can not be before the start date of the journal, which is\n" @@ -92,11 +142,20 @@ msgstr "" "La date ne peut pas être avant la date de début du journal, qui est\n" "%(start_date)s." -#: accounting/models.py:197 counter/models.py:80 +#: accounting/models.py:183 +msgid "Target does not exists" +msgstr "La cible n'existe pas." + +#: accounting/models.py:185 +msgid "Please add a target label if you set no existing target" +msgstr "" +"Merci d'ajouter un nom de cible si vous ne spécifiez pas de cible existante" + +#: accounting/models.py:240 counter/models.py:80 msgid "code" msgstr "code" -#: accounting/models.py:199 +#: accounting/models.py:242 msgid "movement type" msgstr "type de mouvement" @@ -145,7 +204,7 @@ msgstr "Nouveau compte club" #: accounting/templates/accounting/bank_account_details.jinja:18 #: accounting/templates/accounting/bank_account_list.jinja:15 #: accounting/templates/accounting/club_account_details.jinja:44 -#: accounting/templates/accounting/journal_details.jinja:51 +#: accounting/templates/accounting/journal_details.jinja:56 #: club/templates/club/club_detail.jinja:7 core/templates/core/page.jinja:31 #: core/templates/core/user_base.jinja:8 #: core/templates/core/user_tools.jinja:37 @@ -159,7 +218,7 @@ msgstr "Éditer" #: accounting/templates/accounting/bank_account_list.jinja:16 #: core/templates/core/group_list.jinja:13 #: launderette/templates/launderette/launderette_admin.jinja:16 -#: launderette/views.py:147 +#: launderette/views.py:146 msgid "Delete" msgstr "Supprimer" @@ -226,12 +285,12 @@ msgid "Actions" msgstr "Actions" #: accounting/templates/accounting/club_account_details.jinja:39 -#: accounting/templates/accounting/journal_details.jinja:44 +#: accounting/templates/accounting/journal_details.jinja:49 msgid "Yes" msgstr "Oui" #: accounting/templates/accounting/club_account_details.jinja:41 -#: accounting/templates/accounting/journal_details.jinja:46 +#: accounting/templates/accounting/journal_details.jinja:51 msgid "No" msgstr "Non" @@ -277,6 +336,10 @@ msgstr "Intitulé" msgid "Payment mode" msgstr "Méthode de paiement" +#: accounting/templates/accounting/journal_details.jinja:25 +msgid "Target" +msgstr "Cible" + #: accounting/templates/accounting/journal_details.jinja:26 msgid "Code" msgstr "Code" @@ -317,40 +380,36 @@ msgstr "Adresse" msgid "You can not make loops in clubs" msgstr "Vous ne pouvez pas faire de boucles dans les clubs" -#: club/models.py:107 eboutic/models.py:12 eboutic/models.py:45 +#: club/models.py:110 eboutic/models.py:12 eboutic/models.py:45 #: launderette/models.py:69 launderette/models.py:98 msgid "user" msgstr "nom d'utilisateur" -#: club/models.py:108 +#: club/models.py:111 msgid "club" msgstr "club" -#: club/models.py:111 +#: club/models.py:114 msgid "role" msgstr "rôle" -#: club/models.py:113 core/models.py:27 counter/models.py:53 +#: club/models.py:116 core/models.py:27 counter/models.py:53 #: counter/models.py:78 msgid "description" msgstr "description" -#: club/models.py:118 +#: club/models.py:121 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:120 +#: club/models.py:123 msgid "User is already member of that club" msgstr "L'utilisateur est déjà membre de ce club" -#: club/models.py:124 +#: club/models.py:127 msgid "past member" msgstr "Anciens membres" -#: club/templates/club/club_detail.jinja:4 -msgid "Club" -msgstr "Club" - #: club/templates/club/club_detail.jinja:5 #: core/templates/core/group_edit.jinja:4 msgid "Back to list" @@ -398,7 +457,7 @@ msgstr "Il n'y a pas de club dans ce site web." msgid "Club members" msgstr "Membres du club" -#: club/templates/club/club_members.jinja:13 launderette/views.py:147 +#: club/templates/club/club_members.jinja:13 launderette/views.py:146 msgid "Add" msgstr "Ajouter" @@ -857,10 +916,6 @@ msgstr "L'utilisateur n'a pas de compte" msgid "Groups" msgstr "Groupes" -#: core/templates/core/user_base.jinja:16 -msgid "Account" -msgstr "Compte" - #: core/templates/core/user_detail.jinja:4 #, python-format msgid "%(user_name)s's profile" @@ -1195,7 +1250,7 @@ msgstr "ANN" msgid "You have not enough money to buy all the basket" msgstr "Vous n'avez pas assez d'argent pour acheter le panier" -#: eboutic/models.py:47 sith/settings.py:252 sith/settings_sample.py:251 +#: eboutic/models.py:47 sith/settings.py:253 sith/settings_sample.py:253 msgid "Credit card" msgstr "Carte banquaire" @@ -1223,10 +1278,6 @@ msgstr "nom du produit" msgid "basket" msgstr "panier" -#: eboutic/models.py:92 -msgid "invoice" -msgstr "facture" - #: eboutic/templates/eboutic/eboutic_main.jinja:33 msgid "Proceed to command" msgstr "Procéder à la commande" @@ -1323,14 +1374,10 @@ msgid "Tokens" msgstr "Jetons" #: launderette/templates/launderette/launderette_admin.jinja:32 -#: launderette/views.py:148 +#: launderette/views.py:147 msgid "Type" msgstr "Type" -#: launderette/templates/launderette/launderette_admin.jinja:34 -msgid "User" -msgstr "Utilisateur" - #: launderette/templates/launderette/launderette_admin.jinja:35 msgid "Since" msgstr "Depuis" @@ -1344,12 +1391,12 @@ msgid "Washing and drying" msgstr "Lavage et séchage" #: launderette/templates/launderette/launderette_book.jinja:26 -#: sith/settings.py:340 sith/settings_sample.py:339 +#: sith/settings.py:341 sith/settings_sample.py:341 msgid "Washing" msgstr "Lavage" #: launderette/templates/launderette/launderette_book.jinja:30 -#: sith/settings.py:340 sith/settings_sample.py:339 +#: sith/settings.py:341 sith/settings_sample.py:341 msgid "Drying" msgstr "Séchage" @@ -1374,115 +1421,113 @@ 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:146 msgid "Back" msgstr "Retour" -#: launderette/views.py:147 +#: launderette/views.py:146 msgid "Action" msgstr "Action" -#: launderette/views.py:149 +#: launderette/views.py:148 msgid "Tokens, separated by spaces" msgstr "Jetons, séparés par des espaces" -#: launderette/views.py:164 launderette/views.py:178 +#: 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:172 +#: 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:230 +#: launderette/views.py:227 msgid "User has booked no slot" msgstr "L'utilisateur n'a pas réservé de créneau" -#: launderette/views.py:320 +#: launderette/views.py:317 msgid "Token not found" msgstr "Jeton non trouvé" -#: sith/settings.py:249 sith/settings.py:256 sith/settings.py:274 -#: sith/settings_sample.py:248 sith/settings_sample.py:255 -#: sith/settings_sample.py:273 +#: sith/settings.py:250 sith/settings.py:257 sith/settings.py:275 +#: sith/settings_sample.py:250 sith/settings_sample.py:257 +#: sith/settings_sample.py:275 msgid "Check" msgstr "Chèque" -#: sith/settings.py:250 sith/settings.py:257 sith/settings.py:275 -#: sith/settings_sample.py:249 sith/settings_sample.py:256 -#: sith/settings_sample.py:274 +#: sith/settings.py:251 sith/settings.py:258 sith/settings.py:276 +#: sith/settings_sample.py:251 sith/settings_sample.py:258 +#: sith/settings_sample.py:276 msgid "Cash" msgstr "Espèces" -#: sith/settings.py:251 sith/settings_sample.py:250 +#: sith/settings.py:252 sith/settings_sample.py:252 msgid "Transfert" msgstr "Virement" -#: sith/settings.py:258 sith/settings_sample.py:257 -msgid "Other" -msgstr "Autre" - -#: sith/settings.py:262 sith/settings_sample.py:261 +#: sith/settings.py:263 sith/settings_sample.py:263 msgid "Belfort" msgstr "Belfort" -#: sith/settings.py:263 sith/settings_sample.py:262 +#: sith/settings.py:264 sith/settings_sample.py:264 msgid "Sevenans" msgstr "Sevenans" -#: sith/settings.py:264 sith/settings_sample.py:263 +#: sith/settings.py:265 sith/settings_sample.py:265 msgid "Montbéliard" msgstr "Montbéliard" -#: sith/settings.py:288 sith/settings_sample.py:287 +#: sith/settings.py:289 sith/settings_sample.py:289 msgid "One semester" msgstr "Un semestre" -#: sith/settings.py:293 sith/settings_sample.py:292 +#: sith/settings.py:294 sith/settings_sample.py:294 msgid "Two semesters" msgstr "Deux semestres" -#: sith/settings.py:298 sith/settings_sample.py:297 +#: sith/settings.py:299 sith/settings_sample.py:299 msgid "Common core cursus" msgstr "Cursus tronc commun" -#: sith/settings.py:303 sith/settings_sample.py:302 +#: sith/settings.py:304 sith/settings_sample.py:304 msgid "Branch cursus" msgstr "Cursus branche" -#: sith/settings.py:311 sith/settings_sample.py:310 +#: sith/settings.py:312 sith/settings_sample.py:312 msgid "President" msgstr "Président" -#: sith/settings.py:312 sith/settings_sample.py:311 +#: sith/settings.py:313 sith/settings_sample.py:313 msgid "Vice-President" msgstr "Vice-Président" -#: sith/settings.py:313 sith/settings_sample.py:312 +#: sith/settings.py:314 sith/settings_sample.py:314 msgid "Treasurer" msgstr "Trésorier" -#: sith/settings.py:314 sith/settings_sample.py:313 +#: sith/settings.py:315 sith/settings_sample.py:315 msgid "Communication supervisor" msgstr "Responsable com" -#: sith/settings.py:315 sith/settings_sample.py:314 +#: sith/settings.py:316 sith/settings_sample.py:316 msgid "Secretary" msgstr "Secrétaire" -#: sith/settings.py:316 sith/settings_sample.py:315 +#: sith/settings.py:317 sith/settings_sample.py:317 msgid "IT supervisor" msgstr "Responsable info" -#: sith/settings.py:317 sith/settings_sample.py:316 +#: sith/settings.py:318 sith/settings_sample.py:318 msgid "Board member" msgstr "Membre du bureau" -#: sith/settings.py:318 sith/settings_sample.py:317 +#: sith/settings.py:319 sith/settings_sample.py:319 msgid "Active member" msgstr "Membre actif" -#: sith/settings.py:319 sith/settings_sample.py:318 +#: sith/settings.py:320 sith/settings_sample.py:320 msgid "Curious" msgstr "Curieux" @@ -1520,5 +1565,5 @@ msgstr "Un utilisateur avec cette adresse email existe déjà" #: subscription/views.py:57 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." - +msgstr "" +"Vous devez soit choisir un utilisateur existant, ou en créer un proprement."