Compare commits

...
Author SHA1 Message Date
imperosol 20f1e08b93 reorder user tools 2026-11-06 17:58:50 +01:00
imperosol d1649ddb49 merge alert message and info message edition views 2026-11-06 17:39:06 +01:00
7 changed files with 94 additions and 173 deletions

No files matched your search

+15 -49
View File
@@ -31,8 +31,9 @@ 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 subscriber_user from core.baker_recipes import old_subscriber_user, 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
@@ -42,68 +43,32 @@ def user_community():
@pytest.mark.django_db @pytest.mark.django_db
@pytest.mark.parametrize( def test_com_page_is_working(client, user_community):
"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(url) response = client.get(reverse("com:banner_edit"))
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.skia.groups.set([cls.com_group]) cls.com_admin = subscriber_user.make(groups=[cls.com_group])
def setUp(self): def test_banner_messages(self):
self.client.force_login(self.skia) self.client.force_login(self.com_admin)
alert_msg = "### ALERTE!\n\n**Caaaataaaapuuuulte!!!!**\n"
def test_alert_msg(self): info_msg = "### INFO:\n\n**Caaaataaaapuuuulte!!!!**\n"
self.client.post( self.client.post(
reverse("com:alert_edit"), reverse("com:banner_edit"), {"alert_msg": alert_msg, "info_msg": info_msg}
{
"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( self.assertInHTML(f'<div id="alert_box">{markdown(alert_msg)}</div>', r.text)
"""<div id="alert_box"><div class="markdown"><h3>ALERTE!</h3> self.assertInHTML(f'<div id="info_box">{markdown(info_msg)}</div>', r.text)
<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(User.objects.get(username="guy")) self.client.force_login(baker.make(User))
response = self.client.get(reverse("core:index")) response = self.client.get(reverse("core:index"))
self.assertContains( self.assertContains(
response, response,
@@ -111,6 +76,7 @@ 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(
@@ -119,7 +85,7 @@ class TestCom(TestCase):
) )
def test_birthday_old_subscibed_user(self): def test_birthday_old_subscibed_user(self):
self.client.force_login(User.objects.get(username="old_subscriber")) self.client.force_login(old_subscriber_user.make())
response = self.client.get(reverse("core:index")) response = self.client.get(reverse("core:index"))
self.assertNotContains( self.assertNotContains(
+2 -4
View File
@@ -16,8 +16,7 @@
from django.urls import path from django.urls import path
from com.views import ( from com.views import (
AlertMsgEditView, BannerMessagesEditView,
InfoMsgEditView,
NewsAdminListView, NewsAdminListView,
NewsCreateView, NewsCreateView,
NewsDeleteView, NewsDeleteView,
@@ -45,8 +44,7 @@ from com.views import (
) )
urlpatterns = [ urlpatterns = [
path("sith/edit/alert/", AlertMsgEditView.as_view(), name="alert_edit"), path("sith/edit/banner/", BannerMessagesEditView.as_view(), name="banner_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(),
+9 -20
View File
@@ -75,14 +75,9 @@ class ComTabsMixin(TabedViewMixin):
"name": _("Weekmail destinations"), "name": _("Weekmail destinations"),
}, },
{ {
"url": reverse("com:info_edit"), "url": reverse("com:banner_edit"),
"slug": "info", "slug": "banner",
"name": _("Info message"), "name": _("Banner messages"),
},
{
"url": reverse("com:alert_edit"),
"slug": "alert",
"name": _("Alert message"),
}, },
{ {
"url": reverse("com:poster_list"), "url": reverse("com:poster_list"),
@@ -105,20 +100,14 @@ class ComEditView(ComTabsMixin, CanEditPropMixin, UpdateView):
return Sith.objects.first() return Sith.objects.first()
class AlertMsgEditView(ComEditView): class BannerMessagesEditView(ComEditView):
form_class = modelform_factory( form_class = modelform_factory(
Sith, fields=["alert_msg"], widgets={"alert_msg": MarkdownInput} Sith,
fields=["alert_msg", "info_msg"],
widgets={"alert_msg": MarkdownInput, "info_msg": MarkdownInput},
) )
current_tab = "alert" current_tab = "banner"
success_url = reverse_lazy("com:alert_edit") success_url = reverse_lazy("com:banner_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):
+27 -36
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.is_root or user.is_board_member %} {% if user.has_perm("subscription.view_userban") or user.has_perm("club.add_club") 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.is_board_member or user.is_root %} {% if user.has_perm("club.add_club") %}
<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,8 +41,7 @@
{% 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>
@@ -52,31 +51,15 @@
{% 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>
<li> {% endif %}
<a href="{{ url('counter:product_type_list') }}"> {% if user.has_perm("counter.view_eticket") %}
{% 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 %}
@@ -109,10 +92,17 @@
</div> </div>
{% endif %} {% endif %}
{% if user.is_root or user.is_in_group(pk=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID) %} {% 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) %}
<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 %}
@@ -120,23 +110,19 @@
</div> </div>
{% endif %} {% endif %}
{% if user.is_root or user.is_com_admin or user.is_in_group(pk=settings.SITH_GROUP_SAS_ADMIN_ID) %} {% if user.is_root or user.is_com_admin or user.has_perm("sas.moderate_sasfile") %}
<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:alert_edit') }}">{% trans %}Edit alert message{% endtrans %}</a></li> <li><a href="{{ url('com:banner_edit') }}">{% trans %}Edit banner messages{% 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.is_in_group(pk=settings.SITH_GROUP_SAS_ADMIN_ID) %} {% if user.has_perm("sas.moderate_sasfile") %}
<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>
@@ -172,12 +158,17 @@
</div> </div>
{% endif %} {% endif %}
{% if user.memberships.filter(end_date=None).all().count() > 0 %} {% set memberships = user.memberships.ongoing().select_related("club")|list %}
{% if memberships|length > 0 %}
<div> <div>
<h4>{% trans %}Club tools{% endtrans %}</h4> <h4>{% trans %}Club tools{% endtrans %}</h4>
<ul> <ul>
{% for m in user.memberships.filter(end_date=None).all() %} {% for m in memberships %}
<li><a href="{{ url('club:tools', club_id=m.club.id) }}">{{ m.club }}</a></li> {% if m.is_board %}
<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>
@@ -210,7 +201,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.is_subscribed -%} {%- if user.has_perm("election.add_election") -%}
<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>
+18 -5
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 subscriber_user from core.baker_recipes import board_user, 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,11 +398,24 @@ class TestUserTools:
response, expected_url=reverse("core:login", query={"next": url}) response, expected_url=reverse("core:login", query={"next": url})
) )
@pytest.mark.parametrize("username", ["guy", "root", "skia", "comunity"]) @pytest.mark.parametrize(
def test_page_is_working(self, client, username): "user_factory",
[
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."""
# Test for simple user client.force_login(user_factory())
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
@@ -5,24 +5,13 @@
{%- 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>
<a class="btn btn-blue" href="{{ url("election:create") }}"> {% if user.has_perm("election.add_election") %}
<i class="fa fa-plus"></i>{% trans %}New election{% endtrans %} <a class="btn btn-blue" href="{{ url("election:create") }}">
</a> <i class="fa fa-plus"></i>{% trans %}New election{% endtrans %}
</a>
{% endif %}
{%- for election in object_list %} {%- for election in object_list %}
<hr> <hr>
<section> <section>
+18 -43
View File
@@ -6,7 +6,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-27 23:26+0100\n" "POT-Creation-Date: 2026-11-06 17:22+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.py #: antispam/models/models.py
msgid "domain" msgid "domain"
msgstr "domaine" msgstr "domaine"
#: antispam/models.py #: antispam/models/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.py #: antispam/models/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,17 +1503,13 @@ 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 core/templates/core/user_tools.jinja #: com/views.py
msgid "Weekmail destinations" msgid "Weekmail destinations"
msgstr "Destinataires du Weekmail" msgstr "Destinataires du Weekmail"
#: com/views.py #: com/views.py
msgid "Info message" msgid "Banner messages"
msgstr "Message d'info" msgstr "Messages de bannière"
#: com/views.py
msgid "Alert message"
msgstr "Message d'alerte"
#: com/views.py #: com/views.py
msgid "Posters list" msgid "Posters list"
@@ -2984,24 +2980,6 @@ 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"
@@ -3011,6 +2989,11 @@ 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"
@@ -3019,25 +3002,13 @@ 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 alert message" msgid "Edit banner messages"
msgstr "Éditer le message d'alerte" msgstr "Éditer les messages de bannière"
#: 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"
@@ -3787,6 +3758,10 @@ 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é"