1 Commits

Author SHA1 Message Date
06785a3e49 Code Cleanup with ruff. 2023-08-13 15:37:48 +02:00
59 changed files with 1041 additions and 672 deletions

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.content\n" "Project-Id-Version: kasu.content\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-27 00:05+0200\n" "POT-Creation-Date: 2023-08-07 20:38+0200\n"
"PO-Revision-Date: 2018-01-12 15:25+0105\n" "PO-Revision-Date: 2018-01-12 15:25+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Deutsch <>\n" "Language-Team: Deutsch <>\n"
@@ -20,7 +20,7 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.14\n" "X-Translated-Using: django-rosetta 0.7.14\n"
#: feeds.py:18 #: feeds.py:17 feeds.py:19
msgid "Current news from Kasu" msgid "Current news from Kasu"
msgstr "Aktuelle Nachrichten von Kasu" msgstr "Aktuelle Nachrichten von Kasu"
@@ -32,7 +32,7 @@ msgstr "Neueste Kommentare auf Kasu.at "
msgid "Kasu - latest comments" msgid "Kasu - latest comments"
msgstr "Kasu - neue Kommentare" msgstr "Kasu - neue Kommentare"
#: forms.py:57 models.py:318 #: forms.py:57 models.py:320
msgid "Please upload a PDF-File to this PDF-Page." msgid "Please upload a PDF-File to this PDF-Page."
msgstr "Bitte eine PDF Datei für diese PDF Seite hochladen." msgstr "Bitte eine PDF Datei für diese PDF Seite hochladen."
@@ -44,15 +44,15 @@ msgstr "Schlagzeile"
msgid "Content" msgid "Content"
msgstr "Inhalt" msgstr "Inhalt"
#: models.py:82 models.py:150 templates/content/article_detail.html:28 #: models.py:82 models.py:151 templates/content/article_detail.html:28
msgid "Category" msgid "Category"
msgstr "Kategorie" msgstr "Kategorie"
#: models.py:83 models.py:143 #: models.py:83 models.py:144
msgid "Image" msgid "Image"
msgstr "Bild" msgstr "Bild"
#: models.py:85 models.py:145 #: models.py:85 models.py:146
msgid "Slug" msgid "Slug"
msgstr "Slug" msgstr "Slug"
@@ -80,77 +80,77 @@ msgstr "Artikel"
msgid "Articles" msgid "Articles"
msgstr "Artikel" msgstr "Artikel"
#: models.py:139 models.py:140 #: models.py:140 models.py:141
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: models.py:141 models.py:142 #: models.py:142 models.py:143
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: models.py:151 #: models.py:152
msgid "Categories" msgid "Categories"
msgstr "Kategorien" msgstr "Kategorien"
#: models.py:182 models.py:188 #: models.py:184 models.py:190
msgid "The short name for the menu-entry of this page" msgid "The short name for the menu-entry of this page"
msgstr "Ein kurzer Name für den Menüeintrag" msgstr "Ein kurzer Name für den Menüeintrag"
#: models.py:193 models.py:198 #: models.py:195 models.py:200
msgid "The page title as you'd like it to be seen by the public" msgid "The page title as you'd like it to be seen by the public"
msgstr "Der Seitentitel der öffentlich angezeigt werden soll" msgstr "Der Seitentitel der öffentlich angezeigt werden soll"
#: models.py:200 #: models.py:202
msgid "slug" msgid "slug"
msgstr "Slug" msgstr "Slug"
#: models.py:203 #: models.py:205
msgid "" msgid ""
"The name of the page as it will appear in URLs e.g http://domain.com/blog/" "The name of the page as it will appear in URLs e.g http://domain.com/blog/"
"[my-slug]/" "[my-slug]/"
msgstr "Wie die Seite in der URL aufscheint also http://domain.com/blog/[slug]" msgstr "Wie die Seite in der URL aufscheint also http://domain.com/blog/[slug]"
#: models.py:212 #: models.py:214
msgid "Path" msgid "Path"
msgstr "Pfad" msgstr "Pfad"
#: models.py:224 #: models.py:226
msgid "Position" msgid "Position"
msgstr "Position" msgstr "Position"
#: models.py:229 #: models.py:231
msgid "status" msgid "status"
msgstr "Status" msgstr "Status"
#: models.py:232 models.py:234 #: models.py:234 models.py:236
msgid "search description" msgid "search description"
msgstr "Beschreibung für Suchfunktion" msgstr "Beschreibung für Suchfunktion"
#: models.py:237 #: models.py:239
msgid "content type" msgid "content type"
msgstr "Inhaltstyp" msgstr "Inhaltstyp"
#: models.py:242 #: models.py:244
msgid "enable comments" msgid "enable comments"
msgstr "Kommentare möglich" msgstr "Kommentare möglich"
#: models.py:247 #: models.py:249
msgid "Template" msgid "Template"
msgstr "Vorlage" msgstr "Vorlage"
#: models.py:255 #: models.py:257
msgid "first created at" msgid "first created at"
msgstr "erstellt am" msgstr "erstellt am"
#: models.py:260 #: models.py:262
msgid "latest updated at" msgid "latest updated at"
msgstr "letzte Aktualisierung am" msgstr "letzte Aktualisierung am"
#: models.py:331 #: models.py:333
msgid "Page" msgid "Page"
msgstr "Seite" msgstr "Seite"
#: models.py:332 #: models.py:334
msgid "Pages" msgid "Pages"
msgstr "Seiten" msgstr "Seiten"
@@ -206,7 +206,7 @@ msgstr "Erstellt am"
msgid "share on" msgid "share on"
msgstr "Teile auf" msgstr "Teile auf"
#: templates/content/article_detail.html:48 views.py:159 #: templates/content/article_detail.html:48 views.py:160
msgid "Edit Article" msgid "Edit Article"
msgstr "Artikel bearbeiten" msgstr "Artikel bearbeiten"
@@ -251,16 +251,16 @@ msgstr "HTML spezifisch"
msgid "This Category does not exist." msgid "This Category does not exist."
msgstr "Diese Kategorie existiert nicht." msgstr "Diese Kategorie existiert nicht."
#: views.py:160 #: views.py:161
msgid "Create Article" msgid "Create Article"
msgstr "Artikel erstellen" msgstr "Artikel erstellen"
#: views.py:240 #: views.py:241
#, python-format #, python-format
msgid "No Page found matching the Path %s" msgid "No Page found matching the Path %s"
msgstr "Keine Seite unter dem Pfad %s gefunden" msgstr "Keine Seite unter dem Pfad %s gefunden"
#: views.py:269 #: views.py:270
#, python-format #, python-format
msgid "No PDF Document found matching the Path %s" msgid "No PDF Document found matching the Path %s"
msgstr "Kein PDF Dokument unter dem Pfad %s gefunden." msgstr "Kein PDF Dokument unter dem Pfad %s gefunden."

View File

@@ -2,7 +2,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
from django.db import models
import ckeditor.fields import ckeditor.fields

View File

@@ -7,7 +7,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('content', '0005_auto_20161012_2236'), ('content', '0005_auto_20161012_2236'),
] ]
@@ -16,52 +15,68 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='content_de', name='content_de',
field=ckeditor_uploader.fields.RichTextUploadingField(verbose_name='Inhalt'), field=ckeditor_uploader.fields.RichTextUploadingField(
verbose_name='Inhalt'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='content_en', name='content_en',
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, verbose_name='Content'), field=ckeditor_uploader.fields.RichTextUploadingField(
blank=True, verbose_name='Content'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='headline_en', name='headline_en',
field=models.CharField(blank=True, max_length=255, verbose_name='Headline'), field=models.CharField(
blank=True, max_length=255, verbose_name='Headline'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='image', name='image',
field=models.ImageField(blank=True, null=True, upload_to='news/', verbose_name='Bild'), field=models.ImageField(blank=True, null=True, upload_to='news/',
verbose_name='Bild'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='slug', name='slug',
field=models.SlugField(unique_for_month='date_created', verbose_name='Slug'), field=models.SlugField(unique_for_month='date_created',
verbose_name='Slug'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='category', model_name='category',
name='image', name='image',
field=models.ImageField(blank=True, null=True, upload_to='news/categories/', verbose_name='Bild'), field=models.ImageField(blank=True, null=True,
upload_to='news/categories/',
verbose_name='Bild'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='content_de', name='content_de',
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, verbose_name='Inhalt'), field=ckeditor_uploader.fields.RichTextUploadingField(
blank=True,
verbose_name='Inhalt'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='content_en', name='content_en',
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, verbose_name='Content'), field=ckeditor_uploader.fields.RichTextUploadingField(
blank=True,
verbose_name='Content'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='menu_name_de', name='menu_name_de',
field=models.CharField(help_text='Ein kurzer Name für den Menüeintrag', max_length=255, verbose_name='Menü Name'), field=models.CharField(
help_text='Ein kurzer Name für den Menüeintrag',
max_length=255, verbose_name='Menü Name'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='menu_name_en', name='menu_name_en',
field=models.CharField(blank=True, help_text='Ein kurzer Name für den Menüeintrag', max_length=255, verbose_name='Menu Name'), field=models.CharField(
blank=True,
help_text='Ein kurzer Name für den Menüeintrag',
max_length=255, verbose_name='Menu Name'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
@@ -76,16 +91,22 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='template', name='template',
field=models.CharField(default='content/page.html', max_length=255, verbose_name='Vorlage'), field=models.CharField(default='content/page.html', max_length=255,
verbose_name='Vorlage'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='title_de', name='title_de',
field=models.CharField(help_text="The page title as you'd like it to be seen by the public", max_length=255, verbose_name='Titel'), field=models.CharField(
help_text="The page title as you'd like it to be seen by the public",
max_length=255, verbose_name='Titel'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='title_en', name='title_en',
field=models.CharField(blank=True, help_text="The page title as you'd like it to be seen by the public", max_length=255, verbose_name='Title'), field=models.CharField(
blank=True,
help_text="The page title as you'd like it to be seen by the public",
max_length=255, verbose_name='Title'),
), ),
] ]

View File

@@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('content', '0006_auto_20171115_0653'), ('content', '0006_auto_20171115_0653'),
] ]
@@ -17,11 +16,15 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='author', name='author',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL, verbose_name='Autor'), field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL, verbose_name='Autor'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='category', name='category',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='content.Category', verbose_name='Kategorie'), field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
to='content.Category', verbose_name='Kategorie'),
), ),
] ]

View File

@@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('content', '0007_auto_20171214_1215'), ('content', '0007_auto_20171214_1215'),
] ]
@@ -13,46 +12,63 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='article', model_name='article',
name='status', name='status',
field=models.SmallIntegerField(choices=[(-1, 'Rejected'), (0, 'Waiting...'), (1, 'Published')], default=1, verbose_name='Status'), field=models.SmallIntegerField(
choices=[(-1, 'Rejected'), (0, 'Waiting...'), (1, 'Published')],
default=1, verbose_name='Status'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='date_created', name='date_created',
field=models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='erstellt am'), field=models.DateTimeField(
auto_now_add=True, db_index=True,
verbose_name='erstellt am'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='date_modified', name='date_modified',
field=models.DateTimeField(auto_now=True, verbose_name='letzte Aktualisierung am'), field=models.DateTimeField(auto_now=True,
verbose_name='letzte Aktualisierung am'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='description_de', name='description_de',
field=models.TextField(blank=True, verbose_name='Beschreibung für Suchfunktion'), field=models.TextField(blank=True,
verbose_name='Beschreibung für Suchfunktion'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='description_en', name='description_en',
field=models.TextField(blank=True, verbose_name='Beschreibung für Suchfunktion'), field=models.TextField(blank=True,
verbose_name='Beschreibung für Suchfunktion'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='slug', name='slug',
field=models.SlugField(help_text='Wie die Seite in der URL aufscheint also http://domain.com/blog/[slug]', max_length=100, verbose_name='Slug'), field=models.SlugField(
help_text='Wie die Seite in der URL aufscheint also ' +
'http://domain.com/blog/[slug]',
max_length=100, verbose_name='Slug'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='status', name='status',
field=models.SmallIntegerField(choices=[(-1, 'Rejected'), (0, 'Waiting...'), (1, 'Published')], default=0, verbose_name='Status'), field=models.SmallIntegerField(
choices=[(-1, 'Rejected'), (0, 'Waiting...'), (1, 'Published')],
default=0, verbose_name='Status'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='title_de', name='title_de',
field=models.CharField(help_text='Der Seitentitel der öffentlich angezeigt werden soll', max_length=255, verbose_name='Titel'), field=models.CharField(
help_text='Der Seitentitel der öffentlich angezeigt werden soll',
max_length=255, verbose_name='Titel'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='title_en', name='title_en',
field=models.CharField(blank=True, help_text='Der Seitentitel der öffentlich angezeigt werden soll', max_length=255, verbose_name='Title'), field=models.CharField(
blank=True,
help_text='Der Seitentitel der öffentlich angezeigt werden soll',
max_length=255, verbose_name='Title'),
), ),
] ]

View File

@@ -5,7 +5,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('content', '0009_alter_page_id'), ('content', '0009_alter_page_id'),
] ]
@@ -14,6 +13,8 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='parent', name='parent',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subpages', to='content.page'), field=models.ForeignKey(
blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
related_name='subpages', to='content.page'),
), ),
] ]

View File

@@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('content', '0010_alter_page_parent'), ('content', '0010_alter_page_parent'),
] ]
@@ -13,6 +12,8 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='page', model_name='page',
name='id', name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), field=models.AutoField(
auto_created=True, primary_key=True, serialize=False,
verbose_name='ID'),
), ),
] ]

View File

@@ -5,18 +5,21 @@ Created on 03.10.2011
@author: christian @author: christian
""" """
from django.urls import path from django.urls import path
from . import views
from .views import ArticleArchiveIndex, ArticleForm, ArticleYearArchive, \
ArticleMonthArchive, ArticleDetail
urlpatterns = [ urlpatterns = [
path("", ArticleArchiveIndex.as_view(), name='article-archive'), path("", views.ArticleArchiveIndex.as_view(), name='article-archive'),
path('add/', ArticleForm.as_view(), name='add-article'), path('add/', views.ArticleForm.as_view(), name='add-article'),
path('edit/<int:pk>/', ArticleForm.as_view(), name='edit-article'), path('edit/<int:pk>/', views.ArticleForm.as_view(), name='edit-article'),
path('<int:year>/', ArticleYearArchive.as_view(), name='article-archive'), path('<int:year>/', views.ArticleYearArchive.as_view(), name='article-archive'),
path('<int:year>/<int:month>/', ArticleMonthArchive.as_view(), name='article-archive'), path('<int:year>/<int:month>/', views.ArticleMonthArchive.as_view(),
path('<int:year>/<int:month>/<slug:slug>/', ArticleDetail.as_view(), name='show-article'), name='article-archive'),
path('<slug:category>/', ArticleArchiveIndex.as_view(), name='article-archive'), path('<int:year>/<int:month>/<slug:slug>/', views.ArticleDetail.as_view(),
path('<slug:category>/<int:year>/', ArticleYearArchive.as_view(), name='article-archive'), name='show-article'),
path('<slug:category>/<int:year>/<int:month>/', ArticleMonthArchive.as_view(), name='article-archive'), path('<slug:category>/', views.ArticleArchiveIndex.as_view(),
name='article-archive'),
path('<slug:category>/<int:year>/', views.ArticleYearArchive.as_view(),
name='article-archive'),
path('<slug:category>/<int:year>/<int:month>/', views.ArticleMonthArchive.as_view(),
name='article-archive'),
] ]

View File

@@ -10,7 +10,7 @@ def events_overview(request: HttpRequest) -> dict[str, Event]:
For speed reasons everything will be cached for an hour. the following For speed reasons everything will be cached for an hour. the following
variables will be added to the template context: variables will be added to the template context:
* current_event: If an event is running at this moment, the corresponding event object. * current_event: object for the currently running event.
* next_event: the next event that is upcoming. * next_event: the next event that is upcoming.
* upcoming_events: the next 3 events that are upcoming. * upcoming_events: the next 3 events that are upcoming.

View File

@@ -4,9 +4,14 @@ from . import views
urlpatterns = [ urlpatterns = [
path("", views.EventGallery.as_view(), name='event-gallery'), path("", views.EventGallery.as_view(), name='event-gallery'),
path('<int:event>/', views.EventPhotoList.as_view(), name='event-photo-list'), path('<int:event>/', views.EventPhotoList.as_view(),
path('<int:event>/upload/', views.EventPhotoUpload.as_view(), name='event-photo-upload'), name='event-photo-list'),
path('<int:event>/<int:pk>/', views.EventPhoto.as_view(), name='event-photo'), path('<int:event>/upload/', views.EventPhotoUpload.as_view(),
path('delete/<int:pk>/', views.DeleteEventPhoto.as_view(), name='delete-event-photo'), name='event-photo-upload'),
path('upload/', views.EventPhotoUpload.as_view(), name='event-photo-upload'), path('<int:event>/<int:pk>/', views.EventPhoto.as_view(),
name='event-photo'),
path('delete/<int:pk>/', views.DeleteEventPhoto.as_view(),
name='delete-event-photo'),
path('upload/', views.EventPhotoUpload.as_view(),
name='event-photo-upload'),
] ]

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.events\n" "Project-Id-Version: kasu.events\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-26 18:31+0200\n" "POT-Creation-Date: 2023-08-07 20:38+0200\n"
"PO-Revision-Date: 2018-01-12 15:25+0105\n" "PO-Revision-Date: 2018-01-12 15:25+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,7 +19,7 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n" "X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.14\n" "X-Translated-Using: django-rosetta 0.7.14\n"
#: admin.py:14 models.py:82 #: admin.py:14 models.py:83
msgid "Event Series" msgid "Event Series"
msgstr "Veranstaltungsreihen" msgstr "Veranstaltungsreihen"
@@ -35,43 +35,42 @@ msgstr "Beginn"
msgid "end" msgid "end"
msgstr "Ende" msgstr "Ende"
#: mixins.py:87 #: mixins.py:86
msgid "Event does not exist" msgid "Event does not exist"
msgstr "Veranstaltung gibt es nicht" msgstr "Veranstaltung gibt es nicht"
#: models.py:52 models.py:176 models.py:217 #: models.py:53 models.py:177 models.py:218
msgid "Name" msgid "Name"
msgstr "Name" msgstr "Name"
#: models.py:53 models.py:177 models.py:225 #: models.py:54 models.py:178 models.py:226
msgid "Description" msgid "Description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: models.py:55 templates/events/event_detail.html:29 #: models.py:56 templates/events/event_detail.html:29
#: templates/events/event_detail.html:87 templates/events/event_list.html:28 #: templates/events/event_detail.html:87 templates/events/event_list.html:28
#: templates/events/photo_upload.html:13
msgid "Start" msgid "Start"
msgstr "Beginn" msgstr "Beginn"
#: models.py:56 templates/events/event_detail.html:30 #: models.py:57 templates/events/event_detail.html:30
#: templates/events/event_detail.html:89 #: templates/events/event_detail.html:89
msgid "End" msgid "End"
msgstr "Ende" msgstr "Ende"
#: models.py:57 models.py:185 templates/events/event_detail.html:34 #: models.py:58 models.py:186 templates/events/event_detail.html:34
#: templates/events/event_detail.html:80 templates/events/event_detail.html:92 #: templates/events/event_detail.html:80 templates/events/event_detail.html:92
msgid "Homepage" msgid "Homepage"
msgstr "Homepage" msgstr "Homepage"
#: models.py:59 models.py:179 models.py:219 #: models.py:60 models.py:180 models.py:220
msgid "Image" msgid "Image"
msgstr "Bild" msgstr "Bild"
#: models.py:66 #: models.py:67
msgid "Mahjong Tournament" msgid "Mahjong Tournament"
msgstr "Mahjong Turnier" msgstr "Mahjong Turnier"
#: models.py:68 #: models.py:69
msgid "" msgid ""
"This event is a tournament, different rules apply for the kyu " "This event is a tournament, different rules apply for the kyu "
"ranking." "ranking."
@@ -79,11 +78,11 @@ msgstr ""
"Diese Veranstaltung ist ein Turnier, es gelten andere Regeln für das Kyu " "Diese Veranstaltung ist ein Turnier, es gelten andere Regeln für das Kyu "
"Ranking." "Ranking."
#: models.py:72 #: models.py:73
msgid "Mahjong Season" msgid "Mahjong Season"
msgstr "Mahjong Saison" msgstr "Mahjong Saison"
#: models.py:83 #: models.py:84
msgid "" msgid ""
"Wenn dieser Event zu einer Veranstaltungsreihe gehört werden Ort, " "Wenn dieser Event zu einer Veranstaltungsreihe gehört werden Ort, "
"Beschreibung, Bild und Homepage von dem hier angegebenen Event " "Beschreibung, Bild und Homepage von dem hier angegebenen Event "
@@ -92,72 +91,72 @@ msgstr ""
"Wenn dieser Termin zu einer Veranstaltungsreihe gehört werden Ort, " "Wenn dieser Termin zu einer Veranstaltungsreihe gehört werden Ort, "
"Beschreibung, Bild und Homepage von dem hier angegebenen Event übernommen." "Beschreibung, Bild und Homepage von dem hier angegebenen Event übernommen."
#: models.py:92 models.py:195 models.py:248 #: models.py:93 models.py:196 models.py:249
msgid "first created at" msgid "first created at"
msgstr "erstellt am" msgstr "erstellt am"
#: models.py:97 models.py:200 models.py:253 #: models.py:98 models.py:201 models.py:254
msgid "latest updated at" msgid "latest updated at"
msgstr "letzte Aktualisierung am" msgstr "letzte Aktualisierung am"
#: models.py:103 #: models.py:104
msgid "Event" msgid "Event"
msgstr "Termin" msgstr "Termin"
#: models.py:104 #: models.py:105
msgid "Events" msgid "Events"
msgstr "Termine" msgstr "Termine"
#: models.py:117 #: models.py:118
msgid "A event can't end before it had started" msgid "A event can't end before it had started"
msgstr "Eine Veranstaltung kann nicht enden bevor sie begonnen hat" msgstr "Eine Veranstaltung kann nicht enden bevor sie begonnen hat"
#: models.py:186 #: models.py:187
msgid "Postal Code" msgid "Postal Code"
msgstr "Postleitzahl" msgstr "Postleitzahl"
#: models.py:187 #: models.py:188
msgid "Street Address" msgid "Street Address"
msgstr "Straße" msgstr "Straße"
#: models.py:188 #: models.py:189
msgid "Locality" msgid "Locality"
msgstr "Ort" msgstr "Ort"
#: models.py:189 #: models.py:190
msgid "Country" msgid "Country"
msgstr "Land" msgstr "Land"
#: models.py:204 #: models.py:205
msgid "Venue" msgid "Venue"
msgstr "Veranstaltungsort" msgstr "Veranstaltungsort"
#: models.py:205 #: models.py:206
msgid "Venues" msgid "Venues"
msgstr "Veranstaltungsorte" msgstr "Veranstaltungsorte"
#: models.py:232 #: models.py:233
msgid "Startpage" msgid "Startpage"
msgstr "Startseite" msgstr "Startseite"
#: models.py:235 #: models.py:236
msgid "Display this Photo on the Startpage Teaser" msgid "Display this Photo on the Startpage Teaser"
msgstr "Foto als Teaser auf der Startseite verwenden." msgstr "Foto als Teaser auf der Startseite verwenden."
#: models.py:237 #: models.py:238
msgid "Published on" msgid "Published on"
msgstr "Veröffentlicht am" msgstr "Veröffentlicht am"
#: models.py:239 #: models.py:240
msgid "Number of views" msgid "Number of views"
msgstr "Wie oft gesehen" msgstr "Wie oft gesehen"
#: models.py:263 templates/events/event_archive.html:38 #: models.py:264 templates/events/event_archive.html:38
#: templates/events/event_list.html:18 #: templates/events/event_list.html:18
msgid "Event Image" msgid "Event Image"
msgstr "Veranstaltungsbild" msgstr "Veranstaltungsbild"
#: models.py:264 #: models.py:265
msgid "Event Images" msgid "Event Images"
msgstr "Veranstaltungsbilder" msgstr "Veranstaltungsbilder"
@@ -174,28 +173,25 @@ msgstr "Datum"
msgid "Time" msgid "Time"
msgstr "Zeit" msgstr "Zeit"
#: templates/events/event_archive.html:49 templates/events/photo_upload.html:16 #: templates/events/event_archive.html:49
msgid "from" msgid "from"
msgstr "von" msgstr "von"
#: templates/events/event_archive.html:49 templates/events/photo_upload.html:16 #: templates/events/event_archive.html:49
msgid "to" msgid "to"
msgstr "bis" msgstr "bis"
#: templates/events/event_archive.html:57 templates/events/event_detail.html:31 #: templates/events/event_archive.html:57 templates/events/event_detail.html:31
#: templates/events/event_detail.html:72 templates/events/event_list.html:32 #: templates/events/event_detail.html:72 templates/events/event_list.html:32
#: templates/events/photo_upload.html:23
msgid "Location" msgid "Location"
msgstr "Ort" msgstr "Ort"
#: templates/events/event_archive.html:58 templates/events/event_list.html:35 #: templates/events/event_archive.html:58 templates/events/event_list.html:35
#: templates/events/photo_upload.html:25 templates/events/photo_upload.html:26
msgid "Comments" msgid "Comments"
msgstr "Kommentare" msgstr "Kommentare"
#: templates/events/event_archive.html:59 templates/events/event_detail.html:36 #: templates/events/event_archive.html:59 templates/events/event_detail.html:36
#: templates/events/event_detail.html:48 templates/events/photo_list.html:4 #: templates/events/event_detail.html:48 templates/events/photo_list.html:4
#: templates/events/photo_upload.html:28 templates/events/photo_upload.html:29
msgid "Photos" msgid "Photos"
msgstr "Fotos" msgstr "Fotos"
@@ -242,7 +238,7 @@ msgid "Show on Google Maps"
msgstr "Auf Google Maps zeigen" msgstr "Auf Google Maps zeigen"
#: templates/events/event_detail.html:127 templates/events/event_form.html:9 #: templates/events/event_detail.html:127 templates/events/event_form.html:9
#: views.py:63 #: views.py:61
msgid "Edit Event" msgid "Edit Event"
msgstr "Termin bearbeiten" msgstr "Termin bearbeiten"
@@ -250,7 +246,7 @@ msgstr "Termin bearbeiten"
msgid "Add Dates" msgid "Add Dates"
msgstr "Termine hinzufügen" msgstr "Termine hinzufügen"
#: templates/events/event_form.html:9 templates/events/page.html:9 views.py:65 #: templates/events/event_form.html:9 templates/events/page.html:9 views.py:61
msgid "Add Event" msgid "Add Event"
msgstr "Neuer Termin" msgstr "Neuer Termin"
@@ -292,24 +288,23 @@ msgstr "Fotograf"
msgid "share on" msgid "share on"
msgstr "Teile auf" msgstr "Teile auf"
#: templates/events/photo_detail.html:81 #: templates/events/photo_detail.html:78
msgid "download" msgid "download"
msgstr "Herunterladen" msgstr "Herunterladen"
#: templates/events/photo_detail.html:82 #: templates/events/photo_detail.html:79
msgid "Rotate counter clockwise" msgid "Rotate counter clockwise"
msgstr "mit dem Uhrzeiger drehen" msgstr "mit dem Uhrzeiger drehen"
#: templates/events/photo_detail.html:83 #: templates/events/photo_detail.html:80
msgid "Rotate clockwise" msgid "Rotate clockwise"
msgstr "gegen den Uhrzeiger drehen" msgstr "gegen den Uhrzeiger drehen"
#: templates/events/photo_detail.html:84 #: templates/events/photo_detail.html:81
msgid "Save" msgid "Save"
msgstr "Speichern" msgstr "Speichern"
#: templates/events/photo_list.html:36 templates/events/photo_upload.html:35 #: templates/events/photo_list.html:36 templates/events/photo_upload.html:13
#: templates/events/photo_upload.html:49
msgid "Upload" msgid "Upload"
msgstr "Hochladen" msgstr "Hochladen"

View File

@@ -29,16 +29,21 @@ class Migration(migrations.Migration):
('image', models.ImageField(storage=utils.OverwriteStorage( ('image', models.ImageField(storage=utils.OverwriteStorage(
), upload_to=events.models.get_upload_path, null=True, ), upload_to=events.models.get_upload_path, null=True,
verbose_name='Bild', blank=True)), verbose_name='Bild', blank=True)),
('is_tournament', models.BooleanField(default=False, ('is_tournament', models.BooleanField(
help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.', default=False,
help_text='Diese Veranstaltung ist ein Turnier, ' +
'es gelten andere Regeln f\xfcr das Kyu Ranking.',
verbose_name='Turnier')), verbose_name='Turnier')),
('photo_count', models.PositiveIntegerField( ('photo_count', models.PositiveIntegerField(
default=0, editable=False)), default=0, editable=False)),
('event_series', ('event_series',
models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, models.ForeignKey(
on_delete=django.db.models.deletion.SET_NULL,
editable=False, to='events.Event', editable=False, to='events.Event',
blank=True, blank=True,
help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen Event \xfcbernommen.', help_text='Wenn dieser Termin zu einer Veranstaltungsreihe ' +
'geh\xf6rt werden Ort, Beschreibung, Bild und ' +
'Homepage von dem hier angegebenen Event \xfcbernommen.',
null=True, null=True,
verbose_name='Veranstaltungsreihen')), verbose_name='Veranstaltungsreihen')),
], ],
@@ -67,21 +72,19 @@ class Migration(migrations.Migration):
max_length=127, verbose_name='Stra\xdfe')), max_length=127, verbose_name='Stra\xdfe')),
('locality', ('locality',
models.CharField(max_length=127, verbose_name='Ort')), models.CharField(max_length=127, verbose_name='Ort')),
('country', models.CharField(max_length=2, verbose_name='Land', ('country', models.CharField(
choices=[(b'GB', max_length=2, verbose_name='Land',
'Vereinigtes K\xf6nigreich'), choices=[(b'GB', 'Vereinigtes K\xf6nigreich'),
(b'AF', 'Afghanistan'), (b'AF', 'Afghanistan'),
(b'AX', 'Aland Islands'), (b'AX', 'Aland Islands'),
(b'AL', 'Albanien'), (b'AL', 'Albanien'),
(b'DZ', 'Algerien'), ( (b'DZ', 'Algerien'),
b'AS', (b'AS', 'Amerikanisch-Samoa'),
'Amerikanisch-Samoa'),
(b'AD', 'Andorra'), (b'AD', 'Andorra'),
(b'AO', 'Angola'), (b'AO', 'Angola'),
(b'AI', 'Anguilla'), (b'AI', 'Anguilla'),
(b'AQ', 'Antarktika'), ( (b'AQ', 'Antarktika'),
b'AG', (b'AG', 'Antigua und Barbuda'),
'Antigua und Barbuda'),
(b'AR', 'Argentinien'), (b'AR', 'Argentinien'),
(b'AM', 'Armenien'), (b'AM', 'Armenien'),
(b'AW', 'Aruba'), (b'AW', 'Aruba'),
@@ -91,24 +94,20 @@ class Migration(migrations.Migration):
(b'BS', 'Bahamas'), (b'BS', 'Bahamas'),
(b'BH', 'Bahrein'), (b'BH', 'Bahrein'),
(b'BD', 'Bangladesch'), (b'BD', 'Bangladesch'),
(b'BB', 'Barbados'), ( (b'BB', 'Barbados'),
b'BY', (b'BY', 'Wei\xdfrussland'),
'Wei\xdfrussland'),
(b'BE', 'Belgien'), (b'BE', 'Belgien'),
(b'BZ', 'Belize'), (b'BZ', 'Belize'),
(b'BJ', 'Benin'), (b'BJ', 'Benin'),
(b'BM', 'Bermuda'), (b'BM', 'Bermuda'),
(b'BT', 'Bhutan'), (b'BT', 'Bhutan'),
(b'BO', 'Bolivien'), ( (b'BO', 'Bolivien'),
b'BA', (b'BA', 'Bosnien und Herzegowina'),
'Bosnien und Herzegowina'),
(b'BW', 'Botswana'), (b'BW', 'Botswana'),
(b'BV', 'Bouvet Island'), (b'BV', 'Bouvet Island'),
(b'BR', 'Brasilien'), ( (b'BR', 'Brasilien'),
b'IO', (b'IO', 'British Indian Ocean Territory'),
'British Indian Ocean Territory'), (b'BN', 'Brunei Darussalam'),
(b'BN',
'Brunei Darussalam'),
(b'BG', 'Bulgarien'), (b'BG', 'Bulgarien'),
(b'BF', 'Burkina Faso'), (b'BF', 'Burkina Faso'),
(b'BI', 'Burundi'), (b'BI', 'Burundi'),
@@ -117,51 +116,42 @@ class Migration(migrations.Migration):
(b'CA', 'Kanada'), (b'CA', 'Kanada'),
(b'CV', 'Cape Verde'), (b'CV', 'Cape Verde'),
(b'KY', 'Cayman Islands'), (b'KY', 'Cayman Islands'),
(b'CF', (b'CF', 'Zentralafrikanische Republik'),
'Zentralafrikanische Republik'),
(b'TD', 'Tschad'), (b'TD', 'Tschad'),
(b'CL', 'Chile'), (b'CL', 'Chile'),
(b'CN', 'China'), (b'CX', (b'CN', 'China'),
'Christmas Island'), (b'CX', 'Christmas Island'),
(b'CC', (b'CC', 'Cocos (Keeling) Islands'),
'Cocos (Keeling) Islands'),
(b'CO', 'Kolumbien'), (b'CO', 'Kolumbien'),
(b'KM', 'Komoren'), (b'KM', 'Komoren'),
(b'CG', 'Kongo'), (b'CD', (b'CG', 'Kongo'),
'Kongo, Demokratische Republik'), (b'CD', 'Kongo, Demokratische Republik'),
(b'CK', 'Cook-Inseln'), (b'CK', 'Cook-Inseln'),
(b'CR', 'Costa Rica'), (b'CR', 'Costa Rica'),
(b'CI', "Cote d'Ivoire"), (b'CI', "Cote d'Ivoire"),
(b'HR', 'Kroatien'), (b'HR', 'Kroatien'),
(b'CU', 'Kuba'), (b'CU', 'Kuba'),
(b'CY', 'Zypern'), (b'CZ', (b'CY', 'Zypern'),
'Tschechische Republik'), (b'CZ', 'Tschechische Republik'),
(b'DK', 'D\xe4nemark'), (b'DK', 'D\xe4nemark'),
(b'DJ', 'Dschibuti'), (b'DJ', 'Dschibuti'),
(b'DM', 'Dominica'), ( (b'DM', 'Dominica'),
b'DO', (b'DO', 'Dominikanische Republik'),
'Dominikanische Republik'),
(b'EC', 'Ecuador'), (b'EC', 'Ecuador'),
(b'EG', '\xc4gypten'), (b'EG', '\xc4gypten'),
(b'SV', 'El Salvador'), ( (b'SV', 'El Salvador'),
b'GQ', (b'GQ', '\xc4quatorial-Guinea'),
'\xc4quatorial-Guinea'),
(b'ER', 'Eritrea'), (b'ER', 'Eritrea'),
(b'EE', 'Estland'), (b'EE', 'Estland'),
(b'ET', '\xc4thiopien'), ( (b'ET', '\xc4thiopien'),
b'FK', (b'FK', 'Falklandinseln (Malvinas)'),
'Falklandinseln (Malvinas)'), (b'FO', 'F\xe4r\xf6er-Inseln'),
(b'FO',
'F\xe4r\xf6er-Inseln'),
(b'FJ', 'Fidschi'), (b'FJ', 'Fidschi'),
(b'FI', 'Finnland'), (b'FI', 'Finnland'),
(b'FR', 'Frankreich'), ( (b'FR', 'Frankreich'),
b'GF', (b'GF', 'Franz\xf6sisch-Guayana'),
'Franz\xf6sisch-Guayana'), (b'PF', 'Franz\xf6sisch-Polynesien'),
(b'PF', (b'TF', 'Franz\xf6sisch S\xfcdliche Territorien'),
'Franz\xf6sisch-Polynesien'),
(b'TF',
'Franz\xf6sisch S\xfcdliche Territorien'),
(b'GA', 'Gabun'), (b'GA', 'Gabun'),
(b'GM', 'Gambia'), (b'GM', 'Gambia'),
(b'GE', 'Georgia'), (b'GE', 'Georgia'),
@@ -178,18 +168,16 @@ class Migration(migrations.Migration):
(b'GN', 'Guinea'), (b'GN', 'Guinea'),
(b'GW', 'Guinea-Bissau'), (b'GW', 'Guinea-Bissau'),
(b'GY', 'Guyana'), (b'GY', 'Guyana'),
(b'HT', 'Haiti'), (b'HM', (b'HT', 'Haiti'),
'Heard und McDonald Inseln'), (b'HM', 'Heard und McDonald Inseln'),
(b'VA', (b'VA', 'Heiliger Stuhl (Vatikanstadt)'),
'Heiliger Stuhl (Vatikanstadt)'),
(b'HN', 'Honduras'), (b'HN', 'Honduras'),
(b'HK', 'Hongkong'), (b'HK', 'Hongkong'),
(b'HU', 'Ungarn'), (b'HU', 'Ungarn'),
(b'IS', 'Island'), (b'IS', 'Island'),
(b'IN', 'Indien'), (b'IN', 'Indien'),
(b'ID', 'Indonesien'), ( (b'ID', 'Indonesien'),
b'IR', (b'IR', 'Iran, Islamische Republik'),
'Iran, Islamische Republik'),
(b'IQ', 'Irak'), (b'IQ', 'Irak'),
(b'IE', 'Irland'), (b'IE', 'Irland'),
(b'IM', 'Isle of Man'), (b'IM', 'Isle of Man'),
@@ -201,39 +189,36 @@ class Migration(migrations.Migration):
(b'JO', 'Jordan'), (b'JO', 'Jordan'),
(b'KZ', 'Kasachstan'), (b'KZ', 'Kasachstan'),
(b'KE', 'Kenia'), (b'KE', 'Kenia'),
(b'KI', 'Kiribati'), ( (b'KI', 'Kiribati'),
b'KP', (b'KP', 'Korea, Demokratische Volksrepublik'),
'Korea, Demokratische Volksrepublik'), (b'KR', 'Korea, Republik'),
(
b'KR',
'Korea, Republik'),
(b'KW', 'Kuwait'), (b'KW', 'Kuwait'),
(b'KG', 'Kirgisistan'), ( (b'KG', 'Kirgisistan'),
b'LA', (b'LA', 'Lao Demokratischen Volksrepublik'),
'Lao Demokratischen Volksrepublik'),
(b'LV', 'Lettland'), (b'LV', 'Lettland'),
(b'LB', 'Libanon'), ( (b'LB', 'Libanon'),
b'LS', 'Lesotho'), (b'LS', 'Lesotho'),
(b'LR', 'Liberia'), (b'LR', 'Liberia'),
(b'LY', 'Libyen'), (b'LY', 'Libyen'),
(b'LI', 'Liechtenstein'), (b'LI', 'Liechtenstein'),
(b'LT', 'Litauen'), (b'LT', 'Litauen'),
(b'LU', 'Luxemburg'), (b'LU', 'Luxemburg'),
(b'MO', 'Macao'), (b'MK', (b'MO', 'Macao'),
(b'MK',
'Mazedonien, die ehemalige jugoslawische Republik'), 'Mazedonien, die ehemalige jugoslawische Republik'),
(b'MG', 'Madagaskar'), (b'MG', 'Madagaskar'),
(b'MW', 'Malawi'), (b'MW', 'Malawi'),
(b'MY', 'Malaysia'), (b'MY', 'Malaysia'),
(b'MV', 'Malediven'), (b'MV', 'Malediven'),
(b'ML', 'Mali'), (b'ML', 'Mali'),
(b'MT', 'Malta'), (b'MH', (b'MT', 'Malta'),
'Marshall Islands'), (b'MH', 'Marshall Islands'),
(b'MQ', 'Martinique'), (b'MQ', 'Martinique'),
(b'MR', 'Mauretanien'), (b'MR', 'Mauretanien'),
(b'MU', 'Mauritius'), (b'MU', 'Mauritius'),
(b'YT', 'Mayotte'), (b'YT', 'Mayotte'),
(b'MX', 'Mexiko'), (b'FM', (b'MX', 'Mexiko'),
'Mikronesien, F\xf6derierte Staaten von'), (b'FM', 'Mikronesien, F\xf6derierte Staaten von'),
(b'MD', 'Moldawien'), (b'MD', 'Moldawien'),
(b'MC', 'Monaco'), (b'MC', 'Monaco'),
(b'MN', 'Mongolei'), (b'MN', 'Mongolei'),
@@ -245,9 +230,8 @@ class Migration(migrations.Migration):
(b'NA', 'Namibia'), (b'NA', 'Namibia'),
(b'NR', 'Nauru'), (b'NR', 'Nauru'),
(b'NP', 'Nepal'), (b'NP', 'Nepal'),
(b'NL', 'Niederlande'), ( (b'NL', 'Niederlande'),
b'AN', (b'AN', 'Niederl\xe4ndische Antillen'),
'Niederl\xe4ndische Antillen'),
(b'NC', 'Neukaledonien'), (b'NC', 'Neukaledonien'),
(b'NZ', 'New Zealand'), (b'NZ', 'New Zealand'),
(b'NI', 'Nicaragua'), (b'NI', 'Nicaragua'),
@@ -260,11 +244,10 @@ class Migration(migrations.Migration):
(b'NO', 'Norwegen'), (b'NO', 'Norwegen'),
(b'OM', 'Oman'), (b'OM', 'Oman'),
(b'PK', 'Pakistan'), (b'PK', 'Pakistan'),
(b'PW', 'Palau'), (b'PS', (b'PW', 'Palau'),
'Pal\xe4stinensische Autonomiegebiete'), (b'PS', 'Pal\xe4stinensische Autonomiegebiete'),
(b'PA', 'Panama'), ( (b'PA', 'Panama'),
b'PG', (b'PG', 'Papua-Neuguinea'),
'Papua-Neuguinea'),
(b'PY', 'Paraguay'), (b'PY', 'Paraguay'),
(b'PE', 'Peru'), (b'PE', 'Peru'),
(b'PH', 'Philippinen'), (b'PH', 'Philippinen'),
@@ -272,26 +255,21 @@ class Migration(migrations.Migration):
(b'PL', 'Polen'), (b'PL', 'Polen'),
(b'PT', 'Portugal'), (b'PT', 'Portugal'),
(b'PR', 'Puerto Rico'), (b'PR', 'Puerto Rico'),
(b'QA', 'Katar'), (b'RE', (b'QA', 'Katar'),
'Wiedervereinigung'), (b'RE', 'Wiedervereinigung'),
(b'RO', 'Rum\xe4nien'), ( (b'RO', 'Rum\xe4nien'),
b'RU', (b'RU', 'Russischen F\xf6deration'),
'Russischen F\xf6deration'), (b'RW', 'Ruanda'),
(b'RW', 'Ruanda'), (b'BL', (b'BL', 'Saint Barthelemy'),
'Saint Barthelemy'), (b'SH', 'Saint Helena'),
(b'SH', 'Saint Helena'), ( (b'KN', 'Saint Kitts und Nevis'),
b'KN',
'Saint Kitts und Nevis'),
(b'LC', 'Santa Lucia'), (b'LC', 'Santa Lucia'),
(b'MF', 'Santa Martin'), ( (b'MF', 'Santa Martin'),
b'PM', (b'PM', 'Saint Pierre und Miquelon'),
'Saint Pierre und Miquelon'), (b'VC', 'Saint Vincent und die Grenadinen'),
(b'VC',
'Saint Vincent und die Grenadinen'),
(b'WS', 'Samoa'), (b'WS', 'Samoa'),
(b'SM', 'San Marino'), ( (b'SM', 'San Marino'),
b'ST', (b'ST', 'Sao Tome und Principe'),
'Sao Tome und Principe'),
(b'SA', 'Saudi-Arabien'), (b'SA', 'Saudi-Arabien'),
(b'SN', 'Senegal'), (b'SN', 'Senegal'),
(b'RS', 'Serbien'), (b'RS', 'Serbien'),
@@ -302,56 +280,46 @@ class Migration(migrations.Migration):
(b'SI', 'Slowenien'), (b'SI', 'Slowenien'),
(b'SB', 'Salomon-Inseln'), (b'SB', 'Salomon-Inseln'),
(b'SO', 'Somalia'), (b'SO', 'Somalia'),
(b'ZA', 'S\xfcdafrika'), ( (b'ZA', 'S\xfcdafrika'),
b'GS', (b'GS',
'S\xfcdgeorgien und die S\xfcdlichen Sandwichinseln'), 'S\xfcdgeorgien und die S\xfcdlichen Sandwichinseln'),
(b'ES', 'Spanien'), (b'ES', 'Spanien'),
(b'LK', 'Sri Lanka'), (b'LK', 'Sri Lanka'),
(b'SD', 'Sudan'), (b'SD', 'Sudan'),
(b'SR', 'Suriname'), ( (b'SR', 'Suriname'),
b'SJ', (b'SJ', 'Svalbard und Jan Mayen'),
'Svalbard und Jan Mayen'),
(b'SZ', 'Swaziland'), (b'SZ', 'Swaziland'),
(b'SE', 'Schweden'), (b'SE', 'Schweden'),
(b'CH', 'Schweiz'), ( (b'CH', 'Schweiz'),
b'SY', (b'SY', 'Arabische Republik Syrien'),
'Arabische Republik Syrien'),
(b'TW', (b'TW',
'Taiwan, Province of China'), 'Taiwan, Province of China'),
(b'TJ', 'Tadschikistan'), (b'TJ', 'Tadschikistan'),
(b'TZ', (b'TZ', 'Tansania, Vereinigte Republik'),
'Tansania, Vereinigte Republik'),
(b'TH', 'Thailand'), (b'TH', 'Thailand'),
(b'TL', 'Timor-Leste'), (b'TL', 'Timor-Leste'),
(b'TG', 'Togo'), (b'TG', 'Togo'),
(b'TK', 'Tokelau'), (b'TK', 'Tokelau'),
(b'TO', 'Tonga'), (b'TT', (b'TO', 'Tonga'),
'Trinidad und Tobago'), (b'TT', 'Trinidad und Tobago'),
(b'TN', 'Tunesien'), (b'TN', 'Tunesien'),
(b'TR', 'T\xfcrkei'), (b'TR', 'T\xfcrkei'),
(b'TM', 'Turkmenistan'), ( (b'TM', 'Turkmenistan'),
b'TC', (b'TC', 'Turks-und Caicosinseln'),
'Turks-und Caicosinseln'),
(b'TV', 'Tuvalu'), (b'TV', 'Tuvalu'),
(b'UG', 'Uganda'), (b'UG', 'Uganda'),
(b'UA', 'Ukraine'), ( (b'UA', 'Ukraine'),
b'AE', (b'AE', 'Vereinigte Arabische Emirate'),
'Vereinigte Arabische Emirate'), (b'US', 'Vereinigte Staaten'),
(b'US', (b'UM', 'United States Minor Outlying Islands'),
'Vereinigte Staaten'), (
b'UM',
'United States Minor Outlying Islands'),
(b'UY', 'Uruguay'), (b'UY', 'Uruguay'),
(b'UZ', 'Usbekistan'), (b'UZ', 'Usbekistan'),
(b'VU', 'Vanuatu'), (b'VU', 'Vanuatu'),
(b'VE', 'Venezuela'), (b'VE', 'Venezuela'),
(b'VN', 'Vietnam'), ( (b'VN', 'Vietnam'),
b'VG', (b'VG', 'Virgin Islands, British'),
'Virgin Islands, British'), (b'VI', 'Virgin Islands, US'),
(b'VI', (b'WF', 'Wallis und Futuna'),
'Virgin Islands, US'), (
b'WF',
'Wallis und Futuna'),
(b'EH', 'Westsahara'), (b'EH', 'Westsahara'),
(b'YE', 'Jemen'), (b'YE', 'Jemen'),
(b'ZM', 'Sambia'), (b'ZM', 'Sambia'),

View File

@@ -5,7 +5,6 @@ from django.db import models, migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '0001_initial'), ('events', '0001_initial'),
] ]
@@ -25,6 +24,9 @@ class Migration(migrations.Migration):
model_name='event', model_name='event',
name='mahjong_tournament', name='mahjong_tournament',
field=models.BooleanField( field=models.BooleanField(
default=False, help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.', verbose_name='Mahjong Tournament'), default=False,
help_text='Diese Veranstaltung ist ein Turnier, ' +
'es gelten andere Regeln f\xfcr das Kyu Ranking.',
verbose_name='Mahjong Tournament'),
), ),
] ]

View File

@@ -5,7 +5,6 @@ from django.db import models, migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '0002_auto_20150818_2139'), ('events', '0002_auto_20150818_2139'),
] ]
@@ -15,6 +14,9 @@ class Migration(migrations.Migration):
model_name='event', model_name='event',
name='mahjong_tournament', name='mahjong_tournament',
field=models.BooleanField( field=models.BooleanField(
default=False, help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.', verbose_name='Mahjong Turnier'), default=False,
help_text='Diese Veranstaltung ist ein Turnier, ' +
'es gelten andere Regeln f\xfcr das Kyu Ranking.',
verbose_name='Mahjong Turnier'),
), ),
] ]

View File

@@ -32,12 +32,14 @@ class Migration(migrations.Migration):
('description', models.TextField(max_length=300, ('description', models.TextField(max_length=300,
verbose_name='Beschreibung', verbose_name='Beschreibung',
blank=True)), blank=True)),
('on_startpage', models.BooleanField(default=False, ('on_startpage', models.BooleanField(
default=False,
help_text='Display this Photo on the Startpage Teaser', help_text='Display this Photo on the Startpage Teaser',
verbose_name='Startpage')), verbose_name='Startpage')),
('created_date', ('created_date',
models.DateTimeField(verbose_name='Published on')), models.DateTimeField(verbose_name='Published on')),
('views', models.PositiveIntegerField(default=0, ('views', models.PositiveIntegerField(
default=0,
verbose_name='Number of views', verbose_name='Number of views',
editable=False)), editable=False)),
], ],
@@ -67,7 +69,9 @@ class Migration(migrations.Migration):
field=models.ForeignKey( field=models.ForeignKey(
on_delete=django.db.models.deletion.SET_NULL, blank=True, on_delete=django.db.models.deletion.SET_NULL, blank=True,
to='events.Event', to='events.Event',
help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt werden Ort, Beschreibung, Bild und Homepage von dem hier angegebenen Event \xfcbernommen.', help_text='Wenn dieser Termin zu einer Veranstaltungsreihe geh\xf6rt ' +
'werden Ort, Beschreibung, Bild und Homepage von dem hier ' +
'angegebenen Event \xfcbernommen.',
null=True, verbose_name='Veranstaltungsreihen'), null=True, verbose_name='Veranstaltungsreihen'),
), ),
migrations.AlterField( migrations.AlterField(

View File

@@ -5,7 +5,6 @@ from django.db import models, migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '0004_auto_20150901_2204'), ('events', '0004_auto_20150901_2204'),
] ]
@@ -15,6 +14,7 @@ class Migration(migrations.Migration):
model_name='photo', model_name='photo',
name='on_startpage', name='on_startpage',
field=models.BooleanField( field=models.BooleanField(
default=False, help_text='Display this Photo on the Startpage Teaser', db_index=True, verbose_name='Startpage'), default=False, help_text='Display this Photo on the Startpage Teaser',
db_index=True, verbose_name='Startpage'),
), ),
] ]

View File

@@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '0005_auto_20150907_2021'), ('events', '0005_auto_20150907_2021'),
] ]
@@ -14,7 +13,8 @@ class Migration(migrations.Migration):
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='photo', name='photo',
options={'ordering': ['created_date'], 'get_latest_by': 'created_date', options={'ordering': ['created_date'], 'get_latest_by': 'created_date',
'verbose_name': 'Veranstaltungsbild', 'verbose_name_plural': 'Veranstaltungsbilder'}, 'verbose_name': 'Veranstaltungsbild',
'verbose_name_plural': 'Veranstaltungsbilder'},
), ),
migrations.AlterField( migrations.AlterField(
model_name='event', model_name='event',
@@ -31,7 +31,9 @@ class Migration(migrations.Migration):
model_name='photo', model_name='photo',
name='on_startpage', name='on_startpage',
field=models.BooleanField( field=models.BooleanField(
default=False, help_text='Foto als Teaser auf der Startseite verwenden.', db_index=True, verbose_name='Startseite'), default=False,
help_text='Foto als Teaser auf der Startseite verwenden.',
db_index=True, verbose_name='Startseite'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='photo', model_name='photo',

View File

@@ -7,7 +7,6 @@ from datetime import timezone
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '0006_auto_20160916_1800'), ('events', '0006_auto_20160916_1800'),
] ]
@@ -17,39 +16,45 @@ class Migration(migrations.Migration):
model_name='event', model_name='event',
name='date_created', name='date_created',
field=models.DateTimeField( field=models.DateTimeField(
auto_now_add=True, null=True, verbose_name='first created at', db_index=True), auto_now_add=True, null=True, verbose_name='first created at',
db_index=True),
), ),
migrations.AddField( migrations.AddField(
model_name='event', model_name='event',
name='date_modified', name='date_modified',
field=models.DateTimeField(default=datetime.datetime( field=models.DateTimeField(default=datetime.datetime(
2016, 10, 12, 20, 24, 39, 910492, tzinfo=timezone.utc), verbose_name='latest updated at', auto_now=True), 2016, 10, 12, 20, 24, 39, 910492, tzinfo=timezone.utc),
verbose_name='latest updated at', auto_now=True),
preserve_default=False, preserve_default=False,
), ),
migrations.AddField( migrations.AddField(
model_name='location', model_name='location',
name='date_created', name='date_created',
field=models.DateTimeField( field=models.DateTimeField(
auto_now_add=True, null=True, verbose_name='first created at', db_index=True), auto_now_add=True, null=True, verbose_name='first created at',
db_index=True),
), ),
migrations.AddField( migrations.AddField(
model_name='location', model_name='location',
name='date_modified', name='date_modified',
field=models.DateTimeField(default=datetime.datetime( field=models.DateTimeField(default=datetime.datetime(
2016, 10, 12, 20, 24, 44, 566305, tzinfo=timezone.utc), verbose_name='latest updated at', auto_now=True), 2016, 10, 12, 20, 24, 44, 566305, tzinfo=timezone.utc),
verbose_name='latest updated at', auto_now=True),
preserve_default=False, preserve_default=False,
), ),
migrations.AddField( migrations.AddField(
model_name='photo', model_name='photo',
name='date_created', name='date_created',
field=models.DateTimeField( field=models.DateTimeField(
auto_now_add=True, null=True, verbose_name='first created at', db_index=True), auto_now_add=True, null=True, verbose_name='first created at',
db_index=True),
), ),
migrations.AddField( migrations.AddField(
model_name='photo', model_name='photo',
name='date_modified', name='date_modified',
field=models.DateTimeField(default=datetime.datetime( field=models.DateTimeField(default=datetime.datetime(
2016, 10, 12, 20, 24, 50, 509970, tzinfo=timezone.utc), verbose_name='latest updated at', auto_now=True), 2016, 10, 12, 20, 24, 50, 509970, tzinfo=timezone.utc),
verbose_name='latest updated at', auto_now=True),
preserve_default=False, preserve_default=False,
), ),
] ]

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '0008_auto_20171115_0653'), ('events', '0008_auto_20171115_0653'),
] ]
@@ -17,16 +16,19 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='event', model_name='event',
name='location', name='location',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Location'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
to='events.Location'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='photo', model_name='photo',
name='event', name='event',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='events.Event'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
to='events.Event'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='photo', model_name='photo',
name='photographer', name='photographer',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL),
), ),
] ]

File diff suppressed because one or more lines are too long

View File

@@ -33,7 +33,8 @@ class EventDetailMixin(object):
event = None event = None
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
"""Add this event or the related event of the given object to the template context. """Adds this or the related event of the given object to the
template context.
:return: TemplateContext object""" :return: TemplateContext object"""
context = super(EventDetailMixin, self).get_context_data(**kwargs) context = super(EventDetailMixin, self).get_context_data(**kwargs)

View File

@@ -109,7 +109,7 @@ class Event(models.Model):
try: try:
return "%(name)s (%(date)s)" % {'name': self.name, return "%(name)s (%(date)s)" % {'name': self.name,
'date': self.start.date()} 'date': self.start.date()}
except: except AttributeError:
return "New Event Model" return "New Event Model"
def clean(self): def clean(self):

View File

@@ -1,5 +1,4 @@
from kasu.sitemaps import GenericSitemap from kasu.sitemaps import GenericSitemap
from django.utils import timezone
from .models import Event from .models import Event

View File

@@ -6,10 +6,15 @@ from . import views
urlpatterns = [ urlpatterns = [
path("", RedirectView.as_view(url='/events/upcoming/', permanent=True)), path("", RedirectView.as_view(url='/events/upcoming/', permanent=True)),
path('<int:year>/', views.EventArchiveYear.as_view(), name='event-archive'), path('<int:year>/', views.EventArchiveYear.as_view(), name='event-archive'),
path('<int:year>/<int:month>/', views.EventArchiveMonth.as_view(), name='event-archive'), path('<int:year>/<int:month>/', views.EventArchiveMonth.as_view(),
path('<int:year>/<int:month>/<int:pk>/', views.EventDetail.as_view(), name='event-detail'), name='event-archive'),
path('<int:year>/<int:month>/<int:pk>/add_dates/', views.EventSeriesForm.as_view(), name='event-series-form'), path('<int:year>/<int:month>/<int:pk>/', views.EventDetail.as_view(),
path('<int:year>/<int:month>/<int:pk>/edit/', views.EventForm.as_view(), name='event-form'), name='event-detail'),
path('<int:year>/<int:month>/<int:pk>/add_dates/',
views.EventSeriesForm.as_view(),
name='event-series-form'),
path('<int:year>/<int:month>/<int:pk>/edit/', views.EventForm.as_view(),
name='event-form'),
path('add/', views.EventForm.as_view(), name='event-form'), path('add/', views.EventForm.as_view(), name='event-form'),
path('archive/', views.EventArchiveIndex.as_view(), name='event-archive'), path('archive/', views.EventArchiveIndex.as_view(), name='event-archive'),
path('upcoming/', views.UpcomingEvents.as_view(), name='upcoming-events'), path('upcoming/', views.UpcomingEvents.as_view(), name='upcoming-events'),

View File

@@ -4,8 +4,6 @@ from datetime import timedelta
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.urls import reverse from django.urls import reverse
from django.db.models import Q
from django.http import Http404
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from django.utils import timezone from django.utils import timezone
@@ -56,7 +54,8 @@ class EventForm(PermissionRequiredMixin, mixins.EventDetailMixin,
permission_required = 'events.add_event' permission_required = 'events.add_event'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
"""set the title to add or edit Event, depending on the fact if an event ID was given.""" """sets the title to add or edit Event,
depending on the fact if an event ID was given."""
context = super(EventForm, self).get_context_data(**kwargs) context = super(EventForm, self).get_context_data(**kwargs)
context['title'] = _("Edit Event") if self.kwargs.get('pk') else _("Add Event") context['title'] = _("Edit Event") if self.kwargs.get('pk') else _("Add Event")
return context return context

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.utils\n" "Project-Id-Version: kasu.utils\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-26 18:31+0200\n" "POT-Creation-Date: 2023-08-07 20:38+0200\n"
"PO-Revision-Date: 2018-12-30 11:14+0105\n" "PO-Revision-Date: 2018-12-30 11:14+0105\n"
"Last-Translator: b' <kasu@xendynastie.at>'\n" "Last-Translator: b' <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -79,7 +79,7 @@ msgstr "Bevorstehende Veranstaltungen"
msgid "No events found" msgid "No events found"
msgstr "Keine Veranstaltungen gefunden" msgstr "Keine Veranstaltungen gefunden"
#: templates/base.html:149 #: templates/base.html:150
msgid "Add Subpage" msgid "Add Subpage"
msgstr "Unterseite Hinzufügen" msgstr "Unterseite Hinzufügen"
@@ -87,43 +87,43 @@ msgstr "Unterseite Hinzufügen"
msgid "Edit Page" msgid "Edit Page"
msgstr "Seite bearbeiten" msgstr "Seite bearbeiten"
#: templates/base.html:162 #: templates/base.html:163
msgid "Imprint" msgid "Imprint"
msgstr "Impressum" msgstr "Impressum"
#: templates/base.html:163 #: templates/base.html:164
msgid "contact" msgid "contact"
msgstr "Kontakt" msgstr "Kontakt"
#: templates/base.html:168 #: templates/base.html:169
msgid "Language" msgid "Language"
msgstr "Sprache" msgstr "Sprache"
#: templates/base.html:177 #: templates/base.html:178
msgid "Go" msgid "Go"
msgstr "Los" msgstr "Los"
#: templates/base.html:182 #: templates/base.html:183
msgid "Logged in as" msgid "Logged in as"
msgstr "Angemeldet als" msgstr "Angemeldet als"
#: templates/base.html:184 #: templates/base.html:185
msgid "Admin" msgid "Admin"
msgstr "Admin" msgstr "Admin"
#: templates/base.html:185 #: templates/base.html:186
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
#: templates/base.html:187 #: templates/base.html:188
msgid "no user logged in" msgid "no user logged in"
msgstr "Niemand angemeldet" msgstr "Niemand angemeldet"
#: templates/base.html:188 templates/comments/form.html:43 #: templates/base.html:189 templates/comments/form.html:43
msgid "register" msgid "register"
msgstr "Registrieren" msgstr "Registrieren"
#: templates/base.html:189 templates/comments/form.html:44 #: templates/base.html:190 templates/comments/form.html:44
msgid "login" msgid "login"
msgstr "anmelden" msgstr "anmelden"
@@ -215,11 +215,11 @@ msgstr "Besuche uns auf"
msgid "Add Article" msgid "Add Article"
msgstr "Artikel hinzufügen" msgstr "Artikel hinzufügen"
#: templates/paginator.html:7 #: templates/paginator.html:5 templates/paginator.html:7
msgid "Previous" msgid "Previous"
msgstr "Vorherige" msgstr "Vorherige"
#: templates/paginator.html:18 #: templates/paginator.html:17 templates/paginator.html:20
msgid "Next" msgid "Next"
msgstr "Nächste" msgstr "Nächste"

View File

@@ -191,7 +191,8 @@ LOGGING = {
}, },
'formatters': { 'formatters': {
'verbose': { 'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 'format': '%(levelname)s %(asctime)s %(module)s %(process)d ' +
'%(thread)d %(message)s'
}, },
'simple': { 'simple': {
'format': '%(levelname)s %(message)s' 'format': '%(levelname)s %(message)s'
@@ -275,7 +276,7 @@ KYU_RANKS = (
) )
try: try:
from .local_settings import * # Ignore PyLintBear (W0401, W0614) from .local_settings import * # noqa: F403
except ImportError: except ImportError:
pass pass

View File

@@ -10,18 +10,19 @@ from content import views, feeds
from content.sitemaps import ArticleSitemap, PageSitemap from content.sitemaps import ArticleSitemap, PageSitemap
from events.sitemaps import EventSitemap from events.sitemaps import EventSitemap
from events.views import EventListIcal from events.views import EventListIcal
from mahjong_ranking.sitemaps import *
from maistar_ranking.sitemaps import * import mahjong_ranking.sitemaps
import maistar_ranking.sitemaps
from membership.views import MembershipDetail from membership.views import MembershipDetail
admin.autodiscover() admin.autodiscover()
# register_converter('path') # register_converter('path')
sitemaps = { sitemaps = {
'event_rankings': EventRankingSitemap, 'event_rankings': mahjong_ranking.sitemaps.EventRankingSitemap,
'event_hanchans': EventHanchanSitemap, 'event_hanchans': mahjong_ranking.sitemaps.EventHanchanSitemap,
'mahjong_seasons': MahjongSeasonSitemap, 'mahjong_seasons': mahjong_ranking.sitemaps.MahjongSeasonSitemap,
'maistar_games': MaistarGamesSitemap, 'maistar_games': maistar_ranking.sitemaps.MaistarGamesSitemap,
'articles': ArticleSitemap, 'articles': ArticleSitemap,
'events': EventSitemap, 'events': EventSitemap,
'pages': PageSitemap, 'pages': PageSitemap,
@@ -40,21 +41,24 @@ urlpatterns = [ # Ignore PyLintBear (C0103)
path('feeds/latest/', feeds.LatestNews(), name='feed-latest-news'), path('feeds/latest/', feeds.LatestNews(), name='feed-latest-news'),
path('feeds/comments/', feeds.LatestComments(), name='feed-latest-comments'), path('feeds/comments/', feeds.LatestComments(), name='feed-latest-comments'),
path('gallery/', include('events.gallery_urls')), path('gallery/', include('events.gallery_urls')),
path('google25dabc1a49a9ef03.html', TemplateView.as_view(template_name='google25dabc1a49a9ef03.html')), path('google25dabc1a49a9ef03.html',
TemplateView.as_view(template_name='google25dabc1a49a9ef03.html')),
path('i18n/', include('django.conf.urls.i18n'), name='start-page'), path('i18n/', include('django.conf.urls.i18n'), name='start-page'),
path('manifest.json', TemplateView.as_view(template_name='manifest.json')), path('manifest.json', TemplateView.as_view(template_name='manifest.json')),
path('membership/', include('membership.urls')), path('membership/', include('membership.urls')),
path('news/', include('content.news_urls')), path('news/', include('content.news_urls')),
path('ranking/', include('mahjong_ranking.urls')), path('ranking/', include('mahjong_ranking.urls')),
path('ranking/', include('maistar_ranking.urls')), path('ranking/', include('maistar_ranking.urls')),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'),
path('robots.txt', TemplateView.as_view(template_name='robots.txt')), path('robots.txt', TemplateView.as_view(template_name='robots.txt')),
path('users/', MembershipDetail.as_view(), name='membership-details'), path('users/', MembershipDetail.as_view(), name='membership-details'),
path('users/<slug:username>/', MembershipDetail.as_view(), name='membership-details'), path('users/<slug:username>/',
MembershipDetail.as_view(), name='membership-details'),
path('add_page/<path:path>', views.PageAddForm.as_view(), name='add-page'), path('add_page/<path:path>', views.PageAddForm.as_view(), name='add-page'),
path('edit_page/<path:path>', views.PageEditForm.as_view(), name='edit-page'), path('edit_page/<path:path>', views.PageEditForm.as_view(), name='edit-page'),
path('<path:path>.html', views.PageHtml.as_view(), name='view-page'), path('<path:path>.html', views.PageHtml.as_view(), name='view-page'),
path('<path:path>.pdf', views.PagePdf.as_view()), path('<path:path>.pdf', views.PagePdf.as_view()),
path('sitemap.xml', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'),
] ]
if settings.DEBUG: if settings.DEBUG:

View File

@@ -1,7 +1,7 @@
""" Script to start Django as an WSGI Application. """ Script to start Django as an WSGI Application.
src_path and virtpy_path are host dependet variables. src_path and virtpy_path are host dependet variables.
TODO: Check if this file is really needet and make it host independet TODO: Check if this file is really needed and make it independent from host
""" """
import os import os
import sys import sys
@@ -14,7 +14,7 @@ if VENV_PATH not in sys.path:
if SOURCE_PATH not in sys.path: if SOURCE_PATH not in sys.path:
sys.path.append(SOURCE_PATH) sys.path.append(SOURCE_PATH)
from django.core.wsgi import get_wsgi_application from django.core.wsgi import get_wsgi_application # noqa: E402
os.environ['DJANGO_SETTINGS_MODULE'] = 'kasu.settings' os.environ['DJANGO_SETTINGS_MODULE'] = 'kasu.settings'

View File

@@ -62,7 +62,7 @@ def getattr_recursive(obj, attr_string):
:param obj: a python object. :param obj: a python object.
:param attr_string: the desired attribute of the object. :param attr_string: the desired attribute of the object.
:return: a getattr_recursice(obj, 'attr1.attr2') will return the value of attr2 of attr1 from obj :return: return the value from attr2 of attr1 from obj
""" """
attr_list = attr_string.split('.') attr_list = attr_string.split('.')
return_value = None return_value = None

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: kasu.mahjong_ranking\n" "Project-Id-Version: kasu.mahjong_ranking\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-27 00:05+0200\n" "POT-Creation-Date: 2023-08-07 20:38+0200\n"
"PO-Revision-Date: 2018-05-08 00:20+0105\n" "PO-Revision-Date: 2018-05-08 00:20+0105\n"
"Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n" "Last-Translator: b'Christian Berg <kasu@xendynastie.at>'\n"
"Language-Team: Kasu <verein@kasu.at>\n" "Language-Team: Kasu <verein@kasu.at>\n"
@@ -28,8 +28,8 @@ msgid "Confirm"
msgstr "Bestätigen" msgstr "Bestätigen"
#: admin.py:46 #: admin.py:46
msgid "Set unconfirmed" msgid "Reject"
msgstr "Als unbestätigt markieren" msgstr ""
#: forms.py:22 #: forms.py:22
msgid "start" msgid "start"
@@ -89,7 +89,7 @@ msgstr "Wurde bestätigt"
msgid "Only valid and confirmed Hanchans will be counted in the rating." msgid "Only valid and confirmed Hanchans will be counted in the rating."
msgstr "Nur gültige und bestätigte Hanchans kommen in die Wertung." msgstr "Nur gültige und bestätigte Hanchans kommen in die Wertung."
#: models.py:181 models.py:620 templates/mahjong_ranking/ladder_redbox.html:29 #: models.py:181 models.py:619 templates/mahjong_ranking/ladder_redbox.html:29
#: templates/mahjong_ranking/player_ladder_score.html:63 #: templates/mahjong_ranking/player_ladder_score.html:63
msgid "Season" msgid "Season"
msgstr "Saison" msgstr "Saison"
@@ -127,11 +127,11 @@ msgstr "Spielstand ist weniger als 100.000 Punkte"
msgid "Gamescore is over 100.000 Pt." msgid "Gamescore is over 100.000 Pt."
msgstr "Spielstand ist über 100.000 Punkte." msgstr "Spielstand ist über 100.000 Punkte."
#: models.py:368 #: models.py:367
msgid "Kyū/Dan Ranking" msgid "Kyū/Dan Ranking"
msgstr "Kyū/Dan Wertung" msgstr "Kyū/Dan Wertung"
#: models.py:369 #: models.py:368
msgid "Kyū/Dan Rankings" msgid "Kyū/Dan Rankings"
msgstr "Kyū/Dan Wertungen" msgstr "Kyū/Dan Wertungen"
@@ -386,10 +386,13 @@ msgstr "%s wurde erfolgreich aktualisiert."
msgid "%s has been added successfully. You can now add a new one." msgid "%s has been added successfully. You can now add a new one."
msgstr "%s wurde erfolgreich hinzugefügt. Du kannst eine neue eintragen." msgstr "%s wurde erfolgreich hinzugefügt. Du kannst eine neue eintragen."
#: views.py:218 #: views.py:222
msgid "No user found matching the name {}" msgid "No user found matching the name {}"
msgstr "Kein Benutzer mit dem Namen %s gefunden" msgstr "Kein Benutzer mit dem Namen %s gefunden"
#~ msgid "Set unconfirmed"
#~ msgstr "Als unbestätigt markieren"
#~ msgid "Full Name" #~ msgid "Full Name"
#~ msgstr "Voller Name" #~ msgstr "Voller Name"

View File

@@ -1,5 +1,6 @@
""" """
Recalculates all Kyu/Dan Rankings until the given date a writes them to the legacy fields. Recalculates all Kyu/Dan Rankings until the given date
and writes them to the legacy fields.
""" """
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
@@ -21,11 +22,11 @@ LEGACY_ATTRIBUTES = (
class Command(BaseCommand): class Command(BaseCommand):
""" Recalculates all Kyu/Dan Rankings until the given date a writes them to the legacy fields. """ help = "Recalculates all Kyu/Dan Rankings until the given date " + \
"and writes them to the legacy fields."
help = "Recalculates all Kyu/Dan Rankings until the given date a writes them to the legacy fields."
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('-s', '--since', nargs='?', type=parse_date, parser.add_argument('-s', '--since', nargs='?', type=parse_date,
metavar='YYYY-MM-DD', metavar='YYYY-MM-DD',
help='Use all Hanchans since the given date.') help='Use all Hanchans since the given date.')
@@ -33,7 +34,8 @@ class Command(BaseCommand):
metavar='YYYY-MM-DD', metavar='YYYY-MM-DD',
help='Only use Hanchans until the given date.') help='Only use Hanchans until the given date.')
def handle(self, *args, **options):
def handle(self, *args, **options):
since = options.get('since', None) since = options.get('since', None)
until = options.get('until', None) until = options.get('until', None)
if isinstance(since, date): if isinstance(since, date):

View File

@@ -74,7 +74,8 @@ class HanchanManager(models.Manager):
[hanchan.get_playerdata(user) for hanchan in queryset] [hanchan.get_playerdata(user) for hanchan in queryset]
return queryset return queryset
def season_hanchans(self, user: object = None, season: int = None, until: date = None): def season_hanchans(self, user: object = None,
season: int = None, until: date = None):
"""Return all Hanchans that belong to a given or the current season. """Return all Hanchans that belong to a given or the current season.
:param user: Only return Hanchans where this user participated. :param user: Only return Hanchans where this user participated.
@@ -248,7 +249,8 @@ class KyuDanRankingManager(models.Manager):
for attr, old_value in old_attr.items(): for attr, old_value in old_attr.items():
if getattr(ranking, attr) != old_value: if getattr(ranking, attr) != old_value:
LOGGER.warning( LOGGER.warning(
"%(user)s recalc shows differences in %(attr)s! old: %(old)d, new: %(new)d", "%(user)s recalc shows differences in %(attr)s! ' + "
"'old: %(old)d, new: %(new)d",
{'user': ranking.user, 'attr': attr, {'user': ranking.user, 'attr': attr,
'old': old_value or 0, 'new': getattr(ranking, attr) or 0} 'old': old_value or 0, 'new': getattr(ranking, attr, 0)}
) )

View File

@@ -3,7 +3,6 @@ from django.core.cache import cache
from mahjong_ranking import models from mahjong_ranking import models
from . import LOGGER from . import LOGGER
from . import LOGGER
class DenormalizationUpdateMiddleware: class DenormalizationUpdateMiddleware:

View File

@@ -41,7 +41,8 @@ class Migration(migrations.Migration):
serialize=False, auto_created=True, serialize=False, auto_created=True,
primary_key=True)), primary_key=True)),
('start', models.DateTimeField( ('start', models.DateTimeField(
help_text='Wichtig damit die richtigen Hanchans in die Wertung kommen.', help_text="Wichtig damit die richtigen Hanchans in die " + \
"Wertung kommen.",
verbose_name='Beginn')), verbose_name='Beginn')),
('player1_input_score', ('player1_input_score',
models.IntegerField(verbose_name='Punkte')), models.IntegerField(verbose_name='Punkte')),
@@ -55,14 +56,14 @@ class Migration(migrations.Migration):
null=True, editable=False, blank=True)), null=True, editable=False, blank=True)),
('player1_bonus_points', models.SmallIntegerField( ('player1_bonus_points', models.SmallIntegerField(
null=True, editable=False, blank=True)), null=True, editable=False, blank=True)),
('player1_comment', models.CharField(verbose_name='Anmerkung', ('player1_comment', models.CharField(verbose_name="Anmerkung",
max_length=255, max_length=255,
editable=False, editable=False,
blank=True)), blank=True)),
('player2_input_score', ('player2_input_score',
models.IntegerField(verbose_name='Punkte')), models.IntegerField(verbose_name="Punkte")),
('player2_game_score', models.PositiveIntegerField( ('player2_game_score', models.PositiveIntegerField(
default=0, verbose_name='Punkte', editable=False)), default=0, verbose_name="Punkte", editable=False)),
('player2_placement', models.PositiveSmallIntegerField( ('player2_placement', models.PositiveSmallIntegerField(
default=0, editable=False)), default=0, editable=False)),
('player2_kyu_points', models.SmallIntegerField( ('player2_kyu_points', models.SmallIntegerField(
@@ -111,7 +112,8 @@ class Migration(migrations.Migration):
models.TextField(verbose_name='Anmerkung', blank=True)), models.TextField(verbose_name='Anmerkung', blank=True)),
('confirmed', models.BooleanField( ('confirmed', models.BooleanField(
default=True, default=True,
help_text='Nur g\xfcltige und best\xe4tigte Hanchans kommen in die Wertung.', help_text="Nur g\xfcltige und best\xe4tigte Hanchans kommen " + \
"in die Wertung.",
verbose_name='Wurde best\xe4tigt')), verbose_name='Wurde best\xe4tigt')),
('player_names', ('player_names',
models.CharField(max_length=255, editable=False)), models.CharField(max_length=255, editable=False)),

View File

@@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('mahjong_ranking', '0004_auto_20170218_1947'), ('mahjong_ranking', '0004_auto_20170218_1947'),
] ]
@@ -14,7 +13,9 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='kyudanranking', name='kyudanranking',
options={'ordering': ('-dan_points', 'dan', '-kyu_points'), 'verbose_name': 'Kyū/Dan Wertung', 'verbose_name_plural': 'Kyū/Dan Wertungen'}, options={'ordering': ('-dan_points', 'dan', '-kyu_points'),
'verbose_name': 'Kyū/Dan Wertung',
'verbose_name_plural': 'Kyū/Dan Wertungen'},
), ),
migrations.AddField( migrations.AddField(
model_name='kyudanranking', model_name='kyudanranking',

View File

@@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('mahjong_ranking', '0005_auto_20171115_0653'), ('mahjong_ranking', '0005_auto_20171115_0653'),
] ]
@@ -42,27 +41,40 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='eventranking', model_name='eventranking',
name='user', name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL),
), ),
migrations.AlterField( migrations.AlterField(
model_name='hanchan', model_name='hanchan',
name='player1', name='player1',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 1'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='user_hanchan+',
to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 1'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='hanchan', model_name='hanchan',
name='player2', name='player2',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 2'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='user_hanchan+',
to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 2'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='hanchan', model_name='hanchan',
name='player3', name='player3',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 3'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='user_hanchan+',
to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 3'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='hanchan', model_name='hanchan',
name='player4', name='player4',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='user_hanchan+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 4'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='user_hanchan+',
to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 4'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='kyudanranking', model_name='kyudanranking',
@@ -82,6 +94,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='seasonranking', model_name='seasonranking',
name='user', name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL),
), ),
] ]

View File

@@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('mahjong_ranking', '0006_auto_20171214_1318'), ('mahjong_ranking', '0006_auto_20171214_1318'),
] ]
@@ -12,7 +11,11 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='kyudanranking', name='kyudanranking',
options={'ordering': (models.OrderBy(models.F('dan'), descending=True, nulls_last=True), '-dan_points', '-kyu_points', '-won_hanchans', '-good_hanchans', '-last_hanchan_date'), 'verbose_name': 'Kyū/Dan Wertung', 'verbose_name_plural': 'Kyū/Dan Wertungen'}, options={'ordering': (
models.OrderBy(models.F('dan'), descending=True, nulls_last=True),
'-dan_points', '-kyu_points', '-won_hanchans', '-good_hanchans',
'-last_hanchan_date'), 'verbose_name': 'Kyū/Dan Wertung',
'verbose_name_plural': 'Kyū/Dan Wertungen'},
), ),
migrations.AddField( migrations.AddField(
model_name='kyudanranking', model_name='kyudanranking',

View File

@@ -14,7 +14,6 @@ from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from events.models import Event from events.models import Event
from . import DAN_RANKS_DICT, LOGGER, set_dirty from . import DAN_RANKS_DICT, LOGGER, set_dirty
from . import managers from . import managers
@@ -445,8 +444,8 @@ class KyuDanRanking(models.Model):
settings.TOURNAMENT_WIN_BONUSPOINTS) settings.TOURNAMENT_WIN_BONUSPOINTS)
if event_ranking.avg_placement == 1: if event_ranking.avg_placement == 1:
bonus_points += settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS bonus_points += settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS
hanchan.player_comment += u'+{0:d} Pkt: alle Spiele des Turnieres gewonnen. '.format( hanchan.player_comment += '+{0:d} Pkt: alle Spiele des Turnieres \
settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS) gewonnen. '.format(settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS)
if bonus_points and self.dan: if bonus_points and self.dan:
hanchan.dan_points += bonus_points hanchan.dan_points += bonus_points
@@ -504,12 +503,15 @@ class KyuDanRanking(models.Model):
else: else:
until = valid_hanchans.aggregate(until=models.Max("start"))["until"] until = valid_hanchans.aggregate(until=models.Max("start"))["until"]
if valid_hanchans.count() > 0: if valid_hanchans.count() > 0:
LOGGER.info(f"recalculating Kyu/Dan points for {self.user} ({since:%Y-%m-%d} - {until:%Y-%m-%d})...") LOGGER.info(f"recalculating Kyu/Dan points for {self.user} " +
f"({since:%Y-%m-%d} - {until:%Y-%m-%d})...")
else: else:
LOGGER.info(f"No new valid Hanchans for {self.user}...") LOGGER.info(f"No new valid Hanchans for {self.user}...")
for hanchan in valid_hanchans: for hanchan in valid_hanchans:
self.hanchan_count += 1 self.hanchan_count += 1
LOGGER.info(f"{self.user} Hanchan no. {self.hanchan_count} from {hanchan.start}") LOGGER.info(
f"{self.user} Hanchan no. {self.hanchan_count} " +
f"from {hanchan.start}")
hanchan.get_playerdata(self.user) hanchan.get_playerdata(self.user)
if since and hanchan.start < since: if since and hanchan.start < since:
LOGGER.info(hanchan, "<", since, "no recalc") LOGGER.info(hanchan, "<", since, "no recalc")
@@ -578,14 +580,16 @@ class KyuDanRanking(models.Model):
# Only substract so much points that player has 0 Points: # Only substract so much points that player has 0 Points:
if self.dan_points + hanchan.dan_points < 0: if self.dan_points + hanchan.dan_points < 0:
hanchan.player_comment = 'Spieler unterschreitet 0 Punkte.' \ hanchan.player_comment = 'Spieler unterschreitet 0 Punkte.' \
'(Original {} Punkte)'.format(hanchan.dan_points) '(Original {} Punkte)'.format(
hanchan.dan_points)
hanchan.dan_points -= (self.dan_points + hanchan.dan_points) hanchan.dan_points -= (self.dan_points + hanchan.dan_points)
self.dan_points += hanchan.dan_points self.dan_points += hanchan.dan_points
else: else:
# Only substract so much points that player has 0 Points: # Only substract so much points that player has 0 Points:
if self.kyu_points + hanchan.kyu_points < 0: if self.kyu_points + hanchan.kyu_points < 0:
hanchan.player_comment = 'Spieler unterschreitet 0 Punkte.' \ hanchan.player_comment = 'Spieler unterschreitet 0 Punkte.' \
'(Original {} Punkte)'.format(hanchan.kyu_points) '(Original {} Punkte)'.format(
hanchan.kyu_points)
hanchan.kyu_points -= (self.kyu_points + hanchan.kyu_points) hanchan.kyu_points -= (self.kyu_points + hanchan.kyu_points)
self.kyu_points += hanchan.kyu_points self.kyu_points += hanchan.kyu_points

View File

@@ -97,7 +97,6 @@ class KyuDanTest(TestCase):
self.assertEqual( self.assertEqual(
points[dan_kyu], points[dan_kyu],
getattr(ranking, dan_kyu), getattr(ranking, dan_kyu),
"{dan_kyu} for {player} won't compute! ranking: {ranking}, sum: {sum}".format( f"{dan_kyu} for {ranking.user} won't compute! " +
dan_kyu=dan_kyu, player=ranking.user, f"ranking: {ranking.dan_kyu}, sum: {points[dan_kyu]}"
ranking=getattr(ranking, dan_kyu), sum=points[dan_kyu])
) )

View File

@@ -7,18 +7,32 @@ from . import views
urlpatterns = [ urlpatterns = [
path("", RedirectView.as_view(url='/ranking/mahjong-ladder/', permanent=True)), path("", RedirectView.as_view(url='/ranking/mahjong-ladder/', permanent=True)),
path('event/<int:event>/add-hanchan/', views.HanchanForm.as_view(), name="add-hanchan-form"), path('event/<int:event>/add-hanchan/', views.HanchanForm.as_view(),
path('event/<int:event>/edit/', views.EventHanchanForm.as_view(), name="event-hanchan-form"), name="add-hanchan-form"),
path('event/<int:event>/mahjong/', views.EventHanchanList.as_view(), name="event-hanchan-list"), path('event/<int:event>/edit/', views.EventHanchanForm.as_view(),
path('event/<int:event>/mahjong-ranking/', views.EventRankingList.as_view(), name="event-ranking"), name="event-hanchan-form"),
path('hanchan/<int:hanchan>/edit/', views.HanchanForm.as_view(), name="edit-hanchan"), path('event/<int:event>/mahjong/', views.EventHanchanList.as_view(),
path('hanchan/<int:hanchan>/delete/', views.DeleteHanchan.as_view(), name="delete-hanchan"), name="event-hanchan-list"),
path('mahjong-ladder/', views.SeasonRankingList.as_view(), name="mahjong-ladder"), path('event/<int:event>/mahjong-ranking/', views.EventRankingList.as_view(),
path('mahjong-ladder/<int:season>/', views.SeasonRankingList.as_view(), name="mahjong-ladder"), name="event-ranking"),
path('player/<slug:username>/dan/', views.PlayerDanScore.as_view(), name="player-dan-score"), path('hanchan/<int:hanchan>/edit/', views.HanchanForm.as_view(),
path('player/<slug:username>/invalid/', views.PlayerInvalidScore.as_view(), name="player-invalid-score"), name="edit-hanchan"),
path('player/<slug:username>/kyu/', views.PlayerKyuScore.as_view(), name="player-kyu-score"), path('hanchan/<int:hanchan>/delete/', views.DeleteHanchan.as_view(),
path('player/<slug:username>/ladder/', views.PlayerLadderScore.as_view(), name="player-ladder-score"), name="delete-hanchan"),
path('mahjong/', views.KyuDanRankingList.as_view(), name="kyudanranking-list"), path('mahjong-ladder/', views.SeasonRankingList.as_view(),
path('mahjong/<str:order_by>/', views.KyuDanRankingList.as_view(), name="kyudanranking-list"), name="mahjong-ladder"),
path('mahjong-ladder/<int:season>/', views.SeasonRankingList.as_view(),
name="mahjong-ladder"),
path('player/<slug:username>/dan/', views.PlayerDanScore.as_view(),
name="player-dan-score"),
path('player/<slug:username>/invalid/', views.PlayerInvalidScore.as_view(),
name="player-invalid-score"),
path('player/<slug:username>/kyu/', views.PlayerKyuScore.as_view(),
name="player-kyu-score"),
path('player/<slug:username>/ladder/', views.PlayerLadderScore.as_view(),
name="player-ladder-score"),
path('mahjong/', views.KyuDanRankingList.as_view(),
name="kyudanranking-list"),
path('mahjong/<str:order_by>/', views.KyuDanRankingList.as_view(),
name="kyudanranking-list"),
] ]

View File

@@ -6,7 +6,6 @@ from django.conf import settings
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('events', '__first__'), ('events', '__first__'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
@@ -17,7 +16,8 @@ class Migration(migrations.Migration):
name='Game', name='Game',
fields=[ fields=[
('id', models.AutoField(verbose_name='ID', ('id', models.AutoField(verbose_name='ID',
serialize=False, auto_created=True, primary_key=True)), serialize=False, auto_created=True,
primary_key=True)),
('comment', models.TextField(verbose_name='Anmerkung', blank=True)), ('comment', models.TextField(verbose_name='Anmerkung', blank=True)),
('player1_score', models.SmallIntegerField(verbose_name='Punkte')), ('player1_score', models.SmallIntegerField(verbose_name='Punkte')),
('player1_placement', models.PositiveSmallIntegerField(editable=False)), ('player1_placement', models.PositiveSmallIntegerField(editable=False)),
@@ -32,31 +32,47 @@ class Migration(migrations.Migration):
('player6_score', models.SmallIntegerField(verbose_name='Punkte')), ('player6_score', models.SmallIntegerField(verbose_name='Punkte')),
('player6_placement', models.PositiveSmallIntegerField(editable=False)), ('player6_placement', models.PositiveSmallIntegerField(editable=False)),
('confirmed', models.BooleanField( ('confirmed', models.BooleanField(
default=True, help_text='das Spiel z\xe4hlt nur wenn es best\xe4tigt wurde', verbose_name='Wurde best\xe4tigt')), default=True,
help_text='das Spiel z\xe4hlt nur wenn es best\xe4tigt wurde',
verbose_name='Wurde best\xe4tigt')),
('player_names', models.CharField(max_length=255, editable=False)), ('player_names', models.CharField(max_length=255, editable=False)),
('season', models.PositiveSmallIntegerField( ('season', models.PositiveSmallIntegerField(
verbose_name='Saison', editable=False, db_index=True)), verbose_name='Saison', editable=False, db_index=True)),
('event', models.ForeignKey( ('event', models.ForeignKey(
related_name='maistargame_set', to='events.Event', on_delete=models.CASCADE)), related_name='maistargame_set', to='events.Event',
on_delete=models.CASCADE)),
('player1', models.ForeignKey(related_name='+', ('player1', models.ForeignKey(related_name='+',
verbose_name='Spieler 1', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), verbose_name='Spieler 1',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player2', models.ForeignKey(related_name='+', ('player2', models.ForeignKey(related_name='+',
verbose_name='Spieler 2', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), verbose_name='Spieler 2',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player3', models.ForeignKey(related_name='+', ('player3', models.ForeignKey(related_name='+',
verbose_name='Spieler 3', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), verbose_name='Spieler 3',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player4', models.ForeignKey(related_name='+', ('player4', models.ForeignKey(related_name='+',
verbose_name='Spieler 4', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), verbose_name='Spieler 4',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player5', models.ForeignKey(related_name='+', ('player5', models.ForeignKey(related_name='+',
verbose_name='Spieler 5', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), verbose_name='Spieler 5',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player6', models.ForeignKey(related_name='+', ('player6', models.ForeignKey(related_name='+',
verbose_name='Spieler 6', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), verbose_name='Spieler 6',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='Ranking', name='Ranking',
fields=[ fields=[
('id', models.AutoField(verbose_name='ID', ('id', models.AutoField(verbose_name='ID',
serialize=False, auto_created=True, primary_key=True)), serialize=False, auto_created=True,
primary_key=True)),
('season', models.PositiveSmallIntegerField(verbose_name='Saison')), ('season', models.PositiveSmallIntegerField(verbose_name='Saison')),
('placement', models.PositiveIntegerField(null=True, blank=True)), ('placement', models.PositiveIntegerField(null=True, blank=True)),
('avg_placement', models.PositiveSmallIntegerField( ('avg_placement', models.PositiveSmallIntegerField(
@@ -65,7 +81,8 @@ class Migration(migrations.Migration):
('games_count', models.PositiveSmallIntegerField(default=0)), ('games_count', models.PositiveSmallIntegerField(default=0)),
('games_good', models.PositiveSmallIntegerField(default=0)), ('games_good', models.PositiveSmallIntegerField(default=0)),
('games_won', models.PositiveSmallIntegerField(default=0)), ('games_won', models.PositiveSmallIntegerField(default=0)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
], ],
options={ options={
'ordering': ('-season', 'placement', 'avg_placement', '-avg_score'), 'ordering': ('-season', 'placement', 'avg_placement', '-avg_score'),

View File

@@ -8,7 +8,6 @@ import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('maistar_ranking', '0006_auto_20171115_0653'), ('maistar_ranking', '0006_auto_20171115_0653'),
] ]
@@ -17,36 +16,49 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='player1', name='player1',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 1'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 1'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='player2', name='player2',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 2'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 2'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='player3', name='player3',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 3'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 3'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='player4', name='player4',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 4'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 4'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='player5', name='player5',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 5'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 5'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='player6', name='player6',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Spieler 6'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
related_name='+', to=settings.AUTH_USER_MODEL,
verbose_name='Spieler 6'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='ranking', model_name='ranking',
name='user', name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT,
to=settings.AUTH_USER_MODEL),
), ),
] ]

View File

@@ -211,7 +211,8 @@ def update_maistar_ranking(sender, **kwargs):
""" """
A Django signal hook to trigger a recalculation of the rankings as soon A Django signal hook to trigger a recalculation of the rankings as soon
as a Mai-Star game has been added, deleted, or modified. as a Mai-Star game has been added, deleted, or modified.
:param sender: The callback function which will be connected to this signal. See Receiver functions for more information. :param sender: The callback function which will be connected to this signal.
See Receiver functions for more information.
:param kwargs: """ :param kwargs: """
instance = kwargs['instance'] instance = kwargs['instance']
for player in instance.player_list: for player in instance.player_list:

View File

@@ -1,6 +1,5 @@
"""To geneate a Sitemap with all events.""" """To geneate a Sitemap with all events."""
from kasu.sitemaps import GenericSitemap from kasu.sitemaps import GenericSitemap
from django.utils import timezone
from django.urls import reverse from django.urls import reverse
from events.models import Event from events.models import Event

View File

@@ -5,12 +5,21 @@ from . import views
urlpatterns = [ urlpatterns = [
path("", views.ListRankings.as_view()), path("", views.ListRankings.as_view()),
path('event/<int:event>/maistar/', views.ListGames.as_view(), name="maistar-game-list"), path('event/<int:event>/maistar/', views.ListGames.as_view(),
path('event/<int:event>/maistar/add/', views.GameForm.as_view(), name="maistar-add-game"), name="maistar-game-list"),
path('maistar/', views.ListRankings.as_view(), name="maistar-ranking"), path('event/<int:event>/maistar/add/', views.GameForm.as_view(),
path('maistar/<int:season>/', views.ListRankings.as_view(), name="maistar-ranking"), name="maistar-add-game"),
path('maistar/<int:game>/edit/', views.GameForm.as_view(), name="maistar-edit-game"), path('maistar/', views.ListRankings.as_view(),
path('maistar/<int:game>/delete/', views.DeleteGame.as_view(), name="maistar-delete-game"), name="maistar-ranking"),
path('player/<slug:username>/maistar/', views.ListPlayerGames.as_view(), name="maistar-player-games"), path('maistar/<int:season>/', views.ListRankings.as_view(),
path('player/<slug:username>/maistar/<int:season>/', views.ListPlayerGames.as_view(), name="maistar-player-games"), name="maistar-ranking"),
path('maistar/<int:game>/edit/', views.GameForm.as_view(),
name="maistar-edit-game"),
path('maistar/<int:game>/delete/', views.DeleteGame.as_view(),
name="maistar-delete-game"),
path('player/<slug:username>/maistar/', views.ListPlayerGames.as_view(),
name="maistar-player-games"),
path('player/<slug:username>/maistar/<int:season>/',
views.ListPlayerGames.as_view(),
name="maistar-player-games"),
] ]

View File

@@ -50,7 +50,7 @@ def clear_personal_data(modeladmin, request, queryset):
if not modeladmin.has_delete_permission(request): if not modeladmin.has_delete_permission(request):
raise PermissionDenied raise PermissionDenied
for membership in queryset: for membership in queryset:
if membership.membership == False: if membership.membership is False:
[setattr(membership, fieldname, None) [setattr(membership, fieldname, None)
for fieldname in membership.nullable_personal_data] for fieldname in membership.nullable_personal_data]
[setattr(membership, fieldname, "") [setattr(membership, fieldname, "")
@@ -61,11 +61,15 @@ def clear_personal_data(modeladmin, request, queryset):
membership.save() membership.save()
cleared_memberships += 1 cleared_memberships += 1
else: else:
modeladmin.message_user(request, _( modeladmin.message_user(
"Can't remove personal data from active member %s.") % membership.username, messages.ERROR) request,
_("Can't remove personal data from %s.") % membership.username,
messages.ERROR)
if cleared_memberships > 0: if cleared_memberships > 0:
modeladmin.message_user(request, _( modeladmin.message_user(
"Cleared %d personal data profiles.") % cleared_memberships, messages.INFO) request,
_("Cleared %d personal data profiles.") % cleared_memberships,
messages.INFO)
clear_personal_data.short_description = _("Clear personal Data") clear_personal_data.short_description = _("Clear personal Data")
@@ -99,7 +103,7 @@ class MembershipAdmin(UserAdmin):
'confirmed', 'confirmed',
'last_login', 'last_login',
) )
list_editable = ('confirmed', ) list_editable = ('confirmed',)
list_display_links = ('username',) list_display_links = ('username',)
fieldsets = ( fieldsets = (
(None, {'fields': (('username', 'password'), 'gender', 'avatar', (None, {'fields': (('username', 'password'), 'gender', 'avatar',

View File

@@ -27,17 +27,22 @@ class Migration(migrations.Migration):
max_length=128, verbose_name='password')), max_length=128, verbose_name='password')),
('last_login', models.DateTimeField( ('last_login', models.DateTimeField(
null=True, verbose_name='last login', blank=True)), null=True, verbose_name='last login', blank=True)),
('is_superuser', models.BooleanField(default=False, ('is_superuser', models.BooleanField(
help_text='Designates that this user has all permissions without explicitly assigning them.', default=False,
help_text="Designates that this user has all permissions " +
"without explicitly assigning them.",
verbose_name='superuser status')), verbose_name='superuser status')),
('username', models.CharField(error_messages={ ('username', models.CharField(error_messages={
'unique': 'A user with that username already exists.'}, 'unique': 'A user with that username already exists.'},
max_length=30, validators=[ max_length=30, validators=[
django.core.validators.RegexValidator( django.core.validators.RegexValidator(
'^[\\w.@+-]+$', "^[\\w.@+-]+$",
'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', "Enter a valid username. " +
"This value may contain only letters, " +
"numbers and @/./+/-/_ characters.",
'invalid')], 'invalid')],
help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', help_text="Required. 30 characters or fewer. " +
"Letters, digits and @/./+/-/_ only.",
unique=True, unique=True,
verbose_name='username')), verbose_name='username')),
('first_name', models.CharField(max_length=30, ('first_name', models.CharField(max_length=30,
@@ -49,12 +54,13 @@ class Migration(migrations.Migration):
('email', models.EmailField(max_length=254, ('email', models.EmailField(max_length=254,
verbose_name='email address', verbose_name='email address',
blank=True)), blank=True)),
('is_staff', models.BooleanField(default=False, ('is_staff', models.BooleanField(
help_text='Designates whether the user can log into this admin site.', default=False,
help_text='this user can log into the admin site.',
verbose_name='staff status')), verbose_name='staff status')),
('is_active', models.BooleanField( ('is_active', models.BooleanField(
default=True, default=True,
help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', help_text='Unselect this instead of deleting accounts.',
verbose_name='active')), verbose_name='active')),
('date_joined', models.DateTimeField( ('date_joined', models.DateTimeField(
default=django.utils.timezone.now, default=django.utils.timezone.now,
@@ -68,8 +74,10 @@ class Migration(migrations.Migration):
('avatar', models.ImageField(storage=utils.OverwriteStorage( ('avatar', models.ImageField(storage=utils.OverwriteStorage(
), null=True, upload_to=membership.models.get_upload_path, ), null=True, upload_to=membership.models.get_upload_path,
blank=True)), blank=True)),
('membership', models.BooleanField(default=False, ('membership', models.BooleanField(
help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', default=False,
help_text="Ja, ich bin mit den Statuen einverstanden " +
"und m\xf6chte Mitglied werden.",
verbose_name='Mitgliedschaft')), verbose_name='Mitgliedschaft')),
('birthday', models.DateField(null=True, ('birthday', models.DateField(null=True,
verbose_name='Geburtstag', verbose_name='Geburtstag',
@@ -93,17 +101,20 @@ class Migration(migrations.Migration):
('paid_until', models.DateField(null=True, ('paid_until', models.DateField(null=True,
verbose_name='Bezahlt bis', verbose_name='Bezahlt bis',
blank=True)), blank=True)),
('confirmed', models.BooleanField(default=False, ('confirmed', models.BooleanField(
default=False,
help_text='Diese Person hat ihre Mitgliedschaft bezahlt', help_text='Diese Person hat ihre Mitgliedschaft bezahlt',
verbose_name='Best\xe4tigt')), verbose_name='Best\xe4tigt')),
('comment', models.TextField(blank=True)), ('comment', models.TextField(blank=True)),
('groups', models.ManyToManyField(related_query_name='user', ('groups', models.ManyToManyField(
related_query_name='user',
related_name='user_set', related_name='user_set',
to='auth.Group', blank=True, to='auth.Group', blank=True,
help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', help_text="The groups this user belongs to. ",
verbose_name='groups')), verbose_name='groups')),
('user_permissions', ('user_permissions',
models.ManyToManyField(related_query_name='user', models.ManyToManyField(
related_query_name='user',
related_name='user_set', related_name='user_set',
to='auth.Permission', to='auth.Permission',
blank=True, blank=True,

View File

@@ -2,7 +2,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
from django.db import models
import django.contrib.auth.models import django.contrib.auth.models

View File

@@ -2,7 +2,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
from django.db import models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -2,7 +2,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
from django.db import models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -2,7 +2,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
from django.db import models
import membership.models import membership.models
import utils import utils
import easy_thumbnails.fields import easy_thumbnails.fields

View File

@@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('membership', '0005_auto_20150901_2204'), ('membership', '0005_auto_20150901_2204'),
] ]
@@ -14,7 +13,12 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='membership', model_name='membership',
name='gender', name='gender',
field=models.CharField(blank=True, max_length=1, null=True, verbose_name='Geschlecht', choices=[ field=models.CharField(
blank=True,
max_length=1,
null=True,
verbose_name='Geschlecht',
choices=[
(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')]), (b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')]),
), ),
] ]

View File

@@ -7,7 +7,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('membership', '0006_auto_20160916_1759'), ('membership', '0006_auto_20160916_1759'),
] ]
@@ -16,11 +15,19 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='membership', model_name='membership',
name='gender', name='gender',
field=models.CharField(blank=True, choices=[('m', 'Male'), ('f', 'Female')], max_length=1, null=True, verbose_name='Geschlecht'), field=models.CharField(
blank=True, choices=[('m', 'Male'), ('f', 'Female')], max_length=1,
null=True, verbose_name='Geschlecht'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='membership', model_name='membership',
name='username', name='username',
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'), field=models.CharField(
error_messages={'unique': 'A user with that username already exists.'},
help_text="Required. 150 characters or fewer. " +
"Letters, digits and @/./+/-/_ only.",
max_length=150, unique=True,
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
verbose_name='username'),
), ),
] ]

View File

@@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('membership', '0007_auto_20171115_0653'), ('membership', '0007_auto_20171115_0653'),
] ]
@@ -13,6 +12,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='membership', model_name='membership',
name='last_name', name='last_name',
field=models.CharField(blank=True, max_length=150, verbose_name='last name'), field=models.CharField(blank=True, max_length=150,
verbose_name='last name'),
), ),
] ]

View File

@@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('membership', '0008_auto_20190106_1954'), ('membership', '0008_auto_20190106_1954'),
] ]
@@ -13,6 +12,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='membership', model_name='membership',
name='first_name', name='first_name',
field=models.CharField(blank=True, max_length=150, verbose_name='first name'), field=models.CharField(blank=True, max_length=150,
verbose_name='first name'),
), ),
] ]

View File

@@ -12,17 +12,29 @@ urlpatterns = [
path("", views.MembershipDetail.as_view()), path("", views.MembershipDetail.as_view()),
path('activate/<str:activation_key>', views.ActivateRegistration.as_view(), path('activate/<str:activation_key>', views.ActivateRegistration.as_view(),
name='membership-activate-registration'), name='membership-activate-registration'),
path('activation_sent/', views.ActivationSent.as_view(), name="membership-registration-complete"), path('activation_sent/', views.ActivationSent.as_view(),
path('login/', auth_views.LoginView.as_view(), name='login'), name="membership-registration-complete"),
path('logout/', auth_views.LogoutView.as_view(), name='logout'), path('login/', auth_views.LoginView.as_view(),
path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'), name='login'),
path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'), path('logout/', auth_views.LogoutView.as_view(),
path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'), name='logout'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done'), path('password_change/', auth_views.PasswordChangeView.as_view(),
path('register/', views.RegisterForm.as_view(), name="membership-register"), name='password_change'),
path('reset/<uuid:uidb64>/<str:token>/', auth_views.PasswordResetConfirmView.as_view(), path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(),
name='password_change_done'),
path('password_reset/', auth_views.PasswordResetView.as_view(),
name='password_reset'),
path('password_reset/done/', auth_views.PasswordResetDoneView.as_view(),
name='password_reset_done'),
path('register/', views.RegisterForm.as_view(),
name="membership-register"),
path('reset/<uuid:uidb64>/<str:token>/',
auth_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm'), name='password_reset_confirm'),
path('reset/done/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), path('reset/done/', auth_views.PasswordResetCompleteView.as_view(),
path('<slug:username>/', views.MembershipDetail.as_view(), name='membership-details'), name='password_reset_complete'),
path('<slug:username>/edit/', views.EditMembership.as_view(), name="membership-edit") path('<slug:username>/', views.MembershipDetail.as_view(),
name='membership-details'),
path('<slug:username>/edit/', views.EditMembership.as_view(),
name="membership-edit")
] ]

View File

@@ -6,10 +6,8 @@ Created on 28.09.2011
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from .countries import COUNTRIES
from .html_cleaner import HtmlCleaner from .html_cleaner import HtmlCleaner
from .massmailer import MassMailer from .countries import COUNTRIES # noqa: F401
CLEANER = HtmlCleaner() CLEANER = HtmlCleaner()
STATUS_REJECTED, STATUS_WAITING, STATUS_PUBLISHED = -1, 0, 1 STATUS_REJECTED, STATUS_WAITING, STATUS_PUBLISHED = -1, 0, 1