From 8f93ea1b3744e398ca0d0098f87f844c224ba5f2 Mon Sep 17 00:00:00 2001
From: Christian Merten
Date: Sun, 9 Apr 2023 14:53:30 +0200
Subject: [PATCH] startpage: add copy of jdav-hd website, add post module
---
jdav_web/jdav_web/settings/components/base.py | 42 ++
jdav_web/jdav_web/urls.py | 9 +-
jdav_web/members/admin.py | 3 +-
.../0012_member_image_group_description.py | 29 ++
jdav_web/members/models.py | 9 +
.../members/register_waiting_list.html | 12 +-
jdav_web/members/views.py | 2 +-
jdav_web/startpage/admin.py | 25 +-
jdav_web/startpage/migrations/0001_initial.py | 77 ++++
jdav_web/startpage/migrations/__init__.py | 0
jdav_web/startpage/models.py | 101 ++++-
.../startpage/templates/startpage/404.html | 13 +
.../startpage/templates/startpage/500.html | 11 +
.../templates/startpage/aktuelles.html | 21 +
.../startpage/templates/startpage/base.html | 27 ++
.../templates/startpage/base_subsite.html | 5 +
.../startpage/templates/startpage/footer.html | 5 +
.../templates/startpage/gruppen.html | 21 +
.../templates/startpage/gruppen/detail.html | 14 +
.../templates/startpage/gruppen/faq.html | 44 +++
.../startpage/templates/startpage/header.html | 9 +
.../templates/startpage/header_small.html | 8 +
.../templates/startpage/impressum.html | 369 ++++++++++++++++++
.../startpage/templates/startpage/index.html | 32 +-
.../startpage/jugendleiterinnen.html | 8 +
.../templates/startpage/navigation.html | 126 ++++++
.../templates/startpage/people_grid.html | 23 ++
.../startpage/templates/startpage/post.html | 19 +
.../startpage/post_people_detail.html | 26 ++
.../templates/startpage/post_people_grid.html | 25 ++
.../templates/startpage/section.html | 11 +
.../startpage/templatetags/markdown_extras.py | 49 +++
jdav_web/startpage/urls.py | 10 +-
jdav_web/startpage/views.py | 96 ++++-
jdav_web/static/startpage/css/base.css | 342 ++++++++++++++++
jdav_web/static/startpage/css/fonts.css | 27 ++
jdav_web/static/startpage/css/people_grid.css | 49 +++
.../fonts/oswald-v49-latin-regular.eot | Bin 0 -> 11161 bytes
.../fonts/oswald-v49-latin-regular.svg | 312 +++++++++++++++
.../fonts/oswald-v49-latin-regular.ttf | Bin 0 -> 20852 bytes
.../fonts/oswald-v49-latin-regular.woff | Bin 0 -> 12732 bytes
.../fonts/oswald-v49-latin-regular.woff2 | Bin 0 -> 9840 bytes
.../fonts/roboto-v30-latin-regular.eot | Bin 0 -> 17833 bytes
.../fonts/roboto-v30-latin-regular.svg | 308 +++++++++++++++
.../fonts/roboto-v30-latin-regular.ttf | Bin 0 -> 36216 bytes
.../fonts/roboto-v30-latin-regular.woff | Bin 0 -> 20344 bytes
.../fonts/roboto-v30-latin-regular.woff2 | Bin 0 -> 15744 bytes
jdav_web/static/startpage/img/background.jpeg | Bin 0 -> 142672 bytes
jdav_web/static/startpage/img/jdav_logo.png | Bin 0 -> 8843 bytes
jdav_web/static/startpage/img/placeholder.jpg | Bin 0 -> 7467 bytes
jdav_web/templates/general/base.html | 44 +--
51 files changed, 2307 insertions(+), 56 deletions(-)
create mode 100644 jdav_web/members/migrations/0012_member_image_group_description.py
create mode 100644 jdav_web/startpage/migrations/0001_initial.py
create mode 100644 jdav_web/startpage/migrations/__init__.py
create mode 100644 jdav_web/startpage/templates/startpage/404.html
create mode 100644 jdav_web/startpage/templates/startpage/500.html
create mode 100644 jdav_web/startpage/templates/startpage/aktuelles.html
create mode 100644 jdav_web/startpage/templates/startpage/base.html
create mode 100644 jdav_web/startpage/templates/startpage/base_subsite.html
create mode 100644 jdav_web/startpage/templates/startpage/footer.html
create mode 100644 jdav_web/startpage/templates/startpage/gruppen.html
create mode 100644 jdav_web/startpage/templates/startpage/gruppen/detail.html
create mode 100644 jdav_web/startpage/templates/startpage/gruppen/faq.html
create mode 100644 jdav_web/startpage/templates/startpage/header.html
create mode 100644 jdav_web/startpage/templates/startpage/header_small.html
create mode 100644 jdav_web/startpage/templates/startpage/impressum.html
create mode 100644 jdav_web/startpage/templates/startpage/jugendleiterinnen.html
create mode 100644 jdav_web/startpage/templates/startpage/navigation.html
create mode 100644 jdav_web/startpage/templates/startpage/people_grid.html
create mode 100644 jdav_web/startpage/templates/startpage/post.html
create mode 100644 jdav_web/startpage/templates/startpage/post_people_detail.html
create mode 100644 jdav_web/startpage/templates/startpage/post_people_grid.html
create mode 100644 jdav_web/startpage/templates/startpage/section.html
create mode 100644 jdav_web/startpage/templatetags/markdown_extras.py
create mode 100644 jdav_web/static/startpage/css/base.css
create mode 100644 jdav_web/static/startpage/css/fonts.css
create mode 100644 jdav_web/static/startpage/css/people_grid.css
create mode 100644 jdav_web/static/startpage/fonts/oswald-v49-latin-regular.eot
create mode 100644 jdav_web/static/startpage/fonts/oswald-v49-latin-regular.svg
create mode 100644 jdav_web/static/startpage/fonts/oswald-v49-latin-regular.ttf
create mode 100644 jdav_web/static/startpage/fonts/oswald-v49-latin-regular.woff
create mode 100644 jdav_web/static/startpage/fonts/oswald-v49-latin-regular.woff2
create mode 100644 jdav_web/static/startpage/fonts/roboto-v30-latin-regular.eot
create mode 100644 jdav_web/static/startpage/fonts/roboto-v30-latin-regular.svg
create mode 100644 jdav_web/static/startpage/fonts/roboto-v30-latin-regular.ttf
create mode 100644 jdav_web/static/startpage/fonts/roboto-v30-latin-regular.woff
create mode 100644 jdav_web/static/startpage/fonts/roboto-v30-latin-regular.woff2
create mode 100644 jdav_web/static/startpage/img/background.jpeg
create mode 100644 jdav_web/static/startpage/img/jdav_logo.png
create mode 100644 jdav_web/static/startpage/img/placeholder.jpg
diff --git a/jdav_web/jdav_web/settings/components/base.py b/jdav_web/jdav_web/settings/components/base.py
index f004e1d..bbb8945 100644
--- a/jdav_web/jdav_web/settings/components/base.py
+++ b/jdav_web/jdav_web/settings/components/base.py
@@ -46,6 +46,8 @@ INSTALLED_APPS = [
'finance.apps.FinanceConfig',
'ludwigsburgalpin.apps.LudwigsburgalpinConfig',
#'easy_select2',
+ 'markdownify.apps.MarkdownifyConfig',
+ 'markdownx',
'djcelery_email',
'nested_admin',
'django_celery_beat',
@@ -146,3 +148,43 @@ PASSWORD_HASHERS = [
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.ScryptPasswordHasher',
]
+
+MARKDOWNIFY = {
+ 'default': {
+ "WHITELIST_TAGS": [
+ 'img',
+ 'abbr',
+ 'acronym',
+ 'a',
+ 'b',
+ 'blockquote',
+ 'em',
+ 'i',
+ 'li',
+ 'ol',
+ 'p',
+ 'strong',
+ 'ul',
+ 'br',
+ 'code',
+ 'span',
+ 'div', 'class',
+ 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
+ ],
+ "WHITELIST_ATTRS": [
+ 'src',
+ 'href',
+ 'style',
+ 'alt',
+ 'class',
+ ],
+ "LINKIFY_TEXT": {
+ "PARSE_URLS": True,
+
+ # Next key/value-pairs only have effect if "PARSE_URLS" is True
+ "PARSE_EMAIL": True,
+ "CALLBACKS": [],
+ "SKIP_TAGS": [],
+ }
+ }
+}
diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py
index 581d4fc..53fdae7 100644
--- a/jdav_web/jdav_web/urls.py
+++ b/jdav_web/jdav_web/urls.py
@@ -34,10 +34,17 @@ urlpatterns += i18n_patterns(
re_path(r'^members/', include('members.urls', namespace="members")),
re_path(r'^LBAlpin/Programm(/)?(20)?[0-9]{0,2}', include('ludwigsburgalpin.urls',
namespace="ludwigsburgalpin")),
- re_path(r'^$', include('startpage.urls', namespace="startpage")),
re_path(r'^_nested_admin/', include('nested_admin.urls')),
+ re_path(r'^', include('startpage.urls', namespace="startpage")),
)
+urlpatterns += [
+ re_path(r'^markdownx/', include('markdownx.urls')),
+]
+
+handler404 = 'startpage.views.handler404'
+handler500 = 'startpage.views.handler500'
+
# TODO: django serving from MEDIA_URL should be disabled in production stage
# see
# http://stackoverflow.com/questions/5871730/need-a-minimal-django-file-upload-example
diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py
index 755e279..879600c 100644
--- a/jdav_web/members/admin.py
+++ b/jdav_web/members/admin.py
@@ -159,6 +159,7 @@ class MemberAdmin(CommonAdminMixin, admin.ModelAdmin):
'medication', 'tetanus_vaccination', 'photos_may_be_taken', 'legal_guardians',
('good_conduct_certificate_presented_date', 'good_conduct_certificate_presentation_needed'),
'iban', 'has_key', 'has_free_ticket_gym', 'gets_newsletter', 'registered', 'registration_form',
+ 'image',
'active', 'echoed',
('join_date', 'leave_date'),
'comments', 'technical_comments',
@@ -456,7 +457,7 @@ class GroupAdminForm(forms.ModelForm):
class GroupAdmin(CommonAdminMixin, admin.ModelAdmin):
- fields = ['name', 'year_from', 'year_to', 'leiters']
+ fields = ['name', 'description', 'year_from', 'year_to', 'leiters', 'show_website']
form = GroupAdminForm
list_display = ('name', 'year_from', 'year_to')
inlines = [RegistrationPasswordInline, PermissionOnGroupInline]
diff --git a/jdav_web/members/migrations/0012_member_image_group_description.py b/jdav_web/members/migrations/0012_member_image_group_description.py
new file mode 100644
index 0000000..91130af
--- /dev/null
+++ b/jdav_web/members/migrations/0012_member_image_group_description.py
@@ -0,0 +1,29 @@
+# Generated by Django 4.0.1 on 2023-04-09 11:46
+
+from django.db import migrations, models
+import utils
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('members', '0011_alter_freizeit_date_alter_freizeit_end'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='group',
+ name='description',
+ field=models.TextField(blank=True, default='', verbose_name='description'),
+ ),
+ migrations.AddField(
+ model_name='group',
+ name='show_website',
+ field=models.BooleanField(default=False, verbose_name='show on website'),
+ ),
+ migrations.AddField(
+ model_name='member',
+ name='image',
+ field=utils.RestrictedFileField(blank=True, upload_to='people', verbose_name='image'),
+ ),
+ ]
diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py
index aad93fe..a59bd80 100644
--- a/jdav_web/members/models.py
+++ b/jdav_web/members/models.py
@@ -55,6 +55,8 @@ class Group(models.Model):
e.g: J1, J2, Jugendleiter, etc.
"""
name = models.CharField(max_length=50, verbose_name=_('name')) # e.g: J1
+ description = models.TextField(verbose_name=_('description'), default='', blank=True)
+ show_website = models.BooleanField(verbose_name=_('show on website'), default=False)
year_from = models.IntegerField(verbose_name=_('lowest year'), default=2010)
year_to = models.IntegerField(verbose_name=_('highest year'), default=2011)
leiters = models.ManyToManyField('members.Member', verbose_name=_('youth leaders'),
@@ -214,6 +216,13 @@ class Member(Person):
'image/jpeg',
'image/png',
'image/gif'])
+ image = RestrictedFileField(verbose_name=_('image'),
+ upload_to='people',
+ blank=True,
+ max_upload_size=5242880,
+ content_types=['image/jpeg',
+ 'image/png',
+ 'image/gif'])
echo_key = models.CharField(max_length=32, default="")
echo_expire = models.DateTimeField(default=timezone.now)
echoed = models.BooleanField(default=True, verbose_name=_('Echoed'))
diff --git a/jdav_web/members/templates/members/register_waiting_list.html b/jdav_web/members/templates/members/register_waiting_list.html
index a178316..a9668e6 100644
--- a/jdav_web/members/templates/members/register_waiting_list.html
+++ b/jdav_web/members/templates/members/register_waiting_list.html
@@ -10,9 +10,17 @@
-{% trans "Register for waiting list" %}
+Anmeldung
-{% trans "Here you can register for the waiting list." %}
+
+Da wir durch das Engagment unserer ehrenamtlichen Jugendleitern, aber auch die Kletterhalle sowie Ausrüstung limitiert sind können wir nur eine begrenzte Anzahl an Plätzen in den Gruppen anbieten. Damit alle eine faire Changce auf einen Gruppenplatz bekommen, führen wir für die jüngeren Klettergruppen eine gemeinsame Liste. Soblad Plätze frei werden oder eine neue Gruppe gegründet wird seid ihr an der Reihe! Dennoch kann die Wartezeit leider zwischen wenigen Wochen und über einem Jahr variieren.
+
+
+
+Die Anmeldung für die Gruppen JuMa ,
+Klettertreff und
+Mountainbike laufen separat.
+
{% if error_message %}
{{ error_message }}
diff --git a/jdav_web/members/views.py b/jdav_web/members/views.py
index 0b5cd97..158095a 100644
--- a/jdav_web/members/views.py
+++ b/jdav_web/members/views.py
@@ -1,4 +1,4 @@
-from django.shortcuts import render
+from startpage.views import render
from django.utils.translation import gettext_lazy as _
from django.http import HttpResponseRedirect
from django.forms import ModelForm, TextInput, DateInput
diff --git a/jdav_web/startpage/admin.py b/jdav_web/startpage/admin.py
index 8c38f3f..c1dcd06 100644
--- a/jdav_web/startpage/admin.py
+++ b/jdav_web/startpage/admin.py
@@ -1,3 +1,26 @@
from django.contrib import admin
-# Register your models here.
+from .models import Post, Image, Section, MemberOnPost
+
+
+class ImageInline(admin.TabularInline):
+ model = Image
+ extra = 0
+
+
+class MemberOnPostInline(admin.TabularInline):
+ model = MemberOnPost
+ extra = 0
+
+
+@admin.register(Post)
+class PostAdmin(admin.ModelAdmin):
+ inlines = [ImageInline, MemberOnPostInline]
+ list_display = ['title', 'date', 'section', 'absolute_urlname']
+ list_filter = ['section']
+ search_fields = ['title']
+
+
+@admin.register(Section)
+class SectionAdmin(admin.ModelAdmin):
+ list_display = ['title', 'absolute_urlname']
diff --git a/jdav_web/startpage/migrations/0001_initial.py b/jdav_web/startpage/migrations/0001_initial.py
new file mode 100644
index 0000000..a867c0f
--- /dev/null
+++ b/jdav_web/startpage/migrations/0001_initial.py
@@ -0,0 +1,77 @@
+# Generated by Django 4.0.1 on 2023-04-09 12:11
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import markdownx.models
+import utils
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('members', '0012_member_image_group_description'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Section',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=50, verbose_name='Title')),
+ ('urlname', models.CharField(max_length=25, verbose_name='URL')),
+ ('website_text', markdownx.models.MarkdownxField(blank=True, default='', verbose_name='website text')),
+ ],
+ options={
+ 'verbose_name': 'Section',
+ 'verbose_name_plural': 'Sections',
+ 'unique_together': {('urlname',)},
+ },
+ ),
+ migrations.CreateModel(
+ name='Post',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(default='', max_length=50, verbose_name='Title')),
+ ('urlname', models.CharField(default='', max_length=50, verbose_name='URL')),
+ ('date', models.DateField(blank=True, default=django.utils.timezone.localdate, null=True, verbose_name='Date')),
+ ('website_text', markdownx.models.MarkdownxField(blank=True, default='', verbose_name='website text')),
+ ('detailed', models.BooleanField(default=False, verbose_name='detailed')),
+ ('groups', models.ManyToManyField(blank=True, to='members.Group', verbose_name='Groups')),
+ ('section', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='startpage.section', verbose_name='section')),
+ ],
+ options={
+ 'verbose_name': 'Post',
+ 'verbose_name_plural': 'Posts',
+ 'unique_together': {('section', 'urlname')},
+ },
+ ),
+ migrations.CreateModel(
+ name='MemberOnPost',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('description', models.TextField(blank=True, default='', verbose_name='Description')),
+ ('tag', models.CharField(blank=True, default='', max_length=20, verbose_name='Tag')),
+ ('members', models.ManyToManyField(blank=True, to='members.Member', verbose_name='Member')),
+ ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='people', to='startpage.post', verbose_name='Member')),
+ ],
+ options={
+ 'verbose_name': 'Person',
+ 'verbose_name_plural': 'Persons',
+ },
+ ),
+ migrations.CreateModel(
+ name='Image',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('f', utils.RestrictedFileField(blank=True, upload_to='images', verbose_name='file')),
+ ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startpage.post')),
+ ],
+ options={
+ 'verbose_name': 'image',
+ 'verbose_name_plural': 'images',
+ },
+ ),
+ ]
diff --git a/jdav_web/startpage/migrations/__init__.py b/jdav_web/startpage/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/jdav_web/startpage/models.py b/jdav_web/startpage/models.py
index 71a8362..01fda7a 100644
--- a/jdav_web/startpage/models.py
+++ b/jdav_web/startpage/models.py
@@ -1,3 +1,102 @@
+import os
+
from django.db import models
+from django.utils.translation import gettext_lazy as _
+from django.utils import timezone
+from django.urls import reverse
+from utils import RestrictedFileField
+from members.models import Group, Member
+
+from markdownx.models import MarkdownxField
+
+
+class Section(models.Model):
+ """
+ A section of the website.
+ """
+ title = models.CharField(verbose_name=_('Title'), max_length=50)
+ urlname = models.CharField(verbose_name=_('URL'), max_length=25)
+ website_text = MarkdownxField(verbose_name=_('website text'), default='', blank=True)
+
+ class Meta:
+ verbose_name = _('Section')
+ verbose_name_plural = _('Sections')
+ unique_together = ['urlname']
+
+ def __str__(self):
+ return self.title
+
+ def absolute_urlname(self):
+ return reverse('startpage:section', args=(self.urlname,))
+ absolute_urlname.short_description = 'URL'
+
+
+class Post(models.Model):
+ """
+ A post with title, markdown and images.
+ """
+ title = models.CharField(verbose_name=_('Title'), default='', max_length=50)
+ urlname = models.CharField(verbose_name=_('URL'), default='', max_length=50)
+ date = models.DateField(default=timezone.localdate, verbose_name=_('Date'), null=True, blank=True)
+ website_text = MarkdownxField(verbose_name=_('website text'), default='', blank=True)
+
+ groups = models.ManyToManyField(Group, verbose_name=_('Groups'), blank=True)
+ detailed = models.BooleanField(verbose_name=_('detailed'), default=False)
+
+ section = models.ForeignKey(Section, verbose_name=_('section'), on_delete=models.SET_NULL, null=True, blank=True)
+
+ def __str__(self):
+ """String represenation"""
+ return self.title
+
+ class Meta:
+ verbose_name = _("Post")
+ verbose_name_plural = _("Posts")
+ unique_together = ['section', 'urlname']
+
+ def absolute_section(self):
+ if self.section is None:
+ return 'Aktuelles'
+ else:
+ return self.section.title
+ absolute_section.short_description = _('Section')
+
+ def absolute_urlname(self):
+ if self.section is None:
+ return reverse('startpage:post', args=('aktuelles', self.urlname))
+ else:
+ return reverse('startpage:post', args=(self.section.urlname, self.urlname))
+ absolute_urlname.short_description = 'URL'
+
+
+class Image(models.Model):
+ """
+ An image on a post.
+ """
+ post = models.ForeignKey(Post, on_delete=models.CASCADE)
+ # file (not naming it file because of builtin)
+ f = RestrictedFileField(_('file'),
+ upload_to='images',
+ blank=True,
+ max_upload_size=10485760)
+
+ def __str__(self):
+ return os.path.basename(self.f.name) if self.f.name else _("Empty")
+
+ class Meta:
+ verbose_name = _('image')
+ verbose_name_plural = _('images')
+
+
+class MemberOnPost(models.Model):
+ """
+ One or multiple members on a post.
+ """
+ members = models.ManyToManyField(Member, verbose_name=_('Member'), blank=True)
+ post = models.ForeignKey(Post, verbose_name=_('Member'), on_delete=models.CASCADE, related_name='people')
+ description = models.TextField(_('Description'), default='', blank=True)
+ tag = models.CharField(_('Tag'), max_length=20, default='', blank=True)
-# Create your models here.
+ class Meta:
+ verbose_name = _("Person")
+ verbose_name_plural = _("Persons")
diff --git a/jdav_web/startpage/templates/startpage/404.html b/jdav_web/startpage/templates/startpage/404.html
new file mode 100644
index 0000000..1e1880c
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/404.html
@@ -0,0 +1,13 @@
+{% extends "startpage/base_subsite.html" %}
+
+{% block content %}
+Seite nicht gefunden
+
+
+Bitte entschuldigen Sie, wir konnten die gewünschte Seite nicht finden.
+
+
+Zurück zur Startseite .
+
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/500.html b/jdav_web/startpage/templates/startpage/500.html
new file mode 100644
index 0000000..7eb0c41
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/500.html
@@ -0,0 +1,11 @@
+{% extends "startpage/base_subsite.html" %}
+
+{% block content %}
+Interner Fehler aufgetreten
+
+
+Bitte entschuldigen Sie, bei Ihrer Anfrage ist leider ein unerwarteter Fehler aufgetreten. Der Serveradministrator
+wurde bereits verständigt.
+
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/aktuelles.html b/jdav_web/startpage/templates/startpage/aktuelles.html
new file mode 100644
index 0000000..d33b37c
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/aktuelles.html
@@ -0,0 +1,21 @@
+{% extends "startpage/base_subsite.html" %}
+{% load static %}
+{% load markdownify %}
+{% load markdown_extras %}
+
+{% block content %}
+Aktuelles
+
+{% for post in posts %}
+
+
+
{{ post.title }}
+
+ {{ post.website_text|markdownify|truncatechars:200 }}
+ weiterlesen
+
+
+
+{% endfor %}
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/base.html b/jdav_web/startpage/templates/startpage/base.html
new file mode 100644
index 0000000..05414ba
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/base.html
@@ -0,0 +1,27 @@
+{% load static %}
+
+
+
+ {% block title %}{% endblock %}
+
+
+
+
+
+
+
+ {% include "startpage/navigation.html" %}
+
+
+ {% block header %}
+ {% include "startpage/header.html" %}
+ {% endblock %}
+
+
+ {% block content %}{% endblock %}
+
+
+
+ {% include "startpage/footer.html" %}
+
+
diff --git a/jdav_web/startpage/templates/startpage/base_subsite.html b/jdav_web/startpage/templates/startpage/base_subsite.html
new file mode 100644
index 0000000..d498ef5
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/base_subsite.html
@@ -0,0 +1,5 @@
+{% extends "startpage/base.html" %}
+
+{% block header %}
+{% include "startpage/header_small.html" %}
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/footer.html b/jdav_web/startpage/templates/startpage/footer.html
new file mode 100644
index 0000000..765c1fa
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/footer.html
@@ -0,0 +1,5 @@
+
diff --git a/jdav_web/startpage/templates/startpage/gruppen.html b/jdav_web/startpage/templates/startpage/gruppen.html
new file mode 100644
index 0000000..ae94fc5
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/gruppen.html
@@ -0,0 +1,21 @@
+{% extends "startpage/base_subsite.html" %}
+
+{% block content %}
+Gruppen
+
+
+Die JDAV Heidelberg bietet verschiedene Gruppen für die Jugend bis 27 Jahre an. Die meisten Gruppen klettern regelmäßig in der Halle und Draußen, aber auch allgemeine Ausfahrten, Wintersport, Hochtouren und Mountenbiken gehöhren zu den Aktivitäten. Nachfolgend findest du eine Übersicht aller Gruppen. Die Teilnahme an den Gruppen erfordert generell eine vorherigen Anmledung, auch wenn Zeit und Ort bekannt sein sollte bitten wir dich nicht einfach dort zu erscheinen.
+
+
+Zur Zeit bieten wir die Folgenden Gruppen an:
+
+
+
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/gruppen/detail.html b/jdav_web/startpage/templates/startpage/gruppen/detail.html
new file mode 100644
index 0000000..fdd63d2
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/gruppen/detail.html
@@ -0,0 +1,14 @@
+{% extends "startpage/base_subsite.html" %}
+
+{% block content %}
+{{ group.name }}
+
+
+{{ group.description }}
+
+
+Gruppenleitung
+
+{% include "startpage/people_grid.html" %}
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/gruppen/faq.html b/jdav_web/startpage/templates/startpage/gruppen/faq.html
new file mode 100644
index 0000000..1dc29cc
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/gruppen/faq.html
@@ -0,0 +1,44 @@
+{% extends "startpage/base_subsite.html" %}
+
+{% block content %}
+FAQ
+
+Ab welchem Alter kann ich mein Kind zu den Jugendgruppen anmelden?
+
+Unsere Jugendgruppen sind ab einem Alter von 9 Jahren. Sie können ihr Kind gerne bereits früher auf die Liste setzen, um die Wartezeit zu verkürzen, sobald ihr Kind das entsprechende Alter erreicht hat.
+
+Wie lange sind die Wartezeiten?
+
+
+Leider haben wir eine sehr große Nachfrage, der wir mit unseren Jugendleiter:innen und unseren Gruppenplätzen nicht nachkommen können. Die Wartezeiten sind sehr unterscheidlich und hängen vom Alter und den verfügbaren Gruppenplätzen ab. Die Wartezeiten kann zwischen einigen Wochen und mehr als einem Jahr liegen.
+
+
+Muss mein Kind DAV Mitglied sein?
+
+
+Ja. Sobald ihr Kind regelmäßig an den Gruppenstunden teilnimmt, muss es Mitglied im DAV Heidelberg sein. Für die Aufnahme in die Warteliste ist keine Mitgliedschaft notwenig.
+
+
+Was kostet die Teilnahme an den Jugendgruppen?
+
+
+Die Jugendgruppen an sich sind kostenlos, allerdings ist eine Vereinsmitgliedschaft und der Halleneintritt nötig. Der Beitrag setzt sich aus zwei Teilen zusammen:
+
+
+
+
+ Mitgliedschaft im DAV Heidelberg
+ (Zu den Preisen )
+
+
+ Halbjahreskarte für den Kletterhalleneintritt während der Gruppenstunden: 25 Euro (Bei zwei Gruppenstunden pro Woche 30 Euro)
+
+
+
+Benötigt mein Kind eine Ausrüstung?
+
+
+Während der Gruppenstunden können die Kinder das Material (Klettergurt, Schuhe, Sicherungsgerät, … ) ohne zusätzliche Kosten von der Jugend des DAV Heidelberg ausleihen.
+
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/header.html b/jdav_web/startpage/templates/startpage/header.html
new file mode 100644
index 0000000..02ab273
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/header.html
@@ -0,0 +1,9 @@
+
diff --git a/jdav_web/startpage/templates/startpage/header_small.html b/jdav_web/startpage/templates/startpage/header_small.html
new file mode 100644
index 0000000..0651a69
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/header_small.html
@@ -0,0 +1,8 @@
+
diff --git a/jdav_web/startpage/templates/startpage/impressum.html b/jdav_web/startpage/templates/startpage/impressum.html
new file mode 100644
index 0000000..eb31dc1
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/impressum.html
@@ -0,0 +1,369 @@
+{% extends "startpage/base_subsite.html" %}
+{% load static %}
+
+{% block content %}
+
+Impressum
+
+Anbieter
+
+
+Deutscher Alpenverein Sektion Heidelberg 1869 e.V.
+Jugendreferat
+Harbigweg 20
+69124 Heidelberg, Deutschland
+Tel.: +49 (62 21) 48 40 76
+Fax: +49 (62 21) 43 73 38
+E-Mail: geschaeftsstelle@alpenverein-heidelberg.de
+URL: www.alpenverein-heidelberg.de
+
+
+Vertretungsberechtigter
+
+
+Der Deutsche Alpenverein Sektion Heidelberg 1869 wird durch den ersten Vorsitzenden, den zweiten Vorsitzenden und den Schatzmeister vertreten:
+
+
+
+Dr. Ulf Gieseler (1. Vorsitzender), Paul Jonas (2. Vorsitzender), Marc von der Heydt (Schatzmeister)
+(gemäß § 14 Satz der Satzung des Deutschen Alpenvereins Sektion Heidelberg 1869)
+
+
+Vereinsregister
+
+
+Der Deutsche Alpenverein Sektion Heidelberg 1869 e.V. ist im Vereinsregister des Amtsgerichts Heidelberg unter der Registernummer VR 486 eingetragen.
+
+
+Jugendreferat
+
+
+Leitung: Eva Engelmann und Robert Scheffler (kommissarisch)
+E-Mail: jugend@alpenverein-heidelberg.de
+URL: www.jdav-hd.de ; www.jdav-heidelberg.de
+
+
+
+Haftungsausschluss ; Disclaimer
+
+
+
+Datenschutzerklärung
+
+1. Wer für Ihre personenbezogenen Daten verantwortlich ist:
+
+
+Diese Datenschutz-Information gilt für die Datenverarbeitung durch:
+
+
+
+Verantwortlicher: Deutscher Alpenverein Sektion Heidelberg 1869 e.V.
+Harbigweg 20, 69124 Heidelberg
+Email: alpenverein-heidelberg@t-online.de
+Telefon: +49 6221 484076
+
+
+
+Zur Auftragsverarbeitung für die jdav Heidelberg ist die Firma reeweb AG Wettsteinplatz 74058 Basel Schweiz beauftragt. Die Datenverarbeitung erfolgt in Rechenzentren in der Schweiz oder Staaten des Europäischen Wirtschaftsraums (EWR).
+
+
+
+2. Welche personenbezogenen Daten wir von Ihnen erheben und zu welchem Zweck das geschieht:
+
+
+
+Beim Aufrufen unserer Website jdav-hd.merten.dev werden durch den auf Ihrem Endgerät zum Einsatz kommenden Browser automatisch Informationen an den Server unserer Website gesendet. Diese Informationen werden temporär in einem sog. Logfile gespeichert. Folgende Informationen werden dabei ohne Ihr Zutun erfasst und bis zur automatischen Löschung gespeichert:
+
+
+
+
+ IP-Adresse des anfragenden Rechners,
+ Datum und Uhrzeit des Zugriffs,
+ Name und URL der abgerufenen Datei,
+ Website, von der aus der Zugriff erfolgt (Referrer-URL),
+ verwendeter Browser und ggfs. das Betriebssystem Ihres Rechners sowie der Name Ihres Access-Providers.
+
+
+
+
+Die genannten Daten werden durch uns zu folgenden Zwecken verarbeitet:
+
+
+ Gewährleistung eines reibungslosen Verbindungsaufbaus der Website,
+ Gewährleistung einer komfortablen Nutzung unserer Website,
+ Auswertung der Systemsicherheit und -stabilität sowie
+ zu weiteren administrativen Zwecken.
+
+
+
+
+Die Rechtsgrundlage für die Datenverarbeitung ist Art. 6 Abs. 1 S. 1 lit. f DSGVO. Unser berechtigtes Interesse folgt aus oben aufgelisteten Zwecken zur Datenerhebung. In keinem Fall verwenden wir die erhobenen Daten zu dem Zweck, Rückschlüsse auf Ihre Person zu ziehen.
+
+
+
+Darüber hinaus setzen wir beim Besuch unserer Website Cookies ein. Nähere Erläuterungen dazu erhalten Sie unter den Ziff. 4 dieser Datenschutzerklärung.
+
+
+3. Welche Daten wir zu welchem Zweck weitergeben:
+
+
+Eine Übermittlung Ihrer persönlichen Daten an Dritte zu anderen als den im Folgenden aufgeführten Zwecken findet nicht statt.
+
+
+a) Weitergabe von Daten, die wir im Rahmen Ihres Besuchs unserer Website erheben:
+
+
+Wir geben Ihre persönlichen Daten nur an Dritte weiter, wenn:
+
+
+
+ Sie nach Art. 6 Abs. 1 S. 1 lit. a DSGVO Ihre ausdrückliche Einwilligung dazu erteilt haben,
+ Sie externe Komponenten auf unserer Website aufrufen, nach Art. 6 Abs. 1 S. 1 lit. f zur Darstellung der externen Komponenten der Anbieter google.com (Google Inc, 1600 Amphitheatre Parkway Mountain View, CA 94043, USA), jquery.com (JSFoundation, Inc., 1 Letterman Drive San Francisco, CA 94129, USA), openlayers.org, getmdl.io (google), (Google Inc, 1600 Amphitheatre Parkway Mountain View, CA 94043, USA) cdn.polyfill.io, openstreetmap.org sowie opentopomap.org,
+ die Weiterleitung nach Art. 6 Abs. 1 S. 1 lit. f DSGVO zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich ist und kein Grund zur Annahme besteht, dass Sie ein überwiegendes schutzwürdiges Interesse an der Nichtweitergabe Ihrer Daten haben,
+ für den Fall, dass für die Weitergabe nach Art. 6 Abs. 1 S. 1 lit. c DSGVO eine gesetzliche Verpflichtung besteht, sowie
+ dies gesetzlich zulässig und nach Art. 6 Abs. 1 S. 1 lit. b DSGVO für die Abwicklung von Vertragsverhältnissen mit Ihnen erforderlich ist.
+
+
+b) Weitergabe Ihrer Daten im Rahmen unserer Vereinstätigkeit
+
+
+Zur Weitergabe der Daten im Rahmen einer Mitgliedschaft im Alpenverein Heidelberg beachten Sie bitte auch die Datenschutzerklärung der Sektion unter www.alpenverein-heidelberg.de/datenschutz .
+
+
+
+Die jdav Heidelberg hat die Firma reeweb AG Wettsteinplatz 74058 Basel Schweiz beauftragt die Daten ihrer Mitglieder zu verwalten. Diese Datenverarbeitung erfolgt in Rechenzentren in der Schweiz oder Staaten des Europäischen Wirtschaftsraums (EWR).
+
+
+
+Die von Ihnen in Ihrer Beitrittserklärung angegebenen Daten über Ihre persönlichen und sachlichen Verhältnisse (sogenannte personenbezogene Daten) werden gleichermaßen auf Datenverarbeitungs-Systemen der Sektion, der Sie beitreten, wie auch des Bundesverbandes des Deutschen Alpenvereins (DAV) gespeichert und für Verwaltungszwecke der Sektion, bzw. des Bundesverbandes verarbeitet und genutzt werden. Verantwortliche Stelle im Sinne des § 3 (7) BDSG bzw. Art. 4 lit 7. DSGVO ist dabei die Sektion, der Sie beitreten.
+
+
+
+Eine Übermittlung von Teilen dieser Daten an die jeweiligen Landes- und Sportfachverbände findet nur im Rahmen der in den Satzungen der Landes- und Sportfachverbände festgelegten Zwecke statt. Diese Datenübermittlungen sind notwendig zum Zwecke der Organisation eines Spiel- bzw. Wettkampfbetriebes und zum Zwecke der Einwerbung von öffentlichen Fördermitteln.
+
+
+
+Wir sichern Ihnen zu, Ihre personenbezogenen Daten vertraulich zu behandeln und nicht an Stellen außerhalb des DAV, weder außerhalb der Sektion, noch außerhalb des Bundesverbandes und der jeweiligen Landes- und Sportfachverbände weiterzugeben. Sie können jederzeit schriftlich Auskunft über die bezüglich Ihrer Person gespeicherten Daten erhalten und Korrektur verlangen, soweit die bei der Sektion und der Bundesgeschäftsstelle gespeicherten Daten unrichtig sind. Sollten die gespeicherten Daten für die Abwicklung der Geschäftsprozesse der Sektion, bzw. des Bundesverbandes nicht erforderlich sein, so können Sie auch eine Sperrung, gegebenenfalls auch eine Löschung Ihrer personenbezogenen Daten verlangen.
+
+
+
+Nach einer Beendigung der Mitgliedschaft werden Ihre personenbezogenen Daten gelöscht, soweit sie nicht, entsprechend der steuerrechtlichen Vorgaben, aufbewahrt werden müssen.
+
+
+
+Eine Nutzung Ihrer personenbezogenen Daten für Werbezwecke findet weder durch die Sektion, den Bundesverband, Kooperationspartner des Bundesverbandes des Deutschen Alpenvereins noch durch die jeweiligen Landes- und Sportfachverbände statt.
+
+
+
+Die Datenverarbeitung erfolgt auf Grundlage des Art. 6 Abs. 1 S. 1 lit. b DSGVO.
+
+
+4. Wir setzen Cookies ein:
+
+
+Wir setzen auf unserer Seite Cookies ein. Hierbei handelt es sich um kleine Dateien, die Ihr Browser automatisch erstellt und die auf Ihrem Endgerät (Laptop, Tablet, Smartphone o.ä.) gespeichert werden, wenn Sie unsere Seite besuchen. Cookies richten auf Ihrem Endgerät keinen Schaden an, enthalten keine Viren, Trojaner oder sonstige Schadsoftware.
+
+
+
+In dem Cookie werden Informationen abgelegt, die sich jeweils im Zusammenhang mit dem spezifisch eingesetzten Endgerät ergeben. Dies bedeutet jedoch nicht, dass wir dadurch unmittelbar Kenntnis von Ihrer Identität erhalten.
+
+
+
+Der Einsatz von Cookies dient einerseits dazu, die Nutzung unseres Angebots für Sie angenehmer zu gestalten. So setzen wir sogenannte Session-Cookies ein, um zu erkennen, dass Sie einzelne Seiten unserer Website bereits besucht haben. Diese werden nach Verlassen unserer Seite automatisch gelöscht.
+
+
+
+Darüber hinaus setzen wir ebenfalls zur Optimierung der Benutzerfreundlichkeit temporäre Cookies ein, die für einen bestimmten festgelegten Zeitraum auf Ihrem Endgerät gespeichert werden. Besuchen Sie unsere Seite erneut, um unsere Dienste in Anspruch zu nehmen, wird automatisch erkannt, dass Sie bereits bei uns waren und welche Eingaben und Einstellungen Sie getätigt haben, um diese nicht noch einmal eingeben zu müssen.
+
+
+
+Die durch Cookies verarbeiteten Daten sind für die genannten Zwecke zur Wahrung unserer berechtigten Interessen sowie der Dritter nach Art. 6 Abs. 1 S. 1 lit. f DSGVO erforderlich.
+
+
+
+Die meisten Browser akzeptieren Cookies automatisch. Sie können Ihren Browser jedoch so konfigurieren, dass keine Cookies auf Ihrem Computer gespeichert werden oder stets ein Hinweis erscheint, bevor ein neuer Cookie angelegt wird. Die vollständige Deaktivierung von Cookies kann jedoch dazu führen, dass Sie nicht alle Funktionen unserer Website nutzen können.
+
+
+5. Das geschieht im Falle einer elektronischen Kontaktaufnahme:
+
+
+a) Beschreibung und Umfang der Datenverarbeitung
+
+
+
+Auf unserer Internetseite sind Kontaktformulare vorhanden, welche für die elektronische Kontaktaufnahme genutzt werden können. Nimmt ein Nutzer diese Möglichkeit wahr, so werden die in der Eingabemaske eingegeben Daten an uns übermittelt und gespeichert. Diese Daten sind:
+
+
+
+Name, Email-Adresse, Betreff und Inhalt Ihrer Nachricht.
+
+
+
+Im Zeitpunkt der Absendung der Nachricht werden zudem folgende Daten gespeichert
+
+
+
+
+ Ihre IP-Adresse,
+ Datum und Uhrzeit der Registrierung
+
+
+
+
+Für die Verarbeitung der Daten wird im Rahmen des Absendevorgangs Ihre Einwilligung eingeholt und auf diese Datenschutzerklärung verwiesen.
+
+
+
+Alternativ ist eine Kontaktaufnahme über die bereitgestellte Email-Adresse möglich. In diesem Fall werden Ihre mit der E-Mail übermittelten personenbezogenen Daten gespeichert.
+
+
+
+Es erfolgt in diesem Zusammenhang keine Weitergabe der Daten an Dritte. Die Daten werden ausschließlich für die Verarbeitung der Konversation verwendet.
+
+
+
+Falls im Formular angegeben erfolgt eine Weiterleitung aller eingegeben Daten an die private E-Mail-Adresse der verantwortlichen Jugendleiter. In diesem Fall kann je nach E-Mail Provider des Jugendleiters eine Weitergabe der Daten an Dritte nicht ausgeschlossen werden.
+
+
+b) Rechtsgrundlage für die Datenverarbeitung
+
+
+Rechtsgrundlage für die Verarbeitung der Daten ist bei Vorliegen Ihrer Einwilligung Art. 6 Abs. 1 lit. a DSGVO.
+
+
+
+Rechtsgrundlage für die Verarbeitung der Daten, die im Zuge einer Übersendung einer Email übermittelt werden, ist Art. 6 Abs. 1 lit. f DSGVO. Zielt der Email-Kontakt auf den Abschluss eines Vertrages, so ist zusätzliche Rechtsgrundlage für die Verarbeitung Art. 6 Abs. 1 lit. b DSGVO.
+
+
+c) Zweck der Datenverarbeitung
+
+
+Die Verarbeitung der personenbezogenen Daten aus der Eingabemaske dient uns allein zur Bearbeitung der Kontaktaufnahme. Im Falle einer Kontaktaufnahme per E-Mail liegt hierin auch das erforderliche berechtigte Interesse an der Verarbeitung der Daten.
+
+
+
+Die sonstigen während des Absendevorgangs verarbeiteten personenbezogenen Daten dienen dazu, einen Missbrauch des Kontaktformulars zu verhindern und die Sicherheit unserer informationstechnischen Systeme sicherzustellen.
+
+
+d) Dauer der Speicherung
+
+
+Die Daten werden gelöscht, sobald sie für die Erreichung des Zweckes ihrer Erhebung nicht mehr erforderlich sind. Für die personenbezogenen Daten aus der Eingabemaske des Kontaktformulars und diejenigen, die per E-Mail übersandt wurden, ist dies dann der Fall, wenn die jeweilige Konversation mit dem Nutzer beendet ist. Beendet ist die Konversation dann, wenn sich aus den Umständen entnehmen lässt, dass der betroffene Sachverhalt abschließend geklärt ist.
+
+
+
+Die während des Absendevorgangs zusätzlich erhobenen personenbezogenen Daten werden spätestens nach einer Frist von sieben Tagen gelöscht.
+
+
+6. Das geschieht, wenn Sie Online-Anmeldeformulare nutzen:
+
+
+Auf unserer Internetseite sind Anmeldeformulare vorhanden, welches für die elektronische Anmeldung zu Jugendgruppen, Kursen und Veranstaltungen unseres Vereins genutzt werden kann. Nimmt ein Nutzer diese Möglichkeit wahr, so werden die in der Eingabemaske eingegeben Daten an uns übermittelt und gespeichert. Für diese Datenverarbeitung ist die Firma reeweb AG Wettsteinplatz 74058 Basel Schweiz beauftragt. Diese Daten sind:
+
+
+
+Name, Email-Adresse, Telefonnummer, gewählter Kurs, Informationen zu DAV-Mitgliedschaft, Mitgliedsnummer, Alter bzw. Geburtsdatum, Adresse, Informationen zur Verfügbarkeit für Jugendgruppen ggfs. Informationen zur Lawinenausbildung, allfällig übermittelte Bemerkungen.
+
+
+
+Im Zeitpunkt der Absendung der Nachricht werden zudem folgende Daten gespeichert:
+
+
+
+
+ Ihre IP-Adresse,
+ Datum und Uhrzeit der Registrierung
+
+
+
+
+Für die Verarbeitung der Daten wird im Rahmen des Absendevorgangs Ihre Einwilligung eingeholt und auf diese Datenschutzerklärung verwiesen.
+
+
+
+Die gespeicherten Daten werden spätestens ein Jahr nach Durchführung der Veranstaltung gelöscht, sofern nicht steuerliche Vorschriften eine längere Speicherdauer vorgeben. Daten auf der unserer Warteliste für Jugendgruppen werden ohne Frist gespeichert und auf Nachfrage bei anmeldung.jdav@alpenverein-heidelberg.de gelöscht werden.
+
+
+7. Das geschieht, wenn Sie Downloads vornehmen:
+
+
+Auf unserer Internetseite sind Download-Angebote eingestellt. Nimmt ein Nutzer einen Download vor, so werden Daten an uns übermittelt und gespeichert. Diese Daten sind:
+
+
+
+
+ Ihre IP-Adresse,
+ Datum und Uhrzeit der Registrierung
+
+
+
+
+Rechtsgrundlage für diese Speicherung ist Art. 6 Abs. 1 lit. f. DSGVO.
+
+
+
+Die gespeicherten Daten werden mit Ende des Besuchs unserer Website gelöscht.
+
+
+8. Ihre Betroffenenrechte:
+
+
+Sie haben das Recht:
+
+
+
+
+
+ gemäß Art. 15 DSGVO Auskunft über Ihre von uns verarbeiteten Daten zu erlangen. Insbesondere können Sie Auskunft über die Verarbeitungszwecke, die Kategorie der personenbezogenen Daten, die Kategorien von Empfängern, gegenüber denen Ihre Daten offengelegt wurden oder werden, die geplante Speicherdauer, das Bestehen eines Rechts auf Berichtigung, Löschung, Einschränkung der Verarbeitung oder Widerspruch, das Bestehen eines Beschwerderechts, die Herkunft ihrer Daten, sofern diese nicht bei uns erhoben wurden, sowie über das Bestehen einer automatisierten Entscheidungsfindung einschließlich Profiling und ggfs. aussagekräftigen Informationen zu deren Einzelheiten verlangen;
+
+
+ gemäß Art. 16 DSGVO unverzüglich die Berichtigung unrichtiger oder Vervollständigung Ihrer bei uns gespeicherten personenbezogenen Daten zu verlangen;
+
+
+ gemäß Art. 17 DSGVO die Löschung Ihrer bei uns gespeicherten personenbezogenen Daten zu verlangen, soweit nicht die Verarbeitung zur Ausübung des Rechts auf freie Meinungsäußerung und Information, zur Erfüllung einer rechtlichen Verpflichtung, aus Gründen des öffentlichen Interesses oder zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen erforderlich ist;
+
+
+ gemäß Art. 18 DSGVO die Einschränkung der Verarbeitung Ihrer personenbezogenen Daten zu verlangen, soweit die Richtigkeit der Daten von Ihnen bestritten wird, die Verarbeitung unrechtmäßig ist, Sie aber deren Löschung ablehnen und wir die Daten nicht mehr benötigen, Sie jedoch diese zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen benötigen oder Sie gemäß Art. 21 DSGVO Widerspruch gegen die Verarbeitung eingelegt haben.
+
+
+ gemäß Art. 20 DSGVO Ihre personenbezogenen Daten, die Sie uns bereitgestellt haben, in einem strukturierten, gängigen und maschinenlesbaren Format zu erhalten oder die Übermittlung an einen anderen Verantwortlichen zu verlangen;
+
+
+ gemäß Art. 7 Abs. 3 DSGVO Ihre einmal erteilte Einwilligung jederzeit gegenüber uns zu widerrufen. Dies hat zur Folge, dass wir die Datenverarbeitung, die auf dieser Einwilligung beruhte, für die Zukunft nicht mehr fortführen dürfen und
+
+
+ gemäß Art. 77 DSGVO sich bei einer Aufsichtsbehörde zu beschweren. In der Regel können Sie sich hierfür an die Aufsichtsbehörde Ihres üblichen Aufenthaltsortes oder Arbeitsplatzes oder unseres Vereinssitzes wenden.
+
+
+
+
+9. Ihre Widerspruchsrechte:
+
+
+Sofern Ihre personenbezogenen Daten auf Grundlage von berechtigten Interessen gemäß Art. 6 Abs. 1 S. 1 lit. f DSGVO verarbeitet werden, haben Sie das Recht, gemäß Art. 21 DSGVO Widerspruch gegen die Verarbeitung Ihrer personenbezogenen Daten einzulegen, soweit dafür Gründe vorliegen, die sich aus Ihrer besonderen Situation ergeben oder sich der Widerspruch gegen Direktwerbung richtet. Im letzten Fall haben Sie ein generelles Widerspruchsrecht, das ohne Angabe einer besonderen Situation von uns umgesetzt wird.
+
+
+
+Möchten Sie von Ihrem Widerrufs- oder Widerspruchsrecht Gebrauch machen, genügt eine Email an
+jugend@alpenverein-heidelberg.de oder
+alpenverein-heidelberg@t-online.de .
+
+
+10. Die Sicherheit Ihrer Daten:
+
+
+Wir bedienen uns geeigneter technischer und organisatorischer Sicherheitsmaßnahmen, um Ihre Daten gegen zufällige oder vorsätzliche Manipulationen, teilweisen oder vollständigen Verlust, Zerstörung oder gegen den unbefugten Zugriff Dritter zu schützen. Unsere Sicherheitsmaßnahmen werden entsprechend der technologischen Entwicklung fortlaufend verbessert.
+
+
+11. Aktualität und Änderung dieser Datenschutzerklärung
+
+
+Diese Datenschutzerklärung ist aktuell gültig und hat den Stand April 2020.
+
+
+
+Durch die Weiterentwicklung unserer Website und Angebote darüber oder aufgrund geänderter gesetzlicher beziehungsweise behördlicher Vorgaben kann es notwendig werden, diese Datenschutzerklärung zu ändern. Die jeweils aktuelle Datenschutzerklärung kann jederzeit auf der Website unter
+www.jdav-hd.de/impressum#datenschutz von Ihnen aufgerufen und falls gewünscht ausgedruckt werden.
+
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/index.html b/jdav_web/startpage/templates/startpage/index.html
index 390893c..35d6f44 100644
--- a/jdav_web/startpage/templates/startpage/index.html
+++ b/jdav_web/startpage/templates/startpage/index.html
@@ -1,2 +1,30 @@
-{% load i18n %}
-{% trans "Awesome JDAV website being able to do a lot!" %}
+{% extends "startpage/base.html" %}
+{% load static %}
+
+{% block title %}
+Startseite
+{% endblock %}
+
+{% block content %}
+
+
+
+
Herzlich Willkommen
+
+ Herzlich Willkommen auf unserer Webseite. Hier finden Sie alle
+ Informationen über die jdav Heidelberg. Viel Spaß beim Surfen!
+
+
+
+
Aktuelles
+
+ {% for post in posts %}
+
+ {{ post.title }} vom {{ post.date }}
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/jugendleiterinnen.html b/jdav_web/startpage/templates/startpage/jugendleiterinnen.html
new file mode 100644
index 0000000..04d375a
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/jugendleiterinnen.html
@@ -0,0 +1,8 @@
+{% extends "startpage/base_subsite.html" %}
+
+{% block content %}
+Unsere Jugendleiter*innen
+
+{% include "startpage/people_grid.html" %}
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/navigation.html b/jdav_web/startpage/templates/startpage/navigation.html
new file mode 100644
index 0000000..87df48b
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/navigation.html
@@ -0,0 +1,126 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jdav_web/startpage/templates/startpage/people_grid.html b/jdav_web/startpage/templates/startpage/people_grid.html
new file mode 100644
index 0000000..9b17f1a
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/people_grid.html
@@ -0,0 +1,23 @@
+{% load static %}
+
+
+
+ {% for member in people %}
+
+
+ {% if member.image %}
+
+ {% else %}
+
+ {% endif %}
+
+
{{ member.name }}
+ {% if member.extra %}
+
+ {% endif %}
+
+
+
+ {% endfor %}
+
+
diff --git a/jdav_web/startpage/templates/startpage/post.html b/jdav_web/startpage/templates/startpage/post.html
new file mode 100644
index 0000000..0f41401
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/post.html
@@ -0,0 +1,19 @@
+{% extends "startpage/base_subsite.html" %}
+{% load static markdown_extras markdownify %}
+
+{% block content %}
+{{ post.title }}
+
+{% render_as_template "post.website_text" as result %}
+
+{{ result|markdownify }}
+
+{% if post.detailed %}
+ {% include 'startpage/post_people_detail.html' %}
+{% else %}
+ {% include 'startpage/post_people_grid.html' %}
+{% endif %}
+
+{% include 'startpage/people_grid.html' %}
+
+{% endblock %}
diff --git a/jdav_web/startpage/templates/startpage/post_people_detail.html b/jdav_web/startpage/templates/startpage/post_people_detail.html
new file mode 100644
index 0000000..62d7d65
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/post_people_detail.html
@@ -0,0 +1,26 @@
+{% load static %}
+{% load markdownify %}
+
+
+ {% for person in post.people.all %}
+
+
+ {{ person.description|markdownify }}
+
+ {% for member in person.members.all %}
+
+
+ {% if member.image %}
+
+ {% else %}
+
+ {% endif %}
+
+
+
+ {% endfor %}
+
+ {% endfor %}
+
diff --git a/jdav_web/startpage/templates/startpage/post_people_grid.html b/jdav_web/startpage/templates/startpage/post_people_grid.html
new file mode 100644
index 0000000..fcbaad1
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/post_people_grid.html
@@ -0,0 +1,25 @@
+{% load static %}
+
+
+
+ {% for person in post.people.all %}
+ {% for member in person.members.all %}
+
+
+ {% if member.image %}
+
+ {% else %}
+
+ {% endif %}
+
+
{{ member.name }}
+ {% if person.description %}
+
+ {% endif %}
+
+
+
+ {% endfor %}
+ {% endfor %}
+
+
diff --git a/jdav_web/startpage/templates/startpage/section.html b/jdav_web/startpage/templates/startpage/section.html
new file mode 100644
index 0000000..bca9a70
--- /dev/null
+++ b/jdav_web/startpage/templates/startpage/section.html
@@ -0,0 +1,11 @@
+{% extends "startpage/base_subsite.html" %}
+{% load static markdown_extras markdownify %}
+
+{% block content %}
+{{ section.title }}
+
+{% render_as_template "section.website_text" as result %}
+
+{{ result|markdownify }}
+
+{% endblock %}
diff --git a/jdav_web/startpage/templatetags/markdown_extras.py b/jdav_web/startpage/templatetags/markdown_extras.py
new file mode 100644
index 0000000..00ae99e
--- /dev/null
+++ b/jdav_web/startpage/templatetags/markdown_extras.py
@@ -0,0 +1,49 @@
+from django import template
+from django.urls import reverse
+from django.utils.safestring import mark_safe
+from django.template import Template, Variable, TemplateSyntaxError
+
+import re
+
+register = template.Library()
+
+
+class RenderAsTemplateNode(template.Node):
+ """
+ Renders passed content as template. This is probably dangerous and should only be exposed
+ to admins!
+ """
+ def __init__(self, item_to_be_rendered, var_name):
+ self.item_to_be_rendered = Variable(item_to_be_rendered)
+ self.var_name = var_name
+
+ def render(self, context):
+ try:
+ actual_item = self.item_to_be_rendered.resolve(context)
+ context[self.var_name] = Template(actual_item).render(context)
+ return ""
+ except template.VariableDoesNotExist:
+ return ''
+
+
+def render_as_template(parser, token):
+ # This version uses a regular expression to parse tag contents.
+ try:
+ # Splitting by None == splitting by spaces.
+ tag_name, arg = token.contents.split(None, 1)
+ except ValueError:
+ raise template.TemplateSyntaxError(
+ "%r tag requires arguments" % token.contents.split()[0]
+ )
+ m = re.search(r"(.*?) as (\w+)", arg)
+ if not m:
+ raise template.TemplateSyntaxError("%r tag had invalid arguments" % tag_name)
+ format_string, var_name = m.groups()
+ if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
+ raise template.TemplateSyntaxError(
+ "%r tag's argument should be in quotes" % tag_name
+ )
+ return RenderAsTemplateNode(format_string[1:-1], var_name)
+
+
+render_as_template = register.tag(render_as_template)
diff --git a/jdav_web/startpage/urls.py b/jdav_web/startpage/urls.py
index 2d313ca..70fe2ec 100644
--- a/jdav_web/startpage/urls.py
+++ b/jdav_web/startpage/urls.py
@@ -4,5 +4,13 @@ from . import views
app_name = "startpage"
urlpatterns = [
- re_path(r'^$', views.index, name='index')
+ re_path(r'^$', views.index, name='index'),
+ re_path(r'^impressum/?$', views.static_view('startpage/impressum.html'), name='impressum'),
+ re_path(r'^aktuelles/?$', views.aktuelles, name='aktuelles'),
+ re_path(r'^jugendleiterinnen/?$', views.jugendleiterinnen, name='jugendleiterinnen'),
+ re_path(r'^gruppen/?$', views.static_view('startpage/gruppen.html'), name='gruppen'),
+ re_path(r'^gruppen/faq/?$', views.static_view('startpage/gruppen/faq.html'), name='faq'),
+ re_path(r'^gruppen/(?P[\w\-:]+)/?$', views.gruppe_detail, name='gruppe_detail'),
+ re_path(r'^(?P[\w\-:]+)/(?P[\w\-:]+)/?$', views.post, name='post'),
+ re_path(r'^(?P[\w\-:]+)/?$', views.section, name='section'),
]
diff --git a/jdav_web/startpage/views.py b/jdav_web/startpage/views.py
index f0cd9a9..113239d 100644
--- a/jdav_web/startpage/views.py
+++ b/jdav_web/startpage/views.py
@@ -1,7 +1,97 @@
-from django.shortcuts import redirect
+from django.shortcuts import redirect, get_object_or_404
+from django import shortcuts
from django.conf import settings
+from django.urls import reverse
+from django.http import HttpResponseNotFound, Http404
+from itertools import chain
+
+from members.models import Group
+from .models import Post, Section
+
+
+# render shortcut adding additional context variables, needed for navbar
+def render(request, template_path, context={}):
+ context['groups'] = Group.objects.filter(show_website=True)
+ context['sections'] = Section.objects.all()
+ return shortcuts.render(request, template_path, context)
-# Create your views here.
def index(request):
- return redirect(settings.STARTPAGE_REDIRECT_URL)
+ context = {
+ 'posts': Post.objects.filter(section=None)
+ }
+ return render(request, 'startpage/index.html', context)
+
+
+# static view factory
+def static_view(template_path):
+ def view(request):
+ return render(request, template_path)
+ return view
+
+
+def jugendleiterinnen(request):
+ group = get_object_or_404(Group, name='Jugendleiter')
+ people = group.member_set.all()
+ context = {
+ 'people': people
+ }
+ return render(request, 'startpage/jugendleiterinnen.html', context)
+
+
+def gruppe_detail(request, group_name):
+ try:
+ group = Group.objects.get(name=group_name)
+ except Group.DoesNotExist:
+ raise Http404
+ if not group.show_website:
+ raise Http404
+
+ context = {
+ 'group': group,
+ 'people': group.leiters.all(),
+ }
+ return render(request, 'startpage/gruppen/detail.html', context)
+
+
+def aktuelles(request):
+ posts = Post.objects.filter(section=None)
+ context = {
+ 'posts': posts,
+ }
+ return render(request, 'startpage/aktuelles.html', context)
+
+
+def post(request, section_name, post_name):
+ if section_name == 'aktuelles':
+ section = None
+ else:
+ section = get_object_or_404(Section, urlname=section_name)
+ post = get_object_or_404(Post, section=section, urlname=post_name)
+ context = {
+ 'post': post,
+ 'section': section,
+ 'people': [m for group in post.groups.all() for m in group.member_set.all()],
+ }
+ return render(request, 'startpage/post.html', context)
+
+
+def section(request, section_name):
+ assert section_name != 'aktuelles'
+ section = get_object_or_404(Section, urlname=section_name)
+ context = {
+ 'section': section,
+ }
+ return render(request, 'startpage/section.html', context)
+
+
+def handler404(request, exception):
+ response = render(request, 'startpage/404.html')
+ response.status_code = 404
+ return response
+
+
+def handler500(request):
+ response = render(request, 'startpage/500.html')
+ response.status_code = 500
+ return response
diff --git a/jdav_web/static/startpage/css/base.css b/jdav_web/static/startpage/css/base.css
new file mode 100644
index 0000000..f66376e
--- /dev/null
+++ b/jdav_web/static/startpage/css/base.css
@@ -0,0 +1,342 @@
+html {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+body {
+ height: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+h5 {
+ color: white;
+ font-family: Oswald, sans-serif;
+ font-size: 120px;
+ font-weight: 700;
+ font-style: normal;
+ text-decoration: none;
+ overflow-wrap: break-word;
+ text-transform: none;
+ padding-top: 50px;
+ padding-left: 40px;
+ padding-right: 40px;
+ margin: 0;
+}
+
+h6 {
+ color: white;
+ font-family: Oswald, sans-serif;
+ font-size: 56px;
+ font-weight: 200;
+ font-style: normal;
+ text-decoration: none;
+ text-align: left;
+ line-height: 100px;
+ text-transform: none;
+ margin: 10px 0;
+ overflow-wrap: break-word;
+}
+
+.main {
+ margin-bottom: -50px;
+ box-sizing: border-box;
+ padding: 0 0 50px 0;
+ width: 100%;
+ min-height: 100%;
+}
+
+.image {
+ position: absolute;
+ background-image: url('../img/background.jpeg');
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ display: block;
+ background-size: cover;
+ background-origin: margin-box;
+ z-index: -2;
+ background-position: center center;
+}
+
+.header {
+ position: relative;
+ width: 100%;
+}
+
+.header-extra {
+}
+
+
+.footer {
+ position: relative;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ clear: both;
+ /*
+ border-top: 1px solid #C2D1E1;
+ color: #a0acba;
+ background: #f5f9ff;*/
+ padding: 4px 0px;
+ height: 50px;
+ font-family: var(--sans);
+ font-size: 0.75em;
+ vertical-align: middle;
+ text-align: center;
+ line-height: 31px;
+ overflow: hidden;
+ box-sizing: border-box;
+}
+
+.content {
+ width: 70%;
+ margin: 0 auto;
+ overflow: hidden;
+ position: relative;
+ padding-top: 40px;
+ padding-bottom: 40px;
+}
+
+.column {
+ float: left;
+ width: 50%;
+ padding: 0 20px;
+}
+
+/* Clear floats after the columns */
+.row:after {
+ content: "";
+ clear: both;
+}
+
+.footer a {
+ text-decoration: none;
+ color: rgba(87,171,39,1.0);
+}
+
+.footer a:hover {
+ text-decoration: underline;
+}
+
+.navigation {
+ position: fixed;
+ z-index: 1;
+ width: 100%;
+ left: 0;
+ top: 0;
+}
+
+ /* Navbar container */
+.navbar {
+ overflow: hidden;
+ font-family: Arial;
+ background-color: rgba(255, 255, 255, 0);
+ transition: background-color 0.15s linear;
+ padding-top: 10px;
+ padding-left: 10px;
+ padding-right: 10px;
+ padding-bottom: 5px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.overlay {
+ background-color: rgba(255, 255, 255, 0.9);
+ transition: background-color 0.15s linear;
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+}
+
+/* Links inside the navbar */
+.navbar a.nav {
+ float: right;
+ font-size: 16px;
+ color: black;
+ text-align: center;
+ padding: 11px 17px;
+ text-decoration: none;
+ border: 1px solid black;
+ border-radius: 25px;
+ vertical-align: middle;
+ margin-left: auto;
+}
+
+/* The dropdown container */
+.dropdown {
+ float: left;
+ overflow: hidden;
+}
+
+/* Dropdown button */
+.dropbtn {
+ font-size: 19px;
+ border: none;
+ outline: none;
+ color: black;
+ padding: 14px 16px;
+ background-color: rgba(255, 255, 255, 0);
+ font: inherit; /* Important for vertical align on mobile phones */
+ margin: 0; /* Important for vertical align on mobile phones */
+ float: right;
+ cursor: pointer;
+}
+
+/* Add a red background color to navbar links on hover */
+.navbar a.nav:hover, .dropdown:hover .dropbtn {
+ background-color: rgba(87,171,39,1.0);
+ color: rgba(255,255,255,1.0);
+ border-color: white;
+}
+
+/* Dropdown content (hidden by default) */
+.dropdown-content {
+ display: block;
+ position: absolute;
+ background-color: #f9f9f9;
+ width: 100%;
+ left: 0;
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+ z-index: 1;
+ max-height: 0;
+ overflow: hidden;
+ transition: max-height 0.3s ease-out;
+}
+
+.menu-level-1 {
+ float: right;
+}
+
+.dropdown-content ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.dropdown-content .menu-level-1 > ul {
+ display: flex;
+ flex-flow: row;
+ flex-wrap: wrap;
+}
+
+.dropdown-content li {
+ display: block;
+}
+
+/* Create three equal columns that floats next to each other */
+.dropdown-content .column {
+ float: right;
+ max-width: 19%;
+ padding: 10px;
+ height: 250px;
+}
+
+.dropdown-content .menu-level-1 a {
+ font-family: Roboto, sans-serif;
+ font-size: 24px;
+ font-weight: 700;
+ font-style: normal;
+ text-decoration: none;
+ text-align: left;
+ text-transform: none;
+ margin: 10px 20px;
+ overflow-wrap: break-word;
+ color: rgba(102,102,102,1.0);
+}
+
+.dropdown-content .menu-level-1 a, .menu-level-2 a {
+ display: inline-block;
+}
+
+a, a:visited {
+ text-transform: none;
+ text-decoration: none;
+}
+
+/* Style links inside the columns */
+.dropdown-content .menu-level-2 a {
+ font-family: Roboto, sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ font-style: normal;
+ text-decoration: none;
+ text-align: left;
+ text-transform: none;
+ margin: 5px 20px;
+ overflow-wrap: break-word;
+ color: rgba(102,102,102,1.0);
+}
+
+.dropdown-content a:hover {
+ color: rgba(87,171,39,1.0);
+}
+
+.dropdown-content a.active {
+ color: rgba(87,171,39,1.0);
+}
+
+.show {
+ max-height: 1000px;
+ transition: max-height 0.4s ease-in;
+}
+
+p {
+ font-family: Open Sans, sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ font-style: normal;
+ text-decoration: none;
+ text-align: left;
+ line-height: 1.4;
+ text-transform: none;
+ margin: 20px 0;
+ overflow-wrap: break-word;
+}
+
+h2 {
+ font-family: Roboto, sans-serif;
+ font-size: 40px;
+ font-weight: 700;
+ font-style: normal;
+ text-decoration: none;
+ text-align: left;
+ text-transform: none;
+ margin: 20px 0 10px 0;
+ overflow-wrap: break-word;
+ color: rgba(51,51,51,1.0);
+}
+
+html, td, div {
+ font-family: Open Sans, sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ font-style: normal;
+ text-align: left;
+ line-height: 1.4;
+ text-transform: none;
+ overflow-wrap: break-word;
+}
+
+*, ::before, ::after {
+ box-sizing: inherit;
+}
+
+h1 {
+ font-family: Roboto, sans-serif;
+ font-size: 52px;
+ font-weight: 700;
+ font-style: normal;
+ text-decoration: none;
+ text-align: left;
+ text-transform: none;
+ margin: 30px 0 30px 0;
+ overflow-wrap: break-word;
+}
+
+a, a:visited {
+ color: rgba(87,171,39,1.0);
+ text-transform: none;
+ text-decoration: none;
+}
diff --git a/jdav_web/static/startpage/css/fonts.css b/jdav_web/static/startpage/css/fonts.css
new file mode 100644
index 0000000..e376599
--- /dev/null
+++ b/jdav_web/static/startpage/css/fonts.css
@@ -0,0 +1,27 @@
+/* oswald-regular - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Oswald';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/oswald-v49-latin-regular.eot'); /* IE9 Compat Modes */
+ src: url('../fonts/oswald-v49-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/oswald-v49-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/oswald-v49-latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/oswald-v49-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/oswald-v49-latin-regular.svg#Oswald') format('svg'); /* Legacy iOS */
+}
+
+/* roboto-regular - latin */
+@font-face {
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: 'Roboto';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/roboto-v30-latin-regular.eot'); /* IE9 Compat Modes */
+ src: url('../fonts/roboto-v30-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/roboto-v30-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/roboto-v30-latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/roboto-v30-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/roboto-v30-latin-regular.svg#Roboto') format('svg'); /* Legacy iOS */
+}
diff --git a/jdav_web/static/startpage/css/people_grid.css b/jdav_web/static/startpage/css/people_grid.css
new file mode 100644
index 0000000..faf762a
--- /dev/null
+++ b/jdav_web/static/startpage/css/people_grid.css
@@ -0,0 +1,49 @@
+.grid-container {
+ display: grid;
+ grid-gap: 10px;
+ grid-template-columns: repeat(4, 1fr);
+ padding: 15px;
+}
+
+.people .grid-item {
+ display: inline-grid;
+}
+
+.portrait {
+ transition: transform .2s;
+ line-height: 1;
+}
+
+.portrait img {
+ padding: 0;
+ margin: 0;
+ width: 100%;
+ max-height: 250px;
+ display: block;
+ object-fit: cover;
+}
+
+.portrait .namebox {
+ background-color: rgba(87,171,39,1.0);
+ margin: 0;
+ padding: 15px;
+ text-align: center;
+ color: white;
+}
+
+.portrait .namebox .name {
+ font-size: 16px;
+ text-align: center;
+ font-weight: 700;
+}
+
+.portrait .namebox .extra {
+ margin-top: 5px;
+ font-size: 12px;
+ text-align: center;
+}
+
+.portrait:hover {
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
+ transform: scale(1.02);
+}
diff --git a/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.eot b/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..1ca824b6a0d332b8275aa9841ad15575be1bf5db
GIT binary patch
literal 11161
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
Qz0#T*;rT!Oe;cj;3(O-ihX4Qo
literal 0
HcmV?d00001
diff --git a/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.svg b/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.svg
new file mode 100644
index 0000000..7a25add
--- /dev/null
+++ b/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.svg
@@ -0,0 +1,312 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.ttf b/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..b5cb25d98ff9b768e50702605af8d7ce6ae3d0b8
GIT binary patch
literal 20852
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
literal 0
HcmV?d00001
diff --git a/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.woff b/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..aab7cddd25b5208f12686d6f71bfb472a0db905e
GIT binary patch
literal 12732
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
literal 0
HcmV?d00001
diff --git a/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.woff2 b/jdav_web/static/startpage/fonts/oswald-v49-latin-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..7ef4f1dea197b5b1b2f7d453a05a43620f96f816
GIT binary patch
literal 9840
zcmV-$CXd;7Pew8T0RR91048t%5C8xG08$J9045Ot0RR9100000000000000000000
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