ruff check; update ValidationError params

This commit is contained in:
2026-01-06 17:45:06 +01:00
parent d2c4a6ef6a
commit 6eeb7769a4
16 changed files with 1282 additions and 1245 deletions

View File

@@ -27,7 +27,7 @@ def create_perms(sender, **kwargs):
from django.contrib.auth.models import Group, Permission from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
group, created = Group.objects.get_or_create(name=sender.label) group, _ = Group.objects.get_or_create(name=sender.label)
content_types = ContentType.objects.filter(app_label=sender.label) content_types = ContentType.objects.filter(app_label=sender.label)
for content_type in content_types: for content_type in content_types:

View File

@@ -1,9 +1,8 @@
import datetime
import decimal import decimal
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from django import forms from django import forms
from django.core.validators import ValidationError from django.core.exceptions import ValidationError
from django.db.models import Count, Q from django.db.models import Count, Q
from django.forms import DateInput from django.forms import DateInput
from django.utils import timezone from django.utils import timezone
@@ -451,8 +450,8 @@ class ResolutionAdminForm(forms.ModelForm):
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
budget = decimal.Decimal(0.0) budget = decimal.Decimal("0.0")
total = decimal.Decimal(0.0) total = decimal.Decimal("0.0")
if resolution := kwargs.get("instance"): if resolution := kwargs.get("instance"):
for elem in Bill.objects.filter(resolution=resolution): for elem in Bill.objects.filter(resolution=resolution):
total += elem.amount total += elem.amount

View File

@@ -1,6 +1,8 @@
import logging
from pathlib import Path from pathlib import Path
from django.core.validators import FileExtensionValidator, ValidationError from django.core.exceptions import ValidationError
from django.core.validators import FileExtensionValidator
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
@@ -8,6 +10,8 @@ from members.models import Member
from .validators import validate_bill_file_extension from .validators import validate_bill_file_extension
logger = logging.getLogger(__name__)
class BankData(models.Model): class BankData(models.Model):
# members can be deleted but never their bank datas # members can be deleted but never their bank datas
@@ -86,8 +90,18 @@ class Resolution(models.Model):
if not Resolution.objects.filter(id=_id).exists(): if not Resolution.objects.filter(id=_id).exists():
break break
else: else:
msg = (
"Es wurden zu viele Beschlüsse in dieser Woche %(week)s vom Jahr %(year)s "
"erstellt."
)
logger.error(
"Too many resolutions created in week %(week)s of year %(year)s.",
extra={"week": week, "year": year},
)
raise ValidationError( raise ValidationError(
f"Es wurden zu viele Beschlüsse in dieser Woche angelegt. (ID: {_id})" msg,
code="too_many_resolutions",
params={"week": week, "year": year},
) )
self.id = _id self.id = _id

View File

@@ -27,11 +27,11 @@ def get_image_list(folder_name: str) -> list:
Path(thumb_path).mkdir(exist_ok=True) Path(thumb_path).mkdir(exist_ok=True)
for _file in os.listdir(image_path): for _file in image_path.iterdir():
if Path(_file).suffix.lower()[1:] not in get_available_image_extensions(): if _file.suffix.lower()[1:] not in get_available_image_extensions():
continue continue
thumb_file_path = Path(thumb_path) / f"thumb_{_file}" thumb_file_path = Path(thumb_path) / f"thumb_{_file.name}"
if not Path(thumb_file_path).exists(): if not Path(thumb_file_path).exists():
with Image.open(Path(image_path) / _file, "r") as im: with Image.open(Path(image_path) / _file, "r") as im:
if im._getexif() is not None: if im._getexif() is not None:

View File

@@ -60,6 +60,8 @@ class DraftAlbumDetailView(LoginRequiredMixin, DetailView):
) )
break break
else: else:
raise Http404("Album slug not found.") msg = f"Album mit dem Slug '{slug}' nicht gefunden."
logger.error("Album with slug '%s' not found.", slug)
raise Http404(msg)
return album return album

View File

@@ -2,7 +2,7 @@ import logging
from datetime import date from datetime import date
from pathlib import Path from pathlib import Path
from django.core.validators import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.db.models.constraints import UniqueConstraint from django.db.models.constraints import UniqueConstraint
from django.urls import reverse from django.urls import reverse
@@ -156,11 +156,20 @@ class Etherpad(models.Model):
def clean(self): def clean(self):
pad_name = slugify(str(self.slug_id) + "-" + self.title[:40]) pad_name = slugify(str(self.slug_id) + "-" + self.title[:40])
if len(pad_name) > 50: if len(pad_name) > 50:
raise ValidationError( msg = (
"Name ist zum Erstellen des Etherpads zu lange - max. 50 Zeichen. (Länge: "
"%(length)s, Name: %(pad_name)s)"
)
logger.error(
( (
"Name zum Erstellen des Etherpads ist zu lange - max. 50 Zeichen. (" "Name '%(pad_name)s' is too long for creating a new etherpad - max. 50 "
"Länge: %(length)s, Name: %(pad_name)s)" "characters. (Length: %(length)s)",
), ),
extra={"length": len(pad_name), "pad_name": pad_name},
)
raise ValidationError(
msg,
code="pad_name_too_long",
params={"length": len(pad_name), "pad_name": pad_name}, params={"length": len(pad_name), "pad_name": pad_name},
) )
@@ -168,8 +177,13 @@ class Etherpad(models.Model):
if ep_create_new_pad(pad_name): if ep_create_new_pad(pad_name):
self.etherpad_key = pad_name self.etherpad_key = pad_name
else: else:
msg = "Etherpad '%(pad_name)s' konnte nicht erstellt werden."
logger.error(
"Etherpad '%(pad_name)s' could not be created. This should never happen!",
extra={"pad_name": pad_name},
)
raise ValidationError( raise ValidationError(
f"Etherpad '{pad_name}' konnte nicht erstellt werden. This should never happen!" msg, code="pad_creation_failed", params={"pad_name": pad_name}
) )
@property @property

View File

@@ -25,6 +25,8 @@ class MemberRoleFilter(admin.SimpleListFilter):
if self.value() in Member.MemberRole: if self.value() in Member.MemberRole:
return queryset.filter(role=self.value()) return queryset.filter(role=self.value())
return queryset
class JobMemberInline(admin.TabularInline): class JobMemberInline(admin.TabularInline):
model = JobMember model = JobMember

View File

@@ -2,7 +2,7 @@ import logging
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.validators import ValidationError, validate_email from django.core.validators import validate_email
from django.db import models from django.db import models
from django.db.models import F from django.db.models import F
from django.urls import reverse from django.urls import reverse
@@ -81,9 +81,6 @@ class Member(models.Model):
return reverse("members:member", kwargs={"pk": self.pk}) return reverse("members:member", kwargs={"pk": self.pk})
def clean(self): def clean(self):
if not self.image:
raise ValidationError("Es fehlt das Profilbild.")
if self.username: if self.username:
try: try:
user = User.objects.get(username=self.username.lower()) user = User.objects.get(username=self.username.lower())

View File

@@ -24,10 +24,8 @@ def get_jobs_sidebar(slug):
) )
active_job_group = JobGroup.objects.filter(slug=slug).first() active_job_group = JobGroup.objects.filter(slug=slug).first()
context = { return {
"job_groups": job_groups, "job_groups": job_groups,
"job_members": job_members, "job_members": job_members,
"active_job_group": active_job_group, "active_job_group": active_job_group,
} }
return context

View File

@@ -1,20 +1,24 @@
from django.core.validators import ValidationError from django.core.exceptions import ValidationError
def validate_domainonly_email(value): def validate_domainonly_email(value):
if "fet.at" not in value: if "fet.at" not in value:
raise ValidationError("In der Mailadresse fehlt die richtige Domäne.") msg = "In der Mailadresse fehlt die richtige Domäne."
raise ValidationError(msg, code="invalid_domain")
def validate_file_size(value): def validate_file_size(value):
if value.size > 10 * 1024 * 1024: if value.size > 10 * 1024 * 1024:
raise ValidationError("Die maximale Dateigröße ist 10MB.") msg = "Die maximale Dateigröße ist 10MB."
raise ValidationError(msg, code="file_too_large")
def validate_image_dimension(value): def validate_image_dimension(value):
if value.height < 150 or value.width < 150: if value.height < 150 or value.width < 150:
msg = "Das Bild ist zu klein. (Höhe: %(height)s, Breite: %(width)s)"
raise ValidationError( raise ValidationError(
"Das Bild ist zu klein. (Höhe: %(height)s, Breite: %(width)s)", msg,
code="image_too_small",
params={ params={
"height": value.height, "height": value.height,
"width": value.width, "width": value.width,

View File

@@ -23,10 +23,7 @@ def create_token(username, masterpassword):
@authenticated_user @authenticated_user
def index(request): def index(request):
context = { context = {"mctoken": "", "valid_master_pwd": True}
"mctoken": "",
"valid_master_pwd": True
}
masterpassword = settings.MC_MASTERPASSWORD masterpassword = settings.MC_MASTERPASSWORD

View File

@@ -179,8 +179,7 @@ class EventManager(PublishedManager, models.Manager):
def past_events(self, public=True): def past_events(self, public=True):
date_today = timezone.now().date() date_today = timezone.now().date()
qs = self.published(public).filter(event_start__lt=date_today) return self.published(public).filter(event_start__lt=date_today)
return qs
class FetMeetingManager(PublishedManager, models.Manager): class FetMeetingManager(PublishedManager, models.Manager):
@@ -204,5 +203,4 @@ class FetMeetingManager(PublishedManager, models.Manager):
def past_events(self): def past_events(self):
date_today = timezone.now().date() date_today = timezone.now().date()
qs = self.published().filter(event_start__lt=date_today) return self.published().filter(event_start__lt=date_today)
return qs

View File

@@ -3,7 +3,7 @@ from datetime import timedelta
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.validators import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
@@ -252,9 +252,11 @@ class Post(models.Model):
def clean(self): def clean(self):
if self.event_end and self.event_end < self.event_start: if self.event_end and self.event_end < self.event_start:
raise ValidationError("Das Ende des Events liegt vor dem Beginn.") msg = "Das Ende des Events liegt vor dem Beginn."
raise ValidationError(msg, code="invalid_event_end")
if self.event_start and self.post_type not in ["E", "F"]: if self.event_start and self.post_type not in ["E", "F"]:
raise ValidationError("Für diesen Post Typ ist kein Event Start zulässig.") msg = "Für diesen Post Typ ist kein Event Start zulässig."
raise ValidationError(msg, code="invalid_event_start")
@property @property
def published(self): def published(self):
@@ -302,7 +304,8 @@ class Event(Post):
def clean(self): def clean(self):
super().clean() super().clean()
if not self.event_start: if not self.event_start:
raise ValidationError("Das Datum des Events fehlt.") msg = "Das Datum des Events fehlt."
raise ValidationError(msg, code="missing_event_start")
class FetMeeting(Event): class FetMeeting(Event):
@@ -355,7 +358,12 @@ class FetMeeting(Event):
slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung") slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung")
if Post.objects.filter(slug=slug).exists() and Post.objects.get(slug=slug).id != self.id: if Post.objects.filter(slug=slug).exists() and Post.objects.get(slug=slug).id != self.id:
raise ValidationError("Es existiert bereits eine Sitzung mit demselben Datum.") msg = "Es existiert bereits eine Sitzung mit demselben Datum."
logger.error(
"A fet meeting with same date (slug: %(slug)s) is already existing.",
extra={"slug": slug},
)
raise ValidationError(msg, code="duplicate_fet_meeting")
return slug return slug

View File

@@ -20,11 +20,11 @@ class PostIndex(indexes.SearchIndex, indexes.Indexable):
return self.get_model().objects.date_sorted(public=False) return self.get_model().objects.date_sorted(public=False)
def prepare_date(self, obj): def prepare_date(self, obj):
if obj.post_type == "N": if obj.post_type == "E" or obj.post_type == "F":
return obj.public_date
elif obj.post_type == "E" or obj.post_type == "F":
return obj.event_start.date() return obj.event_start.date()
return obj.public_date # obj.post_type == "N"
def prepare_agenda(self, obj): def prepare_agenda(self, obj):
if obj.has_agenda and obj.agenda_html: if obj.has_agenda and obj.agenda_html:
return html2text(obj.agenda_html) return html2text(obj.agenda_html)

View File

@@ -117,15 +117,17 @@ class PostDetailView(DetailView):
if not obj.published: if not obj.published:
related_posts.remove(obj) related_posts.remove(obj)
context = { context.update(
"post": self.object, {
"files": files, "post": self.object,
"author": author, "files": files,
"author_image": author_image, "author": author,
"next": self.post_next(), "author_image": author_image,
"prev": self.post_prev(), "next": self.post_next(),
"related_posts": related_posts[:4], "prev": self.post_prev(),
} "related_posts": related_posts[:4],
}
)
return context return context
@@ -309,7 +311,8 @@ def show_pdf(request, html, filename):
html = html[:idx] + rendered + html[idx:] html = html[:idx] + rendered + html[idx:]
if not (pdf := render_to_pdf(html)): if not (pdf := render_to_pdf(html)):
raise Http404("can't create pdf file.") msg = "PDF konnte nicht erstellt werden."
raise Http404(msg)
response = HttpResponse(pdf, content_type="application/pdf") response = HttpResponse(pdf, content_type="application/pdf")

View File

@@ -1,6 +1,6 @@
from django.core.exceptions import ValidationError
from django.core.validators import FileExtensionValidator from django.core.validators import FileExtensionValidator
from django.db import models from django.db import models
from django.forms import ValidationError
from .mails import send_mail_approved, send_mail_rejected, send_mail_returned from .mails import send_mail_approved, send_mail_rejected, send_mail_returned
from .managers import RentalItemsManager from .managers import RentalItemsManager
@@ -116,7 +116,8 @@ class Rental(models.Model):
self.date_end = self.date_start self.date_end = self.date_start
if self.date_start > self.date_end: if self.date_start > self.date_end:
raise ValidationError("Das Abholdatum muss vor dem Rückgabedatum liegen.") msg = "Das Abholdatum muss vor dem Rückgabedatum liegen."
raise ValidationError(msg, code="invalid_date_range")
def calc_total_deposit(self) -> int: def calc_total_deposit(self) -> int:
total_deposit = 0 total_deposit = 0