feat(instance): (WIP) Afficher des messages globaux en tête des pages

pull/225/head
Zoé Martin 2022-01-17 17:03:06 +01:00
Parent ffdb730085
révision 24aa0b540f
4 fichiers modifiés avec 96 ajouts et 1 suppressions

Voir le fichier

@ -0,0 +1,34 @@
# Generated by Django 3.2.11 on 2022-01-17 14:45
import benevalibre.instance.models
import benevalibre.utils.validators
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('instance', '0006_termsofuse'),
]
operations = [
migrations.CreateModel(
name='InstanceMessage',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(verbose_name='contenu')),
('broadcast_date', models.DateTimeField(default=datetime.datetime.today, validators=[benevalibre.utils.validators.validate_after2k, benevalibre.utils.validators.validate_before1y], verbose_name='date de diffusion')),
('expiration_date', models.DateTimeField(default=benevalibre.instance.models.InstanceMessage.default_expiration_date, null=True, validators=[benevalibre.utils.validators.validate_after2k, benevalibre.utils.validators.validate_before1y], verbose_name="date d'expiration")),
('target', models.CharField(choices=[('ALL', 'tout le monde'), ('MNG', "les managers d'asso")], default='ALL', max_length=3)),
('author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': "message d'instance",
'verbose_name_plural': "messages d'instance",
},
),
]

Voir le fichier

@ -1,3 +1,5 @@
from datetime import datetime, timedelta
from django.core.exceptions import ValidationError
from django.db import models
@ -5,6 +7,7 @@ import reversion
from benevalibre.utils.mixins import HTMLDocString
from benevalibre.utils.models import AbstractRole, AbstractTaxonomy
from benevalibre.utils.validators import validate_after2k, validate_before1y
from .validators import validate_is_pdf
@ -165,3 +168,47 @@ class TermsOfUse(models.Model):
validators=[validate_is_pdf],
help_text="Format attendu : pdf",
)
class InstanceMessage(models.Model):
"""
Message publié par un·e administrateur·ice pour prévenir les usager·es d'une
instance, par exemple lors d'une mise à jour où d'un évènement.
"""
class TargetType(models.TextChoices):
EVERYONE = 'ALL', 'tout le monde'
MANAGERS = 'MNG', 'les managers d\'asso'
def default_expiration_date():
return datetime.today() + timedelta(days=1)
content = models.TextField("contenu")
author = models.ForeignKey(
'accounts.User',
null=True,
on_delete=models.SET_NULL,
)
broadcast_date = models.DateTimeField(
"date de diffusion",
default=datetime.today,
validators=[validate_after2k, validate_before1y]
)
expiration_date = models.DateTimeField(
"date d'expiration",
null=True,
default=default_expiration_date,
validators=[validate_after2k, validate_before1y]
)
target = models.CharField(
max_length=3,
choices=TargetType.choices,
default=TargetType.EVERYONE,
)
class Meta:
verbose_name = "message d'instance"
verbose_name_plural = "messages d'instance"

Voir le fichier

@ -1,5 +1,14 @@
{% if messages %}
{% if messages or page.messages %}
<div class="app-messages" aria-live="polite" aria-atomic="true">
{% for message in page.messages %}
<div class="alert alert-dismissible alert-info mb-0 border-top-0 rounded-0">
{{ message.content }}
<button type="button" class="close" data-dismiss="alert" aria-label="Fermer">
&times;
</button>
</div>
{% endfor %}
{% for message in messages %}
<div class="alert alert-dismissible{% if message.tags %} alert-{{ message.tags }}{% endif %} mb-0 border-top-0 rounded-0">
{{ message }}

Voir le fichier

@ -8,6 +8,7 @@ from django.db.models import Q
from django.template.loader import render_to_string
from benevalibre.accounts.models import User
from benevalibre.instance.models import InstanceMessage
from .html import fa_icon
@ -56,12 +57,16 @@ class PageMixin:
"""
return []
def get_instance_messages(self):
return InstanceMessage.objects.all()
def get_page_context(self):
"""Provide the context to by used for this page."""
return {
'title': self.get_title(),
'header_title': self.get_header_title(),
'titlebuttons': self.get_titlebuttons(),
'messages': self.get_instance_messages(),
}
def get_context_data(self, **kwargs):