added on_delete in models an migrations for django 2.0

compatibility.
This commit is contained in:
2017-12-07 22:08:47 +01:00
parent c5781246fe
commit ade2a568f7
11 changed files with 590 additions and 186 deletions

View File

@@ -1,9 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations
import django.db.models.deletion import django.db.models.deletion
from django.conf import settings from django.conf import settings
from django.db import models, migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
@@ -44,7 +44,8 @@ class Migration(migrations.Migration):
('date_modified', models.DateTimeField( ('date_modified', models.DateTimeField(
auto_now=True, verbose_name='Bearbeitet')), auto_now=True, verbose_name='Bearbeitet')),
('author', models.ForeignKey( ('author', models.ForeignKey(
verbose_name='Autor', to=settings.AUTH_USER_MODEL)), verbose_name='Autor', to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE))
], ],
options={ options={
'ordering': ('-date_created',), 'ordering': ('-date_created',),
@@ -144,7 +145,8 @@ class Migration(migrations.Migration):
model_name='article', model_name='article',
name='category', name='category',
field=models.ForeignKey( field=models.ForeignKey(
verbose_name='Kategorie', to='content.Category'), verbose_name='Kategorie', to='content.Category',
on_delete=models.CASCADE),
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='page', name='page',

View File

@@ -3,9 +3,9 @@ from ckeditor_uploader.fields import RichTextUploadingField
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import reverse
from django.db import models from django.db import models
from django.template.defaultfilters import slugify from django.template.defaultfilters import slugify
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import get_language, ugettext as _ from django.utils.translation import get_language, ugettext as _
@@ -69,11 +69,14 @@ class Article(models.Model):
headline_en = models.CharField('Headline', max_length=255, blank=True) headline_en = models.CharField('Headline', max_length=255, blank=True)
content_de = RichTextUploadingField(_('Content')) content_de = RichTextUploadingField(_('Content'))
content_en = RichTextUploadingField('Content', blank=True) content_en = RichTextUploadingField('Content', blank=True)
category = models.ForeignKey('Category', verbose_name=_('Category')) category = models.ForeignKey('Category',
on_delete=models.PROTECT,
verbose_name=_('Category'))
image = models.ImageField(_('Image'), upload_to='news/', image = models.ImageField(_('Image'), upload_to='news/',
blank=True, null=True) blank=True, null=True)
slug = models.SlugField(_('Slug'), unique_for_month='date_created') slug = models.SlugField(_('Slug'), unique_for_month='date_created')
author = models.ForeignKey(settings.AUTH_USER_MODEL, author = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
verbose_name=_('Author')) verbose_name=_('Author'))
status = models.SmallIntegerField(_('Status'), choices=STATUS_CHOICES, status = models.SmallIntegerField(_('Status'), choices=STATUS_CHOICES,
default=STATUS_PUBLISHED) default=STATUS_PUBLISHED)
@@ -275,12 +278,14 @@ class Page(models.Model):
@property @property
def description(self): def description(self):
"""Return the localized description, fallback to german if necessary.""" """Return the localized description, fallback to german if necessary."""
return getattr(self, "description_%s" % get_language()) or self.description_de return getattr(self,
"description_%s" % get_language()) or self.description_de
@property @property
def menu_name(self): def menu_name(self):
"""Return the localized menu name, fallback to german if necessary.""" """Return the localized menu name, fallback to german if necessary."""
return getattr(self, "menu_name_%s" % get_language()) or self.menu_name_de return getattr(self,
"menu_name_%s" % get_language()) or self.menu_name_de
@property @property
def pdf_file(self): def pdf_file(self):

View File

@@ -1,14 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations
import events.models
import django.db.models.deletion import django.db.models.deletion
from django.db import models, migrations
import events.models
import utils import utils
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
] ]
@@ -17,7 +17,8 @@ class Migration(migrations.Migration):
name='Event', name='Event',
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)),
('name', models.CharField(max_length=255, verbose_name='Name')), ('name', models.CharField(max_length=255, verbose_name='Name')),
('description', models.TextField( ('description', models.TextField(
verbose_name='Beschreibung', blank=True)), verbose_name='Beschreibung', blank=True)),
@@ -26,13 +27,20 @@ class Migration(migrations.Migration):
null=True, verbose_name='Ende', blank=True)), null=True, verbose_name='Ende', blank=True)),
('url', models.URLField(verbose_name='Homepage', blank=True)), ('url', models.URLField(verbose_name='Homepage', blank=True)),
('image', models.ImageField(storage=utils.OverwriteStorage( ('image', models.ImageField(storage=utils.OverwriteStorage(
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True)), ), upload_to=events.models.get_upload_path, null=True,
verbose_name='Bild', blank=True)),
('is_tournament', models.BooleanField(default=False, ('is_tournament', models.BooleanField(default=False,
help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.', verbose_name='Turnier')), help_text='Diese Veranstaltung ist ein Turnier, es gelten andere Regeln f\xfcr das Kyu Ranking.',
verbose_name='Turnier')),
('photo_count', models.PositiveIntegerField( ('photo_count', models.PositiveIntegerField(
default=0, editable=False)), default=0, editable=False)),
('event_series', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, editable=False, to='events.Event', blank=True, ('event_series',
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')), models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL,
editable=False, to='events.Event',
blank=True,
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')),
], ],
options={ options={
'ordering': ('-start', '-end'), 'ordering': ('-start', '-end'),
@@ -44,20 +52,310 @@ class Migration(migrations.Migration):
name='Location', name='Location',
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)),
('name', models.CharField(max_length=200, verbose_name='Name')), ('name', models.CharField(max_length=200, verbose_name='Name')),
('description', models.TextField( ('description', models.TextField(
verbose_name='Beschreibung', blank=True)), verbose_name='Beschreibung', blank=True)),
('image', models.ImageField(storage=utils.OverwriteStorage( ('image', models.ImageField(storage=utils.OverwriteStorage(
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True)), ), upload_to=events.models.get_upload_path, null=True,
verbose_name='Bild', blank=True)),
('url', models.URLField(verbose_name='Homepage', blank=True)), ('url', models.URLField(verbose_name='Homepage', blank=True)),
('postal_code', models.CharField( ('postal_code', models.CharField(
max_length=6, verbose_name='Postleitzahl')), max_length=6, verbose_name='Postleitzahl')),
('street_address', models.CharField( ('street_address', models.CharField(
max_length=127, verbose_name='Stra\xdfe')), max_length=127, verbose_name='Stra\xdfe')),
('locality', models.CharField(max_length=127, verbose_name='Ort')), ('locality',
('country', models.CharField(max_length=2, verbose_name='Land', choices=[(b'GB', 'Vereinigtes K\xf6nigreich'), (b'AF', 'Afghanistan'), (b'AX', 'Aland Islands'), (b'AL', 'Albanien'), (b'DZ', 'Algerien'), (b'AS', 'Amerikanisch-Samoa'), (b'AD', 'Andorra'), (b'AO', 'Angola'), (b'AI', 'Anguilla'), (b'AQ', 'Antarktika'), (b'AG', 'Antigua und Barbuda'), (b'AR', 'Argentinien'), (b'AM', 'Armenien'), (b'AW', 'Aruba'), (b'AU', 'Australien'), (b'AT', '\xd6sterreich'), (b'AZ', 'Aserbaidschan'), (b'BS', 'Bahamas'), (b'BH', 'Bahrein'), (b'BD', 'Bangladesch'), (b'BB', 'Barbados'), (b'BY', 'Wei\xdfrussland'), (b'BE', 'Belgien'), (b'BZ', 'Belize'), (b'BJ', 'Benin'), (b'BM', 'Bermuda'), (b'BT', 'Bhutan'), (b'BO', 'Bolivien'), (b'BA', 'Bosnien und Herzegowina'), (b'BW', 'Botswana'), (b'BV', 'Bouvet Island'), (b'BR', 'Brasilien'), (b'IO', 'British Indian Ocean Territory'), (b'BN', 'Brunei Darussalam'), (b'BG', 'Bulgarien'), (b'BF', 'Burkina Faso'), (b'BI', 'Burundi'), (b'KH', 'Kambodscha'), (b'CM', 'Kamerun'), (b'CA', 'Kanada'), (b'CV', 'Cape Verde'), (b'KY', 'Cayman Islands'), (b'CF', 'Zentralafrikanische Republik'), (b'TD', 'Tschad'), (b'CL', 'Chile'), (b'CN', 'China'), (b'CX', 'Christmas Island'), (b'CC', 'Cocos (Keeling) Islands'), (b'CO', 'Kolumbien'), (b'KM', 'Komoren'), (b'CG', 'Kongo'), (b'CD', 'Kongo, Demokratische Republik'), (b'CK', 'Cook-Inseln'), (b'CR', 'Costa Rica'), (b'CI', "Cote d'Ivoire"), (b'HR', 'Kroatien'), (b'CU', 'Kuba'), (b'CY', 'Zypern'), (b'CZ', 'Tschechische Republik'), (b'DK', 'D\xe4nemark'), (b'DJ', 'Dschibuti'), (b'DM', 'Dominica'), (b'DO', 'Dominikanische Republik'), (b'EC', 'Ecuador'), (b'EG', '\xc4gypten'), (b'SV', 'El Salvador'), (b'GQ', '\xc4quatorial-Guinea'), (b'ER', 'Eritrea'), (b'EE', 'Estland'), (b'ET', '\xc4thiopien'), (b'FK', 'Falklandinseln (Malvinas)'), (b'FO', 'F\xe4r\xf6er-Inseln'), (b'FJ', 'Fidschi'), (b'FI', 'Finnland'), (b'FR', 'Frankreich'), (b'GF', 'Franz\xf6sisch-Guayana'), (b'PF', 'Franz\xf6sisch-Polynesien'), (b'TF', 'Franz\xf6sisch S\xfcdliche Territorien'), (b'GA', 'Gabun'), (b'GM', 'Gambia'), (b'GE', 'Georgia'), (b'DE', 'Deutschland'), (b'GH', 'Ghana'), (b'GI', 'Gibraltar'), (b'GR', 'Griechenland'), (b'GL', 'Gr\xf6nland'), (b'GD', 'Grenada'), (b'GP', 'Guadeloupe'), (b'GU', 'Guam'), (b'GT', 'Guatemala'), (b'GG', 'Guernsey'), (b'GN', 'Guinea'), (b'GW', 'Guinea-Bissau'), (b'GY', 'Guyana'), (b'HT', 'Haiti'), (b'HM', 'Heard und McDonald Inseln'), (b'VA', 'Heiliger Stuhl (Vatikanstadt)'), (b'HN', 'Honduras'), (b'HK', 'Hongkong'), (b'HU', 'Ungarn'), (b'IS', 'Island'), (b'IN', 'Indien'), (b'ID', 'Indonesien'), (b'IR', 'Iran, Islamische Republik'), (b'IQ', 'Irak'), (b'IE', 'Irland'), (b'IM', 'Isle of Man'), (b'IL', 'Israel'), (b'IT', 'Italien'), (b'JM', 'Jamaika'), (b'JP', 'Japan'), (b'JE', 'Jersey'), (b'JO', 'Jordan'), (b'KZ', 'Kasachstan'), (b'KE', 'Kenia'), (b'KI', 'Kiribati'), (b'KP', 'Korea, Demokratische Volksrepublik'), (b'KR', 'Korea, Republik'), (b'KW', 'Kuwait'), (b'KG', 'Kirgisistan'), (b'LA', 'Lao Demokratischen Volksrepublik'), (b'LV', 'Lettland'), (b'LB', 'Libanon'), ( models.CharField(max_length=127, verbose_name='Ort')),
b'LS', 'Lesotho'), (b'LR', 'Liberia'), (b'LY', 'Libyen'), (b'LI', 'Liechtenstein'), (b'LT', 'Litauen'), (b'LU', 'Luxemburg'), (b'MO', 'Macao'), (b'MK', 'Mazedonien, die ehemalige jugoslawische Republik'), (b'MG', 'Madagaskar'), (b'MW', 'Malawi'), (b'MY', 'Malaysia'), (b'MV', 'Malediven'), (b'ML', 'Mali'), (b'MT', 'Malta'), (b'MH', 'Marshall Islands'), (b'MQ', 'Martinique'), (b'MR', 'Mauretanien'), (b'MU', 'Mauritius'), (b'YT', 'Mayotte'), (b'MX', 'Mexiko'), (b'FM', 'Mikronesien, F\xf6derierte Staaten von'), (b'MD', 'Moldawien'), (b'MC', 'Monaco'), (b'MN', 'Mongolei'), (b'ME', 'Montenegro'), (b'MS', 'Montserrat'), (b'MA', 'Marokko'), (b'MZ', 'Mosambik'), (b'MM', 'Myanmar'), (b'NA', 'Namibia'), (b'NR', 'Nauru'), (b'NP', 'Nepal'), (b'NL', 'Niederlande'), (b'AN', 'Niederl\xe4ndische Antillen'), (b'NC', 'Neukaledonien'), (b'NZ', 'New Zealand'), (b'NI', 'Nicaragua'), (b'NE', 'Niger'), (b'NG', 'Nigeria'), (b'NU', 'Niue'), (b'NF', 'Norfolk Island'), (b'MP', 'Northern Mariana Islands'), (b'NO', 'Norwegen'), (b'OM', 'Oman'), (b'PK', 'Pakistan'), (b'PW', 'Palau'), (b'PS', 'Pal\xe4stinensische Autonomiegebiete'), (b'PA', 'Panama'), (b'PG', 'Papua-Neuguinea'), (b'PY', 'Paraguay'), (b'PE', 'Peru'), (b'PH', 'Philippinen'), (b'PN', 'Pitcairn'), (b'PL', 'Polen'), (b'PT', 'Portugal'), (b'PR', 'Puerto Rico'), (b'QA', 'Katar'), (b'RE', 'Wiedervereinigung'), (b'RO', 'Rum\xe4nien'), (b'RU', 'Russischen F\xf6deration'), (b'RW', 'Ruanda'), (b'BL', 'Saint Barthelemy'), (b'SH', 'Saint Helena'), (b'KN', 'Saint Kitts und Nevis'), (b'LC', 'Santa Lucia'), (b'MF', 'Santa Martin'), (b'PM', 'Saint Pierre und Miquelon'), (b'VC', 'Saint Vincent und die Grenadinen'), (b'WS', 'Samoa'), (b'SM', 'San Marino'), (b'ST', 'Sao Tome und Principe'), (b'SA', 'Saudi-Arabien'), (b'SN', 'Senegal'), (b'RS', 'Serbien'), (b'SC', 'Seychellen'), (b'SL', 'Sierra Leone'), (b'SG', 'Singapur'), (b'SK', 'Slowakei'), (b'SI', 'Slowenien'), (b'SB', 'Salomon-Inseln'), (b'SO', 'Somalia'), (b'ZA', 'S\xfcdafrika'), (b'GS', 'S\xfcdgeorgien und die S\xfcdlichen Sandwichinseln'), (b'ES', 'Spanien'), (b'LK', 'Sri Lanka'), (b'SD', 'Sudan'), (b'SR', 'Suriname'), (b'SJ', 'Svalbard und Jan Mayen'), (b'SZ', 'Swaziland'), (b'SE', 'Schweden'), (b'CH', 'Schweiz'), (b'SY', 'Arabische Republik Syrien'), (b'TW', 'Taiwan, Province of China'), (b'TJ', 'Tadschikistan'), (b'TZ', 'Tansania, Vereinigte Republik'), (b'TH', 'Thailand'), (b'TL', 'Timor-Leste'), (b'TG', 'Togo'), (b'TK', 'Tokelau'), (b'TO', 'Tonga'), (b'TT', 'Trinidad und Tobago'), (b'TN', 'Tunesien'), (b'TR', 'T\xfcrkei'), (b'TM', 'Turkmenistan'), (b'TC', 'Turks-und Caicosinseln'), (b'TV', 'Tuvalu'), (b'UG', 'Uganda'), (b'UA', 'Ukraine'), (b'AE', 'Vereinigte Arabische Emirate'), (b'US', 'Vereinigte Staaten'), (b'UM', 'United States Minor Outlying Islands'), (b'UY', 'Uruguay'), (b'UZ', 'Usbekistan'), (b'VU', 'Vanuatu'), (b'VE', 'Venezuela'), (b'VN', 'Vietnam'), (b'VG', 'Virgin Islands, British'), (b'VI', 'Virgin Islands, US'), (b'WF', 'Wallis und Futuna'), (b'EH', 'Westsahara'), (b'YE', 'Jemen'), (b'ZM', 'Sambia'), (b'ZW', 'Zimbabwe')])), ('country', models.CharField(max_length=2, verbose_name='Land',
choices=[(b'GB',
'Vereinigtes K\xf6nigreich'),
(b'AF', 'Afghanistan'),
(b'AX', 'Aland Islands'),
(b'AL', 'Albanien'),
(b'DZ', 'Algerien'), (
b'AS',
'Amerikanisch-Samoa'),
(b'AD', 'Andorra'),
(b'AO', 'Angola'),
(b'AI', 'Anguilla'),
(b'AQ', 'Antarktika'), (
b'AG',
'Antigua und Barbuda'),
(b'AR', 'Argentinien'),
(b'AM', 'Armenien'),
(b'AW', 'Aruba'),
(b'AU', 'Australien'),
(b'AT', '\xd6sterreich'),
(b'AZ', 'Aserbaidschan'),
(b'BS', 'Bahamas'),
(b'BH', 'Bahrein'),
(b'BD', 'Bangladesch'),
(b'BB', 'Barbados'), (
b'BY',
'Wei\xdfrussland'),
(b'BE', 'Belgien'),
(b'BZ', 'Belize'),
(b'BJ', 'Benin'),
(b'BM', 'Bermuda'),
(b'BT', 'Bhutan'),
(b'BO', 'Bolivien'), (
b'BA',
'Bosnien und Herzegowina'),
(b'BW', 'Botswana'),
(b'BV', 'Bouvet Island'),
(b'BR', 'Brasilien'), (
b'IO',
'British Indian Ocean Territory'),
(b'BN',
'Brunei Darussalam'),
(b'BG', 'Bulgarien'),
(b'BF', 'Burkina Faso'),
(b'BI', 'Burundi'),
(b'KH', 'Kambodscha'),
(b'CM', 'Kamerun'),
(b'CA', 'Kanada'),
(b'CV', 'Cape Verde'),
(b'KY', 'Cayman Islands'),
(b'CF',
'Zentralafrikanische Republik'),
(b'TD', 'Tschad'),
(b'CL', 'Chile'),
(b'CN', 'China'), (b'CX',
'Christmas Island'),
(b'CC',
'Cocos (Keeling) Islands'),
(b'CO', 'Kolumbien'),
(b'KM', 'Komoren'),
(b'CG', 'Kongo'), (b'CD',
'Kongo, Demokratische Republik'),
(b'CK', 'Cook-Inseln'),
(b'CR', 'Costa Rica'),
(b'CI', "Cote d'Ivoire"),
(b'HR', 'Kroatien'),
(b'CU', 'Kuba'),
(b'CY', 'Zypern'), (b'CZ',
'Tschechische Republik'),
(b'DK', 'D\xe4nemark'),
(b'DJ', 'Dschibuti'),
(b'DM', 'Dominica'), (
b'DO',
'Dominikanische Republik'),
(b'EC', 'Ecuador'),
(b'EG', '\xc4gypten'),
(b'SV', 'El Salvador'), (
b'GQ',
'\xc4quatorial-Guinea'),
(b'ER', 'Eritrea'),
(b'EE', 'Estland'),
(b'ET', '\xc4thiopien'), (
b'FK',
'Falklandinseln (Malvinas)'),
(b'FO',
'F\xe4r\xf6er-Inseln'),
(b'FJ', 'Fidschi'),
(b'FI', 'Finnland'),
(b'FR', 'Frankreich'), (
b'GF',
'Franz\xf6sisch-Guayana'),
(b'PF',
'Franz\xf6sisch-Polynesien'),
(b'TF',
'Franz\xf6sisch S\xfcdliche Territorien'),
(b'GA', 'Gabun'),
(b'GM', 'Gambia'),
(b'GE', 'Georgia'),
(b'DE', 'Deutschland'),
(b'GH', 'Ghana'),
(b'GI', 'Gibraltar'),
(b'GR', 'Griechenland'),
(b'GL', 'Gr\xf6nland'),
(b'GD', 'Grenada'),
(b'GP', 'Guadeloupe'),
(b'GU', 'Guam'),
(b'GT', 'Guatemala'),
(b'GG', 'Guernsey'),
(b'GN', 'Guinea'),
(b'GW', 'Guinea-Bissau'),
(b'GY', 'Guyana'),
(b'HT', 'Haiti'), (b'HM',
'Heard und McDonald Inseln'),
(b'VA',
'Heiliger Stuhl (Vatikanstadt)'),
(b'HN', 'Honduras'),
(b'HK', 'Hongkong'),
(b'HU', 'Ungarn'),
(b'IS', 'Island'),
(b'IN', 'Indien'),
(b'ID', 'Indonesien'), (
b'IR',
'Iran, Islamische Republik'),
(b'IQ', 'Irak'),
(b'IE', 'Irland'),
(b'IM', 'Isle of Man'),
(b'IL', 'Israel'),
(b'IT', 'Italien'),
(b'JM', 'Jamaika'),
(b'JP', 'Japan'),
(b'JE', 'Jersey'),
(b'JO', 'Jordan'),
(b'KZ', 'Kasachstan'),
(b'KE', 'Kenia'),
(b'KI', 'Kiribati'), (
b'KP',
'Korea, Demokratische Volksrepublik'),
(
b'KR',
'Korea, Republik'),
(b'KW', 'Kuwait'),
(b'KG', 'Kirgisistan'), (
b'LA',
'Lao Demokratischen Volksrepublik'),
(b'LV', 'Lettland'),
(b'LB', 'Libanon'), (
b'LS', 'Lesotho'),
(b'LR', 'Liberia'),
(b'LY', 'Libyen'),
(b'LI', 'Liechtenstein'),
(b'LT', 'Litauen'),
(b'LU', 'Luxemburg'),
(b'MO', 'Macao'), (b'MK',
'Mazedonien, die ehemalige jugoslawische Republik'),
(b'MG', 'Madagaskar'),
(b'MW', 'Malawi'),
(b'MY', 'Malaysia'),
(b'MV', 'Malediven'),
(b'ML', 'Mali'),
(b'MT', 'Malta'), (b'MH',
'Marshall Islands'),
(b'MQ', 'Martinique'),
(b'MR', 'Mauretanien'),
(b'MU', 'Mauritius'),
(b'YT', 'Mayotte'),
(b'MX', 'Mexiko'), (b'FM',
'Mikronesien, F\xf6derierte Staaten von'),
(b'MD', 'Moldawien'),
(b'MC', 'Monaco'),
(b'MN', 'Mongolei'),
(b'ME', 'Montenegro'),
(b'MS', 'Montserrat'),
(b'MA', 'Marokko'),
(b'MZ', 'Mosambik'),
(b'MM', 'Myanmar'),
(b'NA', 'Namibia'),
(b'NR', 'Nauru'),
(b'NP', 'Nepal'),
(b'NL', 'Niederlande'), (
b'AN',
'Niederl\xe4ndische Antillen'),
(b'NC', 'Neukaledonien'),
(b'NZ', 'New Zealand'),
(b'NI', 'Nicaragua'),
(b'NE', 'Niger'),
(b'NG', 'Nigeria'),
(b'NU', 'Niue'),
(b'NF', 'Norfolk Island'),
(b'MP',
'Northern Mariana Islands'),
(b'NO', 'Norwegen'),
(b'OM', 'Oman'),
(b'PK', 'Pakistan'),
(b'PW', 'Palau'), (b'PS',
'Pal\xe4stinensische Autonomiegebiete'),
(b'PA', 'Panama'), (
b'PG',
'Papua-Neuguinea'),
(b'PY', 'Paraguay'),
(b'PE', 'Peru'),
(b'PH', 'Philippinen'),
(b'PN', 'Pitcairn'),
(b'PL', 'Polen'),
(b'PT', 'Portugal'),
(b'PR', 'Puerto Rico'),
(b'QA', 'Katar'), (b'RE',
'Wiedervereinigung'),
(b'RO', 'Rum\xe4nien'), (
b'RU',
'Russischen F\xf6deration'),
(b'RW', 'Ruanda'), (b'BL',
'Saint Barthelemy'),
(b'SH', 'Saint Helena'), (
b'KN',
'Saint Kitts und Nevis'),
(b'LC', 'Santa Lucia'),
(b'MF', 'Santa Martin'), (
b'PM',
'Saint Pierre und Miquelon'),
(b'VC',
'Saint Vincent und die Grenadinen'),
(b'WS', 'Samoa'),
(b'SM', 'San Marino'), (
b'ST',
'Sao Tome und Principe'),
(b'SA', 'Saudi-Arabien'),
(b'SN', 'Senegal'),
(b'RS', 'Serbien'),
(b'SC', 'Seychellen'),
(b'SL', 'Sierra Leone'),
(b'SG', 'Singapur'),
(b'SK', 'Slowakei'),
(b'SI', 'Slowenien'),
(b'SB', 'Salomon-Inseln'),
(b'SO', 'Somalia'),
(b'ZA', 'S\xfcdafrika'), (
b'GS',
'S\xfcdgeorgien und die S\xfcdlichen Sandwichinseln'),
(b'ES', 'Spanien'),
(b'LK', 'Sri Lanka'),
(b'SD', 'Sudan'),
(b'SR', 'Suriname'), (
b'SJ',
'Svalbard und Jan Mayen'),
(b'SZ', 'Swaziland'),
(b'SE', 'Schweden'),
(b'CH', 'Schweiz'), (
b'SY',
'Arabische Republik Syrien'),
(b'TW',
'Taiwan, Province of China'),
(b'TJ', 'Tadschikistan'),
(b'TZ',
'Tansania, Vereinigte Republik'),
(b'TH', 'Thailand'),
(b'TL', 'Timor-Leste'),
(b'TG', 'Togo'),
(b'TK', 'Tokelau'),
(b'TO', 'Tonga'), (b'TT',
'Trinidad und Tobago'),
(b'TN', 'Tunesien'),
(b'TR', 'T\xfcrkei'),
(b'TM', 'Turkmenistan'), (
b'TC',
'Turks-und Caicosinseln'),
(b'TV', 'Tuvalu'),
(b'UG', 'Uganda'),
(b'UA', 'Ukraine'), (
b'AE',
'Vereinigte Arabische Emirate'),
(b'US',
'Vereinigte Staaten'), (
b'UM',
'United States Minor Outlying Islands'),
(b'UY', 'Uruguay'),
(b'UZ', 'Usbekistan'),
(b'VU', 'Vanuatu'),
(b'VE', 'Venezuela'),
(b'VN', 'Vietnam'), (
b'VG',
'Virgin Islands, British'),
(b'VI',
'Virgin Islands, US'), (
b'WF',
'Wallis und Futuna'),
(b'EH', 'Westsahara'),
(b'YE', 'Jemen'),
(b'ZM', 'Sambia'),
(b'ZW', 'Zimbabwe')])),
], ],
options={ options={
'verbose_name': 'Veranstaltungsort', 'verbose_name': 'Veranstaltungsort',
@@ -67,6 +365,8 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='event', model_name='event',
name='location', name='location',
field=models.ForeignKey(to='events.Location'), field=models.ForeignKey(
to='events.Location',
on_delete=models.CASCADE),
), ),
] ]

View File

@@ -1,17 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations
import ckeditor.fields import ckeditor.fields
import events.models
import easy_thumbnails.fields
import django.db.models.deletion import django.db.models.deletion
import utils import easy_thumbnails.fields
from django.conf import settings from django.conf import settings
from django.db import models, migrations
import events.models
import utils
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('events', '0003_auto_20150823_2232'), ('events', '0003_auto_20150823_2232'),
@@ -22,18 +22,24 @@ class Migration(migrations.Migration):
name='Photo', name='Photo',
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)),
('name', models.CharField(max_length=100, ('name', models.CharField(max_length=100,
verbose_name='Name', blank=True)), verbose_name='Name', blank=True)),
('image', easy_thumbnails.fields.ThumbnailerImageField( ('image', easy_thumbnails.fields.ThumbnailerImageField(
upload_to=events.models.get_upload_path, storage=utils.OverwriteStorage(), verbose_name='Bild')), upload_to=events.models.get_upload_path,
storage=utils.OverwriteStorage(), verbose_name='Bild')),
('description', models.TextField(max_length=300, ('description', models.TextField(max_length=300,
verbose_name='Beschreibung', blank=True)), verbose_name='Beschreibung',
blank=True)),
('on_startpage', models.BooleanField(default=False, ('on_startpage', models.BooleanField(default=False,
help_text='Display this Photo on the Startpage Teaser', verbose_name='Startpage')), help_text='Display this Photo on the Startpage Teaser',
('created_date', models.DateTimeField(verbose_name='Published on')), verbose_name='Startpage')),
('created_date',
models.DateTimeField(verbose_name='Published on')),
('views', models.PositiveIntegerField(default=0, ('views', models.PositiveIntegerField(default=0,
verbose_name='Number of views', editable=False)), verbose_name='Number of views',
editable=False)),
], ],
options={ options={
'ordering': ['created_date'], 'ordering': ['created_date'],
@@ -46,7 +52,8 @@ class Migration(migrations.Migration):
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='event', name='event',
options={'ordering': ( options={'ordering': (
'start', 'end'), 'verbose_name': 'Termin', 'verbose_name_plural': 'Termine'}, 'start', 'end'), 'verbose_name': 'Termin',
'verbose_name_plural': 'Termine'},
), ),
migrations.AlterField( migrations.AlterField(
model_name='event', model_name='event',
@@ -57,14 +64,19 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='event', model_name='event',
name='event_series', name='event_series',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='events.Event', field=models.ForeignKey(
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'), on_delete=django.db.models.deletion.SET_NULL, blank=True,
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.',
null=True, verbose_name='Veranstaltungsreihen'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='event', model_name='event',
name='image', name='image',
field=easy_thumbnails.fields.ThumbnailerImageField(storage=utils.OverwriteStorage( field=easy_thumbnails.fields.ThumbnailerImageField(
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True), storage=utils.OverwriteStorage(
), upload_to=events.models.get_upload_path, null=True,
verbose_name='Bild', blank=True),
), ),
migrations.AlterField( migrations.AlterField(
model_name='location', model_name='location',
@@ -75,17 +87,21 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='location', model_name='location',
name='image', name='image',
field=easy_thumbnails.fields.ThumbnailerImageField(storage=utils.OverwriteStorage( field=easy_thumbnails.fields.ThumbnailerImageField(
), upload_to=events.models.get_upload_path, null=True, verbose_name='Bild', blank=True), storage=utils.OverwriteStorage(
), upload_to=events.models.get_upload_path, null=True,
verbose_name='Bild', blank=True),
), ),
migrations.AddField( migrations.AddField(
model_name='photo', model_name='photo',
name='event', name='event',
field=models.ForeignKey(to='events.Event'), field=models.ForeignKey(
to='events.Event', on_delete=models.CASCADE),
), ),
migrations.AddField( migrations.AddField(
model_name='photo', model_name='photo',
name='photographer', name='photographer',
field=models.ForeignKey(to=settings.AUTH_USER_MODEL), field=models.ForeignKey(
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE),
), ),
] ]

View File

@@ -4,10 +4,10 @@ import os
from ckeditor.fields import RichTextField from ckeditor.fields import RichTextField
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import reverse
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.template.defaultfilters import slugify from django.template.defaultfilters import slugify
from django.urls import reverse
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from easy_thumbnails.fields import ThumbnailerImageField from easy_thumbnails.fields import ThumbnailerImageField
@@ -51,7 +51,7 @@ class Event(models.Model):
"""An Event that could be a tournament, a game session, or an convention.""" """An Event that could be a tournament, a game session, or an convention."""
name = models.CharField(_('Name'), max_length=255) name = models.CharField(_('Name'), max_length=255)
description = RichTextField(_("Description"), blank=True) description = RichTextField(_("Description"), blank=True)
location = models.ForeignKey('Location') location = models.ForeignKey('Location', on_delete=models.PROTECT)
start = models.DateTimeField(_('Start')) start = models.DateTimeField(_('Start'))
end = models.DateTimeField(_('End'), blank=True, null=True) end = models.DateTimeField(_('End'), blank=True, null=True)
url = models.URLField(_('Homepage'), blank=True) url = models.URLField(_('Homepage'), blank=True)
@@ -220,13 +220,14 @@ class Photo(models.Model):
upload_to=get_upload_path, upload_to=get_upload_path,
storage=OverwriteStorage() storage=OverwriteStorage()
) )
event = models.ForeignKey('events.Event') event = models.ForeignKey('events.Event', on_delete=models.PROTECT, )
description = models.TextField( description = models.TextField(
_("Description"), _("Description"),
max_length=300, max_length=300,
blank=True blank=True
) )
photographer = models.ForeignKey(settings.AUTH_USER_MODEL) photographer = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT)
on_startpage = models.BooleanField( on_startpage = models.BooleanField(
_("Startpage"), _("Startpage"),
default=False, default=False,

View File

@@ -1,12 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations
from django.conf import settings from django.conf import settings
from django.db import models, migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('events', '0005_auto_20150907_2021'), ('events', '0005_auto_20150907_2021'),
@@ -17,15 +16,19 @@ class Migration(migrations.Migration):
name='EventRanking', name='EventRanking',
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,
('placement', models.PositiveIntegerField(null=True, blank=True)), primary_key=True)),
('placement',
models.PositiveIntegerField(null=True, blank=True)),
('avg_placement', models.FloatField(default=4)), ('avg_placement', models.FloatField(default=4)),
('avg_score', models.FloatField(default=0)), ('avg_score', models.FloatField(default=0)),
('hanchan_count', models.PositiveIntegerField(default=0)), ('hanchan_count', models.PositiveIntegerField(default=0)),
('good_hanchans', models.PositiveIntegerField(default=0)), ('good_hanchans', models.PositiveIntegerField(default=0)),
('won_hanchans', models.PositiveIntegerField(default=0)), ('won_hanchans', models.PositiveIntegerField(default=0)),
('event', models.ForeignKey(to='events.Event')), ('event', models.ForeignKey(to='events.Event',
('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': ('placement', 'avg_placement', '-avg_score'), 'ordering': ('placement', 'avg_placement', '-avg_score'),
@@ -35,10 +38,13 @@ class Migration(migrations.Migration):
name='Hanchan', name='Hanchan',
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)),
('start', models.DateTimeField( ('start', models.DateTimeField(
help_text='Wichtig damit die richtigen Hanchans in die Wertung kommen.', verbose_name='Beginn')), help_text='Wichtig damit die richtigen Hanchans in die Wertung kommen.',
('player1_input_score', models.IntegerField(verbose_name='Punkte')), verbose_name='Beginn')),
('player1_input_score',
models.IntegerField(verbose_name='Punkte')),
('player1_game_score', models.PositiveIntegerField( ('player1_game_score', models.PositiveIntegerField(
default=0, verbose_name='Punkte', editable=False)), default=0, verbose_name='Punkte', editable=False)),
('player1_placement', models.PositiveSmallIntegerField( ('player1_placement', models.PositiveSmallIntegerField(
@@ -50,8 +56,11 @@ class Migration(migrations.Migration):
('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, editable=False, blank=True)), max_length=255,
('player2_input_score', models.IntegerField(verbose_name='Punkte')), editable=False,
blank=True)),
('player2_input_score',
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(
@@ -63,8 +72,11 @@ class Migration(migrations.Migration):
('player2_bonus_points', models.SmallIntegerField( ('player2_bonus_points', models.SmallIntegerField(
null=True, editable=False, blank=True)), null=True, editable=False, blank=True)),
('player2_comment', models.CharField(verbose_name='Anmerkung', ('player2_comment', models.CharField(verbose_name='Anmerkung',
max_length=255, editable=False, blank=True)), max_length=255,
('player3_input_score', models.IntegerField(verbose_name='Punkte')), editable=False,
blank=True)),
('player3_input_score',
models.IntegerField(verbose_name='Punkte')),
('player3_game_score', models.PositiveIntegerField( ('player3_game_score', models.PositiveIntegerField(
default=0, verbose_name='Punkte', editable=False)), default=0, verbose_name='Punkte', editable=False)),
('player3_placement', models.PositiveSmallIntegerField( ('player3_placement', models.PositiveSmallIntegerField(
@@ -76,8 +88,11 @@ class Migration(migrations.Migration):
('player3_bonus_points', models.SmallIntegerField( ('player3_bonus_points', models.SmallIntegerField(
null=True, editable=False, blank=True)), null=True, editable=False, blank=True)),
('player3_comment', models.CharField(verbose_name='Anmerkung', ('player3_comment', models.CharField(verbose_name='Anmerkung',
max_length=255, editable=False, blank=True)), max_length=255,
('player4_input_score', models.IntegerField(verbose_name='Punkte')), editable=False,
blank=True)),
('player4_input_score',
models.IntegerField(verbose_name='Punkte')),
('player4_game_score', models.PositiveIntegerField( ('player4_game_score', models.PositiveIntegerField(
default=0, verbose_name='Punkte', editable=False)), default=0, verbose_name='Punkte', editable=False)),
('player4_placement', models.PositiveSmallIntegerField( ('player4_placement', models.PositiveSmallIntegerField(
@@ -89,22 +104,37 @@ class Migration(migrations.Migration):
('player4_bonus_points', models.SmallIntegerField( ('player4_bonus_points', models.SmallIntegerField(
null=True, editable=False, blank=True)), null=True, editable=False, blank=True)),
('player4_comment', models.CharField(verbose_name='Anmerkung', ('player4_comment', models.CharField(verbose_name='Anmerkung',
max_length=255, editable=False, blank=True)), max_length=255,
('comment', models.TextField(verbose_name='Anmerkung', blank=True)), editable=False,
blank=True)),
('comment',
models.TextField(verbose_name='Anmerkung', blank=True)),
('confirmed', models.BooleanField( ('confirmed', models.BooleanField(
default=True, help_text='Nur g\xfcltige und best\xe4tigte Hanchans kommen in die Wertung.', verbose_name='Wurde best\xe4tigt')), default=True,
('player_names', models.CharField(max_length=255, editable=False)), help_text='Nur g\xfcltige und best\xe4tigte Hanchans kommen in die Wertung.',
verbose_name='Wurde best\xe4tigt')),
('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(to='events.Event')), ('event', models.ForeignKey(to='events.Event',
on_delete=models.CASCADE)),
('player1', models.ForeignKey(related_name='user_hanchan+', ('player1', models.ForeignKey(related_name='user_hanchan+',
verbose_name='Spieler 1', to=settings.AUTH_USER_MODEL)), verbose_name='Spieler 1',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player2', models.ForeignKey(related_name='user_hanchan+', ('player2', models.ForeignKey(related_name='user_hanchan+',
verbose_name='Spieler 2', to=settings.AUTH_USER_MODEL)), verbose_name='Spieler 2',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player3', models.ForeignKey(related_name='user_hanchan+', ('player3', models.ForeignKey(related_name='user_hanchan+',
verbose_name='Spieler 3', to=settings.AUTH_USER_MODEL)), verbose_name='Spieler 3',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
('player4', models.ForeignKey(related_name='user_hanchan+', ('player4', models.ForeignKey(related_name='user_hanchan+',
verbose_name='Spieler 4', to=settings.AUTH_USER_MODEL)), verbose_name='Spieler 4',
to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
], ],
options={ options={
'ordering': ('-start',), 'ordering': ('-start',),
@@ -116,8 +146,11 @@ class Migration(migrations.Migration):
name='KyuDanRanking', name='KyuDanRanking',
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,
('dan', models.PositiveSmallIntegerField(null=True, blank=True)), primary_key=True)),
(
'dan',
models.PositiveSmallIntegerField(null=True, blank=True)),
('dan_points', models.PositiveIntegerField(default=0)), ('dan_points', models.PositiveIntegerField(default=0)),
('kyu', models.PositiveSmallIntegerField( ('kyu', models.PositiveSmallIntegerField(
default=10, null=True, blank=True)), default=10, null=True, blank=True)),
@@ -128,7 +161,8 @@ class Migration(migrations.Migration):
('legacy_date', models.DateField(null=True, blank=True)), ('legacy_date', models.DateField(null=True, blank=True)),
('legacy_dan_points', models.PositiveIntegerField(default=0)), ('legacy_dan_points', models.PositiveIntegerField(default=0)),
('legacy_kyu_points', models.PositiveIntegerField(default=0)), ('legacy_kyu_points', models.PositiveIntegerField(default=0)),
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
], ],
options={ options={
'ordering': ('-dan', '-dan_points', '-kyu_points'), 'ordering': ('-dan', '-dan_points', '-kyu_points'),
@@ -140,15 +174,19 @@ class Migration(migrations.Migration):
name='SeasonRanking', name='SeasonRanking',
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,
('season', models.PositiveSmallIntegerField(verbose_name='Saison')), primary_key=True)),
('placement', models.PositiveIntegerField(null=True, blank=True)), ('season',
models.PositiveSmallIntegerField(verbose_name='Saison')),
('placement',
models.PositiveIntegerField(null=True, blank=True)),
('avg_placement', models.FloatField(null=True, blank=True)), ('avg_placement', models.FloatField(null=True, blank=True)),
('avg_score', models.FloatField(null=True, blank=True)), ('avg_score', models.FloatField(null=True, blank=True)),
('hanchan_count', models.PositiveIntegerField(default=0)), ('hanchan_count', models.PositiveIntegerField(default=0)),
('good_hanchans', models.PositiveIntegerField(default=0)), ('good_hanchans', models.PositiveIntegerField(default=0)),
('won_hanchans', models.PositiveIntegerField(default=0)), ('won_hanchans', models.PositiveIntegerField(default=0)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
], ],
options={ options={
'ordering': ('placement', 'avg_placement', '-avg_score'), 'ordering': ('placement', 'avg_placement', '-avg_score'),

View File

@@ -9,8 +9,8 @@ from datetime import datetime, time
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@@ -29,8 +29,8 @@ class EventRanking(models.Model):
Sie beschränken sich aber auf einen Event und werden nur dann angestossen, Sie beschränken sich aber auf einen Event und werden nur dann angestossen,
wenn der Event als Turnier markiert wurde. wenn der Event als Turnier markiert wurde.
""" """
user = models.ForeignKey(settings.AUTH_USER_MODEL) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
event = models.ForeignKey(Event) event = models.ForeignKey(Event, on_delete=models.CASCADE)
placement = models.PositiveIntegerField(blank=True, null=True) placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.FloatField(default=4) avg_placement = models.FloatField(default=4)
avg_score = models.FloatField(default=0) avg_score = models.FloatField(default=0)
@@ -86,7 +86,7 @@ class Hanchan(models.Model):
Es werden aber noch andere Tests durchgeführt, ob sie gültig ist. Es werden aber noch andere Tests durchgeführt, ob sie gültig ist.
Außerdem gehört jede Hanchan zu einer Veranstaltung. Außerdem gehört jede Hanchan zu einer Veranstaltung.
""" """
event = models.ForeignKey(Event) event = models.ForeignKey(Event, on_delete=models.CASCADE)
start = models.DateTimeField( start = models.DateTimeField(
_('Start'), _('Start'),
help_text=_('This is crucial to get the right Hanchans that scores') help_text=_('This is crucial to get the right Hanchans that scores')
@@ -94,7 +94,7 @@ class Hanchan(models.Model):
player1 = models.ForeignKey( player1 = models.ForeignKey(
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, on_delete=models.PROTECT,
related_name='user_hanchan+', related_name='user_hanchan+',
verbose_name=_('Player 1')) verbose_name=_('Player 1'))
player1_input_score = models.IntegerField(_('Score')) player1_input_score = models.IntegerField(_('Score'))
@@ -113,7 +113,7 @@ class Hanchan(models.Model):
player2 = models.ForeignKey( player2 = models.ForeignKey(
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, on_delete=models.PROTECT,
related_name='user_hanchan+', related_name='user_hanchan+',
verbose_name=_('Player 2')) verbose_name=_('Player 2'))
player2_input_score = models.IntegerField(_('Score')) player2_input_score = models.IntegerField(_('Score'))
@@ -132,7 +132,7 @@ class Hanchan(models.Model):
player3 = models.ForeignKey( player3 = models.ForeignKey(
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, on_delete=models.PROTECT,
related_name='user_hanchan+', related_name='user_hanchan+',
verbose_name=_('Player 3')) verbose_name=_('Player 3'))
player3_input_score = models.IntegerField(_('Score')) player3_input_score = models.IntegerField(_('Score'))
@@ -151,7 +151,7 @@ class Hanchan(models.Model):
player4 = models.ForeignKey( player4 = models.ForeignKey(
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, on_delete=models.PROTECT,
related_name='user_hanchan+', related_name='user_hanchan+',
verbose_name=_('Player 4')) verbose_name=_('Player 4'))
player4_input_score = models.IntegerField(_('Score')) player4_input_score = models.IntegerField(_('Score'))
@@ -335,18 +335,21 @@ class KyuDanRanking(models.Model):
Im Gegensatz zum Ladder Ranking ist das nicht Saison gebunden. Im Gegensatz zum Ladder Ranking ist das nicht Saison gebunden.
Deswegen läuft es getrennt. Deswegen läuft es getrennt.
""" """
user = models.OneToOneField(settings.AUTH_USER_MODEL) user = models.OneToOneField(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
dan = models.PositiveSmallIntegerField(blank=True, null=True) dan = models.PositiveSmallIntegerField(blank=True, null=True)
dan_points = models.PositiveIntegerField(default=0) dan_points = models.PositiveIntegerField(default=0)
max_dan_points = models.PositiveIntegerField(default=0)
kyu = models.PositiveSmallIntegerField(default=10, blank=True, null=True) kyu = models.PositiveSmallIntegerField(default=10, blank=True, null=True)
kyu_points = models.PositiveIntegerField(default=0) kyu_points = models.PositiveIntegerField(default=0)
won_hanchans = models.PositiveIntegerField(default=0) won_hanchans = models.PositiveIntegerField(default=0)
good_hanchans = models.PositiveIntegerField(default=0) good_hanchans = models.PositiveIntegerField(default=0)
hanchan_count = models.PositiveIntegerField(default=0) hanchan_count = models.PositiveIntegerField(default=0)
legacy_date = models.DateField(blank=True, null=True) legacy_date = models.DateField(blank=True, null=True)
legacy_hanchan_count = models.PositiveIntegerField(default=0) legacy_dan = models.PositiveSmallIntegerField(blank=True, null=True)
legacy_dan_points = models.PositiveIntegerField(default=0) legacy_dan_points = models.PositiveIntegerField(default=0)
legacy_kyu_points = models.PositiveIntegerField(default=0) legacy_kyu_points = models.PositiveIntegerField(default=0)
legacy_hanchan_count = models.PositiveIntegerField(default=0)
wins_in_a_row = models.PositiveIntegerField(default=0) wins_in_a_row = models.PositiveIntegerField(default=0)
last_hanchan_date = models.DateTimeField(blank=True, null=True) last_hanchan_date = models.DateTimeField(blank=True, null=True)
objects = managers.KyuDanRankingManager() objects = managers.KyuDanRankingManager()
@@ -356,8 +359,8 @@ class KyuDanRanking(models.Model):
verbose_name = _(u'Kyū/Dan Ranking') verbose_name = _(u'Kyū/Dan Ranking')
verbose_name_plural = _(u'Kyū/Dan Rankings') verbose_name_plural = _(u'Kyū/Dan Rankings')
def __unicode__(self): def __str__(self):
if self.dan_points is not None: if self.dan is not None:
return u"%s - %d. Dan" % (self.user.username, self.dan or 1) return u"%s - %d. Dan" % (self.user.username, self.dan or 1)
else: else:
return u"%s - %d. Kyu" % (self.user.username, self.kyu or 10) return u"%s - %d. Kyu" % (self.user.username, self.kyu or 10)
@@ -395,7 +398,6 @@ class KyuDanRanking(models.Model):
self.dan_points += bonus_points self.dan_points += bonus_points
self.wins_in_a_row = 0 self.wins_in_a_row = 0
# TODO: Komplett Überabreiten!
def append_tournament_bonuspoints(self, hanchan): def append_tournament_bonuspoints(self, hanchan):
""" """
Prüft ob es die letzte Hanchan in einem Turnier war. Wenn ja werden Prüft ob es die letzte Hanchan in einem Turnier war. Wenn ja werden
@@ -408,20 +410,20 @@ class KyuDanRanking(models.Model):
user=self.user, event=hanchan.event user=self.user, event=hanchan.event
).order_by('-start') ).order_by('-start')
last_hanchan_this_event = hanchans_this_event[0] last_hanchan_this_event = hanchans_this_event[0]
if hanchan != last_hanchan_this_event:
# Das braucht nur am Ende eines Turnieres gemacht werden. # Das braucht nur am Ende eines Turnieres gemacht werden.
return False if hanchan != last_hanchan_this_event: return False
else:
event_ranking = EventRanking.objects.get( event_ranking = EventRanking.objects.get(
user=self.user, user=self.user,
event=hanchan.event event=hanchan.event
) )
if event_ranking.placement == 1: if event_ranking.placement == 1:
bonus_points += 4 bonus_points += settings.TOURNAMENT_WIN_BONUSPOINTS
hanchan.player_comment += u'+4 Punkte Turnier gewonnen. ' hanchan.player_comment += u'+{0:d} Punkte Turnier gewonnen. '.format(
settings.TOURNAMENT_WIN_BONUSPOINTS)
if event_ranking.avg_placement == 1: if event_ranking.avg_placement == 1:
bonus_points += 8 bonus_points += settings.TOURNAMENT_FLAWLESS_VICTORY_BONUSPOINTS
hanchan.player_comment += u'+8 Pkt: alle Spiele des Turnieres gewonnen. ' hanchan.player_comment += u'+{0:d} Pkt: alle Spiele des Turnieres 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
@@ -451,7 +453,7 @@ class KyuDanRanking(models.Model):
force_recalc = True force_recalc = True
if force_recalc: if force_recalc:
# Setze alles auf die legacy Werte und berechne alles von neuem. # Setze alles auf die legacy Werte und berechne alles von neuem.
self.dan = None self.dan = self.legacy_dan
self.dan_points = self.legacy_dan_points or 0 self.dan_points = self.legacy_dan_points or 0
self.kyu = None self.kyu = None
self.kyu_points = self.legacy_kyu_points or 0 self.kyu_points = self.legacy_kyu_points or 0
@@ -507,14 +509,14 @@ class KyuDanRanking(models.Model):
'score: %(score)d, kyu points: %(kyu_points)d, dan points: ' 'score: %(score)d, kyu points: %(kyu_points)d, dan points: '
'%(dan_points)d, bonus points: %(bonus_points)d', '%(dan_points)d, bonus points: %(bonus_points)d',
{'id': hanchan.pk, 'start': hanchan.start, {'id': hanchan.pk, 'start': hanchan.start,
'placement': hanchan.placement, 'score': hanchan.game_score, 'placement': hanchan.placement,
'score': hanchan.game_score,
'kyu_points': hanchan.kyu_points or 0, 'kyu_points': hanchan.kyu_points or 0,
'dan_points': hanchan.dan_points or 0, 'dan_points': hanchan.dan_points or 0,
'bonus_points': hanchan.bonus_points or 0} 'bonus_points': hanchan.bonus_points or 0}
) )
self.save(force_update=True) self.save(force_update=True)
def update_hanchan_points(self, hanchan): def update_hanchan_points(self, hanchan):
""" """
Berechne die Kyu bzw. Dan Punkte für eine Hanchan neu. Berechne die Kyu bzw. Dan Punkte für eine Hanchan neu.
@@ -523,7 +525,7 @@ class KyuDanRanking(models.Model):
""" """
hanchan.kyu_points = None hanchan.kyu_points = None
hanchan.dan_points = None hanchan.dan_points = None
if hanchan.event.mahjong_tournament: if hanchan.event.mahjong_tournament and settings.TOURNAMENT_POINT_SYSTEM:
"""Für Turniere gelten andere Regeln zur Punktevergabe: """Für Turniere gelten andere Regeln zur Punktevergabe:
1. Platz 4 Punkte 1. Platz 4 Punkte
2. Platz 3 Punkte 2. Platz 3 Punkte
@@ -547,6 +549,7 @@ class KyuDanRanking(models.Model):
hanchan.dan_points = -1 hanchan.dan_points = -1
elif hanchan.placement == 4: elif hanchan.placement == 4:
hanchan.dan_points = -2 hanchan.dan_points = -2
# otherwise player must be in the kyu ranking
elif hanchan.game_score >= 60000: elif hanchan.game_score >= 60000:
hanchan.kyu_points = 3 hanchan.kyu_points = 3
elif hanchan.game_score >= 30000: elif hanchan.game_score >= 30000:
@@ -568,38 +571,30 @@ class KyuDanRanking(models.Model):
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
# TODO: Merkwürdige Methode die zwar funktioniert aber nicht sehr
# aussagekräfig ist. Überarbeiten?
def update_rank(self): def update_rank(self):
if self.dan and self.dan_points < 0: print(self.user, self.dan, self.kyu)
self.dan_points = 0
self.dan = 1
elif self.dan or self.dan_points > 0:
old_dan = self.dan old_dan = self.dan
for min_points, dan_rank in settings.DAN_RANKS: if settings.DAN_ALLOW_DROP_DOWN and (self.dan or self.dan_points > 0):
if self.dan_points > min_points: self.dan = max((dan for min_points, dan in settings.DAN_RANKS if
self.dan = dan_rank self.dan_points > min_points))
break elif self.dan or self.dan_points > 0:
if old_dan is None or self.dan > old_dan: self.dan = max((dan for min_points, dan in settings.DAN_RANKS if
self.wins_in_a_row = 0 self.max_dan_points > min_points))
elif self.kyu_points < 1:
self.kyu_points = 0
self.kyu = 10
elif self.kyu_points > 50: elif self.kyu_points > 50:
self.dan = 1 self.dan = 1
self.kyu = None
self.dan_points = 0 self.dan_points = 0
self.kyu = None
self.kyu_points = 0 self.kyu_points = 0
self.wins_in_a_row = 0
else: else:
for min_points, kyu_rank in settings.KYU_RANKS: print(self, self.kyu_points)
if self.kyu_points > min_points: self.kyu = max((kyu for min_points, kyu in settings.KYU_RANKS if
self.kyu = kyu_rank self.kyu_points > min_points))
break self.wins_in_a_row = 0 if self.dan > old_dan else self.wins_in_a_row
class SeasonRanking(models.Model): class SeasonRanking(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
season = models.PositiveSmallIntegerField(_('Season')) season = models.PositiveSmallIntegerField(_('Season'))
placement = models.PositiveIntegerField(blank=True, null=True) placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.FloatField(blank=True, null=True) avg_placement = models.FloatField(blank=True, null=True)

View File

@@ -37,19 +37,19 @@ class Migration(migrations.Migration):
('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')), 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)), 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)), 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)), 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)), 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)), 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)), verbose_name='Spieler 6', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
@@ -65,7 +65,7 @@ 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)), ('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

@@ -2,11 +2,11 @@
import logging import logging
from django.urls import reverse
from django.db import models from django.db import models
from django.db.models.signals import post_delete, post_save from django.db.models.signals import post_delete, post_save
from django.utils.translation import ugettext as _
from django.dispatch import receiver from django.dispatch import receiver
from django.urls import reverse
from django.utils.translation import ugettext as _
from events.models import Event from events.models import Event
from . import settings, managers from . import settings, managers
@@ -16,40 +16,47 @@ class Game(models.Model):
"""to record a complete game with 6 different players.""" """to record a complete game with 6 different players."""
_player_list = list() _player_list = list()
event = models.ForeignKey(Event, related_name='maistargame_set') event = models.ForeignKey(Event, on_delete=models.CASCADE,
related_name='maistargame_set')
comment = models.TextField(_('Comment'), blank=True) comment = models.TextField(_('Comment'), blank=True)
player1 = models.ForeignKey( player1 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 1"), related_name='+' settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
verbose_name=_("Player 1"), related_name='+'
) )
player1_score = models.SmallIntegerField(_("Score")) player1_score = models.SmallIntegerField(_("Score"))
player1_placement = models.PositiveSmallIntegerField(editable=False) player1_placement = models.PositiveSmallIntegerField(editable=False)
player2 = models.ForeignKey( player2 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 2"), related_name='+' settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
verbose_name=_("Player 2"), related_name='+'
) )
player2_score = models.SmallIntegerField(_("Score")) player2_score = models.SmallIntegerField(_("Score"))
player2_placement = models.PositiveSmallIntegerField(editable=False) player2_placement = models.PositiveSmallIntegerField(editable=False)
player3 = models.ForeignKey( player3 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 3"), related_name='+' settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
verbose_name=_("Player 3"), related_name='+'
) )
player3_score = models.SmallIntegerField(_("Score")) player3_score = models.SmallIntegerField(_("Score"))
player3_placement = models.PositiveSmallIntegerField(editable=False) player3_placement = models.PositiveSmallIntegerField(editable=False)
player4 = models.ForeignKey( player4 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 4"), related_name='+' settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
verbose_name=_("Player 4"), related_name='+'
) )
player4_score = models.SmallIntegerField(_("Score")) player4_score = models.SmallIntegerField(_("Score"))
player4_placement = models.PositiveSmallIntegerField(editable=False) player4_placement = models.PositiveSmallIntegerField(editable=False)
player5 = models.ForeignKey( player5 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 5"), related_name='+' settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
verbose_name=_("Player 5"), related_name='+'
) )
player5_score = models.SmallIntegerField(_("Score")) player5_score = models.SmallIntegerField(_("Score"))
player5_placement = models.PositiveSmallIntegerField(editable=False) player5_placement = models.PositiveSmallIntegerField(editable=False)
player6 = models.ForeignKey( player6 = models.ForeignKey(
settings.AUTH_USER_MODEL, verbose_name=_("Player 6"), related_name='+' settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
verbose_name=_("Player 6"), related_name='+'
) )
player6_score = models.SmallIntegerField(_("Score")) player6_score = models.SmallIntegerField(_("Score"))
player6_placement = models.PositiveSmallIntegerField(editable=False) player6_placement = models.PositiveSmallIntegerField(editable=False)
@@ -69,7 +76,6 @@ class Game(models.Model):
"""Display rankings by placement, best players first.""" """Display rankings by placement, best players first."""
ordering = ('-event__start', '-id') ordering = ('-event__start', '-id')
def __str__(self): def __str__(self):
return _("Mai-Star Game with {0} from {1:%Y-%m-%d}").format( return _("Mai-Star Game with {0} from {1:%Y-%m-%d}").format(
self.player_names, self.event.start self.player_names, self.event.start
@@ -143,7 +149,7 @@ class Game(models.Model):
class Ranking(models.Model): class Ranking(models.Model):
"""the player scores in the ladder for one season. """ """the player scores in the ladder for one season. """
user = models.ForeignKey(settings.AUTH_USER_MODEL) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
season = models.PositiveSmallIntegerField(_("Season")) season = models.PositiveSmallIntegerField(_("Season"))
placement = models.PositiveIntegerField(blank=True, null=True) placement = models.PositiveIntegerField(blank=True, null=True)
avg_placement = models.PositiveSmallIntegerField(blank=True, null=True) avg_placement = models.PositiveSmallIntegerField(blank=True, null=True)

View File

@@ -1,17 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations
import django.core.validators
import django.contrib.auth.models import django.contrib.auth.models
from django.conf import settings import django.core.validators
import django.utils.timezone import django.utils.timezone
from django.conf import settings
from django.db import models, migrations
import membership.models import membership.models
import utils import utils
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('auth', '0006_require_contenttypes_0002'), ('auth', '0006_require_contenttypes_0002'),
] ]
@@ -21,56 +21,94 @@ class Migration(migrations.Migration):
name='Membership', name='Membership',
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)),
('password', models.CharField( ('password', models.CharField(
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(default=False,
help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), help_text='Designates that this user has all permissions without explicitly assigning them.',
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator( verbose_name='superuser status')),
'^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username')), ('username', models.CharField(error_messages={
'unique': 'A user with that username already exists.'},
max_length=30, validators=[
django.core.validators.RegexValidator(
'^[\\w.@+-]+$',
'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.',
'invalid')],
help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
unique=True,
verbose_name='username')),
('first_name', models.CharField(max_length=30, ('first_name', models.CharField(max_length=30,
verbose_name='first name', blank=True)), verbose_name='first name',
blank=True)),
('last_name', models.CharField(max_length=30, ('last_name', models.CharField(max_length=30,
verbose_name='last name', blank=True)), verbose_name='last name',
blank=True)),
('email', models.EmailField(max_length=254, ('email', models.EmailField(max_length=254,
verbose_name='email address', blank=True)), verbose_name='email address',
blank=True)),
('is_staff', models.BooleanField(default=False, ('is_staff', models.BooleanField(default=False,
help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), help_text='Designates whether the user can log into this admin site.',
verbose_name='staff status')),
('is_active', models.BooleanField( ('is_active', models.BooleanField(
default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), default=True,
help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.',
verbose_name='active')),
('date_joined', models.DateTimeField( ('date_joined', models.DateTimeField(
default=django.utils.timezone.now, verbose_name='date joined')), default=django.utils.timezone.now,
('gender', models.CharField(max_length=1, verbose_name='Geschlecht', choices=[ verbose_name='date joined')),
(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')])), ('gender',
models.CharField(max_length=1, verbose_name='Geschlecht',
choices=[
(b'm', 'M\xe4nnlich'),
(b'f', 'Weiblich')])),
('website', models.URLField(blank=True)), ('website', models.URLField(blank=True)),
('avatar', models.ImageField(storage=utils.OverwriteStorage( ('avatar', models.ImageField(storage=utils.OverwriteStorage(
), null=True, upload_to=membership.models.get_upload_path, blank=True)), ), null=True, upload_to=membership.models.get_upload_path,
blank=True)),
('membership', models.BooleanField(default=False, ('membership', models.BooleanField(default=False,
help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', verbose_name='Mitgliedschaft')), help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.',
verbose_name='Mitgliedschaft')),
('birthday', models.DateField(null=True, ('birthday', models.DateField(null=True,
verbose_name='Geburtstag', blank=True)), verbose_name='Geburtstag',
blank=True)),
('telephone', models.CharField(max_length=30, ('telephone', models.CharField(max_length=30,
null=True, verbose_name='Telefon', blank=True)), null=True,
verbose_name='Telefon',
blank=True)),
('street_name', models.CharField(max_length=75, ('street_name', models.CharField(max_length=75,
null=True, verbose_name='Adresse', blank=True)), null=True,
verbose_name='Adresse',
blank=True)),
('post_code', models.PositiveSmallIntegerField( ('post_code', models.PositiveSmallIntegerField(
null=True, verbose_name='Postleitzahl', blank=True)), null=True, verbose_name='Postleitzahl', blank=True)),
('city', models.CharField(max_length=75, ('city', models.CharField(max_length=75,
null=True, verbose_name='Ort', blank=True)), null=True, verbose_name='Ort',
blank=True)),
('deposit', models.PositiveSmallIntegerField( ('deposit', models.PositiveSmallIntegerField(
default=0, editable=False)), default=0, editable=False)),
('registration_date', models.DateField(auto_now_add=True)), ('registration_date', models.DateField(auto_now_add=True)),
('paid_until', models.DateField(null=True, ('paid_until', models.DateField(null=True,
verbose_name='Bezahlt bis', blank=True)), verbose_name='Bezahlt bis',
blank=True)),
('confirmed', models.BooleanField(default=False, ('confirmed', models.BooleanField(default=False,
help_text='Diese Person hat ihre Mitgliedschaft bezahlt', verbose_name='Best\xe4tigt')), help_text='Diese Person hat ihre Mitgliedschaft bezahlt',
verbose_name='Best\xe4tigt')),
('comment', models.TextField(blank=True)), ('comment', models.TextField(blank=True)),
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, ('groups', models.ManyToManyField(related_query_name='user',
help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')), related_name='user_set',
('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', to='auth.Group', blank=True,
blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')), help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.',
verbose_name='groups')),
('user_permissions',
models.ManyToManyField(related_query_name='user',
related_name='user_set',
to='auth.Permission',
blank=True,
help_text='Specific permissions for this user.',
verbose_name='user permissions')),
], ],
options={ options={
'ordering': ('last_name', 'first_name'), 'ordering': ('last_name', 'first_name'),
@@ -86,11 +124,13 @@ class Migration(migrations.Migration):
name='ActivationRequest', name='ActivationRequest',
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)),
('activation_key', models.CharField( ('activation_key', models.CharField(
max_length=40, verbose_name='Aktivierungsschl\xfcssel')), max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
('user', models.OneToOneField( ('user', models.OneToOneField(
verbose_name='Benutzer', to=settings.AUTH_USER_MODEL)), verbose_name='Benutzer', to=settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)),
], ],
options={ options={
'verbose_name': 'Ausstehende Aktivierung', 'verbose_name': 'Ausstehende Aktivierung',

View File

@@ -80,6 +80,7 @@ class ActivationRequest(models.Model):
""" """
user = models.OneToOneField( user = models.OneToOneField(
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
verbose_name=_('user') verbose_name=_('user')
) )
activation_key = models.CharField(_('activation key'), max_length=40) activation_key = models.CharField(_('activation key'), max_length=40)