ruff formatting

This commit is contained in:
2025-01-27 01:02:42 +01:00
parent f0d0c44fd6
commit fcf63d8bf9
30 changed files with 168 additions and 154 deletions

View File

@@ -4,8 +4,6 @@ from ldap3 import HASHED_SALTED_SHA, MODIFY_REPLACE, Connection, Server
from ldap3.core.exceptions import LDAPBindError from ldap3.core.exceptions import LDAPBindError
from ldap3.utils.hashed import hashed from ldap3.utils.hashed import hashed
from members.models import Member
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
host = "ldap://juri.fet.htu.tuwien.ac.at" host = "ldap://juri.fet.htu.tuwien.ac.at"
port = 389 port = 389

View File

@@ -1,8 +1,7 @@
import logging import logging
from django.contrib.auth.models import Group, User
from django.contrib.auth.backends import ModelBackend from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import Group, User
from ldap3 import Connection, Server from ldap3 import Connection, Server
from ldap3.core.exceptions import LDAPBindError from ldap3.core.exceptions import LDAPBindError
@@ -125,7 +124,7 @@ class LdapBackend(ModelBackend):
user = User.objects.get(username) user = User.objects.get(username)
except User.DoesNotExist: except User.DoesNotExist:
user = User.objects.create_user(username) user = User.objects.create_user(username)
finally:
if not self.user_can_authenticate(user): if not self.user_can_authenticate(user):
logger.info("User '%s' is inactive.", user.get_username()) logger.info("User '%s' is inactive.", user.get_username())
return return

View File

@@ -1,7 +1,6 @@
import logging import logging
from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.forms import PasswordChangeForm
from django.core.exceptions import ValidationError
from .authentications import change_password from .authentications import change_password

View File

@@ -21,7 +21,7 @@ class CustomFlatPageAdmin(FlatPageAdmin):
"url", "url",
"title", "title",
"content", "content",
) ),
}, },
), ),
( (

View File

@@ -6,7 +6,8 @@ class FETHeaderMiddleware(RemoteUserMiddleware):
def process_request(self, request): def process_request(self, request):
request.META[self.header] = request.META.get( request.META[self.header] = request.META.get(
self.header, request.headers.get(self.header, None) self.header,
request.headers.get(self.header, None),
) )
super().process_request(request) super().process_request(request)

View File

@@ -24,8 +24,8 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# DEBUGGING # DEBUGGING
DEBUG = (env("DEBUG").lower() == "true") DEBUG = env("DEBUG").lower() == "true"
LDAP = (env("LDAP").lower() == "true") LDAP = env("LDAP").lower() == "true"
# MODELS # MODELS
@@ -84,7 +84,7 @@ if DEBUG:
"default": { "default": {
"ENGINE": "django.db.backends.sqlite3", "ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, "db.sqlite3"), "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
} },
} }
else: else:
DATABASES = { DATABASES = {
@@ -95,7 +95,7 @@ else:
"PASSWORD": env("MYSQL_PASSWORD"), "PASSWORD": env("MYSQL_PASSWORD"),
"HOST": env("MYSQL_HOST"), "HOST": env("MYSQL_HOST"),
"PORT": env("MYSQL_PORT"), "PORT": env("MYSQL_PORT"),
} },
} }
@@ -107,20 +107,14 @@ EMAIL_USE_TLS = True
# STATIC FILES # STATIC FILES
if DEBUG: STATIC_URL = "static/" if DEBUG else "assets/"
STATIC_URL = "static/"
else:
STATIC_URL = "assets/"
# Use for collectstatic/production folder. # Use for collectstatic/production folder.
# --- Saving directory for production folder. # --- Saving directory for production folder.
STATIC_ROOT = "assets/" STATIC_ROOT = "assets/"
# --- Get files from following directory for production folder. # --- Get files from following directory for production folder.
STATICFILES_DIRS = [ STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
os.path.join(BASE_DIR, "gallery/static"),
os.path.join(BASE_DIR, "static"),
]
# FILE UPLOADS # FILE UPLOADS
@@ -198,10 +192,7 @@ CSRF_TRUSTED_ORIGINS = [
"https://" + env("HOST_NAME"), "https://" + env("HOST_NAME"),
] ]
if DEBUG: SECRET_KEY = "r37-i7l)vrduzz2-gira+z#u!p!di9#f+%s*5-bb($hg)55@ns" if DEBUG else env("SECRET_KEY")
SECRET_KEY = "r37-i7l)vrduzz2-gira+z#u!p!di9#f+%s*5-bb($hg)55@ns"
else:
SECRET_KEY = env("SECRET_KEY")
# TEMPLATES # TEMPLATES

View File

@@ -11,11 +11,7 @@ def add_log_action(request, form, app_label, model, add=True):
obj = form.save() obj = form.save()
content_type = ContentType.objects.get(app_label=app_label, model=model) content_type = ContentType.objects.get(app_label=app_label, model=model)
change_message = construct_change_message(form, None, add) change_message = construct_change_message(form, None, add)
action_flag = ADDITION if add else CHANGE
if add:
action_flag = ADDITION
else:
action_flag = CHANGE
LogEntry.objects.log_action( LogEntry.objects.log_action(
user_id=request.user.pk, user_id=request.user.pk,

View File

@@ -216,7 +216,7 @@ class BillAdmin(admin.ModelAdmin):
"fields": ( "fields": (
"bill_creator", "bill_creator",
"resolution", "resolution",
) ),
}, },
), ),
( (
@@ -227,7 +227,7 @@ class BillAdmin(admin.ModelAdmin):
"bankdata", "bankdata",
("get_bankdata_name", "get_bankdata_iban", "get_bankdata_bic"), ("get_bankdata_name", "get_bankdata_iban", "get_bankdata_bic"),
"get_qrcode", "get_qrcode",
) ),
}, },
), ),
( (
@@ -241,7 +241,7 @@ class BillAdmin(admin.ModelAdmin):
"amount", "amount",
"only_digital", "only_digital",
"file_field", "file_field",
) ),
}, },
), ),
( (
@@ -251,7 +251,7 @@ class BillAdmin(admin.ModelAdmin):
"comment", "comment",
"wiref", "wiref",
"status", "status",
) ),
}, },
), ),
) )
@@ -403,7 +403,7 @@ class ResolutionAdmin(admin.ModelAdmin):
"date", "date",
"option", "option",
"is_visible", "is_visible",
) ),
}, },
), ),
( (
@@ -413,7 +413,7 @@ class ResolutionAdmin(admin.ModelAdmin):
"budget", "budget",
"total", "total",
"budget_remaining", "budget_remaining",
) ),
}, },
), ),
( (

View File

@@ -29,7 +29,7 @@ def get_cleaned_data(cleaned_data):
if resolution != "": if resolution != "":
try: try:
cleaned_data["resolution"] = Resolution.objects.get( cleaned_data["resolution"] = Resolution.objects.get(
Q(id=resolution) | Q(name=resolution) Q(id=resolution) | Q(name=resolution),
) )
except Exception: except Exception:
raise ValidationError({"resolution_text": "Es gibt keinen Beschluss mit dieser ID."}) raise ValidationError({"resolution_text": "Es gibt keinen Beschluss mit dieser ID."})
@@ -68,7 +68,10 @@ class BillCreateForm(forms.ModelForm):
# Resolution # Resolution
resolution_text = forms.CharField( resolution_text = forms.CharField(
required=False, label="Beschlussnummer", initial="", max_length=128 required=False,
label="Beschlussnummer",
initial="",
max_length=128,
) )
class Meta: class Meta:
@@ -122,7 +125,7 @@ class BillCreateForm(forms.ModelForm):
self.fields["payer"].autofocus = True self.fields["payer"].autofocus = True
bank_data = BankData.objects.filter( bank_data = BankData.objects.filter(
Q(bankdata_creator=member) & Q(is_disabled=False) Q(bankdata_creator=member) & Q(is_disabled=False),
).first() ).first()
if bank_data is not None: if bank_data is not None:
self.fields["name_text"].initial = bank_data.name self.fields["name_text"].initial = bank_data.name
@@ -147,12 +150,17 @@ class BillUpdateForm(forms.ModelForm):
# only digital bill # only digital bill
only_digital_new = forms.BooleanField( only_digital_new = forms.BooleanField(
required=False, label="Ich habe eine neue digitale Rechnung.", initial=False required=False,
label="Ich habe eine neue digitale Rechnung.",
initial=False,
) )
# Resolution # Resolution
resolution_text = forms.CharField( resolution_text = forms.CharField(
required=False, label="Beschlussnummer", initial="", max_length=128 required=False,
label="Beschlussnummer",
initial="",
max_length=128,
) )
class Meta: class Meta:
@@ -399,7 +407,9 @@ class BillAdminForm(forms.ModelForm):
self.fields["bill_creator"].widget.can_delete_related = False self.fields["bill_creator"].widget.can_delete_related = False
# Delete wiref id from list if there are already 10 bills in wiref form. # Delete wiref id from list if there are already 10 bills in wiref form.
qs = self.fields["wiref"].queryset.annotate(num_bills=Count("bill")).filter(num_bills__lt=10) qs = (
self.fields["wiref"].queryset.annotate(num_bills=Count("bill")).filter(num_bills__lt=10)
)
# delete wiref id from if status is not opened. # delete wiref id from if status is not opened.
qs = qs.filter(status=Wiref.Status.OPENED) qs = qs.filter(status=Wiref.Status.OPENED)

View File

@@ -53,7 +53,10 @@ class Resolution(models.Model):
voting_text = models.TextField(verbose_name="Abstimmungstext") voting_text = models.TextField(verbose_name="Abstimmungstext")
budget = models.DecimalField( budget = models.DecimalField(
max_digits=7, decimal_places=2, default=0.00, verbose_name="Budget (EUR)" max_digits=7,
decimal_places=2,
default=0.00,
verbose_name="Budget (EUR)",
) )
class Meta: class Meta:
@@ -155,7 +158,9 @@ class Bill(models.Model):
REPRESENTATION = "R", "Bundesvertretung" REPRESENTATION = "R", "Bundesvertretung"
affiliation = models.CharField( affiliation = models.CharField(
max_length=1, choices=Affiliation.choices, verbose_name="Abrechnungsbudget" max_length=1,
choices=Affiliation.choices,
verbose_name="Abrechnungsbudget",
) )
class Payer(models.TextChoices): class Payer(models.TextChoices):

View File

@@ -25,12 +25,12 @@ def generate_pdf(wiref):
f"VerwendungszweckRow{count + 1}": elem.purpose, f"VerwendungszweckRow{count + 1}": elem.purpose,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
f"BetragRow{count + 1}": str(elem.amount).replace(".", ","), f"BetragRow{count + 1}": str(elem.amount).replace(".", ","),
} },
) )
data_invoice.update( data_invoice.update(
{ {
f"RechnungsaustellerinRow{count + 1}": elem.invoice, f"RechnungsaustellerinRow{count + 1}": elem.invoice,
} },
) )
# Get budget year # Get budget year
@@ -51,7 +51,7 @@ def generate_pdf(wiref):
"Budgetjahr": budget_year, "Budgetjahr": budget_year,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
"Summe": str(total).replace(".", ","), "Summe": str(total).replace(".", ","),
} },
) )
# Write data in pdf # Write data in pdf

View File

@@ -34,7 +34,7 @@ def set_bankdata(creator, name, iban, bic, saving):
if saving is True: if saving is True:
# Disable old bank data. # Disable old bank data.
qs = BankData.objects.filter( qs = BankData.objects.filter(
~Q(id=obj.id) & Q(bankdata_creator=obj.bankdata_creator) & Q(is_disabled=False) ~Q(id=obj.id) & Q(bankdata_creator=obj.bankdata_creator) & Q(is_disabled=False),
) )
qs.update(is_disabled=True) qs.update(is_disabled=True)
@@ -114,11 +114,7 @@ class BillUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
# Call bill if it's only yours. # Call bill if it's only yours.
def test_func(self): def test_func(self):
if self.get_object().bill_creator.username == self.request.user.username: return self.get_object().bill_creator.username == self.request.user.username
return True
# Call handle_no_permissions method.
return False
def handle_no_permission(self): def handle_no_permission(self):
return redirect("finance:bill_list") return redirect("finance:bill_list")

View File

@@ -14,12 +14,18 @@ class Album(models.Model):
thumbnail = models.CharField(verbose_name="Thumbnail", max_length=200, null=True, blank=True) thumbnail = models.CharField(verbose_name="Thumbnail", max_length=200, null=True, blank=True)
event_date = models.DateField( event_date = models.DateField(
verbose_name="Event Datum", null=True, blank=True, default=timezone.now verbose_name="Event Datum",
null=True,
blank=True,
default=timezone.now,
) )
event_place = models.CharField(max_length=200, blank=True) event_place = models.CharField(max_length=200, blank=True)
photographer = models.CharField( photographer = models.CharField(
verbose_name="Fotograph(en)", max_length=200, null=True, blank=True verbose_name="Fotograph(en)",
max_length=200,
null=True,
blank=True,
) )
DRAFT = "10" DRAFT = "10"

View File

@@ -34,7 +34,8 @@ def get_image_list(folder_name):
img_dict = { img_dict = {
"title": img, "title": img,
"image_url": os.path.join( "image_url": os.path.join(
settings.MEDIA_URL + gallery_path, folder_name + "/" + img settings.MEDIA_URL + gallery_path,
folder_name + "/" + img,
), ),
"thumb_url": thumb_url, "thumb_url": thumb_url,
} }

View File

@@ -27,7 +27,7 @@ def index(request):
slug=slugify(folder), slug=slugify(folder),
folder_name=folder, folder_name=folder,
event_date=None, event_date=None,
) ),
) )
else: else:
# show only PUBLIC albums. # show only PUBLIC albums.

View File

@@ -68,7 +68,7 @@ class TopicGroupAdmin(admin.ModelAdmin):
"slug", "slug",
"order", "order",
"short_description", "short_description",
) ),
}, },
), ),
) )
@@ -118,7 +118,7 @@ class TopicAdmin(admin.ModelAdmin):
"topic_group", "topic_group",
"archive", "archive",
"description", "description",
) ),
}, },
), ),
) )
@@ -163,7 +163,7 @@ class AttachmentAdmin(admin.ModelAdmin):
"title", "title",
"topic", "topic",
"description", "description",
) ),
}, },
), ),
) )

View File

@@ -23,7 +23,10 @@ class TopicGroup(models.Model):
short_description = models.TextField(null=True, blank=True) short_description = models.TextField(null=True, blank=True)
order = models.PositiveSmallIntegerField( order = models.PositiveSmallIntegerField(
verbose_name="Reihenfolge", unique=True, null=True, blank=True verbose_name="Reihenfolge",
unique=True,
null=True,
blank=True,
) )
objects = models.Manager() objects = models.Manager()
@@ -53,7 +56,9 @@ class Topic(models.Model):
description = models.TextField(blank=True, null=True) description = models.TextField(blank=True, null=True)
topic_group = models.ForeignKey( topic_group = models.ForeignKey(
TopicGroup, on_delete=models.CASCADE, verbose_name="Themenbereich" TopicGroup,
on_delete=models.CASCADE,
verbose_name="Themenbereich",
) )
objects = models.Manager() objects = models.Manager()
@@ -65,7 +70,8 @@ class Topic(models.Model):
constraints = [ constraints = [
UniqueConstraint(fields=["slug", "topic_group"], name="unique_intern_slug_topic_group"), UniqueConstraint(fields=["slug", "topic_group"], name="unique_intern_slug_topic_group"),
UniqueConstraint( UniqueConstraint(
fields=["title", "topic_group"], name="unique_intern_title_topic_group" fields=["title", "topic_group"],
name="unique_intern_title_topic_group",
), ),
] ]
@@ -126,7 +132,9 @@ class Etherpad(models.Model):
date = models.DateField(default=date.today, verbose_name="Datum") date = models.DateField(default=date.today, verbose_name="Datum")
attachment = models.ForeignKey( attachment = models.ForeignKey(
Attachment, on_delete=models.CASCADE, verbose_name="Anhang Ordner" Attachment,
on_delete=models.CASCADE,
verbose_name="Anhang Ordner",
) )
objects = models.Manager() objects = models.Manager()
@@ -178,7 +186,9 @@ class FileUpload(models.Model):
date = models.DateField(default=date.today, verbose_name="Datum") date = models.DateField(default=date.today, verbose_name="Datum")
attachment = models.ForeignKey( attachment = models.ForeignKey(
Attachment, on_delete=models.CASCADE, verbose_name="Anhang Ordner" Attachment,
on_delete=models.CASCADE,
verbose_name="Anhang Ordner",
) )
objects = models.Manager() objects = models.Manager()

View File

@@ -27,7 +27,9 @@ logger = logging.getLogger(__name__)
@authenticated_user @authenticated_user
def index(request): def index(request):
topic = Topic.objects.filter(archive=False).order_by( topic = Topic.objects.filter(archive=False).order_by(
F("topic_group__order").asc(nulls_last=True), "topic_group", "title" F("topic_group__order").asc(nulls_last=True),
"topic_group",
"title",
) )
empty_topic_groups = TopicGroup.objects.filter(topic=None) empty_topic_groups = TopicGroup.objects.filter(topic=None)
archive_topic = Topic.objects.filter(archive=True) archive_topic = Topic.objects.filter(archive=True)
@@ -107,7 +109,7 @@ class AttachmentCreateView(LoginRequiredMixin, CreateView):
topic_group_slug = self.kwargs.get("topic_group_slug") topic_group_slug = self.kwargs.get("topic_group_slug")
topic_slug = self.kwargs.get("slug") topic_slug = self.kwargs.get("slug")
context["topic"] = Topic.objects.get( context["topic"] = Topic.objects.get(
Q(topic_group__slug=topic_group_slug) & Q(slug=topic_slug) Q(topic_group__slug=topic_group_slug) & Q(slug=topic_slug),
) )
return context return context
@@ -143,7 +145,7 @@ class AttachmentDetailView(LoginRequiredMixin, DetailView):
topic_group_slug = self.kwargs.get("topic_group_slug") topic_group_slug = self.kwargs.get("topic_group_slug")
topic_slug = self.kwargs.get("topic_slug") topic_slug = self.kwargs.get("topic_slug")
return Attachment.objects.filter( return Attachment.objects.filter(
Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug) Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug),
) )
@@ -166,7 +168,7 @@ class AttachmentUpdateView(LoginRequiredMixin, UpdateView):
topic_group_slug = self.kwargs.get("topic_group_slug") topic_group_slug = self.kwargs.get("topic_group_slug")
topic_slug = self.kwargs.get("topic_slug") topic_slug = self.kwargs.get("topic_slug")
return Attachment.objects.filter( return Attachment.objects.filter(
Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug) Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug),
) )
@@ -186,7 +188,7 @@ class EtherpadCreateView(LoginRequiredMixin, CreateView):
topic_slug = self.kwargs.get("topic_slug") topic_slug = self.kwargs.get("topic_slug")
slug = self.kwargs.get("slug") slug = self.kwargs.get("slug")
attachment = Attachment.objects.get( attachment = Attachment.objects.get(
Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug) & Q(slug=slug) Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug) & Q(slug=slug),
) )
context["attachment"] = attachment context["attachment"] = attachment
return context return context
@@ -211,7 +213,7 @@ class FileUploadCreateView(LoginRequiredMixin, CreateView):
topic_slug = self.kwargs.get("topic_slug") topic_slug = self.kwargs.get("topic_slug")
slug = self.kwargs.get("slug") slug = self.kwargs.get("slug")
attachment = Attachment.objects.get( attachment = Attachment.objects.get(
Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug) & Q(slug=slug) Q(topic__topic_group__slug=topic_group_slug) & Q(topic__slug=topic_slug) & Q(slug=slug),
) )
context["attachment"] = attachment context["attachment"] = attachment
return context return context

View File

@@ -86,7 +86,7 @@ class MemberAdmin(admin.ModelAdmin):
"birthday", "birthday",
"phone", "phone",
"address", "address",
) ),
}, },
), ),
) )
@@ -137,7 +137,7 @@ class JobAdmin(admin.ModelAdmin):
"fields": ( "fields": (
"name", "name",
"job_group", "job_group",
) ),
}, },
), ),
( (
@@ -146,7 +146,7 @@ class JobAdmin(admin.ModelAdmin):
"fields": ( "fields": (
"shortterm", "shortterm",
"slug", "slug",
) ),
}, },
), ),
) )
@@ -193,7 +193,7 @@ class JobGroupAdmin(admin.ModelAdmin):
"fields": ( "fields": (
"name", "name",
"description", "description",
) ),
}, },
), ),
( (
@@ -202,7 +202,7 @@ class JobGroupAdmin(admin.ModelAdmin):
"fields": ( "fields": (
"shortterm", "shortterm",
"slug", "slug",
) ),
}, },
), ),
) )

View File

@@ -46,8 +46,7 @@ class MemberForm(forms.ModelForm):
help_texts = { help_texts = {
"image": ( "image": (
"Mindestdimension: 150*150 px, maximale Größe: 10MB, erlaubtes Format: " "Mindestdimension: 150*150 px, maximale Größe: 10MB, erlaubtes Format: Bildformate."
"Bildformate."
), ),
"mailaccount": "Die Mailadresse mit '@fet.at' angeben.", "mailaccount": "Die Mailadresse mit '@fet.at' angeben.",
} }

View File

@@ -24,7 +24,7 @@ class ActiveJobMemberManager(models.Manager):
) )
return qs.filter( return qs.filter(
Q(member__role="A") & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)) Q(member__role="A") & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)),
) )
@@ -44,7 +44,7 @@ class InactiveJobMemberManager(models.Manager):
return qs.filter( return qs.filter(
Q(member__role="P") Q(member__role="P")
| (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)) | (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)),
) )
@@ -56,7 +56,9 @@ class JobMemberManager(models.Manager):
def get_all_jobs_sorted(self): def get_all_jobs_sorted(self):
qs = self.get_queryset().order_by( qs = self.get_queryset().order_by(
F("job_end").desc(nulls_first=True), "-job_start", "job__name" F("job_end").desc(nulls_first=True),
"-job_start",
"job__name",
) )
return qs return qs

View File

@@ -19,7 +19,8 @@ def get_jobs_sidebar(slug):
job_groups.remove(elem) job_groups.remove(elem)
job_members = JobMember.active_member.get_all(slug=slug).order_by( job_members = JobMember.active_member.get_all(slug=slug).order_by(
F("job__order").asc(nulls_last=True), "job__name" F("job__order").asc(nulls_last=True),
"job__name",
) )
active_job_group = JobGroup.objects.filter(slug=slug).first() active_job_group = JobGroup.objects.filter(slug=slug).first()

View File

@@ -27,7 +27,8 @@ def jobs(request, slug=None):
raise Http404("wrong job") raise Http404("wrong job")
job_members = JobMember.active_member.get_all(slug=slug).order_by( job_members = JobMember.active_member.get_all(slug=slug).order_by(
F("job__order").asc(nulls_last=True), "job__name" F("job__order").asc(nulls_last=True),
"job__name",
) )
active_job_group = JobGroup.objects.filter(slug=slug).first() active_job_group = JobGroup.objects.filter(slug=slug).first()

View File

@@ -88,7 +88,7 @@ class PostAdmin(admin.ModelAdmin):
"all": [ "all": [
"jquery-ui/jquery-ui.min.css", "jquery-ui/jquery-ui.min.css",
"jquery-ui/ui-lightness/theme.css", "jquery-ui/ui-lightness/theme.css",
] ],
} }
js = [ js = [
"jquery-ui/jquery-ui.min.js", "jquery-ui/jquery-ui.min.js",
@@ -108,7 +108,7 @@ class NewsAdmin(PostAdmin):
"title", "title",
"subtitle", "subtitle",
"tags", "tags",
) ),
}, },
), ),
( (
@@ -117,7 +117,7 @@ class NewsAdmin(PostAdmin):
"fields": ( "fields": (
"status", "status",
"is_pinned", "is_pinned",
) ),
}, },
), ),
( (
@@ -126,7 +126,7 @@ class NewsAdmin(PostAdmin):
"fields": ( "fields": (
"image", "image",
"body", "body",
) ),
}, },
), ),
( (
@@ -136,7 +136,7 @@ class NewsAdmin(PostAdmin):
"slug", "slug",
"author", "author",
"public_date", "public_date",
) ),
}, },
), ),
) )
@@ -161,7 +161,7 @@ class EventAdmin(PostAdmin):
"title", "title",
"subtitle", "subtitle",
"tags", "tags",
) ),
}, },
), ),
( (
@@ -170,7 +170,7 @@ class EventAdmin(PostAdmin):
"fields": ( "fields": (
"status", "status",
"is_pinned", "is_pinned",
) ),
}, },
), ),
( (
@@ -180,7 +180,7 @@ class EventAdmin(PostAdmin):
"event_start", "event_start",
"event_end", "event_end",
"event_place", "event_place",
) ),
}, },
), ),
( (
@@ -189,7 +189,7 @@ class EventAdmin(PostAdmin):
"fields": ( "fields": (
"image", "image",
"body", "body",
) ),
}, },
), ),
( (
@@ -199,7 +199,7 @@ class EventAdmin(PostAdmin):
"slug", "slug",
"author", "author",
"public_date", "public_date",
) ),
}, },
), ),
) )
@@ -223,7 +223,7 @@ class FetMeetingAdmin(EventAdmin):
"event_end", "event_end",
"event_place", "event_place",
"tags", "tags",
) ),
}, },
), ),
) )

View File

@@ -149,10 +149,14 @@ class PostSearchForm(forms.Form):
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", required=False, widget=CheckboxInput label="Kompakte Ansicht",
required=False,
widget=CheckboxInput,
) )
fet_meeting_only = forms.BooleanField( fet_meeting_only = forms.BooleanField(
label="nur FET Sitzungen", required=False, widget=CheckboxInput label="nur FET Sitzungen",
required=False,
widget=CheckboxInput,
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@@ -10,20 +10,14 @@ class PublishedManager(models.Manager):
""" """
publish all posts with status 'PUBLIC' publish all posts with status 'PUBLIC'
""" """
if public: qs = self.get_queryset().filter(status="20") if public else self.get_queryset()
qs = self.get_queryset().filter(status="20")
else:
qs = self.get_queryset()
return qs return qs
def published_all(self, public=True): def published_all(self, public=True):
""" """
publish all posts with status 'PUBLIC' and 'ONLY_INTERN' publish all posts with status 'PUBLIC' and 'ONLY_INTERN'
""" """
if public: qs = self.get_queryset().filter(~Q(status="10")) if public else self.get_queryset()
qs = self.get_queryset().filter(~Q(status="10"))
else:
qs = self.get_queryset()
return qs return qs
@@ -35,7 +29,7 @@ class PostManager(PublishedManager, models.Manager):
When(post_type="N", then="public_date"), When(post_type="N", then="public_date"),
When(post_type="E", then="event_start__date"), When(post_type="E", then="event_start__date"),
When(post_type="F", then="event_start__date"), When(post_type="F", then="event_start__date"),
) ),
) )
return qs.order_by("-date", "-id") return qs.order_by("-date", "-id")
@@ -74,7 +68,7 @@ class ArticleManager(PublishedManager, models.Manager):
date=Case( date=Case(
When(post_type="N", then="public_date"), When(post_type="N", then="public_date"),
When(post_type="E", then="event_start__date"), When(post_type="E", then="event_start__date"),
) ),
) )
return qs.order_by("-date", "-id") return qs.order_by("-date", "-id")
@@ -104,7 +98,7 @@ class ArticleManager(PublishedManager, models.Manager):
.filter(is_pinned=True) .filter(is_pinned=True)
.filter( .filter(
(Q(post_type="N") & Q(public_date__gt=post_date)) (Q(post_type="N") & Q(public_date__gt=post_date))
| (Q(post_type="E") & Q(event_end__date__gt=event_date)) | (Q(post_type="E") & Q(event_end__date__gt=event_date)),
) )
.first() .first()
) )
@@ -120,7 +114,7 @@ class NewsManager(PublishedManager, models.Manager):
qs = qs.annotate( qs = qs.annotate(
date=Case( date=Case(
When(post_type="N", then="public_date"), When(post_type="N", then="public_date"),
) ),
) )
return qs.order_by("-date") return qs.order_by("-date")
@@ -136,7 +130,7 @@ class AllEventManager(PublishedManager, models.Manager):
date=Case( date=Case(
When(post_type="E", then="event_start__date"), When(post_type="E", then="event_start__date"),
When(post_type="F", then="event_start__date"), When(post_type="F", then="event_start__date"),
) ),
) )
return qs.order_by("-date") return qs.order_by("-date")
@@ -157,7 +151,7 @@ class EventManager(PublishedManager, models.Manager):
qs = qs.annotate( qs = qs.annotate(
date=Case( date=Case(
When(post_type="E", then="event_start__date"), When(post_type="E", then="event_start__date"),
) ),
) )
return qs.order_by("-date") return qs.order_by("-date")
@@ -182,7 +176,7 @@ class FetMeetingManager(PublishedManager, models.Manager):
qs = qs.annotate( qs = qs.annotate(
date=Case( date=Case(
When(post_type="F", then="event_start__date"), When(post_type="F", then="event_start__date"),
) ),
) )
return qs.order_by("-date") return qs.order_by("-date")

View File

@@ -86,7 +86,10 @@ class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
public_date = models.DateField( public_date = models.DateField(
verbose_name="Veröffentlichung", null=True, blank=True, default=timezone.now verbose_name="Veröffentlichung",
null=True,
blank=True,
default=timezone.now,
) )
__choices = [("N", _("News")), ("E", _("Event")), ("F", _("FetMeeting"))] __choices = [("N", _("News")), ("E", _("Event")), ("F", _("FetMeeting"))]
@@ -137,9 +140,6 @@ class Post(models.Model):
self.title, self.title,
) )
def get_absolute_url(self):
return reverse("posts:post", kwargs={"slug": self.slug})
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# save the post with some defaults # save the post with some defaults
if not self.public_date: if not self.public_date:
@@ -150,6 +150,9 @@ class Post(models.Model):
super().save(*args, **kwargs) super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse("posts:post", kwargs={"slug": self.slug})
@property @property
def agenda_html(self) -> str | None: def agenda_html(self) -> str | None:
"Agenda HTML from Etherpad Pad" "Agenda HTML from Etherpad Pad"
@@ -188,7 +191,9 @@ class Post(models.Model):
ep_set_html(self.protocol_key, value) ep_set_html(self.protocol_key, value)
request_logger.info( request_logger.info(
"Set protocol etherpad. Post: %s. Key: %s", self.slug, self.protocol_key "Set protocol etherpad. Post: %s. Key: %s",
self.slug,
self.protocol_key,
) )
return value return value
@@ -302,10 +307,7 @@ class Post(models.Model):
@property @property
def published(self): def published(self):
if self.status == self.Status.PUBLIC: return self.status == self.Status.PUBLIC
return True
return False
class News(Post): class News(Post):
@@ -328,16 +330,16 @@ class Event(Post):
only_events = EventManager() only_events = EventManager()
all_events = AllEventManager() all_events = AllEventManager()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "E"
class Meta: class Meta:
proxy = True proxy = True
verbose_name = "Event" verbose_name = "Event"
verbose_name_plural = "Events" verbose_name_plural = "Events"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "E"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.post_type: if not self.post_type:
self.post_type = "E" self.post_type = "E"
@@ -355,16 +357,16 @@ class Event(Post):
class FetMeeting(Event): class FetMeeting(Event):
objects = FetMeetingManager() objects = FetMeetingManager()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "F"
class Meta: class Meta:
proxy = True proxy = True
verbose_name = "Fet Sitzung" verbose_name = "Fet Sitzung"
verbose_name_plural = "Fet Sitzungen" verbose_name_plural = "Fet Sitzungen"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "F"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.title = "Fachschaftssitzung" self.title = "Fachschaftssitzung"
if not self.slug: if not self.slug:
@@ -398,8 +400,7 @@ class FetMeeting(Event):
def __get_slug(self) -> str: def __get_slug(self) -> str:
slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung") slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung")
if Post.objects.filter(slug=slug).exists(): if Post.objects.filter(slug=slug).exists() and Post.objects.get(slug=slug).id != self.id:
if Post.objects.get(slug=slug).id != self.id:
raise ValidationError("Es existiert bereits eine Sitzung mit demselben Datum.") raise ValidationError("Es existiert bereits eine Sitzung mit demselben Datum.")
return slug return slug

View File

@@ -22,9 +22,7 @@ class PostIndex(indexes.SearchIndex, indexes.Indexable):
def prepare_date(self, obj): def prepare_date(self, obj):
if obj.post_type == "N": if obj.post_type == "N":
return obj.public_date return obj.public_date
elif obj.post_type == "E": elif obj.post_type == "E" or obj.post_type == "F":
return obj.event_start.date()
elif obj.post_type == "F":
return obj.event_start.date() return obj.event_start.date()
def prepare_agenda(self, obj): def prepare_agenda(self, obj):

View File

@@ -146,13 +146,13 @@ class PostDetailView(DetailView):
Helper function for getting previous post Helper function for getting previous post
""" """
posts = Post.objects.date_sorted_list(self.public_only).filter( posts = Post.objects.date_sorted_list(self.public_only).filter(
post_type=self.object.post_type post_type=self.object.post_type,
) )
qs = posts.filter( qs = posts.filter(
# Get posts which are in the future. # Get posts which are in the future.
Q(date__lt=self.object.date) Q(date__lt=self.object.date)
# Get posts which have the same date but id is lower. # Get posts which have the same date but id is lower.
| (Q(date__lte=self.object.date) & Q(id__lt=self.object.id)) | (Q(date__lte=self.object.date) & Q(id__lt=self.object.id)),
) )
if not qs: if not qs:
# If there are any prev posts, then take the latest one. # If there are any prev posts, then take the latest one.
@@ -173,7 +173,7 @@ class PostDetailView(DetailView):
# Get posts which are in the past. # Get posts which are in the past.
Q(date__gt=self.object.date) Q(date__gt=self.object.date)
# Get posts which have the same date but id is greater. # Get posts which have the same date but id is greater.
| (Q(date__gte=self.object.date) & Q(id__gt=self.object.id)) | (Q(date__gte=self.object.date) & Q(id__gt=self.object.id)),
) )
if not qs: if not qs:
# If there are any next posts, then take the first one. # If there are any next posts, then take the first one.
@@ -314,7 +314,7 @@ def show_pdf(request, html, filename):
response = HttpResponse(pdf, content_type="application/pdf") response = HttpResponse(pdf, content_type="application/pdf")
content = "inline; filename=%s" % filename content = f"inline; filename={filename}"
response["Content-Disposition"] = content response["Content-Disposition"] = content
return response return response

View File

@@ -22,7 +22,7 @@ class FetUserSearchForm(SearchForm):
sqs_gallery = self.searchqueryset.models(Album) sqs_gallery = self.searchqueryset.models(Album)
sqs_gallery = sqs_gallery.filter( sqs_gallery = sqs_gallery.filter(
SQ(title__icontains=self.cleaned_data["q"]) SQ(title__icontains=self.cleaned_data["q"])
| SQ(description__icontains=self.cleaned_data["q"]) | SQ(description__icontains=self.cleaned_data["q"]),
) )
sqs_intern = self.searchqueryset.models(Etherpad) sqs_intern = self.searchqueryset.models(Etherpad)
@@ -31,7 +31,7 @@ class FetUserSearchForm(SearchForm):
sqs_member = self.searchqueryset.models(Member) sqs_member = self.searchqueryset.models(Member)
sqs_member = sqs_member.filter( sqs_member = sqs_member.filter(
SQ(firstname__icontains=self.cleaned_data["q"]) SQ(firstname__icontains=self.cleaned_data["q"])
| SQ(surname__icontains=self.cleaned_data["q"]) | SQ(surname__icontains=self.cleaned_data["q"]),
) )
sqs_post = self.searchqueryset.models(Post) sqs_post = self.searchqueryset.models(Post)
@@ -39,7 +39,7 @@ class FetUserSearchForm(SearchForm):
SQ(title__icontains=self.cleaned_data["q"]) SQ(title__icontains=self.cleaned_data["q"])
| SQ(body__icontains=self.cleaned_data["q"]) | SQ(body__icontains=self.cleaned_data["q"])
| SQ(agenda__icontains=self.cleaned_data["q"]) | SQ(agenda__icontains=self.cleaned_data["q"])
| SQ(protocol__icontains=self.cleaned_data["q"]) | SQ(protocol__icontains=self.cleaned_data["q"]),
) )
tmp_results = deque([]) tmp_results = deque([])
@@ -82,20 +82,20 @@ class NonUserSearchForm(SearchForm):
sqs_gallery = self.searchqueryset.models(Album).filter(status="20") sqs_gallery = self.searchqueryset.models(Album).filter(status="20")
sqs_gallery = sqs_gallery.filter( sqs_gallery = sqs_gallery.filter(
SQ(title__icontains=self.cleaned_data["q"]) SQ(title__icontains=self.cleaned_data["q"])
| SQ(description__icontains=self.cleaned_data["q"]) | SQ(description__icontains=self.cleaned_data["q"]),
) )
sqs_member = self.searchqueryset.models(Member) sqs_member = self.searchqueryset.models(Member)
sqs_member = sqs_member.filter( sqs_member = sqs_member.filter(
SQ(firstname__icontains=self.cleaned_data["q"]) SQ(firstname__icontains=self.cleaned_data["q"])
| SQ(surname__icontains=self.cleaned_data["q"]) | SQ(surname__icontains=self.cleaned_data["q"]),
) )
sqs_post = self.searchqueryset.models(Post).filter(status="20") sqs_post = self.searchqueryset.models(Post).filter(status="20")
sqs_post = sqs_post.filter( sqs_post = sqs_post.filter(
SQ(title__icontains=self.cleaned_data["q"]) SQ(title__icontains=self.cleaned_data["q"])
| SQ(body__icontains=self.cleaned_data["q"]) | SQ(body__icontains=self.cleaned_data["q"])
| SQ(agenda__icontains=self.cleaned_data["q"]) | SQ(agenda__icontains=self.cleaned_data["q"]),
) )
tmp_results = deque([]) tmp_results = deque([])