6 Commits

Author SHA1 Message Date
sebivh
4d8a7a68f4 Add default env file 2025-12-16 14:40:23 +01:00
sebivh
dac53d2d06 Change compose layout to use env file 2025-11-25 15:42:47 +01:00
sebivh
7613f3a547 Remove uneccesary gitignore subdir 2025-11-25 15:41:24 +01:00
28d3d99754 update account holder in wiref file 2025-11-17 12:17:46 +01:00
78c2860cca update etherpad to 2.5.2; fix charset and add auth method 2025-11-04 22:02:07 +01:00
2024466a48 Fix the help text 2025-11-04 18:49:03 +01:00
6 changed files with 309 additions and 294 deletions

14
.env.default Normal file
View File

@@ -0,0 +1,14 @@
HOSTNAME="fet.at" # Hostname that will be used to filter requests
DEBUG="false" # Debug flag ( disables ldap integration )
LDAP="True" # Ldap flag ( enables connection with fet ldap )
#SECRET_KEY="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" # Secret key for the Website encryption
ETHERPAD_GROUP="g.snlbqn7S6ksRbom3" # The Etherpad Group to use
EMAIL_HOST_USER="verleih@fet.at" # The user to be used for rental Emails
#EMAIL_HOST_PASSWORD="password" # The password for the smtp account for the rental Email
#ETHERPAD_DB_USER="user" # User for the Eterpad MySql Database
#ETHERPAD_DB_PASSWORD="password" # Password for the Etherpad MySql Database
#DJANGO_MYSQL_USER="user" # The MySql User used for Database
#DJANGO_MYSQL_PASSWORD"="password" # The Password for the MySql Database

4
.gitignore vendored
View File

@@ -1,4 +1,4 @@
.env/* .env*
*.pyc *.pyc
*_design1 *_design1
fet2020/.env/* fet2020/.env/*
@@ -19,4 +19,4 @@ flowbite
gallery/* gallery/*
tailwind tailwind
whoosh_index whoosh_index
databases/django databases

Binary file not shown.

View File

@@ -18,15 +18,15 @@ services:
container_name: django-container container_name: django-container
image: django-image:latest image: django-image:latest
environment: environment:
HOST_NAME: "fet.at" HOST_NAME: ${HOSTNAME}
DEBUG: "False" DEBUG: ${DEBUG}
LDAP: "True" LDAP: ${LDAP}
SECRET_KEY: "sae34sADfrFr89E!Gl#f!34hdjGR#!jopi4qFEr#4R56rT56zT2#wE1!feGp" SECRET_KEY: ${SECRET_KEY}
MYSQL_USER: "user" MYSQL_USER: ${DJANGO_MYSQL_USER}
MYSQL_PASSWORD: "hgu" MYSQL_PASSWORD: ${DJANGO_MYSQL_PASSWORD}
ETHERPAD_GROUP: "g.snlbqn7S6ksRbom3" ETHERPAD_GROUP: ${ETHERPAD_GROUP}
EMAIL_HOST_USER: "verleih@fet.at" EMAIL_HOST_USER: ${EMAIL_HOST_USER}
EMAIL_HOST_PASSWORD: "" EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
depends_on: depends_on:
mysql: mysql:
condition: service_healthy condition: service_healthy
@@ -47,7 +47,7 @@ services:
retries: 20 retries: 20
etherpad: etherpad:
container_name: etherpad-container container_name: etherpad-container
image: etherpad/etherpad:1.8.17 image: etherpad/etherpad:2.5.2
# ports: # ports:
# - 9001:9001 # - 9001:9001
environment: environment:
@@ -55,10 +55,11 @@ services:
DB_HOST: etherpadsql DB_HOST: etherpadsql
DB_PORT: 3306 DB_PORT: 3306
DB_NAME: etherpaddb DB_NAME: etherpaddb
DB_USER: user DB_USER: ${ETHERPAD_DB_USER}
DB_PASS: "hgu" DB_PASS: ${ETHERPAD_DB_PASSWORD}
DB_CHARSET: utf8 DB_CHARSET: "utf8mb4"
TRUST_PROXY: false TRUST_PROXY: false
AUTHENTICATION_METHOD: "apikey"
depends_on: depends_on:
etherpadsql: etherpadsql:
condition: "service_healthy" condition: "service_healthy"
@@ -78,8 +79,8 @@ services:
image: mariadb:10.7 image: mariadb:10.7
environment: environment:
MYSQL_DATABASE: fet2020db MYSQL_DATABASE: fet2020db
MYSQL_USER: user MYSQL_USER: ${DJANGO_MYSQL_USER}
MYSQL_PASSWORD: hgu MYSQL_PASSWORD: ${DJANGO_MYSQL_PASSWORD}
MYSQL_COLLATION: utf8_general_ci MYSQL_COLLATION: utf8_general_ci
MYSQL_CHARSET: utf8 MYSQL_CHARSET: utf8
MYSQL_ALLOW_EMPTY_PASSWORD: "yes" MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
@@ -97,8 +98,8 @@ services:
image: mariadb:10.7 image: mariadb:10.7
environment: environment:
MYSQL_DATABASE: etherpaddb MYSQL_DATABASE: etherpaddb
MYSQL_USER: user MYSQL_USER: ${ETHERPAD_DB_USER}
MYSQL_PASSWORD: "hgu" MYSQL_PASSWORD: ${ETHERPAD_DB_PASSWORD}
MYSQL_COLLATION: utf8_general_ci MYSQL_COLLATION: utf8_general_ci
MYSQL_CHARSET: utf8 MYSQL_CHARSET: utf8
MYSQL_ALLOW_EMPTY_PASSWORD: "yes" MYSQL_ALLOW_EMPTY_PASSWORD: "yes"

View File

@@ -1,275 +1,275 @@
from ckeditor_uploader.widgets import CKEditorUploadingWidget from ckeditor_uploader.widgets import CKEditorUploadingWidget
from django import forms from django import forms
from django.forms.widgets import CheckboxInput from django.forms.widgets import CheckboxInput
from django.utils.dates import MONTHS from django.utils.dates import MONTHS
from taggit.models import Tag from taggit.models import Tag
from .models import Event, FetMeeting, News, Post from .models import Event, FetMeeting, News, Post
class PostForm(forms.ModelForm): class PostForm(forms.ModelForm):
class Meta: class Meta:
model = Post model = Post
fields = [ fields = [
"title", "title",
"subtitle", "subtitle",
"tags", "tags",
"image", "image",
"body", "body",
"slug", "slug",
"author", "author",
"public_date", "public_date",
] ]
widgets = {"body": CKEditorUploadingWidget(config_name="default")} widgets = {"body": CKEditorUploadingWidget(config_name="default")}
class Media: class Media:
js = ( js = (
"js/auto_slug.js", # automatic slag completion via ajax "js/auto_slug.js", # automatic slag completion via ajax
"js/tag_completion.js", # to get a list for tag autocompletion via ajax "js/tag_completion.js", # to get a list for tag autocompletion via ajax
) )
class NewsForm(PostForm): class NewsForm(PostForm):
class Meta: class Meta:
model = News model = News
fields = "__all__" fields = "__all__"
help_texts = { help_texts = {
"tags": ( "tags": (
"Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen."
), ),
"image": "Verwendbare Formate: ...", "image": "Verwendbare Formate: ...",
"is_pinned": ( "is_pinned": (
"Der Post soll als erster auf der Startseite angeheftet werden und sich " "Der Post soll als erster auf der Startseite angeheftet werden und sich "
"automatisch einen Monat nach der Veröffentlichung wieder lösen." "automatisch einen Monat nach der Veröffentlichung wieder lösen."
), ),
} }
labels = { labels = {
"title": "Titel", "title": "Titel",
"subtitle": "Untertitel", "subtitle": "Untertitel",
"image": "Hintergrundbild", "image": "Hintergrundbild",
"body": "Text", "body": "Text",
"slug": "Permalink", "slug": "Permalink",
"author": "Autor", "author": "Autor",
"public_date": "Veröffentlichung", "public_date": "Veröffentlichung",
"is_pinned": "Post anheften", "is_pinned": "Post anheften",
} }
widgets = {"body": CKEditorUploadingWidget(config_name="default")} widgets = {"body": CKEditorUploadingWidget(config_name="default")}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
author_qs = self.fields["author"].queryset.order_by("username") author_qs = self.fields["author"].queryset.order_by("username")
self.fields["author"].queryset = author_qs self.fields["author"].queryset = author_qs
class EventForm(PostForm): class EventForm(PostForm):
class Meta: class Meta:
model = Event model = Event
fields = "__all__" fields = "__all__"
help_texts = { help_texts = {
"tags": ( "tags": (
"Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen."
), ),
"image": "Verwendbare Formate: Bildformate", "image": "Verwendbare Formate: Bildformate",
"is_pinned": ( "is_pinned": (
"Dieses Event soll als erstes auf der Startseite angeheftet werden und sich " "Dieses Event soll als erstes auf der Startseite angeheftet werden und sich "
"automatisch einen Monat nach der Veröffentlichung wieder lösen." "automatisch ein Tag nach dem Eventende wieder lösen."
), ),
} }
labels = { labels = {
"title": "Titel", "title": "Titel",
"subtitle": "Untertitel", "subtitle": "Untertitel",
"image": "Hintergrundbild", "image": "Hintergrundbild",
"body": "Text", "body": "Text",
"event_start": "Start des Events", "event_start": "Start des Events",
"event_end": "Ende des Events", "event_end": "Ende des Events",
"event_place": "Ort des Events", "event_place": "Ort des Events",
"slug": "Permalink", "slug": "Permalink",
"author": "Autor", "author": "Autor",
"public_date": "Veröffentlichung", "public_date": "Veröffentlichung",
"is_pinned": "Event anheften", "is_pinned": "Event anheften",
} }
widgets = {"body": CKEditorUploadingWidget(config_name="default")} widgets = {"body": CKEditorUploadingWidget(config_name="default")}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
author_qs = self.fields["author"].queryset.order_by("username") author_qs = self.fields["author"].queryset.order_by("username")
self.fields["author"].queryset = author_qs self.fields["author"].queryset = author_qs
self.fields["event_start"].required = True self.fields["event_start"].required = True
self.fields["event_end"].required = False self.fields["event_end"].required = False
if "event_place" in self.fields: if "event_place" in self.fields:
self.fields["event_place"].required = True self.fields["event_place"].required = True
class FetMeetingForm(PostForm): class FetMeetingForm(PostForm):
class Meta: class Meta:
model = FetMeeting model = FetMeeting
fields = ["event_start", "event_end", "event_place", "tags"] fields = ["event_start", "event_end", "event_place", "tags"]
labels = { labels = {
"event_start": "Start der Sitzung", "event_start": "Start der Sitzung",
"event_end": "Ende der Sitzung", "event_end": "Ende der Sitzung",
"event_place": "Ort der Sitzung", "event_place": "Ort der Sitzung",
} }
help_texts = { help_texts = {
"event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.", "event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.",
"tags": ( "tags": (
"Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen." "Die Hashtags ohne '#' eintragen, und mit Komma kann man mehrere Tags anfügen."
), ),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["event_start"].required = True self.fields["event_start"].required = True
self.fields["event_end"].required = False self.fields["event_end"].required = False
self.fields["event_place"].initial = "FET" self.fields["event_place"].initial = "FET"
tags = [] tags = []
tags.append(Tag()) tags.append(Tag())
tags[0].name = "fachschaft" tags[0].name = "fachschaft"
self.fields["tags"].initial = tags self.fields["tags"].initial = tags
class PostSearchForm(forms.Form): class PostSearchForm(forms.Form):
year_choices = [("", "Alle")] year_choices = [("", "Alle")]
month_choices = [("", "Alle")] + list(MONTHS.items()) month_choices = [("", "Alle")] + list(MONTHS.items())
year = forms.ChoiceField(label="Jahr", choices=year_choices, required=False) year = forms.ChoiceField(label="Jahr", choices=year_choices, required=False)
month = forms.ChoiceField(label="Monat", choices=month_choices, required=False) month = forms.ChoiceField(label="Monat", choices=month_choices, required=False)
compact_view = forms.BooleanField( compact_view = forms.BooleanField(
label="Kompakte Ansicht", label="Kompakte Ansicht",
required=False, required=False,
widget=CheckboxInput, widget=CheckboxInput,
) )
fet_meeting_only = forms.BooleanField( fet_meeting_only = forms.BooleanField(
label="nur FET Sitzungen", label="nur FET Sitzungen",
required=False, required=False,
widget=CheckboxInput, widget=CheckboxInput,
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
try: try:
first_post = Post.objects.get_queryset().last() first_post = Post.objects.get_queryset().last()
last_post = Post.objects.get_queryset().first() last_post = Post.objects.get_queryset().first()
if first_post and last_post: if first_post and last_post:
years = range(last_post.date.year, first_post.date.year - 1, -1) years = range(last_post.date.year, first_post.date.year - 1, -1)
year_choices = [("", "Alle")] + [(i, i) for i in years] year_choices = [("", "Alle")] + [(i, i) for i in years]
self.fields["year"].choices = year_choices self.fields["year"].choices = year_choices
except Exception: except Exception:
pass pass
class NewsUpdateForm(forms.ModelForm): class NewsUpdateForm(forms.ModelForm):
class Meta: class Meta:
model = News model = News
fields = [ fields = [
"title", "title",
"status", "status",
"body", "body",
] ]
labels = { labels = {
"title": "Titel", "title": "Titel",
"image": "Hintergrundbild", "image": "Hintergrundbild",
"body": "Text", "body": "Text",
} }
widgets = {"body": CKEditorUploadingWidget(config_name="default")} widgets = {"body": CKEditorUploadingWidget(config_name="default")}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["title"].autofocus = True self.fields["title"].autofocus = True
class EventUpdateForm(forms.ModelForm): class EventUpdateForm(forms.ModelForm):
class Meta: class Meta:
model = Event model = Event
fields = [ fields = [
"title", "title",
"status", "status",
"event_start", "event_start",
"event_end", "event_end",
"event_place", "event_place",
] ]
labels = { labels = {
"title": "Titel", "title": "Titel",
"event_start": "Start des Events", "event_start": "Start des Events",
"event_end": "Ende des Events", "event_end": "Ende des Events",
"event_place": "Ort des Events", "event_place": "Ort des Events",
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["event_start"].required = True self.fields["event_start"].required = True
self.fields["event_start"].autofocus = True self.fields["event_start"].autofocus = True
self.fields["event_end"].required = False self.fields["event_end"].required = False
if "event_place" in self.fields: if "event_place" in self.fields:
self.fields["event_place"].required = True self.fields["event_place"].required = True
class FetMeetingCreateForm(forms.ModelForm): class FetMeetingCreateForm(forms.ModelForm):
class Meta: class Meta:
model = FetMeeting model = FetMeeting
fields = ["event_start", "event_end", "event_place"] fields = ["event_start", "event_end", "event_place"]
help_texts = { help_texts = {
"event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.", "event_end": "Bei einer leeren Eingabe werden 2 Stunden zur Startzeit dazugezählt.",
} }
labels = { labels = {
"event_start": "Start der Sitzung", "event_start": "Start der Sitzung",
"event_end": "Ende der Sitzung", "event_end": "Ende der Sitzung",
"event_place": "Ort der Sitzung", "event_place": "Ort der Sitzung",
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["event_start"].required = True self.fields["event_start"].required = True
self.fields["event_start"].autofocus = True self.fields["event_start"].autofocus = True
self.fields["event_end"].required = False self.fields["event_end"].required = False
self.fields["event_place"].initial = "FET" self.fields["event_place"].initial = "FET"
class FetMeetingUpdateForm(forms.ModelForm): class FetMeetingUpdateForm(forms.ModelForm):
class Meta: class Meta:
model = FetMeeting model = FetMeeting
fields = ["event_start", "event_end", "event_place"] fields = ["event_start", "event_end", "event_place"]
labels = { labels = {
"event_start": "Start der Sitzung", "event_start": "Start der Sitzung",
"event_end": "Ende der Sitzung", "event_end": "Ende der Sitzung",
"event_place": "Ort der Sitzung", "event_place": "Ort der Sitzung",
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set super().__init__(*args, **kwargs) # to get the self.fields set
self.fields["event_start"].required = True self.fields["event_start"].required = True
self.fields["event_start"].autofocus = True self.fields["event_start"].autofocus = True
self.fields["event_end"].required = False self.fields["event_end"].required = False
self.fields["event_place"].initial = "FET" self.fields["event_place"].initial = "FET"