From 66dc28da88a0857de223ce02d6199204b648f9bd Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 13 May 2021 16:31:05 +0000 Subject: [PATCH] add flatpages --- fet2020/blackboard/views.py | 9 ++- fet2020/core/__init__.py | 0 fet2020/core/admin.py | 29 ++++++++ fet2020/core/apps.py | 19 ++++++ fet2020/core/forms.py | 11 +++ fet2020/core/migrations/0001_initial.py | 27 ++++++++ fet2020/core/migrations/__init__.py | 0 fet2020/core/models.py | 18 +++++ fet2020/core/tests.py | 3 + fet2020/core/views.py | 3 + fet2020/documents/api.py | 4 +- fet2020/fet2020/settings.py | 8 +++ fet2020/fet2020/urls.py | 7 ++ fet2020/members/views.py | 6 +- fet2020/posts/forms.py | 15 ++-- fet2020/posts/models.py | 14 +++- fet2020/templates/blackboard/index.html | 4 +- fet2020/templates/flatpages/default.html | 8 +++ fet2020/templates/flatpages/social_media.html | 68 +++++++++++++++++++ fet2020/templates/layout.html | 2 +- fet2020/templates/members/index.html | 2 +- 21 files changed, 237 insertions(+), 20 deletions(-) create mode 100644 fet2020/core/__init__.py create mode 100644 fet2020/core/admin.py create mode 100644 fet2020/core/apps.py create mode 100644 fet2020/core/forms.py create mode 100644 fet2020/core/migrations/0001_initial.py create mode 100644 fet2020/core/migrations/__init__.py create mode 100644 fet2020/core/models.py create mode 100644 fet2020/core/tests.py create mode 100644 fet2020/core/views.py create mode 100644 fet2020/templates/flatpages/default.html create mode 100644 fet2020/templates/flatpages/social_media.html diff --git a/fet2020/blackboard/views.py b/fet2020/blackboard/views.py index 72165e9c..4e308a64 100644 --- a/fet2020/blackboard/views.py +++ b/fet2020/blackboard/views.py @@ -1,17 +1,16 @@ +from datetime import timedelta from django.shortcuts import render from django.utils import timezone -from datetime import timedelta - +from core.models import CustomFlatPage from .models import JobPosting -from posts.models import Post def index(request): job_postings_cutoff = timezone.now().date() - timedelta(30) # 30days from now job_postings = JobPosting.all_jobPosting.filter(publishDate__gt=job_postings_cutoff) - bb_info = Post.objects.filter(slug="blackboard").first() - bb_empty = Post.objects.filter(slug="blackboard-empty").first() + bb_info = CustomFlatPage.objects.filter(title__iexact="blackboard").first() + bb_empty = CustomFlatPage.objects.filter(title__iexact="blackboard empty").first() context = { "job_postings": job_postings, diff --git a/fet2020/core/__init__.py b/fet2020/core/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fet2020/core/admin.py b/fet2020/core/admin.py new file mode 100644 index 00000000..8c9450e9 --- /dev/null +++ b/fet2020/core/admin.py @@ -0,0 +1,29 @@ +from django.contrib import admin +from django.contrib.flatpages.admin import FlatPageAdmin +from django.contrib.flatpages.models import FlatPage +from django.contrib.sites.models import Site +from django.utils.translation import ugettext_lazy as _ + +from .forms import FlatPageForm +from .models import CustomFlatPage + + +# Define a new FlatPageAdmin +class CustomFlatPageAdmin(FlatPageAdmin): + form = FlatPageForm + fieldsets = ( + (None, {'fields': ('url', 'title', 'content',)}), + (_('Advanced options'), { + 'classes': ('collapse',), + 'fields': ('registration_required', 'template_name'), + }), + ) + list_display = ["url", "title", "registration_required"] + list_filter = ('registration_required',) + + +# Re-register FlatPageAdmin +admin.site.unregister(FlatPage) +admin.site.register(CustomFlatPage, CustomFlatPageAdmin) + +admin.site.unregister(Site) diff --git a/fet2020/core/apps.py b/fet2020/core/apps.py new file mode 100644 index 00000000..e544421b --- /dev/null +++ b/fet2020/core/apps.py @@ -0,0 +1,19 @@ +from django.apps import AppConfig +from django.conf import settings +from django.db.models.signals import post_migrate + + +def update_default_site(sender, **kwargs): + from django.contrib.sites.models import Site + + site = Site.objects.get_current() + site.domain = settings.HOST_NAME + site.name = 'FET' + site.save() + + +class CoreConfig(AppConfig): + name = 'core' + + def ready(self): + post_migrate.connect(update_default_site, sender=self) diff --git a/fet2020/core/forms.py b/fet2020/core/forms.py new file mode 100644 index 00000000..50005d42 --- /dev/null +++ b/fet2020/core/forms.py @@ -0,0 +1,11 @@ +from ckeditor_uploader.widgets import CKEditorUploadingWidget +from django import forms +from .models import CustomFlatPage + + +class FlatPageForm(forms.ModelForm): + class Meta: + model = CustomFlatPage + fields = '__all__' + + widgets = {"content": CKEditorUploadingWidget(config_name="default")} diff --git a/fet2020/core/migrations/0001_initial.py b/fet2020/core/migrations/0001_initial.py new file mode 100644 index 00000000..73cc4c8d --- /dev/null +++ b/fet2020/core/migrations/0001_initial.py @@ -0,0 +1,27 @@ +# Generated by Django 3.1.5 on 2021-05-13 13:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('flatpages', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CustomFlatPage', + fields=[ + ('flatpage_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='flatpages.flatpage')), + ], + options={ + 'verbose_name': 'Statische Webseite', + 'verbose_name_plural': 'Statische Webseiten', + }, + bases=('flatpages.flatpage',), + ), + ] diff --git a/fet2020/core/migrations/__init__.py b/fet2020/core/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/fet2020/core/models.py b/fet2020/core/models.py new file mode 100644 index 00000000..8b32b928 --- /dev/null +++ b/fet2020/core/models.py @@ -0,0 +1,18 @@ +from django.conf import settings +from django.contrib.flatpages.models import FlatPage +from django.contrib.sites.models import Site +from django.db import models + + +class CustomFlatPage(FlatPage): + + # Managers + objects = models.Manager() + + class Meta: + verbose_name = "Statische Webseite" + verbose_name_plural = "Statische Webseiten" + + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + self.sites.set([Site.objects.get(pk=settings.SITE_ID)]) diff --git a/fet2020/core/tests.py b/fet2020/core/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/fet2020/core/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/fet2020/core/views.py b/fet2020/core/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/fet2020/core/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/fet2020/documents/api.py b/fet2020/documents/api.py index b6fa2c47..d3e4bf04 100644 --- a/fet2020/documents/api.py +++ b/fet2020/documents/api.py @@ -63,13 +63,13 @@ def __checkPadExists(padID=None): return False -def createPadifNotExists(padID): +def createPadifNotExists(padID, text="helloworld"): if not __checkPadExists(padID=padID): with ep_client() as (epc, group): if not epc or not group: return None epc.createGroupPad( - groupID = group["groupID"], padName=padID, text="helloworld" + groupID = group["groupID"], padName=padID, text=text ) return padID diff --git a/fet2020/fet2020/settings.py b/fet2020/fet2020/settings.py index dd9a7e84..dce3ac71 100644 --- a/fet2020/fet2020/settings.py +++ b/fet2020/fet2020/settings.py @@ -66,7 +66,9 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "django.contrib.sites", "django.contrib.sitemaps", + "django.contrib.flatpages", "taggit", "ckeditor", "ckeditor_uploader", @@ -77,6 +79,7 @@ INSTALLED_APPS = [ "django_filters", "django_static_jquery_ui", "fontawesome-free", + "core.apps.CoreConfig", "posts.apps.PostsConfig", "members.apps.MembersConfig", "documents.apps.DocumentsConfig", @@ -94,6 +97,7 @@ MIDDLEWARE = [ "fet2020.middleware.FETHeaderMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "django.contrib.flatpages.middleware.FlatpageFallbackMiddleware", ] ROOT_URLCONF = "fet2020.urls" @@ -181,6 +185,10 @@ USE_TZ = True LOCALE_PATHS = [os.path.join(BASE_DIR, "locale")] +# Sites +SITE_ID = 1 + + # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ diff --git a/fet2020/fet2020/urls.py b/fet2020/fet2020/urls.py index 8f009383..06f0a0be 100644 --- a/fet2020/fet2020/urls.py +++ b/fet2020/fet2020/urls.py @@ -16,6 +16,10 @@ from members.viewsets import ( from rest_framework import routers from .sitemaps import sitemaps +from django.contrib import flatpages +from django.urls import re_path + + router = routers.DefaultRouter() router.register(r"posts", PostViewSet) router.register(r"members", MemberViewSet) @@ -38,10 +42,13 @@ urlpatterns = [ path("member/", include(member_urlpatterns), name="member"), path("blackboard/", include("blackboard.urls"), name="blackboard"), path("tasks/", include("tasks.urls"), name="tasks"), + path('pages/', include('django.contrib.flatpages.urls')), path( "sitemap.xml", sitemap, {"sitemaps": sitemaps}, name="django.contrib.sitemaps.views.sitemap", ), + re_path(r'^(?P.*/)$', flatpages.views.flatpage), + path('impressum/', flatpages.views.flatpage, {'url': '/impressum/'}, name='impressum'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/fet2020/members/views.py b/fet2020/members/views.py index fef04113..b3d7a884 100644 --- a/fet2020/members/views.py +++ b/fet2020/members/views.py @@ -4,7 +4,7 @@ from django.http import Http404 from django.shortcuts import render from collections import deque -from posts.models import Post +from core.models import CustomFlatPage from .models import Member, JobMember, JobGroup @@ -42,7 +42,7 @@ def index(request): pinned_job_groups, unpinned_job_groups = __get_job_groups() members = deque(Member.all_members.all()) - fs_info = Post.objects.filter(slug="fachschaft").first() + fs_info = CustomFlatPage.objects.filter(title__iexact="fachschaft").first() context = { "pinned_job_groups": pinned_job_groups, @@ -86,7 +86,7 @@ def members_view(request, filter=None): logger.info("Wrong member role '{}'".format(filter)) raise Http404("no member role") - fs_info = Post.objects.filter(slug="fachschaft").first() + fs_info = CustomFlatPage.objects.filter(title__iexact="fachschaft").first() context = { "pinned_job_groups": pinned_job_groups, diff --git a/fet2020/posts/forms.py b/fet2020/posts/forms.py index 619b27a2..4ab26c93 100644 --- a/fet2020/posts/forms.py +++ b/fet2020/posts/forms.py @@ -165,11 +165,18 @@ class FetMeetingForm(PostForm): class PostSearchForm(forms.Form): - year_of_first_post = Post.objects.get_queryset().last().public_date.year - years = range(year_of_first_post, timezone.now().date().year + 1) - - year_choices = [('', _('Alle'))] + [(i, i) for i in years] + year_choices = [('', _('Alle'))] month_choices = [('', _('Alle'))] + list(MONTHS.items()) + try: + first_post = Post.objects.get_queryset().last() + + if first_post: + year_of_first_post = first_post.public_date.year + years = range(year_of_first_post, timezone.now().date().year + 1) + year_choices += [(i, i) for i in years] + except: + pass + year = forms.ChoiceField(label="Jahr", choices=year_choices, required=False) month = forms.ChoiceField(label="Monat", choices=month_choices, required=False) diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 865396d9..f6a52cee 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -1,15 +1,18 @@ import re import logging -from urllib.request import URLError + from datetime import timedelta from django.contrib.auth.models import User from django.core.validators import ValidationError from django.db import models +from django.template.loader import render_to_string from django.urls import reverse from django.utils import timezone from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from taggit.managers import TaggableManager + +from core.models import CustomFlatPage from documents import getPadHTML, setPadHTML, createPadifNotExists from .managers import ( PostManager, @@ -26,7 +29,14 @@ request_logger = logging.getLogger("django.request") def create_pad_for_post(slug, typ="agenda"): "Creates a Etherpad Pad and returns EtherpadKey" - return createPadifNotExists(slug + "-" + typ) + padID = createPadifNotExists(slug + "-" + typ) + + if padID: + page = CustomFlatPage.objects.filter(title__iexact=typ).first() + if page: + setPadHTML(padID, page.content) + + return padID class Category(models.Model): diff --git a/fet2020/templates/blackboard/index.html b/fet2020/templates/blackboard/index.html index 670d9361..3c4a0f70 100644 --- a/fet2020/templates/blackboard/index.html +++ b/fet2020/templates/blackboard/index.html @@ -6,11 +6,11 @@

Blackboard

{% if bb_info %} - {{ bb_info.body|safe }} + {{ bb_info.content|safe }} {% endif %} {% if bb_empty and not job_postings %} - {{ bb_empty.body|safe }} + {{ bb_empty.content|safe }} {% endif %}
diff --git a/fet2020/templates/flatpages/default.html b/fet2020/templates/flatpages/default.html new file mode 100644 index 00000000..0cc13ab1 --- /dev/null +++ b/fet2020/templates/flatpages/default.html @@ -0,0 +1,8 @@ +{% extends 'layout.html' %} +{% block content %} + +
+{{ flatpage.content }} +
+ +{% endblock %} diff --git a/fet2020/templates/flatpages/social_media.html b/fet2020/templates/flatpages/social_media.html new file mode 100644 index 00000000..42622fc5 --- /dev/null +++ b/fet2020/templates/flatpages/social_media.html @@ -0,0 +1,68 @@ +{% extends 'layout.html' %} +{% block content %} + + + +{% endblock %} diff --git a/fet2020/templates/layout.html b/fet2020/templates/layout.html index c171253e..90f89e18 100644 --- a/fet2020/templates/layout.html +++ b/fet2020/templates/layout.html @@ -82,7 +82,7 @@