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/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 new file mode 100644 index 0000000..6d3850a --- /dev/null +++ b/jdav_web/startpage/migrations/0004_internal_startpage_links.py @@ -0,0 +1,29 @@ +# Generated by Django 4.0.1 on 2025-02-25 12:20 + +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.TextField(blank=True, default='', verbose_name='Description')), + ('url', models.URLField(max_length=250)), + ('visible', models.BooleanField(default=True, verbose_name='Visible')), + ], + options={ + 'verbose_name': 'Link', + 'verbose_name_plural': 'Links', + }, + ), + ] diff --git a/jdav_web/startpage/models.py b/jdav_web/startpage/models.py index 5a78512..583e2c5 100644 --- a/jdav_web/startpage/models.py +++ b/jdav_web/startpage/models.py @@ -101,3 +101,30 @@ 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=_('Visible'), default=True) + + class Meta: + verbose_name = _('Link') + verbose_name_plural = _('Links') + + def __str__(self): + return self.title diff --git a/jdav_web/startpage/templates/startpage/contact.html b/jdav_web/startpage/templates/startpage/contact.html new file mode 100644 index 0000000..096c902 --- /dev/null +++ b/jdav_web/startpage/templates/startpage/contact.html @@ -0,0 +1,20 @@ +{% 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 %} {% endblock %}