add JobGroup

- you can sort the jobs into groups.
- template/view: just experimental. It gives an overview of the job groups.
This commit is contained in:
2020-07-15 16:20:41 +00:00
parent 5232ac5a8a
commit 0474e0a5b7
5 changed files with 130 additions and 22 deletions

View File

@@ -1,8 +1,8 @@
from django.contrib import admin from django.contrib import admin
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from .models import Member, Job, JobMember from .models import Member, Job, JobMember, JobGroup
from .forms import MyMemberForm, MyJobForm from .forms import MyMemberForm, MyJobForm, MyJobGroupForm
class MemberRoleFilter(admin.SimpleListFilter): class MemberRoleFilter(admin.SimpleListFilter):
@@ -25,7 +25,7 @@ class JobMemberInline(admin.TabularInline):
model = JobMember model = JobMember
extra = 0 extra = 0
class JobInline(JobMemberInline): class JobOverviewInline(JobMemberInline):
verbose_name = "Tätigkeit" verbose_name = "Tätigkeit"
verbose_name_plural = "Tätigkeitsübersicht" verbose_name_plural = "Tätigkeitsübersicht"
@@ -43,11 +43,15 @@ class InactiveMemberInline(JobMemberInline):
def get_queryset(self, request): def get_queryset(self, request):
return JobMember.inactive_member.all() return JobMember.inactive_member.all()
class JobInline(admin.TabularInline):
model = Job
extra = 0
class MyMemberAdmin(admin.ModelAdmin): class MyMemberAdmin(admin.ModelAdmin):
form = MyMemberForm form = MyMemberForm
model = Member model = Member
list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role'] list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role']
inlines = (JobInline,) inlines = (JobOverviewInline,)
search_fields = ['firstname', 'surname','nickname','mailaccount'] search_fields = ['firstname', 'surname','nickname','mailaccount']
list_filter = [MemberRoleFilter] list_filter = [MemberRoleFilter]
@@ -71,3 +75,17 @@ class MyJobAdmin(admin.ModelAdmin):
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)
admin.site.register(Job, MyJobAdmin) admin.site.register(Job, MyJobAdmin)
class MyJobGroupAdmin(admin.ModelAdmin):
form = MyJobGroupForm
model = JobGroup
list_display = ['name']
inlines = (JobInline, )
search_fields = ['name']
def save_model(self, request, obj, form, change):
obj.author = request.user
super().save_model(request, obj, form, change)
admin.site.register(JobGroup, MyJobGroupAdmin)

View File

@@ -1,7 +1,7 @@
from django import forms from django import forms
from ckeditor_uploader.widgets import CKEditorUploadingWidget from ckeditor_uploader.widgets import CKEditorUploadingWidget
from .models import Member, Job from .models import Member, Job, JobGroup
class MyMemberForm(forms.ModelForm): class MyMemberForm(forms.ModelForm):
@@ -25,6 +25,11 @@ class MyMemberForm(forms.ModelForm):
class MyJobForm(forms.ModelForm): class MyJobForm(forms.ModelForm):
class Meta: class Meta:
model = Job model = Job
fields = ['name', 'shortterm', 'slug', 'description', 'image'] fields = ['name', 'shortterm', 'slug', 'job_group', 'description', 'image']
widgets = {'description': CKEditorUploadingWidget(config_name='default')} widgets = {'description': CKEditorUploadingWidget(config_name='default')}
class MyJobGroupForm(forms.ModelForm):
class Meta:
model = JobGroup
fields = ['name', 'shortterm', 'is_pinned']

View File

@@ -78,12 +78,6 @@ class Member(models.Model):
date_modified = models.DateTimeField(auto_now=True) date_modified = models.DateTimeField(auto_now=True)
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)
has_jobs = models.ManyToManyField(
'Job',
through='JobMember',
through_fields=('member', 'job'),
)
# Managers # Managers
all_members = models.Manager() all_members = models.Manager()
active_member = MemberManager() active_member = MemberManager()
@@ -109,6 +103,14 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer):
'image' 'image'
] ]
class JobGroup(models.Model):
name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128)
is_pinned = models.BooleanField(default=False)
def __str__(self):
return self.name
class Job(models.Model): class Job(models.Model):
name = models.CharField(max_length=128) name = models.CharField(max_length=128)
shortterm = models.CharField(max_length=128) shortterm = models.CharField(max_length=128)
@@ -118,10 +120,10 @@ class Job(models.Model):
description = models.TextField(null=True, blank=True) description = models.TextField(null=True, blank=True)
image = models.ImageField(null=True, blank=True) image = models.ImageField(null=True, blank=True)
has_members = models.ManyToManyField( job_group = models.ForeignKey(
'Member', JobGroup,
through='JobMember', on_delete=models.CASCADE,
through_fields=('job', 'member'), verbose_name="Job Gruppe",
) )
class Meta: class Meta:
@@ -141,12 +143,12 @@ class JobMember(models.Model):
member = models.ForeignKey( member = models.ForeignKey(
Member, Member,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name = "Mitglied", verbose_name="Mitglied",
) )
job = models.ForeignKey( job = models.ForeignKey(
Job, Job,
on_delete=models.CASCADE, on_delete=models.CASCADE,
verbose_name = "Tätigkeit", verbose_name="Tätigkeit",
) )
job_start = models.DateField('Job Start') job_start = models.DateField('Job Start')

View File

@@ -3,7 +3,7 @@ from django.http import HttpResponse
from collections import deque from collections import deque
from .models import Member, JobMember, MemberSerializer from .models import Member, Job, JobMember, JobGroup, MemberSerializer
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework import permissions from rest_framework import permissions
@@ -12,12 +12,16 @@ from django_filters.rest_framework import DjangoFilterBackend
def index(request): def index(request):
#members = deque(Member.all_members.all()) #members = deque(Member.all_members.all())
members = deque(Member.all_members.prefetch_related('has_jobs')) members = deque(Member.all_members.all())
jobmembers = deque(JobMember.jobmember.all()) jobmembers = deque(JobMember.jobmember.all())
jobs = deque(Job.objects.all())
jobgroups = deque(JobGroup.objects.all())
context = { context = {
"members": members, "members": members,
"jobmembers" : jobmembers, "jobmembers" : jobmembers,
"jobgroups" : jobgroups,
"jobs" : jobs,
} }
return render(request, 'members/index.html', context) return render(request, 'members/index.html', context)

View File

@@ -0,0 +1,79 @@
{% extends 'layout.html' %}
{% block content %}
<div class="grid-container">
<div class="grid-x">
<div class="medium-8 cell">
<h1>Members</h1>
{% for m in members %}
<div class="member-hero-text">
{% if m.image %}
<img src={{m.image.url}} style="width:150px;"/> </br>
{% else %}
{% endif %}
Name: {{m.firstname|safe}} {{m.surname}} </br>
Spitzname: {{m.nickname|safe}} </br>
Mailaccount: {{m.mailaccount|safe}} </br>
Beschreibung: {{m.description|safe}} </br>
Geburtstag: {{m.birthday}} </br>
Telefonnummer: {{m.phone}} </br>
Adresse: {{m.address}} </br>
</div>
</br>
<h2>Jobs</h2>
{% for jobm in jobmembers %}
{% if m == jobm.member %}
Job: {{ jobm.job.shortterm }} </br>
Job Start: {{ jobm.job_start }} </br>
Job Ende: {{ jobm.job_end }} </br>
{% else %}
{% endif %}
{% endfor %}
<hr/>
{% endfor %}
<h1>Job Groups</h1>
<h2>pinned JG</h2>
{% for jg in jobgroups %}
{% if jg.is_pinned %}
JobGroup: {{ jg.name }} </br>
{% for job in jobs %}
{% if job.job_group.name == jg.name %}
Job: {{ job.name }} </br>
{% for jobm in jobmembers %}
{% if job.name == jobm.job.name %}
Member Name: {{ jobm.member.nickname }} </br>
{% else %}
{% endif %}
{% endfor %}
{% else %}
{% endif %}
{% endfor %}
{% else %}
{% endif %}
{% endfor %}
<hr/>
<h2>unpinned JG</h2>
{% for jg in jobgroups %}
{% if jg.is_pinned %}
{% else %}
JobGroup: {{ jg.name }} </br>
{% for job in jobs %}
{% if job.job_group.name == jg.name %}
Job: {{ job.name }} </br>
{% for jobm in jobmembers %}
{% if job.name == jobm.job.name %}
Member Name: {{ jobm.member.nickname }} </br>
{% else %}
{% endif %}
{% endfor %}
{% else %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% endblock %}