diff --git a/fet2020/documents/__init__.py b/fet2020/documents/__init__.py index 8dc02b61..d2e259a5 100644 --- a/fet2020/documents/__init__.py +++ b/fet2020/documents/__init__.py @@ -5,11 +5,11 @@ from django.utils.text import slugify import urllib.parse t = datetime.now() + timedelta(days=1) + from .etherpadlib import get_ep_sessionid2, add_ep_cookie -SERVER_URL="https://etherpad2.2020.fet.at/" - +SERVER_URL = "https://etherpad2.2020.fet.at/" with open("/srv/andis_test/etherpad_test2/etherpad-lite/APIKEY.txt", "r") as f: k = f.read() diff --git a/fet2020/fet2020/middleware.py b/fet2020/fet2020/middleware.py index 00c34b27..4a638721 100644 --- a/fet2020/fet2020/middleware.py +++ b/fet2020/fet2020/middleware.py @@ -13,7 +13,9 @@ class FETHeaderMiddleware(RemoteUserMiddleware): self.header, request.headers.get(self.header, None) ) + # logger = logging.getLogger(__name__) super().process_request(request) + # logger.info('User: ' + str(request.user)) if request.user.is_authenticated: request.user.is_admin = True request.user.is_superuser = True diff --git a/fet2020/fet2020/settings.py b/fet2020/fet2020/settings.py index 4ef40e99..a742155f 100644 --- a/fet2020/fet2020/settings.py +++ b/fet2020/fet2020/settings.py @@ -116,6 +116,7 @@ DATABASES = { AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.RemoteUserBackend', + 'django.contrib.auth.backends.ModelBackend', ] # Password validation diff --git a/fet2020/fet2020/views.py b/fet2020/fet2020/views.py index 4e020e00..cae104b9 100644 --- a/fet2020/fet2020/views.py +++ b/fet2020/fet2020/views.py @@ -20,7 +20,7 @@ def index(request): context = { 'posts': posts, - 'events': Event.objects.order_by("-event_start").all(), + 'events': Event.objects.get_all_events(), 'featured_post': featured_post, 'featured_post2': FetMeeting.objects.first(), 'tags_list': ", ".join(t) diff --git a/fet2020/members/admin.py b/fet2020/members/admin.py index 5042ca5d..5e3b3763 100644 --- a/fet2020/members/admin.py +++ b/fet2020/members/admin.py @@ -54,12 +54,41 @@ class JobInline(admin.TabularInline): class MyMemberAdmin(admin.ModelAdmin): form = MyMemberForm model = Member + fieldsets = ( + (None, { + 'fields': ( + ('firstname', 'surname',), + 'nickname', + 'mailaccount', + 'role', + 'description', + 'image', + 'birthday', + 'phone', + 'address', + ) + }), + ) list_display = ['nickname', 'firstname', 'surname', 'mailaccount', 'role'] inlines = (JobOverviewInline,) search_fields = ['firstname', 'surname', 'nickname', 'mailaccount'] list_filter = [MemberRoleFilter] + def add_view(self, request, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichtfelder." + return super().add_view( + request, form_url, extra_context=extra_context, + ) + + def change_view(self, request, object_id, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichtfelder." + return super().change_view( + request, object_id, form_url, extra_context=extra_context, + ) + def save_model(self, request, obj, form, change): obj.author = request.user super().save_model(request, obj, form, change) @@ -76,6 +105,20 @@ class MyJobAdmin(admin.ModelAdmin): search_fields = ['name'] + def add_view(self, request, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichtfelder." + return super().add_view( + request, form_url, extra_context=extra_context, + ) + + def change_view(self, request, object_id, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichfelder." + return super().change_view( + request, object_id, form_url, extra_context=extra_context, + ) + def save_model(self, request, obj, form, change): obj.author = request.user super().save_model(request, obj, form, change) @@ -92,6 +135,20 @@ class MyJobGroupAdmin(admin.ModelAdmin): search_fields = ['name'] + def add_view(self, request, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichtfelder." + return super().add_view( + request, form_url, extra_context=extra_context, + ) + + def change_view(self, request, object_id, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichfelder." + return super().change_view( + request, object_id, form_url, extra_context=extra_context, + ) + def save_model(self, request, obj, form, change): obj.author = request.user super().save_model(request, obj, form, change) diff --git a/fet2020/members/models.py b/fet2020/members/models.py index 5ba8ea43..23bf4152 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -1,4 +1,4 @@ -from django.core.validators import RegexValidator +from django.core.validators import RegexValidator, ValidationError from django.db import models from django.db.models import Q from django.utils import timezone @@ -6,6 +6,7 @@ from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from datetime import timedelta +from easy_thumbnails.fields import ThumbnailerImageField from rest_framework import serializers @@ -91,7 +92,7 @@ class Member(models.Model): role = models.CharField(max_length=1, choices=MemberRole.choices, default=MemberRole.ACTIVE) description = models.TextField(null=True, blank=True) - image = models.ImageField(null=True, blank=True) + image = ThumbnailerImageField() birthday = models.DateField(null=True, blank=True) @@ -113,6 +114,15 @@ class Member(models.Model): verbose_name = "Mitglied" verbose_name_plural = "Mitglieder" + def clean(self): + if self.image.height < 150 or self.image.width < 150: + raise ValidationError( + _('Das Bild ist zu klein. (Höhe: {}, Breite: {})').format( + self.image.height, + self.image.width + ) + ) + def __str__(self): return self.firstname + " " + self.surname @@ -139,6 +149,10 @@ class JobGroup(models.Model): is_pinned = models.BooleanField(default=False) + class Meta: + verbose_name = "Tätigkeit-Gruppierung" + verbose_name_plural = "Tätigkeit-Gruppierungen" + def __str__(self): return self.name diff --git a/fet2020/members/urls.py b/fet2020/members/urls.py index 0c901106..39b4f029 100644 --- a/fet2020/members/urls.py +++ b/fet2020/members/urls.py @@ -5,7 +5,8 @@ from . import views urlpatterns = [ path('', views.index, name='members'), - path('', views.index), - path('jobs/', views.index), - path('m/',views.show, name="member") -] + + path('', views.members_view), + path('jobs/', views.jobs_view), + path('member/', views.profile_view, name="member"), +] \ No newline at end of file diff --git a/fet2020/members/views.py b/fet2020/members/views.py index e92b5ce6..bd4ebc71 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -10,39 +10,81 @@ from rest_framework import permissions # from django_filters.rest_framework import DjangoFilterBackend +<<<<<<< HEAD def show(request,nickname=None): return render(request, 'members/index.html', context) def index(request, slug=None, filter=None): job_group = deque(JobGroup.objects.all()) - job_list = [] members = None - if slug is not None: - job_names = JobMember.jobs.get_job_names(slug=slug) - 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])) + if filter is None: + members = deque(Member.all_members.all()) + elif filter in Member.MemberRole: + members = deque(Member.all_members.filter(role=filter)) else: - if filter is None: - members = deque(Member.all_members.all()) - elif filter in Member.MemberRole: - members = deque(Member.all_members.filter(role=filter)) - else: - members = None + members = None + + context = { + "job_group": job_group, + "members": members, + } + + return render(request, 'members/index.html', context) + + +def jobs_view(request, slug=None): + job_group = deque(JobGroup.objects.all()) + job_list = [] + + job_names = JobMember.jobs.get_job_names(slug=slug) + 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])) context = { "job_group": job_group, "job_list": job_list, + } + + return render(request, 'members/index.html', context) + + +def members_view(request, filter=None): + job_group = deque(JobGroup.objects.all()) + + if filter is None: + members = deque(Member.all_members.all()) + elif filter in Member.MemberRole: + members = deque(Member.all_members.filter(role=filter)) + else: + members = None + + context = { + "job_group": job_group, "members": members, } return render(request, 'members/index.html', context) +def profile_view(request, member_name=None): + job_group = deque(JobGroup.objects.all()) + member = None + + member = deque(Member.all_members.filter(nickname=member_name)) + + context = { + "job_group": job_group, + "member": member, + } + + return render(request, 'members/index.html', context) + + class MemberViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. diff --git a/fet2020/posts/admin.py b/fet2020/posts/admin.py index 0d85e67f..64c86842 100644 --- a/fet2020/posts/admin.py +++ b/fet2020/posts/admin.py @@ -25,6 +25,20 @@ class MyPostAdmin(admin.ModelAdmin): list_filter = ['is_event'] list_display = ['title', 'subtitle', 'slug', 'public_date'] + def add_view(self, request, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichtfelder." + return super().add_view( + request, form_url, extra_context=extra_context, + ) + + def change_view(self, request, object_id, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['help_text'] = "Fette Schriften sind Pflichtfelder." + return super().change_view( + request, object_id, form_url, extra_context=extra_context, + ) + def save_model(self, request, obj, form, change): obj.author = request.user super().save_model(request, obj, form, change) diff --git a/fet2020/posts/migrations/__init__.py b/fet2020/posts/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 7433ef0a..b31933a3 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import User +from django.core.validators import ValidationError from django.db import models from django.db.models import Q from django.urls import reverse @@ -61,7 +62,7 @@ class EventManager(models.Manager): return super().get_queryset().filter( Q(is_event=True) & Q(event_start__gt=date_today) - ).order_by('-public_date') + ).order_by('-event_start') class FetMeetingManager(models.Manager): @@ -168,7 +169,8 @@ class Post(models.Model): # TODO: Explain why this image is selected on save of the image # Query all posts that have a slug that equals one of the tags posts1 = Post.objects.filter( - slug__in=self.tags.names()).filter(image__isnull=False)[0:1].all() + slug__in=self.tags.names() + ).filter(image__isnull=False)[0:1].all() if len(posts1) > 0: return posts1.get().image @@ -190,11 +192,12 @@ class Post(models.Model): "save the post with some defaults" if (self.id is None) and (not self.slug): self.slug = slugify(self.public_date.date()) + "-" + slugify(self.title) - super().save(*args, **kwargs) - self.tags.set(*re.findall(r'\#([\d\w-]+)', str(self.subtitle)), - *re.findall(r'\#([\d\w-]+)', str(self.title))) + self.tags.set( + *re.findall(r'\#([\d\w-]+)', str(self.subtitle)), + *re.findall(r'\#([\d\w-]+)', str(self.title)) + ) def __str__(self): return "Post (%s, %s): %s " % (self.slug, self.public_date.strftime("%d.%m.%Y"), self.title) @@ -239,12 +242,24 @@ class Event(Post): class Meta: proxy = True + + verbose_name = "Event" + verbose_name_plural = "Events" + @property - def event_start_month (self): + def event_start_month(self): return self.event_start.strftime("%b") + @property def event_start_day(self): return self.event_start.strftime("%d") + + def clean(self): + if self.event_end is None or self.event_start is None: + raise ValidationError(_('Das Datum des Events fehlt.')) + elif self.event_end < self.event_start: + raise ValidationError(_('Das Ende des Events liegt vor dem Beginn.')) + def save(self, *args, **kwargs): self.is_event = True @@ -263,6 +278,15 @@ class FetMeeting(Event): verbose_name = "Fet Sitzung" verbose_name_plural = "Fet Sitzungen" + def clean(self): + if self.event_start is None: + raise ValidationError(_('Das Datum des Events fehlt.')) + + slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung") + + if Post.objects.filter(slug=slug).count() != 0: + raise ValidationError(_('Es existiert bereits eine Sitzung mit demselben Datum.')) + def save(self, *args, **kwargs): self.title = "Fachschaftssitzung" self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title) diff --git a/fet2020/posts/views.py b/fet2020/posts/views.py index a731d347..9c831749 100644 --- a/fet2020/posts/views.py +++ b/fet2020/posts/views.py @@ -10,6 +10,7 @@ from rest_framework import viewsets # from rest_framework import permissions from .models import Post, PostSerializer +from members.models import Member # from documents import add_ep_to_response from documents import get_ep_sessionid2, get_pad_link,add_ep_cookie @@ -41,14 +42,42 @@ def show(request, id=None): elif id != "" and id is not None: p = Post.objects.get(slug=(id)) + post_author = Member.all_members.filter(nickname=p.author) + context = { "post": p, "next": get_next_dict().get(p.slug, None), "related_posts": p.tags.similar_objects(), - "ep_link": get_pad_link(p.slug + "-agenda") + "ep_link": get_pad_link(p.slug + "-agenda"), + "author_image": post_author[0].image['avatar'].url } + response = render(request, 'posts/show.html', context) +<<<<<<< HEAD return add_ep_cookie(request,response) +======= + response.set_cookie("HelloWorld", "TestWert", domain="https://etherpad2.2020.fet.at") + ep_sessid, expires = get_ep_sessionid(request) + response.set_cookie( + "sessionID", + ep_sessid, + expires=expires, + domain=".2020.fet.at", + path="/" + ) + ''' + response.set_cookie( + "express_sid", + ep_sessid, + expires=expires, + domain="https://andis.2020.fet.at", + path="/etherpad" + ) + ''' + # response=add_ep_to_response(request, response ) + + return response +>>>>>>> 7fff88d1679058b52a4e2804534ea2dc76782873 ########### # HELPERS # diff --git a/fet2020/templates/admin/change_form.html b/fet2020/templates/admin/change_form.html new file mode 100644 index 00000000..6769f39c --- /dev/null +++ b/fet2020/templates/admin/change_form.html @@ -0,0 +1,6 @@ +{% extends "admin/change_form.html" %} +{% load i18n admin_urls %} + +{% block form_top %} +{% if help_text %}

{{ help_text }}

{% endif %} +{% endblock %} diff --git a/fet2020/templates/admin/submit_line.html b/fet2020/templates/admin/submit_line.html new file mode 100644 index 00000000..b3fbb539 --- /dev/null +++ b/fet2020/templates/admin/submit_line.html @@ -0,0 +1,7 @@ +{% extends "admin/submit_line.html" %} +{% load i18n admin_urls %} + +{% block submit-row %} + {% trans 'Close' %} + {{ block.super }} +{% endblock %} diff --git a/fet2020/templates/home.html b/fet2020/templates/home.html index 38ebb26a..c79ec622 100644 --- a/fet2020/templates/home.html +++ b/fet2020/templates/home.html @@ -13,7 +13,7 @@

{{post.title| safe}}

@@ -55,8 +55,8 @@ {% endfor %}
- {% for post in events %} - {% include 'posts/partials/_date_box.html' %} + {% for post in events %} + {% include 'posts/partials/_date_box.html' %} {% endfor %}
diff --git a/fet2020/templates/members/index.html b/fet2020/templates/members/index.html index 7e4faf19..7e3fdb99 100644 --- a/fet2020/templates/members/index.html +++ b/fet2020/templates/members/index.html @@ -11,34 +11,38 @@ Aktive Mitglieder Inaktive Mitglieder {% for job in job_group %} - {{job.name}} + {{job.name}} {% endfor %} diff --git a/fet2020/templates/members/jobs_list.html b/fet2020/templates/members/jobs_list.html index 23ddb329..0955a987 100644 --- a/fet2020/templates/members/jobs_list.html +++ b/fet2020/templates/members/jobs_list.html @@ -1,6 +1,4 @@ -
- Aktuelle Mitglieder: {{active_members.count}}
{% for mem in active_members %} diff --git a/fet2020/templates/members/members_list.html b/fet2020/templates/members/members_list.html index b238a7b0..e97af0d6 100644 --- a/fet2020/templates/members/members_list.html +++ b/fet2020/templates/members/members_list.html @@ -1,6 +1,5 @@
-

Mitarbeiter Liste

Grid Style

{% for member in members %} @@ -16,11 +15,4 @@ {% include 'members/partials/_member.html' %} {% endfor %}
- -

Detail List

-
- {% for member in members %} - {% include 'members/partials/_member_details.html' %} - {% endfor %} -
diff --git a/fet2020/templates/members/partials/_member.html b/fet2020/templates/members/partials/_member.html index 9d598808..b2ae4f58 100644 --- a/fet2020/templates/members/partials/_member.html +++ b/fet2020/templates/members/partials/_member.html @@ -2,7 +2,7 @@ {# only thumb and name of member #} {% load thumbnail %} - -{% if member.image %}{% endif %} + +

{{member.nickname}}

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

\ No newline at end of file diff --git a/fet2020/templates/posts/partials/_date_box.html b/fet2020/templates/posts/partials/_date_box.html index a57b8307..63b0adab 100644 --- a/fet2020/templates/posts/partials/_date_box.html +++ b/fet2020/templates/posts/partials/_date_box.html @@ -1,4 +1,4 @@ - +