From f021995bb0b1fbcaffc87bff9d4e5e897bae7721 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sat, 22 Feb 2025 09:20:38 +0100 Subject: [PATCH 1/4] feat(startpage/External_Links): add link model and make link visualization on startpage dynamic, factor out contact details --- jdav_web/jdav_web/settings/components/jet.py | 1 + jdav_web/jdav_web/views.py | 20 ++- jdav_web/startpage/admin.py | 15 +- jdav_web/startpage/migrations/0004_link.py | 25 +++ .../migrations/0005_alter_link_description.py | 18 ++ jdav_web/startpage/models.py | 24 +++ .../templates/startpage/contact.html | 18 ++ jdav_web/templates/admin/index.html | 154 +++++++++++------- 8 files changed, 214 insertions(+), 61 deletions(-) create mode 100644 jdav_web/startpage/migrations/0004_link.py create mode 100644 jdav_web/startpage/migrations/0005_alter_link_description.py create mode 100644 jdav_web/startpage/templates/startpage/contact.html diff --git a/jdav_web/jdav_web/settings/components/jet.py b/jdav_web/jdav_web/settings/components/jet.py index e261545..7fe28cd 100644 --- a/jdav_web/jdav_web/settings/components/jet.py +++ b/jdav_web/jdav_web/settings/components/jet.py @@ -52,6 +52,7 @@ JET_SIDE_MENU_ITEMS = [ {'app_label': 'startpage', 'permissions': ['startpage'], 'items': [ {'name': 'section', 'permissions': ['startpage.view_section']}, {'name': 'post', 'permissions': ['startpage.view_post']}, + {'name': 'link', 'permissions': ['startpage.view_link']}, ]}, {'label': 'Externe Links', 'items' : [ { 'label': 'Nextcloud', 'url': CLOUD_LINK, 'url_blank': True }, diff --git a/jdav_web/jdav_web/views.py b/jdav_web/jdav_web/views.py index 1d6c251..c692dbe 100644 --- a/jdav_web/jdav_web/views.py +++ b/jdav_web/jdav_web/views.py @@ -2,7 +2,9 @@ from django.http import HttpResponse from django.views.static import serve from django.conf import settings from django.contrib.admin.views.decorators import staff_member_required - +from django.contrib import admin +from django.shortcuts import render +from startpage.models import Link import re @@ -28,3 +30,19 @@ def media_access(request, path): return media_unprotected(request, path) else: return media_protected(request, path) + + +def custom_admin_view(request): + """ + this methods provides access to models in order to render a custom admin page index site. + """ + app_list = admin.site.get_app_list(request) + context = { + 'app_list': app_list, + 'site_header': admin.site.site_header, + 'site_title': admin.site.site_title, + 'external_links': Link.objects.all() + } + return render(request, 'admin/index.html', context) + +admin.site.index = custom_admin_view diff --git a/jdav_web/startpage/admin.py b/jdav_web/startpage/admin.py index 724f17d..e950659 100644 --- a/jdav_web/startpage/admin.py +++ b/jdav_web/startpage/admin.py @@ -2,8 +2,10 @@ from django.contrib import admin from django.conf import settings from django import forms from django.utils.translation import gettext_lazy as _ +from django.db.models import TextField +from django.forms import Textarea -from .models import Post, Image, Section, MemberOnPost +from .models import Post, Image, Section, MemberOnPost, Link class ImageInline(admin.TabularInline): @@ -40,3 +42,14 @@ class SectionForm(forms.ModelForm): class SectionAdmin(admin.ModelAdmin): list_display = ['title', 'absolute_urlname'] form = SectionForm + + +@admin.register(Link) +class LinkAdmin(admin.ModelAdmin): + list_display = ['title', 'url', 'visible'] + + formfield_overrides = { + TextField: {'widget': Textarea(attrs={'rows': 2, 'cols': 40})} + } + + diff --git a/jdav_web/startpage/migrations/0004_link.py b/jdav_web/startpage/migrations/0004_link.py new file mode 100644 index 0000000..b3f6184 --- /dev/null +++ b/jdav_web/startpage/migrations/0004_link.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0.1 on 2025-02-24 22:35 + +from django.db import migrations, models +import utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('startpage', '0003_alter_post_section'), + ] + + operations = [ + migrations.CreateModel( + name='Link', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('icon', utils.RestrictedFileField(blank=True, upload_to='icons', verbose_name='Link Icon')), + ('title', models.CharField(blank=True, default='', max_length=100, verbose_name='Title')), + ('description', models.CharField(blank=True, default='', max_length=300, verbose_name='Description')), + ('url', models.URLField(max_length=250)), + ('visible', models.BooleanField(default=True, verbose_name='Sichtbar')), + ], + ), + ] diff --git a/jdav_web/startpage/migrations/0005_alter_link_description.py b/jdav_web/startpage/migrations/0005_alter_link_description.py new file mode 100644 index 0000000..ee10b97 --- /dev/null +++ b/jdav_web/startpage/migrations/0005_alter_link_description.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.1 on 2025-02-25 00:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('startpage', '0004_link'), + ] + + operations = [ + migrations.AlterField( + model_name='link', + name='description', + field=models.TextField(blank=True, default='', verbose_name='Description'), + ), + ] diff --git a/jdav_web/startpage/models.py b/jdav_web/startpage/models.py index 5a78512..070fa00 100644 --- a/jdav_web/startpage/models.py +++ b/jdav_web/startpage/models.py @@ -101,3 +101,27 @@ class MemberOnPost(models.Model): class Meta: verbose_name = _("Person") verbose_name_plural = _("Persons") + + +class Link(models.Model): + """ + Link to external resources that should be shown on the internal startpage. + """ + + title = models.CharField(_('Title'), max_length=100, default='', blank=True) + description = models.TextField(_('Description'), default='', blank=True) + url = models.URLField(max_length=250) + + icon = RestrictedFileField(verbose_name=_('Link Icon'), + upload_to='icons', + blank=True, + max_upload_size=5, + content_types=['image/jpeg', + 'image/png', + 'image/gif']) + + visible = models.BooleanField(verbose_name=_('Sichtbar'), default=True) + + def __str__(self): + return self.title + \ No newline at end of file diff --git a/jdav_web/startpage/templates/startpage/contact.html b/jdav_web/startpage/templates/startpage/contact.html new file mode 100644 index 0000000..ac75a82 --- /dev/null +++ b/jdav_web/startpage/templates/startpage/contact.html @@ -0,0 +1,18 @@ +{% load common %} + + +

Ansprechpersonen

+{% comment %} +Nicht alles im Leben ist ein automatisierter Prozess. Falls du trotz KOMPASS nicht mehr +weiterweißt oder sonst der Schuh drückt, schreibe eine E-Mail an eine der folgenden Personen: +{% endcomment %} +
+ + + + + \ No newline at end of file diff --git a/jdav_web/templates/admin/index.html b/jdav_web/templates/admin/index.html index cf085d1..7bb5776 100644 --- a/jdav_web/templates/admin/index.html +++ b/jdav_web/templates/admin/index.html @@ -98,67 +98,103 @@ Hier kannst du E-Mails an deine Gruppe oder an andere Menschen in der JDAV {% se {% block sidebar %}
+ Jugendreferat + + jugendreferat@jdav-hd.de +
- - - - - - - - - - - - - - - - -
- Nextcloud - - Hier liegen Vorlagen für Formulare und nützliche Handbücher. -
- DAV 360 - - Zugriff zu Online Office, Teams und deinem DAV Mailaccount. -
- Julei-Wiki - - Informationen zum Jugendleiter*in-sein. -
- Dokumentation - - Kompass Dokumentation -
- -

Ansprechpersonen

-{% comment %} -Nicht alles im Leben ist ein automatisierter Prozess. Falls du trotz KOMPASS nicht mehr -weiterweißt oder sonst der Schuh drückt, schreibe eine E-Mail an eine der folgenden Personen: -{% endcomment %}
- - - - - - - - - -
- Jugendreferat - - jugendreferat@jdav-hd.de -
- Fragen zum Kompass - - digitales@jdav-hd.de -
+ +

Links

+ + + + + +
+ +{% include "startpage/contact.html" %} +
{% endblock %} -- 2.38.4 From 63b886f6955f5aa2a77bb0483625c8cee34da0af Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Tue, 25 Feb 2025 10:48:00 +0100 Subject: [PATCH 2/4] squashed link migration --- ...ink.py => 0004_internal_startpage_links.py} | 4 ++-- .../migrations/0005_alter_link_description.py | 18 ------------------ 2 files changed, 2 insertions(+), 20 deletions(-) rename jdav_web/startpage/migrations/{0004_link.py => 0004_internal_startpage_links.py} (82%) delete mode 100644 jdav_web/startpage/migrations/0005_alter_link_description.py diff --git a/jdav_web/startpage/migrations/0004_link.py b/jdav_web/startpage/migrations/0004_internal_startpage_links.py similarity index 82% rename from jdav_web/startpage/migrations/0004_link.py rename to jdav_web/startpage/migrations/0004_internal_startpage_links.py index b3f6184..8258909 100644 --- a/jdav_web/startpage/migrations/0004_link.py +++ b/jdav_web/startpage/migrations/0004_internal_startpage_links.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.1 on 2025-02-24 22:35 +# Generated by Django 4.0.1 on 2025-02-25 09:47 from django.db import migrations, models import utils @@ -17,7 +17,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('icon', utils.RestrictedFileField(blank=True, upload_to='icons', verbose_name='Link Icon')), ('title', models.CharField(blank=True, default='', max_length=100, verbose_name='Title')), - ('description', models.CharField(blank=True, default='', max_length=300, verbose_name='Description')), + ('description', models.TextField(blank=True, default='', verbose_name='Description')), ('url', models.URLField(max_length=250)), ('visible', models.BooleanField(default=True, verbose_name='Sichtbar')), ], diff --git a/jdav_web/startpage/migrations/0005_alter_link_description.py b/jdav_web/startpage/migrations/0005_alter_link_description.py deleted file mode 100644 index ee10b97..0000000 --- a/jdav_web/startpage/migrations/0005_alter_link_description.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.0.1 on 2025-02-25 00:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('startpage', '0004_link'), - ] - - operations = [ - migrations.AlterField( - model_name='link', - name='description', - field=models.TextField(blank=True, default='', verbose_name='Description'), - ), - ] -- 2.38.4 From 1337e0894cfe522ff0f0b6d7ea5515117ad93f80 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:14:40 +0100 Subject: [PATCH 3/4] fixed html tags and link verbose names --- .../startpage/migrations/0004_internal_startpage_links.py | 6 +++++- jdav_web/startpage/models.py | 5 ++++- jdav_web/startpage/templates/startpage/contact.html | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/jdav_web/startpage/migrations/0004_internal_startpage_links.py b/jdav_web/startpage/migrations/0004_internal_startpage_links.py index 8258909..ba60d3a 100644 --- a/jdav_web/startpage/migrations/0004_internal_startpage_links.py +++ b/jdav_web/startpage/migrations/0004_internal_startpage_links.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.1 on 2025-02-25 09:47 +# Generated by Django 4.0.1 on 2025-02-25 12:10 from django.db import migrations, models import utils @@ -21,5 +21,9 @@ class Migration(migrations.Migration): ('url', models.URLField(max_length=250)), ('visible', models.BooleanField(default=True, verbose_name='Sichtbar')), ], + options={ + 'verbose_name': 'Link', + 'verbose_name_plural': 'Links', + }, ), ] diff --git a/jdav_web/startpage/models.py b/jdav_web/startpage/models.py index 070fa00..47cec2c 100644 --- a/jdav_web/startpage/models.py +++ b/jdav_web/startpage/models.py @@ -121,7 +121,10 @@ class Link(models.Model): 'image/gif']) visible = models.BooleanField(verbose_name=_('Sichtbar'), default=True) - + class Meta: + verbose_name = _('Link') + verbose_name_plural = _('Links') + def __str__(self): return self.title \ No newline at end of file diff --git a/jdav_web/startpage/templates/startpage/contact.html b/jdav_web/startpage/templates/startpage/contact.html index ac75a82..096c902 100644 --- a/jdav_web/startpage/templates/startpage/contact.html +++ b/jdav_web/startpage/templates/startpage/contact.html @@ -15,4 +15,6 @@ weiterweißt oder sonst der Schuh drückt, schreibe eine E-Mail an eine der folg jugendreferat@jdav-hd.de - \ No newline at end of file + + + \ No newline at end of file -- 2.38.4 From d78ec62a3ba8cd23b9205ef3e90399ce2a769cef Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Tue, 25 Feb 2025 13:23:03 +0100 Subject: [PATCH 4/4] some fixes --- .../startpage/locale/de/LC_MESSAGES/django.po | 18 +++++++++++++- .../0004_internal_startpage_links.py | 4 ++-- jdav_web/startpage/models.py | 24 +++++++++---------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po index 568b80d..7274cf4 100644 --- a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-01 21:11+0100\n" +"POT-Creation-Date: 2025-02-25 13:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -108,6 +108,22 @@ msgstr "Person" msgid "Persons" msgstr "Personen" +#: startpage/models.py +msgid "Link Icon" +msgstr "Link Logo" + +#: startpage/models.py +msgid "Visible" +msgstr "Sichtbar" + +#: startpage/models.py +msgid "Link" +msgstr "Link" + +#: startpage/models.py +msgid "Links" +msgstr "Links" + #: startpage/templates/startpage/faq_content.html #: startpage/templates/startpage/group_introduction.html #: startpage/templates/startpage/impressum_content.html diff --git a/jdav_web/startpage/migrations/0004_internal_startpage_links.py b/jdav_web/startpage/migrations/0004_internal_startpage_links.py index ba60d3a..6d3850a 100644 --- a/jdav_web/startpage/migrations/0004_internal_startpage_links.py +++ b/jdav_web/startpage/migrations/0004_internal_startpage_links.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.1 on 2025-02-25 12:10 +# Generated by Django 4.0.1 on 2025-02-25 12:20 from django.db import migrations, models import utils @@ -19,7 +19,7 @@ class Migration(migrations.Migration): ('title', models.CharField(blank=True, default='', max_length=100, verbose_name='Title')), ('description', models.TextField(blank=True, default='', verbose_name='Description')), ('url', models.URLField(max_length=250)), - ('visible', models.BooleanField(default=True, verbose_name='Sichtbar')), + ('visible', models.BooleanField(default=True, verbose_name='Visible')), ], options={ 'verbose_name': 'Link', diff --git a/jdav_web/startpage/models.py b/jdav_web/startpage/models.py index 47cec2c..583e2c5 100644 --- a/jdav_web/startpage/models.py +++ b/jdav_web/startpage/models.py @@ -107,24 +107,24 @@ class Link(models.Model): """ Link to external resources that should be shown on the internal startpage. """ - + title = models.CharField(_('Title'), max_length=100, default='', blank=True) description = models.TextField(_('Description'), default='', blank=True) url = models.URLField(max_length=250) - + icon = RestrictedFileField(verbose_name=_('Link Icon'), - upload_to='icons', - blank=True, - max_upload_size=5, - content_types=['image/jpeg', - 'image/png', - 'image/gif']) - - visible = models.BooleanField(verbose_name=_('Sichtbar'), default=True) + upload_to='icons', + blank=True, + max_upload_size=5, + content_types=['image/jpeg', + 'image/png', + 'image/gif']) + + visible = models.BooleanField(verbose_name=_('Visible'), default=True) + class Meta: verbose_name = _('Link') verbose_name_plural = _('Links') - + def __str__(self): return self.title - \ No newline at end of file -- 2.38.4