update member view, add description to jobgroup, add pinned feature

This commit is contained in:
2020-10-20 14:02:18 +00:00
parent 4f46a3d694
commit 49a36e4f20
8 changed files with 180 additions and 140 deletions

View File

@@ -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)

View File

@@ -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']

View File

@@ -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()

View File

@@ -5,8 +5,7 @@ from . import views
urlpatterns = [
path('', views.index, name='members'),
path('<str:filter>', views.members_view),
path('jobs/<str:slug>', views.jobs_view),
path('member/<str:member_name>', views.profile_view, name="member"),
path('member/<str:member_name>', views.profile_view, name='member'),
]

View File

@@ -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,
}

View File

@@ -53,7 +53,8 @@ footer {
<li class=""><a href="{%url 'tasks'%}">Tasks</a></li>
{% endif %}
<li class=""><a href="{% url 'posts.index' %}">Aktuelles</a></li>
<li class=""><a href="{%url 'members'%}">Fachschaft</a></li>
<!-- show active members first -->
<li class=""><a href="{% url 'members'%}A">Fachschaft</a></li>
<li class=""><a href="/fotos/">Fotos</a></li>
<li class=""><a href="/blackboard">Blackboard</a></li>
{% if request.user.is_authenticated %}

View File

@@ -1,47 +1,82 @@
{% extends 'layout.html' %}
{% block content %}
<div class="grid-container">
<h1>Mitglieder / Tätigkeiten</h1>
<!-- Nav tabs -->
<div class="tabs.simple">
<a href="/members">Mitglieder</a>
<a href="/members/A">Aktive Mitglieder</a>
<a href="/members/P">Inaktive Mitglieder</a>
<div class="grid-x grid-padding-x padding-top-1">
<div class="cell large-2 medium-4 small-6"><a class="button active" style="width: 100%" href="/members/A">Fachschaft</a></div>
{% for job in job_group %}
<a href="/members/jobs/{{job.slug}}">{{job.name}}</a>
{% for job in pinned_job_groups %}
<div class="cell large-2 medium-4 small-6"><a class="button" style="width: 100%" href="/members/jobs/{{job.slug}}">{{job.name}}</a></div>
{% endfor %}
</div>
<!-- Tab panes -->
<div class="tabs-content">
{% for mem in member %}
{% with member=mem %}
{% include 'members/partials/_member_details.html' %}
{% endwith %}
{% endfor %}
<ul class="accordion" data-accordion data-allow-all-closed="true">
<li class="accordion-item" data-accordion-item>
<!-- Accordion tab title -->
<a class="accordion-title">weitere Gruppen</a>
{% if members is not None %}
{% include 'members/members_list.html' %}
<!-- Accordion tab content: it would start in the open state due to using the `is-active` state class. -->
<div class="accordion-content" data-tab-content>
<div class="grid-x grid-padding-x">
{% for job in unpinned_job_groups %}
<div class="cell large-2 medium-4 small-6"><a class="button" style="width: 100%" href="/members/jobs/{{job.slug}}">{{job.name}}</a></div>
{% endfor %}
<div class="cell large-2 medium-4 small-6"><a class="button" style="width: 100%" href="/members">Alle Mitglieder</a></div>
<div class="cell large-2 medium-4 small-6"><a class="button" style="width: 100%" href="/members/P">Pension Mitglieder</a></div>
</div>
</div>
</li>
</ul>
<div class="grid-x auto">
{% if description is not None %}
{{ description|safe }}
{% endif %}
</div>
{% for job in job_list %}
<div class="tabs-content" id="{{job.3}}">
<!-- show details of a member -->
{% if member %}
<div class="padding-top-1 padding-left-1 padding-bottom-1 padding-right-1" style="background-color: white;">
{% include 'members/partials/_member_details.html' %}
</div>
{% endif %}
<h2>{{job.0}}<a class="headerlink" href="#{{job.3}}" title="Permalink to {{job.0}}"> #</a></h2>
{% with active_members=job.1 inactive_members=job.2 %}
{% include 'members/jobs_list.html' %}
{% endwith %}
<!-- show all, active or pension members -->
{% if members %}
<div class="padding-top-1 padding-left-1 padding-right-1" style="background-color: white;">
{% include 'members/members_list.html' %}
</div>
{% endif %}
<!-- show job lists in a job group -->
{% regroup job_members by job.name as all_jobmem_list %}
{% for jobmem in all_jobmem_list %}
<div class="padding-top-1 padding-left-1 padding-bottom-1 padding-right-1" style="background-color: white;">
<h2>{{jobmem.grouper}}<a class="headerlink" href="#{{jobmem.list.0.job.slug}}" title="Permalink to {{jobmem.grouper}}"> #</a></h2>
<b>Aktuelle Mitglieder:</b>
<div class="grid-x">
{% for jm in jobmem.list %}
{% with member=jm.member %}
<div class="medium-3 large-2 small-6 cell">
<h2>{{jm.member.surname}}</h2>
{% include 'members/partials/_member.html' %}
{{jm.get_job_role_display}} ({{jm.job_start|date}} - {{jm.job_end|date}})
</div>
{% endwith %}
{% endfor %}
</div>
{% endfor %}
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@@ -1,11 +1,10 @@
<div class="grid-container">
<div class="grid-x">
<div class="grid-x">
{% for member in members %}
<div class="medium-3 large-2 small-6 cell">
<h2>{{member.surname}}</h2>
{% include 'members/partials/_member.html' %}
<div class="cell large-2 medium-3 small-6">
<h2>{{member.surname}}</h2>
{% include 'members/partials/_member.html' %}
</div>
{% endfor %}
</div>
</div>