Compare commits

..
10 changed files with 188 additions and 104 deletions

No files matched your search

+49 -15
View File
@@ -31,9 +31,8 @@ from pytest_django.asserts import assertNumQueries, assertRedirects
from club.models import Club, ClubRole, Membership from club.models import Club, ClubRole, Membership
from com.models import News, NewsDate, Poster, Sith, Weekmail, WeekmailArticle from com.models import News, NewsDate, Poster, Sith, Weekmail, WeekmailArticle
from core.baker_recipes import old_subscriber_user, subscriber_user from core.baker_recipes import subscriber_user
from core.models import AnonymousUser, Group, User from core.models import AnonymousUser, Group, User
from core.templatetags.renderer import markdown
from core.utils import RED_PIXEL_PNG from core.utils import RED_PIXEL_PNG
@@ -43,32 +42,68 @@ def user_community():
@pytest.mark.django_db @pytest.mark.django_db
def test_com_page_is_working(client, user_community): @pytest.mark.parametrize(
"url",
[
reverse("com:alert_edit"),
reverse("com:info_edit"),
],
)
def test_com_page_is_working(client, url, user_community):
client.force_login(user_community) client.force_login(user_community)
response = client.get(reverse("com:banner_edit")) response = client.get(url)
assert response.status_code == 200 assert response.status_code == 200
class TestCom(TestCase): class TestCom(TestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
cls.skia = User.objects.get(username="skia")
cls.com_group = Group.objects.get(id=settings.SITH_GROUP_COM_ADMIN_ID) cls.com_group = Group.objects.get(id=settings.SITH_GROUP_COM_ADMIN_ID)
cls.com_admin = subscriber_user.make(groups=[cls.com_group]) cls.skia.groups.set([cls.com_group])
def test_banner_messages(self): def setUp(self):
self.client.force_login(self.com_admin) self.client.force_login(self.skia)
alert_msg = "### ALERTE!\n\n**Caaaataaaapuuuulte!!!!**\n"
info_msg = "### INFO:\n\n**Caaaataaaapuuuulte!!!!**\n" def test_alert_msg(self):
self.client.post( self.client.post(
reverse("com:banner_edit"), {"alert_msg": alert_msg, "info_msg": info_msg} reverse("com:alert_edit"),
{
"alert_msg": """
### ALERTE!
**Caaaataaaapuuuulte!!!!**
"""
},
) )
r = self.client.get(reverse("core:index")) r = self.client.get(reverse("core:index"))
assert r.status_code == 200 assert r.status_code == 200
self.assertInHTML(f'<div id="alert_box">{markdown(alert_msg)}</div>', r.text) self.assertInHTML(
self.assertInHTML(f'<div id="info_box">{markdown(info_msg)}</div>', r.text) """<div id="alert_box"><div class="markdown"><h3>ALERTE!</h3>
<p><strong>Caaaataaaapuuuulte!!!!</strong></p>""",
r.content.decode(),
)
def test_info_msg(self):
self.client.post(
reverse("com:info_edit"),
{
"info_msg": """
### INFO: **Caaaataaaapuuuulte!!!!**
"""
},
)
r = self.client.get(reverse("core:index"))
assert r.status_code == 200
self.assertInHTML(
"""<div id="info_box"><div class="markdown">
<h3>INFO: <strong>Caaaataaaapuuuulte!!!!</strong></h3>""",
r.content.decode(),
)
def test_birthday_non_subscribed_user(self): def test_birthday_non_subscribed_user(self):
self.client.force_login(baker.make(User)) self.client.force_login(User.objects.get(username="guy"))
response = self.client.get(reverse("core:index")) response = self.client.get(reverse("core:index"))
self.assertContains( self.assertContains(
response, response,
@@ -76,7 +111,6 @@ class TestCom(TestCase):
) )
def test_birthday_subscibed_user(self): def test_birthday_subscibed_user(self):
self.client.force_login(subscriber_user.make())
response = self.client.get(reverse("core:index")) response = self.client.get(reverse("core:index"))
self.assertNotContains( self.assertNotContains(
@@ -85,7 +119,7 @@ class TestCom(TestCase):
) )
def test_birthday_old_subscibed_user(self): def test_birthday_old_subscibed_user(self):
self.client.force_login(old_subscriber_user.make()) self.client.force_login(User.objects.get(username="old_subscriber"))
response = self.client.get(reverse("core:index")) response = self.client.get(reverse("core:index"))
self.assertNotContains( self.assertNotContains(
+4 -2
View File
@@ -16,7 +16,8 @@
from django.urls import path from django.urls import path
from com.views import ( from com.views import (
BannerMessagesEditView, AlertMsgEditView,
InfoMsgEditView,
NewsAdminListView, NewsAdminListView,
NewsCreateView, NewsCreateView,
NewsDeleteView, NewsDeleteView,
@@ -44,7 +45,8 @@ from com.views import (
) )
urlpatterns = [ urlpatterns = [
path("sith/edit/banner/", BannerMessagesEditView.as_view(), name="banner_edit"), path("sith/edit/alert/", AlertMsgEditView.as_view(), name="alert_edit"),
path("sith/edit/info/", InfoMsgEditView.as_view(), name="info_edit"),
path( path(
"sith/edit/weekmail_destinations/", "sith/edit/weekmail_destinations/",
WeekmailDestinationEditView.as_view(), WeekmailDestinationEditView.as_view(),
+20 -9
View File
@@ -75,9 +75,14 @@ class ComTabsMixin(TabedViewMixin):
"name": _("Weekmail destinations"), "name": _("Weekmail destinations"),
}, },
{ {
"url": reverse("com:banner_edit"), "url": reverse("com:info_edit"),
"slug": "banner", "slug": "info",
"name": _("Banner messages"), "name": _("Info message"),
},
{
"url": reverse("com:alert_edit"),
"slug": "alert",
"name": _("Alert message"),
}, },
{ {
"url": reverse("com:poster_list"), "url": reverse("com:poster_list"),
@@ -100,14 +105,20 @@ class ComEditView(ComTabsMixin, CanEditPropMixin, UpdateView):
return Sith.objects.first() return Sith.objects.first()
class BannerMessagesEditView(ComEditView): class AlertMsgEditView(ComEditView):
form_class = modelform_factory( form_class = modelform_factory(
Sith, Sith, fields=["alert_msg"], widgets={"alert_msg": MarkdownInput}
fields=["alert_msg", "info_msg"],
widgets={"alert_msg": MarkdownInput, "info_msg": MarkdownInput},
) )
current_tab = "banner" current_tab = "alert"
success_url = reverse_lazy("com:banner_edit") success_url = reverse_lazy("com:alert_edit")
class InfoMsgEditView(ComEditView):
form_class = modelform_factory(
Sith, fields=["info_msg"], widgets={"info_msg": MarkdownInput}
)
current_tab = "info"
success_url = reverse_lazy("com:info_edit")
class WeekmailDestinationEditView(ComEditView): class WeekmailDestinationEditView(ComEditView):
+36 -27
View File
@@ -13,7 +13,7 @@
<h3>{% trans %}User Tools{% endtrans %}</h3> <h3>{% trans %}User Tools{% endtrans %}</h3>
<div class="container"> <div class="container">
{% if user.has_perm("subscription.view_userban") or user.has_perm("club.add_club") or user.is_root or user.is_board_member %} {% if user.has_perm("subscription.view_userban") or user.is_root or user.is_board_member %}
<div> <div>
<h4>{% trans %}Sith management{% endtrans %}</h4> <h4>{% trans %}Sith management{% endtrans %}</h4>
<ul> <ul>
@@ -30,7 +30,7 @@
{% if user.has_perm("core.view_userban") %} {% if user.has_perm("core.view_userban") %}
<li><a href="{{ url("rootplace:ban_list") }}">{% trans %}Bans{% endtrans %}</a></li> <li><a href="{{ url("rootplace:ban_list") }}">{% trans %}Bans{% endtrans %}</a></li>
{% endif %} {% endif %}
{% if user.has_perm("club.add_club") %} {% if user.is_board_member or user.is_root %}
<li><a href="{{ url('club:club_new') }}">{% trans %}New club{% endtrans %}</a></li> <li><a href="{{ url('club:club_new') }}">{% trans %}New club{% endtrans %}</a></li>
{% endif %} {% endif %}
</ul> </ul>
@@ -41,7 +41,8 @@
{% for b in settings.SITH_COUNTER_BARS if user.is_in_group(name=b[1] + " admin") %} {% for b in settings.SITH_COUNTER_BARS if user.is_in_group(name=b[1] + " admin") %}
{% set is_admin_on_a_counter = true %} {% set is_admin_on_a_counter = true %}
{% endfor %} {% endfor %}
{% if is_admin_on_a_counter or user.has_perm("counter.view_product") or user.has_perm("counter.view_eticket") %}
{% if is_admin_on_a_counter or user.is_root or user.is_in_group(pk=settings.SITH_GROUP_COUNTER_ADMIN_ID) %}
<div> <div>
<h4>{% trans %}Counters{% endtrans %}</h4> <h4>{% trans %}Counters{% endtrans %}</h4>
<ul> <ul>
@@ -51,15 +52,31 @@
{% trans %}General counters management{% endtrans %} {% trans %}General counters management{% endtrans %}
</a> </a>
</li> </li>
{% endif %}
{% if user.has_perm("counter.view_product") %}
<li> <li>
<a href="{{ url('counter:product_list') }}"> <a href="{{ url('counter:product_list') }}">
{% trans %}Products management{% endtrans %} {% trans %}Products management{% endtrans %}
</a> </a>
</li> </li>
{% endif %} <li>
{% if user.has_perm("counter.view_eticket") %} <a href="{{ url('counter:product_type_list') }}">
{% trans %}Product types management{% endtrans %}
</a>
</li>
<li>
<a href="{{ url("counter:returnable_list") }}">
{% trans %}Returnable products management{% endtrans %}
</a>
</li>
<li>
<a href="{{ url('counter:cash_summary_list') }}">
{% trans %}Cash register summaries{% endtrans %}
</a>
</li>
<li>
<a href="{{ url('counter:invoices_call') }}">
{% trans %}Invoices call{% endtrans %}
</a>
</li>
<li> <li>
<a href="{{ url('counter:eticket_list') }}"> <a href="{{ url('counter:eticket_list') }}">
{% trans %}Etickets{% endtrans %} {% trans %}Etickets{% endtrans %}
@@ -92,17 +109,10 @@
</div> </div>
{% endif %} {% endif %}
{% if user.has_perms(["counter.view_invoicecall", "counter.change_invoicecall"]) or user.is_root or user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %} {% if user.is_root or user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
<div> <div>
<h4>{% trans %}Accounting{% endtrans %}</h4> <h4>{% trans %}Accounting{% endtrans %}</h4>
<ul> <ul>
{% if user.has_perms(["counter.view_invoicecall", "counter.change_invoicecall"]) %}
<li>
<a href="{{ url('counter:invoices_call') }}">
{% trans %}Invoices call{% endtrans %}
</a>
</li>
{% endif %}
{% if user.is_root or user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %} {% if user.is_root or user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %}
<li><a href="{{ url("counter:account_refound") }}">{% trans %}Refound Account{% endtrans %}</a></li> <li><a href="{{ url("counter:account_refound") }}">{% trans %}Refound Account{% endtrans %}</a></li>
{% endif %} {% endif %}
@@ -110,19 +120,23 @@
</div> </div>
{% endif %} {% endif %}
{% if user.is_root or user.is_com_admin or user.has_perm("sas.moderate_sasfile") %} {% if user.is_root or user.is_com_admin or user.is_in_group(pk=settings.SITH_GROUP_SAS_ADMIN_ID) %}
<div> <div>
<h4>{% trans %}Communication{% endtrans %}</h4> <h4>{% trans %}Communication{% endtrans %}</h4>
<ul> <ul>
{% if user.is_com_admin or user.is_root %} {% if user.is_com_admin or user.is_root %}
<li><a href="{{ url('com:weekmail_article') }}">{% trans %}Create weekmail article{% endtrans %}</a></li>
<li><a href="{{ url('com:weekmail') }}">{% trans %}Weekmail{% endtrans %}</a></li> <li><a href="{{ url('com:weekmail') }}">{% trans %}Weekmail{% endtrans %}</a></li>
<li><a href="{{ url('com:weekmail_destinations') }}">{% trans %}Weekmail destinations{% endtrans %}</a></li>
<li><a href="{{ url('com:news_new') }}">{% trans %}Create news{% endtrans %}</a></li> <li><a href="{{ url('com:news_new') }}">{% trans %}Create news{% endtrans %}</a></li>
<li><a href="{{ url('com:news_admin_list') }}">{% trans %}Moderate news{% endtrans %}</a></li> <li><a href="{{ url('com:news_admin_list') }}">{% trans %}Moderate news{% endtrans %}</a></li>
<li><a href="{{ url('com:banner_edit') }}">{% trans %}Edit banner messages{% endtrans %}</a></li> <li><a href="{{ url('com:alert_edit') }}">{% trans %}Edit alert message{% endtrans %}</a></li>
<li><a href="{{ url('com:info_edit') }}">{% trans %}Edit information message{% endtrans %}</a></li>
<li><a href="{{ url('core:file_moderation') }}">{% trans %}Moderate files{% endtrans %}</a></li>
<li><a href="{{ url('com:poster_list') }}">{% trans %}Posters{% endtrans %}</a></li> <li><a href="{{ url('com:poster_list') }}">{% trans %}Posters{% endtrans %}</a></li>
<li><a href="{{ url('com:screen_list') }}">{% trans %}Screens{% endtrans %}</a></li> <li><a href="{{ url('com:screen_list') }}">{% trans %}Screens{% endtrans %}</a></li>
{% endif %} {% endif %}
{% if user.has_perm("sas.moderate_sasfile") %} {% if user.is_in_group(pk=settings.SITH_GROUP_SAS_ADMIN_ID) %}
<li><a href="{{ url('sas:moderation') }}">{% trans %}Moderate pictures{% endtrans %}</a></li> <li><a href="{{ url('sas:moderation') }}">{% trans %}Moderate pictures{% endtrans %}</a></li>
{% endif %} {% endif %}
</ul> </ul>
@@ -158,17 +172,12 @@
</div> </div>
{% endif %} {% endif %}
{% set memberships = user.memberships.ongoing().select_related("club")|list %} {% if user.memberships.filter(end_date=None).all().count() > 0 %}
{% if memberships|length > 0 %}
<div> <div>
<h4>{% trans %}Club tools{% endtrans %}</h4> <h4>{% trans %}Club tools{% endtrans %}</h4>
<ul> <ul>
{% for m in memberships %} {% for m in user.memberships.filter(end_date=None).all() %}
{% if m.is_board %} <li><a href="{{ url('club:tools', club_id=m.club.id) }}">{{ m.club }}</a></li>
<li><a href="{{ url('club:tools', club_id=m.club_id) }}">{{ m.club }}</a></li>
{% else %}
<li><a href="{{ url('club:club_view', club_id=m.club_id) }}">{{ m.club }}</a></li>
{% endif %}
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
@@ -201,7 +210,7 @@
<ul> <ul>
<li><a href="{{ url('election:list') }}">{% trans %}See available elections{% endtrans %}</a></li> <li><a href="{{ url('election:list') }}">{% trans %}See available elections{% endtrans %}</a></li>
<li><a href="{{ url('election:list_archived') }}">{% trans %}See archived elections{% endtrans %}</a></li> <li><a href="{{ url('election:list_archived') }}">{% trans %}See archived elections{% endtrans %}</a></li>
{%- if user.has_perm("election.add_election") -%} {%- if user.is_subscribed -%}
<li><a href="{{ url('election:create') }}">{% trans %}Create a new election{% endtrans %}</a></li> <li><a href="{{ url('election:create') }}">{% trans %}Create a new election{% endtrans %}</a></li>
{%- endif -%} {%- endif -%}
</ul> </ul>
+5 -18
View File
@@ -35,7 +35,7 @@ from pytest_django.asserts import assertInHTML, assertRedirects
from antispam.models import ToxicDomain from antispam.models import ToxicDomain
from club.models import Club from club.models import Club
from core.baker_recipes import board_user, subscriber_user from core.baker_recipes import subscriber_user
from core.models import AnonymousUser, Group, Page, User, validate_promo from core.models import AnonymousUser, Group, Page, User, validate_promo
from core.utils import get_last_promo, get_semester_code, get_start_of_semester from core.utils import get_last_promo, get_semester_code, get_start_of_semester
from core.views import AllowFragment from core.views import AllowFragment
@@ -398,24 +398,11 @@ class TestUserTools:
response, expected_url=reverse("core:login", query={"next": url}) response, expected_url=reverse("core:login", query={"next": url})
) )
@pytest.mark.parametrize( @pytest.mark.parametrize("username", ["guy", "root", "skia", "comunity"])
"user_factory", def test_page_is_working(self, client, username):
[
lambda: baker.make(User),
lambda: baker.make(User, is_superuser=True),
board_user.make,
lambda: baker.make(
User, groups=[Group.objects.get(id=settings.SITH_GROUP_COM_ADMIN_ID)]
),
lambda: baker.make(
User,
groups=[Group.objects.get(id=settings.SITH_GROUP_COUNTER_ADMIN_ID)],
),
],
)
def test_page_is_working(self, client, user_factory):
"""All existing users should be able to see the test page.""" """All existing users should be able to see the test page."""
client.force_login(user_factory()) # Test for simple user
client.force_login(User.objects.get(username=username))
response = client.get(reverse("core:user_tools")) response = client.get(reverse("core:user_tools"))
assert response.status_code == 200 assert response.status_code == 200
+2 -2
View File
@@ -22,7 +22,7 @@ from ninja_extra.pagination import PageNumberPaginationExtra
from ninja_extra.schemas import PaginatedResponseSchema from ninja_extra.schemas import PaginatedResponseSchema
from api.auth import ApiKeyAuth from api.auth import ApiKeyAuth
from api.permissions import CanAccessLookup, CanView, IsInGroup, IsRoot from api.permissions import CanAccessLookup, CanView, HasPerm, IsInGroup, IsRoot
from counter.models import Counter, Product, ProductType from counter.models import Counter, Product, ProductType
from counter.schemas import ( from counter.schemas import (
CounterFilterSchema, CounterFilterSchema,
@@ -93,7 +93,7 @@ class ProductController(ControllerBase):
@route.get( @route.get(
"/search/detailed", "/search/detailed",
response=PaginatedResponseSchema[ProductSchema], response=PaginatedResponseSchema[ProductSchema],
permissions=[IsCounterAdmin], permissions=[HasPerm("counter.view_product")],
url_name="search_products_detailed", url_name="search_products_detailed",
) )
@paginate(PageNumberPaginationExtra, page_size=50) @paginate(PageNumberPaginationExtra, page_size=50)
+10 -8
View File
@@ -83,15 +83,17 @@
{% endmacro %} {% endmacro %}
{% block content %} {% block content %}
<div class="alert alert-yellow"> {% if not user.has_perm("counter.change_product") %}
<div class="alert-main"> <div class="alert alert-yellow">
{%- trans trimmed -%} <div class="alert-main">
You can see product details. {%- trans trimmed -%}
However, you cannot edit it, thus you won't be able You can see product details.
to submit this form. However, you cannot edit it, thus you won't be able
{%- endtrans -%} to submit this form.
{%- endtrans -%}
</div>
</div> </div>
</div> {% endif %}
{% if object %} {% if object %}
<h2>{{ object }}</h2> <h2>{{ object }}</h2>
<p><i>{% trans %}Creation date{% endtrans %} : {{ object.created_at|date }}</i></p> <p><i>{% trans %}Creation date{% endtrans %} : {{ object.created_at|date }}</i></p>
+3
View File
@@ -181,6 +181,9 @@ class ProductEditView(CounterAdminTabsMixin, PermissionRequiredMixin, UpdateView
permission_required = "counter.change_product" permission_required = "counter.change_product"
def has_permission(self): def has_permission(self):
# If users can see products but not edit them,
# still show them this form, as it is the place where all infos are,
# but forbid to save it.
return self.request.user.has_perm("counter.change_product") or ( return self.request.user.has_perm("counter.change_product") or (
self.request.method == "GET" self.request.method == "GET"
and self.request.user.has_perm("counter.view_product") and self.request.user.has_perm("counter.view_product")
@@ -5,13 +5,24 @@
{%- trans %}Election list{% endtrans %} {%- trans %}Election list{% endtrans %}
{%- endblock %} {%- endblock %}
{% block head %}
{{ super() -}}
<style>
small {
font-size: smaller;
}
time {
font-weight: bolder;
}
</style>
{%- endblock %}
{% block content %} {% block content %}
<h3>{% trans %}Current elections{% endtrans %}</h3> <h3>{% trans %}Current elections{% endtrans %}</h3>
{% if user.has_perm("election.add_election") %} <a class="btn btn-blue" href="{{ url("election:create") }}">
<a class="btn btn-blue" href="{{ url("election:create") }}"> <i class="fa fa-plus"></i>{% trans %}New election{% endtrans %}
<i class="fa fa-plus"></i>{% trans %}New election{% endtrans %} </a>
</a>
{% endif %}
{%- for election in object_list %} {%- for election in object_list %}
<hr> <hr>
<section> <section>
+43 -18
View File
@@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-11-06 17:22+0100\n" "POT-Creation-Date: 2026-10-27 23:26+0100\n"
"PO-Revision-Date: 2016-07-18\n" "PO-Revision-Date: 2016-07-18\n"
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n" "Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
"Language-Team: AE info <ae.info@utbm.fr>\n" "Language-Team: AE info <ae.info@utbm.fr>\n"
@@ -20,15 +20,15 @@ msgstr ""
msgid "Email domain is not allowed." msgid "Email domain is not allowed."
msgstr "Le domaine de l'addresse e-mail n'est pas autorisé." msgstr "Le domaine de l'addresse e-mail n'est pas autorisé."
#: antispam/models/models.py #: antispam/models.py
msgid "domain" msgid "domain"
msgstr "domaine" msgstr "domaine"
#: antispam/models/models.py #: antispam/models.py
msgid "is externally managed" msgid "is externally managed"
msgstr "est géré de manière externe" msgstr "est géré de manière externe"
#: antispam/models/models.py #: antispam/models.py
msgid "" msgid ""
"True if kept up-to-date using external toxic domain providers, else False" "True if kept up-to-date using external toxic domain providers, else False"
msgstr "" msgstr ""
@@ -1503,13 +1503,17 @@ msgstr "Le mot de la fin"
msgid "Communication administration" msgid "Communication administration"
msgstr "Administration de la communication" msgstr "Administration de la communication"
#: com/views.py #: com/views.py core/templates/core/user_tools.jinja
msgid "Weekmail destinations" msgid "Weekmail destinations"
msgstr "Destinataires du Weekmail" msgstr "Destinataires du Weekmail"
#: com/views.py #: com/views.py
msgid "Banner messages" msgid "Info message"
msgstr "Messages de bannière" msgstr "Message d'info"
#: com/views.py
msgid "Alert message"
msgstr "Message d'alerte"
#: com/views.py #: com/views.py
msgid "Posters list" msgid "Posters list"
@@ -2980,6 +2984,24 @@ msgstr "Gestion générale des comptoirs"
msgid "Products management" msgid "Products management"
msgstr "Gestion des produits" msgstr "Gestion des produits"
#: core/templates/core/user_tools.jinja
msgid "Product types management"
msgstr "Gestion des types de produit"
#: core/templates/core/user_tools.jinja
msgid "Returnable products management"
msgstr "Gestion des consignes"
#: core/templates/core/user_tools.jinja
#: counter/templates/counter/cash_summary_list.jinja counter/views/mixins.py
msgid "Cash register summaries"
msgstr "Relevés de caisse"
#: core/templates/core/user_tools.jinja
#: counter/templates/counter/invoices_call.jinja counter/views/mixins.py
msgid "Invoices call"
msgstr "Appels à facture"
#: core/templates/core/user_tools.jinja core/views/user.py #: core/templates/core/user_tools.jinja core/views/user.py
#: counter/templates/counter/counter_list.jinja #: counter/templates/counter/counter_list.jinja
msgid "Stats" msgid "Stats"
@@ -2989,11 +3011,6 @@ msgstr "Stats"
msgid "Accounting" msgid "Accounting"
msgstr "Comptabilité" msgstr "Comptabilité"
#: core/templates/core/user_tools.jinja
#: counter/templates/counter/invoices_call.jinja counter/views/mixins.py
msgid "Invoices call"
msgstr "Appels à facture"
#: core/templates/core/user_tools.jinja #: core/templates/core/user_tools.jinja
msgid "Refound Account" msgid "Refound Account"
msgstr "Rembourser un compte" msgstr "Rembourser un compte"
@@ -3002,13 +3019,25 @@ msgstr "Rembourser un compte"
msgid "Communication" msgid "Communication"
msgstr "Communication" msgstr "Communication"
#: core/templates/core/user_tools.jinja
msgid "Create weekmail article"
msgstr "Rédiger un nouvel article dans le Weekmail"
#: core/templates/core/user_tools.jinja #: core/templates/core/user_tools.jinja
msgid "Moderate news" msgid "Moderate news"
msgstr "Modérer les nouvelles" msgstr "Modérer les nouvelles"
#: core/templates/core/user_tools.jinja #: core/templates/core/user_tools.jinja
msgid "Edit banner messages" msgid "Edit alert message"
msgstr "Éditer les messages de bannière" msgstr "Éditer le message d'alerte"
#: core/templates/core/user_tools.jinja
msgid "Edit information message"
msgstr "Éditer le message d'informations"
#: core/templates/core/user_tools.jinja
msgid "Moderate files"
msgstr "Modérer les fichiers"
#: core/templates/core/user_tools.jinja #: core/templates/core/user_tools.jinja
msgid "Moderate pictures" msgid "Moderate pictures"
@@ -3758,10 +3787,6 @@ msgstr "Liste des relevés de caisse"
msgid "Theoric sums" msgid "Theoric sums"
msgstr "Sommes théoriques" msgstr "Sommes théoriques"
#: counter/templates/counter/cash_summary_list.jinja counter/views/mixins.py
msgid "Cash register summaries"
msgstr "Relevés de caisse"
#: counter/templates/counter/cash_summary_list.jinja counter/views/cash.py #: counter/templates/counter/cash_summary_list.jinja counter/views/cash.py
msgid "Emptied" msgid "Emptied"
msgstr "Coffre vidé" msgstr "Coffre vidé"