From aad7ccffd57eca4b66dbea931f75866804cb37f7 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 15:53:31 +0200 Subject: [PATCH 01/22] updated requirements --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index 50c8909..6c4722e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,3 @@ Django==1.10.2 +mysqlclient==1.3.9 +PyMySQL==0.7.9 From 132dde04deffad1ec964b6d94f1bf64975bd6b3a Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 16:09:04 +0200 Subject: [PATCH 02/22] added startpage --- jdav_web/jdav_web/settings.py | 8 ++++++-- jdav_web/jdav_web/urls.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 3c29819..6f3cd4b 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -31,6 +31,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'startpage.apps.StartpageConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -75,8 +76,11 @@ WSGI_APPLICATION = 'jdav_web.wsgi.application' DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'jdav_db', + 'USER': 'jdav_user', + 'PASSWORD': 'jdav00jdav', + 'HOST': 'localhost' } } diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py index 3a2b7ff..ec57265 100644 --- a/jdav_web/jdav_web/urls.py +++ b/jdav_web/jdav_web/urls.py @@ -13,9 +13,10 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url +from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), + url(r'^$', include('startpage.urls')) ] From caf201dfe4af457ab7f24babfb8ef17fb7ca0320 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 16:10:39 +0200 Subject: [PATCH 03/22] now really added startpage --- jdav_web/startpage/.urls.py.swp | Bin 0 -> 12288 bytes jdav_web/startpage/.views.py.swp | Bin 0 -> 12288 bytes jdav_web/startpage/__init__.py | 0 jdav_web/startpage/admin.py | 3 +++ jdav_web/startpage/apps.py | 5 +++++ jdav_web/startpage/migrations/__init__.py | 0 jdav_web/startpage/models.py | 3 +++ .../startpage/templates/startpage/index.html | 1 + jdav_web/startpage/tests.py | 3 +++ jdav_web/startpage/urls.py | 7 +++++++ jdav_web/startpage/views.py | 6 ++++++ 11 files changed, 28 insertions(+) create mode 100644 jdav_web/startpage/.urls.py.swp create mode 100644 jdav_web/startpage/.views.py.swp create mode 100644 jdav_web/startpage/__init__.py create mode 100644 jdav_web/startpage/admin.py create mode 100644 jdav_web/startpage/apps.py create mode 100644 jdav_web/startpage/migrations/__init__.py create mode 100644 jdav_web/startpage/models.py create mode 100644 jdav_web/startpage/templates/startpage/index.html create mode 100644 jdav_web/startpage/tests.py create mode 100644 jdav_web/startpage/urls.py create mode 100644 jdav_web/startpage/views.py diff --git a/jdav_web/startpage/.urls.py.swp b/jdav_web/startpage/.urls.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..6068802029fd37e0df599f97ebd0e5ae34158560 GIT binary patch literal 12288 zcmeI&O-jQ+6bJAZ5p*MpF5FI4h(bx~2e|41T)3&K)|IQ-SIwV%Dv2$y*JXAQ*;o3 z00bZa0SG_<0uX=z1Rwwb2uz`XjEEYGME4xU|Nr6l{|C?CIbJxPIi5HkI0kuBxKF$? z1Rwwb2tWV=5P$##AOHafK;Z8LPDya%Q|_DAKilv}rd83?D$fF)MCzt05*e$yKbZJi s#6_uePT3?Ab#X$}wk8&V&~a+4`>HH2MqQb7Owck(J19=n4|8}-pDjUFBLDyZ literal 0 HcmV?d00001 diff --git a/jdav_web/startpage/.views.py.swp b/jdav_web/startpage/.views.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..4f986eeb5939905d3c3c48233d97df7d23801f83 GIT binary patch literal 12288 zcmeI&y-ve05C`xJLWl){U|=mKF53bUHge$MJ8Al1BaJ@=6{1Md{b6vrwLBsm$JwTn>>S z009U<00Izz00bZa0SG_<0ucCv0y-qRSS1=r6yN_R@Bg1N9!Y#iyh*%D6g5K$GzdTd z0uX=z1Rwwb2tWV=5P$##ekq`&v2i&kl9JHy4x7i^WNuegr$4~QGV|m|uKQ4}QD|Cf zd|^^rJEe*`XQQ1_1DmrN|1Ym1!^W4#XtC|8u%nZ<^|Q#bYvwLfaW|E2xhZ`C_(NTz literal 0 HcmV?d00001 diff --git a/jdav_web/startpage/__init__.py b/jdav_web/startpage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/startpage/admin.py b/jdav_web/startpage/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/jdav_web/startpage/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/jdav_web/startpage/apps.py b/jdav_web/startpage/apps.py new file mode 100644 index 0000000..836dc89 --- /dev/null +++ b/jdav_web/startpage/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class StartpageConfig(AppConfig): + name = 'startpage' 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 new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/jdav_web/startpage/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/jdav_web/startpage/templates/startpage/index.html b/jdav_web/startpage/templates/startpage/index.html new file mode 100644 index 0000000..50147de --- /dev/null +++ b/jdav_web/startpage/templates/startpage/index.html @@ -0,0 +1 @@ +Tolle JDAV Webseite die ganz viel kann! diff --git a/jdav_web/startpage/tests.py b/jdav_web/startpage/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/jdav_web/startpage/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/jdav_web/startpage/urls.py b/jdav_web/startpage/urls.py new file mode 100644 index 0000000..9cb3403 --- /dev/null +++ b/jdav_web/startpage/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^$', views.index, name='index') +] diff --git a/jdav_web/startpage/views.py b/jdav_web/startpage/views.py new file mode 100644 index 0000000..fa24047 --- /dev/null +++ b/jdav_web/startpage/views.py @@ -0,0 +1,6 @@ +from django.shortcuts import render + + +# Create your views here. +def index(request): + return render(request, 'startpage/index.html') From 8f869d19f0f961a997162d0f3ab5f99491680eb5 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 16:12:50 +0200 Subject: [PATCH 04/22] excludes swp files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 34a26a5..f5a94ee 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,4 @@ ENV/ # Rope project settings .ropeproject jdav_web/db.sqlite3 +*.py.swp From af614f992754c674b0fb6bcbcf3d09f357486977 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 16:14:32 +0200 Subject: [PATCH 05/22] removed swap files --- jdav_web/startpage/.urls.py.swp | Bin 12288 -> 0 bytes jdav_web/startpage/.views.py.swp | Bin 12288 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 jdav_web/startpage/.urls.py.swp delete mode 100644 jdav_web/startpage/.views.py.swp diff --git a/jdav_web/startpage/.urls.py.swp b/jdav_web/startpage/.urls.py.swp deleted file mode 100644 index 6068802029fd37e0df599f97ebd0e5ae34158560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&O-jQ+6bJAZ5p*MpF5FI4h(bx~2e|41T)3&K)|IQ-SIwV%Dv2$y*JXAQ*;o3 z00bZa0SG_<0uX=z1Rwwb2uz`XjEEYGME4xU|Nr6l{|C?CIbJxPIi5HkI0kuBxKF$? z1Rwwb2tWV=5P$##AOHafK;Z8LPDya%Q|_DAKilv}rd83?D$fF)MCzt05*e$yKbZJi s#6_uePT3?Ab#X$}wk8&V&~a+4`>HH2MqQb7Owck(J19=n4|8}-pDjUFBLDyZ diff --git a/jdav_web/startpage/.views.py.swp b/jdav_web/startpage/.views.py.swp deleted file mode 100644 index 4f986eeb5939905d3c3c48233d97df7d23801f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&y-ve05C`xJLWl){U|=mKF53bUHge$MJ8Al1BaJ@=6{1Md{b6vrwLBsm$JwTn>>S z009U<00Izz00bZa0SG_<0ucCv0y-qRSS1=r6yN_R@Bg1N9!Y#iyh*%D6g5K$GzdTd z0uX=z1Rwwb2tWV=5P$##ekq`&v2i&kl9JHy4x7i^WNuegr$4~QGV|m|uKQ4}QD|Cf zd|^^rJEe*`XQQ1_1DmrN|1Ym1!^W4#XtC|8u%nZ<^|Q#bYvwLfaW|E2xhZ`C_(NTz From 95e8b9a40956c3877cea96fe6c517c1be91e8ed8 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 17:54:19 +0200 Subject: [PATCH 06/22] added material models and admin interface --- jdav_web/jdav_web/settings.py | 1 + jdav_web/material/__init__.py | 0 jdav_web/material/admin.py | 12 ++++++ jdav_web/material/apps.py | 5 +++ jdav_web/material/migrations/0001_initial.py | 24 ++++++++++++ .../migrations/0002_auto_20161017_1522.py | 20 ++++++++++ jdav_web/material/migrations/__init__.py | 0 jdav_web/material/models.py | 37 +++++++++++++++++++ jdav_web/material/tests.py | 3 ++ jdav_web/material/views.py | 3 ++ 10 files changed, 105 insertions(+) create mode 100644 jdav_web/material/__init__.py create mode 100644 jdav_web/material/admin.py create mode 100644 jdav_web/material/apps.py create mode 100644 jdav_web/material/migrations/0001_initial.py create mode 100644 jdav_web/material/migrations/0002_auto_20161017_1522.py create mode 100644 jdav_web/material/migrations/__init__.py create mode 100644 jdav_web/material/models.py create mode 100644 jdav_web/material/tests.py create mode 100644 jdav_web/material/views.py diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 6f3cd4b..1ebd78c 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -32,6 +32,7 @@ ALLOWED_HOSTS = [] INSTALLED_APPS = [ 'startpage.apps.StartpageConfig', + 'material.apps.MaterialConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/jdav_web/material/__init__.py b/jdav_web/material/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/material/admin.py b/jdav_web/material/admin.py new file mode 100644 index 0000000..886b969 --- /dev/null +++ b/jdav_web/material/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin + +from .models import MaterialPart + +# Register your models here. + + +class MaterialAdmin(admin.ModelAdmin): + fields = ['name', 'buy_date'] + list_display = ('name', 'buy_date', 'should_be_replaced') + +admin.site.register(MaterialPart, MaterialAdmin) diff --git a/jdav_web/material/apps.py b/jdav_web/material/apps.py new file mode 100644 index 0000000..347c729 --- /dev/null +++ b/jdav_web/material/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MaterialConfig(AppConfig): + name = 'material' diff --git a/jdav_web/material/migrations/0001_initial.py b/jdav_web/material/migrations/0001_initial.py new file mode 100644 index 0000000..ae3a51b --- /dev/null +++ b/jdav_web/material/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-17 15:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='MaterialPart', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=30)), + ('buy_date', models.DateTimeField(verbose_name='purchase date')), + ], + ), + ] diff --git a/jdav_web/material/migrations/0002_auto_20161017_1522.py b/jdav_web/material/migrations/0002_auto_20161017_1522.py new file mode 100644 index 0000000..d3dfed0 --- /dev/null +++ b/jdav_web/material/migrations/0002_auto_20161017_1522.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-17 15:22 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('material', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='materialpart', + name='buy_date', + field=models.DateField(verbose_name='purchase date'), + ), + ] diff --git a/jdav_web/material/migrations/__init__.py b/jdav_web/material/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py new file mode 100644 index 0000000..270a794 --- /dev/null +++ b/jdav_web/material/models.py @@ -0,0 +1,37 @@ +from datetime import date, datetime + +from django.db import models +from django.utils import timezone + +# maximum time in years of a material part until being replaced +MAX_TIME_MATERIAL = 5 + + +# Create your models here. +class MaterialPart(models.Model): + name = models.CharField(max_length=30) + buy_date = models.DateField('purchase date') + # owner = models.ForeignKey(Leiter) to be added later when there are user + + def __repr__(self): + return self.name + + def should_be_replaced(self): + buy_time = timezone.make_aware(datetime.combine(self.buy_date, + datetime.min.time())) + return yearsago(MAX_TIME_MATERIAL) >= buy_time + + should_be_replaced.admin_order_field = 'buy_date' + should_be_replaced.boolean = True + should_be_replaced.short_description = 'Should be replaced?' + + +def yearsago(years, from_date=None): + if from_date is None: + from_date = timezone.now() + try: + return from_date.replace(year=from_date.year - years) + except ValueError: + # 29.02 -> use 28.02 + assert from_date.month == 2 and from_date.day == 29 + return from_date.replace(month=2, day=28, year=from_date.year - years) diff --git a/jdav_web/material/tests.py b/jdav_web/material/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/jdav_web/material/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/jdav_web/material/views.py b/jdav_web/material/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/jdav_web/material/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From 2235be9082e8f862ffdfdc195ac27ff19afae987 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Mon, 17 Oct 2016 18:01:52 +0200 Subject: [PATCH 07/22] removed unused import --- jdav_web/material/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 270a794..2b24ab9 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from django.db import models from django.utils import timezone From 6dd141b3fa8b548f16600c0a6356f8d981a1fafe Mon Sep 17 00:00:00 2001 From: erichhasl Date: Tue, 18 Oct 2016 19:45:37 +0200 Subject: [PATCH 08/22] added member system --- jdav_web/jdav_web/settings.py | 1 + jdav_web/members/__init__.py | 0 jdav_web/members/admin.py | 18 ++++++++++ jdav_web/members/apps.py | 5 +++ jdav_web/members/migrations/0001_initial.py | 35 +++++++++++++++++++ .../members/migrations/0002_member_email.py | 20 +++++++++++ .../migrations/0003_auto_20161018_1742.py | 20 +++++++++++ .../migrations/0004_auto_20161018_1744.py | 24 +++++++++++++ jdav_web/members/migrations/__init__.py | 0 jdav_web/members/models.py | 25 +++++++++++++ jdav_web/members/tests.py | 3 ++ jdav_web/members/views.py | 3 ++ 12 files changed, 154 insertions(+) create mode 100644 jdav_web/members/__init__.py create mode 100644 jdav_web/members/admin.py create mode 100644 jdav_web/members/apps.py create mode 100644 jdav_web/members/migrations/0001_initial.py create mode 100644 jdav_web/members/migrations/0002_member_email.py create mode 100644 jdav_web/members/migrations/0003_auto_20161018_1742.py create mode 100644 jdav_web/members/migrations/0004_auto_20161018_1744.py create mode 100644 jdav_web/members/migrations/__init__.py create mode 100644 jdav_web/members/models.py create mode 100644 jdav_web/members/tests.py create mode 100644 jdav_web/members/views.py diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 1ebd78c..369bb5f 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -33,6 +33,7 @@ ALLOWED_HOSTS = [] INSTALLED_APPS = [ 'startpage.apps.StartpageConfig', 'material.apps.MaterialConfig', + 'members.apps.MembersConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/jdav_web/members/__init__.py b/jdav_web/members/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py new file mode 100644 index 0000000..dbcafbe --- /dev/null +++ b/jdav_web/members/admin.py @@ -0,0 +1,18 @@ +from django.contrib import admin + +from .models import Member, Group + + +# Register your models here. +class MemberAdmin(admin.ModelAdmin): + fields = ['prename', 'lastname', 'email', 'birth_date', 'group'] + list_display = ('name', 'birth_date') + + +class GroupAdmin(admin.ModelAdmin): + fields = ['name', 'min_age'] + list_display = ('name', 'min_age') + + +admin.site.register(Member, MemberAdmin) +admin.site.register(Group, GroupAdmin) diff --git a/jdav_web/members/apps.py b/jdav_web/members/apps.py new file mode 100644 index 0000000..f773ade --- /dev/null +++ b/jdav_web/members/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MembersConfig(AppConfig): + name = 'members' diff --git a/jdav_web/members/migrations/0001_initial.py b/jdav_web/members/migrations/0001_initial.py new file mode 100644 index 0000000..3c010b2 --- /dev/null +++ b/jdav_web/members/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-18 17:36 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Group', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20)), + ('min_age', models.IntegerField(default=5)), + ], + ), + migrations.CreateModel( + name='Member', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('prename', models.CharField(max_length=20)), + ('lastname', models.CharField(max_length=20)), + ('birth_date', models.DateField(verbose_name='birth date')), + ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.Group')), + ], + ), + ] diff --git a/jdav_web/members/migrations/0002_member_email.py b/jdav_web/members/migrations/0002_member_email.py new file mode 100644 index 0000000..a95ffbc --- /dev/null +++ b/jdav_web/members/migrations/0002_member_email.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-18 17:41 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='member', + name='email', + field=models.CharField(default='', max_length=100), + ), + ] diff --git a/jdav_web/members/migrations/0003_auto_20161018_1742.py b/jdav_web/members/migrations/0003_auto_20161018_1742.py new file mode 100644 index 0000000..f95b120 --- /dev/null +++ b/jdav_web/members/migrations/0003_auto_20161018_1742.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-18 17:42 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0002_member_email'), + ] + + operations = [ + migrations.AlterField( + model_name='member', + name='email', + field=models.EmailField(default='', max_length=100), + ), + ] diff --git a/jdav_web/members/migrations/0004_auto_20161018_1744.py b/jdav_web/members/migrations/0004_auto_20161018_1744.py new file mode 100644 index 0000000..e479a16 --- /dev/null +++ b/jdav_web/members/migrations/0004_auto_20161018_1744.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.2 on 2016-10-18 17:44 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0003_auto_20161018_1742'), + ] + + operations = [ + migrations.RemoveField( + model_name='member', + name='group', + ), + migrations.AddField( + model_name='member', + name='group', + field=models.ManyToManyField(to='members.Group'), + ), + ] diff --git a/jdav_web/members/migrations/__init__.py b/jdav_web/members/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py new file mode 100644 index 0000000..0fbb749 --- /dev/null +++ b/jdav_web/members/models.py @@ -0,0 +1,25 @@ +from django.db import models + + +class Group(models.Model): + name = models.CharField(max_length=20) # name of group e.g: J1 etc. + min_age = models.IntegerField(default=5) # in years + + def __str__(self): + return "Group {0}".format(self.name) + + +class Member(models.Model): + prename = models.CharField(max_length=20) + lastname = models.CharField(max_length=20) + email = models.EmailField(max_length=100, default="") + birth_date = models.DateField('birth date') # to determine the age + group = models.ManyToManyField(Group) + + def __repr__(self): + return self.name + + @property + def name(self): + """Returning whole name (prename + lastname)""" + return "{0} {1}".format(self.prename, self.lastname) diff --git a/jdav_web/members/tests.py b/jdav_web/members/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/jdav_web/members/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/jdav_web/members/views.py b/jdav_web/members/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/jdav_web/members/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From 0f02570657fea7f95489711bb2af0183fc8de3c1 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Tue, 18 Oct 2016 21:21:37 +0200 Subject: [PATCH 09/22] combined member and material system --- jdav_web/material/admin.py | 12 ++++++++++- jdav_web/material/migrations/0001_initial.py | 15 +++++++++++-- .../migrations/0002_auto_20161017_1522.py | 20 ------------------ jdav_web/material/models.py | 21 +++++++++++++++++-- jdav_web/members/models.py | 14 +++++++++++-- 5 files changed, 55 insertions(+), 27 deletions(-) delete mode 100644 jdav_web/material/migrations/0002_auto_20161017_1522.py diff --git a/jdav_web/material/admin.py b/jdav_web/material/admin.py index 886b969..9f435b3 100644 --- a/jdav_web/material/admin.py +++ b/jdav_web/material/admin.py @@ -1,12 +1,22 @@ from django.contrib import admin -from .models import MaterialPart +from .models import MaterialPart, Ownership + # Register your models here. +class OwnershipInline(admin.StackedInline): + """ + This shows the ownership selection directly in the MaterialPart edit + view + """ + model = Ownership + extra = 0 class MaterialAdmin(admin.ModelAdmin): + """Edit view of a MaterialPart""" fields = ['name', 'buy_date'] list_display = ('name', 'buy_date', 'should_be_replaced') + inlines = [OwnershipInline] admin.site.register(MaterialPart, MaterialAdmin) diff --git a/jdav_web/material/migrations/0001_initial.py b/jdav_web/material/migrations/0001_initial.py index ae3a51b..7f71953 100644 --- a/jdav_web/material/migrations/0001_initial.py +++ b/jdav_web/material/migrations/0001_initial.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10.2 on 2016-10-17 15:18 +# Generated by Django 1.10.2 on 2016-10-18 19:07 from __future__ import unicode_literals from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -10,6 +11,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('members', '0004_auto_20161018_1744'), ] operations = [ @@ -18,7 +20,16 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=30)), - ('buy_date', models.DateTimeField(verbose_name='purchase date')), + ('buy_date', models.DateField(verbose_name='purchase date')), + ], + ), + migrations.CreateModel( + name='Ownership', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('count', models.IntegerField(default=1)), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='material.MaterialPart')), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.Member')), ], ), ] diff --git a/jdav_web/material/migrations/0002_auto_20161017_1522.py b/jdav_web/material/migrations/0002_auto_20161017_1522.py deleted file mode 100644 index d3dfed0..0000000 --- a/jdav_web/material/migrations/0002_auto_20161017_1522.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10.2 on 2016-10-17 15:22 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('material', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='materialpart', - name='buy_date', - field=models.DateField(verbose_name='purchase date'), - ), - ] diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 2b24ab9..5749e97 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -9,14 +9,19 @@ MAX_TIME_MATERIAL = 5 # Create your models here. class MaterialPart(models.Model): + """ + Represents one part of material, which is owned (and stored) by different + members of the association (Ownership) + """ name = models.CharField(max_length=30) buy_date = models.DateField('purchase date') - # owner = models.ForeignKey(Leiter) to be added later when there are user - def __repr__(self): + def __str__(self): + """String representation""" return self.name def should_be_replaced(self): + """Returns wether the part should be replaced cause of age""" buy_time = timezone.make_aware(datetime.combine(self.buy_date, datetime.min.time())) return yearsago(MAX_TIME_MATERIAL) >= buy_time @@ -26,7 +31,19 @@ class MaterialPart(models.Model): should_be_replaced.short_description = 'Should be replaced?' +class Ownership(models.Model): + """Represents the connection between a MaterialPart and a Member""" + material = models.ForeignKey(MaterialPart, on_delete=models.CASCADE) + owner = models.ForeignKey('members.Member') + count = models.IntegerField(default=1) + + def __str__(self): + """String representation""" + return str(self.owner) + + def yearsago(years, from_date=None): + """Function to return the date with a delta of years in the past""" if from_date is None: from_date = timezone.now() try: diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index 0fbb749..fee5bd0 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -2,21 +2,31 @@ from django.db import models class Group(models.Model): + """ + Represents one group of the association + e.g: J1, J2, Jugendleiter, etc. + """ name = models.CharField(max_length=20) # name of group e.g: J1 etc. min_age = models.IntegerField(default=5) # in years def __str__(self): - return "Group {0}".format(self.name) + """String representation""" + return self.name class Member(models.Model): + """ + Represents a member of the association + Might be a member of different groups: e.g. J1, J2, Jugendleiter, etc. + """ prename = models.CharField(max_length=20) lastname = models.CharField(max_length=20) email = models.EmailField(max_length=100, default="") birth_date = models.DateField('birth date') # to determine the age group = models.ManyToManyField(Group) - def __repr__(self): + def __str__(self): + """String representation""" return self.name @property From 1b815ec4fed499e5a29683158704d976549af207 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Wed, 19 Oct 2016 20:02:02 +0200 Subject: [PATCH 10/22] make lifetime a specific attribute of each material part --- jdav_web/material/admin.py | 4 ++-- jdav_web/material/models.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/jdav_web/material/admin.py b/jdav_web/material/admin.py index 9f435b3..2879af2 100644 --- a/jdav_web/material/admin.py +++ b/jdav_web/material/admin.py @@ -15,8 +15,8 @@ class OwnershipInline(admin.StackedInline): class MaterialAdmin(admin.ModelAdmin): """Edit view of a MaterialPart""" - fields = ['name', 'buy_date'] - list_display = ('name', 'buy_date', 'should_be_replaced') + fields = ['name', 'buy_date', 'lifetime'] + list_display = ('name', 'buy_date', 'lifetime', 'should_be_replaced') inlines = [OwnershipInline] admin.site.register(MaterialPart, MaterialAdmin) diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 5749e97..2cbc1fa 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -14,7 +14,8 @@ class MaterialPart(models.Model): members of the association (Ownership) """ name = models.CharField(max_length=30) - buy_date = models.DateField('purchase date') + buy_date = models.DateField('purchase date', editable=True) + lifetime = models.DecimalField('lifetime (years)', decimal_places=0, max_digits=3) def __str__(self): """String representation""" @@ -24,7 +25,7 @@ class MaterialPart(models.Model): """Returns wether the part should be replaced cause of age""" buy_time = timezone.make_aware(datetime.combine(self.buy_date, datetime.min.time())) - return yearsago(MAX_TIME_MATERIAL) >= buy_time + return yearsago(self.lifetime) >= buy_time should_be_replaced.admin_order_field = 'buy_date' should_be_replaced.boolean = True From 20a7dbe7d0f5187b637c94d68a02e5d5dde02c36 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Wed, 19 Oct 2016 20:30:10 +0200 Subject: [PATCH 11/22] change MaterialPart.should_be_replaced to .not_too_old It is more convenient to show the logical negation of should_be_replaced as booleans are shown as little green or red items by django. Having a green tick when the item is NOT okay seems a bit counterintuitive. --- jdav_web/material/admin.py | 2 +- jdav_web/material/models.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/jdav_web/material/admin.py b/jdav_web/material/admin.py index 2879af2..97518a9 100644 --- a/jdav_web/material/admin.py +++ b/jdav_web/material/admin.py @@ -16,7 +16,7 @@ class OwnershipInline(admin.StackedInline): class MaterialAdmin(admin.ModelAdmin): """Edit view of a MaterialPart""" fields = ['name', 'buy_date', 'lifetime'] - list_display = ('name', 'buy_date', 'lifetime', 'should_be_replaced') + list_display = ('name', 'buy_date', 'lifetime', 'not_too_old') inlines = [OwnershipInline] admin.site.register(MaterialPart, MaterialAdmin) diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 2cbc1fa..3a4709e 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -21,15 +21,15 @@ class MaterialPart(models.Model): """String representation""" return self.name - def should_be_replaced(self): + def not_too_old(self): """Returns wether the part should be replaced cause of age""" buy_time = timezone.make_aware(datetime.combine(self.buy_date, datetime.min.time())) - return yearsago(self.lifetime) >= buy_time + return yearsago(self.lifetime) < buy_time - should_be_replaced.admin_order_field = 'buy_date' - should_be_replaced.boolean = True - should_be_replaced.short_description = 'Should be replaced?' + not_too_old.admin_order_field = 'buy_date' + not_too_old.boolean = True + not_too_old.short_description = 'Not too old?' class Ownership(models.Model): From bc139c1710aa7bbd6fdf532fd0b09ef4304e9456 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Thu, 20 Oct 2016 11:28:26 +0200 Subject: [PATCH 12/22] add migrations to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f5a94ee..d82c76e 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,6 @@ ENV/ .ropeproject jdav_web/db.sqlite3 *.py.swp + +# django database migrations +*/migrations/* From dd7d98dacfb5326509cb4f18285d3258366cb743 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Thu, 20 Oct 2016 11:29:18 +0200 Subject: [PATCH 13/22] add migrations to .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d82c76e..27eecc6 100644 --- a/.gitignore +++ b/.gitignore @@ -91,4 +91,4 @@ jdav_web/db.sqlite3 *.py.swp # django database migrations -*/migrations/* +*/*/migrations/* From 0a5f4f74e1df3e94bc9d4f276e0ced98b7f6bc56 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Thu, 20 Oct 2016 12:35:33 +0200 Subject: [PATCH 14/22] implement image upload for material app --- .gitignore | 4 ++++ jdav_web/jdav_web/settings.py | 3 +++ jdav_web/jdav_web/urls.py | 8 ++++++-- jdav_web/material/admin.py | 4 ++-- jdav_web/material/models.py | 5 ++++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 27eecc6..03c1efa 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,7 @@ jdav_web/db.sqlite3 # django database migrations */*/migrations/* + +# test images for file upload +*.jpeg +*.png diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 369bb5f..05cd2ed 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -27,6 +27,9 @@ DEBUG = True ALLOWED_HOSTS = [] +# Define media paths e.g. for image storage +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' # Application definition diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py index ec57265..804c2c8 100644 --- a/jdav_web/jdav_web/urls.py +++ b/jdav_web/jdav_web/urls.py @@ -15,8 +15,12 @@ Including another URLconf """ from django.conf.urls import url, include from django.contrib import admin +from django.conf.urls.static import static +from django.conf import settings urlpatterns = [ url(r'^admin/', admin.site.urls), - url(r'^$', include('startpage.urls')) -] + url(r'^$', include('startpage.urls')), +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +# 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/material/admin.py b/jdav_web/material/admin.py index 97518a9..293804d 100644 --- a/jdav_web/material/admin.py +++ b/jdav_web/material/admin.py @@ -15,8 +15,8 @@ class OwnershipInline(admin.StackedInline): class MaterialAdmin(admin.ModelAdmin): """Edit view of a MaterialPart""" - fields = ['name', 'buy_date', 'lifetime'] - list_display = ('name', 'buy_date', 'lifetime', 'not_too_old') + fields = ['name', 'buy_date', 'lifetime', 'photo'] + list_display = ('name', 'buy_date', 'lifetime', 'not_too_old', 'photo') inlines = [OwnershipInline] admin.site.register(MaterialPart, MaterialAdmin) diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 3a4709e..c32d3dd 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -1,5 +1,6 @@ from datetime import datetime +from decimal import Decimal from django.db import models from django.utils import timezone @@ -15,7 +16,9 @@ class MaterialPart(models.Model): """ name = models.CharField(max_length=30) buy_date = models.DateField('purchase date', editable=True) - lifetime = models.DecimalField('lifetime (years)', decimal_places=0, max_digits=3) + lifetime = models.DecimalField('lifetime (years)', decimal_places=0, + max_digits=3) + photo = models.ImageField('photo', upload_to='images', blank=True) def __str__(self): """String representation""" From 35aca364202c56eda0ce6490896b298e08bfb13e Mon Sep 17 00:00:00 2001 From: erichhasl Date: Thu, 20 Oct 2016 16:34:18 +0200 Subject: [PATCH 15/22] add group filter to members list --- jdav_web/members/admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index dbcafbe..078ea1f 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -7,6 +7,7 @@ from .models import Member, Group class MemberAdmin(admin.ModelAdmin): fields = ['prename', 'lastname', 'email', 'birth_date', 'group'] list_display = ('name', 'birth_date') + list_filter = ('group',) class GroupAdmin(admin.ModelAdmin): From 2d1f013e5c608b5ebd6d793d4cb45fee48e93aa2 Mon Sep 17 00:00:00 2001 From: Schlabonski Date: Fri, 21 Oct 2016 14:19:59 +0200 Subject: [PATCH 16/22] allow european date format input in MaterialPart form --- jdav_web/material/admin.py | 6 ++++-- jdav_web/material/models.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/jdav_web/material/admin.py b/jdav_web/material/admin.py index 293804d..4c5909f 100644 --- a/jdav_web/material/admin.py +++ b/jdav_web/material/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin +from django import forms -from .models import MaterialPart, Ownership +from .models import MaterialPart, MaterialPartForm, Ownership # Register your models here. @@ -15,7 +16,8 @@ class OwnershipInline(admin.StackedInline): class MaterialAdmin(admin.ModelAdmin): """Edit view of a MaterialPart""" - fields = ['name', 'buy_date', 'lifetime', 'photo'] + + form = MaterialPartForm list_display = ('name', 'buy_date', 'lifetime', 'not_too_old', 'photo') inlines = [OwnershipInline] diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index c32d3dd..5ad4e5e 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -2,6 +2,8 @@ from datetime import datetime from decimal import Decimal from django.db import models +from django.contrib.admin import widgets +from django import forms from django.utils import timezone # maximum time in years of a material part until being replaced @@ -34,6 +36,19 @@ class MaterialPart(models.Model): not_too_old.boolean = True not_too_old.short_description = 'Not too old?' +class MaterialPartForm(forms.ModelForm): + """ + An input form for the `MaterialPart` model. + + This additional class is needed to override djangos default + `models.DateField` date format with a european format. + """ + buy_date = forms.DateField(widget=widgets.AdminDateWidget, input_formats=('%d.%m.%Y',)) + + class Meta: + model = MaterialPart + exclude = [] + class Ownership(models.Model): """Represents the connection between a MaterialPart and a Member""" From 14f8255bd726300fe12cedb135a8495361d25edc Mon Sep 17 00:00:00 2001 From: erichhasl Date: Fri, 21 Oct 2016 16:33:09 +0200 Subject: [PATCH 17/22] added localization --- jdav_web/jdav_web/settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 05cd2ed..85f34fd 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -48,6 +48,7 @@ INSTALLED_APPS = [ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', From 780e17c811552320b43f23d40dd308098c9fea09 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Fri, 21 Oct 2016 22:46:49 +0200 Subject: [PATCH 18/22] localization in url --- jdav_web/jdav_web/settings.py | 5 +++++ jdav_web/jdav_web/urls.py | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/jdav_web/jdav_web/settings.py b/jdav_web/jdav_web/settings.py index 85f34fd..f67581e 100644 --- a/jdav_web/jdav_web/settings.py +++ b/jdav_web/jdav_web/settings.py @@ -128,3 +128,8 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.10/howto/static-files/ STATIC_URL = '/static/' + + +# Locale files (translations) + +LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),) diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py index 804c2c8..fe14873 100644 --- a/jdav_web/jdav_web/urls.py +++ b/jdav_web/jdav_web/urls.py @@ -16,11 +16,16 @@ Including another URLconf from django.conf.urls import url, include from django.contrib import admin from django.conf.urls.static import static +from django.conf.urls.i18n import i18n_patterns from django.conf import settings -urlpatterns = [ +urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +print("urlpatterns", urlpatterns) + +urlpatterns += i18n_patterns( url(r'^admin/', admin.site.urls), url(r'^$', include('startpage.urls')), -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +) + # 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 From 8c95c045c6650d24d4f866b5433249e3844d10f1 Mon Sep 17 00:00:00 2001 From: erichhasl Date: Fri, 21 Oct 2016 22:48:11 +0200 Subject: [PATCH 19/22] remove print statement --- jdav_web/jdav_web/urls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/jdav_web/jdav_web/urls.py b/jdav_web/jdav_web/urls.py index fe14873..9ebd7a6 100644 --- a/jdav_web/jdav_web/urls.py +++ b/jdav_web/jdav_web/urls.py @@ -20,7 +20,6 @@ from django.conf.urls.i18n import i18n_patterns from django.conf import settings urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -print("urlpatterns", urlpatterns) urlpatterns += i18n_patterns( url(r'^admin/', admin.site.urls), From 96eabed66b6810e59c19a9df0d5efdfcb9c2a4ec Mon Sep 17 00:00:00 2001 From: erichhasl Date: Fri, 21 Oct 2016 22:56:21 +0200 Subject: [PATCH 20/22] remove manual formatting --- jdav_web/material/admin.py | 4 +--- jdav_web/material/models.py | 18 +----------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/jdav_web/material/admin.py b/jdav_web/material/admin.py index 4c5909f..782b960 100644 --- a/jdav_web/material/admin.py +++ b/jdav_web/material/admin.py @@ -1,7 +1,6 @@ from django.contrib import admin -from django import forms -from .models import MaterialPart, MaterialPartForm, Ownership +from .models import MaterialPart, Ownership # Register your models here. @@ -17,7 +16,6 @@ class OwnershipInline(admin.StackedInline): class MaterialAdmin(admin.ModelAdmin): """Edit view of a MaterialPart""" - form = MaterialPartForm list_display = ('name', 'buy_date', 'lifetime', 'not_too_old', 'photo') inlines = [OwnershipInline] diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 5ad4e5e..1c8cfa2 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -1,9 +1,6 @@ from datetime import datetime -from decimal import Decimal from django.db import models -from django.contrib.admin import widgets -from django import forms from django.utils import timezone # maximum time in years of a material part until being replaced @@ -19,7 +16,7 @@ class MaterialPart(models.Model): name = models.CharField(max_length=30) buy_date = models.DateField('purchase date', editable=True) lifetime = models.DecimalField('lifetime (years)', decimal_places=0, - max_digits=3) + max_digits=3) photo = models.ImageField('photo', upload_to='images', blank=True) def __str__(self): @@ -36,19 +33,6 @@ class MaterialPart(models.Model): not_too_old.boolean = True not_too_old.short_description = 'Not too old?' -class MaterialPartForm(forms.ModelForm): - """ - An input form for the `MaterialPart` model. - - This additional class is needed to override djangos default - `models.DateField` date format with a european format. - """ - buy_date = forms.DateField(widget=widgets.AdminDateWidget, input_formats=('%d.%m.%Y',)) - - class Meta: - model = MaterialPart - exclude = [] - class Ownership(models.Model): """Represents the connection between a MaterialPart and a Member""" From 1e465b823f6f731880ca7156ed0707783fd3740c Mon Sep 17 00:00:00 2001 From: erichhasl Date: Fri, 21 Oct 2016 23:42:59 +0200 Subject: [PATCH 21/22] add translations to models --- .gitignore | 2 +- jdav_web/material/apps.py | 2 + .../material/locale/de/LC_MESSAGES/django.po | 67 +++++++++++++++++++ jdav_web/material/models.py | 23 +++++-- jdav_web/members/apps.py | 2 + .../members/locale/de/LC_MESSAGES/django.po | 55 +++++++++++++++ jdav_web/members/models.py | 20 ++++-- 7 files changed, 158 insertions(+), 13 deletions(-) create mode 100644 jdav_web/material/locale/de/LC_MESSAGES/django.po create mode 100644 jdav_web/members/locale/de/LC_MESSAGES/django.po diff --git a/.gitignore b/.gitignore index 03c1efa..a48cce4 100644 --- a/.gitignore +++ b/.gitignore @@ -88,7 +88,7 @@ ENV/ # Rope project settings .ropeproject jdav_web/db.sqlite3 -*.py.swp +*.swp # django database migrations */*/migrations/* diff --git a/jdav_web/material/apps.py b/jdav_web/material/apps.py index 347c729..047a5ab 100644 --- a/jdav_web/material/apps.py +++ b/jdav_web/material/apps.py @@ -1,5 +1,7 @@ from django.apps import AppConfig +from django.utils.translation import ugettext_lazy as _ class MaterialConfig(AppConfig): name = 'material' + verbose_name = _('material') diff --git a/jdav_web/material/locale/de/LC_MESSAGES/django.po b/jdav_web/material/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..fd7587b --- /dev/null +++ b/jdav_web/material/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,67 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-10-21 23:38+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: apps.py:7 +msgid "material" +msgstr "Material" + +#: models.py:17 +msgid "name" +msgstr "Name" + +#: models.py:18 +msgid "purchase date" +msgstr "Kaufdatum" + +#: models.py:19 +msgid "lifetime (years)" +msgstr "Lebenszeit (Jahre)" + +#: models.py:21 +msgid "photo" +msgstr "Bild" + +#: models.py:35 +msgid "Not too old?" +msgstr "Nicht zu alt?" + +#: models.py:38 +msgid "material part" +msgstr "Materialteil" + +#: models.py:39 +msgid "material parts" +msgstr "Materialteile" + +#: models.py:45 +msgid "owner" +msgstr "Besitzer" + +#: models.py:46 +msgid "count" +msgstr "Anzahl" + +#: models.py:53 +msgid "ownership" +msgstr "Besitztum" + +#: models.py:54 +msgid "ownerships" +msgstr "Besitztümer" diff --git a/jdav_web/material/models.py b/jdav_web/material/models.py index 1c8cfa2..131eec9 100644 --- a/jdav_web/material/models.py +++ b/jdav_web/material/models.py @@ -2,6 +2,7 @@ from datetime import datetime from django.db import models from django.utils import timezone +from django.utils.translation import ugettext_lazy as _ # maximum time in years of a material part until being replaced MAX_TIME_MATERIAL = 5 @@ -13,11 +14,11 @@ class MaterialPart(models.Model): Represents one part of material, which is owned (and stored) by different members of the association (Ownership) """ - name = models.CharField(max_length=30) - buy_date = models.DateField('purchase date', editable=True) - lifetime = models.DecimalField('lifetime (years)', decimal_places=0, + name = models.CharField(_('name'), max_length=30) + buy_date = models.DateField(_('purchase date'), editable=True) + lifetime = models.DecimalField(_('lifetime (years)'), decimal_places=0, max_digits=3) - photo = models.ImageField('photo', upload_to='images', blank=True) + photo = models.ImageField(_('photo'), upload_to='images', blank=True) def __str__(self): """String representation""" @@ -31,19 +32,27 @@ class MaterialPart(models.Model): not_too_old.admin_order_field = 'buy_date' not_too_old.boolean = True - not_too_old.short_description = 'Not too old?' + not_too_old.short_description = _('Not too old?') + + class Meta: + verbose_name = _('material part') + verbose_name_plural = _('material parts') class Ownership(models.Model): """Represents the connection between a MaterialPart and a Member""" material = models.ForeignKey(MaterialPart, on_delete=models.CASCADE) - owner = models.ForeignKey('members.Member') - count = models.IntegerField(default=1) + owner = models.ForeignKey('members.Member', verbose_name=_('owner')) + count = models.IntegerField(_('count'), default=1) def __str__(self): """String representation""" return str(self.owner) + class Meta: + verbose_name = _('ownership') + verbose_name_plural = _('ownerships') + def yearsago(years, from_date=None): """Function to return the date with a delta of years in the past""" diff --git a/jdav_web/members/apps.py b/jdav_web/members/apps.py index f773ade..bc8b0c5 100644 --- a/jdav_web/members/apps.py +++ b/jdav_web/members/apps.py @@ -1,5 +1,7 @@ from django.apps import AppConfig +from django.utils.translation import ugettext_lazy as _ class MembersConfig(AppConfig): name = 'members' + verbose_name = _('members') diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..b845483 --- /dev/null +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,55 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-10-21 23:37+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: apps.py:7 models.py:45 +msgid "members" +msgstr "Teilnehmer" + +#: models.py:10 +msgid "name" +msgstr "Name" + +#: models.py:12 +msgid "minimum age (years)" +msgstr "Mindestalter (Jahre)" + +#: models.py:19 +msgid "group" +msgstr "Gruppe" + +#: models.py:20 +msgid "groups" +msgstr "Gruppen" + +#: models.py:28 +msgid "prename" +msgstr "Vorname" + +#: models.py:29 +msgid "last name" +msgstr "Nachname" + +#: models.py:31 +msgid "birth date" +msgstr "Geburtsdatum" + +#: models.py:44 +msgid "member" +msgstr "Teilnehmer" diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index fee5bd0..1dc3516 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ class Group(models.Model): @@ -6,23 +7,28 @@ class Group(models.Model): Represents one group of the association e.g: J1, J2, Jugendleiter, etc. """ - name = models.CharField(max_length=20) # name of group e.g: J1 etc. - min_age = models.IntegerField(default=5) # in years + name = models.CharField(max_length=20, verbose_name=_('name')) # e.g: J1 + min_age = models.IntegerField(default=5, + verbose_name=_('minimum age (years)')) def __str__(self): """String representation""" return self.name + class Meta: + verbose_name = _('group') + verbose_name_plural = _('groups') + class Member(models.Model): """ Represents a member of the association Might be a member of different groups: e.g. J1, J2, Jugendleiter, etc. """ - prename = models.CharField(max_length=20) - lastname = models.CharField(max_length=20) + prename = models.CharField(max_length=20, verbose_name=_('prename')) + lastname = models.CharField(max_length=20, verbose_name=_('last name')) email = models.EmailField(max_length=100, default="") - birth_date = models.DateField('birth date') # to determine the age + birth_date = models.DateField(_('birth date')) # to determine the age group = models.ManyToManyField(Group) def __str__(self): @@ -33,3 +39,7 @@ class Member(models.Model): def name(self): """Returning whole name (prename + lastname)""" return "{0} {1}".format(self.prename, self.lastname) + + class Meta: + verbose_name = _('member') + verbose_name_plural = _('members') From d7409daa7a9597dc01a1bf93315bd954404ab6da Mon Sep 17 00:00:00 2001 From: erichhasl Date: Sat, 22 Oct 2016 00:08:12 +0200 Subject: [PATCH 22/22] add translations of startpage --- .../startpage/locale/de/LC_MESSAGES/django.po | 23 +++++++++++++++++++ .../startpage/templates/startpage/index.html | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 jdav_web/startpage/locale/de/LC_MESSAGES/django.po diff --git a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..0973fdc --- /dev/null +++ b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,23 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-10-22 00:04+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: templates/startpage/index.html:2 +msgid "Awesome JDAV website being able to do a lot!" +msgstr "Tolle JDAV Webseite die ganz viel kann!" diff --git a/jdav_web/startpage/templates/startpage/index.html b/jdav_web/startpage/templates/startpage/index.html index 50147de..390893c 100644 --- a/jdav_web/startpage/templates/startpage/index.html +++ b/jdav_web/startpage/templates/startpage/index.html @@ -1 +1,2 @@ -Tolle JDAV Webseite die ganz viel kann! +{% load i18n %} +{% trans "Awesome JDAV website being able to do a lot!" %}