diff --git a/.gitignore b/.gitignore index 67258286..d1b92082 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ fet2020/files/* fet2020/.env/* *.sqlite3 -fet2020/posts/migrations/* -fet2020/members/migrations/* +fet2020/*/migrations/* .theia/* +.flake8 +migrate +run \ No newline at end of file diff --git a/fet2020/documents/__init__.py b/fet2020/documents/__init__.py index ae69a266..124d4379 100644 --- a/fet2020/documents/__init__.py +++ b/fet2020/documents/__init__.py @@ -1,12 +1,11 @@ from etherpad_lite import EtherpadLiteClient -from django.conf import settings +# from django.conf import settings from datetime import datetime, timedelta -t=datetime.now() + timedelta(days=1) - -with open("/srv/andis_test/etherpad-lite/etherpad-lite/APIKEY.txt","r") as f: - k=f.read() - epc=EtherpadLiteClient( base_params={'apikey':k,}, base_url="http://localhost:9001/api") - a=epc.createAuthorIfNotExistsFor(name="andis", authorMapper="andis") - g=epc.createGroupIfNotExistsFor(groupMapper="fet") +t = datetime.now() + timedelta(days=1) +with open("/srv/andis_test/etherpad-lite/etherpad-lite/APIKEY.txt", "r") as f: + k = f.read() + epc = EtherpadLiteClient(base_params={'apikey': k, }, base_url="http://localhost:9001/api") + a = epc.createAuthorIfNotExistsFor(name="andis", authorMapper="andis") + g = epc.createGroupIfNotExistsFor(groupMapper="fet") diff --git a/fet2020/documents/admin.py b/fet2020/documents/admin.py index e7e1916d..40d82d6c 100644 --- a/fet2020/documents/admin.py +++ b/fet2020/documents/admin.py @@ -1,23 +1,21 @@ from django.contrib import admin from .models import Document from django.urls import path -from django.contrib.auth import views as auth_views +# from django.contrib.auth import views as auth_views from django.shortcuts import render @admin.register(Document) class DocumentModelAdmin(admin.ModelAdmin): - def my_view(self,request, extra_context=None): - return render(request,"admin/documents/preview.html") + def my_view(self, request, extra_context=None): + return render(request, "admin/documents/preview.html") def get_urls(self): - urls = super().get_urls() - select_list_url = [ path("/preview", self.admin_site.admin_view(self.my_view), - name='preview'), - path("preview", self.admin_site.admin_view(self.my_view), - name='preview') - + # urls = super().get_urls() + select_list_url = [ + path("/preview", self.admin_site.admin_view(self.my_view), name='preview'), + path("preview", self.admin_site.admin_view(self.my_view), name='preview') ] - return select_list_url #+ urls + return select_list_url # + urls -#admin.site.register(Document,DocumentModelAdmin) +# admin.site.register(Document,DocumentModelAdmin) diff --git a/fet2020/documents/apps.py b/fet2020/documents/apps.py index 4cf9904d..1450e243 100644 --- a/fet2020/documents/apps.py +++ b/fet2020/documents/apps.py @@ -1,7 +1,6 @@ from django.apps import AppConfig +# from django.contrib.admin.apps import AdminConfig class DocumentsConfig(AppConfig): name = 'documents' -from django.contrib.admin.apps import AdminConfig - diff --git a/fet2020/documents/models.py b/fet2020/documents/models.py index bdfa2db8..b5f24aa0 100644 --- a/fet2020/documents/models.py +++ b/fet2020/documents/models.py @@ -1,8 +1,6 @@ from django.db import models + # Create your models here. class Document(models.Model): key = models.CharField(max_length=200, primary_key=True) - - - diff --git a/fet2020/documents/tests.py b/fet2020/documents/tests.py index 7ce503c2..a79ca8be 100644 --- a/fet2020/documents/tests.py +++ b/fet2020/documents/tests.py @@ -1,3 +1,3 @@ -from django.test import TestCase +# from django.test import TestCase # Create your tests here. diff --git a/fet2020/documents/urls.py b/fet2020/documents/urls.py index 3bb2a3a6..5244edd1 100644 --- a/fet2020/documents/urls.py +++ b/fet2020/documents/urls.py @@ -1,6 +1,7 @@ import documents.views as views from django.urls import path -urlpatterns=[ + +urlpatterns = [ path("document/", views.document) -] \ No newline at end of file +] diff --git a/fet2020/documents/views.py b/fet2020/documents/views.py index dd61aa26..00a71463 100644 --- a/fet2020/documents/views.py +++ b/fet2020/documents/views.py @@ -3,36 +3,37 @@ from django.shortcuts import render # Create your views here. -from django.http import HttpResponseRedirect -from django.template import RequestContext +# from django.http import HttpResponseRedirect +# from django.template import RequestContext from django.contrib.auth.decorators import login_required -from django.utils.translation import ugettext_lazy as _ -import urllib +# from django.utils.translation import ugettext_lazy as _ +# import urllib from urllib.parse import urlparse -from .models import Document +# from .models import Document from documents import epc from documents import g as group -SERVER_URL="http://etherpad.2020.fet.at/" import datetime + +SERVER_URL = "http://etherpad.2020.fet.at/" + + @login_required def document(request, id=None): """Create and session and display an embedded pad """ - # Initialize some needed values - #pad = Document.objects.get(key=id) - padID=id - padLink = SERVER_URL + 'p/' + group["groupID"] + '$' + \ - padID + # pad = Document.objects.get(key=id) + padID = id + padLink = SERVER_URL + 'p/' + group["groupID"] + '$' + padID server = urlparse(SERVER_URL) - author = epc.createAuthorIfNotExistsFor(name=str(request.user), authorMapper=str(request.user))['authorID'] - + author = epc.createAuthorIfNotExistsFor( + name=str(request.user), + authorMapper=str(request.user) + )['authorID'] # Create the session on the etherpad-lite side - expires = datetime.datetime.utcnow() + datetime.timedelta( - hours=3 - ) + expires = datetime.datetime.utcnow() + datetime.timedelta(hours=3) epclient = epc try: @@ -49,15 +50,14 @@ def document(request, id=None): 'link': padLink, 'server': str(server), 'uname': str(request.user), - 'error': 'etherpad-lite session request returned:' + - '"' + str(e) + '"' + 'error': 'etherpad-lite session request returned:' + '"' + str(e) + '"' } - ) return response # Set up the response - response = render(request, + response = render( + request, 'documents/pad.html', { 'pad': padID, @@ -65,7 +65,8 @@ def document(request, id=None): 'server': str(server), 'uname': str(request.user), 'error': False - }#, context=(request) + } + # context=(request) ) # Delete the existing session first @@ -88,4 +89,4 @@ def document(request, id=None): expires=expires, httponly=False ) - return response \ No newline at end of file + return response diff --git a/fet2020/fet2020/middleware.py b/fet2020/fet2020/middleware.py index 0a0eb6d6..00c34b27 100644 --- a/fet2020/fet2020/middleware.py +++ b/fet2020/fet2020/middleware.py @@ -1,15 +1,20 @@ -from django.contrib.auth.models import User +# from django.contrib.auth.models import User from django.contrib.auth.middleware import RemoteUserMiddleware -import django -#import logging -#logger=logging.getLogger("django.request") +# import django +# import logging +# logger=logging.getLogger("django.request") + class FETHeaderMiddleware(RemoteUserMiddleware): - header="Remote-User" + header = "Remote-User" + def process_request(self, request): - request.META[self.header]=request.META.get(self.header, request.headers.get(self.header,None)) + request.META[self.header] = request.META.get( + self.header, + request.headers.get(self.header, None) + ) super().process_request(request) if request.user.is_authenticated: - request.user.is_admin=True - request.user.is_superuser=True - request.user.is_staff=True \ No newline at end of file + request.user.is_admin = True + request.user.is_superuser = True + request.user.is_staff = True diff --git a/fet2020/fet2020/settings.py b/fet2020/fet2020/settings.py index 06d273d8..debce2a8 100644 --- a/fet2020/fet2020/settings.py +++ b/fet2020/fet2020/settings.py @@ -12,10 +12,27 @@ https://docs.djangoproject.com/en/3.0/ref/settings/ import os +# Prints and logs are written to console +# TODO: Change before release +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + }, + }, + 'root': { + 'handlers': ['console'], + 'level': 'DEBUG', + }, +} + + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -SESSION_COOKIE_DOMAIN =".2020.fet.at" +SESSION_COOKIE_DOMAIN = ".2020.fet.at" # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ @@ -28,15 +45,14 @@ DEBUG = True ALLOWED_HOSTS = [] -DATA_UPLOAD_MAX_MEMORY_SIZE = 1024*1024*1024 +DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 1024 # Application definition CKEDITOR_UPLOAD_PATH = 'upload' INSTALLED_APPS = [ - 'posts.apps.PostsConfig', - 'members.apps.MembersConfig', 'documents.apps.DocumentsConfig', 'django.contrib.admin', + 'django.contrib.admindocs', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', @@ -48,7 +64,8 @@ INSTALLED_APPS = [ 'rest_framework', 'django_filters', 'django_static_jquery_ui', - 'django.contrib.admindocs' + 'posts.apps.PostsConfig', + 'members.apps.MembersConfig', ] MIDDLEWARE = [ @@ -67,7 +84,10 @@ ROOT_URLCONF = 'fet2020.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates'),os.path.join(BASE_DIR, 'templates_design1')], + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + os.path.join(BASE_DIR, 'templates_design1') + ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -140,10 +160,8 @@ STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static_design1"), ] -MEDIA_ROOT=os.path.join(BASE_DIR, 'files/') -MEDIA_URL='/files/' - - +MEDIA_ROOT = os.path.join(BASE_DIR, 'files/') +MEDIA_URL = '/files/' TAGGIT_FORCE_LOWERCASE = True @@ -162,5 +180,4 @@ CKEDITOR_CONFIGS = { }, ], } - } diff --git a/fet2020/fet2020/urls.py b/fet2020/fet2020/urls.py index f9ab1f0a..00ea79d6 100644 --- a/fet2020/fet2020/urls.py +++ b/fet2020/fet2020/urls.py @@ -36,4 +36,4 @@ urlpatterns = [ path('ckeditor/', include('ckeditor_uploader.urls')), path('api/', include(router.urls)), path('members/', include('members.urls')), -]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/fet2020/fet2020/views.py b/fet2020/fet2020/views.py index a73cb2c6..ce495b72 100644 --- a/fet2020/fet2020/views.py +++ b/fet2020/fet2020/views.py @@ -1,22 +1,27 @@ from django.shortcuts import render -from django.http import HttpResponse +# from django.http import HttpResponse from collections import deque from posts.models import Post def index(request): - posts=deque(Post.article_objects.all()) - l=len(posts) + posts = deque(Post.article_objects.all()) + def get_tags(lst): for p in lst: for t in list(p.tags.names()): - yield "#"+ t + yield "#" + t - - t=set( t for t in get_tags(posts)) - if l>=1: - featured_post=posts.popleft() + t = set(t for t in get_tags(posts)) + if len(posts) >= 1: + featured_post = posts.popleft() else: - featured_post=0 + featured_post = 0 - return render(request, 'home.html',{'posts':posts, 'featured_post':featured_post, "tags_list": ", ".join(t)}) + context = { + 'posts': posts, + 'featured_post': featured_post, + 'tags_list': ", ".join(t) + } + + return render(request, 'home.html', context) diff --git a/fet2020/members/admin.py b/fet2020/members/admin.py index c417cf50..ef324319 100644 --- a/fet2020/members/admin.py +++ b/fet2020/members/admin.py @@ -21,14 +21,17 @@ class MemberRoleFilter(admin.SimpleListFilter): elif self.value() == 'P': return queryset.filter(role='P') + class JobMemberInline(admin.TabularInline): model = JobMember extra = 0 + class JobOverviewInline(JobMemberInline): verbose_name = "Tätigkeit" verbose_name_plural = "Tätigkeitsübersicht" + class ActiveMemberInline(JobMemberInline): verbose_name = "Mitglied" verbose_name_plural = "Aktive Mitglieder Liste" @@ -36,6 +39,7 @@ class ActiveMemberInline(JobMemberInline): def get_queryset(self, request): return JobMember.active_member.all() + class InactiveMemberInline(JobMemberInline): verbose_name = "Mitglied" verbose_name_plural = "Inaktive Mitglieder Liste" @@ -43,25 +47,29 @@ 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 = (JobOverviewInline,) - search_fields = ['firstname', 'surname','nickname','mailaccount'] + search_fields = ['firstname', 'surname', 'nickname', 'mailaccount'] list_filter = [MemberRoleFilter] def save_model(self, request, obj, form, change): obj.author = request.user super().save_model(request, obj, form, change) + admin.site.register(Member, MyMemberAdmin) + class MyJobAdmin(admin.ModelAdmin): form = MyJobForm model = Job @@ -74,8 +82,10 @@ class MyJobAdmin(admin.ModelAdmin): obj.author = request.user super().save_model(request, obj, form, change) + admin.site.register(Job, MyJobAdmin) + class MyJobGroupAdmin(admin.ModelAdmin): form = MyJobGroupForm model = JobGroup @@ -88,4 +98,5 @@ class MyJobGroupAdmin(admin.ModelAdmin): obj.author = request.user super().save_model(request, obj, form, change) -admin.site.register(JobGroup, MyJobGroupAdmin) \ No newline at end of file + +admin.site.register(JobGroup, MyJobGroupAdmin) diff --git a/fet2020/members/forms.py b/fet2020/members/forms.py index c097cc63..2e6927ae 100644 --- a/fet2020/members/forms.py +++ b/fet2020/members/forms.py @@ -20,16 +20,29 @@ class MyMemberForm(forms.ModelForm): 'address' ] - widgets = {'description': CKEditorUploadingWidget(config_name='default')} + widgets = { + 'description': CKEditorUploadingWidget(config_name='default') + } + class MyJobForm(forms.ModelForm): class Meta: model = Job - fields = ['name', 'shortterm', 'slug', 'job_group', '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'] \ No newline at end of file + fields = ['name', 'shortterm', 'is_pinned'] diff --git a/fet2020/members/models.py b/fet2020/members/models.py index ee1546db..9365d068 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -6,7 +6,7 @@ from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from rest_framework import serializers -import uuid +# import uuid from datetime import timedelta @@ -15,10 +15,12 @@ class MemberManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(role='A') + class PensionManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(role='P') + class ActiveMemberManager(models.Manager): ''' return a list of active member, and members who are still working @@ -27,12 +29,9 @@ class ActiveMemberManager(models.Manager): date_today = timezone.now().date() return super().get_queryset().filter( - Q(member__role='A') & - ( - Q(job_end__gt=date_today) | - Q(job_end__isnull=True) - ) - ) + Q(member__role='A') + & (Q(job_end__gt=date_today) | Q(job_end__isnull=True))) + class InactiveMemberManager(models.Manager): ''' @@ -42,12 +41,9 @@ class InactiveMemberManager(models.Manager): date_today = timezone.now().date() return super().get_queryset().filter( - Q(member__role='P') | - ( - Q(job_end__lt=date_today + timedelta(days=1)) & - Q(job_end__isnull=False) - ) - ) + Q(member__role='P') + | (Q(job_end__lt=date_today + timedelta(days=1)) & Q(job_end__isnull=False))) + class Member(models.Model): firstname = models.CharField(max_length=128) @@ -57,21 +53,28 @@ class Member(models.Model): __choices = [ ('A', _('Active')), - ('P', _('Pension')) + ('P', _('Pension')), ] - role = models.CharField(max_length=1, choices= __choices, default='A') + role = models.CharField(max_length=1, choices=__choices, default='A') description = models.TextField(null=True, blank=True) image = models.ImageField(null=True, blank=True) birthday = models.DateField(null=True, blank=True) - phone_error_msg =_(( + phone_error_msg = _(( "Phone number must be entered in the format: " "+999999999'. Up to 15 digits allowed." )) - phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message=phone_error_msg) - phone = models.CharField(validators=[phone_regex], max_length=17, blank=True) + phone_regex = RegexValidator( + regex=r'^\+?1?\d{9,15}$', + message=phone_error_msg, + ) + phone = models.CharField( + validators=[phone_regex], + max_length=17, + blank=True, + ) address = models.TextField(null=True, blank=True) @@ -90,6 +93,7 @@ class Member(models.Model): def __str__(self): return self.firstname + " " + self.surname + class MemberSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Member @@ -100,9 +104,10 @@ class MemberSerializer(serializers.HyperlinkedModelSerializer): 'mailaccount', 'role', 'description', - 'image' + 'image', ] + class JobGroup(models.Model): name = models.CharField(max_length=128) shortterm = models.CharField(max_length=128) @@ -111,6 +116,7 @@ class JobGroup(models.Model): def __str__(self): return self.name + class Job(models.Model): name = models.CharField(max_length=128) shortterm = models.CharField(max_length=128) @@ -139,6 +145,7 @@ class Job(models.Model): def __str__(self): return self.shortterm + class JobMember(models.Model): member = models.ForeignKey( Member, @@ -166,4 +173,4 @@ class JobMember(models.Model): jobmember = models.Manager() active_member = ActiveMemberManager() - inactive_member = InactiveMemberManager() \ No newline at end of file + inactive_member = InactiveMemberManager() diff --git a/fet2020/members/tests.py b/fet2020/members/tests.py index 7ce503c2..a79ca8be 100644 --- a/fet2020/members/tests.py +++ b/fet2020/members/tests.py @@ -1,3 +1,3 @@ -from django.test import TestCase +# from django.test import TestCase # Create your tests here. diff --git a/fet2020/members/urls.py b/fet2020/members/urls.py index 410b47d1..cb09cf40 100644 --- a/fet2020/members/urls.py +++ b/fet2020/members/urls.py @@ -5,4 +5,4 @@ from . import views urlpatterns = [ path('', views.index, name='members.index'), -] \ No newline at end of file +] diff --git a/fet2020/members/views.py b/fet2020/members/views.py index 73fb47a6..f4fcc17c 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -1,5 +1,5 @@ from django.shortcuts import render -from django.http import HttpResponse +# from django.http import HttpResponse from collections import deque @@ -7,11 +7,11 @@ from .models import Member, Job, JobMember, JobGroup, MemberSerializer from rest_framework import viewsets from rest_framework import permissions -from django_filters.rest_framework import DjangoFilterBackend +# from django_filters.rest_framework import DjangoFilterBackend def index(request): - #members = deque(Member.all_members.all()) + # members = deque(Member.all_members.all()) members = deque(Member.all_members.all()) jobmembers = deque(JobMember.jobmember.all()) jobs = deque(Job.objects.all()) @@ -19,13 +19,14 @@ def index(request): context = { "members": members, - "jobmembers" : jobmembers, - "jobgroups" : jobgroups, - "jobs" : jobs, + "jobmembers": jobmembers, + "jobgroups": jobgroups, + "jobs": jobs, } return render(request, 'members/index.html', context) + class MemberViewSet(viewsets.ModelViewSet): """ API endpoint that allows users to be viewed or edited. @@ -34,9 +35,9 @@ class MemberViewSet(viewsets.ModelViewSet): serializer_class = MemberSerializer permission_classes = [permissions.IsAuthenticated] - #filter_backends = [DjangoFilterBackend] - #filterset_fields = ['legacy_id', 'slug','legacy_rubrik_id'] - lookup_field='name' + # filter_backends = [DjangoFilterBackend] + # filterset_fields = ['legacy_id', 'slug','legacy_rubrik_id'] + lookup_field = 'name' def pre_save(self, obj): - obj.image = self.request.FILES.get('image') \ No newline at end of file + obj.image = self.request.FILES.get('image') diff --git a/fet2020/posts/admin.py b/fet2020/posts/admin.py index e1ecc8fa..db3a3d74 100644 --- a/fet2020/posts/admin.py +++ b/fet2020/posts/admin.py @@ -1,5 +1,5 @@ -import django.contrib.auth.admin -import django.contrib.auth.models +# import django.contrib.auth.admin +# import django.contrib.auth.models import taggit.admin from django.contrib import admin, auth @@ -33,21 +33,27 @@ class MyPostAdmin(admin.ModelAdmin): "jquery-ui/jquery-ui.min.js", ] + class MyEventAdmin(MyPostAdmin): form = MyEventForm model = Event list_display = ['title', 'subtitle', 'slug', 'event_start', 'public_date'] + admin.site.register(Event, MyEventAdmin) + class MyNewsAdmin(MyPostAdmin): form = MyNewsForm model = News + admin.site.register(News, MyNewsAdmin) + class MyFetMeetingAdmin(MyEventAdmin): form = MyFetMeetingForm model = FetMeeting -admin.site.register(FetMeeting, MyFetMeetingAdmin) \ No newline at end of file + +admin.site.register(FetMeeting, MyFetMeetingAdmin) diff --git a/fet2020/posts/forms.py b/fet2020/posts/forms.py index af918ed0..5f06e7c6 100644 --- a/fet2020/posts/forms.py +++ b/fet2020/posts/forms.py @@ -1,4 +1,4 @@ -from ckeditor_uploader.widgets import CKEditorUploadingWidget +from ckeditor_uploader.widgets import CKEditorUploadingWidget from django import forms from .models import Post, Event, News, FetMeeting @@ -8,49 +8,52 @@ class MyPostForm(forms.ModelForm): class Meta: model = Post fields = ['title', 'subtitle', 'tags', 'image', 'body', 'slug', 'author'] - + widgets = {'body': CKEditorUploadingWidget(config_name='default')} class Media: js = ( - 'js/auto_slug.js', # automatic slag completion via ajax - 'js/tag_completion.js', # to get a list for tag autocompletion via ajax + 'js/auto_slug.js', # automatic slag completion via ajax + 'js/tag_completion.js', # to get a list for tag autocompletion via ajax ) + class MyNewsForm(MyPostForm): class Meta: model = News fields = ['title', 'subtitle', 'tags', 'image', 'body', 'slug', 'author'] - + widgets = {'body': CKEditorUploadingWidget(config_name='default')} - + def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set + super().__init__(*args, **kwargs) # to get the self.fields set + class MyEventForm(MyPostForm): class Meta: model = Event fields = ['title', 'subtitle', 'tags', 'image', 'body', 'event_start', 'event_end', 'event_place', 'slug', 'author'] - + widgets = {'body': CKEditorUploadingWidget(config_name='default')} - + def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set + super().__init__(*args, **kwargs) # to get the self.fields set self.fields['event_start'].required = True self.fields['event_end'].required = True - + if 'event_place' in self.fields: self.fields['event_place'].required = True + class MyFetMeetingForm(MyEventForm): class Meta: model = FetMeeting fields = ['event_start', 'event_end', 'tags'] - + def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) # to get the self.fields set + super().__init__(*args, **kwargs) # to get the self.fields set self.fields['event_start'].required = True - self.fields['event_end'].required = False \ No newline at end of file + self.fields['event_end'].required = False diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 90a8a12d..fa4e5023 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -3,14 +3,14 @@ from django.db import models from django.db.models import Q from django.urls import reverse from django.utils import timezone -from django.utils.text import slugify +from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from taggit.managers import TaggableManager -#from ckeditor_uploader import RichTextUploadingField -import uuid -import re +# from ckeditor_uploader import RichTextUploadingField +# import uuid +import re from rest_framework import serializers from datetime import timedelta @@ -26,7 +26,8 @@ logger = logging.getLogger('posts') class PostManager(models.Manager): def get_queryset(self): return super().get_queryset() - + + class ArticleManager(models.Manager): """ Provide a query set only for "Article" @@ -35,10 +36,12 @@ class ArticleManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(Q(post_type='E') | Q(post_type='N')) + class NewsManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(~Q(is_event=True)) + class EventManager(models.Manager): """ Provide a query set only for "Events" @@ -47,6 +50,7 @@ class EventManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(Q(is_event=True) & Q(post_type='E')) + class FetMeetingManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(Q(post_type='F')) @@ -62,18 +66,19 @@ class Category(models.Model): subtitle = models.CharField(max_length=500, null=True, blank=True) # Slug = Text Basierter url bestandteil zb Fetsitzung 22.1.2020 --> fetsitzung_22_1_2020 für Url - slug = models.SlugField(unique=True,null=True,blank=True) + slug = models.SlugField(unique=True, null=True, blank=True) # Ein Haupt Bild für den Post image = models.ImageField(null=True, blank=True) - + tags = TaggableManager(blank=True) class Meta: verbose_name = "Category" verbose_name_plural = "Categories" - + + class Post(models.Model): - #id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) legacy_id = models.IntegerField(null=True) legacy_rubrik_id = models.IntegerField(null=True) # Titel des Posts @@ -88,11 +93,11 @@ class Post(models.Model): image = models.ImageField(null=True, blank=True) # Wer hat das geschrieben author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) - + tags = TaggableManager(blank=True) # Datum ab dem etwas öffentlich sein soll public_date = models.DateField('date published', null=True, blank=True, default=timezone.now) - + imported_from = models.CharField(max_length=200, null=True, blank=True) __choices = [ @@ -118,11 +123,11 @@ class Post(models.Model): # TimeStamps date_modified = models.DateTimeField(auto_now=True) date_created = models.DateTimeField(auto_now_add=True) - + # Managers objects = PostManager() article_objects = ArticleManager() - + def get_tags(self): """Returns assigned tags as a comma seperated list.""" return ",".join(self.tags.names()) @@ -132,7 +137,7 @@ class Post(models.Model): if self.image: return self.image.url else: - image=self.find_an_image() + image = self.find_an_image() if image: return image.url else: @@ -145,16 +150,17 @@ class Post(models.Model): "find an image via another post" # 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() + posts1 = Post.objects.filter( + slug__in=self.tags.names()).filter(image__isnull=False)[0:1].all() if len(posts1) > 0: return posts1.get().image - - #posts2=self.tags.similar_objects() - #for p in posts2: + + # posts2=self.tags.similar_objects() + # for p in posts2: # if p.image is not None: # return p.image return None - + @property def url(self): return reverse('posts.show', kwargs={"id": self.slug}) @@ -170,7 +176,8 @@ class Post(models.Model): *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) + return "Post (%s, %s): %s " % (self.slug, self.public_date.strftime("%d.%m.%Y"), self.title) + class PostSerializer(serializers.HyperlinkedModelSerializer): class Meta: @@ -185,10 +192,11 @@ class PostSerializer(serializers.HyperlinkedModelSerializer): 'legacy_id', 'image', 'event_start', - 'event_end', - 'is_fetsitzung' + 'event_end', + 'is_fetsitzung', ] + class News(Post): objects = NewsManager() @@ -197,19 +205,20 @@ class News(Post): verbose_name = "News" verbose_name_plural = "News" - + def save(self, *args, **kwargs): if not self.post_type: self.post_type = 'N' - + super().save(*args, **kwargs) + class Event(Post): objects = EventManager() class Meta: proxy = True - + def save(self, *args, **kwargs): self.is_event = True @@ -218,6 +227,7 @@ class Event(Post): super().save(*args, **kwargs) + class FetMeeting(Event): objects = FetMeetingManager() @@ -231,14 +241,14 @@ class FetMeeting(Event): self.title = "Fachschaftssitzung" self.slug = slugify(self.event_start.date()) + "-" + slugify(self.title) self.body = "TODO: Agenda + Protokoll Link" - - #TODO - #self.image + + # TODO + # self.image self.has_protocol = True self.has_agenda = True - - #TODO + + # TODO # self.protocol_key # self.agenda_key @@ -252,4 +262,4 @@ class FetMeeting(Event): if not self.event_end: self.event_end = self.event_start + timedelta(hours=2) - super().save(*args, **kwargs) \ No newline at end of file + super().save(*args, **kwargs) diff --git a/fet2020/posts/templatetags/post_helpers.py b/fet2020/posts/templatetags/post_helpers.py index 2e04c7d2..93b171b8 100644 --- a/fet2020/posts/templatetags/post_helpers.py +++ b/fet2020/posts/templatetags/post_helpers.py @@ -5,9 +5,8 @@ from django.utils.safestring import mark_safe register = template.Library() - @register.filter(is_safe=True) @stringfilter def tags_to_url(value): - #return "Tag to url: %s" % value - return mark_safe(re.sub(r'\#([\d\w-]+)', '#\g<1>', value)) \ No newline at end of file + # return "Tag to url: %s" % value + return mark_safe(re.sub(r'\#([\d\w-]+)', r'#\g<1>', value)) diff --git a/fet2020/posts/tests.py b/fet2020/posts/tests.py index 7ce503c2..a79ca8be 100644 --- a/fet2020/posts/tests.py +++ b/fet2020/posts/tests.py @@ -1,3 +1,3 @@ -from django.test import TestCase +# from django.test import TestCase # Create your tests here. diff --git a/fet2020/posts/urls.py b/fet2020/posts/urls.py index 2c612f57..db5dac31 100644 --- a/fet2020/posts/urls.py +++ b/fet2020/posts/urls.py @@ -2,10 +2,10 @@ from django.urls import path from . import views -urlpatterns=[ +urlpatterns = [ path('func/tag_complete', views.tag_complete), path('func/slug_calc', views.slug_calc), path('t/', views.tags, name='posts.tags'), path('', views.index, name='posts.index'), path('', views.show, name='posts.show'), -] \ No newline at end of file +] diff --git a/fet2020/posts/views.py b/fet2020/posts/views.py index 6a8b5f9d..9823d451 100644 --- a/fet2020/posts/views.py +++ b/fet2020/posts/views.py @@ -1,13 +1,13 @@ from django.shortcuts import render -from django.http import HttpResponse, JsonResponse +from django.http import HttpResponse, JsonResponse, HttpResponseServerError from django_filters.rest_framework import DjangoFilterBackend -from django.core.cache import cache +# from django.core.cache import cache from django.utils.text import slugify from django.utils import timezone from taggit.models import Tag from rest_framework import viewsets -from rest_framework import permissions +# from rest_framework import permissions from .models import Post, PostSerializer @@ -20,26 +20,28 @@ from collections import deque def index(request): posts = deque(Post.objects.order_by('-public_date').all()) - f = lambda p: p.tags + + def f(p): + return p.tags t = map(f, posts) return render(request, 'posts/index.html', {"posts": posts, "tags_list": t}) -def tags(request,tag=""): +def tags(request, tag=""): posts = deque(Post.objects.filter(tags__name=tag)) return render(request, 'posts/index.html', {"posts": posts, "tags_list": None}) -def show(request,id=None): +def show(request, id=None): if id.isdigit() or id is int: p = Post.objects.get(id=int(id)) - elif id != "" and not id is None: + elif id != "" and id is not None: p = Post.objects.get(slug=(id)) context = { "post": p, - "next": get_next_dict().get(p.slug,None), + "next": get_next_dict().get(p.slug, None), "related_posts": p.tags.similar_objects() } return render(request, 'posts/show.html', context) @@ -77,7 +79,7 @@ def tag_complete(request): tag_objects = Tag.objects.filter(name__istartswith=term) - tag_array =[] + tag_array = [] for elem in tag_objects: tag_array.append(elem.name) @@ -87,15 +89,15 @@ def tag_complete(request): def get_next_dict(): - #TODO: Docstring + # TODO: Docstring posts = Post.article_objects.order_by('-public_date').values('slug') print(posts) d = {} print(d) - for k,v in enumerate(posts): + for k, v in enumerate(posts): if k == len(posts) - 1: break - d[v['slug']] = posts[k+1]['slug'] + d[v['slug']] = posts[k + 1]['slug'] print(d) return d @@ -106,9 +108,9 @@ class PostViewSet(viewsets.ModelViewSet): """ queryset = Post.objects.all().order_by('-public_date') serializer_class = PostSerializer - #permission_classes = [permissions.IsAuthenticated] + # permission_classes = [permissions.IsAuthenticated] filter_backends = [DjangoFilterBackend] - filterset_fields = ['legacy_id', 'slug','legacy_rubrik_id'] + filterset_fields = ['legacy_id', 'slug', 'legacy_rubrik_id'] lookup_field = 'slug' def pre_save(self, obj): diff --git a/fet2020/requirements.txt b/fet2020/requirements.txt index cae05159..2a13ae5e 100644 --- a/fet2020/requirements.txt +++ b/fet2020/requirements.txt @@ -4,4 +4,5 @@ django-ckeditor Pillow djangorestframework django-static-jquery-ui -docutils \ No newline at end of file +docutils +etherpad-lite \ No newline at end of file