diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 0b4f6e8..84fa758 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -52,6 +52,7 @@ INSTALLED_APPS = [ 'material.apps.MaterialConfig', 'members.apps.MembersConfig', 'mailer.apps.MailerConfig', + 'ludwigsburgalpin.apps.LudwigsburgalpinConfig', 'easy_select2', 'djcelery_email', 'djcelery', diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py index 93a0fb6..af40b4d 100644 --- a/jdav_web/jdav_web/urls.py +++ b/jdav_web/jdav_web/urls.py @@ -29,6 +29,8 @@ urlpatterns += i18n_patterns( url(r'^kompass/', admin.site.urls), url(r'^admin/', RedirectView.as_view(url='/kompass')), url(r'^newsletter/', include('mailer.urls', namespace="mailer")), + url(r'^ludwigsburgalpin/', include('ludwigsburgalpin.urls', + namespace="ludwigsburgalpin")), url(r'^$', include('startpage.urls')), ) diff --git a/jdav_web/ludwigsburgalpin/__init__.py b/jdav_web/ludwigsburgalpin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/ludwigsburgalpin/admin.py b/jdav_web/ludwigsburgalpin/admin.py new file mode 100644 index 0000000..7237265 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/admin.py @@ -0,0 +1,51 @@ +import os + +from django.contrib import admin +from wsgiref.util import FileWrapper +from django.http import HttpResponse +from django.conf import settings +from .models import Group, Termin + +import xlsxwriter + + +class GroupAdmin(admin.ModelAdmin): + list_display = ('name',) + + +class TerminAdmin(admin.ModelAdmin): + list_display = ('title','start_date', 'end_date', 'group') + list_filter = ('group',) + ordering = ('start_date','end_date') + actions = ['make_overview'] + + def make_overview(self, request, queryset): + filename = 'termine.xlsx' + workbook = xlsxwriter.Workbook(media_path(filename)) + bold = workbook.add_format({'bold': True}) + worksheet = workbook.add_worksheet() + worksheet.write(0, 0, "Titel", bold) + worksheet.write(0, 1, "Von", bold) + worksheet.write(0, 2, "Bis", bold) + worksheet.write(0, 3, "Gruppe", bold) + for row, termin in enumerate(queryset): + worksheet.write(row+2, 0, termin.title) + worksheet.write(row+2, 1, termin.start_date.strftime('%d.%m.%Y')) + worksheet.write(row+2, 2, termin.end_date.strftime('%d.%m.%Y')) + worksheet.write(row+2, 3, str(termin.group)) + workbook.close() + with open(media_path(filename), 'rb') as xls: + response = HttpResponse(FileWrapper(xls)) + response['Content-Type'] = 'application/xlsx' + response['Content-Disposition'] = 'attachment; filename='+filename + + return response + make_overview.short_description = "Termine in Excel Liste überführen" + +# Register your models here. +admin.site.register(Group, GroupAdmin) +admin.site.register(Termin, TerminAdmin) + + +def media_path(fp): + return os.path.join(os.path.join(settings.MEDIA_MEMBERLISTS, "memberlists"), fp) diff --git a/jdav_web/ludwigsburgalpin/apps.py b/jdav_web/ludwigsburgalpin/apps.py new file mode 100644 index 0000000..203b4d9 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class LudwigsburgalpinConfig(AppConfig): + name = 'ludwigsburgalpin' diff --git a/jdav_web/ludwigsburgalpin/models.py b/jdav_web/ludwigsburgalpin/models.py new file mode 100644 index 0000000..6dcbfd8 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/models.py @@ -0,0 +1,28 @@ +from django.db import models + + +class Group(models.Model): + name = models.CharField('Name', max_length=50) + + class Meta: + verbose_name = 'Gruppe' + verbose_name_plural = 'Gruppen' + + def __str__(self): + return self.name + + +# Create your models here. +class Termin(models.Model): + title = models.CharField('Titel', max_length=100) + start_date = models.DateField('Von') + end_date = models.DateField('Bis') + group = models.ForeignKey('ludwigsburgalpin.Group', + verbose_name='Gruppe') + + def __str__(self): + return "{} {}".format(self.title, str(self.group)) + + class Meta: + verbose_name = 'Termin' + verbose_name_plural = 'Termine' diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css new file mode 100644 index 0000000..2e7fcc4 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/base.css @@ -0,0 +1,132 @@ +body,html{ + font-size: 16px; + line-height: 29px; + color:#0c1a30; + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin: 0; +} + +#content { + width: 80%; + margin: 0 auto; + overflow:hidden; + position: relative; +} + +h1 { + font-size: 22px; +} + +h2{ + font-size: 22px; +} + +h3 a:link, h3 a:visited, h2 a:link, h2 a:visited { + color: #58ab27; +} + +h3 { + font-size: 19px; +} + +h4 { + font-size: 17px; +} + +h1,h2,h3,h4{ + color: #58ab27; + font-weight: normal; + text-shadow: #fff 0px 1px 1px; + letter-spacing:0.1em; +} + +a { + color: #58ab27; + text-decoration: none; + outline: 0; +} + +a:hover, a:focus { + color: #386d19; + text-decoration: none; + outline: 0; +} + +div.navbar-header { + width: 83%; + margin: 0 auto; + overflow:hidden; + position: relative; +} + +ul.navbar { + float: right; + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; +} + +.navbar > li { + float: left; + position: relative; + display: block; +} + +a.navbar-brand { + line-height: 120px; + display: inline-block; + height: 120px; + opacity: 1; + padding: 23px 23px; + transition: opacity 0.15s linear; +} + +a.navbar-brand:hover { + opacity: 0.8; + transition: opacity 0.15s linear; +} + +.navbar > li a { + display: inline-block; + color: #777777; + text-align: center; + text-transform: uppercase; + padding: 16px; + line-height: 120px; +} + +.navbar > li a:hover { + color: #333333; +} + +.navbar > li a:before { + content: ""; + position: absolute; + width: 100%; + height: 5px; + top: 0; + left: 0; + background-color: #58ab27; + visibility: hidden; + opacity: 0; + transition: opacity 0.3s linear; +} + +.navbar > li a:hover:before { + visibility: visible; + opacity: 0.5; + transition: opacity 0.3s linear; +} + +.navbar > li.current a:before { + content: ""; + position: absolute; + width: 100%; + height: 5px; + top: 0; + left: 0; + background-color: #58ab27; + visibility: visible; + opacity: 1; +} diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/favicon.ico b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/favicon.ico new file mode 100644 index 0000000..df58720 Binary files /dev/null and b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/favicon.ico differ diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/logo_dav.png b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/logo_dav.png new file mode 100644 index 0000000..893d9cc Binary files /dev/null and b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/img/logo_dav.png differ diff --git a/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css new file mode 100644 index 0000000..4783592 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/static/ludwigsburgalpin/termine.css @@ -0,0 +1,9 @@ +table.termine { + text-align: left; +} + +td { + padding-left: 50px; + display: block; + float: left; +} diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html new file mode 100644 index 0000000..4b6d484 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/base.html @@ -0,0 +1,47 @@ +{% load i18n %} +{% load static %} + + +
+Termin erfolgreich eingereicht
+ +Hier kannst du einen neuen Termin hinzufügen.
+{% endblock %} diff --git a/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html new file mode 100644 index 0000000..24008dd --- /dev/null +++ b/jdav_web/ludwigsburgalpin/templates/ludwigsburgalpin/termine.html @@ -0,0 +1,25 @@ +{% extends "ludwigsburgalpin/base.html" %} +{% load i18n %} +{% load static %} + +{% block content %} + + + +Hier kannst du einen Termin für deine Gruppe hinzufügen
+ +{% if error_message %} +{{ error_message }}
+{% endif %} + + + +{% endblock %} diff --git a/jdav_web/ludwigsburgalpin/tests.py b/jdav_web/ludwigsburgalpin/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/jdav_web/ludwigsburgalpin/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/jdav_web/ludwigsburgalpin/urls.py b/jdav_web/ludwigsburgalpin/urls.py new file mode 100644 index 0000000..6ff1be7 --- /dev/null +++ b/jdav_web/ludwigsburgalpin/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import url + +from . import views + +app_name = "ludwigsburgalpin" +urlpatterns = [ + url(r'^$', views.index, name='index') + # url(r'^subscribe', views.subscribe, name='subscribe'), +] diff --git a/jdav_web/ludwigsburgalpin/views.py b/jdav_web/ludwigsburgalpin/views.py new file mode 100644 index 0000000..93f19ca --- /dev/null +++ b/jdav_web/ludwigsburgalpin/views.py @@ -0,0 +1,39 @@ +from django.shortcuts import render +from django import forms +from django.http import HttpResponseRedirect +from django.contrib.admin import widgets +from .models import Group, Termin + +from bootstrap_datepicker.widgets import DatePicker + +datepicker = forms.TextInput(attrs={'class': 'datepicker'}) + + +class TerminForm(forms.Form): + title = forms.CharField(label='Titel') + start_date = forms.DateField(label='Von', + widget=datepicker) + end_date = forms.DateField(label='Bis', + widget=datepicker) + group = forms.ModelChoiceField(label='Gruppe', + queryset=Group.objects.all()) + + +# Create your views here. +def index(request): + if request.method == 'POST': + form = TerminForm(request.POST) + if form.is_valid(): + termin = Termin(title=form.cleaned_data["title"], + start_date=form.cleaned_data["start_date"], + end_date=form.cleaned_data["end_date"], + group=form.cleaned_data["group"]) + termin.save() + return published(request) + else: + form = TerminForm() + return render(request, 'ludwigsburgalpin/termine.html', {'form': form.as_table()}) + + +def published(request): + return render(request, 'ludwigsburgalpin/published.html')