Eine Menge Aufräumarbeiten.

* Eine Testsuite um Mahrjong Ranking Berechnungen zu testen
* Erste Arbeiten um die Workarounds aus dem "utils" Paket los zu werden.
* Vieles am Code umformatiert für PEP8 conformität
This commit is contained in:
2017-06-07 13:25:30 +02:00
parent 690ebec3b0
commit 3e9689c04a
93 changed files with 33531 additions and 2737 deletions

View File

@@ -13,10 +13,10 @@ def upcoming_events(request):
next_event = cache.get('next_event', False)
upcoming_events = cache.get('upcoming_events', False)
if current_event == False:
if not current_event:
current_event = Event.objects.current_event()
cache.set('current_event', current_event, 360)
if next_event == False:
if not next_event:
next_event = Event.objects.next_event()
cache.set('next_event', next_event, 360)

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,6 @@ from django.utils.translation import ugettext as _
from django.contrib.auth import get_user_model
from . import models
from utils.html5.widgets import DateTimeInput
user_query = get_user_model().objects.all()
@@ -47,16 +46,17 @@ class EventForm(forms.ModelForm):
start = forms.DateTimeField(
label=_('start'), required=True,
widget=DateTimeInput() # widget=SplitDateTimeWidget()
widget=forms.SplitHiddenDateTimeWidget()
)
end = forms.DateTimeField(
label=_('end'), required=False,
widget=DateTimeInput() # widget=SplitDateTimeWidget()
widget=forms.SplitDateTimeWidget()
)
class Meta(object):
model = models.Event
exclude = ('event_count', 'event_series', )
EventSeriesFormset = forms.inlineformset_factory(
models.Event, models.Event, fields=('start', 'end'), form=EventForm)

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kasu.events\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-09-28 00:25+0200\n"
"POT-Creation-Date: 2017-05-10 23:16+0200\n"
"PO-Revision-Date: 2016-09-28 00:24+0200\n"
"Last-Translator: Christian Berg <xeniac@posteo.at>\n"
"Language-Team: Kasu <verein@kasu.at>\n"
@@ -19,58 +19,58 @@ msgstr ""
"X-Generator: Poedit 1.8.9\n"
"X-Translated-Using: django-rosetta 0.7.6\n"
#: src/events/admin.py:16 src/events/models.py:109
#: events/admin.py:16 events/models.py:114
msgid "Event Series"
msgstr "Veranstaltungsreihen"
#: src/events/forms.py:23
#: events/forms.py:23
msgid "Images"
msgstr "Bilder"
#: src/events/forms.py:49
#: events/forms.py:49
msgid "start"
msgstr "Beginn"
#: src/events/forms.py:53
#: events/forms.py:53
msgid "end"
msgstr "Ende"
#: src/events/models.py:82 src/events/models.py:186 src/events/models.py:228
#: events/models.py:84 events/models.py:207 events/models.py:260
msgid "Name"
msgstr "Name"
#: src/events/models.py:83 src/events/models.py:187 src/events/models.py:233
#: events/models.py:85 events/models.py:208 events/models.py:268
msgid "Description"
msgstr "Beschreibung"
#: src/events/models.py:85 src/events/templates/events/event_detail.html:31
#: src/events/templates/events/event_detail.html:74
#: src/events/templates/events/event_list.html:28
#: src/events/templates/events/photo_upload.html:13
#: events/models.py:87 events/templates/events/event_detail.html:29
#: events/templates/events/event_detail.html:87
#: events/templates/events/event_list.html:28
#: events/templates/events/photo_upload.html:13
msgid "Start"
msgstr "Beginn"
#: src/events/models.py:86 src/events/templates/events/event_detail.html:32
#: src/events/templates/events/event_detail.html:75
#: events/models.py:88 events/templates/events/event_detail.html:30
#: events/templates/events/event_detail.html:89
msgid "End"
msgstr "Ende"
#: src/events/models.py:87 src/events/models.py:195
#: src/events/templates/events/event_detail.html:36
#: src/events/templates/events/event_detail.html:70
#: src/events/templates/events/event_detail.html:76
#: events/models.py:89 events/models.py:216
#: events/templates/events/event_detail.html:34
#: events/templates/events/event_detail.html:80
#: events/templates/events/event_detail.html:92
msgid "Homepage"
msgstr "Homepage"
#: src/events/models.py:89 src/events/models.py:189 src/events/models.py:229
#: events/models.py:91 events/models.py:210 events/models.py:262
msgid "Image"
msgstr "Bild"
#: src/events/models.py:96
#: events/models.py:98
msgid "Mahjong Tournament"
msgstr "Mahjong Turnier"
#: src/events/models.py:98
#: events/models.py:100
msgid ""
"This event is a tournament, different rules apply for the kyu "
"ranking."
@@ -78,11 +78,11 @@ msgstr ""
"Diese Veranstaltung ist ein Turnier, es gelten andere Regeln für das Kyu "
"Ranking."
#: src/events/models.py:102
#: events/models.py:104
msgid "Mahjong Season"
msgstr "Mahjong Saison"
#: src/events/models.py:110
#: events/models.py:115
msgid ""
"Wenn dieser Event zu einer Veranstaltungsreihe gehört werden Ort, "
"Beschreibung, Bild und Homepage von dem hier angegebenen Event "
@@ -91,236 +91,244 @@ msgstr ""
"Wenn dieser Termin zu einer Veranstaltungsreihe gehört werden Ort, "
"Beschreibung, Bild und Homepage von dem hier angegebenen Event übernommen."
#: src/events/models.py:117
#: events/models.py:124 events/models.py:226 events/models.py:290
msgid "first created at"
msgstr ""
#: events/models.py:129 events/models.py:231 events/models.py:295
msgid "latest updated at"
msgstr ""
#: events/models.py:134
msgid "Event"
msgstr "Termin"
#: src/events/models.py:118
#: events/models.py:135
msgid "Events"
msgstr "Termine"
#: src/events/models.py:131
#: events/models.py:148
msgid "A event can't end before it had started"
msgstr "Eine Veranstaltung kann nicht enden bevor sie begonnen hat"
#: src/events/models.py:196
#: events/models.py:217
msgid "Postal Code"
msgstr "Postleitzahl"
#: src/events/models.py:197
#: events/models.py:218
msgid "Street Address"
msgstr "Straße"
#: src/events/models.py:198
#: events/models.py:219
msgid "Locality"
msgstr "Ort"
#: src/events/models.py:199
#: events/models.py:220
msgid "Country"
msgstr "Land"
#: src/events/models.py:202
#: events/models.py:235
msgid "Venue"
msgstr "Veranstaltungsort"
#: src/events/models.py:203
#: events/models.py:236
msgid "Venues"
msgstr "Veranstaltungsorte"
#: src/events/models.py:239
#: events/models.py:274
msgid "Startpage"
msgstr "Startseite"
#: src/events/models.py:242
#: events/models.py:277
msgid "Display this Photo on the Startpage Teaser"
msgstr "Foto als Teaser auf der Startseite verwenden."
#: src/events/models.py:244
#: events/models.py:279
msgid "Published on"
msgstr "Veröffentlicht am"
#: src/events/models.py:246
#: events/models.py:281
msgid "Number of views"
msgstr "Wie oft gesehen"
#: src/events/models.py:258 src/events/templates/events/event_archive.html:38
#: src/events/templates/events/event_list.html:18
#: events/models.py:306 events/templates/events/event_archive.html:38
#: events/templates/events/event_list.html:18
msgid "Event Image"
msgstr "Veranstaltungsbild"
#: src/events/models.py:259
#: events/models.py:307
msgid "Event Images"
msgstr "Veranstaltungsbilder"
#: src/events/templates/events/event_archive.html:5
#: src/events/templates/events/event_archive.html:9
#: events/templates/events/event_archive.html:5
#: events/templates/events/event_archive.html:9
msgid "Event Archive"
msgstr "Veranstaltungsarchiv"
#: src/events/templates/events/event_archive.html:42
#: src/events/templates/events/event_detail.html:72
#: src/events/templates/events/event_list.html:22
#: src/events/templates/events/photo_detail.html:48
#: events/templates/events/event_archive.html:42
#: events/templates/events/event_detail.html:85
#: events/templates/events/event_list.html:22
#: events/templates/events/photo_detail.html:53
msgid "Date"
msgstr "Datum"
#: src/events/templates/events/event_archive.html:47
#: events/templates/events/event_archive.html:47
msgid "Time"
msgstr "Zeit"
#: src/events/templates/events/event_archive.html:49
#: src/events/templates/events/photo_upload.html:16
#: events/templates/events/event_archive.html:49
#: events/templates/events/photo_upload.html:16
msgid "from"
msgstr "von"
#: src/events/templates/events/event_archive.html:49
#: src/events/templates/events/photo_upload.html:16
#: events/templates/events/event_archive.html:49
#: events/templates/events/photo_upload.html:16
msgid "to"
msgstr "bis"
#: src/events/templates/events/event_archive.html:57
#: src/events/templates/events/event_detail.html:33
#: src/events/templates/events/event_detail.html:62
#: src/events/templates/events/event_list.html:32
#: src/events/templates/events/photo_upload.html:23
#: events/templates/events/event_archive.html:57
#: events/templates/events/event_detail.html:31
#: events/templates/events/event_detail.html:72
#: events/templates/events/event_list.html:32
#: events/templates/events/photo_upload.html:23
msgid "Location"
msgstr "Ort"
#: src/events/templates/events/event_archive.html:58
#: src/events/templates/events/event_list.html:35
#: src/events/templates/events/photo_upload.html:25
#: src/events/templates/events/photo_upload.html:26
#: events/templates/events/event_archive.html:58
#: events/templates/events/event_list.html:35
#: events/templates/events/photo_upload.html:25
#: events/templates/events/photo_upload.html:26
msgid "Comments"
msgstr "Kommentare"
#: src/events/templates/events/event_archive.html:59
#: src/events/templates/events/event_detail.html:38
#: src/events/templates/events/event_detail.html:48
#: src/events/templates/events/photo_upload.html:28
#: src/events/templates/events/photo_upload.html:29
#: events/templates/events/event_archive.html:59
#: events/templates/events/event_detail.html:36
#: events/templates/events/event_detail.html:48
#: events/templates/events/photo_upload.html:28
#: events/templates/events/photo_upload.html:29
msgid "Photos"
msgstr "Fotos"
#: src/events/templates/events/event_archive.html:60
#: src/events/templates/events/event_archive.html:61
#: src/events/templates/events/event_detail.html:37
#: src/events/templates/events/event_detail.html:49
#: events/templates/events/event_archive.html:60
#: events/templates/events/event_archive.html:61
#: events/templates/events/event_detail.html:35
#: events/templates/events/event_detail.html:51
msgid "Hanchans"
msgstr "Hanchans"
#: src/events/templates/events/event_detail.html:39
#: events/templates/events/event_detail.html:37
msgid "tourney"
msgstr "Turnier"
#: src/events/templates/events/event_detail.html:39
#: events/templates/events/event_detail.html:37
msgid "other rules apply here"
msgstr "hier gelten andere Regeln"
#: src/events/templates/events/event_detail.html:47
#: events/templates/events/event_detail.html:45
msgid "Info"
msgstr "Info"
#: src/events/templates/events/event_detail.html:50
#: events/templates/events/event_detail.html:54
msgid "Mai-Star Games"
msgstr "Mai-Star Spiele"
#: src/events/templates/events/event_detail.html:52
#: events/templates/events/event_detail.html:57
msgid "Event Ranking"
msgstr "Veranstaltungs Wertung"
#: src/events/templates/events/event_detail.html:90
#: events/templates/events/event_detail.html:100
msgid "Share on Facebook"
msgstr "Auf Facebook teilen"
#: src/events/templates/events/event_detail.html:96
#: events/templates/events/event_detail.html:104
msgid "Share on Google+"
msgstr "Auf Google+ teilen"
#: src/events/templates/events/event_detail.html:100
#: events/templates/events/event_detail.html:109
msgid "Share on Twitter"
msgstr "Auf Twitter teilen"
#: src/events/templates/events/event_detail.html:104
#: events/templates/events/event_detail.html:113
msgid "Show on Google Maps"
msgstr "Auf Google Maps zeigen"
#: src/events/templates/events/event_detail.html:121
#: src/events/templates/events/event_form.html:9 src/events/views.py:106
#: events/templates/events/event_detail.html:127
#: events/templates/events/event_form.html:9 events/views.py:106
msgid "Edit Event"
msgstr "Termin bearbeiten"
#: src/events/templates/events/event_detail.html:124
#: events/templates/events/event_detail.html:131
msgid "Add Dates"
msgstr "Termine hinzufügen"
#: src/events/templates/events/event_form.html:9
#: src/events/templates/events/page.html:9 src/events/views.py:108
#: events/templates/events/event_form.html:9
#: events/templates/events/page.html:9 events/views.py:108
msgid "Add Event"
msgstr "Neuer Termin"
#: src/events/templates/events/event_form.html:19
#: src/events/templates/events/photo_list.html:35
#: events/templates/events/event_form.html:19
#: events/templates/events/photo_list.html:35
msgid "reset"
msgstr "Zurücksetzen"
#: src/events/templates/events/event_form.html:20
#: src/events/templates/events/eventseries_form.html:23
#: events/templates/events/event_form.html:20
#: events/templates/events/eventseries_form.html:25
msgid "save"
msgstr "Speichern"
#: src/events/templates/events/event_list.html:4
#: src/events/templates/events/event_list.html:5
#: events/templates/events/event_list.html:4
#: events/templates/events/event_list.html:5
msgid "Upcoming Events"
msgstr "Bevorstehende Veranstaltungen"
#: src/events/templates/events/eventseries_form.html:22
#: events/templates/events/eventseries_form.html:24
msgid "back"
msgstr "Zurück"
#: src/events/templates/events/photo_confirm_delete.html:17
#: events/templates/events/photo_confirm_delete.html:17
msgid "Cancel"
msgstr "Abbrechen"
#: src/events/templates/events/photo_confirm_delete.html:21
#: src/events/templates/events/photo_list.html:21
#: events/templates/events/photo_confirm_delete.html:21
#: events/templates/events/photo_list.html:21
msgid "Delete"
msgstr "Löschen"
#: src/events/templates/events/photo_detail.html:39
#: events/templates/events/photo_detail.html:44
msgid "previous"
msgstr "Zurück"
#: src/events/templates/events/photo_detail.html:47
#: events/templates/events/photo_detail.html:52
msgid "Photographer"
msgstr "Fotograf"
#: src/events/templates/events/photo_detail.html:53
#: events/templates/events/photo_detail.html:58
msgid "share on"
msgstr "Teile auf"
#: src/events/templates/events/photo_detail.html:76
#: events/templates/events/photo_detail.html:81
msgid "download"
msgstr "Herunterladen"
#: src/events/templates/events/photo_detail.html:77
#: events/templates/events/photo_detail.html:82
msgid "Rotate counter clockwise"
msgstr "mit dem Uhrzeiger drehen"
#: src/events/templates/events/photo_detail.html:78
#: events/templates/events/photo_detail.html:83
msgid "Rotate clockwise"
msgstr "gegen den Uhrzeiger drehen"
#: src/events/templates/events/photo_detail.html:79
#: events/templates/events/photo_detail.html:84
msgid "Save"
msgstr "Speichern"
#: src/events/templates/events/photo_list.html:36
#: src/events/templates/events/photo_upload.html:35
#: src/events/templates/events/photo_upload.html:49
#: events/templates/events/photo_list.html:36
#: events/templates/events/photo_upload.html:35
#: events/templates/events/photo_upload.html:49
msgid "Upload"
msgstr "Hochladen"
#: src/events/views.py:209
#: events/views.py:209
msgid "Event does not exist"
msgstr "Veranstaltung gibt es nicht"

View File

@@ -13,12 +13,14 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='photo',
options={'ordering': ['created_date'], 'get_latest_by': 'created_date', 'verbose_name': 'Veranstaltungsbild', 'verbose_name_plural': 'Veranstaltungsbilder'},
options={'ordering': ['created_date'], 'get_latest_by': 'created_date',
'verbose_name': 'Veranstaltungsbild', 'verbose_name_plural': 'Veranstaltungsbilder'},
),
migrations.AlterField(
model_name='event',
name='mahjong_season',
field=models.PositiveSmallIntegerField(null=True, verbose_name='Mahjong Saison', blank=True),
field=models.PositiveSmallIntegerField(
null=True, verbose_name='Mahjong Saison', blank=True),
),
migrations.AlterField(
model_name='photo',
@@ -28,11 +30,13 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='photo',
name='on_startpage',
field=models.BooleanField(default=False, help_text='Foto als Teaser auf der Startseite verwenden.', db_index=True, verbose_name='Startseite'),
field=models.BooleanField(
default=False, help_text='Foto als Teaser auf der Startseite verwenden.', db_index=True, verbose_name='Startseite'),
),
migrations.AlterField(
model_name='photo',
name='views',
field=models.PositiveIntegerField(default=0, verbose_name='Wie oft gesehen', editable=False),
field=models.PositiveIntegerField(
default=0, verbose_name='Wie oft gesehen', editable=False),
),
]

View File

@@ -16,34 +16,40 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='event',
name='date_created',
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='first created at', db_index=True),
field=models.DateTimeField(
auto_now_add=True, null=True, verbose_name='first created at', db_index=True),
),
migrations.AddField(
model_name='event',
name='date_modified',
field=models.DateTimeField(default=datetime.datetime(2016, 10, 12, 20, 24, 39, 910492, tzinfo=utc), verbose_name='latest updated at', auto_now=True),
field=models.DateTimeField(default=datetime.datetime(
2016, 10, 12, 20, 24, 39, 910492, tzinfo=utc), verbose_name='latest updated at', auto_now=True),
preserve_default=False,
),
migrations.AddField(
model_name='location',
name='date_created',
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='first created at', db_index=True),
field=models.DateTimeField(
auto_now_add=True, null=True, verbose_name='first created at', db_index=True),
),
migrations.AddField(
model_name='location',
name='date_modified',
field=models.DateTimeField(default=datetime.datetime(2016, 10, 12, 20, 24, 44, 566305, tzinfo=utc), verbose_name='latest updated at', auto_now=True),
field=models.DateTimeField(default=datetime.datetime(
2016, 10, 12, 20, 24, 44, 566305, tzinfo=utc), verbose_name='latest updated at', auto_now=True),
preserve_default=False,
),
migrations.AddField(
model_name='photo',
name='date_created',
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='first created at', db_index=True),
field=models.DateTimeField(
auto_now_add=True, null=True, verbose_name='first created at', db_index=True),
),
migrations.AddField(
model_name='photo',
name='date_modified',
field=models.DateTimeField(default=datetime.datetime(2016, 10, 12, 20, 24, 50, 509970, tzinfo=utc), verbose_name='latest updated at', auto_now=True),
field=models.DateTimeField(default=datetime.datetime(
2016, 10, 12, 20, 24, 50, 509970, tzinfo=utc), verbose_name='latest updated at', auto_now=True),
preserve_default=False,
),
]

View File

@@ -346,7 +346,6 @@ class Photo(models.Model):
)[0]
except IndexError:
return None
return self.get_next_by_created_date(event=self.event)
@property
def previous_photo(self):
@@ -366,4 +365,3 @@ class Photo(models.Model):
)[0]
except IndexError:
return None
return self.get_previous_by_created_date(event=self.event)

View File

@@ -1,11 +1,11 @@
from django.contrib.sitemaps import Sitemap
from django.utils import timezone
from .models import Event, Photo
from .models import Event
from .models import Photo
class EventSitemap(Sitemap):
changefreq = "never"
priority = 0.6
protocol = 'https'
def items(self):
@@ -13,9 +13,8 @@ class EventSitemap(Sitemap):
def priority(self, event):
delta = timezone.now() - event.start
delta = abs(delta.days / 300.0 )
delta = abs(delta.days / 300.0)
return max(1 - delta, 0.1)
def lastmod(self, event):
return event.date_modified

View File

@@ -12,7 +12,6 @@
<p class="warning">
<strong>Achtung! Das ist eine Veranstaltungsreihe!</strong> Diese kann man im Moment nur im Admin-Interface vernünfig bearbeiten.<br />
Du bearbeitest hier den "Hauptevent" der Reihe ({{event.event_set.count}}). Alle Änderungen (abgesehen von Name, Start und Ende) werden von den darauf folgendem Veranstaltungen übernommen.
</strong>
</p>
{% endif %}
<p class="buttonbar">

View File

@@ -35,7 +35,7 @@
{%trans "Upload" %}</a>
{% endif %}
</p>
</div></div>
</div>
{% endfor %}
<form method="post" enctype="multipart/form-data">

View File

@@ -6,7 +6,8 @@ from django.db.models import Q
from django.contrib.auth.decorators import permission_required
from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse
from extra_views import ModelFormSetView, InlineFormSetView
from extra_views import InlineFormSetView
from extra_views import ModelFormSetView
from django.http import HttpResponse, Http404
from django.shortcuts import redirect
from django.utils import timezone