From 72570e25c273000431a79172c09fed9deefb0def Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Mon, 3 Nov 2025 18:46:24 +0100 Subject: [PATCH 1/4] add firstname and surname to search field --- fet2020/finance/admin.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fet2020/finance/admin.py b/fet2020/finance/admin.py index a04647de..936ac76c 100644 --- a/fet2020/finance/admin.py +++ b/fet2020/finance/admin.py @@ -204,7 +204,12 @@ class BillAdmin(admin.ModelAdmin): actions = ["make_cleared", "make_finished"] autocomplete_fields = ["resolution"] list_filter = ["status", "affiliation", "payer", BillPeriodeFilter] - search_fields = ["purpose", "bankdata__name"] + search_fields = [ + "purpose", + "bankdata__name", + "bill_creator__firstname", + "bill_creator__surname", + ] show_facets = admin.ShowFacets.ALWAYS ordering = ["-id"] From 2024466a484ff370f63418a79754312bfb14554e Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Tue, 4 Nov 2025 18:49:03 +0100 Subject: [PATCH 2/4] Fix the help text --- fet2020/posts/forms.py | 550 ++++++++++++++++++++--------------------- 1 file changed, 275 insertions(+), 275 deletions(-) diff --git a/fet2020/posts/forms.py b/fet2020/posts/forms.py index 8499d28e..fe69d4ce 100644 --- a/fet2020/posts/forms.py +++ b/fet2020/posts/forms.py @@ -1,275 +1,275 @@ -from ckeditor_uploader.widgets import CKEditorUploadingWidget -from django import forms -from django.forms.widgets import CheckboxInput -from django.utils.dates import MONTHS -from taggit.models import Tag - -from .models import Event, FetMeeting, News, Post - - -class PostForm(forms.ModelForm): - class Meta: - model = Post - fields = [ - "title", - "subtitle", - "tags", - "image", - "body", - "slug", - "author", - "public_date", - ] - - widgets = {"body": CKEditorUploadingWidget(config_name="default")} - - class Media: - js = ( - "js/auto_slug.js", # automatic slag completion via ajax - "js/tag_completion.js", # to get a list for tag autocompletion via ajax - ) - - -class NewsForm(PostForm): - class Meta: - model = News - fields = "__all__" - - help_texts = { - "tags": ( - "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." - ), - "image": "Verwendbare Formate: ...", - "is_pinned": ( - "Der Post soll als erster auf der Startseite angeheftet werden und sich " - "automatisch einen Monat nach der Veröffentlichung wieder lösen." - ), - } - - labels = { - "title": "Titel", - "subtitle": "Untertitel", - "image": "Hintergrundbild", - "body": "Text", - "slug": "Permalink", - "author": "Autor", - "public_date": "Veröffentlichung", - "is_pinned": "Post anheften", - } - - widgets = {"body": CKEditorUploadingWidget(config_name="default")} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - author_qs = self.fields["author"].queryset.order_by("username") - self.fields["author"].queryset = author_qs - - -class EventForm(PostForm): - class Meta: - model = Event - fields = "__all__" - - help_texts = { - "tags": ( - "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." - ), - "image": "Verwendbare Formate: Bildformate", - "is_pinned": ( - "Dieses Event soll als erstes auf der Startseite angeheftet werden und sich " - "automatisch einen Monat nach der Veröffentlichung wieder lösen." - ), - } - - labels = { - "title": "Titel", - "subtitle": "Untertitel", - "image": "Hintergrundbild", - "body": "Text", - "event_start": "Start des Events", - "event_end": "Ende des Events", - "event_place": "Ort des Events", - "slug": "Permalink", - "author": "Autor", - "public_date": "Veröffentlichung", - "is_pinned": "Event anheften", - } - - widgets = {"body": CKEditorUploadingWidget(config_name="default")} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - author_qs = self.fields["author"].queryset.order_by("username") - self.fields["author"].queryset = author_qs - - self.fields["event_start"].required = True - self.fields["event_end"].required = False - - if "event_place" in self.fields: - self.fields["event_place"].required = True - - -class FetMeetingForm(PostForm): - class Meta: - model = FetMeeting - fields = ["event_start", "event_end", "event_place", "tags"] - - labels = { - "event_start": "Start der Sitzung", - "event_end": "Ende der Sitzung", - "event_place": "Ort der Sitzung", - } - - help_texts = { - "event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.", - "tags": ( - "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." - ), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - - self.fields["event_start"].required = True - self.fields["event_end"].required = False - - self.fields["event_place"].initial = "FET" - - tags = [] - tags.append(Tag()) - tags[0].name = "fachschaft" - self.fields["tags"].initial = tags - - -class PostSearchForm(forms.Form): - year_choices = [("", "Alle")] - month_choices = [("", "Alle")] + list(MONTHS.items()) - - year = forms.ChoiceField(label="Jahr", choices=year_choices, required=False) - month = forms.ChoiceField(label="Monat", choices=month_choices, required=False) - - compact_view = forms.BooleanField( - label="Kompakte Ansicht", - required=False, - widget=CheckboxInput, - ) - fet_meeting_only = forms.BooleanField( - label="nur FET Sitzungen", - required=False, - widget=CheckboxInput, - ) - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - - try: - first_post = Post.objects.get_queryset().last() - last_post = Post.objects.get_queryset().first() - if first_post and last_post: - years = range(last_post.date.year, first_post.date.year - 1, -1) - year_choices = [("", "Alle")] + [(i, i) for i in years] - self.fields["year"].choices = year_choices - except Exception: - pass - - -class NewsUpdateForm(forms.ModelForm): - class Meta: - model = News - - fields = [ - "title", - "status", - "body", - ] - - labels = { - "title": "Titel", - "image": "Hintergrundbild", - "body": "Text", - } - - widgets = {"body": CKEditorUploadingWidget(config_name="default")} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - - self.fields["title"].autofocus = True - - -class EventUpdateForm(forms.ModelForm): - class Meta: - model = Event - fields = [ - "title", - "status", - "event_start", - "event_end", - "event_place", - ] - - labels = { - "title": "Titel", - "event_start": "Start des Events", - "event_end": "Ende des Events", - "event_place": "Ort des Events", - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - - self.fields["event_start"].required = True - self.fields["event_start"].autofocus = True - - self.fields["event_end"].required = False - - if "event_place" in self.fields: - self.fields["event_place"].required = True - - -class FetMeetingCreateForm(forms.ModelForm): - class Meta: - model = FetMeeting - fields = ["event_start", "event_end", "event_place"] - - help_texts = { - "event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.", - } - - labels = { - "event_start": "Start der Sitzung", - "event_end": "Ende der Sitzung", - "event_place": "Ort der Sitzung", - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - - self.fields["event_start"].required = True - self.fields["event_start"].autofocus = True - - self.fields["event_end"].required = False - - self.fields["event_place"].initial = "FET" - - -class FetMeetingUpdateForm(forms.ModelForm): - class Meta: - model = FetMeeting - fields = ["event_start", "event_end", "event_place"] - - labels = { - "event_start": "Start der Sitzung", - "event_end": "Ende der Sitzung", - "event_place": "Ort der Sitzung", - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set - - self.fields["event_start"].required = True - self.fields["event_start"].autofocus = True - - self.fields["event_end"].required = False - - self.fields["event_place"].initial = "FET" +from ckeditor_uploader.widgets import CKEditorUploadingWidget +from django import forms +from django.forms.widgets import CheckboxInput +from django.utils.dates import MONTHS +from taggit.models import Tag + +from .models import Event, FetMeeting, News, Post + + +class PostForm(forms.ModelForm): + class Meta: + model = Post + fields = [ + "title", + "subtitle", + "tags", + "image", + "body", + "slug", + "author", + "public_date", + ] + + widgets = {"body": CKEditorUploadingWidget(config_name="default")} + + class Media: + js = ( + "js/auto_slug.js", # automatic slag completion via ajax + "js/tag_completion.js", # to get a list for tag autocompletion via ajax + ) + + +class NewsForm(PostForm): + class Meta: + model = News + fields = "__all__" + + help_texts = { + "tags": ( + "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." + ), + "image": "Verwendbare Formate: ...", + "is_pinned": ( + "Der Post soll als erster auf der Startseite angeheftet werden und sich " + "automatisch einen Monat nach der Veröffentlichung wieder lösen." + ), + } + + labels = { + "title": "Titel", + "subtitle": "Untertitel", + "image": "Hintergrundbild", + "body": "Text", + "slug": "Permalink", + "author": "Autor", + "public_date": "Veröffentlichung", + "is_pinned": "Post anheften", + } + + widgets = {"body": CKEditorUploadingWidget(config_name="default")} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + author_qs = self.fields["author"].queryset.order_by("username") + self.fields["author"].queryset = author_qs + + +class EventForm(PostForm): + class Meta: + model = Event + fields = "__all__" + + help_texts = { + "tags": ( + "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." + ), + "image": "Verwendbare Formate: Bildformate", + "is_pinned": ( + "Dieses Event soll als erstes auf der Startseite angeheftet werden und sich " + "automatisch ein Tag nach dem Eventende wieder lösen." + ), + } + + labels = { + "title": "Titel", + "subtitle": "Untertitel", + "image": "Hintergrundbild", + "body": "Text", + "event_start": "Start des Events", + "event_end": "Ende des Events", + "event_place": "Ort des Events", + "slug": "Permalink", + "author": "Autor", + "public_date": "Veröffentlichung", + "is_pinned": "Event anheften", + } + + widgets = {"body": CKEditorUploadingWidget(config_name="default")} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + author_qs = self.fields["author"].queryset.order_by("username") + self.fields["author"].queryset = author_qs + + self.fields["event_start"].required = True + self.fields["event_end"].required = False + + if "event_place" in self.fields: + self.fields["event_place"].required = True + + +class FetMeetingForm(PostForm): + class Meta: + model = FetMeeting + fields = ["event_start", "event_end", "event_place", "tags"] + + labels = { + "event_start": "Start der Sitzung", + "event_end": "Ende der Sitzung", + "event_place": "Ort der Sitzung", + } + + help_texts = { + "event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.", + "tags": ( + "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." + ), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["event_start"].required = True + self.fields["event_end"].required = False + + self.fields["event_place"].initial = "FET" + + tags = [] + tags.append(Tag()) + tags[0].name = "fachschaft" + self.fields["tags"].initial = tags + + +class PostSearchForm(forms.Form): + year_choices = [("", "Alle")] + month_choices = [("", "Alle")] + list(MONTHS.items()) + + year = forms.ChoiceField(label="Jahr", choices=year_choices, required=False) + month = forms.ChoiceField(label="Monat", choices=month_choices, required=False) + + compact_view = forms.BooleanField( + label="Kompakte Ansicht", + required=False, + widget=CheckboxInput, + ) + fet_meeting_only = forms.BooleanField( + label="nur FET Sitzungen", + required=False, + widget=CheckboxInput, + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + try: + first_post = Post.objects.get_queryset().last() + last_post = Post.objects.get_queryset().first() + if first_post and last_post: + years = range(last_post.date.year, first_post.date.year - 1, -1) + year_choices = [("", "Alle")] + [(i, i) for i in years] + self.fields["year"].choices = year_choices + except Exception: + pass + + +class NewsUpdateForm(forms.ModelForm): + class Meta: + model = News + + fields = [ + "title", + "status", + "body", + ] + + labels = { + "title": "Titel", + "image": "Hintergrundbild", + "body": "Text", + } + + widgets = {"body": CKEditorUploadingWidget(config_name="default")} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["title"].autofocus = True + + +class EventUpdateForm(forms.ModelForm): + class Meta: + model = Event + fields = [ + "title", + "status", + "event_start", + "event_end", + "event_place", + ] + + labels = { + "title": "Titel", + "event_start": "Start des Events", + "event_end": "Ende des Events", + "event_place": "Ort des Events", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["event_start"].required = True + self.fields["event_start"].autofocus = True + + self.fields["event_end"].required = False + + if "event_place" in self.fields: + self.fields["event_place"].required = True + + +class FetMeetingCreateForm(forms.ModelForm): + class Meta: + model = FetMeeting + fields = ["event_start", "event_end", "event_place"] + + help_texts = { + "event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.", + } + + labels = { + "event_start": "Start der Sitzung", + "event_end": "Ende der Sitzung", + "event_place": "Ort der Sitzung", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["event_start"].required = True + self.fields["event_start"].autofocus = True + + self.fields["event_end"].required = False + + self.fields["event_place"].initial = "FET" + + +class FetMeetingUpdateForm(forms.ModelForm): + class Meta: + model = FetMeeting + fields = ["event_start", "event_end", "event_place"] + + labels = { + "event_start": "Start der Sitzung", + "event_end": "Ende der Sitzung", + "event_place": "Ort der Sitzung", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["event_start"].required = True + self.fields["event_start"].autofocus = True + + self.fields["event_end"].required = False + + self.fields["event_place"].initial = "FET" From 78c2860cca6260486731ac0dc8a7cbc4eeba3f4c Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Tue, 4 Nov 2025 22:02:07 +0100 Subject: [PATCH 3/4] update etherpad to 2.5.2; fix charset and add auth method --- docker-compose.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index dbcbe946..c4053101 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -47,7 +47,7 @@ services: retries: 20 etherpad: container_name: etherpad-container - image: etherpad/etherpad:1.8.17 + image: etherpad/etherpad:2.5.2 # ports: # - 9001:9001 environment: @@ -57,8 +57,9 @@ services: DB_NAME: etherpaddb DB_USER: user DB_PASS: "hgu" - DB_CHARSET: utf8 + DB_CHARSET: "utf8mb4" TRUST_PROXY: false + AUTHENTICATION_METHOD: "apikey" depends_on: etherpadsql: condition: "service_healthy" From 28d3d99754312b844aa3c80ff0bd6cfdce52e75c Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Mon, 17 Nov 2025 12:17:46 +0100 Subject: [PATCH 4/4] update account holder in wiref file --- assets/wiref/Vorlage.pdf | Bin 117193 -> 118025 bytes fet2020/finance/static/wiref/Vorlage.pdf | Bin 117193 -> 118025 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/wiref/Vorlage.pdf b/assets/wiref/Vorlage.pdf index 9a1c488a053c673ae80d2c7faeb487345d21f848..a215be226c5e905ab1fc221c548701f4cfe23354 100644 GIT binary patch delta 439 zcmb`EyGjE=6owfP0xNdG#@n%oCPj94W;Ztp0l^Ifyu|F3TEy%m*<5CEGf}XKc3NAE zSXo=!r4qbk(bv!i@Ch6xg%99?^A|to=bVodUB|9&W9JVjisZo~dK#5ohgK-0p&YUy z_ZWCA1Xm0_pYhOdw8fCO!0EBB2m`?yZSHqL%|V4XgRoy0e!vG)KLy4PB)2w*NirDY zoN8hd