From 70021391766a93ebc913234ecf933f63c18b9a46 Mon Sep 17 00:00:00 2001 From: Skia Date: Tue, 2 Aug 2016 00:32:55 +0200 Subject: [PATCH] Finish the launderette click view --- core/templates/core/user_detail.jinja | 3 +- counter/migrations/0012_auto_20160801_2016.py | 35 +++ counter/migrations/0013_auto_20160801_2255.py | 19 ++ counter/models.py | 30 +- counter/templates/counter/user_account.jinja | 4 +- counter/views.py | 18 +- launderette/migrations/0008_token_product.py | 21 ++ .../migrations/0009_remove_token_product.py | 18 ++ launderette/models.py | 6 +- launderette/views.py | 86 ++++-- locale/fr/LC_MESSAGES/django.mo | Bin 20385 -> 20635 bytes locale/fr/LC_MESSAGES/django.po | 261 +++++++++--------- 12 files changed, 330 insertions(+), 171 deletions(-) create mode 100644 counter/migrations/0012_auto_20160801_2016.py create mode 100644 counter/migrations/0013_auto_20160801_2255.py create mode 100644 launderette/migrations/0008_token_product.py create mode 100644 launderette/migrations/0009_remove_token_product.py diff --git a/core/templates/core/user_detail.jinja b/core/templates/core/user_detail.jinja index f3345238..618968e4 100644 --- a/core/templates/core/user_detail.jinja +++ b/core/templates/core/user_detail.jinja @@ -17,8 +17,7 @@ {# if the user is member of a club, he can view the subscription state #}

{% if get_subscriber(profile).is_subscribed() %} -{% trans subscription_end=get_subscriber(profile).subscriptions.last().subscription_end %} -User is subscriber until {{ subscription_end }}{% endtrans %} +{% trans subscription_end=get_subscriber(profile).subscriptions.last().subscription_end %}User is subscriber until {{ subscription_end }}{% endtrans %} {% else %} {% trans %}User is not subscribed. {% endtrans %} {% trans %}New subscription{% endtrans %} diff --git a/counter/migrations/0012_auto_20160801_2016.py b/counter/migrations/0012_auto_20160801_2016.py new file mode 100644 index 00000000..c80056cb --- /dev/null +++ b/counter/migrations/0012_auto_20160801_2016.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('counter', '0011_counter_sellers'), + ] + + operations = [ + migrations.AddField( + model_name='refilling', + name='is_validated', + field=models.BooleanField(default=False, verbose_name='is validated'), + ), + migrations.AddField( + model_name='selling', + name='is_validated', + field=models.BooleanField(default=False, verbose_name='is validated'), + ), + migrations.AddField( + model_name='selling', + name='label', + field=models.CharField(max_length=30, default='troll', verbose_name='label'), + preserve_default=False, + ), + migrations.AlterField( + model_name='selling', + name='product', + field=models.ForeignKey(related_name='sellings', to='counter.Product', blank=True), + ), + ] diff --git a/counter/migrations/0013_auto_20160801_2255.py b/counter/migrations/0013_auto_20160801_2255.py new file mode 100644 index 00000000..92308404 --- /dev/null +++ b/counter/migrations/0013_auto_20160801_2255.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('counter', '0012_auto_20160801_2016'), + ] + + operations = [ + migrations.AlterField( + model_name='selling', + name='product', + field=models.ForeignKey(to='counter.Product', null=True, related_name='sellings', blank=True), + ), + ] diff --git a/counter/models.py b/counter/models.py index ad556bd3..21509732 100644 --- a/counter/models.py +++ b/counter/models.py @@ -1,8 +1,9 @@ -from django.db import models +from django.db import models, DataError from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.conf import settings from django.core.urlresolvers import reverse +from django.forms import ValidationError from datetime import timedelta from random import randrange @@ -32,6 +33,11 @@ class Customer(models.Model): def generate_account_id(): return randrange(0, 4000) # TODO: improve me! + def save(self, *args, **kwargs): + if self.amount < 0: + raise ValidationError(_("Not enough money")) + super(Customer, self).save(*args, **kwargs) + class ProductType(models.Model): """ This describes a product type @@ -190,6 +196,7 @@ class Refilling(models.Model): choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='cash') bank = models.CharField(_('bank'), max_length=255, choices=settings.SITH_COUNTER_BANK, default='other') + is_validated = models.BooleanField(_('is validated'), default=False) class Meta: verbose_name = _("refilling") @@ -202,38 +209,41 @@ class Refilling(models.Model): def save(self, *args, **kwargs): self.full_clean() - self.customer.amount += self.amount - self.customer.save() + if not self.is_validated: + self.customer.amount += self.amount + self.customer.save() + self.is_validated = True super(Refilling, self).save(*args, **kwargs) class Selling(models.Model): """ Handle the sellings """ - product = models.ForeignKey(Product, related_name="sellings", blank=False) + label = models.CharField(_("label"), max_length=30) + product = models.ForeignKey(Product, related_name="sellings", null=True, blank=True) counter = models.ForeignKey(Counter, related_name="sellings", blank=False) unit_price = CurrencyField(_('unit price')) quantity = models.IntegerField(_('quantity')) seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False) customer = models.ForeignKey(Customer, related_name="buyings", blank=False) date = models.DateTimeField(_('date'), auto_now=True) + is_validated = models.BooleanField(_('is validated'), default=False) class Meta: verbose_name = _("selling") def __str__(self): - return "Selling: %d x %s (%f) for %s" % (self.quantity, self.product.name, + return "Selling: %d x %s (%f) for %s" % (self.quantity, self.label, self.quantity*self.unit_price, self.customer.user.get_display_name()) def save(self, *args, **kwargs): self.full_clean() - self.customer.amount -= self.quantity * self.unit_price - self.customer.save() + if not self.is_validated: + self.customer.amount -= self.quantity * self.unit_price + self.customer.save() + self.is_validated = True super(Selling, self).save(*args, **kwargs) - # def get_absolute_url(self): - # return reverse('counter:details', kwargs={'counter_id': self.id}) - class Permanency(models.Model): """ This class aims at storing a traceability of who was barman where and when diff --git a/counter/templates/counter/user_account.jinja b/counter/templates/counter/user_account.jinja index 02283eb3..b3098c09 100644 --- a/counter/templates/counter/user_account.jinja +++ b/counter/templates/counter/user_account.jinja @@ -35,7 +35,7 @@ {% trans %}Date{% endtrans %} {% trans %}Barman{% endtrans %} - {% trans %}Product{% endtrans %} + {% trans %}Label{% endtrans %} {% trans %}Quantity{% endtrans %} {% trans %}Total{% endtrans %} @@ -45,7 +45,7 @@ {{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }} {{ i.seller }} - {{ i.product }} + {{ i.label }} {{ i.quantity }} {{ i.quantity * i.unit_price }} € diff --git a/counter/views.py b/counter/views.py index 61754525..c1f4fd3c 100644 --- a/counter/views.py +++ b/counter/views.py @@ -13,9 +13,11 @@ from django.conf import settings from django.db import DataError, transaction import re +from datetime import date, timedelta from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin from subscription.models import Subscriber +from subscription.views import get_subscriber from counter.models import Counter, Customer, Product, Selling, Refilling, ProductType class GetUserForm(forms.Form): @@ -28,7 +30,7 @@ class GetUserForm(forms.Form): """ code = forms.CharField(label="Code", max_length=10, required=False) id = forms.IntegerField(label="ID", required=False) -# TODO: add a nice JS widget to search for users + # TODO: add a nice JS widget to search for users def as_p(self): self.fields['code'].widget.attrs['autofocus'] = True @@ -36,14 +38,16 @@ class GetUserForm(forms.Form): def clean(self): cleaned_data = super(GetUserForm, self).clean() - user = None + cus = None if cleaned_data['code'] != "": - user = Customer.objects.filter(account_id=cleaned_data['code']).first() + cus = Customer.objects.filter(account_id=cleaned_data['code']).first() elif cleaned_data['id'] is not None: - user = Customer.objects.filter(user=cleaned_data['id']).first() - if user is None: + cus = Customer.objects.filter(user=cleaned_data['id']).first() + sub = get_subscriber(cus.user) if cus is not None else None + if cus is None or sub is None or (date.today() - sub.subscriptions.last().subscription_end) > timedelta(days=90): raise forms.ValidationError(_("User not found")) - cleaned_data['user_id'] = user.user.id + cleaned_data['user_id'] = cus.user.id + cleaned_data['user'] = cus.user return cleaned_data class RefillForm(forms.ModelForm): @@ -238,7 +242,7 @@ class CounterClick(DetailView): if uprice * infos['qty'] > self.customer.amount: raise DataError(_("You have not enough money to buy all the basket")) request.session['last_basket'].append("%d x %s" % (infos['qty'], p.name)) - s = Selling(product=p, counter=self.object, unit_price=uprice, + s = Selling(label=p.name, product=p, counter=self.object, unit_price=uprice, quantity=infos['qty'], seller=self.operator, customer=self.customer) s.save() request.session['last_customer'] = self.customer.user.get_display_name() diff --git a/launderette/migrations/0008_token_product.py b/launderette/migrations/0008_token_product.py new file mode 100644 index 00000000..bde30cba --- /dev/null +++ b/launderette/migrations/0008_token_product.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('counter', '0011_counter_sellers'), + ('launderette', '0007_auto_20160801_1929'), + ] + + operations = [ + migrations.AddField( + model_name='token', + name='product', + field=models.ForeignKey(related_name='tokens', to='counter.Product', default=1, verbose_name='product'), + preserve_default=False, + ), + ] diff --git a/launderette/migrations/0009_remove_token_product.py b/launderette/migrations/0009_remove_token_product.py new file mode 100644 index 00000000..f5cfc20b --- /dev/null +++ b/launderette/migrations/0009_remove_token_product.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('launderette', '0008_token_product'), + ] + + operations = [ + migrations.RemoveField( + model_name='token', + name='product', + ), + ] diff --git a/launderette/models.py b/launderette/models.py index aeacce4a..88d92922 100644 --- a/launderette/models.py +++ b/launderette/models.py @@ -80,6 +80,9 @@ class Token(models.Model): return True return False + def __str__(self): + return self.__class__._meta.verbose_name + " " + self.get_type_display() + " #" + self.name + " (" + self.launderette.name + ")" + class Slot(models.Model): start_date = models.DateTimeField(_('start date')) type = models.CharField(_('type'), max_length=10, choices=[('WASHING', _('Washing')), ('DRYING', _('Drying'))]) @@ -91,9 +94,6 @@ class Slot(models.Model): verbose_name = _('Slot') ordering = ['start_date'] - def full_clean(self): - return super(Slot, self).full_clean() - def __str__(self): return "User: %s - Date: %s - Type: %s - Machine: %s - Token: %s" % (self.user, self.start_date, self.get_type_display(), self.machine.name, self.token) diff --git a/launderette/views.py b/launderette/views.py index e5cd7f17..73f327c7 100644 --- a/launderette/views.py +++ b/launderette/views.py @@ -21,7 +21,8 @@ from club.models import Club from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin from launderette.models import Launderette, Token, Machine, Slot from subscription.views import get_subscriber -from counter.models import Counter, Customer +from subscription.models import Subscriber +from counter.models import Counter, Customer, Selling from counter.views import GetUserForm # For users @@ -147,12 +148,35 @@ class LaunderetteDetailView(CanEditPropMixin, DetailView): pk_url_kwarg = "launderette_id" template_name = 'launderette/launderette_detail.jinja' +class GetLaunderetteUserForm(GetUserForm): + def clean(self): + cleaned_data = super(GetLaunderetteUserForm, self).clean() + sub = get_subscriber(cleaned_data['user']) + if sub.slots.all().count() <= 0: + raise forms.ValidationError(_("User has booked no slot")) + return cleaned_data + class LaunderetteMainClickView(CanEditMixin, BaseFormView, DetailView): """The click page of the launderette""" model = Launderette pk_url_kwarg = "launderette_id" template_name = 'counter/counter_main.jinja' - form_class = GetUserForm # Form to enter a client code and get the corresponding user id + form_class = GetLaunderetteUserForm # Form to enter a client code and get the corresponding user id + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + return super(LaunderetteMainClickView, self).get(request, *args, **kwargs) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + return super(LaunderetteMainClickView, self).post(request, *args, **kwargs) + + def form_valid(self, form): + """ + We handle here the redirection, passing the user id of the asked customer + """ + self.kwargs['user_id'] = form.cleaned_data['user_id'] + return super(LaunderetteMainClickView, self).form_valid(form) def get_context_data(self, **kwargs): """ @@ -169,19 +193,39 @@ class LaunderetteMainClickView(CanEditMixin, BaseFormView, DetailView): kwargs['new_customer_amount'] = self.request.session.pop('new_customer_amount', None) return kwargs - def form_valid(self, form): - """ - We handle here the redirection, passing the user id of the asked customer - """ - self.object = self.get_object() - self.kwargs['user_id'] = form.cleaned_data['user_id'] - return super(LaunderetteMainClickView, self).form_valid(form) - def get_success_url(self): return reverse_lazy('launderette:click', args=self.args, kwargs=self.kwargs) class ClickTokenForm(forms.BaseForm): - pass + def clean(self): + with transaction.atomic(): + operator = Subscriber.objects.filter(id=self.operator_id).first() + customer = Customer.objects.filter(user__id=self.subscriber_id).first() + counter = Counter.objects.filter(id=self.counter_id).first() + subscriber = get_subscriber(customer.user) + self.last_basket = { + 'last_basket': [], + 'last_customer': customer.user.get_display_name(), + } + total = 0 + for k,t in self.cleaned_data.items(): + if t is not None: + slot_id = int(k[5:]) + slot = Slot.objects.filter(id=slot_id).first() + slot.token = t + slot.save() + t.user = subscriber + t.borrow_date = datetime.now().replace(tzinfo=pytz.UTC) + t.save() + price = settings.SITH_LAUNDERETTE_PRICES[t.type] + s = Selling(label="Jeton "+t.get_type_display()+" N°"+t.name, product=None, counter=counter, unit_price=price, + quantity=1, seller=operator, customer=customer) + s.save() + total += price + self.last_basket['last_basket'].append("Jeton "+t.get_type_display()+" N°"+t.name) + self.last_basket['new_customer_amount'] = str(customer.amount) + self.last_basket['last_total'] = str(total) + return self.cleaned_data class LaunderetteClickView(CanEditMixin, DetailView, BaseFormView): """The click page of the launderette""" @@ -196,30 +240,29 @@ class LaunderetteClickView(CanEditMixin, DetailView, BaseFormView): def clean_field(self2): t_name = str(self2.data[field_name]) if t_name != "": - t = Token.objects.filter(name=str(self2.data[field_name]), type=slot.type, launderette=self.object).first() + t = Token.objects.filter(name=str(self2.data[field_name]), type=slot.type, launderette=self.object, + user=None).first() if t is None: raise forms.ValidationError(_("Token not found")) + return t return clean_field for s in self.subscriber.slots.filter(token=None).all(): field_name = "slot-%s" % (str(s.id)) fields[field_name] = forms.CharField(max_length=5, required=False, label="%s - %s" % (s.get_type_display(), defaultfilters.date(s.start_date, "j N Y H:i"))) - # XXX l10n settings.DATETIME_FORMAT did'nt work here :/ - + # XXX l10n settings.DATETIME_FORMAT didn't work here :/ kwargs["clean_"+field_name] = clean_field_factory(field_name, s) - - def clean_form(self2): - raise forms.ValidationError(_("Not enough money")) - return self2.cleaned_data - + kwargs['subscriber_id'] = self.subscriber.id + kwargs['counter_id'] = self.object.counter.id + kwargs['operator_id'] = self.operator.id kwargs['base_fields'] = fields - kwargs['clean'] = clean_form return type('ClickForm', (ClickTokenForm,), kwargs) def get(self, request, *args, **kwargs): """Simple get view""" self.customer = Customer.objects.filter(user__id=self.kwargs['user_id']).first() self.subscriber = get_subscriber(self.customer.user) + self.operator = request.user return super(LaunderetteClickView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): @@ -227,13 +270,14 @@ class LaunderetteClickView(CanEditMixin, DetailView, BaseFormView): self.object = self.get_object() self.customer = Customer.objects.filter(user__id=self.kwargs['user_id']).first() self.subscriber = get_subscriber(self.customer.user) + self.operator = request.user return super(LaunderetteClickView, self).post(request, *args, **kwargs) def form_valid(self, form): """ We handle here the redirection, passing the user id of the asked customer """ - self.request.session['last_basket'] = ["GUY"] + self.request.session.update(form.last_basket) return super(LaunderetteClickView, self).form_valid(form) def get_context_data(self, **kwargs): diff --git a/locale/fr/LC_MESSAGES/django.mo b/locale/fr/LC_MESSAGES/django.mo index bfad99ae07f497fc4ba7d1be04a2e56910906d7f..d2d51906859d3ad1eafb6d07c5daabddcbe90e44 100644 GIT binary patch delta 7288 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 diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index dbff0900..1af48958 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-07-29 12:46+0200\n" +"POT-Creation-Date: 2016-08-02 00:28+0200\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:32 accounting/models.py:55 accounting/models.py:94 -#: club/models.py:18 counter/models.py:38 counter/models.py:63 -#: counter/models.py:91 launderette/models.py:12 launderette/models.py:36 -#: launderette/models.py:59 +#: club/models.py:18 counter/models.py:46 counter/models.py:71 +#: counter/models.py:99 launderette/models.py:14 launderette/models.py:42 +#: launderette/models.py:65 msgid "name" msgstr "nom" @@ -31,12 +31,12 @@ msgstr "IBAN" msgid "account number" msgstr "numero de compte" -#: accounting/models.py:92 club/models.py:109 counter/models.py:237 -#: launderette/models.py:62 launderette/models.py:76 +#: accounting/models.py:92 club/models.py:109 counter/models.py:253 +#: launderette/models.py:87 msgid "start date" msgstr "date de début" -#: accounting/models.py:93 club/models.py:110 counter/models.py:238 +#: accounting/models.py:93 club/models.py:110 counter/models.py:254 msgid "end date" msgstr "date de fin" @@ -44,8 +44,8 @@ msgstr "date de fin" msgid "is closed" msgstr "est fermé" -#: accounting/models.py:97 accounting/models.py:136 counter/models.py:21 -#: counter/models.py:179 +#: accounting/models.py:97 accounting/models.py:136 counter/models.py:24 +#: counter/models.py:191 msgid "amount" msgstr "montant" @@ -57,12 +57,12 @@ msgstr "montant effectif" msgid "number" msgstr "numéro" -#: accounting/models.py:137 core/models.py:463 counter/models.py:182 -#: counter/models.py:213 eboutic/models.py:13 eboutic/models.py:46 +#: accounting/models.py:137 core/models.py:463 counter/models.py:194 +#: counter/models.py:229 eboutic/models.py:13 eboutic/models.py:46 msgid "date" msgstr "date" -#: accounting/models.py:138 accounting/models.py:198 +#: accounting/models.py:138 accounting/models.py:198 counter/models.py:222 msgid "label" msgstr "intitulé" @@ -70,7 +70,7 @@ msgstr "intitulé" msgid "remark" msgstr "remarque" -#: accounting/models.py:140 counter/models.py:183 eboutic/models.py:48 +#: accounting/models.py:140 counter/models.py:195 eboutic/models.py:48 #: subscription/models.py:34 msgid "payment method" msgstr "méthode de paiement" @@ -92,7 +92,7 @@ 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:66 +#: accounting/models.py:197 counter/models.py:74 msgid "code" msgstr "code" @@ -158,7 +158,7 @@ msgstr "Éditer" #: accounting/templates/accounting/bank_account_details.jinja:19 #: accounting/templates/accounting/bank_account_list.jinja:16 #: core/templates/core/group_list.jinja:13 -#: launderette/templates/launderette/launderette_detail.jinja:13 +#: launderette/templates/launderette/launderette_detail.jinja:22 msgid "Delete" msgstr "Supprimer" @@ -267,6 +267,7 @@ msgid "Date" msgstr "Date" #: accounting/templates/accounting/journal_details.jinja:22 +#: counter/templates/counter/user_account.jinja:38 msgid "Label" msgstr "Intitulé" @@ -315,7 +316,7 @@ 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 -#: launderette/models.py:80 +#: launderette/models.py:69 launderette/models.py:91 msgid "user" msgstr "nom d'utilisateur" @@ -327,8 +328,8 @@ msgstr "club" msgid "role" msgstr "rôle" -#: club/models.py:113 core/models.py:27 counter/models.py:39 -#: counter/models.py:64 +#: club/models.py:113 core/models.py:27 counter/models.py:47 +#: counter/models.py:72 msgid "description" msgstr "description" @@ -598,7 +599,7 @@ msgid "Confirm" msgstr "Confirmation" #: core/templates/core/delete_confirm.jinja:8 -#: counter/templates/counter/counter_click.jinja:67 +#: counter/templates/counter/counter_click.jinja:71 msgid "Cancel" msgstr "Annuler" @@ -631,9 +632,7 @@ msgstr "Hello, world! Vous êtes sur la page d'accueil utilisant Jinja2." #: core/templates/core/login.jinja:6 msgid "Your username and password didn't match. Please try again." -msgstr "" -"Votre nom d'utilisateur et votre mot de passe ne correspondent pas. Merci de " -"réessayer." +msgstr "Votre nom d'utilisateur et votre mot de passe ne correspondent pas. Merci de réessayer." #: core/templates/core/login.jinja:11 msgid "" @@ -684,9 +683,7 @@ msgstr "La créer ?" #: core/templates/core/page_detail.jinja:5 #, python-format msgid "This may not be the last update, you are seeing revision %(rev_id)s!" -msgstr "" -"Ceci n'est peut-être pas la dernière version de la page. Vous consultez la " -"version %(rev_id)s." +msgstr "Ceci n'est peut-être pas la dernière version de la page. Vous consultez la version %(rev_id)s." #: core/templates/core/page_hist.jinja:6 msgid "Page history" @@ -769,9 +766,7 @@ msgstr "" #: core/templates/core/password_reset_email.jinja:4 msgid "Please go to the following page and choose a new password:" -msgstr "" -"Merci de vous rendre sur la page suivante et de choisir un nouveau mot de " -"passe :" +msgstr "Merci de vous rendre sur la page suivante et de choisir un nouveau mot de passe :" #: core/templates/core/password_reset_email.jinja:8 msgid "Your username, in case you've forgotten: " @@ -796,11 +791,8 @@ msgid "Welcome %(user_name)s!" msgstr "Bienvenue, %(user_name)s!" #: core/templates/core/register.jinja:10 -msgid "" -"You successfully registred and you will soon receive a confirmation mail." -msgstr "" -"Vous vous êtes correctement enregistré, et vous devriez recevoir rapidement " -"un email de confirmation." +msgid "You successfully registred and you will soon receive a confirmation mail." +msgstr "Vous vous êtes correctement enregistré, et vous devriez recevoir rapidement un email de confirmation." #: core/templates/core/register.jinja:12 #, python-format @@ -830,19 +822,14 @@ msgid "Born: " msgstr "Né le : " #: core/templates/core/user_detail.jinja:20 -#, python-format -msgid "" -"\n" -"User is subscriber until %(subscription_end)s" -msgstr "" -"\n" -"L'utilisateur est cotisant jusqu'au %(subscription_end)s" +msgid "User is subscriber until %(subscription_end)s" +msgstr "L'utilisateur est cotisant jusqu'au %(subscription_end)s" -#: core/templates/core/user_detail.jinja:23 +#: core/templates/core/user_detail.jinja:22 msgid "User is not subscribed. " msgstr "L'utilisateur n'est pas cotisant." -#: core/templates/core/user_detail.jinja:24 +#: core/templates/core/user_detail.jinja:23 #: subscription/templates/subscription/subscription.jinja:4 #: subscription/templates/subscription/subscription.jinja:8 msgid "New subscription" @@ -883,7 +870,7 @@ msgid "Subscriptions" msgstr "Cotisations" #: core/templates/core/user_tools.jinja:19 -#: core/templates/core/user_tools.jinja:21 launderette/models.py:16 +#: core/templates/core/user_tools.jinja:21 launderette/models.py:18 #: launderette/templates/launderette/launderette_book.jinja:4 #: launderette/templates/launderette/launderette_book_choose.jinja:4 #: launderette/templates/launderette/launderette_main.jinja:4 @@ -918,130 +905,140 @@ msgstr "Comptabilité générale" msgid "Club account: " msgstr "Compte club : " -#: counter/models.py:20 +#: counter/models.py:23 msgid "account id" msgstr "numéro de compte" -#: counter/models.py:24 +#: counter/models.py:27 msgid "customer" msgstr "client" -#: counter/models.py:25 +#: counter/models.py:28 msgid "customers" msgstr "clients" -#: counter/models.py:43 eboutic/models.py:77 +#: counter/models.py:38 counter/templates/counter/counter_click.jinja:46 +msgid "Not enough money" +msgstr "Solde insuffisant" + +#: counter/models.py:51 eboutic/models.py:77 msgid "product type" msgstr "type du produit" -#: counter/models.py:67 +#: counter/models.py:75 msgid "purchase price" msgstr "prix d'achat" -#: counter/models.py:68 +#: counter/models.py:76 msgid "selling price" msgstr "prix de vente" -#: counter/models.py:69 +#: counter/models.py:77 msgid "special selling price" msgstr "prix de vente spécial" -#: counter/models.py:74 +#: counter/models.py:82 msgid "product" msgstr "produit" -#: counter/models.py:94 subscription/models.py:29 +#: counter/models.py:102 subscription/models.py:29 msgid "subscription type" msgstr "type d'inscription" -#: counter/models.py:96 +#: counter/models.py:104 msgid "Bar" msgstr "Bar" -#: counter/models.py:96 +#: counter/models.py:104 msgid "Office" msgstr "Bureau" -#: counter/models.py:96 eboutic/templates/eboutic/eboutic_main.jinja:20 +#: counter/models.py:104 eboutic/templates/eboutic/eboutic_main.jinja:20 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:4 #: eboutic/templates/eboutic/eboutic_payment_result.jinja:4 msgid "Eboutic" msgstr "Eboutic" -#: counter/models.py:102 +#: counter/models.py:105 +msgid "sellers" +msgstr "vendeurs" + +#: counter/models.py:111 launderette/models.py:15 msgid "counter" msgstr "comptoir" -#: counter/models.py:185 +#: counter/models.py:197 msgid "bank" msgstr "banque" -#: counter/models.py:189 +#: counter/models.py:199 counter/models.py:230 +msgid "is validated" +msgstr "est validé" + +#: counter/models.py:202 msgid "refilling" msgstr "rechargement" -#: counter/models.py:209 eboutic/models.py:78 +#: counter/models.py:225 eboutic/models.py:78 msgid "unit price" msgstr "prix unitaire" -#: counter/models.py:210 eboutic/models.py:79 +#: counter/models.py:226 eboutic/models.py:79 msgid "quantity" msgstr "quantité" -#: counter/models.py:216 +#: counter/models.py:233 msgid "selling" msgstr "vente" -#: counter/models.py:241 +#: counter/models.py:257 msgid "permanency" msgstr "permanence" -#: counter/templates/counter/counter_click.jinja:20 +#: counter/templates/counter/counter_click.jinja:24 msgid "Counter" msgstr "Comptoir" -#: counter/templates/counter/counter_click.jinja:22 +#: counter/templates/counter/counter_click.jinja:26 msgid "Club: " msgstr "Club : " -#: counter/templates/counter/counter_click.jinja:25 +#: counter/templates/counter/counter_click.jinja:29 msgid "Customer" msgstr "Client" -#: counter/templates/counter/counter_click.jinja:30 +#: counter/templates/counter/counter_click.jinja:34 msgid "Refilling" msgstr "Rechargement" -#: counter/templates/counter/counter_click.jinja:35 -#: counter/templates/counter/counter_click.jinja:48 +#: counter/templates/counter/counter_click.jinja:39 +#: counter/templates/counter/counter_click.jinja:52 +#: launderette/templates/launderette/launderette_click.jinja:14 msgid "Go" msgstr "Valider" -#: counter/templates/counter/counter_click.jinja:40 +#: counter/templates/counter/counter_click.jinja:44 +#: launderette/templates/launderette/launderette_detail.jinja:8 msgid "Selling" msgstr "Vente" -#: counter/templates/counter/counter_click.jinja:42 -msgid "Not enough money" -msgstr "Solde insuffisant" - -#: counter/templates/counter/counter_click.jinja:50 +#: counter/templates/counter/counter_click.jinja:54 #: eboutic/templates/eboutic/eboutic_main.jinja:23 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:7 msgid "Basket: " msgstr "Panier : " -#: counter/templates/counter/counter_click.jinja:58 +#: counter/templates/counter/counter_click.jinja:62 #: counter/templates/counter/counter_main.jinja:24 #: eboutic/templates/eboutic/eboutic_main.jinja:30 msgid "Total: " msgstr "Total : " -#: counter/templates/counter/counter_click.jinja:62 +#: counter/templates/counter/counter_click.jinja:66 msgid "Finish" msgstr "Terminer" -#: counter/templates/counter/counter_click.jinja:69 +#: counter/templates/counter/counter_click.jinja:73 #: eboutic/templates/eboutic/eboutic_main.jinja:37 msgid "Products: " msgstr "Produits : " @@ -1064,6 +1061,7 @@ msgid "There is no counters in this website." msgstr "Il n'y a pas de comptoirs dans ce site web." #: counter/templates/counter/counter_main.jinja:12 +#: launderette/templates/launderette/launderette_click.jinja:8 #, python-format msgid "%(counter_name)s counter" msgstr "Comptoir %(counter_name)s" @@ -1148,10 +1146,6 @@ msgstr "Barman" msgid "Buyings" msgstr "Achats" -#: counter/templates/counter/user_account.jinja:38 -msgid "Product" -msgstr "Produit" - #: counter/templates/counter/user_account.jinja:39 msgid "Quantity" msgstr "Quantité" @@ -1168,23 +1162,23 @@ msgstr "Factures" msgid "Items" msgstr "Articles" -#: counter/views.py:45 +#: counter/views.py:48 msgid "User not found" msgstr "Utilisateur non trouvé" -#: counter/views.py:207 +#: counter/views.py:211 msgid "END" msgstr "FIN" -#: counter/views.py:209 +#: counter/views.py:213 msgid "CAN" msgstr "ANN" -#: counter/views.py:239 +#: counter/views.py:243 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:240 sith/settings_sample.py:243 +#: eboutic/models.py:47 sith/settings.py:247 sith/settings_sample.py:243 msgid "Credit card" msgstr "Carte banquaire" @@ -1225,11 +1219,8 @@ msgid "Pay with credit card" msgstr "Payer avec une carte banquaire" #: eboutic/templates/eboutic/eboutic_makecommand.jinja:34 -msgid "" -"AE account payment disabled because your basket contains refilling items." -msgstr "" -"Paiement par compte AE désactivé parce que votre panier contient des bons de " -"rechargement." +msgid "AE account payment disabled because your basket contains refilling items." +msgstr "Paiement par compte AE désactivé parce que votre panier contient des bons de rechargement." #: eboutic/templates/eboutic/eboutic_makecommand.jinja:39 msgid "Pay with Sith account" @@ -1251,49 +1242,49 @@ 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:13 -msgid "sellers" -msgstr "vendeurs" - -#: launderette/models.py:37 launderette/models.py:60 +#: launderette/models.py:43 launderette/models.py:66 msgid "launderette" msgstr "laverie" -#: launderette/models.py:38 launderette/models.py:61 launderette/models.py:77 +#: launderette/models.py:44 launderette/models.py:67 launderette/models.py:88 msgid "type" msgstr "type" -#: launderette/models.py:38 launderette/models.py:61 launderette/models.py:77 +#: launderette/models.py:44 launderette/models.py:67 launderette/models.py:88 #: launderette/templates/launderette/launderette_book.jinja:26 msgid "Washing" msgstr "Lavage" -#: launderette/models.py:38 launderette/models.py:61 launderette/models.py:77 +#: launderette/models.py:44 launderette/models.py:67 launderette/models.py:88 #: launderette/templates/launderette/launderette_book.jinja:30 msgid "Drying" msgstr "Séchage" -#: launderette/models.py:39 +#: launderette/models.py:45 msgid "is working" msgstr "fonctionne" -#: launderette/models.py:42 +#: launderette/models.py:48 msgid "Machine" msgstr "Machine" -#: launderette/models.py:65 +#: launderette/models.py:68 +msgid "borrow date" +msgstr "date d'emprunt" + +#: launderette/models.py:72 msgid "Token" msgstr "Jeton" -#: launderette/models.py:78 +#: launderette/models.py:89 msgid "machine" msgstr "machine" -#: launderette/models.py:79 +#: launderette/models.py:90 msgid "token" msgstr "jeton" -#: launderette/models.py:83 +#: launderette/models.py:94 msgid "Slot" msgstr "Créneau" @@ -1309,11 +1300,19 @@ msgstr "Lavage et séchage" msgid "Launderette admin" msgstr "Gestion de la laverie" -#: launderette/templates/launderette/launderette_detail.jinja:8 +#: launderette/templates/launderette/launderette_detail.jinja:9 +msgid "Sell" +msgstr "Vendre" + +#: launderette/templates/launderette/launderette_detail.jinja:10 +msgid "Tokens" +msgstr "Jetons" + +#: launderette/templates/launderette/launderette_detail.jinja:17 msgid "Machines" msgstr "Machines" -#: launderette/templates/launderette/launderette_detail.jinja:9 +#: launderette/templates/launderette/launderette_detail.jinja:18 msgid "New machine" msgstr "Nouvelle machine" @@ -1338,75 +1337,83 @@ msgstr "Éditer la page de présentation" msgid "Book launderette slot" msgstr "Réserver un créneau de laverie" -#: sith/settings.py:237 sith/settings.py:244 sith/settings.py:256 +#: launderette/views.py:156 +msgid "User has booked no slot" +msgstr "L'utilisateur n'a pas réservé de créneau" + +#: launderette/views.py:246 +msgid "Token not found" +msgstr "Jeton non trouvé" + +#: sith/settings.py:244 sith/settings.py:251 sith/settings.py:263 #: sith/settings_sample.py:240 sith/settings_sample.py:247 #: sith/settings_sample.py:259 msgid "Check" msgstr "Chèque" -#: sith/settings.py:238 sith/settings.py:245 sith/settings.py:257 +#: sith/settings.py:245 sith/settings.py:252 sith/settings.py:264 #: sith/settings_sample.py:241 sith/settings_sample.py:248 #: sith/settings_sample.py:260 msgid "Cash" msgstr "Espèces" -#: sith/settings.py:239 sith/settings_sample.py:242 +#: sith/settings.py:246 sith/settings_sample.py:242 msgid "Transfert" msgstr "Virement" -#: sith/settings.py:246 sith/settings_sample.py:249 +#: sith/settings.py:253 sith/settings_sample.py:249 msgid "Other" msgstr "Autre" -#: sith/settings.py:270 sith/settings_sample.py:273 +#: sith/settings.py:277 sith/settings_sample.py:273 msgid "One semester" msgstr "Un semestre" -#: sith/settings.py:275 sith/settings_sample.py:278 +#: sith/settings.py:282 sith/settings_sample.py:278 msgid "Two semesters" msgstr "Deux semestres" -#: sith/settings.py:280 sith/settings_sample.py:283 +#: sith/settings.py:287 sith/settings_sample.py:283 msgid "Common core cursus" msgstr "Cursus tronc commun" -#: sith/settings.py:285 sith/settings_sample.py:288 +#: sith/settings.py:292 sith/settings_sample.py:288 msgid "Branch cursus" msgstr "Cursus branche" -#: sith/settings.py:293 sith/settings_sample.py:296 +#: sith/settings.py:300 sith/settings_sample.py:296 msgid "President" msgstr "Président" -#: sith/settings.py:294 sith/settings_sample.py:297 +#: sith/settings.py:301 sith/settings_sample.py:297 msgid "Vice-President" msgstr "Vice-Président" -#: sith/settings.py:295 sith/settings_sample.py:298 +#: sith/settings.py:302 sith/settings_sample.py:298 msgid "Treasurer" msgstr "Trésorier" -#: sith/settings.py:296 sith/settings_sample.py:299 +#: sith/settings.py:303 sith/settings_sample.py:299 msgid "Communication supervisor" msgstr "Responsable com" -#: sith/settings.py:297 sith/settings_sample.py:300 +#: sith/settings.py:304 sith/settings_sample.py:300 msgid "Secretary" msgstr "Secrétaire" -#: sith/settings.py:298 sith/settings_sample.py:301 +#: sith/settings.py:305 sith/settings_sample.py:301 msgid "IT supervisor" msgstr "Responsable info" -#: sith/settings.py:299 sith/settings_sample.py:302 +#: sith/settings.py:306 sith/settings_sample.py:302 msgid "Board member" msgstr "Membre du bureau" -#: sith/settings.py:300 sith/settings_sample.py:303 +#: sith/settings.py:307 sith/settings_sample.py:303 msgid "Active member" msgstr "Membre actif" -#: sith/settings.py:301 sith/settings_sample.py:304 +#: sith/settings.py:308 sith/settings_sample.py:304 msgid "Curious" msgstr "Curieux" @@ -1440,5 +1447,7 @@ msgstr "Un utilisateur avec cette adresse email existe déjà" #: subscription/views.py:56 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." + +#~ msgid "Product" +#~ msgstr "Produit"