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 %}
+
+
+
+ |
+ Jugendreferat
+ |
+
+ jugendreferat@jdav-hd.de
+ |
+
\ 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 %}
-
Links
-
-
- |
- 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 %}
+
+{% 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