diff --git a/fet2020/members/admin.py b/fet2020/members/admin.py index 5e3b3763..0cfe1e04 100644 --- a/fet2020/members/admin.py +++ b/fet2020/members/admin.py @@ -1,8 +1,8 @@ from django.contrib import admin from django.utils.translation import gettext as _ -from .models import Member, Job, JobMember, JobGroup -from .forms import MyMemberForm, MyJobForm, MyJobGroupForm +from .models import Member, Job, JobGroup, JobMember +from .forms import MemberForm, JobForm, JobGroupForm class MemberRoleFilter(admin.SimpleListFilter): @@ -35,7 +35,7 @@ class ActiveMemberInline(JobMemberInline): verbose_name_plural = "Aktive Mitglieder Liste" def get_queryset(self, request): - return JobMember.active_member.get_all() + return JobMember.active_member.get_queryset() class InactiveMemberInline(JobMemberInline): @@ -43,7 +43,7 @@ class InactiveMemberInline(JobMemberInline): verbose_name_plural = "Inaktive Mitglieder Liste" def get_queryset(self, request): - return JobMember.inactive_member.get_all() + return JobMember.inactive_member.get_queryset() class JobInline(admin.TabularInline): @@ -51,8 +51,8 @@ class JobInline(admin.TabularInline): extra = 0 -class MyMemberAdmin(admin.ModelAdmin): - form = MyMemberForm +class MemberAdmin(admin.ModelAdmin): + form = MemberForm model = Member fieldsets = ( (None, { @@ -94,11 +94,8 @@ class MyMemberAdmin(admin.ModelAdmin): super().save_model(request, obj, form, change) -admin.site.register(Member, MyMemberAdmin) - - -class MyJobAdmin(admin.ModelAdmin): - form = MyJobForm +class JobAdmin(admin.ModelAdmin): + form = JobForm model = Job list_display = ['name'] inlines = (ActiveMemberInline, InactiveMemberInline) @@ -124,13 +121,10 @@ class MyJobAdmin(admin.ModelAdmin): super().save_model(request, obj, form, change) -admin.site.register(Job, MyJobAdmin) - - -class MyJobGroupAdmin(admin.ModelAdmin): - form = MyJobGroupForm +class JobGroupAdmin(admin.ModelAdmin): + form = JobGroupForm model = JobGroup - list_display = ['name'] + list_display = ['name', 'is_pinned', ] inlines = (JobInline, ) search_fields = ['name'] @@ -154,4 +148,6 @@ class MyJobGroupAdmin(admin.ModelAdmin): super().save_model(request, obj, form, change) -admin.site.register(JobGroup, MyJobGroupAdmin) +admin.site.register(Member, MemberAdmin) +admin.site.register(Job, JobAdmin) +admin.site.register(JobGroup, JobGroupAdmin) diff --git a/fet2020/members/forms.py b/fet2020/members/forms.py index 5f90b632..d43edb8d 100644 --- a/fet2020/members/forms.py +++ b/fet2020/members/forms.py @@ -4,7 +4,7 @@ from ckeditor_uploader.widgets import CKEditorUploadingWidget from .models import Member, Job, JobGroup -class MyMemberForm(forms.ModelForm): +class MemberForm(forms.ModelForm): class Meta: model = Member fields = [ @@ -25,7 +25,7 @@ class MyMemberForm(forms.ModelForm): } -class MyJobForm(forms.ModelForm): +class JobForm(forms.ModelForm): class Meta: model = Job fields = [ @@ -33,16 +33,20 @@ class MyJobForm(forms.ModelForm): 'shortterm', 'slug', 'job_group', + ] + + +class JobGroupForm(forms.ModelForm): + class Meta: + model = JobGroup + fields = [ + 'name', + 'shortterm', + 'slug', 'description', - 'image' + 'is_pinned', ] widgets = { 'description': CKEditorUploadingWidget(config_name='default') } - - -class MyJobGroupForm(forms.ModelForm): - class Meta: - model = JobGroup - fields = ['name', 'shortterm', 'slug', 'is_pinned'] diff --git a/fet2020/members/models.py b/fet2020/members/models.py index 00e63f04..6fbbece3 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -10,75 +10,71 @@ from easy_thumbnails.fields import ThumbnailerImageField from rest_framework import serializers -class MemberQuerySet(models.QuerySet): - def get_active(self): - date_today = timezone.now().date() - - return self.filter( - Q(member__role=Member.MemberRole.ACTIVE) - & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)) - ) - - def get_inactive(self): - date_today = timezone.now().date() - - return self.filter( - Q(member__role=Member.MemberRole.PENSION) - | (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)) - ) - - class ActiveMemberManager(models.Manager): ''' return a list of active member, and members who are still working ''' - def get_members_of_job(self, job_names): - tmp_list = [] - for job_name in job_names: - tmp_list.append(self.get_queryset().get_active().filter(Q(job__name=job_name))) - return tmp_list - - def get_all(self): - return self.get_queryset().get_active() + def get_all_by_slug(self, slug): + return self.get_queryset().filter(job__job_group__slug=slug) def get_queryset(self): - return MemberQuerySet(self.model, using=self._db) + date_today = timezone.now().date() + + return super().get_queryset().filter( + Q(member__role=Member.MemberRole.ACTIVE) + & (Q(job_end__gt=date_today) | Q(job_end__isnull=True)) + ) class InactiveMemberManager(models.Manager): ''' return a list of inactive member ''' - def get_members_of_job(self, job_names): - tmp_list = [] - for job_name in job_names: - tmp_list.append(self.get_queryset().get_inactive().filter(Q(job__name=job_name))) - return tmp_list - - def get_all(self): - return self.get_queryset().get_inactive() + def get_all_by_slug(self, slug): + return self.get_queryset().filter(job__job_group__slug=slug) def get_queryset(self): - return MemberQuerySet(self.model, using=self._db) + date_today = timezone.now().date() + + return super().get_queryset().filter( + Q(member__role=Member.MemberRole.PENSION) + | (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False)) + ) class MemberManager(models.Manager): def get_members(self, role): return self.get_queryset().filter(Q(member__role=role)) - def get_all(self): - return self.get_queryset() +class JobGroupManager(models.Manager): + def get_active_jobgroup(self): + job_groups = list(self.get_queryset()) -class JobManager(models.Manager): - def get_job_names(self, slug): - job_list = [] - slug_list = [] - for i in self.get_queryset().filter(Q(job__job_group__slug=slug)): - if i.job.name not in job_list: - job_list.append(i.job.name) - slug_list.append(i.job.slug) - return job_list, slug_list + # delete job groups which don't have active members + for elem in job_groups: + if not JobMember.active_member.get_all_by_slug(slug=elem.slug): + job_groups.remove(elem) + + return job_groups + + def get_pinned_active_jobgroups(self): + job_groups = [] + + for elem in self.get_active_jobgroup(): + if elem.is_pinned: + job_groups.append(elem) + + return job_groups + + def get_unpinned_active_jobgroups(self): + job_groups = [] + + for elem in self.get_active_jobgroup(): + if not elem.is_pinned: + job_groups.append(elem) + + return job_groups class Member(models.Model): @@ -145,12 +141,17 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer): class JobGroup(models.Model): name = models.CharField(max_length=128) - shortterm = models.CharField(max_length=128) + shortterm = models.CharField(max_length=128) slug = models.SlugField(unique=True, null=True, blank=True) + description = models.TextField(null=True, blank=True) + is_pinned = models.BooleanField(default=False) + # Managers + all_jobgroups = JobGroupManager() + class Meta: verbose_name = "Tätigkeit-Gruppierung" verbose_name_plural = "Tätigkeit-Gruppierungen" @@ -167,13 +168,10 @@ class JobGroup(models.Model): class Job(models.Model): name = models.CharField(max_length=128) + shortterm = models.CharField(max_length=128) - slug = models.SlugField(unique=True, null=True, blank=True) - description = models.TextField(null=True, blank=True) - image = models.ImageField(null=True, blank=True) - job_group = models.ForeignKey( JobGroup, on_delete=models.CASCADE, @@ -222,5 +220,3 @@ class JobMember(models.Model): members = MemberManager() active_member = ActiveMemberManager() inactive_member = InactiveMemberManager() - - jobs = JobManager() diff --git a/fet2020/members/urls.py b/fet2020/members/urls.py index 05a767ce..ab861c0d 100644 --- a/fet2020/members/urls.py +++ b/fet2020/members/urls.py @@ -5,8 +5,7 @@ from . import views urlpatterns = [ path('', views.index, name='members'), - path('', views.members_view), path('jobs/', views.jobs_view), - path('member/', views.profile_view, name="member"), + path('member/', views.profile_view, name='member'), ] diff --git a/fet2020/members/views.py b/fet2020/members/views.py index 00164d21..d972de99 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -10,12 +10,27 @@ from rest_framework import permissions # from django_filters.rest_framework import DjangoFilterBackend +def __get_job_groups(): + pinned_job_groups = JobGroup.all_jobgroups.get_pinned_active_jobgroups() + unpinned_job_groups = JobGroup.all_jobgroups.get_unpinned_active_jobgroups() + + # show max 5 pinned jobgroups + if len(pinned_job_groups) > 5: + for idx, val in enumerate(pinned_job_groups[5:]): + unpinned_job_groups.append(val) + + pinned_job_groups = pinned_job_groups[:5] + + return pinned_job_groups, unpinned_job_groups + + def index(request): - job_group = deque(JobGroup.objects.all()) + pinned_job_groups, unpinned_job_groups = __get_job_groups() members = deque(Member.all_members.all()) context = { - "job_group": job_group, + "pinned_job_groups": pinned_job_groups, + "unpinned_job_groups": unpinned_job_groups, "members": members, } @@ -23,31 +38,23 @@ def index(request): def jobs_view(request, slug=None): - job_group = deque(JobGroup.objects.all()) - job_list = [] + pinned_job_groups, unpinned_job_groups = __get_job_groups() - job_names, slug_list = JobMember.jobs.get_job_names(slug=slug) - - if not job_names: - raise Http404("no jobs") - - active_members = JobMember.active_member.get_members_of_job(job_names=job_names) - inactive_members = JobMember.inactive_member.get_members_of_job(job_names=job_names) - - for idx, item in enumerate(job_names): - job_list.append( - (job_names[idx], active_members[idx], inactive_members[idx], slug_list[idx]) - ) + description = JobGroup.all_jobgroups.filter(slug=slug).values().first()['description'] + job_members = JobMember.active_member.get_all_by_slug(slug=slug) context = { - "job_group": job_group, # Das sind die Tabs - "job_list": job_list, # Das ist die Liste, die dargestellt wird + "pinned_job_groups": pinned_job_groups, + "unpinned_job_groups": unpinned_job_groups, + "description": description, + "job_members": job_members, } + return render(request, 'members/index.html', context) def members_view(request, filter=None): - job_group = deque(JobGroup.objects.all()) + pinned_job_groups, unpinned_job_groups = __get_job_groups() if filter in Member.MemberRole: members = deque(Member.all_members.filter(role=filter)) @@ -55,7 +62,8 @@ def members_view(request, filter=None): raise Http404("no member role") context = { - "job_group": job_group, + "pinned_job_groups": pinned_job_groups, + "unpinned_job_groups": unpinned_job_groups, "members": members, } @@ -63,15 +71,17 @@ def members_view(request, filter=None): def profile_view(request, member_name=None): - job_group = deque(JobGroup.objects.all()) - member = deque(Member.all_members.filter(nickname=member_name)) + pinned_job_groups, unpinned_job_groups = __get_job_groups() + + member = Member.all_members.filter(nickname=member_name).first() if not member: raise Http404("no member") jobs = deque(JobMember.members.filter(member__nickname=member_name)) context = { - "job_group": job_group, + "pinned_job_groups": pinned_job_groups, + "unpinned_job_groups": unpinned_job_groups, "member": member, "jobs": jobs, } diff --git a/fet2020/templates/layout.html b/fet2020/templates/layout.html index 86e9d396..019f597a 100644 --- a/fet2020/templates/layout.html +++ b/fet2020/templates/layout.html @@ -53,7 +53,8 @@ footer {
  • Tasks
  • {% endif %}
  • Aktuelles
  • -
  • Fachschaft
  • + +
  • Fachschaft
  • Fotos
  • Blackboard
  • {% if request.user.is_authenticated %} diff --git a/fet2020/templates/members/index.html b/fet2020/templates/members/index.html index 66162dea..06eeeb29 100644 --- a/fet2020/templates/members/index.html +++ b/fet2020/templates/members/index.html @@ -1,47 +1,82 @@ {% extends 'layout.html' %} - {% block content %}
    -

    Mitglieder / Tätigkeiten

    - -
    - Mitglieder - Aktive Mitglieder - Inaktive Mitglieder +
    + - {% for job in job_group %} - {{job.name}} + {% for job in pinned_job_groups %} + {% endfor %}
    - -
    - {% for mem in member %} - {% with member=mem %} - {% include 'members/partials/_member_details.html' %} - {% endwith %} - {% endfor %} + + +
    + {% if description is not None %} + {{ description|safe }} {% endif %} +
    - {% for job in job_list %} -
    + + {% if member %} +
    + {% include 'members/partials/_member_details.html' %} +
    + {% endif %} -

    {{job.0}} #

    - - {% with active_members=job.1 inactive_members=job.2 %} - {% include 'members/jobs_list.html' %} - {% endwith %} + + {% if members %} +
    + {% include 'members/members_list.html' %} +
    + {% endif %} + + + {% regroup job_members by job.name as all_jobmem_list %} + + {% for jobmem in all_jobmem_list %} + +
    + +

    {{jobmem.grouper}} #

    + Aktuelle Mitglieder: + +
    + + {% for jm in jobmem.list %} + {% with member=jm.member %} +
    +

    {{jm.member.surname}}

    + {% include 'members/partials/_member.html' %} + {{jm.get_job_role_display}} ({{jm.job_start|date}} - {{jm.job_end|date}}) +
    + {% endwith %} + {% endfor %}
    - {% endfor %} +
    + + {% endfor %} -
    {% endblock %} diff --git a/fet2020/templates/members/members_list.html b/fet2020/templates/members/members_list.html index 72dddb02..234e0b90 100644 --- a/fet2020/templates/members/members_list.html +++ b/fet2020/templates/members/members_list.html @@ -1,11 +1,10 @@ -
    -
    +
    {% for member in members %} -
    -

    {{member.surname}}

    - {% include 'members/partials/_member.html' %} +
    +

    {{member.surname}}

    + {% include 'members/partials/_member.html' %}
    {% endfor %} -
    +