From 41deac2ee39997d919c93164121e4d95e011011d Mon Sep 17 00:00:00 2001 From: andis Date: Sat, 15 Aug 2020 14:56:31 +0000 Subject: [PATCH] started templates for members and jobs --- fet2020/members/models.py | 55 +++++++++++++++++-- fet2020/members/urls.py | 3 + fet2020/members/views.py | 14 +++++ fet2020/templates/home.html | 2 +- fet2020/templates/members/index.html | 8 +++ fet2020/templates/members/list.html | 22 ++++++++ .../templates/members/partials/_member.html | 7 +++ .../members/partials/_member_details.html | 17 ++++++ fet2020/templates/members/show_job.html | 23 ++++++++ .../posts/{ => partials}/_posts_hero.html | 0 10 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 fet2020/templates/members/list.html create mode 100644 fet2020/templates/members/partials/_member.html create mode 100644 fet2020/templates/members/partials/_member_details.html create mode 100644 fet2020/templates/members/show_job.html rename fet2020/templates/posts/{ => partials}/_posts_hero.html (100%) diff --git a/fet2020/members/models.py b/fet2020/members/models.py index 9365d068..916ed705 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -56,6 +56,8 @@ class Member(models.Model): ('P', _('Pension')), ] role = models.CharField(max_length=1, choices=__choices, default='A') + + role_choices=[c[0] for c in __choices] # Letter from choices description = models.TextField(null=True, blank=True) image = models.ImageField(null=True, blank=True) @@ -85,7 +87,11 @@ class Member(models.Model): all_members = models.Manager() active_member = MemberManager() pension_member = PensionManager() - + + @property + def all_jobs(self): + return [j.job for j in self.jobs.all()] + class Meta: verbose_name = "Mitglied" verbose_name_plural = "Mitglieder" @@ -125,13 +131,33 @@ class Job(models.Model): description = models.TextField(null=True, blank=True) image = models.ImageField(null=True, blank=True) - + #objects = models.Manager() job_group = models.ForeignKey( JobGroup, on_delete=models.CASCADE, verbose_name="Job Gruppe", ) + @property + def active_members(self): + "Active Members for this job" + def sorted_jobmembers(): + return sorted(list(self.jobmembers.all()), # filter active fehlt noch + key=lambda x: (JobMember._role_sort[x.job_role], JobMember.job_start)) + m =[jm.member_with_role for jm in sorted_jobmembers()] + + return m + + @property + def active_members_count(self): + "Count Active Members" + return self.jobmembers.count() + + @property + def inactive_members(self): + "return the inactive members" + return [jm.member for jm in self.jobmembers.all()] # filter inactive fehlt noch + class Meta: verbose_name = "Tätigkeit" verbose_name_plural = "Tätigkeiten" @@ -151,17 +177,29 @@ class JobMember(models.Model): Member, on_delete=models.CASCADE, verbose_name="Mitglied", + related_name="jobs" ) job = models.ForeignKey( Job, on_delete=models.CASCADE, verbose_name="Tätigkeit", + related_name="jobmembers" ) job_start = models.DateField('Job Start') job_end = models.DateField('Job Ende', null=True, blank=True) - __choices = [ + @property + def member_with_role(self): + "return the member with added role and job start and job end" + m=self.member + m.job_start=self.job_start + m.job_end=self.job_end + m.job_role=self.job_role + m.job_role_text=dict(JobMember._choices)[self.job_role] + return m + + _choices = [ ('1V', _('VorsitzendeR')), ('2V', _('stv VorsitzendeR')), ('3V', _('2. stv VorsitzendeR')), @@ -169,7 +207,16 @@ class JobMember(models.Model): ('E', _('Ersatzmitglied')), ('V', _('VerantwortlicheR')) ] - job_role = models.CharField(max_length=2, choices=__choices, default='M') + _role_sort = { + '1V': 1, + '2V': 2, + '3V': 3, + '4V': 4, + 'M':5, + 'E':6, + 'V':7 + } + job_role = models.CharField(max_length=2, choices=_choices, default='M') jobmember = models.Manager() active_member = ActiveMemberManager() diff --git a/fet2020/members/urls.py b/fet2020/members/urls.py index cb09cf40..23305340 100644 --- a/fet2020/members/urls.py +++ b/fet2020/members/urls.py @@ -5,4 +5,7 @@ from . import views urlpatterns = [ path('', views.index, name='members.index'), + path('list', views.list, name='members.list'), + path('list/', views.list, name='members.list'), + path('', views.show_job, name='members.show_job') ] diff --git a/fet2020/members/views.py b/fet2020/members/views.py index f4fcc17c..5a892b76 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -26,6 +26,20 @@ def index(request): return render(request, 'members/index.html', context) +def show_job(request, slug=None): + job=Job.objects.get(slug=slug) + return render(request, 'members/show_job.html', {"job": job}) + +def list(request, filter=None): + """ + View for a list of members filtered or not + """ + if filter is None: + members = deque(Member.all_members.all()) + if filter in Member.role_choices: + members=deque(Member.all_members.filter(role=filter).all()) + + return render(request, 'members/list.html',{"members": members}) class MemberViewSet(viewsets.ModelViewSet): """ diff --git a/fet2020/templates/home.html b/fet2020/templates/home.html index eb2baee7..7343862e 100644 --- a/fet2020/templates/home.html +++ b/fet2020/templates/home.html @@ -76,7 +76,7 @@
{% for post in posts %} - {% include 'posts/_posts_hero.html' %} + {% include 'posts/partials/_posts_hero.html' %} {% endfor %}
diff --git a/fet2020/templates/members/index.html b/fet2020/templates/members/index.html index 0f334e5b..33c5a347 100644 --- a/fet2020/templates/members/index.html +++ b/fet2020/templates/members/index.html @@ -2,6 +2,14 @@ {% block content %}
+ +{% for job in jobs %} + +{{job.name}} + +{% endfor %} + +

Members

diff --git a/fet2020/templates/members/list.html b/fet2020/templates/members/list.html new file mode 100644 index 00000000..6633bbfe --- /dev/null +++ b/fet2020/templates/members/list.html @@ -0,0 +1,22 @@ +{% extends 'layout.html' %} + +{% block content %} +

GRID

+
+
+ +{% for member in members %} +
+ {% include 'members/partials/_member.html' %} +
+{% endfor %} +
+
+ +
+{% for member in members %} + {% include 'members/partials/_member_details.html' %} +{% endfor %} +
+ +{% endblock %} diff --git a/fet2020/templates/members/partials/_member.html b/fet2020/templates/members/partials/_member.html new file mode 100644 index 00000000..30c49885 --- /dev/null +++ b/fet2020/templates/members/partials/_member.html @@ -0,0 +1,7 @@ +{# only thumb and name of member #} +{% if member.image %} +
+{% endif %} +Name: {{member.firstname}} {{member.surname}}
+Spitzname: {{member.nickname}}
+ \ No newline at end of file diff --git a/fet2020/templates/members/partials/_member_details.html b/fet2020/templates/members/partials/_member_details.html new file mode 100644 index 00000000..854fbc4f --- /dev/null +++ b/fet2020/templates/members/partials/_member_details.html @@ -0,0 +1,17 @@ +{# This template shows one member and all the details (that are ment for public) including a list of current jobs #} + +
+
+
+ +
+
+
+

{{member.firstname}} {{member.surname}}

+

Spitzname: {{member.nickname}}
+Name: {{member.firstname}} {{member.surname}}
+Mailaccount: {{member.mailaccount}}
+Beschreibung: {{member.description|safe}}
+

+
+
diff --git a/fet2020/templates/members/show_job.html b/fet2020/templates/members/show_job.html new file mode 100644 index 00000000..8b97c4e5 --- /dev/null +++ b/fet2020/templates/members/show_job.html @@ -0,0 +1,23 @@ +{% extends 'layout.html' %} + +{% block content %} +
+
+ +

{{job.name}}

+
+ +Aktuelle Mitglieder {{ job.active_members_count}}: +
+{% for member in job.active_members %} +
+ +

{{ member.job_role_text }}({{member.job_start }} - {{member.job_end}})

+ {% include 'members/partials/_member_details.html' %} +
+{% endfor %} + +
+ +Vergangene Mitglieder: +{% endblock %} diff --git a/fet2020/templates/posts/_posts_hero.html b/fet2020/templates/posts/partials/_posts_hero.html similarity index 100% rename from fet2020/templates/posts/_posts_hero.html rename to fet2020/templates/posts/partials/_posts_hero.html