Finish the launderette click view

This commit is contained in:
Skia 2016-08-02 00:32:55 +02:00
parent 2cf39671e2
commit 7002139176
12 changed files with 330 additions and 171 deletions

View File

@ -17,8 +17,7 @@
{# if the user is member of a club, he can view the subscription state #} {# if the user is member of a club, he can view the subscription state #}
<p> <p>
{% if get_subscriber(profile).is_subscribed() %} {% if get_subscriber(profile).is_subscribed() %}
{% trans subscription_end=get_subscriber(profile).subscriptions.last().subscription_end %} {% trans subscription_end=get_subscriber(profile).subscriptions.last().subscription_end %}User is subscriber until {{ subscription_end }}{% endtrans %}
User is subscriber until {{ subscription_end }}{% endtrans %}
{% else %} {% else %}
{% trans %}User is not subscribed. {% endtrans %} {% trans %}User is not subscribed. {% endtrans %}
<a href="{{ url('subscription:subscription') }}?member={{ profile.id }}">{% trans %}New subscription{% endtrans %}</a> <a href="{{ url('subscription:subscription') }}?member={{ profile.id }}">{% trans %}New subscription{% endtrans %}</a>

View File

@ -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),
),
]

View File

@ -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),
),
]

View File

@ -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.translation import ugettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.forms import ValidationError
from datetime import timedelta from datetime import timedelta
from random import randrange from random import randrange
@ -32,6 +33,11 @@ class Customer(models.Model):
def generate_account_id(): def generate_account_id():
return randrange(0, 4000) # TODO: improve me! 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): class ProductType(models.Model):
""" """
This describes a product type This describes a product type
@ -190,6 +196,7 @@ class Refilling(models.Model):
choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='cash') choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='cash')
bank = models.CharField(_('bank'), max_length=255, bank = models.CharField(_('bank'), max_length=255,
choices=settings.SITH_COUNTER_BANK, default='other') choices=settings.SITH_COUNTER_BANK, default='other')
is_validated = models.BooleanField(_('is validated'), default=False)
class Meta: class Meta:
verbose_name = _("refilling") verbose_name = _("refilling")
@ -202,38 +209,41 @@ class Refilling(models.Model):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.full_clean() self.full_clean()
if not self.is_validated:
self.customer.amount += self.amount self.customer.amount += self.amount
self.customer.save() self.customer.save()
self.is_validated = True
super(Refilling, self).save(*args, **kwargs) super(Refilling, self).save(*args, **kwargs)
class Selling(models.Model): class Selling(models.Model):
""" """
Handle the sellings 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) counter = models.ForeignKey(Counter, related_name="sellings", blank=False)
unit_price = CurrencyField(_('unit price')) unit_price = CurrencyField(_('unit price'))
quantity = models.IntegerField(_('quantity')) quantity = models.IntegerField(_('quantity'))
seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False) seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False)
customer = models.ForeignKey(Customer, related_name="buyings", blank=False) customer = models.ForeignKey(Customer, related_name="buyings", blank=False)
date = models.DateTimeField(_('date'), auto_now=True) date = models.DateTimeField(_('date'), auto_now=True)
is_validated = models.BooleanField(_('is validated'), default=False)
class Meta: class Meta:
verbose_name = _("selling") verbose_name = _("selling")
def __str__(self): 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()) self.quantity*self.unit_price, self.customer.user.get_display_name())
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.full_clean() self.full_clean()
if not self.is_validated:
self.customer.amount -= self.quantity * self.unit_price self.customer.amount -= self.quantity * self.unit_price
self.customer.save() self.customer.save()
self.is_validated = True
super(Selling, self).save(*args, **kwargs) super(Selling, self).save(*args, **kwargs)
# def get_absolute_url(self):
# return reverse('counter:details', kwargs={'counter_id': self.id})
class Permanency(models.Model): class Permanency(models.Model):
""" """
This class aims at storing a traceability of who was barman where and when This class aims at storing a traceability of who was barman where and when

View File

@ -35,7 +35,7 @@
<tr> <tr>
<td>{% trans %}Date{% endtrans %}</td> <td>{% trans %}Date{% endtrans %}</td>
<td>{% trans %}Barman{% endtrans %}</td> <td>{% trans %}Barman{% endtrans %}</td>
<td>{% trans %}Product{% endtrans %}</td> <td>{% trans %}Label{% endtrans %}</td>
<td>{% trans %}Quantity{% endtrans %}</td> <td>{% trans %}Quantity{% endtrans %}</td>
<td>{% trans %}Total{% endtrans %}</td> <td>{% trans %}Total{% endtrans %}</td>
</tr> </tr>
@ -45,7 +45,7 @@
<tr> <tr>
<td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td> <td>{{ i.date|localtime|date(DATETIME_FORMAT) }} - {{ i.date|localtime|time(DATETIME_FORMAT) }}</td>
<td>{{ i.seller }}</td> <td>{{ i.seller }}</td>
<td>{{ i.product }}</td> <td>{{ i.label }}</td>
<td>{{ i.quantity }}</td> <td>{{ i.quantity }}</td>
<td>{{ i.quantity * i.unit_price }} €</td> <td>{{ i.quantity * i.unit_price }} €</td>
</tr> </tr>

View File

@ -13,9 +13,11 @@ from django.conf import settings
from django.db import DataError, transaction from django.db import DataError, transaction
import re import re
from datetime import date, timedelta
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin
from subscription.models import Subscriber from subscription.models import Subscriber
from subscription.views import get_subscriber
from counter.models import Counter, Customer, Product, Selling, Refilling, ProductType from counter.models import Counter, Customer, Product, Selling, Refilling, ProductType
class GetUserForm(forms.Form): class GetUserForm(forms.Form):
@ -28,7 +30,7 @@ class GetUserForm(forms.Form):
""" """
code = forms.CharField(label="Code", max_length=10, required=False) code = forms.CharField(label="Code", max_length=10, required=False)
id = forms.IntegerField(label="ID", 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): def as_p(self):
self.fields['code'].widget.attrs['autofocus'] = True self.fields['code'].widget.attrs['autofocus'] = True
@ -36,14 +38,16 @@ class GetUserForm(forms.Form):
def clean(self): def clean(self):
cleaned_data = super(GetUserForm, self).clean() cleaned_data = super(GetUserForm, self).clean()
user = None cus = None
if cleaned_data['code'] != "": 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: elif cleaned_data['id'] is not None:
user = Customer.objects.filter(user=cleaned_data['id']).first() cus = Customer.objects.filter(user=cleaned_data['id']).first()
if user is None: 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")) 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 return cleaned_data
class RefillForm(forms.ModelForm): class RefillForm(forms.ModelForm):
@ -238,7 +242,7 @@ class CounterClick(DetailView):
if uprice * infos['qty'] > self.customer.amount: if uprice * infos['qty'] > self.customer.amount:
raise DataError(_("You have not enough money to buy all the basket")) raise DataError(_("You have not enough money to buy all the basket"))
request.session['last_basket'].append("%d x %s" % (infos['qty'], p.name)) 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) quantity=infos['qty'], seller=self.operator, customer=self.customer)
s.save() s.save()
request.session['last_customer'] = self.customer.user.get_display_name() request.session['last_customer'] = self.customer.user.get_display_name()

View File

@ -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,
),
]

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', '0008_token_product'),
]
operations = [
migrations.RemoveField(
model_name='token',
name='product',
),
]

View File

@ -80,6 +80,9 @@ class Token(models.Model):
return True return True
return False return False
def __str__(self):
return self.__class__._meta.verbose_name + " " + self.get_type_display() + " #" + self.name + " (" + self.launderette.name + ")"
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=[('WASHING', _('Washing')), ('DRYING', _('Drying'))])
@ -91,9 +94,6 @@ class Slot(models.Model):
verbose_name = _('Slot') verbose_name = _('Slot')
ordering = ['start_date'] ordering = ['start_date']
def full_clean(self):
return super(Slot, self).full_clean()
def __str__(self): def __str__(self):
return "User: %s - Date: %s - Type: %s - Machine: %s - Token: %s" % (self.user, self.start_date, self.get_type_display(), 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) self.machine.name, self.token)

View File

@ -21,7 +21,8 @@ from club.models import Club
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin
from launderette.models import Launderette, Token, Machine, Slot from launderette.models import Launderette, Token, Machine, Slot
from subscription.views import get_subscriber 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 from counter.views import GetUserForm
# For users # For users
@ -147,12 +148,35 @@ class LaunderetteDetailView(CanEditPropMixin, DetailView):
pk_url_kwarg = "launderette_id" pk_url_kwarg = "launderette_id"
template_name = 'launderette/launderette_detail.jinja' 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): class LaunderetteMainClickView(CanEditMixin, BaseFormView, DetailView):
"""The click page of the launderette""" """The click page of the launderette"""
model = Launderette model = Launderette
pk_url_kwarg = "launderette_id" pk_url_kwarg = "launderette_id"
template_name = 'counter/counter_main.jinja' 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): 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) kwargs['new_customer_amount'] = self.request.session.pop('new_customer_amount', None)
return kwargs 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): def get_success_url(self):
return reverse_lazy('launderette:click', args=self.args, kwargs=self.kwargs) return reverse_lazy('launderette:click', args=self.args, kwargs=self.kwargs)
class ClickTokenForm(forms.BaseForm): 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()+""+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()+""+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): class LaunderetteClickView(CanEditMixin, DetailView, BaseFormView):
"""The click page of the launderette""" """The click page of the launderette"""
@ -196,30 +240,29 @@ class LaunderetteClickView(CanEditMixin, DetailView, BaseFormView):
def clean_field(self2): def clean_field(self2):
t_name = str(self2.data[field_name]) t_name = str(self2.data[field_name])
if t_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: if t is None:
raise forms.ValidationError(_("Token not found")) raise forms.ValidationError(_("Token not found"))
return t
return clean_field return clean_field
for s in self.subscriber.slots.filter(token=None).all(): for s in self.subscriber.slots.filter(token=None).all():
field_name = "slot-%s" % (str(s.id)) field_name = "slot-%s" % (str(s.id))
fields[field_name] = forms.CharField(max_length=5, required=False, 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"))) 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) kwargs["clean_"+field_name] = clean_field_factory(field_name, s)
kwargs['subscriber_id'] = self.subscriber.id
def clean_form(self2): kwargs['counter_id'] = self.object.counter.id
raise forms.ValidationError(_("Not enough money")) kwargs['operator_id'] = self.operator.id
return self2.cleaned_data
kwargs['base_fields'] = fields kwargs['base_fields'] = fields
kwargs['clean'] = clean_form
return type('ClickForm', (ClickTokenForm,), kwargs) return type('ClickForm', (ClickTokenForm,), kwargs)
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
"""Simple get view""" """Simple get view"""
self.customer = Customer.objects.filter(user__id=self.kwargs['user_id']).first() self.customer = Customer.objects.filter(user__id=self.kwargs['user_id']).first()
self.subscriber = get_subscriber(self.customer.user) self.subscriber = get_subscriber(self.customer.user)
self.operator = request.user
return super(LaunderetteClickView, self).get(request, *args, **kwargs) return super(LaunderetteClickView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@ -227,13 +270,14 @@ class LaunderetteClickView(CanEditMixin, DetailView, BaseFormView):
self.object = self.get_object() self.object = self.get_object()
self.customer = Customer.objects.filter(user__id=self.kwargs['user_id']).first() self.customer = Customer.objects.filter(user__id=self.kwargs['user_id']).first()
self.subscriber = get_subscriber(self.customer.user) self.subscriber = get_subscriber(self.customer.user)
self.operator = request.user
return super(LaunderetteClickView, self).post(request, *args, **kwargs) return super(LaunderetteClickView, self).post(request, *args, **kwargs)
def form_valid(self, form): def form_valid(self, form):
""" """
We handle here the redirection, passing the user id of the asked customer 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) return super(LaunderetteClickView, self).form_valid(form)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):

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-07-29 12:46+0200\n" "POT-Creation-Date: 2016-08-02 00:28+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,9 +17,9 @@ 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:38 counter/models.py:63 #: club/models.py:18 counter/models.py:46 counter/models.py:71
#: counter/models.py:91 launderette/models.py:12 launderette/models.py:36 #: counter/models.py:99 launderette/models.py:14 launderette/models.py:42
#: launderette/models.py:59 #: 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:237 #: accounting/models.py:92 club/models.py:109 counter/models.py:253
#: launderette/models.py:62 launderette/models.py:76 #: launderette/models.py:87
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:238 #: accounting/models.py:93 club/models.py:110 counter/models.py:254
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:21 #: accounting/models.py:97 accounting/models.py:136 counter/models.py:24
#: counter/models.py:179 #: counter/models.py:191
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:182 #: accounting/models.py:137 core/models.py:463 counter/models.py:194
#: counter/models.py:213 eboutic/models.py:13 eboutic/models.py:46 #: counter/models.py:229 eboutic/models.py:13 eboutic/models.py:46
msgid "date" msgid "date"
msgstr "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" 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:183 eboutic/models.py:48 #: accounting/models.py:140 counter/models.py:195 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:66 #: accounting/models.py:197 counter/models.py:74
msgid "code" msgid "code"
msgstr "code" msgstr "code"
@ -158,7 +158,7 @@ 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:13 #: launderette/templates/launderette/launderette_detail.jinja:22
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
@ -267,6 +267,7 @@ 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
msgid "Label" msgid "Label"
msgstr "Intitulé" 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" 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:80 #: launderette/models.py:69 launderette/models.py:91
msgid "user" msgid "user"
msgstr "nom d'utilisateur" msgstr "nom d'utilisateur"
@ -327,8 +328,8 @@ msgstr "club"
msgid "role" msgid "role"
msgstr "rôle" msgstr "rôle"
#: club/models.py:113 core/models.py:27 counter/models.py:39 #: club/models.py:113 core/models.py:27 counter/models.py:47
#: counter/models.py:64 #: counter/models.py:72
msgid "description" msgid "description"
msgstr "description" msgstr "description"
@ -598,7 +599,7 @@ msgid "Confirm"
msgstr "Confirmation" msgstr "Confirmation"
#: core/templates/core/delete_confirm.jinja:8 #: core/templates/core/delete_confirm.jinja:8
#: counter/templates/counter/counter_click.jinja:67 #: counter/templates/counter/counter_click.jinja:71
msgid "Cancel" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
@ -631,9 +632,7 @@ 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 "" msgstr "Votre nom d'utilisateur et votre mot de passe ne correspondent pas. Merci de réessayer."
"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 ""
@ -684,9 +683,7 @@ 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 "" msgstr "Ceci n'est peut-être pas la dernière version de la page. Vous consultez la version %(rev_id)s."
"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"
@ -769,9 +766,7 @@ 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 "" msgstr "Merci de vous rendre sur la page suivante et de choisir un nouveau mot de passe :"
"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: "
@ -796,11 +791,8 @@ 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 "" msgid "You successfully registred and you will soon receive a confirmation mail."
"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."
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
@ -830,19 +822,14 @@ 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 "" msgstr "L'utilisateur est cotisant jusqu'au %(subscription_end)s"
"\n"
"User is subscriber until %(subscription_end)s"
msgstr ""
"\n"
"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. " msgid "User is not subscribed. "
msgstr "L'utilisateur n'est pas cotisant." 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:4
#: subscription/templates/subscription/subscription.jinja:8 #: subscription/templates/subscription/subscription.jinja:8
msgid "New subscription" msgid "New subscription"
@ -883,7 +870,7 @@ msgid "Subscriptions"
msgstr "Cotisations" msgstr "Cotisations"
#: core/templates/core/user_tools.jinja:19 #: 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.jinja:4
#: launderette/templates/launderette/launderette_book_choose.jinja:4 #: launderette/templates/launderette/launderette_book_choose.jinja:4
#: launderette/templates/launderette/launderette_main.jinja:4 #: launderette/templates/launderette/launderette_main.jinja:4
@ -918,130 +905,140 @@ msgstr "Comptabilité générale"
msgid "Club account: " msgid "Club account: "
msgstr "Compte club : " msgstr "Compte club : "
#: counter/models.py:20 #: counter/models.py:23
msgid "account id" msgid "account id"
msgstr "numéro de compte" msgstr "numéro de compte"
#: counter/models.py:24 #: counter/models.py:27
msgid "customer" msgid "customer"
msgstr "client" msgstr "client"
#: counter/models.py:25 #: counter/models.py:28
msgid "customers" msgid "customers"
msgstr "clients" 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" msgid "product type"
msgstr "type du produit" msgstr "type du produit"
#: counter/models.py:67 #: counter/models.py:75
msgid "purchase price" msgid "purchase price"
msgstr "prix d'achat" msgstr "prix d'achat"
#: counter/models.py:68 #: counter/models.py:76
msgid "selling price" msgid "selling price"
msgstr "prix de vente" msgstr "prix de vente"
#: counter/models.py:69 #: counter/models.py:77
msgid "special selling price" msgid "special selling price"
msgstr "prix de vente spécial" msgstr "prix de vente spécial"
#: counter/models.py:74 #: counter/models.py:82
msgid "product" msgid "product"
msgstr "produit" msgstr "produit"
#: counter/models.py:94 subscription/models.py:29 #: counter/models.py:102 subscription/models.py:29
msgid "subscription type" msgid "subscription type"
msgstr "type d'inscription" msgstr "type d'inscription"
#: counter/models.py:96 #: counter/models.py:104
msgid "Bar" msgid "Bar"
msgstr "Bar" msgstr "Bar"
#: counter/models.py:96 #: counter/models.py:104
msgid "Office" msgid "Office"
msgstr "Bureau" 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_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:102 #: counter/models.py:105
msgid "sellers"
msgstr "vendeurs"
#: counter/models.py:111 launderette/models.py:15
msgid "counter" msgid "counter"
msgstr "comptoir" msgstr "comptoir"
#: counter/models.py:185 #: counter/models.py:197
msgid "bank" msgid "bank"
msgstr "banque" 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" msgid "refilling"
msgstr "rechargement" msgstr "rechargement"
#: counter/models.py:209 eboutic/models.py:78 #: counter/models.py:225 eboutic/models.py:78
msgid "unit price" msgid "unit price"
msgstr "prix unitaire" msgstr "prix unitaire"
#: counter/models.py:210 eboutic/models.py:79 #: counter/models.py:226 eboutic/models.py:79
msgid "quantity" msgid "quantity"
msgstr "quantité" msgstr "quantité"
#: counter/models.py:216 #: counter/models.py:233
msgid "selling" msgid "selling"
msgstr "vente" msgstr "vente"
#: counter/models.py:241 #: counter/models.py:257
msgid "permanency" msgid "permanency"
msgstr "permanence" msgstr "permanence"
#: counter/templates/counter/counter_click.jinja:20 #: counter/templates/counter/counter_click.jinja:24
msgid "Counter" msgid "Counter"
msgstr "Comptoir" msgstr "Comptoir"
#: counter/templates/counter/counter_click.jinja:22 #: counter/templates/counter/counter_click.jinja:26
msgid "Club: " msgid "Club: "
msgstr "Club : " msgstr "Club : "
#: counter/templates/counter/counter_click.jinja:25 #: counter/templates/counter/counter_click.jinja:29
msgid "Customer" msgid "Customer"
msgstr "Client" msgstr "Client"
#: counter/templates/counter/counter_click.jinja:30 #: counter/templates/counter/counter_click.jinja:34
msgid "Refilling" msgid "Refilling"
msgstr "Rechargement" msgstr "Rechargement"
#: counter/templates/counter/counter_click.jinja:35 #: counter/templates/counter/counter_click.jinja:39
#: counter/templates/counter/counter_click.jinja:48 #: counter/templates/counter/counter_click.jinja:52
#: launderette/templates/launderette/launderette_click.jinja:14
msgid "Go" msgid "Go"
msgstr "Valider" 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" msgid "Selling"
msgstr "Vente" msgstr "Vente"
#: counter/templates/counter/counter_click.jinja:42 #: counter/templates/counter/counter_click.jinja:54
msgid "Not enough money"
msgstr "Solde insuffisant"
#: counter/templates/counter/counter_click.jinja:50
#: eboutic/templates/eboutic/eboutic_main.jinja:23 #: eboutic/templates/eboutic/eboutic_main.jinja:23
#: eboutic/templates/eboutic/eboutic_makecommand.jinja:7 #: eboutic/templates/eboutic/eboutic_makecommand.jinja:7
msgid "Basket: " msgid "Basket: "
msgstr "Panier : " msgstr "Panier : "
#: counter/templates/counter/counter_click.jinja:58 #: counter/templates/counter/counter_click.jinja:62
#: counter/templates/counter/counter_main.jinja:24 #: counter/templates/counter/counter_main.jinja:24
#: eboutic/templates/eboutic/eboutic_main.jinja:30 #: eboutic/templates/eboutic/eboutic_main.jinja:30
msgid "Total: " msgid "Total: "
msgstr "Total : " msgstr "Total : "
#: counter/templates/counter/counter_click.jinja:62 #: counter/templates/counter/counter_click.jinja:66
msgid "Finish" msgid "Finish"
msgstr "Terminer" msgstr "Terminer"
#: counter/templates/counter/counter_click.jinja:69 #: counter/templates/counter/counter_click.jinja:73
#: eboutic/templates/eboutic/eboutic_main.jinja:37 #: eboutic/templates/eboutic/eboutic_main.jinja:37
msgid "Products: " msgid "Products: "
msgstr "Produits : " 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." msgstr "Il n'y a pas de comptoirs dans ce site web."
#: counter/templates/counter/counter_main.jinja:12 #: counter/templates/counter/counter_main.jinja:12
#: launderette/templates/launderette/launderette_click.jinja:8
#, python-format #, python-format
msgid "%(counter_name)s counter" msgid "%(counter_name)s counter"
msgstr "Comptoir %(counter_name)s" msgstr "Comptoir %(counter_name)s"
@ -1148,10 +1146,6 @@ msgstr "Barman"
msgid "Buyings" msgid "Buyings"
msgstr "Achats" msgstr "Achats"
#: counter/templates/counter/user_account.jinja:38
msgid "Product"
msgstr "Produit"
#: counter/templates/counter/user_account.jinja:39 #: counter/templates/counter/user_account.jinja:39
msgid "Quantity" msgid "Quantity"
msgstr "Quantité" msgstr "Quantité"
@ -1168,23 +1162,23 @@ msgstr "Factures"
msgid "Items" msgid "Items"
msgstr "Articles" msgstr "Articles"
#: counter/views.py:45 #: counter/views.py:48
msgid "User not found" msgid "User not found"
msgstr "Utilisateur non trouvé" msgstr "Utilisateur non trouvé"
#: counter/views.py:207 #: counter/views.py:211
msgid "END" msgid "END"
msgstr "FIN" msgstr "FIN"
#: counter/views.py:209 #: counter/views.py:213
msgid "CAN" msgid "CAN"
msgstr "ANN" msgstr "ANN"
#: counter/views.py:239 #: counter/views.py:243
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:240 sith/settings_sample.py:243 #: eboutic/models.py:47 sith/settings.py:247 sith/settings_sample.py:243
msgid "Credit card" msgid "Credit card"
msgstr "Carte banquaire" msgstr "Carte banquaire"
@ -1225,11 +1219,8 @@ 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 "" msgid "AE account payment disabled because your basket contains refilling items."
"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."
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"
@ -1251,49 +1242,49 @@ msgstr "Retourner à l'eboutic"
msgid "You do not have enough money to buy the basket" msgid "You do not have enough money to buy 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"
#: launderette/models.py:13 #: launderette/models.py:43 launderette/models.py:66
msgid "sellers"
msgstr "vendeurs"
#: launderette/models.py:37 launderette/models.py:60
msgid "launderette" msgid "launderette"
msgstr "laverie" 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" msgid "type"
msgstr "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 #: launderette/templates/launderette/launderette_book.jinja:26
msgid "Washing" msgid "Washing"
msgstr "Lavage" 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 #: launderette/templates/launderette/launderette_book.jinja:30
msgid "Drying" msgid "Drying"
msgstr "Séchage" msgstr "Séchage"
#: launderette/models.py:39 #: launderette/models.py:45
msgid "is working" msgid "is working"
msgstr "fonctionne" msgstr "fonctionne"
#: launderette/models.py:42 #: launderette/models.py:48
msgid "Machine" msgid "Machine"
msgstr "Machine" msgstr "Machine"
#: launderette/models.py:65 #: launderette/models.py:68
msgid "borrow date"
msgstr "date d'emprunt"
#: launderette/models.py:72
msgid "Token" msgid "Token"
msgstr "Jeton" msgstr "Jeton"
#: launderette/models.py:78 #: launderette/models.py:89
msgid "machine" msgid "machine"
msgstr "machine" msgstr "machine"
#: launderette/models.py:79 #: launderette/models.py:90
msgid "token" msgid "token"
msgstr "jeton" msgstr "jeton"
#: launderette/models.py:83 #: launderette/models.py:94
msgid "Slot" msgid "Slot"
msgstr "Créneau" msgstr "Créneau"
@ -1309,11 +1300,19 @@ msgstr "Lavage et séchage"
msgid "Launderette admin" msgid "Launderette admin"
msgstr "Gestion de la laverie" 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" msgid "Machines"
msgstr "Machines" msgstr "Machines"
#: launderette/templates/launderette/launderette_detail.jinja:9 #: launderette/templates/launderette/launderette_detail.jinja:18
msgid "New machine" msgid "New machine"
msgstr "Nouvelle machine" msgstr "Nouvelle machine"
@ -1338,75 +1337,83 @@ 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"
#: 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:240 sith/settings_sample.py:247
#: sith/settings_sample.py:259 #: sith/settings_sample.py:259
msgid "Check" msgid "Check"
msgstr "Chèque" 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:241 sith/settings_sample.py:248
#: sith/settings_sample.py:260 #: sith/settings_sample.py:260
msgid "Cash" msgid "Cash"
msgstr "Espèces" msgstr "Espèces"
#: sith/settings.py:239 sith/settings_sample.py:242 #: sith/settings.py:246 sith/settings_sample.py:242
msgid "Transfert" msgid "Transfert"
msgstr "Virement" msgstr "Virement"
#: sith/settings.py:246 sith/settings_sample.py:249 #: sith/settings.py:253 sith/settings_sample.py:249
msgid "Other" msgid "Other"
msgstr "Autre" msgstr "Autre"
#: sith/settings.py:270 sith/settings_sample.py:273 #: sith/settings.py:277 sith/settings_sample.py:273
msgid "One semester" msgid "One semester"
msgstr "Un semestre" msgstr "Un semestre"
#: sith/settings.py:275 sith/settings_sample.py:278 #: sith/settings.py:282 sith/settings_sample.py:278
msgid "Two semesters" msgid "Two semesters"
msgstr "Deux semestres" 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" msgid "Common core cursus"
msgstr "Cursus tronc commun" 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" msgid "Branch cursus"
msgstr "Cursus branche" msgstr "Cursus branche"
#: sith/settings.py:293 sith/settings_sample.py:296 #: sith/settings.py:300 sith/settings_sample.py:296
msgid "President" msgid "President"
msgstr "Président" msgstr "Président"
#: sith/settings.py:294 sith/settings_sample.py:297 #: sith/settings.py:301 sith/settings_sample.py:297
msgid "Vice-President" msgid "Vice-President"
msgstr "Vice-Président" msgstr "Vice-Président"
#: sith/settings.py:295 sith/settings_sample.py:298 #: sith/settings.py:302 sith/settings_sample.py:298
msgid "Treasurer" msgid "Treasurer"
msgstr "Trésorier" msgstr "Trésorier"
#: sith/settings.py:296 sith/settings_sample.py:299 #: sith/settings.py:303 sith/settings_sample.py:299
msgid "Communication supervisor" msgid "Communication supervisor"
msgstr "Responsable com" msgstr "Responsable com"
#: sith/settings.py:297 sith/settings_sample.py:300 #: sith/settings.py:304 sith/settings_sample.py:300
msgid "Secretary" msgid "Secretary"
msgstr "Secrétaire" msgstr "Secrétaire"
#: sith/settings.py:298 sith/settings_sample.py:301 #: sith/settings.py:305 sith/settings_sample.py:301
msgid "IT supervisor" msgid "IT supervisor"
msgstr "Responsable info" msgstr "Responsable info"
#: sith/settings.py:299 sith/settings_sample.py:302 #: sith/settings.py:306 sith/settings_sample.py:302
msgid "Board member" msgid "Board member"
msgstr "Membre du bureau" 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" msgid "Active member"
msgstr "Membre actif" msgstr "Membre actif"
#: sith/settings.py:301 sith/settings_sample.py:304 #: sith/settings.py:308 sith/settings_sample.py:304
msgid "Curious" msgid "Curious"
msgstr "Curieux" msgstr "Curieux"
@ -1440,5 +1447,7 @@ msgstr "Un utilisateur avec cette adresse email existe déjà"
#: subscription/views.py:56 #: subscription/views.py:56
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 "" msgstr "Vous devez soit choisir un utilisateur existant, ou en créer un proprement."
"Vous devez soit choisir un utilisateur existant, ou en créer un proprement."
#~ msgid "Product"
#~ msgstr "Produit"