Merge pull request #545 from eventcally/issues/544

Add announcement #544
This commit is contained in:
Daniel Grams 2023-09-07 23:14:00 +02:00 committed by GitHub
commit e0bcd269ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 174 additions and 92 deletions

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-09-06 17:11+0200\n"
"POT-Creation-Date: 2023-09-07 22:40+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -232,34 +232,38 @@ msgstr ""
msgid "Start page"
msgstr ""
#: project/forms/admin.py:17 project/forms/oauth2_client.py:24
#: project/forms/admin.py:16
msgid "Announcement"
msgstr ""
#: project/forms/admin.py:18 project/forms/oauth2_client.py:24
#: project/forms/user.py:13
msgid "Save"
msgstr ""
#: project/forms/admin.py:22
#: project/forms/admin.py:23
msgid "Reset for all users"
msgstr ""
#: project/forms/admin.py:24
#: project/forms/admin.py:25
msgid "Reset"
msgstr ""
#: project/forms/admin.py:28 project/forms/admin_unit_member.py:14
#: project/forms/admin.py:29 project/forms/admin_unit_member.py:14
#: project/forms/admin_unit_member.py:34
msgid "Roles"
msgstr ""
#: project/forms/admin.py:29 project/templates/admin/update_user.html:4
#: project/forms/admin.py:30 project/templates/admin/update_user.html:4
#: project/templates/admin/update_user.html:8
msgid "Update user"
msgstr ""
#: project/forms/admin.py:33 project/templates/admin/delete_user.html:6
#: project/forms/admin.py:34 project/templates/admin/delete_user.html:6
msgid "Delete user"
msgstr ""
#: project/forms/admin.py:34 project/forms/admin_unit.py:58
#: project/forms/admin.py:35 project/forms/admin_unit.py:58
#: project/forms/admin_unit_member.py:12 project/forms/admin_unit_member.py:25
#: project/forms/admin_unit_member.py:30 project/forms/event.py:112
#: project/forms/event_suggestion.py:38 project/forms/organizer.py:33
@ -271,60 +275,60 @@ msgstr ""
msgid "Email"
msgstr ""
#: project/forms/admin.py:39
#: project/forms/admin.py:40
msgid "Incoming reference requests allowed"
msgstr ""
#: project/forms/admin.py:40
#: project/forms/admin.py:41
msgid ""
"If set, other organizations can ask this organization to reference their "
"event."
msgstr ""
#: project/forms/admin.py:46
#: project/forms/admin.py:47
msgid "Suggestions enabled"
msgstr ""
#: project/forms/admin.py:47
#: project/forms/admin.py:48
msgid "If set, the organization can work with suggestions."
msgstr ""
#: project/forms/admin.py:51
#: project/forms/admin.py:52
msgid "Create other organizations"
msgstr ""
#: project/forms/admin.py:52
#: project/forms/admin.py:53
msgid "If set, members of the organization can create other organizations."
msgstr ""
#: project/forms/admin.py:58
#: project/forms/admin.py:59
msgid "Invite other organizations"
msgstr ""
#: project/forms/admin.py:59
#: project/forms/admin.py:60
msgid "If set, members of the organization can invite other organizations."
msgstr ""
#: project/forms/admin.py:65
#: project/forms/admin.py:66
msgid "Verify other organizations"
msgstr ""
#: project/forms/admin.py:66
#: project/forms/admin.py:67
msgid "If set, members of the organization can verify other organizations."
msgstr ""
#: project/forms/admin.py:71 project/templates/admin/update_admin_unit.html:4
#: project/forms/admin.py:72 project/templates/admin/update_admin_unit.html:4
#: project/templates/admin/update_admin_unit.html:8
msgid "Update organization"
msgstr ""
#: project/forms/admin.py:75 project/templates/admin/delete_admin_unit.html:6
#: project/forms/admin.py:76 project/templates/admin/delete_admin_unit.html:6
#: project/templates/admin_unit/request_deletion.html:6
#: project/templates/admin_unit/update.html:94
msgid "Delete organization"
msgstr ""
#: project/forms/admin.py:76 project/forms/admin_unit.py:147
#: project/forms/admin.py:77 project/forms/admin_unit.py:147
#: project/forms/admin_unit.py:152 project/forms/admin_unit.py:157
#: project/forms/event.py:90 project/forms/event.py:119
#: project/forms/event_place.py:30 project/forms/event_place.py:56
@ -340,27 +344,27 @@ msgstr ""
msgid "Name"
msgstr ""
#: project/forms/admin.py:80 project/forms/admin.py:87
#: project/forms/admin.py:81 project/forms/admin.py:88
msgid "Recipient"
msgstr ""
#: project/forms/admin.py:82
#: project/forms/admin.py:83
msgid "Send test mail synchronously"
msgstr ""
#: project/forms/admin.py:89 project/forms/admin.py:95
#: project/forms/admin.py:90 project/forms/admin.py:96
msgid "Test recipient"
msgstr ""
#: project/forms/admin.py:90
#: project/forms/admin.py:91
msgid "All users with enabled newsletter setting"
msgstr ""
#: project/forms/admin.py:96
#: project/forms/admin.py:97
msgid "Message"
msgstr ""
#: project/forms/admin.py:97
#: project/forms/admin.py:98
msgid "Send newsletter"
msgstr ""
@ -1918,7 +1922,7 @@ msgstr ""
#: project/templates/admin/reset_tos_accepted.html:4
#: project/templates/admin/reset_tos_accepted.html:8
#: project/templates/admin/settings.html:28
#: project/templates/admin/settings.html:29
#: project/templates/admin/users.html:48
msgid "Reset acceptance of terms of service and privacy"
msgstr ""

View File

@ -0,0 +1,28 @@
"""empty message
Revision ID: d2c04be821a7
Revises: 6634c8f0b7fc
Create Date: 2023-09-07 22:20:57.918736
"""
import sqlalchemy as sa
import sqlalchemy_utils
from alembic import op
from project import dbtypes
# revision identifiers, used by Alembic.
revision = "d2c04be821a7"
down_revision = "6634c8f0b7fc"
branch_labels = None
depends_on = None
def upgrade():
op.add_column(
"settings", sa.Column("announcement", sa.UnicodeText(), nullable=True)
)
def downgrade():
op.drop_column("settings", "announcement")

View File

@ -13,6 +13,7 @@ class AdminSettingsForm(FlaskForm):
contact = TextAreaField(lazy_gettext("Contact"), validators=[Optional()])
privacy = TextAreaField(lazy_gettext("Privacy"), validators=[Optional()])
start_page = TextAreaField(lazy_gettext("Start page"), validators=[Optional()])
announcement = TextAreaField(lazy_gettext("Announcement"), validators=[Optional()])
submit = SubmitField(lazy_gettext("Save"))

View File

@ -2,6 +2,7 @@ import os
from urllib.parse import quote_plus
from flask import url_for
from markupsafe import Markup
from project import app
from project.utils import (
@ -114,6 +115,15 @@ def get_context_processors():
return has_tos()
def get_announcement():
from project.services.admin import has_announcement, upsert_settings
if not has_announcement():
return None
settings = upsert_settings()
return Markup(settings.announcement) if settings.announcement else None
def get_current_user_roles():
from flask_security import current_user
@ -167,6 +177,7 @@ def get_context_processors():
get_manage_menu_options=get_manage_menu_options,
has_access=has_access,
has_tos=has_tos,
get_announcement=get_announcement,
get_current_user_roles=get_current_user_roles,
get_current_user_permissions=get_current_user_permissions,
)

View File

@ -1,4 +1,5 @@
from sqlalchemy import Column, Integer, UnicodeText
from sqlalchemy.orm import deferred
from project import db
from project.models.trackable_mixin import TrackableMixin
@ -7,8 +8,9 @@ from project.models.trackable_mixin import TrackableMixin
class Settings(db.Model, TrackableMixin):
__tablename__ = "settings"
id = Column(Integer(), primary_key=True)
tos = Column(UnicodeText())
legal_notice = Column(UnicodeText())
contact = Column(UnicodeText())
privacy = Column(UnicodeText())
start_page = Column(UnicodeText())
tos = deferred(Column(UnicodeText()))
legal_notice = deferred(Column(UnicodeText()))
contact = deferred(Column(UnicodeText()))
privacy = deferred(Column(UnicodeText()))
start_page = deferred(Column(UnicodeText()))
announcement = deferred(Column(UnicodeText()))

View File

@ -4,7 +4,7 @@ from project import db
from project.models import Settings, User
def upsert_settings():
def upsert_settings() -> Settings:
result = Settings.query.first()
if result is None:
result = Settings()
@ -13,12 +13,18 @@ def upsert_settings():
return result
def has_tos():
def has_tos() -> bool:
return db.session.scalar(
exists().where(func.coalesce(Settings.tos, "") != "").select()
)
def has_announcement() -> bool:
return db.session.scalar(
exists().where(func.coalesce(Settings.announcement, "") != "").select()
)
def reset_tos_accepted_for_users():
db.session.execute(update(User).values(tos_accepted_at=None))
db.session.commit()

View File

@ -1,3 +1,8 @@
{% set announcement = get_announcement() %}
{% if announcement %}
<div class="alert alert-warning" role="alert">{{ announcement }}</div>
{% endif %}
{%- with messages = get_flashed_messages(with_categories=true) -%}
{% if messages %}
{% for category, message in messages %}

View File

@ -20,6 +20,7 @@
{{ render_field_with_errors(form.legal_notice) }}
{{ render_field_with_errors(form.contact) }}
{{ render_field_with_errors(form.privacy) }}
{{ render_field_with_errors(form.announcement) }}
{{ render_field(form.submit) }}
</form>

View File

@ -7,6 +7,7 @@
{% endblock %}
{% block body_content__attribs %} style="padding:0;"{% endblock %}
{% block content_container_attribs %}{% endblock %}
{% block messages_container_attribs %}class="pt-3 px-3"{% endblock messages_container_attribs %}
{% block content %}
{% if content %}
{{ content }}

View File

@ -323,7 +323,9 @@
{% block content_container -%}
<main {% block content_container_attribs %}class="p-3"{% endblock content_container_attribs %}>
{% include "_messages.html" %}
<div {% block messages_container_attribs %}{% endblock messages_container_attribs %}>
{% include "_messages.html" %}
</div>
{% block content -%}
{%- endblock content %}

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-09-06 17:11+0200\n"
"POT-Creation-Date: 2023-09-07 22:40+0200\n"
"PO-Revision-Date: 2020-06-07 18:51+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
@ -233,34 +233,38 @@ msgstr "Datenschutz"
msgid "Start page"
msgstr "Startseite"
#: project/forms/admin.py:17 project/forms/oauth2_client.py:24
#: project/forms/admin.py:16
msgid "Announcement"
msgstr "Ankündigung"
#: project/forms/admin.py:18 project/forms/oauth2_client.py:24
#: project/forms/user.py:13
msgid "Save"
msgstr "Speichern"
#: project/forms/admin.py:22
#: project/forms/admin.py:23
msgid "Reset for all users"
msgstr "Für alle Nutzer zurücksetzen"
#: project/forms/admin.py:24
#: project/forms/admin.py:25
msgid "Reset"
msgstr "Zurücksetzen"
#: project/forms/admin.py:28 project/forms/admin_unit_member.py:14
#: project/forms/admin.py:29 project/forms/admin_unit_member.py:14
#: project/forms/admin_unit_member.py:34
msgid "Roles"
msgstr "Rollen"
#: project/forms/admin.py:29 project/templates/admin/update_user.html:4
#: project/forms/admin.py:30 project/templates/admin/update_user.html:4
#: project/templates/admin/update_user.html:8
msgid "Update user"
msgstr "Nutzer aktualisieren"
#: project/forms/admin.py:33 project/templates/admin/delete_user.html:6
#: project/forms/admin.py:34 project/templates/admin/delete_user.html:6
msgid "Delete user"
msgstr "Nutzer löschen"
#: project/forms/admin.py:34 project/forms/admin_unit.py:58
#: project/forms/admin.py:35 project/forms/admin_unit.py:58
#: project/forms/admin_unit_member.py:12 project/forms/admin_unit_member.py:25
#: project/forms/admin_unit_member.py:30 project/forms/event.py:112
#: project/forms/event_suggestion.py:38 project/forms/organizer.py:33
@ -272,11 +276,11 @@ msgstr "Nutzer löschen"
msgid "Email"
msgstr "Email"
#: project/forms/admin.py:39
#: project/forms/admin.py:40
msgid "Incoming reference requests allowed"
msgstr "Eingehende Empfehlungsanfragen erlauben"
#: project/forms/admin.py:40
#: project/forms/admin.py:41
msgid ""
"If set, other organizations can ask this organization to reference their "
"event."
@ -284,56 +288,56 @@ msgstr ""
"Wenn gesetzt, können andere Organisationen diese Organisation bitten, "
"deren Veranstaltungen zu empfehlen."
#: project/forms/admin.py:46
#: project/forms/admin.py:47
msgid "Suggestions enabled"
msgstr "Vorschläge aktiv"
#: project/forms/admin.py:47
#: project/forms/admin.py:48
msgid "If set, the organization can work with suggestions."
msgstr "Wenn gesetzt, kann die Organisation mit Vorschlägen arbeiten."
#: project/forms/admin.py:51
#: project/forms/admin.py:52
msgid "Create other organizations"
msgstr "Andere Organisationen erstellen"
#: project/forms/admin.py:52
#: project/forms/admin.py:53
msgid "If set, members of the organization can create other organizations."
msgstr ""
"Wenn gesetzt, können Mitglieder der Organisation andere Organisationen "
"erstellen."
#: project/forms/admin.py:58
#: project/forms/admin.py:59
msgid "Invite other organizations"
msgstr "Andere Organisationen einladen"
#: project/forms/admin.py:59
#: project/forms/admin.py:60
msgid "If set, members of the organization can invite other organizations."
msgstr ""
"Wenn gesetzt, können Mitglieder der Organisation andere Organisationen "
"einladen."
#: project/forms/admin.py:65
#: project/forms/admin.py:66
msgid "Verify other organizations"
msgstr "Andere Organisationen verifizieren"
#: project/forms/admin.py:66
#: project/forms/admin.py:67
msgid "If set, members of the organization can verify other organizations."
msgstr ""
"Wenn gesetzt, können Mitglieder der Organisation andere Organisationen "
"verifizieren."
#: project/forms/admin.py:71 project/templates/admin/update_admin_unit.html:4
#: project/forms/admin.py:72 project/templates/admin/update_admin_unit.html:4
#: project/templates/admin/update_admin_unit.html:8
msgid "Update organization"
msgstr "Organisation aktualisieren"
#: project/forms/admin.py:75 project/templates/admin/delete_admin_unit.html:6
#: project/forms/admin.py:76 project/templates/admin/delete_admin_unit.html:6
#: project/templates/admin_unit/request_deletion.html:6
#: project/templates/admin_unit/update.html:94
msgid "Delete organization"
msgstr "Organisation löschen"
#: project/forms/admin.py:76 project/forms/admin_unit.py:147
#: project/forms/admin.py:77 project/forms/admin_unit.py:147
#: project/forms/admin_unit.py:152 project/forms/admin_unit.py:157
#: project/forms/event.py:90 project/forms/event.py:119
#: project/forms/event_place.py:30 project/forms/event_place.py:56
@ -349,27 +353,27 @@ msgstr "Organisation löschen"
msgid "Name"
msgstr "Name"
#: project/forms/admin.py:80 project/forms/admin.py:87
#: project/forms/admin.py:81 project/forms/admin.py:88
msgid "Recipient"
msgstr "Empfänger"
#: project/forms/admin.py:82
#: project/forms/admin.py:83
msgid "Send test mail synchronously"
msgstr "Test-Mail synchron senden"
#: project/forms/admin.py:89 project/forms/admin.py:95
#: project/forms/admin.py:90 project/forms/admin.py:96
msgid "Test recipient"
msgstr "Test-Empfänger"
#: project/forms/admin.py:90
#: project/forms/admin.py:91
msgid "All users with enabled newsletter setting"
msgstr "Alle Nutzer mit aktiviertem Newsletter"
#: project/forms/admin.py:96
#: project/forms/admin.py:97
msgid "Message"
msgstr "Nachricht"
#: project/forms/admin.py:97
#: project/forms/admin.py:98
msgid "Send newsletter"
msgstr "Newsletter senden"
@ -1979,7 +1983,7 @@ msgstr "Mails erfolgreich gesendet"
#: project/templates/admin/reset_tos_accepted.html:4
#: project/templates/admin/reset_tos_accepted.html:8
#: project/templates/admin/settings.html:28
#: project/templates/admin/settings.html:29
#: project/templates/admin/users.html:48
msgid "Reset acceptance of terms of service and privacy"
msgstr "Akzeptanz der Nutzungsbedingungen und des Datenschutzes zurücksetzen"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2023-09-06 17:11+0200\n"
"POT-Creation-Date: 2023-09-07 22:40+0200\n"
"PO-Revision-Date: 2021-04-30 15:04+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@ -233,34 +233,38 @@ msgstr ""
msgid "Start page"
msgstr ""
#: project/forms/admin.py:17 project/forms/oauth2_client.py:24
#: project/forms/admin.py:16
msgid "Announcement"
msgstr ""
#: project/forms/admin.py:18 project/forms/oauth2_client.py:24
#: project/forms/user.py:13
msgid "Save"
msgstr ""
#: project/forms/admin.py:22
#: project/forms/admin.py:23
msgid "Reset for all users"
msgstr ""
#: project/forms/admin.py:24
#: project/forms/admin.py:25
msgid "Reset"
msgstr ""
#: project/forms/admin.py:28 project/forms/admin_unit_member.py:14
#: project/forms/admin.py:29 project/forms/admin_unit_member.py:14
#: project/forms/admin_unit_member.py:34
msgid "Roles"
msgstr ""
#: project/forms/admin.py:29 project/templates/admin/update_user.html:4
#: project/forms/admin.py:30 project/templates/admin/update_user.html:4
#: project/templates/admin/update_user.html:8
msgid "Update user"
msgstr ""
#: project/forms/admin.py:33 project/templates/admin/delete_user.html:6
#: project/forms/admin.py:34 project/templates/admin/delete_user.html:6
msgid "Delete user"
msgstr ""
#: project/forms/admin.py:34 project/forms/admin_unit.py:58
#: project/forms/admin.py:35 project/forms/admin_unit.py:58
#: project/forms/admin_unit_member.py:12 project/forms/admin_unit_member.py:25
#: project/forms/admin_unit_member.py:30 project/forms/event.py:112
#: project/forms/event_suggestion.py:38 project/forms/organizer.py:33
@ -272,60 +276,60 @@ msgstr ""
msgid "Email"
msgstr ""
#: project/forms/admin.py:39
#: project/forms/admin.py:40
msgid "Incoming reference requests allowed"
msgstr ""
#: project/forms/admin.py:40
#: project/forms/admin.py:41
msgid ""
"If set, other organizations can ask this organization to reference their "
"event."
msgstr ""
#: project/forms/admin.py:46
#: project/forms/admin.py:47
msgid "Suggestions enabled"
msgstr ""
#: project/forms/admin.py:47
#: project/forms/admin.py:48
msgid "If set, the organization can work with suggestions."
msgstr ""
#: project/forms/admin.py:51
#: project/forms/admin.py:52
msgid "Create other organizations"
msgstr ""
#: project/forms/admin.py:52
#: project/forms/admin.py:53
msgid "If set, members of the organization can create other organizations."
msgstr ""
#: project/forms/admin.py:58
#: project/forms/admin.py:59
msgid "Invite other organizations"
msgstr ""
#: project/forms/admin.py:59
#: project/forms/admin.py:60
msgid "If set, members of the organization can invite other organizations."
msgstr ""
#: project/forms/admin.py:65
#: project/forms/admin.py:66
msgid "Verify other organizations"
msgstr ""
#: project/forms/admin.py:66
#: project/forms/admin.py:67
msgid "If set, members of the organization can verify other organizations."
msgstr ""
#: project/forms/admin.py:71 project/templates/admin/update_admin_unit.html:4
#: project/forms/admin.py:72 project/templates/admin/update_admin_unit.html:4
#: project/templates/admin/update_admin_unit.html:8
msgid "Update organization"
msgstr ""
#: project/forms/admin.py:75 project/templates/admin/delete_admin_unit.html:6
#: project/forms/admin.py:76 project/templates/admin/delete_admin_unit.html:6
#: project/templates/admin_unit/request_deletion.html:6
#: project/templates/admin_unit/update.html:94
msgid "Delete organization"
msgstr ""
#: project/forms/admin.py:76 project/forms/admin_unit.py:147
#: project/forms/admin.py:77 project/forms/admin_unit.py:147
#: project/forms/admin_unit.py:152 project/forms/admin_unit.py:157
#: project/forms/event.py:90 project/forms/event.py:119
#: project/forms/event_place.py:30 project/forms/event_place.py:56
@ -341,27 +345,27 @@ msgstr ""
msgid "Name"
msgstr ""
#: project/forms/admin.py:80 project/forms/admin.py:87
#: project/forms/admin.py:81 project/forms/admin.py:88
msgid "Recipient"
msgstr ""
#: project/forms/admin.py:82
#: project/forms/admin.py:83
msgid "Send test mail synchronously"
msgstr ""
#: project/forms/admin.py:89 project/forms/admin.py:95
#: project/forms/admin.py:90 project/forms/admin.py:96
msgid "Test recipient"
msgstr ""
#: project/forms/admin.py:90
#: project/forms/admin.py:91
msgid "All users with enabled newsletter setting"
msgstr ""
#: project/forms/admin.py:96
#: project/forms/admin.py:97
msgid "Message"
msgstr ""
#: project/forms/admin.py:97
#: project/forms/admin.py:98
msgid "Send newsletter"
msgstr ""
@ -1926,7 +1930,7 @@ msgstr ""
#: project/templates/admin/reset_tos_accepted.html:4
#: project/templates/admin/reset_tos_accepted.html:8
#: project/templates/admin/settings.html:28
#: project/templates/admin/settings.html:29
#: project/templates/admin/users.html:48
msgid "Reset acceptance of terms of service and privacy"
msgstr ""

View File

@ -107,3 +107,16 @@ def test_sitemap_xml(seeder, app, utils):
result = runner.invoke(args=["seo", "generate-sitemap"])
assert result.exit_code == 0
utils.get_endpoint_ok("sitemap_xml")
def test_announcement(app, db, utils: UtilActions):
with app.app_context():
from project.services.admin import upsert_settings
settings = upsert_settings()
settings.announcement = "Wartungsarbeiten"
db.session.commit()
url = utils.get_url("home")
response = utils.get_ok(url)
assert b"Wartungsarbeiten" in response.data