Commit f1105d70 authored by Skia's avatar Skia

Add basic search bar

parent 0689f864
Pipeline #122 failed with stage
in 3 minutes and 2 seconds
...@@ -26,7 +26,11 @@ header a { ...@@ -26,7 +26,11 @@ header a {
header a:hover { header a:hover {
color: #2D3; color: #2D3;
} }
header form {
display: inline-block;
padding: 1em;
width: 150px;
}
#popupheader { #popupheader {
width: 88%; width: 88%;
margin: 0px auto; margin: 0px auto;
...@@ -185,6 +189,24 @@ tbody>tr:hover { ...@@ -185,6 +189,24 @@ tbody>tr:hover {
#user_profile .promo_pict { #user_profile .promo_pict {
height: 45px; height: 45px;
} }
.mini_profile_link {
display: block;
text-decoration: none;
}
.mini_profile_link span {
display: inline-block;
width: 50px;
vertical-align: middle;
}
.mini_profile_link em {
vertical-align: middle;
}
.mini_profile_link img {
max-width: 40px;
max-height: 60px;
margin: 2px auto;
display: block;
}
/*---------------------------------PAGE--------------------------------*/ /*---------------------------------PAGE--------------------------------*/
.page_content { .page_content {
display: block; display: block;
......
...@@ -24,6 +24,10 @@ ...@@ -24,6 +24,10 @@
<a href="{{ url('core:user_profile', user_id=user.id) }}">{{ user.get_display_name() }}</a> | <a href="{{ url('core:user_profile', user_id=user.id) }}">{{ user.get_display_name() }}</a> |
<a href="{{ url('core:user_tools') }}">{% trans %}Tools{% endtrans %}</a> | <a href="{{ url('core:user_tools') }}">{% trans %}Tools{% endtrans %}</a> |
<a href="{{ url('core:logout') }}">{% trans %}Logout{% endtrans %}</a> <a href="{{ url('core:logout') }}">{% trans %}Logout{% endtrans %}</a>
<form action="{{ url('core:search') }}" method="GET">
<input type="text" placeholder="{% trans %}Search{% endtrans %}" name="query" />
<input type="submit" value="{% trans %}Search{% endtrans %}" style="display: none;" />
</form>
{% endif %} {% endif %}
</header> </header>
{% else %} {% else %}
......
{% extends "core/base.jinja" %} {% extends "core/base.jinja" %}
{% block title %}{{ title }}{% endblock %} {% block title %}
{% trans %}Welcome!{% endtrans %}
{% endblock %}
{% block content %} {% block content %}
{% trans %}Hello, world. You're at the core index using Jinja2.{% endtrans %} {% trans %}Hello, world. You're at the core index using Jinja2.{% endtrans %}
{% endblock %} {% endblock %}
{% macro user_profile_link(user) -%} {% macro user_profile_link(user) -%}
<a href="{{ url("core:user_profile", user_id=user.id) }}">{{ user.get_display_name() }}</a> <a href="{{ url("core:user_profile", user_id=user.id) }}">{{ user.get_display_name() }}</a>
{%- endmacro %} {%- endmacro %}
{% macro user_link_with_pict(user) -%}
<a href="{{ url("core:user_profile", user_id=user.id) }}" class="mini_profile_link" >
<span>
{% if user.profile_pict %}
<img src="{{ user.profile_pict.get_download_url() }}" alt="{% trans %}Profile{% endtrans %}" />
{% else %}
<img src="{{ static('core/img/na.gif') }}" alt="{% trans %}Profile{% endtrans %}" />
{% endif %}
</span>
<em>{{ user.get_display_name() }}</em>
</a>
{%- endmacro %}
{% extends "core/base.jinja" %}
{% from "core/macros.jinja" import user_link_with_pict %}
{% block title %}
{% trans %}Search result{% endtrans %}
{% endblock %}
{% block content %}
<h4>{% trans %}Users{% endtrans %}</h4>
<ul>
{% for i in result.users %}
<li>
{{ user_link_with_pict(i) }}
</li>
{% endfor %}
</ul>
<h4>{% trans %}Clubs{% endtrans %}</h4>
<ul>
{% for i in result.clubs %}
<li>
<a href="{{ url("club:club_view", club_id=i.id) }}">{{ i }}</a>
</li>
{% endfor %}
</ul>
{% endblock %}
...@@ -8,9 +8,10 @@ ...@@ -8,9 +8,10 @@
{% if profile.permanencies %} {% if profile.permanencies %}
<div> <div>
<h3>Permanencies</h3> <h3>Permanencies</h3>
<p> <p>Total: {{ total_perm_time }}</p>
{{ total_time }} <p>Foyer: {{ total_foyer_time }}</p>
</p> <p>MDE: {{ total_mde_time }}</p>
<p>La Gommette: {{ total_gommette_time }}</p>
</div> </div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}
......
...@@ -4,6 +4,8 @@ from core.views import * ...@@ -4,6 +4,8 @@ from core.views import *
urlpatterns = [ urlpatterns = [
url(r'^$', index, name='index'), url(r'^$', index, name='index'),
url(r'^search/$', search_view, name='search'),
url(r'^search_json/$', search_json, name='search_json'),
# Login and co # Login and co
url(r'^login/$', login, name='login'), url(r'^login/$', login, name='login'),
...@@ -50,5 +52,4 @@ urlpatterns = [ ...@@ -50,5 +52,4 @@ urlpatterns = [
url(r'^page/(?P<page_name>[a-z0-9/-_]*)/hist$', PageHistView.as_view(), name='page_hist'), url(r'^page/(?P<page_name>[a-z0-9/-_]*)/hist$', PageHistView.as_view(), name='page_hist'),
url(r'^page/(?P<page_name>[a-z0-9/-_]*)/rev/(?P<rev>[0-9]+)/', PageRevView.as_view(), name='page_rev'), url(r'^page/(?P<page_name>[a-z0-9/-_]*)/rev/(?P<rev>[0-9]+)/', PageRevView.as_view(), name='page_rev'),
url(r'^page/(?P<page_name>[a-z0-9/-_]*)/$', PageView.as_view(), name='page'), url(r'^page/(?P<page_name>[a-z0-9/-_]*)/$', PageView.as_view(), name='page'),
] ]
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.db import models from django.db import models
from django.http import JsonResponse
from django.core import serializers
from django.db.models import Q
from django.contrib.auth.decorators import login_required
import os import os
import json
from itertools import chain
from core.models import User
from club.models import Club
def index(request, context=None): def index(request, context=None):
if context == None: return render(request, "core/index.jinja")
return render(request, "core/index.jinja", {'title': 'Bienvenue!'})
else: def search(query, as_json=False):
return render(request, "core/index.jinja", context) result = {'users': None, 'clubs': None}
if query:
nicks = User.objects.filter(nick_name__icontains=query).all()
users = User.objects.filter(Q(first_name__icontains=query) | Q(last_name__icontains=query)).all()
clubs = Club.objects.filter(name__icontains=query).all()
nicks = nicks[:5]
users = users[:5]
clubs = clubs[:5]
if as_json: # Re-loads json to avoid double encoding by JsonResponse, but still benefit from serializers
nicks = json.loads(serializers.serialize('json', nicks, fields=('nick_name', 'last_name', 'first_name', 'profile_pict')))
users = json.loads(serializers.serialize('json', users, fields=('nick_name', 'last_name', 'first_name', 'profile_pict')))
clubs = json.loads(serializers.serialize('json', clubs, fields=('name')))
else:
nicks = list(nicks.all())
users = list(users.all())
clubs = list(clubs.all())
result['users'] = nicks + users
result['clubs'] = clubs
return result
@login_required
def search_view(request):
return render(request, "core/search.jinja", context={'result': search(request.GET.get('query', ''))})
@login_required
def search_json(request):
return JsonResponse(search(request.GET.get('query', ''), True))
...@@ -134,7 +134,14 @@ class UserStatsView(CanViewMixin, DetailView): ...@@ -134,7 +134,14 @@ class UserStatsView(CanViewMixin, DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super(UserStatsView, self).get_context_data(**kwargs) kwargs = super(UserStatsView, self).get_context_data(**kwargs)
kwargs['total_time'] = sum([p.end-p.start for p in self.object.permanencies.all()], timedelta()) from counter.models import Counter
foyer = Counter.objects.filter(name="Foyer").first()
mde = Counter.objects.filter(name="MDE").first()
gommette = Counter.objects.filter(name="La Gommette").first()
kwargs['total_perm_time'] = sum([p.end-p.start for p in self.object.permanencies.all()], timedelta())
kwargs['total_foyer_time'] = sum([p.end-p.start for p in self.object.permanencies.filter(counter=foyer)], timedelta())
kwargs['total_mde_time'] = sum([p.end-p.start for p in self.object.permanencies.filter(counter=mde)], timedelta())
kwargs['total_gommette_time'] = sum([p.end-p.start for p in self.object.permanencies.filter(counter=gommette)], timedelta())
return kwargs return kwargs
class UserMiniView(CanViewMixin, DetailView): class UserMiniView(CanViewMixin, DetailView):
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-08-18 17:40+0200\n" "POT-Creation-Date: 2016-08-19 01:43+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"
...@@ -40,12 +40,12 @@ msgstr "numero de compte" ...@@ -40,12 +40,12 @@ msgstr "numero de compte"
msgid "%(club_account)s on %(bank_account)s" msgid "%(club_account)s on %(bank_account)s"
msgstr "%(club_account)s sur %(bank_account)s" msgstr "%(club_account)s sur %(bank_account)s"
#: accounting/models.py:109 club/models.py:147 counter/models.py:271 #: accounting/models.py:109 club/models.py:147 counter/models.py:291
#: launderette/models.py:122 #: launderette/models.py:122
msgid "start date" msgid "start date"
msgstr "date de début" msgstr "date de début"
#: accounting/models.py:110 club/models.py:148 counter/models.py:272 #: accounting/models.py:110 club/models.py:148 counter/models.py:292
msgid "end date" msgid "end date"
msgstr "date de fin" msgstr "date de fin"
...@@ -67,12 +67,12 @@ msgid "number" ...@@ -67,12 +67,12 @@ msgid "number"
msgstr "numéro" msgstr "numéro"
#: accounting/models.py:154 core/models.py:404 core/models.py:680 #: accounting/models.py:154 core/models.py:404 core/models.py:680
#: counter/models.py:209 counter/models.py:245 eboutic/models.py:14 #: counter/models.py:209 counter/models.py:255 eboutic/models.py:14
#: eboutic/models.py:47 #: eboutic/models.py:47
msgid "date" msgid "date"
msgstr "date" msgstr "date"
#: accounting/models.py:155 accounting/models.py:241 counter/models.py:237 #: accounting/models.py:155 accounting/models.py:241 counter/models.py:247
msgid "label" msgid "label"
msgstr "intitulé" msgstr "intitulé"
...@@ -80,8 +80,8 @@ msgstr "intitulé" ...@@ -80,8 +80,8 @@ msgstr "intitulé"
msgid "remark" msgid "remark"
msgstr "remarque" msgstr "remarque"
#: accounting/models.py:157 counter/models.py:210 counter/models.py:247 #: accounting/models.py:157 counter/models.py:210 counter/models.py:256
#: eboutic/models.py:49 subscription/models.py:34 #: subscription/models.py:34
msgid "payment method" msgid "payment method"
msgstr "méthode de paiement" msgstr "méthode de paiement"
...@@ -89,7 +89,7 @@ msgstr "méthode de paiement" ...@@ -89,7 +89,7 @@ msgstr "méthode de paiement"
msgid "cheque number" msgid "cheque number"
msgstr "numéro de chèque" msgstr "numéro de chèque"
#: accounting/models.py:159 eboutic/models.py:119 #: accounting/models.py:159 eboutic/models.py:115
msgid "invoice" msgid "invoice"
msgstr "facture" msgstr "facture"
...@@ -114,7 +114,7 @@ msgstr "Utilisateur" ...@@ -114,7 +114,7 @@ msgstr "Utilisateur"
msgid "Club" msgid "Club"
msgstr "Club" msgstr "Club"
#: accounting/models.py:163 core/templates/core/user_base.jinja:17 #: accounting/models.py:163 core/templates/core/user_base.jinja:18
msgid "Account" msgid "Account"
msgstr "Compte" msgstr "Compte"
...@@ -207,7 +207,7 @@ msgstr "Nouveau compte club" ...@@ -207,7 +207,7 @@ msgstr "Nouveau compte club"
#: accounting/templates/accounting/club_account_details.jinja:44 #: accounting/templates/accounting/club_account_details.jinja:44
#: accounting/templates/accounting/journal_details.jinja:62 #: accounting/templates/accounting/journal_details.jinja:62
#: club/templates/club/club_detail.jinja:7 core/templates/core/file.jinja:38 #: club/templates/club/club_detail.jinja:7 core/templates/core/file.jinja:38
#: core/templates/core/page.jinja:31 core/templates/core/user_base.jinja:9 #: core/templates/core/page.jinja:31 core/templates/core/user_base.jinja:10
#: core/templates/core/user_tools.jinja:33 #: core/templates/core/user_tools.jinja:33
#: counter/templates/counter/counter_list.jinja:15 #: counter/templates/counter/counter_list.jinja:15
#: counter/templates/counter/counter_list.jinja:18 #: counter/templates/counter/counter_list.jinja:18
...@@ -269,7 +269,7 @@ msgstr "Fin" ...@@ -269,7 +269,7 @@ 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
#: core/templates/core/user_account.jinja:19 #: core/templates/core/user_account.jinja:19
#: core/templates/core/user_account.jinja:72 #: core/templates/core/user_account.jinja:78
msgid "Amount" msgid "Amount"
msgstr "Montant" msgstr "Montant"
...@@ -324,13 +324,13 @@ msgstr "No" ...@@ -324,13 +324,13 @@ msgstr "No"
#: accounting/templates/accounting/journal_details.jinja:21 #: accounting/templates/accounting/journal_details.jinja:21
#: core/templates/core/user_account.jinja:16 #: core/templates/core/user_account.jinja:16
#: core/templates/core/user_account.jinja:41 #: core/templates/core/user_account.jinja:44
#: core/templates/core/user_account.jinja:70 #: core/templates/core/user_account.jinja:76
msgid "Date" msgid "Date"
msgstr "Date" msgstr "Date"
#: accounting/templates/accounting/journal_details.jinja:22 #: accounting/templates/accounting/journal_details.jinja:22
#: core/templates/core/user_account.jinja:44 #: core/templates/core/user_account.jinja:47
msgid "Label" msgid "Label"
msgstr "Intitulé" msgstr "Intitulé"
...@@ -908,7 +908,7 @@ msgstr "Outils" ...@@ -908,7 +908,7 @@ msgstr "Outils"
msgid "Logout" msgid "Logout"
msgstr "Déconnexion" msgstr "Déconnexion"
#: core/templates/core/base.jinja:36 #: core/templates/core/base.jinja:36 core/templates/core/search.jinja:10
msgid "Users" msgid "Users"
msgstr "Utilisateurs" msgstr "Utilisateurs"
...@@ -920,7 +920,7 @@ msgstr "Wiki" ...@@ -920,7 +920,7 @@ msgstr "Wiki"
msgid "Pages" msgid "Pages"
msgstr "Pages" msgstr "Pages"
#: core/templates/core/base.jinja:39 #: core/templates/core/base.jinja:39 core/templates/core/search.jinja:18
msgid "Clubs" msgid "Clubs"
msgstr "Clubs" msgstr "Clubs"
...@@ -938,23 +938,25 @@ msgid "Create %(name)s" ...@@ -938,23 +938,25 @@ msgid "Create %(name)s"
msgstr "Créer %(name)s" msgstr "Créer %(name)s"
#: core/templates/core/delete_confirm.jinja:4 #: core/templates/core/delete_confirm.jinja:4
#: core/templates/core/delete_confirm.jinja:8
#: core/templates/core/file_delete_confirm.jinja:4 #: core/templates/core/file_delete_confirm.jinja:4
#: core/templates/core/file_delete_confirm.jinja:8
msgid "Delete confirmation" msgid "Delete confirmation"
msgstr "Confirmation de suppression" msgstr "Confirmation de suppression"
#: core/templates/core/delete_confirm.jinja:6 #: core/templates/core/delete_confirm.jinja:10
#: core/templates/core/file_delete_confirm.jinja:6 #: core/templates/core/file_delete_confirm.jinja:10
#, python-format #, python-format
msgid "Are you sure you want to delete \"%(obj)s\"?" msgid "Are you sure you want to delete \"%(obj)s\"?"
msgstr "Êtes-vous sûr de vouloir supprimer \"%(obj)s\" ?" msgstr "Êtes-vous sûr de vouloir supprimer \"%(obj)s\" ?"
#: core/templates/core/delete_confirm.jinja:7 #: core/templates/core/delete_confirm.jinja:11
#: core/templates/core/file_delete_confirm.jinja:7 #: core/templates/core/file_delete_confirm.jinja:11
msgid "Confirm" msgid "Confirm"
msgstr "Confirmation" msgstr "Confirmation"
#: core/templates/core/delete_confirm.jinja:8 #: core/templates/core/delete_confirm.jinja:14
#: core/templates/core/file_delete_confirm.jinja:8 #: core/templates/core/file_delete_confirm.jinja:14
#: counter/templates/counter/counter_click.jinja:71 #: counter/templates/counter/counter_click.jinja:71
msgid "Cancel" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
...@@ -1067,6 +1069,13 @@ msgstr "login" ...@@ -1067,6 +1069,13 @@ msgstr "login"
msgid "Lost password?" msgid "Lost password?"
msgstr "Mot de passe perdu ?" msgstr "Mot de passe perdu ?"
#: core/templates/core/macros.jinja:9 core/templates/core/macros.jinja:11
#: core/templates/core/user_detail.jinja:12
#: core/templates/core/user_edit.jinja:15
#: core/templates/core/user_mini.jinja:4
msgid "Profile"
msgstr "Profil"
#: core/templates/core/page.jinja:7 core/templates/core/page_list.jinja:4 #: core/templates/core/page.jinja:7 core/templates/core/page_list.jinja:4
#: core/templates/core/page_list.jinja:9 #: core/templates/core/page_list.jinja:9
msgid "Page list" msgid "Page list"
...@@ -1219,6 +1228,10 @@ msgstr "" ...@@ -1219,6 +1228,10 @@ msgstr ""
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/search.jinja:6
msgid "Search result"
msgstr "Résultat de la recherche"
#: core/templates/core/user_account.jinja:4 #: core/templates/core/user_account.jinja:4
#, python-format #, python-format
msgid "%(user_name)s's account" msgid "%(user_name)s's account"
...@@ -1233,47 +1246,50 @@ msgid "Refillings" ...@@ -1233,47 +1246,50 @@ msgid "Refillings"
msgstr "Rechargements" msgstr "Rechargements"
#: core/templates/core/user_account.jinja:17 #: core/templates/core/user_account.jinja:17
#: core/templates/core/user_account.jinja:42 #: core/templates/core/user_account.jinja:45
#: counter/templates/counter/counter_click.jinja:24 #: counter/templates/counter/counter_click.jinja:24
msgid "Counter" msgid "Counter"
msgstr "Comptoir" msgstr "Comptoir"
#: core/templates/core/user_account.jinja:18 #: core/templates/core/user_account.jinja:18
#: core/templates/core/user_account.jinja:43 #: core/templates/core/user_account.jinja:46
msgid "Barman" msgid "Barman"
msgstr "Barman" msgstr "Barman"
#: core/templates/core/user_account.jinja:20 #: core/templates/core/user_account.jinja:20
#: core/templates/core/user_account.jinja:47 #: core/templates/core/user_account.jinja:50
#: core/templates/core/user_account.jinja:73
msgid "Payment method" msgid "Payment method"
msgstr "Méthode de paiement" msgstr "Méthode de paiement"
#: core/templates/core/user_account.jinja:37 #: core/templates/core/user_account.jinja:40
msgid "Account buyings" msgid "Account buyings"
msgstr "Achat sur compte utilisateur" msgstr "Achat sur compte utilisateur"
#: core/templates/core/user_account.jinja:45 #: core/templates/core/user_account.jinja:48
msgid "Quantity" msgid "Quantity"
msgstr "Quantité" msgstr "Quantité"
#: core/templates/core/user_account.jinja:46 #: core/templates/core/user_account.jinja:49
msgid "Total" msgid "Total"
msgstr "Total" msgstr "Total"
#: core/templates/core/user_account.jinja:66 #: core/templates/core/user_account.jinja:72
msgid "Eboutic invoices" msgid "Eboutic invoices"
msgstr "Facture eboutic" msgstr "Facture eboutic"
#: core/templates/core/user_account.jinja:71 #: core/templates/core/user_account.jinja:77
msgid "Items" msgid "Items"
msgstr "Articles" msgstr "Articles"
#: core/templates/core/user_account.jinja:95 #: core/templates/core/user_account.jinja:99
msgid "User has no account" msgid "User has no account"
msgstr "L'utilisateur n'a pas de compte" msgstr "L'utilisateur n'a pas de compte"
#: core/templates/core/user_base.jinja:12 #: core/templates/core/user_base.jinja:8
msgid "Stats"
msgstr "Stats"
#: core/templates/core/user_base.jinja:13
#: core/templates/core/user_tools.jinja:14 #: core/templates/core/user_tools.jinja:14
msgid "Groups" msgid "Groups"
msgstr "Groupes" msgstr "Groupes"
...@@ -1283,12 +1299,6 @@ msgstr "Groupes" ...@@ -1283,12 +1299,6 @@ msgstr "Groupes"
msgid "%(user_name)s's profile" msgid "%(user_name)s's profile"
msgstr "Profil de %(user_name)s" msgstr "Profil de %(user_name)s"
#: core/templates/core/user_detail.jinja:12
#: core/templates/core/user_edit.jinja:15
#: core/templates/core/user_mini.jinja:4
msgid "Profile"
msgstr "Profil"
#: core/templates/core/user_detail.jinja:21 #: core/templates/core/user_detail.jinja:21
#: core/templates/core/user_mini.jinja:12 #: core/templates/core/user_mini.jinja:12
msgid "Born: " msgid "Born: "
...@@ -1371,6 +1381,10 @@ msgstr "Éditer les groupes pour %(user_name)s" ...@@ -1371,6 +1381,10 @@ msgstr "Éditer les groupes pour %(user_name)s"
msgid "User list" msgid "User list"
msgstr "Liste d'utilisateurs" msgstr "Liste d'utilisateurs"
#: core/templates/core/user_stats.jinja:4
msgid "%(user_name)s's stats"
msgstr "Stats de %(user_name)s"
#: core/templates/core/user_tools.jinja:4 #: core/templates/core/user_tools.jinja:4
#, python-format #, python-format
msgid "%(user_name)s's tools" msgid "%(user_name)s's tools"
...@@ -1522,7 +1536,7 @@ msgstr "comptoir" ...@@ -1522,7 +1536,7 @@ msgstr "comptoir"
msgid "bank" msgid "bank"
msgstr "banque" msgstr "banque"
#: counter/models.py:214 counter/models.py:246 #: counter/models.py:214 counter/models.py:258
msgid "is validated" msgid "is validated"
msgstr "est validé" msgstr "est validé"
...@@ -1530,29 +1544,29 @@ msgstr "est validé" ...@@ -1530,29 +1544,29 @@ msgstr "est validé"
msgid "refilling" msgid "refilling"
msgstr "rechargement" msgstr "rechargement"
#: counter/models.py:241 eboutic/models.py:106 #: counter/models.py:251 eboutic/models.py:102
msgid "unit price" msgid "unit price"
msgstr "prix unitaire" msgstr "prix unitaire"