code optimization
This commit is contained in:
@@ -36,7 +36,7 @@ class JobOverviewInline(JobMemberInline):
|
||||
verbose_name_plural = "Tätigkeitsübersicht"
|
||||
|
||||
def get_queryset(self, request):
|
||||
return JobMember.members.get_all_jobs_sorted()
|
||||
return JobMember.members.get_all_jobs()
|
||||
|
||||
|
||||
class ActiveMemberInline(JobMemberInline):
|
||||
@@ -81,11 +81,8 @@ class MemberAdmin(admin.ModelAdmin):
|
||||
"nickname",
|
||||
"mailaccount",
|
||||
"role",
|
||||
"description",
|
||||
"image",
|
||||
"birthday",
|
||||
"phone",
|
||||
"address",
|
||||
"description",
|
||||
),
|
||||
},
|
||||
),
|
||||
|
||||
@@ -24,8 +24,9 @@ class ActiveMemberForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
member_qs = self.fields["member"].queryset.filter(role="A").order_by("firstname", "surname")
|
||||
self.fields["member"].queryset = member_qs
|
||||
self.fields["member"].queryset = (
|
||||
self.fields["member"].queryset.filter(role="A").order_by("firstname", "surname")
|
||||
)
|
||||
|
||||
|
||||
class InactiveMemberForm(forms.ModelForm):
|
||||
@@ -35,8 +36,9 @@ class InactiveMemberForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
member_qs = self.fields["member"].queryset.order_by("firstname", "surname")
|
||||
self.fields["member"].queryset = member_qs
|
||||
self.fields["member"].queryset = self.fields["member"].queryset.order_by(
|
||||
"firstname", "surname"
|
||||
)
|
||||
|
||||
|
||||
class MemberForm(forms.ModelForm):
|
||||
@@ -54,9 +56,6 @@ class MemberForm(forms.ModelForm):
|
||||
labels = {
|
||||
"description": "Beschreibung zu der Person",
|
||||
"image": "Porträt",
|
||||
"birthday": "Geburtstag",
|
||||
"phone": "Telefonnummer",
|
||||
"address": "Wohnadresse",
|
||||
}
|
||||
|
||||
widgets = {"description": CKEditorUploadingWidget(config_name="default")}
|
||||
|
||||
@@ -17,16 +17,13 @@ class ActiveJobMemberManager(models.Manager):
|
||||
|
||||
def get_queryset(self):
|
||||
date_today = timezone.now().date()
|
||||
qs = (
|
||||
return (
|
||||
super()
|
||||
.get_queryset()
|
||||
.filter(Q(member__role="A") & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)))
|
||||
.order_by("job_role", "member__firstname", "member__surname", "job_start")
|
||||
)
|
||||
|
||||
return qs.filter(
|
||||
Q(member__role="A") & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)),
|
||||
)
|
||||
|
||||
|
||||
class InactiveJobMemberManager(models.Manager):
|
||||
"""return a list of inactive member."""
|
||||
@@ -40,39 +37,42 @@ class InactiveJobMemberManager(models.Manager):
|
||||
|
||||
def get_queryset(self):
|
||||
date_today = timezone.now().date()
|
||||
qs = super().get_queryset().order_by("member__firstname", "member__surname", "-job_start")
|
||||
|
||||
return qs.filter(
|
||||
return (
|
||||
super()
|
||||
.get_queryset()
|
||||
.filter(
|
||||
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))
|
||||
)
|
||||
.order_by("member__firstname", "member__surname", "-job_start")
|
||||
)
|
||||
|
||||
|
||||
class JobMemberManager(models.Manager):
|
||||
def get_members(self, role):
|
||||
qs = self.get_queryset().order_by("member__firstname")
|
||||
|
||||
return qs.filter(Q(member__role=role))
|
||||
|
||||
def get_all_jobs_sorted(self):
|
||||
qs = self.get_queryset().order_by(
|
||||
F("job_end").desc(nulls_first=True),
|
||||
"-job_start",
|
||||
"job__name",
|
||||
def get_all_jobs(self):
|
||||
return self.get_queryset().order_by(
|
||||
F("job_end").desc(nulls_first=True), "-job_start", "job__name"
|
||||
)
|
||||
return qs
|
||||
|
||||
def get_active_jobs(self, member_id):
|
||||
date_today = timezone.now().date()
|
||||
qs = self.get_queryset().filter(member__id=member_id).order_by("-job_start", "job__name")
|
||||
|
||||
return qs.filter(Q(job_end__gt=date_today) | Q(job_end__isnull=True))
|
||||
return (
|
||||
self.get_queryset()
|
||||
.filter(Q(member__id=member_id) & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)))
|
||||
.order_by("-job_start", "job__name")
|
||||
)
|
||||
|
||||
def get_inactive_jobs(self, member_id):
|
||||
date_today = timezone.now().date()
|
||||
qs = self.get_queryset().filter(member__id=member_id).order_by("-job_start", "job__name")
|
||||
|
||||
return qs.filter(Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False))
|
||||
return (
|
||||
self.get_queryset()
|
||||
.filter(
|
||||
Q(member__id=member_id)
|
||||
& Q(job_end__lt=date_today + timedelta(days=1))
|
||||
& Q(job_end__isnull=False)
|
||||
)
|
||||
.order_by("-job_start", "job__name")
|
||||
)
|
||||
|
||||
|
||||
class MemberManager(models.Manager):
|
||||
|
||||
@@ -26,7 +26,7 @@ class Migration(migrations.Migration):
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
name='phone',
|
||||
field=models.CharField(blank=True, max_length=17, validators=[members.validators.PhoneNumberValidator()]),
|
||||
field=models.CharField(blank=True, max_length=17),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='member',
|
||||
|
||||
@@ -16,12 +16,12 @@ from .managers import (
|
||||
MemberManager,
|
||||
)
|
||||
from .validators import (
|
||||
PhoneNumberValidator,
|
||||
validate_domainonly_email,
|
||||
validate_file_size,
|
||||
validate_image_dimension,
|
||||
)
|
||||
|
||||
fet_logo_url = settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -55,23 +55,13 @@ class Member(models.Model):
|
||||
default=MemberRole.ACTIVE,
|
||||
)
|
||||
|
||||
description = models.TextField(null=True, blank=True)
|
||||
description = models.TextField(blank=True, default="")
|
||||
|
||||
image = ThumbnailerImageField(
|
||||
upload_to="uploads/members/image/",
|
||||
validators=[validate_file_size, validate_image_dimension],
|
||||
)
|
||||
|
||||
birthday = models.DateField(null=True, blank=True)
|
||||
|
||||
phone = models.CharField(
|
||||
max_length=17,
|
||||
blank=True,
|
||||
validators=[PhoneNumberValidator()],
|
||||
)
|
||||
|
||||
address = models.TextField(null=True, blank=True)
|
||||
|
||||
date_modified = models.DateTimeField(auto_now=True)
|
||||
date_created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
@@ -88,7 +78,7 @@ class Member(models.Model):
|
||||
|
||||
# need to have 'View on site' link in admin app
|
||||
def get_absolute_url(self):
|
||||
return reverse("members:member", kwargs={"member_id": self.id})
|
||||
return reverse("members:member", kwargs={"pk": self.pk})
|
||||
|
||||
def clean(self):
|
||||
if not self.image:
|
||||
@@ -98,7 +88,7 @@ class Member(models.Model):
|
||||
try:
|
||||
user = User.objects.get(username=self.username.lower())
|
||||
except User.DoesNotExist as e:
|
||||
logger.info("Username does not exist. Error: %s", e)
|
||||
logger.info("Username not found. Error: %s", e)
|
||||
else:
|
||||
user.first_name = self.firstname
|
||||
user.save()
|
||||
@@ -108,35 +98,19 @@ class Member(models.Model):
|
||||
|
||||
@property
|
||||
def image_url(self):
|
||||
if self.image:
|
||||
return self.image.url
|
||||
|
||||
# return default image
|
||||
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
|
||||
return self.image.url if self.image else fet_logo_url
|
||||
|
||||
@property
|
||||
def avatar_url(self):
|
||||
if self.image:
|
||||
return self.image["avatar"].url
|
||||
|
||||
# return default image
|
||||
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
|
||||
return self.image["avatar"].url if self.image else fet_logo_url
|
||||
|
||||
@property
|
||||
def portrait_url(self):
|
||||
if self.image:
|
||||
return self.image["portrait"].url
|
||||
|
||||
# return default image
|
||||
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
|
||||
return self.image["portrait"].url if self.image else fet_logo_url
|
||||
|
||||
@property
|
||||
def thumb_url(self):
|
||||
if self.image:
|
||||
return self.image["thumb"].url
|
||||
|
||||
# return default image
|
||||
return settings.STATIC_URL + "img/FET-Logo-2014-quadrat.png"
|
||||
return self.image["thumb"].url if self.image else fet_logo_url
|
||||
|
||||
|
||||
class JobGroup(models.Model):
|
||||
@@ -145,7 +119,7 @@ class JobGroup(models.Model):
|
||||
shortterm = models.CharField(max_length=128, unique=True, blank=True)
|
||||
slug = models.SlugField(unique=True, null=True, blank=True)
|
||||
|
||||
description = models.TextField(null=True, blank=True)
|
||||
description = models.TextField(blank=True, default="")
|
||||
|
||||
# Managers
|
||||
objects = models.Manager()
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
from django.urls import path
|
||||
|
||||
from . import apps, views
|
||||
from . import apps
|
||||
from .views import ActiveMemberListView, JobListView, MemberDetailView, MemberListView
|
||||
|
||||
app_name = apps.MembersConfig.name
|
||||
|
||||
urlpatterns = [
|
||||
path("members/", views.index, name="index"),
|
||||
path("members/<str:role>/", views.members, name="members"),
|
||||
path("member/<int:member_id>/", views.profile, name="member"),
|
||||
path("section/<slug:slug>/", views.jobs, name="jobs"),
|
||||
path("members/", ActiveMemberListView.as_view(), name="index"),
|
||||
path("members/<str:role>/", MemberListView.as_view(), name="members"),
|
||||
path("member/<int:pk>/", MemberDetailView.as_view(), name="member"),
|
||||
path("section/<slug:slug>/", JobListView.as_view(), name="jobs"),
|
||||
]
|
||||
|
||||
@@ -1,14 +1,4 @@
|
||||
from django.core.validators import RegexValidator, ValidationError
|
||||
from django.utils.deconstruct import deconstructible
|
||||
|
||||
|
||||
@deconstructible
|
||||
class PhoneNumberValidator(RegexValidator):
|
||||
regex = r"^\+?1?\d{9,15}$"
|
||||
message = (
|
||||
"Telefonnummer muss in diesem Format +999999999999 eingegeben werden. Bis zu 15 Zahlen "
|
||||
"sind erlaubt."
|
||||
)
|
||||
from django.core.validators import ValidationError
|
||||
|
||||
|
||||
def validate_domainonly_email(value):
|
||||
|
||||
@@ -1,74 +1,57 @@
|
||||
import logging
|
||||
|
||||
from django.db.models import F
|
||||
from django.http import Http404
|
||||
from django.shortcuts import render
|
||||
from django.views.generic import ListView
|
||||
from django.views.generic.detail import DetailView
|
||||
|
||||
from .models import JobGroup, JobMember, Member
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class ActiveMemberListView(ListView):
|
||||
allow_empty = False
|
||||
model = Member
|
||||
template_name = "members/members.html"
|
||||
|
||||
def get_queryset(self):
|
||||
return Member.all_members.filter(role=Member.MemberRole.ACTIVE)
|
||||
|
||||
|
||||
def index(request):
|
||||
members = Member.all_members.filter(role=Member.MemberRole.ACTIVE)
|
||||
class JobListView(ListView):
|
||||
allow_empty = False
|
||||
model = JobMember
|
||||
template_name = "members/jobs.html"
|
||||
|
||||
context = {
|
||||
"members": members,
|
||||
}
|
||||
|
||||
return render(request, "members/members.html", context)
|
||||
|
||||
|
||||
def jobs(request, slug=None):
|
||||
try:
|
||||
description = JobGroup.objects.filter(slug=slug).values().first()["description"]
|
||||
except Exception:
|
||||
logger.info("Wrong job '%s'", slug)
|
||||
raise Http404("wrong job")
|
||||
|
||||
job_members = JobMember.active_member.get_all(slug=slug).order_by(
|
||||
F("job__order").asc(nulls_last=True),
|
||||
"job__name",
|
||||
def get_queryset(self):
|
||||
return JobMember.active_member.get_all(slug=self.kwargs["slug"]).order_by(
|
||||
F("job__order").asc(nulls_last=True), "job__name"
|
||||
)
|
||||
active_job_group = JobGroup.objects.filter(slug=slug).first()
|
||||
|
||||
context = {
|
||||
"description": description,
|
||||
"job_members": job_members,
|
||||
"active_job_group": active_job_group,
|
||||
}
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
return render(request, "members/jobs.html", context)
|
||||
context["active_job_group"] = JobGroup.objects.filter(slug=self.kwargs["slug"]).first()
|
||||
|
||||
return context
|
||||
|
||||
|
||||
def members(request, role=None):
|
||||
for elem in Member.MemberRole:
|
||||
if role == elem.label.lower():
|
||||
members = Member.all_members.filter(role=elem.value)
|
||||
break
|
||||
else:
|
||||
members = Member.all_members.all()
|
||||
class MemberListView(ListView):
|
||||
allow_empty = False
|
||||
model = Member
|
||||
template_name = "members/members.html"
|
||||
|
||||
context = {
|
||||
"members": members,
|
||||
}
|
||||
def get_queryset(self):
|
||||
if self.kwargs["role"].capitalize() in [r.label for r in Member.MemberRole]:
|
||||
return Member.all_members.filter(role=self.kwargs["role"].capitalize()[:1])
|
||||
|
||||
return render(request, "members/members.html", context)
|
||||
return Member.all_members.all() if self.kwargs["role"] in "all" else None
|
||||
|
||||
|
||||
def profile(request, member_id=None):
|
||||
member = Member.all_members.filter(id=member_id).first()
|
||||
if not member:
|
||||
logger.info("Wrong member id '%s'", member_id)
|
||||
raise Http404("no member")
|
||||
class MemberDetailView(DetailView):
|
||||
model = Member
|
||||
template_name = "members/member.html"
|
||||
|
||||
active_jobs = JobMember.members.get_active_jobs(member_id)
|
||||
inactive_jobs = JobMember.members.get_inactive_jobs(member_id)
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
|
||||
context = {
|
||||
"member": member,
|
||||
"active_jobs": active_jobs,
|
||||
"inactive_jobs": inactive_jobs,
|
||||
}
|
||||
context["active_jobs"] = JobMember.members.get_active_jobs(self.object.id)
|
||||
context["inactive_jobs"] = JobMember.members.get_inactive_jobs(self.object.id)
|
||||
|
||||
return render(request, "members/member.html", context)
|
||||
return context
|
||||
|
||||
Reference in New Issue
Block a user