feat(instance): (WIP) Afficher des messages globaux en tête des pages
Parent
ffdb730085
révision
24aa0b540f
|
@ -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",
|
||||
},
|
||||
),
|
||||
]
|
|
@ -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"
|
||||
|
|
|
@ -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">
|
||||
×
|
||||
</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 }}
|
||||
|
|
|
@ -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):
|
||||
|
|
Chargement…
Référencer dans un nouveau ticket