diff --git a/fet2020/members/admin.py b/fet2020/members/admin.py index 51b86c9d..4ed1ce2b 100644 --- a/fet2020/members/admin.py +++ b/fet2020/members/admin.py @@ -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", ), }, ), diff --git a/fet2020/members/forms.py b/fet2020/members/forms.py index 74acecdd..2f40148e 100644 --- a/fet2020/members/forms.py +++ b/fet2020/members/forms.py @@ -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")} diff --git a/fet2020/members/managers.py b/fet2020/members/managers.py index a20479af..304dca65 100644 --- a/fet2020/members/managers.py +++ b/fet2020/members/managers.py @@ -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( - Q(member__role="P") - | (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)), + return ( + super() + .get_queryset() + .filter( + Q(member__role="P") + | (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): diff --git a/fet2020/members/migrations/0003_auto_20210506_1808.py b/fet2020/members/migrations/0003_auto_20210506_1808.py index f922a2bd..6c733450 100644 --- a/fet2020/members/migrations/0003_auto_20210506_1808.py +++ b/fet2020/members/migrations/0003_auto_20210506_1808.py @@ -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', diff --git a/fet2020/members/models.py b/fet2020/members/models.py index bbd4cf4c..47bf60eb 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -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() diff --git a/fet2020/members/urls.py b/fet2020/members/urls.py index a8c6c596..c5d1ce6a 100644 --- a/fet2020/members/urls.py +++ b/fet2020/members/urls.py @@ -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//", views.members, name="members"), - path("member//", views.profile, name="member"), - path("section//", views.jobs, name="jobs"), + path("members/", ActiveMemberListView.as_view(), name="index"), + path("members//", MemberListView.as_view(), name="members"), + path("member//", MemberDetailView.as_view(), name="member"), + path("section//", JobListView.as_view(), name="jobs"), ] diff --git a/fet2020/members/validators.py b/fet2020/members/validators.py index e58887e1..6c31f5d0 100644 --- a/fet2020/members/validators.py +++ b/fet2020/members/validators.py @@ -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): diff --git a/fet2020/members/views.py b/fet2020/members/views.py index 95dec284..6a97e13c 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -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, - } + 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" + ) - return render(request, "members/members.html", context) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context["active_job_group"] = JobGroup.objects.filter(slug=self.kwargs["slug"]).first() + + return 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") +class MemberListView(ListView): + allow_empty = False + model = Member + template_name = "members/members.html" - job_members = JobMember.active_member.get_all(slug=slug).order_by( - F("job__order").asc(nulls_last=True), - "job__name", - ) - active_job_group = JobGroup.objects.filter(slug=slug).first() + 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]) - context = { - "description": description, - "job_members": job_members, - "active_job_group": active_job_group, - } - - return render(request, "members/jobs.html", context) + return Member.all_members.all() if self.kwargs["role"] in "all" else None -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 MemberDetailView(DetailView): + model = Member + template_name = "members/member.html" - context = { - "members": members, - } + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) - return render(request, "members/members.html", context) + context["active_jobs"] = JobMember.members.get_active_jobs(self.object.id) + context["inactive_jobs"] = JobMember.members.get_inactive_jobs(self.object.id) - -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") - - active_jobs = JobMember.members.get_active_jobs(member_id) - inactive_jobs = JobMember.members.get_inactive_jobs(member_id) - - context = { - "member": member, - "active_jobs": active_jobs, - "inactive_jobs": inactive_jobs, - } - - return render(request, "members/member.html", context) + return context