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.utils.translation import ugettext_lazy as _
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@ -41,7 +41,7 @@ class Launderette(models.Model):
class Machine(models.Model): class Machine(models.Model):
name = models.CharField(_('name'), max_length=30) name = models.CharField(_('name'), max_length=30)
launderette = models.ForeignKey(Launderette, related_name='machines', verbose_name=_('launderette')) 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) is_working = models.BooleanField(_('is working'), default=True)
class Meta: class Meta:
@ -59,18 +59,25 @@ class Machine(models.Model):
return "%s %s" % (self._meta.verbose_name, self.name) return "%s %s" % (self._meta.verbose_name, self.name)
def get_absolute_url(self): 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): class Token(models.Model):
name = models.CharField(_('name'), max_length=5) name = models.CharField(_('name'), max_length=5)
launderette = models.ForeignKey(Launderette, related_name='tokens', verbose_name=_('launderette')) 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) borrow_date = models.DateTimeField(_('borrow date'), null=True, blank=True)
user = models.ForeignKey(Subscriber, related_name='tokens', verbose_name=_('user'), null=True, blank=True) user = models.ForeignKey(Subscriber, related_name='tokens', verbose_name=_('user'), null=True, blank=True)
class Meta: class Meta:
verbose_name = _('Token') verbose_name = _('Token')
unique_together = ('name', 'launderette', 'type') 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): def is_owned_by(self, user):
""" """
@ -85,7 +92,7 @@ class Token(models.Model):
class Slot(models.Model): class Slot(models.Model):
start_date = models.DateTimeField(_('start date')) 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')) machine = models.ForeignKey(Machine, related_name='slots', verbose_name=_('machine'))
token = models.ForeignKey(Token, related_name='slots', verbose_name=_('token'), blank=True, null=True) token = models.ForeignKey(Token, related_name='slots', verbose_name=_('token'), blank=True, null=True)
user = models.ForeignKey(Subscriber, related_name='slots', verbose_name=_('user')) user = models.ForeignKey(Subscriber, related_name='slots', verbose_name=_('user'))

View File

@ -7,12 +7,6 @@
{% block content %} {% block content %}
<h3>{% trans %}Selling{% endtrans %}</h3> <h3>{% trans %}Selling{% endtrans %}</h3>
<p><a href="{{ url('launderette:main_click', launderette_id=launderette.id) }}">{% trans %}Sell{% endtrans %}</a></p> <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> <hr>
<h3>{% trans %}Machines{% endtrans %}</h3> <h3>{% trans %}Machines{% endtrans %}</h3>
<p><a href="{{ url('launderette:machine_new') }}?launderette={{ launderette.id }}">{% trans %}New machine{% endtrans %}</a></p> <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> <a href="{{ url('launderette:machine_delete', machine_id=m.id) }}">{% trans %}Delete{% endtrans %}</a></li>
{% endfor %} {% endfor %}
</ul> </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 %} {% endblock %}

View File

@ -10,7 +10,7 @@
<h3>{% trans %}Launderette admin list{% endtrans %}</h3> <h3>{% trans %}Launderette admin list{% endtrans %}</h3>
<ul> <ul>
{% for l in launderette_list %} {% 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> <a href="{{ url('launderette:launderette_edit', launderette_id=l.id) }}">{% trans %}Edit{% endtrans %}</a></li>
{% endfor %} {% endfor %}
</ul> </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$', 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'^(?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$', 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/(?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/new$', LaunderetteCreateView.as_view(), name='launderette_new'),
url(r'^admin/machine/new$', MachineCreateView.as_view(), name='machine_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.utils import dateparse
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from django.conf import settings from django.conf import settings
from django.db import transaction from django.db import transaction, DataError
from django import forms from django import forms
from django.template import defaultfilters from django.template import defaultfilters
from django.utils import formats from django.utils import formats
@ -142,11 +142,82 @@ class LaunderetteCreateView(CanCreateMixin, CreateView):
form.instance.counter = c form.instance.counter = c
return super(LaunderetteCreateView, self).form_valid(form) 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""" """The admin page of the launderette"""
model = Launderette model = Launderette
pk_url_kwarg = "launderette_id" 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): class GetLaunderetteUserForm(GetUserForm):
def clean(self): def clean(self):

Binary file not shown.

View File

@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "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" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Skia <skia@libskia.so>\n" "Last-Translator: Skia <skia@libskia.so>\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@ -17,8 +17,8 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: accounting/models.py:32 accounting/models.py:55 accounting/models.py:94 #: accounting/models.py:32 accounting/models.py:55 accounting/models.py:94
#: club/models.py:18 counter/models.py:46 counter/models.py:71 #: club/models.py:18 counter/models.py:52 counter/models.py:77
#: counter/models.py:99 launderette/models.py:14 launderette/models.py:42 #: counter/models.py:105 launderette/models.py:14 launderette/models.py:42
#: launderette/models.py:65 #: launderette/models.py:65
msgid "name" msgid "name"
msgstr "nom" msgstr "nom"
@ -31,12 +31,12 @@ msgstr "IBAN"
msgid "account number" msgid "account number"
msgstr "numero de compte" msgstr "numero de compte"
#: accounting/models.py:92 club/models.py:109 counter/models.py:253 #: accounting/models.py:92 club/models.py:109 counter/models.py:259
#: launderette/models.py:87 #: launderette/models.py:94
msgid "start date" msgid "start date"
msgstr "date de début" 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" msgid "end date"
msgstr "date de fin" msgstr "date de fin"
@ -44,8 +44,8 @@ msgstr "date de fin"
msgid "is closed" msgid "is closed"
msgstr "est fermé" msgstr "est fermé"
#: accounting/models.py:97 accounting/models.py:136 counter/models.py:24 #: accounting/models.py:97 accounting/models.py:136 counter/models.py:25
#: counter/models.py:191 #: counter/models.py:197
msgid "amount" msgid "amount"
msgstr "montant" msgstr "montant"
@ -57,12 +57,12 @@ msgstr "montant effectif"
msgid "number" msgid "number"
msgstr "numéro" msgstr "numéro"
#: accounting/models.py:137 core/models.py:463 counter/models.py:194 #: accounting/models.py:137 core/models.py:466 counter/models.py:200
#: counter/models.py:229 eboutic/models.py:13 eboutic/models.py:46 #: counter/models.py:235 eboutic/models.py:13 eboutic/models.py:46
msgid "date" msgid "date"
msgstr "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" msgid "label"
msgstr "intitulé" msgstr "intitulé"
@ -70,7 +70,7 @@ msgstr "intitulé"
msgid "remark" msgid "remark"
msgstr "remarque" 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 #: subscription/models.py:34
msgid "payment method" msgid "payment method"
msgstr "méthode de paiement" 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" "La date ne peut pas être avant la date de début du journal, qui est\n"
"%(start_date)s." "%(start_date)s."
#: accounting/models.py:197 counter/models.py:74 #: accounting/models.py:197 counter/models.py:80
msgid "code" msgid "code"
msgstr "code" msgstr "code"
@ -158,7 +158,8 @@ msgstr "Éditer"
#: accounting/templates/accounting/bank_account_details.jinja:19 #: accounting/templates/accounting/bank_account_details.jinja:19
#: accounting/templates/accounting/bank_account_list.jinja:16 #: accounting/templates/accounting/bank_account_list.jinja:16
#: core/templates/core/group_list.jinja:13 #: 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" msgid "Delete"
msgstr "Supprimer" 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" 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 #: accounting/templates/accounting/club_account_details.jinja:17
#: launderette/templates/launderette/launderette_admin.jinja:33
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
@ -205,8 +207,8 @@ msgstr "Fin"
#: accounting/templates/accounting/club_account_details.jinja:20 #: accounting/templates/accounting/club_account_details.jinja:20
#: accounting/templates/accounting/journal_details.jinja:23 #: accounting/templates/accounting/journal_details.jinja:23
#: counter/templates/counter/user_account.jinja:17 #: core/templates/core/user_account.jinja:18
#: counter/templates/counter/user_account.jinja:63 #: core/templates/core/user_account.jinja:64
msgid "Amount" msgid "Amount"
msgstr "Montant" msgstr "Montant"
@ -239,7 +241,7 @@ msgid "View"
msgstr "Voir" msgstr "Voir"
#: accounting/templates/accounting/journal_details.jinja:10 #: accounting/templates/accounting/journal_details.jinja:10
#: counter/templates/counter/user_account.jinja:9 #: core/templates/core/user_account.jinja:10
msgid "Amount: " msgid "Amount: "
msgstr "Montant: " msgstr "Montant: "
@ -260,14 +262,14 @@ msgid "Nb"
msgstr "No" msgstr "No"
#: accounting/templates/accounting/journal_details.jinja:21 #: accounting/templates/accounting/journal_details.jinja:21
#: counter/templates/counter/user_account.jinja:15 #: core/templates/core/user_account.jinja:16
#: counter/templates/counter/user_account.jinja:36 #: core/templates/core/user_account.jinja:37
#: counter/templates/counter/user_account.jinja:61 #: core/templates/core/user_account.jinja:62
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
#: accounting/templates/accounting/journal_details.jinja:22 #: accounting/templates/accounting/journal_details.jinja:22
#: counter/templates/counter/user_account.jinja:38 #: core/templates/core/user_account.jinja:39
msgid "Label" msgid "Label"
msgstr "Intitulé" 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" 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: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" msgid "user"
msgstr "nom d'utilisateur" msgstr "nom d'utilisateur"
@ -328,8 +330,8 @@ msgstr "club"
msgid "role" msgid "role"
msgstr "rôle" msgstr "rôle"
#: club/models.py:113 core/models.py:27 counter/models.py:47 #: club/models.py:113 core/models.py:27 counter/models.py:53
#: counter/models.py:72 #: counter/models.py:78
msgid "description" msgid "description"
msgstr "description" msgstr "description"
@ -396,7 +398,7 @@ msgstr "Il n'y a pas de club dans ce site web."
msgid "Club members" msgid "Club members"
msgstr "Membres du club" msgstr "Membres du club"
#: club/templates/club/club_members.jinja:13 #: club/templates/club/club_members.jinja:13 launderette/views.py:147
msgid "Add" msgid "Add"
msgstr "Ajouter" msgstr "Ajouter"
@ -511,15 +513,15 @@ msgstr "Duppliquer la page"
msgid "Loop in page tree" msgid "Loop in page tree"
msgstr "Boucle dans l'arborescence des pages" msgstr "Boucle dans l'arborescence des pages"
#: core/models.py:460 #: core/models.py:463
msgid "revision" msgid "revision"
msgstr "révision" msgstr "révision"
#: core/models.py:461 #: core/models.py:464
msgid "page title" msgid "page title"
msgstr "titre de la page" msgstr "titre de la page"
#: core/models.py:462 #: core/models.py:465
msgid "page content" msgid "page content"
msgstr "contenu de la page" 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 #: core/templates/core/login.jinja:6
msgid "Your username and password didn't match. Please try again." 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 #: core/templates/core/login.jinja:11
msgid "" msgid ""
@ -683,7 +687,9 @@ msgstr "La créer ?"
#: core/templates/core/page_detail.jinja:5 #: core/templates/core/page_detail.jinja:5
#, python-format #, python-format
msgid "This may not be the last update, you are seeing revision %(rev_id)s!" 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 #: core/templates/core/page_hist.jinja:6
msgid "Page history" msgid "Page history"
@ -766,7 +772,9 @@ msgstr ""
#: core/templates/core/password_reset_email.jinja:4 #: core/templates/core/password_reset_email.jinja:4
msgid "Please go to the following page and choose a new password:" 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 #: core/templates/core/password_reset_email.jinja:8
msgid "Your username, in case you've forgotten: " msgid "Your username, in case you've forgotten: "
@ -791,14 +799,59 @@ msgid "Welcome %(user_name)s!"
msgstr "Bienvenue, %(user_name)s!" msgstr "Bienvenue, %(user_name)s!"
#: core/templates/core/register.jinja:10 #: core/templates/core/register.jinja:10
msgid "You successfully registred and you will soon receive a confirmation mail." msgid ""
msgstr "Vous vous êtes correctement enregistré, et vous devriez recevoir rapidement un email de confirmation." "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 #: core/templates/core/register.jinja:12
#, python-format #, python-format
msgid "Your username is %(username)s." msgid "Your username is %(username)s."
msgstr "Votre nom d'utilisateur est %(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_base.jinja:11
#: core/templates/core/user_tools.jinja:14 #: core/templates/core/user_tools.jinja:14
msgid "Groups" msgid "Groups"
@ -822,6 +875,7 @@ msgid "Born: "
msgstr "Né le : " msgstr "Né le : "
#: core/templates/core/user_detail.jinja:20 #: core/templates/core/user_detail.jinja:20
#, python-format
msgid "User is subscriber until %(subscription_end)s" msgid "User is subscriber until %(subscription_end)s"
msgstr "L'utilisateur est cotisant jusqu'au %(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: " msgid "Club account: "
msgstr "Compte club : " msgstr "Compte club : "
#: counter/models.py:23 #: counter/models.py:24
msgid "account id" msgid "account id"
msgstr "numéro de compte" msgstr "numéro de compte"
#: counter/models.py:27 #: counter/models.py:28
msgid "customer" msgid "customer"
msgstr "client" msgstr "client"
#: counter/models.py:28 #: counter/models.py:29
msgid "customers" msgid "customers"
msgstr "clients" 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" msgid "Not enough money"
msgstr "Solde insuffisant" msgstr "Solde insuffisant"
#: counter/models.py:51 eboutic/models.py:77 #: counter/models.py:57 eboutic/models.py:78
msgid "product type" msgid "product type"
msgstr "type du produit" msgstr "type du produit"
#: counter/models.py:75 #: counter/models.py:81
msgid "purchase price" msgid "purchase price"
msgstr "prix d'achat" msgstr "prix d'achat"
#: counter/models.py:76 #: counter/models.py:82
msgid "selling price" msgid "selling price"
msgstr "prix de vente" msgstr "prix de vente"
#: counter/models.py:77 #: counter/models.py:83
msgid "special selling price" msgid "special selling price"
msgstr "prix de vente spécial" msgstr "prix de vente spécial"
#: counter/models.py:82 #: counter/models.py:88
msgid "product" msgid "product"
msgstr "produit" msgstr "produit"
#: counter/models.py:102 subscription/models.py:29 #: counter/models.py:108 subscription/models.py:29
msgid "subscription type" msgid "subscription type"
msgstr "type d'inscription" msgstr "type d'inscription"
#: counter/models.py:104 #: counter/models.py:110
msgid "Bar" msgid "Bar"
msgstr "Bar" msgstr "Bar"
#: counter/models.py:104 #: counter/models.py:110
msgid "Office" msgid "Office"
msgstr "Bureau" 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_makecommand.jinja:4
#: eboutic/templates/eboutic/eboutic_payment_result.jinja:4 #: eboutic/templates/eboutic/eboutic_payment_result.jinja:4
msgid "Eboutic" msgid "Eboutic"
msgstr "Eboutic" msgstr "Eboutic"
#: counter/models.py:105 #: counter/models.py:111
msgid "sellers" msgid "sellers"
msgstr "vendeurs" msgstr "vendeurs"
#: counter/models.py:111 launderette/models.py:15 #: counter/models.py:117 launderette/models.py:15
msgid "counter" msgid "counter"
msgstr "comptoir" msgstr "comptoir"
#: counter/models.py:197 #: counter/models.py:203
msgid "bank" msgid "bank"
msgstr "banque" msgstr "banque"
#: counter/models.py:199 counter/models.py:230 #: counter/models.py:205 counter/models.py:236
msgid "is validated" msgid "is validated"
msgstr "est validé" msgstr "est validé"
#: counter/models.py:202 #: counter/models.py:208
msgid "refilling" msgid "refilling"
msgstr "rechargement" msgstr "rechargement"
#: counter/models.py:225 eboutic/models.py:78 #: counter/models.py:231 eboutic/models.py:79
msgid "unit price" msgid "unit price"
msgstr "prix unitaire" msgstr "prix unitaire"
#: counter/models.py:226 eboutic/models.py:79 #: counter/models.py:232 eboutic/models.py:80
msgid "quantity" msgid "quantity"
msgstr "quantité" msgstr "quantité"
#: counter/models.py:233 #: counter/models.py:239
msgid "selling" msgid "selling"
msgstr "vente" msgstr "vente"
#: counter/models.py:257 #: counter/models.py:263
msgid "permanency" msgid "permanency"
msgstr "permanence" msgstr "permanence"
@ -1013,12 +1067,13 @@ msgstr "Rechargement"
#: counter/templates/counter/counter_click.jinja:39 #: counter/templates/counter/counter_click.jinja:39
#: counter/templates/counter/counter_click.jinja:52 #: counter/templates/counter/counter_click.jinja:52
#: launderette/templates/launderette/launderette_admin.jinja:25
#: launderette/templates/launderette/launderette_click.jinja:14 #: launderette/templates/launderette/launderette_click.jinja:14
msgid "Go" msgid "Go"
msgstr "Valider" msgstr "Valider"
#: counter/templates/counter/counter_click.jinja:44 #: counter/templates/counter/counter_click.jinja:44
#: launderette/templates/launderette/launderette_detail.jinja:8 #: launderette/templates/launderette/launderette_admin.jinja:8
msgid "Selling" msgid "Selling"
msgstr "Vente" msgstr "Vente"
@ -1124,44 +1179,6 @@ msgstr "Nouveau type de produit"
msgid "There is no product types in this website." msgid "There is no product types in this website."
msgstr "Il n'y a pas de types de produit dans ce site web." 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 #: counter/views.py:48
msgid "User not found" msgid "User not found"
msgstr "Utilisateur non trouvé" msgstr "Utilisateur non trouvé"
@ -1178,7 +1195,7 @@ msgstr "ANN"
msgid "You have not enough money to buy all the basket" msgid "You have not enough money to buy all the basket"
msgstr "Vous n'avez pas assez d'argent pour acheter le panier" 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" msgid "Credit card"
msgstr "Carte banquaire" msgstr "Carte banquaire"
@ -1194,19 +1211,19 @@ msgstr "validé"
msgid "Invoice already validated" msgid "Invoice already validated"
msgstr "Facture déjà validée" msgstr "Facture déjà validée"
#: eboutic/models.py:75 #: eboutic/models.py:76
msgid "product id" msgid "product id"
msgstr "ID du produit" msgstr "ID du produit"
#: eboutic/models.py:76 #: eboutic/models.py:77
msgid "product name" msgid "product name"
msgstr "nom du produit" msgstr "nom du produit"
#: eboutic/models.py:88 #: eboutic/models.py:89
msgid "basket" msgid "basket"
msgstr "panier" msgstr "panier"
#: eboutic/models.py:91 #: eboutic/models.py:92
msgid "invoice" msgid "invoice"
msgstr "facture" msgstr "facture"
@ -1219,8 +1236,11 @@ msgid "Pay with credit card"
msgstr "Payer avec une carte banquaire" msgstr "Payer avec une carte banquaire"
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:34 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:34
msgid "AE account payment disabled because your basket contains refilling items." msgid ""
msgstr "Paiement par compte AE désactivé parce que votre panier contient des bons de rechargement." "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 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:39
msgid "Pay with Sith account" msgid "Pay with Sith account"
@ -1246,20 +1266,10 @@ msgstr "Vous n'avez pas assez d'argent pour acheter le panier"
msgid "launderette" msgid "launderette"
msgstr "laverie" 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" msgid "type"
msgstr "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 #: launderette/models.py:45
msgid "is working" msgid "is working"
msgstr "fonctionne" msgstr "fonctionne"
@ -1276,18 +1286,55 @@ msgstr "date d'emprunt"
msgid "Token" msgid "Token"
msgstr "Jeton" 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" msgid "machine"
msgstr "machine" msgstr "machine"
#: launderette/models.py:90 #: launderette/models.py:97
msgid "token" msgid "token"
msgstr "jeton" msgstr "jeton"
#: launderette/models.py:94 #: launderette/models.py:101
msgid "Slot" msgid "Slot"
msgstr "Créneau" 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 #: launderette/templates/launderette/launderette_book.jinja:11
msgid "Choose" msgid "Choose"
msgstr "Choisir" msgstr "Choisir"
@ -1296,25 +1343,15 @@ msgstr "Choisir"
msgid "Washing and drying" msgid "Washing and drying"
msgstr "Lavage et séchage" msgstr "Lavage et séchage"
#: launderette/templates/launderette/launderette_detail.jinja:4 #: launderette/templates/launderette/launderette_book.jinja:26
msgid "Launderette admin" #: sith/settings.py:340 sith/settings_sample.py:339
msgstr "Gestion de la laverie" msgid "Washing"
msgstr "Lavage"
#: launderette/templates/launderette/launderette_detail.jinja:9 #: launderette/templates/launderette/launderette_book.jinja:30
msgid "Sell" #: sith/settings.py:340 sith/settings_sample.py:339
msgstr "Vendre" msgid "Drying"
msgstr "Séchage"
#: 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_list.jinja:4 #: launderette/templates/launderette/launderette_list.jinja:4
#: launderette/templates/launderette/launderette_list.jinja:10 #: launderette/templates/launderette/launderette_list.jinja:10
@ -1337,83 +1374,115 @@ msgstr "Éditer la page de présentation"
msgid "Book launderette slot" msgid "Book launderette slot"
msgstr "Réserver un créneau de laverie" 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" msgid "User has booked no slot"
msgstr "L'utilisateur n'a pas réservé de créneau" msgstr "L'utilisateur n'a pas réservé de créneau"
#: launderette/views.py:246 #: launderette/views.py:320
msgid "Token not found" msgid "Token not found"
msgstr "Jeton non trouvé" msgstr "Jeton non trouvé"
#: sith/settings.py:244 sith/settings.py:251 sith/settings.py:263 #: sith/settings.py:249 sith/settings.py:256 sith/settings.py:274
#: sith/settings_sample.py:240 sith/settings_sample.py:247 #: sith/settings_sample.py:248 sith/settings_sample.py:255
#: sith/settings_sample.py:259 #: sith/settings_sample.py:273
msgid "Check" msgid "Check"
msgstr "Chèque" msgstr "Chèque"
#: sith/settings.py:245 sith/settings.py:252 sith/settings.py:264 #: sith/settings.py:250 sith/settings.py:257 sith/settings.py:275
#: sith/settings_sample.py:241 sith/settings_sample.py:248 #: sith/settings_sample.py:249 sith/settings_sample.py:256
#: sith/settings_sample.py:260 #: sith/settings_sample.py:274
msgid "Cash" msgid "Cash"
msgstr "Espèces" msgstr "Espèces"
#: sith/settings.py:246 sith/settings_sample.py:242 #: sith/settings.py:251 sith/settings_sample.py:250
msgid "Transfert" msgid "Transfert"
msgstr "Virement" msgstr "Virement"
#: sith/settings.py:253 sith/settings_sample.py:249 #: sith/settings.py:258 sith/settings_sample.py:257
msgid "Other" msgid "Other"
msgstr "Autre" 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" msgid "One semester"
msgstr "Un semestre" msgstr "Un semestre"
#: sith/settings.py:282 sith/settings_sample.py:278 #: sith/settings.py:293 sith/settings_sample.py:292
msgid "Two semesters" msgid "Two semesters"
msgstr "Deux semestres" 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" msgid "Common core cursus"
msgstr "Cursus tronc commun" 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" msgid "Branch cursus"
msgstr "Cursus branche" msgstr "Cursus branche"
#: sith/settings.py:300 sith/settings_sample.py:296 #: sith/settings.py:311 sith/settings_sample.py:310
msgid "President" msgid "President"
msgstr "Président" msgstr "Président"
#: sith/settings.py:301 sith/settings_sample.py:297 #: sith/settings.py:312 sith/settings_sample.py:311
msgid "Vice-President" msgid "Vice-President"
msgstr "Vice-Président" msgstr "Vice-Président"
#: sith/settings.py:302 sith/settings_sample.py:298 #: sith/settings.py:313 sith/settings_sample.py:312
msgid "Treasurer" msgid "Treasurer"
msgstr "Trésorier" msgstr "Trésorier"
#: sith/settings.py:303 sith/settings_sample.py:299 #: sith/settings.py:314 sith/settings_sample.py:313
msgid "Communication supervisor" msgid "Communication supervisor"
msgstr "Responsable com" msgstr "Responsable com"
#: sith/settings.py:304 sith/settings_sample.py:300 #: sith/settings.py:315 sith/settings_sample.py:314
msgid "Secretary" msgid "Secretary"
msgstr "Secrétaire" msgstr "Secrétaire"
#: sith/settings.py:305 sith/settings_sample.py:301 #: sith/settings.py:316 sith/settings_sample.py:315
msgid "IT supervisor" msgid "IT supervisor"
msgstr "Responsable info" msgstr "Responsable info"
#: sith/settings.py:306 sith/settings_sample.py:302 #: sith/settings.py:317 sith/settings_sample.py:316
msgid "Board member" msgid "Board member"
msgstr "Membre du bureau" 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" msgid "Active member"
msgstr "Membre actif" msgstr "Membre actif"
#: sith/settings.py:308 sith/settings_sample.py:304 #: sith/settings.py:319 sith/settings_sample.py:318
msgid "Curious" msgid "Curious"
msgstr "Curieux" msgstr "Curieux"
@ -1433,21 +1502,23 @@ msgstr "début de la cotisation"
msgid "subscription end" msgid "subscription end"
msgstr "fin de la cotisation" 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" 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" 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" msgid "You are trying to create a subscription without member"
msgstr "Vous essayez de créer une cotisation sans membre" 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" msgid "A user with that email address already exists"
msgstr "Un utilisateur avec cette adresse email existe déjà" 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" 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"

View File

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