diff --git a/fet2020/members/admin.py b/fet2020/members/admin.py index 1f6d2424..c417cf50 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 -from .forms import MyMemberForm, MyJobForm +from .models import Member, Job, JobMember, JobGroup +from .forms import MyMemberForm, MyJobForm, MyJobGroupForm class MemberRoleFilter(admin.SimpleListFilter): @@ -25,7 +25,7 @@ class JobMemberInline(admin.TabularInline): model = JobMember extra = 0 -class JobInline(JobMemberInline): +class JobOverviewInline(JobMemberInline): verbose_name = "Tätigkeit" verbose_name_plural = "Tätigkeitsübersicht" @@ -43,11 +43,15 @@ class InactiveMemberInline(JobMemberInline): def get_queryset(self, request): return JobMember.inactive_member.all() +class JobInline(admin.TabularInline): + model = Job + extra = 0 + class MyMemberAdmin(admin.ModelAdmin): form = MyMemberForm model = Member list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role'] - inlines = (JobInline,) + inlines = (JobOverviewInline,) search_fields = ['firstname', 'surname','nickname','mailaccount'] list_filter = [MemberRoleFilter] @@ -70,4 +74,18 @@ class MyJobAdmin(admin.ModelAdmin): obj.author = request.user super().save_model(request, obj, form, change) -admin.site.register(Job, MyJobAdmin) \ No newline at end of file +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) \ No newline at end of file diff --git a/fet2020/members/forms.py b/fet2020/members/forms.py index 55dea6e9..c097cc63 100644 --- a/fet2020/members/forms.py +++ b/fet2020/members/forms.py @@ -1,7 +1,7 @@ from django import forms from ckeditor_uploader.widgets import CKEditorUploadingWidget -from .models import Member, Job +from .models import Member, Job, JobGroup class MyMemberForm(forms.ModelForm): @@ -25,6 +25,11 @@ class MyMemberForm(forms.ModelForm): class MyJobForm(forms.ModelForm): class Meta: model = Job - fields = ['name', 'shortterm', 'slug', 'description', 'image'] + fields = ['name', 'shortterm', 'slug', 'job_group', 'description', 'image'] - widgets = {'description': CKEditorUploadingWidget(config_name='default')} \ No newline at end of file + widgets = {'description': CKEditorUploadingWidget(config_name='default')} + +class MyJobGroupForm(forms.ModelForm): + class Meta: + model = JobGroup + fields = ['name', 'shortterm', 'is_pinned'] \ No newline at end of file diff --git a/fet2020/members/models.py b/fet2020/members/models.py index 8be02bdf..ee1546db 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -78,12 +78,6 @@ class Member(models.Model): date_modified = models.DateTimeField(auto_now=True) date_created = models.DateTimeField(auto_now_add=True) - has_jobs = models.ManyToManyField( - 'Job', - through='JobMember', - through_fields=('member', 'job'), - ) - # Managers all_members = models.Manager() active_member = MemberManager() @@ -109,6 +103,14 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer): '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): name = 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) image = models.ImageField(null=True, blank=True) - has_members = models.ManyToManyField( - 'Member', - through='JobMember', - through_fields=('job', 'member'), + job_group = models.ForeignKey( + JobGroup, + on_delete=models.CASCADE, + verbose_name="Job Gruppe", ) class Meta: @@ -141,12 +143,12 @@ class JobMember(models.Model): member = models.ForeignKey( Member, on_delete=models.CASCADE, - verbose_name = "Mitglied", + verbose_name="Mitglied", ) job = models.ForeignKey( Job, on_delete=models.CASCADE, - verbose_name = "Tätigkeit", + verbose_name="Tätigkeit", ) job_start = models.DateField('Job Start') diff --git a/fet2020/members/views.py b/fet2020/members/views.py index 5bdb00b3..73fb47a6 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -3,7 +3,7 @@ from django.http import HttpResponse 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 permissions @@ -12,12 +12,16 @@ from django_filters.rest_framework import DjangoFilterBackend def index(request): #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()) + jobs = deque(Job.objects.all()) + jobgroups = deque(JobGroup.objects.all()) context = { "members": members, "jobmembers" : jobmembers, + "jobgroups" : jobgroups, + "jobs" : jobs, } return render(request, 'members/index.html', context) diff --git a/fet2020/templates/members/index.html b/fet2020/templates/members/index.html new file mode 100644 index 00000000..0f334e5b --- /dev/null +++ b/fet2020/templates/members/index.html @@ -0,0 +1,79 @@ +{% extends 'layout.html' %} + +{% block content %} +
+
+
+

Members

+ {% for m in members %} +
+ {% if m.image %} +
+ {% else %} + {% endif %} + Name: {{m.firstname|safe}} {{m.surname}}
+ Spitzname: {{m.nickname|safe}}
+ Mailaccount: {{m.mailaccount|safe}}
+ Beschreibung: {{m.description|safe}}
+ Geburtstag: {{m.birthday}}
+ Telefonnummer: {{m.phone}}
+ Adresse: {{m.address}}
+
+
+

Jobs

+ {% for jobm in jobmembers %} + {% if m == jobm.member %} + Job: {{ jobm.job.shortterm }}
+ Job Start: {{ jobm.job_start }}
+ Job Ende: {{ jobm.job_end }}
+ {% else %} + {% endif %} + {% endfor %} +
+ {% endfor %} + +

Job Groups

+

pinned JG

+ {% for jg in jobgroups %} + {% if jg.is_pinned %} + JobGroup: {{ jg.name }}
+ {% for job in jobs %} + {% if job.job_group.name == jg.name %} + Job: {{ job.name }}
+ {% for jobm in jobmembers %} + {% if job.name == jobm.job.name %} + Member Name: {{ jobm.member.nickname }}
+ {% else %} + {% endif %} + {% endfor %} + {% else %} + {% endif %} + {% endfor %} + {% else %} + {% endif %} + {% endfor %} +
+

unpinned JG

+ {% for jg in jobgroups %} + {% if jg.is_pinned %} + {% else %} + JobGroup: {{ jg.name }}
+ {% for job in jobs %} + {% if job.job_group.name == jg.name %} + Job: {{ job.name }}
+ {% for jobm in jobmembers %} + {% if job.name == jobm.job.name %} + Member Name: {{ jobm.member.nickname }}
+ {% else %} + {% endif %} + {% endfor %} + {% else %} + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} + +
+
+
+{% endblock %}