Add token handling form in launderette

This commit is contained in:
Skia 2016-08-06 15:20:38 +02:00
parent 31ecb50c1d
commit 1529af32c5
10 changed files with 394 additions and 178 deletions

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('launderette', '0009_remove_token_product'),
]
operations = [
migrations.AlterModelOptions(
name='token',
options={'verbose_name': 'Token', 'ordering': ['name']},
),
]

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('launderette', '0010_auto_20160806_1242'),
]
operations = [
migrations.AlterModelOptions(
name='token',
options={'ordering': ['type', 'name'], 'verbose_name': 'Token'},
),
]

View File

@ -1,4 +1,4 @@
from django.db import models
from django.db import models, DataError
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from django.core.urlresolvers import reverse
@ -41,7 +41,7 @@ class Launderette(models.Model):
class Machine(models.Model):
name = models.CharField(_('name'), max_length=30)
launderette = models.ForeignKey(Launderette, related_name='machines', verbose_name=_('launderette'))
type = models.CharField(_('type'), max_length=10, choices=[('WASHING', _('Washing')), ('DRYING', _('Drying'))])
type = models.CharField(_('type'), max_length=10, choices=settings.SITH_LAUNDERETTE_MACHINE_TYPES)
is_working = models.BooleanField(_('is working'), default=True)
class Meta:
@ -59,18 +59,25 @@ class Machine(models.Model):
return "%s %s" % (self._meta.verbose_name, self.name)
def get_absolute_url(self):
return reverse('launderette:launderette_details', kwargs={"launderette_id": self.launderette.id})
return reverse('launderette:launderette_admin', kwargs={"launderette_id": self.launderette.id})
class Token(models.Model):
name = models.CharField(_('name'), max_length=5)
launderette = models.ForeignKey(Launderette, related_name='tokens', verbose_name=_('launderette'))
type = models.CharField(_('type'), max_length=10, choices=[('WASHING', _('Washing')), ('DRYING', _('Drying'))])
type = models.CharField(_('type'), max_length=10, choices=settings.SITH_LAUNDERETTE_MACHINE_TYPES)
borrow_date = models.DateTimeField(_('borrow date'), null=True, blank=True)
user = models.ForeignKey(Subscriber, related_name='tokens', verbose_name=_('user'), null=True, blank=True)
class Meta:
verbose_name = _('Token')
unique_together = ('name', 'launderette', 'type')
ordering = ['type', 'name']
def save(self, *args, **kwargs):
if self.name == "":
raise DataError(_("Token name can not be blank"))
else:
super(Token, self).save(*args, **kwargs)
def is_owned_by(self, user):
"""
@ -85,7 +92,7 @@ class Token(models.Model):
class Slot(models.Model):
start_date = models.DateTimeField(_('start date'))
type = models.CharField(_('type'), max_length=10, choices=[('WASHING', _('Washing')), ('DRYING', _('Drying'))])
type = models.CharField(_('type'), max_length=10, choices=settings.SITH_LAUNDERETTE_MACHINE_TYPES)
machine = models.ForeignKey(Machine, related_name='slots', verbose_name=_('machine'))
token = models.ForeignKey(Token, related_name='slots', verbose_name=_('token'), blank=True, null=True)
user = models.ForeignKey(Subscriber, related_name='slots', verbose_name=_('user'))

View File

@ -7,12 +7,6 @@
{% block content %}
<h3>{% trans %}Selling{% endtrans %}</h3>
<p><a href="{{ url('launderette:main_click', launderette_id=launderette.id) }}">{% trans %}Sell{% endtrans %}</a></p>
<h3>{% trans %}Tokens{% endtrans %}</h3>
<ul>
{% for t in launderette.tokens.all() %}
<li>{{ t }}</li>
{% endfor %}
</ul>
<hr>
<h3>{% trans %}Machines{% endtrans %}</h3>
<p><a href="{{ url('launderette:machine_new') }}?launderette={{ launderette.id }}">{% trans %}New machine{% endtrans %}</a></p>
@ -22,6 +16,42 @@
<a href="{{ url('launderette:machine_delete', machine_id=m.id) }}">{% trans %}Delete{% endtrans %}</a></li>
{% endfor %}
</ul>
<hr>
<h3>{% trans %}Tokens{% endtrans %}</h3>
<p>
<form method="post" action="">
{% csrf_token %}
{{ form.as_p() }}
<p><input type="submit" value="{% trans %}Go{% endtrans %}" /></p>
</form>
</p>
<p>
<table>
<thead>
<tr>
<td>{% trans %}Type{% endtrans %}</td>
<td>{% trans %}Name{% endtrans %}</td>
<td>{% trans %}User{% endtrans %}</td>
<td>{% trans %}Since{% endtrans %}</td>
</tr>
</thead>
<tbody>
{% for t in launderette.tokens.all() %}
<tr>
<td>{{ t.get_type_display() }}</td>
<td>{{ t.name }}</td>
{% if t.user %}
<td>{{ t.user.get_display_name() }}</td>
<td>{{ t.borrow_date|date(DATETIME_FORMAT) }} - {{ t.borrow_date|time(DATETIME_FORMAT) }}</td>
{% else %}
<td></td>
<td></td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</p>
{% endblock %}

View File

@ -10,7 +10,7 @@
<h3>{% trans %}Launderette admin list{% endtrans %}</h3>
<ul>
{% for l in launderette_list %}
<li><a href="{{ url('launderette:launderette_details', launderette_id=l.id) }}">{{ l }}</a> -
<li><a href="{{ url('launderette:launderette_admin', launderette_id=l.id) }}">{{ l }}</a> -
<a href="{{ url('launderette:launderette_edit', launderette_id=l.id) }}">{% trans %}Edit{% endtrans %}</a></li>
{% endfor %}
</ul>

View File

@ -10,7 +10,7 @@ urlpatterns = [
url(r'^(?P<launderette_id>[0-9]+)/click$', LaunderetteMainClickView.as_view(), name='main_click'),
url(r'^(?P<launderette_id>[0-9]+)/click/(?P<user_id>[0-9]+)$', LaunderetteClickView.as_view(), name='click'),
url(r'^admin$', LaunderetteListView.as_view(), name='launderette_list'),
url(r'^admin/(?P<launderette_id>[0-9]+)$', LaunderetteDetailView.as_view(), name='launderette_details'),
url(r'^admin/(?P<launderette_id>[0-9]+)$', LaunderetteAdminView.as_view(), name='launderette_admin'),
url(r'^admin/(?P<launderette_id>[0-9]+)/edit$', LaunderetteEditView.as_view(), name='launderette_edit'),
url(r'^admin/new$', LaunderetteCreateView.as_view(), name='launderette_new'),
url(r'^admin/machine/new$', MachineCreateView.as_view(), name='machine_new'),

View File

@ -11,7 +11,7 @@ from django.utils.translation import ugettext as _
from django.utils import dateparse
from django.core.urlresolvers import reverse_lazy
from django.conf import settings
from django.db import transaction
from django.db import transaction, DataError
from django import forms
from django.template import defaultfilters
from django.utils import formats
@ -142,11 +142,82 @@ class LaunderetteCreateView(CanCreateMixin, CreateView):
form.instance.counter = c
return super(LaunderetteCreateView, self).form_valid(form)
class LaunderetteDetailView(CanEditPropMixin, DetailView):
class ManageTokenForm(forms.Form):
action = forms.ChoiceField(choices=[("BACK", _("Back")), ("ADD", _("Add")), ("DEL", _("Delete"))], label=_("Action"))
token_type = forms.ChoiceField(choices=settings.SITH_LAUNDERETTE_MACHINE_TYPES, label=_("Type"))
tokens = forms.CharField(max_length=512, widget=forms.widgets.Textarea, label=_("Tokens, separated by spaces"))
def process(self, launderette):
cleaned_data = self.cleaned_data
token_list = cleaned_data['tokens'].strip(" ").split(" ")
token_type = cleaned_data['token_type']
self.data = {}
if cleaned_data['action'] == "BACK":
for t in token_list:
try:
tok = Token.objects.filter(launderette=launderette, type=token_type, name=t).first()
tok.borrow_date = None
tok.user = None
tok.save()
except:
self.add_error(None, _("Token %(token_name)s does not exists") % {'token_name': t})
elif cleaned_data['action'] == "ADD":
for t in token_list:
try:
Token(launderette=launderette, type=token_type, name=t).save()
except DataError as e:
self.add_error(None, e)
except:
self.add_error(None, _("Token %(token_name)s already exists") % {'token_name': t})
elif cleaned_data['action'] == "DEL":
for t in token_list:
try:
Token.objects.filter(launderette=launderette, type=token_type, name=t).delete()
except:
self.add_error(None, _("Token %(token_name)s does not exists") % {'token_name': t})
class LaunderetteAdminView(CanEditPropMixin, BaseFormView, DetailView):
"""The admin page of the launderette"""
model = Launderette
pk_url_kwarg = "launderette_id"
template_name = 'launderette/launderette_detail.jinja'
template_name = 'launderette/launderette_admin.jinja'
form_class = ManageTokenForm
def get(self, request, *args, **kwargs):
self.object = self.get_object()
return super(LaunderetteAdminView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
return super(LaunderetteAdminView, self).post(request, *args, **kwargs)
form.launderette = self.object
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
"""
We handle here the redirection, passing the user id of the asked customer
"""
form.process(self.object)
if form.is_valid():
return super(LaunderetteAdminView, self).form_valid(form)
else:
return super(LaunderetteAdminView, self).form_invalid(form)
def get_context_data(self, **kwargs):
"""
We handle here the login form for the barman
"""
kwargs = super(LaunderetteAdminView, self).get_context_data(**kwargs)
if self.request.method == "GET":
kwargs['form'] = self.get_form()
return kwargs
def get_success_url(self):
return reverse_lazy('launderette:launderette_admin', args=self.args, kwargs=self.kwargs)
class GetLaunderetteUserForm(GetUserForm):
def clean(self):

Binary file not shown.

View File

@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-02 00:28+0200\n"
"POT-Creation-Date: 2016-08-06 15:08+0200\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,8 +17,8 @@ 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:46 counter/models.py:71
#: counter/models.py:99 launderette/models.py:14 launderette/models.py:42
#: 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"
@ -31,12 +31,12 @@ msgstr "IBAN"
msgid "account number"
msgstr "numero de compte"
#: accounting/models.py:92 club/models.py:109 counter/models.py:253
#: launderette/models.py:87
#: accounting/models.py:92 club/models.py:109 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:254
#: accounting/models.py:93 club/models.py:110 counter/models.py:260
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:24
#: counter/models.py:191
#: accounting/models.py:97 accounting/models.py:136 counter/models.py:25
#: counter/models.py:197
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:194
#: counter/models.py:229 eboutic/models.py:13 eboutic/models.py:46
#: accounting/models.py:137 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:222
#: accounting/models.py:138 accounting/models.py:198 counter/models.py:228
msgid "label"
msgstr "intitulé"
@ -70,7 +70,7 @@ msgstr "intitulé"
msgid "remark"
msgstr "remarque"
#: accounting/models.py:140 counter/models.py:195 eboutic/models.py:48
#: accounting/models.py:140 counter/models.py:201 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:74
#: accounting/models.py:197 counter/models.py:80
msgid "code"
msgstr "code"
@ -158,7 +158,8 @@ 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:22
#: launderette/templates/launderette/launderette_admin.jinja:16
#: launderette/views.py:147
msgid "Delete"
msgstr "Supprimer"
@ -192,6 +193,7 @@ msgid "You can not create new journal while you still have one opened"
msgstr "Vous ne pouvez pas créer de journal tant qu'il y en a un d'ouvert"
#: accounting/templates/accounting/club_account_details.jinja:17
#: launderette/templates/launderette/launderette_admin.jinja:33
msgid "Name"
msgstr "Nom"
@ -205,8 +207,8 @@ msgstr "Fin"
#: accounting/templates/accounting/club_account_details.jinja:20
#: accounting/templates/accounting/journal_details.jinja:23
#: counter/templates/counter/user_account.jinja:17
#: counter/templates/counter/user_account.jinja:63
#: core/templates/core/user_account.jinja:18
#: core/templates/core/user_account.jinja:64
msgid "Amount"
msgstr "Montant"
@ -239,7 +241,7 @@ msgid "View"
msgstr "Voir"
#: accounting/templates/accounting/journal_details.jinja:10
#: counter/templates/counter/user_account.jinja:9
#: core/templates/core/user_account.jinja:10
msgid "Amount: "
msgstr "Montant: "
@ -260,14 +262,14 @@ msgid "Nb"
msgstr "No"
#: accounting/templates/accounting/journal_details.jinja:21
#: counter/templates/counter/user_account.jinja:15
#: counter/templates/counter/user_account.jinja:36
#: counter/templates/counter/user_account.jinja:61
#: core/templates/core/user_account.jinja:16
#: core/templates/core/user_account.jinja:37
#: core/templates/core/user_account.jinja:62
msgid "Date"
msgstr "Date"
#: accounting/templates/accounting/journal_details.jinja:22
#: counter/templates/counter/user_account.jinja:38
#: core/templates/core/user_account.jinja:39
msgid "Label"
msgstr "Intitulé"
@ -316,7 +318,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:69 launderette/models.py:91
#: launderette/models.py:69 launderette/models.py:98
msgid "user"
msgstr "nom d'utilisateur"
@ -328,8 +330,8 @@ msgstr "club"
msgid "role"
msgstr "rôle"
#: club/models.py:113 core/models.py:27 counter/models.py:47
#: counter/models.py:72
#: club/models.py:113 core/models.py:27 counter/models.py:53
#: counter/models.py:78
msgid "description"
msgstr "description"
@ -396,7 +398,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
#: club/templates/club/club_members.jinja:13 launderette/views.py:147
msgid "Add"
msgstr "Ajouter"
@ -511,15 +513,15 @@ msgstr "Duppliquer la page"
msgid "Loop in page tree"
msgstr "Boucle dans l'arborescence des pages"
#: core/models.py:460
#: core/models.py:463
msgid "revision"
msgstr "révision"
#: core/models.py:461
#: core/models.py:464
msgid "page title"
msgstr "titre de la page"
#: core/models.py:462
#: core/models.py:465
msgid "page content"
msgstr "contenu de la page"
@ -632,7 +634,9 @@ 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 ""
@ -683,7 +687,9 @@ 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"
@ -766,7 +772,9 @@ 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: "
@ -791,14 +799,59 @@ 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
msgid "Your username is %(username)s."
msgstr "Votre nom d'utilisateur est %(username)s."
#: core/templates/core/user_account.jinja:4
#, python-format
msgid "%(user_name)s's account"
msgstr "Compte de %(user_name)s"
#: core/templates/core/user_account.jinja:9
msgid "User account"
msgstr "Compte utilisateur"
#: core/templates/core/user_account.jinja:12
msgid "Refillings"
msgstr "Rechargements"
#: core/templates/core/user_account.jinja:17
#: core/templates/core/user_account.jinja:38
msgid "Barman"
msgstr "Barman"
#: core/templates/core/user_account.jinja:33
msgid "Buyings"
msgstr "Achats"
#: core/templates/core/user_account.jinja:40
msgid "Quantity"
msgstr "Quantité"
#: core/templates/core/user_account.jinja:41
msgid "Total"
msgstr "Total"
#: core/templates/core/user_account.jinja:58
msgid "Invoices"
msgstr "Factures"
#: core/templates/core/user_account.jinja:63
msgid "Items"
msgstr "Articles"
#: core/templates/core/user_account.jinja:85
msgid "User has no account"
msgstr "L'utilisateur n'a pas de compte"
#: core/templates/core/user_base.jinja:11
#: core/templates/core/user_tools.jinja:14
msgid "Groups"
@ -822,6 +875,7 @@ msgid "Born: "
msgstr "Né le : "
#: core/templates/core/user_detail.jinja:20
#, python-format
msgid "User is subscriber until %(subscription_end)s"
msgstr "L'utilisateur est cotisant jusqu'au %(subscription_end)s"
@ -905,93 +959,93 @@ msgstr "Comptabilité générale"
msgid "Club account: "
msgstr "Compte club : "
#: counter/models.py:23
#: counter/models.py:24
msgid "account id"
msgstr "numéro de compte"
#: counter/models.py:27
#: counter/models.py:28
msgid "customer"
msgstr "client"
#: counter/models.py:28
#: counter/models.py:29
msgid "customers"
msgstr "clients"
#: counter/models.py:38 counter/templates/counter/counter_click.jinja:46
#: counter/models.py:44 counter/templates/counter/counter_click.jinja:46
msgid "Not enough money"
msgstr "Solde insuffisant"
#: counter/models.py:51 eboutic/models.py:77
#: counter/models.py:57 eboutic/models.py:78
msgid "product type"
msgstr "type du produit"
#: counter/models.py:75
#: counter/models.py:81
msgid "purchase price"
msgstr "prix d'achat"
#: counter/models.py:76
#: counter/models.py:82
msgid "selling price"
msgstr "prix de vente"
#: counter/models.py:77
#: counter/models.py:83
msgid "special selling price"
msgstr "prix de vente spécial"
#: counter/models.py:82
#: counter/models.py:88
msgid "product"
msgstr "produit"
#: counter/models.py:102 subscription/models.py:29
#: counter/models.py:108 subscription/models.py:29
msgid "subscription type"
msgstr "type d'inscription"
#: counter/models.py:104
#: counter/models.py:110
msgid "Bar"
msgstr "Bar"
#: counter/models.py:104
#: counter/models.py:110
msgid "Office"
msgstr "Bureau"
#: counter/models.py:104 eboutic/templates/eboutic/eboutic_main.jinja:20
#: counter/models.py:110 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:105
#: counter/models.py:111
msgid "sellers"
msgstr "vendeurs"
#: counter/models.py:111 launderette/models.py:15
#: counter/models.py:117 launderette/models.py:15
msgid "counter"
msgstr "comptoir"
#: counter/models.py:197
#: counter/models.py:203
msgid "bank"
msgstr "banque"
#: counter/models.py:199 counter/models.py:230
#: counter/models.py:205 counter/models.py:236
msgid "is validated"
msgstr "est validé"
#: counter/models.py:202
#: counter/models.py:208
msgid "refilling"
msgstr "rechargement"
#: counter/models.py:225 eboutic/models.py:78
#: counter/models.py:231 eboutic/models.py:79
msgid "unit price"
msgstr "prix unitaire"
#: counter/models.py:226 eboutic/models.py:79
#: counter/models.py:232 eboutic/models.py:80
msgid "quantity"
msgstr "quantité"
#: counter/models.py:233
#: counter/models.py:239
msgid "selling"
msgstr "vente"
#: counter/models.py:257
#: counter/models.py:263
msgid "permanency"
msgstr "permanence"
@ -1013,12 +1067,13 @@ msgstr "Rechargement"
#: counter/templates/counter/counter_click.jinja:39
#: counter/templates/counter/counter_click.jinja:52
#: launderette/templates/launderette/launderette_admin.jinja:25
#: launderette/templates/launderette/launderette_click.jinja:14
msgid "Go"
msgstr "Valider"
#: counter/templates/counter/counter_click.jinja:44
#: launderette/templates/launderette/launderette_detail.jinja:8
#: launderette/templates/launderette/launderette_admin.jinja:8
msgid "Selling"
msgstr "Vente"
@ -1124,44 +1179,6 @@ msgstr "Nouveau type de produit"
msgid "There is no product types in this website."
msgstr "Il n'y a pas de types de produit dans ce site web."
#: counter/templates/counter/user_account.jinja:4
#, python-format
msgid "%(user_name)s's account"
msgstr "Compte de %(user_name)s"
#: counter/templates/counter/user_account.jinja:8
msgid "User account"
msgstr "Compte utilisateur"
#: counter/templates/counter/user_account.jinja:11
msgid "Refillings"
msgstr "Rechargements"
#: counter/templates/counter/user_account.jinja:16
#: counter/templates/counter/user_account.jinja:37
msgid "Barman"
msgstr "Barman"
#: counter/templates/counter/user_account.jinja:32
msgid "Buyings"
msgstr "Achats"
#: counter/templates/counter/user_account.jinja:39
msgid "Quantity"
msgstr "Quantité"
#: counter/templates/counter/user_account.jinja:40
msgid "Total"
msgstr "Total"
#: counter/templates/counter/user_account.jinja:57
msgid "Invoices"
msgstr "Factures"
#: counter/templates/counter/user_account.jinja:62
msgid "Items"
msgstr "Articles"
#: counter/views.py:48
msgid "User not found"
msgstr "Utilisateur non trouvé"
@ -1178,7 +1195,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:247 sith/settings_sample.py:243
#: eboutic/models.py:47 sith/settings.py:252 sith/settings_sample.py:251
msgid "Credit card"
msgstr "Carte banquaire"
@ -1194,19 +1211,19 @@ msgstr "validé"
msgid "Invoice already validated"
msgstr "Facture déjà validée"
#: eboutic/models.py:75
#: eboutic/models.py:76
msgid "product id"
msgstr "ID du produit"
#: eboutic/models.py:76
#: eboutic/models.py:77
msgid "product name"
msgstr "nom du produit"
#: eboutic/models.py:88
#: eboutic/models.py:89
msgid "basket"
msgstr "panier"
#: eboutic/models.py:91
#: eboutic/models.py:92
msgid "invoice"
msgstr "facture"
@ -1219,8 +1236,11 @@ 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"
@ -1246,20 +1266,10 @@ msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
msgid "launderette"
msgstr "laverie"
#: launderette/models.py:44 launderette/models.py:67 launderette/models.py:88
#: launderette/models.py:44 launderette/models.py:67 launderette/models.py:95
msgid "type"
msgstr "type"
#: 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:44 launderette/models.py:67 launderette/models.py:88
#: launderette/templates/launderette/launderette_book.jinja:30
msgid "Drying"
msgstr "Séchage"
#: launderette/models.py:45
msgid "is working"
msgstr "fonctionne"
@ -1276,18 +1286,55 @@ msgstr "date d'emprunt"
msgid "Token"
msgstr "Jeton"
#: launderette/models.py:89
#: launderette/models.py:78
msgid "Token name can not be blank"
msgstr "Le nom du jeton ne peut pas être vide"
#: launderette/models.py:96
msgid "machine"
msgstr "machine"
#: launderette/models.py:90
#: launderette/models.py:97
msgid "token"
msgstr "jeton"
#: launderette/models.py:94
#: launderette/models.py:101
msgid "Slot"
msgstr "Créneau"
#: launderette/templates/launderette/launderette_admin.jinja:4
msgid "Launderette admin"
msgstr "Gestion de la laverie"
#: launderette/templates/launderette/launderette_admin.jinja:9
msgid "Sell"
msgstr "Vendre"
#: launderette/templates/launderette/launderette_admin.jinja:11
msgid "Machines"
msgstr "Machines"
#: launderette/templates/launderette/launderette_admin.jinja:12
msgid "New machine"
msgstr "Nouvelle machine"
#: launderette/templates/launderette/launderette_admin.jinja:20
msgid "Tokens"
msgstr "Jetons"
#: launderette/templates/launderette/launderette_admin.jinja:32
#: launderette/views.py:148
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"
#: launderette/templates/launderette/launderette_book.jinja:11
msgid "Choose"
msgstr "Choisir"
@ -1296,25 +1343,15 @@ msgstr "Choisir"
msgid "Washing and drying"
msgstr "Lavage et séchage"
#: launderette/templates/launderette/launderette_detail.jinja:4
msgid "Launderette admin"
msgstr "Gestion de la laverie"
#: launderette/templates/launderette/launderette_book.jinja:26
#: sith/settings.py:340 sith/settings_sample.py:339
msgid "Washing"
msgstr "Lavage"
#: 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:18
msgid "New machine"
msgstr "Nouvelle machine"
#: launderette/templates/launderette/launderette_book.jinja:30
#: sith/settings.py:340 sith/settings_sample.py:339
msgid "Drying"
msgstr "Séchage"
#: launderette/templates/launderette/launderette_list.jinja:4
#: launderette/templates/launderette/launderette_list.jinja:10
@ -1337,83 +1374,115 @@ msgstr "Éditer la page de présentation"
msgid "Book launderette slot"
msgstr "Réserver un créneau de laverie"
#: launderette/views.py:156
#: launderette/views.py:147
msgid "Back"
msgstr "Retour"
#: launderette/views.py:147
msgid "Action"
msgstr "Action"
#: launderette/views.py:149
msgid "Tokens, separated by spaces"
msgstr "Jetons, séparés par des espaces"
#: launderette/views.py:164 launderette/views.py:178
msgid "Token %(token_name)s does not exists"
msgstr "Le jeton %(token_name)s n'existe pas"
#: launderette/views.py:172
msgid "Token %(token_name)s already exists"
msgstr "Un jeton %(token_name)s existe déjà"
#: launderette/views.py:230
msgid "User has booked no slot"
msgstr "L'utilisateur n'a pas réservé de créneau"
#: launderette/views.py:246
#: launderette/views.py:320
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
#: 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
msgid "Check"
msgstr "Chèque"
#: 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
#: 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
msgid "Cash"
msgstr "Espèces"
#: sith/settings.py:246 sith/settings_sample.py:242
#: sith/settings.py:251 sith/settings_sample.py:250
msgid "Transfert"
msgstr "Virement"
#: sith/settings.py:253 sith/settings_sample.py:249
#: sith/settings.py:258 sith/settings_sample.py:257
msgid "Other"
msgstr "Autre"
#: sith/settings.py:277 sith/settings_sample.py:273
#: sith/settings.py:262 sith/settings_sample.py:261
msgid "Belfort"
msgstr "Belfort"
#: sith/settings.py:263 sith/settings_sample.py:262
msgid "Sevenans"
msgstr "Sevenans"
#: sith/settings.py:264 sith/settings_sample.py:263
msgid "Montbéliard"
msgstr "Montbéliard"
#: sith/settings.py:288 sith/settings_sample.py:287
msgid "One semester"
msgstr "Un semestre"
#: sith/settings.py:282 sith/settings_sample.py:278
#: sith/settings.py:293 sith/settings_sample.py:292
msgid "Two semesters"
msgstr "Deux semestres"
#: sith/settings.py:287 sith/settings_sample.py:283
#: sith/settings.py:298 sith/settings_sample.py:297
msgid "Common core cursus"
msgstr "Cursus tronc commun"
#: sith/settings.py:292 sith/settings_sample.py:288
#: sith/settings.py:303 sith/settings_sample.py:302
msgid "Branch cursus"
msgstr "Cursus branche"
#: sith/settings.py:300 sith/settings_sample.py:296
#: sith/settings.py:311 sith/settings_sample.py:310
msgid "President"
msgstr "Président"
#: sith/settings.py:301 sith/settings_sample.py:297
#: sith/settings.py:312 sith/settings_sample.py:311
msgid "Vice-President"
msgstr "Vice-Président"
#: sith/settings.py:302 sith/settings_sample.py:298
#: sith/settings.py:313 sith/settings_sample.py:312
msgid "Treasurer"
msgstr "Trésorier"
#: sith/settings.py:303 sith/settings_sample.py:299
#: sith/settings.py:314 sith/settings_sample.py:313
msgid "Communication supervisor"
msgstr "Responsable com"
#: sith/settings.py:304 sith/settings_sample.py:300
#: sith/settings.py:315 sith/settings_sample.py:314
msgid "Secretary"
msgstr "Secrétaire"
#: sith/settings.py:305 sith/settings_sample.py:301
#: sith/settings.py:316 sith/settings_sample.py:315
msgid "IT supervisor"
msgstr "Responsable info"
#: sith/settings.py:306 sith/settings_sample.py:302
#: sith/settings.py:317 sith/settings_sample.py:316
msgid "Board member"
msgstr "Membre du bureau"
#: sith/settings.py:307 sith/settings_sample.py:303
#: sith/settings.py:318 sith/settings_sample.py:317
msgid "Active member"
msgstr "Membre actif"
#: sith/settings.py:308 sith/settings_sample.py:304
#: sith/settings.py:319 sith/settings_sample.py:318
msgid "Curious"
msgstr "Curieux"
@ -1433,21 +1502,23 @@ msgstr "début de la cotisation"
msgid "subscription end"
msgstr "fin de la cotisation"
#: subscription/models.py:44
#: subscription/models.py:36
msgid "location"
msgstr "lieu"
#: subscription/models.py:46
msgid "You can not subscribe many time for the same period"
msgstr "Vous ne pouvez pas cotiser plusieurs fois pour la même période"
#: subscription/models.py:48
#: subscription/models.py:50
msgid "You are trying to create a subscription without member"
msgstr "Vous essayez de créer une cotisation sans membre"
#: subscription/views.py:41
#: subscription/views.py:42
msgid "A user with that email address already exists"
msgstr "Un utilisateur avec cette adresse email existe déjà"
#: subscription/views.py:56
#: 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."
#~ msgid "Product"
#~ msgstr "Produit"

View File

@ -336,6 +336,7 @@ with open('./sith/et_keys/pubkey.pem') as f:
SITH_EBOUTIC_PUB_KEY = f.read()
# Launderette variables
SITH_LAUNDERETTE_MACHINE_TYPES = [('WASHING', _('Washing')), ('DRYING', _('Drying'))]
SITH_LAUNDERETTE_PRICES = {
'WASHING': 1.0,
'DRYING': 0.75,