diff --git a/app/admin/forms.py b/app/admin/forms.py index c371616c..e28188be 100644 --- a/app/admin/forms.py +++ b/app/admin/forms.py @@ -18,6 +18,7 @@ class SiteProfileForm(FlaskForm): ]) sidebar = TextAreaField(_l('Sidebar')) about = TextAreaField(_l('About')) + announcement = TextAreaField(_l('Announcement at top of home page')) legal_information = TextAreaField(_l('Legal information')) contact_email = EmailField(_l('General instance contact email address'), validators=[DataRequired(), Length(min=5, max=255)]) submit = SubmitField(_l('Save')) diff --git a/app/admin/routes.py b/app/admin/routes.py index 3f5171c3..3487b351 100644 --- a/app/admin/routes.py +++ b/app/admin/routes.py @@ -54,6 +54,7 @@ def admin_site(): if site.id is None: db.session.add(site) db.session.commit() + set_setting('announcement', form.announcement.data) flash('Settings saved.') elif request.method == 'GET': form.name.data = site.name @@ -62,6 +63,7 @@ def admin_site(): form.sidebar.data = site.sidebar form.legal_information.data = site.legal_information form.contact_email.data = site.contact_email + form.announcement.data = get_setting('announcement', '') return render_template('admin/site.html', title=_('Site profile'), form=form, moderating_communities=moderating_communities(current_user.get_id()), joined_communities=joined_communities(current_user.get_id()), diff --git a/app/main/routes.py b/app/main/routes.py index 2fa6943a..d5d669b9 100644 --- a/app/main/routes.py +++ b/app/main/routes.py @@ -165,6 +165,7 @@ def home_page(type, sort): title=f"{g.site.name} - {g.site.description}", description=shorten_string(markdown_to_text(g.site.sidebar), 150), content_filters=content_filters, type=type, sort=sort, + announcement=allowlist_html(get_setting('announcement', '')), moderating_communities=moderating_communities(current_user.get_id()), joined_communities=joined_communities(current_user.get_id()), menu_topics=menu_topics(), site=g.site, diff --git a/app/static/styles.css b/app/static/styles.css index 71aabe5b..4eba6167 100644 --- a/app/static/styles.css +++ b/app/static/styles.css @@ -795,6 +795,20 @@ div.navbar { display: inline-block; } +#home_announcement { + padding: 0.5rem 1rem; + color: var(--bs-card-cap-color); + background-color: rgba(var(--bs-body-color-rgb), 0.03); + border-bottom: var(--bs-border-width) solid var(--bs-border-color-translucent); + margin-top: -8px; + margin-bottom: 8px; + margin-right: calc(var(--bs-gutter-x) * -0.5); + margin-left: calc(var(--bs-gutter-x) * -0.5); +} +#home_announcement p { + margin-bottom: 0; +} + /* high contrast */ @media (prefers-contrast: more) { :root { diff --git a/app/static/styles.scss b/app/static/styles.scss index 158a72c0..051bf930 100644 --- a/app/static/styles.scss +++ b/app/static/styles.scss @@ -384,6 +384,21 @@ div.navbar { } } +#home_announcement { + padding: 0.5rem 1rem; + color: var(--bs-card-cap-color); + background-color: rgba(var(--bs-body-color-rgb), 0.03); + border-bottom: var(--bs-border-width) solid var(--bs-border-color-translucent); + margin-top: -8px; + margin-bottom: 8px; + margin-right: calc(var(--bs-gutter-x) * -.5); + margin-left: calc(var(--bs-gutter-x) * -.5); + + p { + margin-bottom: 0; + } +} + /* high contrast */ @media (prefers-contrast: more) { diff --git a/app/templates/admin/site.html b/app/templates/admin/site.html index c8a62dac..e2841815 100644 --- a/app/templates/admin/site.html +++ b/app/templates/admin/site.html @@ -18,6 +18,8 @@ {{ render_field(form.description) }} {{ render_field(form.sidebar) }}

HTML is allowed in this field.

+ {{ render_field(form.announcement) }} +

HTML is allowed in this field.

{{ render_field(form.icon) }}

{{ _('About this instance') }}

diff --git a/app/templates/index.html b/app/templates/index.html index c6908855..23b326b6 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -9,6 +9,9 @@ {% block app_content %}
+ {% if announcement -%} +
{{ announcement|safe }}
+ {% endif -%} {% include "_home_nav.html" %}
{% for post in posts.items -%} diff --git a/app/utils.py b/app/utils.py index 0cc1d940..3376e228 100644 --- a/app/utils.py +++ b/app/utils.py @@ -369,8 +369,6 @@ def user_access(permission: str, user_id: int) -> bool: @cache.memoize(timeout=10) def community_membership(user: User, community: Community) -> int: - # @cache.memoize works with User.subscribed but cache.delete_memoized does not, making it bad to use on class methods. - # however cache.memoize and cache.delete_memoized works fine with normal functions if community is None: return False return user.subscribed(community.id)