mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-09 19:40:19 +00:00
Merge pull request #998 from ae-utbm/simpler-com
Rework news creation form
This commit is contained in:
@ -678,7 +678,6 @@ Welcome to the wiki page!
|
||||
title="Apero barman",
|
||||
summary="Viens boire un coup avec les barmans",
|
||||
content="Glou glou glou glou glou glou glou",
|
||||
type="EVENT",
|
||||
club=bar_club,
|
||||
author=subscriber,
|
||||
is_moderated=True,
|
||||
@ -698,7 +697,6 @@ Welcome to the wiki page!
|
||||
"Viens donc t'enjailler avec les autres barmans aux "
|
||||
"frais du BdF! \\o/"
|
||||
),
|
||||
type="EVENT",
|
||||
club=bar_club,
|
||||
author=subscriber,
|
||||
is_moderated=True,
|
||||
@ -715,7 +713,6 @@ Welcome to the wiki page!
|
||||
title="Repas fromager",
|
||||
summary="Wien manger du l'bon fromeug'",
|
||||
content="Fô viendre mangey d'la bonne fondue!",
|
||||
type="EVENT",
|
||||
club=bar_club,
|
||||
author=subscriber,
|
||||
is_moderated=True,
|
||||
@ -732,7 +729,6 @@ Welcome to the wiki page!
|
||||
title="SdF",
|
||||
summary="Enjoy la fin des finaux!",
|
||||
content="Viens faire la fête avec tout plein de gens!",
|
||||
type="EVENT",
|
||||
club=bar_club,
|
||||
author=subscriber,
|
||||
is_moderated=True,
|
||||
@ -751,7 +747,6 @@ Welcome to the wiki page!
|
||||
summary="Viens jouer!",
|
||||
content="Rejoins la fine équipe du Troll Penché et viens "
|
||||
"t'amuser le Vendredi soir!",
|
||||
type="WEEKLY",
|
||||
club=troll,
|
||||
author=subscriber,
|
||||
is_moderated=True,
|
||||
@ -899,6 +894,7 @@ Welcome to the wiki page!
|
||||
public_group = Group.objects.create(name="Public")
|
||||
|
||||
subscribers = Group.objects.create(name="Subscribers")
|
||||
subscribers.permissions.add(*list(perms.filter(codename__in=["add_news"])))
|
||||
old_subscribers = Group.objects.create(name="Old subscribers")
|
||||
old_subscribers.permissions.add(
|
||||
*list(
|
||||
|
@ -665,7 +665,9 @@ form {
|
||||
}
|
||||
|
||||
&:checked {
|
||||
background: var(--nf-input-focus-border-color) none initial;
|
||||
background: none;
|
||||
background-position: 0 0;
|
||||
background-color: var(--nf-input-focus-border-color);
|
||||
|
||||
&::after {
|
||||
transform: translateY(-50%) translateX(
|
||||
|
@ -436,8 +436,8 @@ body {
|
||||
$row-gap: 0.5rem;
|
||||
|
||||
&.gap {
|
||||
column-gap: var($col-gap);
|
||||
row-gap: var($row-gap);
|
||||
column-gap: $col-gap;
|
||||
row-gap: $row-gap;
|
||||
}
|
||||
|
||||
@for $i from 2 through 5 {
|
||||
|
@ -26,6 +26,7 @@ import datetime
|
||||
|
||||
import phonenumbers
|
||||
from django import template
|
||||
from django.forms import BoundField
|
||||
from django.template.defaultfilters import stringfilter
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.translation import ngettext
|
||||
@ -80,3 +81,43 @@ def format_timedelta(value: datetime.timedelta) -> str:
|
||||
return ngettext(
|
||||
"%(nb_days)d day, %(remainder)s", "%(nb_days)d days, %(remainder)s", days
|
||||
) % {"nb_days": days, "remainder": str(remainder)}
|
||||
|
||||
|
||||
@register.filter(name="add_attr")
|
||||
def add_attr(field: BoundField, attr: str):
|
||||
"""Add attributes to a form field directly in the template.
|
||||
|
||||
Attributes are `key=value` pairs, separated by commas.
|
||||
|
||||
Example:
|
||||
```jinja
|
||||
<form x-data="{alpineField: null}">
|
||||
{{ form.field|add_attr("x-model=alpineField") }}
|
||||
</form>
|
||||
```
|
||||
|
||||
will render :
|
||||
```html
|
||||
<form x-data="{alpineField: null}">
|
||||
<input type="..." x-model="alpineField">
|
||||
</form>
|
||||
```
|
||||
|
||||
Notes:
|
||||
Doing this gives the same result as setting the attribute
|
||||
directly in the python code.
|
||||
However, sometimes there are attributes that are tightly
|
||||
coupled to the frontend logic (like Alpine variables)
|
||||
and that shouldn't be declared outside of it.
|
||||
"""
|
||||
attrs = {}
|
||||
definition = attr.split(",")
|
||||
|
||||
for d in definition:
|
||||
if "=" not in d:
|
||||
attrs["class"] = d
|
||||
else:
|
||||
key, val = d.split("=")
|
||||
attrs[key] = val
|
||||
|
||||
return field.as_widget(attrs=attrs)
|
||||
|
@ -9,6 +9,7 @@ from django.utils.timezone import now
|
||||
from model_bakery import baker, seq
|
||||
from model_bakery.recipe import Recipe, foreign_key
|
||||
|
||||
from com.models import News
|
||||
from core.baker_recipes import (
|
||||
old_subscriber_user,
|
||||
subscriber_user,
|
||||
@ -22,6 +23,8 @@ from eboutic.models import Invoice, InvoiceItem
|
||||
class TestSearchUsers(TestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
# News.author has on_delete=PROTECT, so news must be deleted beforehand
|
||||
News.objects.all().delete()
|
||||
User.objects.all().delete()
|
||||
user_recipe = Recipe(
|
||||
User,
|
||||
|
@ -14,7 +14,7 @@
|
||||
#
|
||||
|
||||
from dataclasses import dataclass
|
||||
from datetime import date
|
||||
from datetime import date, timedelta
|
||||
|
||||
# Image utils
|
||||
from io import BytesIO
|
||||
@ -77,6 +77,22 @@ def get_start_of_semester(today: date | None = None) -> date:
|
||||
return autumn.replace(year=autumn.year - 1)
|
||||
|
||||
|
||||
def get_end_of_semester(today: date | None = None):
|
||||
"""Return the date of the end of the semester of the given date.
|
||||
If no date is given, return the end date of the current semester.
|
||||
"""
|
||||
# the algorithm is simple, albeit somewhat imprecise :
|
||||
# 1. get the start of the next semester
|
||||
# 2. Remove a month and a half for the autumn semester (summer holidays)
|
||||
# and 28 days for spring semester (february holidays)
|
||||
if today is None:
|
||||
today = localdate()
|
||||
semester_start = get_start_of_semester(today + timedelta(days=365 // 2))
|
||||
if semester_start.month == settings.SITH_SEMESTER_START_AUTUMN[0]:
|
||||
return semester_start - timedelta(days=45)
|
||||
return semester_start - timedelta(days=28)
|
||||
|
||||
|
||||
def get_semester_code(d: date | None = None) -> str:
|
||||
"""Return the semester code of the given date.
|
||||
If no date is given, return the semester code of the current semester.
|
||||
|
Reference in New Issue
Block a user