Fehler bei Vergabe von Bonuspunkte korrigiert.

Kommentare für Bonuspunkte werden jetzt als Kommentar beim Spieler hinterlassen, nicht als Kommentar in der Hanchan.
FIXED: 3_in_a_row counter wurde nicht zurückgesetzt wenn Bonuspunkte vergeben wurden.
FIXED: Durchschnittliche Platzierung während eines Events wurde nur als Ganzzahl berechnet. Wird nun als Fießkomma berechnet und gesichert.
This commit is contained in:
Christian Berg
2016-01-09 22:55:26 +01:00
parent 088efe2f39
commit b1586efbab
155 changed files with 2571 additions and 2835 deletions

View File

@@ -7,9 +7,8 @@ Created on 19.09.2011
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin, GroupAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
# from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.utils.translation import ugettext as _
from imagekit.admin import AdminThumbnail
from membership.models import Membership, ActivationRequest
@@ -30,10 +29,12 @@ def cleanup_activation(modeladmin, request, queryset):
activation.user.delete()
cleanup_activation.short_description = _("Cleanup selected Activation Requests")
cleanup_activation.short_description = _(
"Cleanup selected Activation Requests")
class ProxyGroup(Group):
class Meta:
proxy = True
verbose_name = _('Group')
@@ -41,10 +42,10 @@ class ProxyGroup(Group):
class MembershipAdmin(UserAdmin):
admin_thumbnail = AdminThumbnail(image_field='thumbnail')
# admin_thumbnail = AdminThumbnail(image_field='thumbnail')
list_filter = ('membership', 'confirmed')
list_display = (
'admin_thumbnail',
'avatar',
'username',
'first_name',
'last_name',
@@ -55,11 +56,11 @@ class MembershipAdmin(UserAdmin):
list_editable = ('confirmed', 'paid_until',)
list_display_links = ('username',)
fieldsets = (
(None, {'fields': (('username', 'password'), 'gender',
(None, {'fields': (('username', 'password'), 'gender', 'avatar',
('first_name', 'last_name'), ('email', 'website'))}),
(_('Membership'), {'classes': ('collapse',),
'fields': (('membership', 'confirmed'), 'birthday', 'telephone',
'street_name', ('post_code', 'city'))}),
'street_name', ('post_code', 'city'))}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
'groups', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),

View File

@@ -23,33 +23,32 @@ class MembershipForm(forms.ModelForm):
fields = (
'username', 'gender', 'first_name', 'last_name', 'email', 'avatar',
'website', 'membership', 'birthday', 'telephone', 'street_name',
'post_code', 'city', 'comment'
'post_code', 'city'
)
def clean_birthday(self):
if self.cleaned_data['membership'] and not self.cleaned_data[
'birthday']:
if self.cleaned_data['membership'] and not self.cleaned_data['birthday']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['birthday']
def clean_telephone(self):
if self.cleaned_data['membership'] and not self.cleaned_data[
'telephone']:
'telephone']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['telephone']
def clean_street_name(self):
if self.cleaned_data['membership'] and not self.cleaned_data[
'street_name']:
'street_name']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['street_name']
def clean_post_code(self):
if self.cleaned_data['membership'] and not self.cleaned_data[
'post_code']:
'post_code']:
raise forms.ValidationError(_('For your membership, we need this. \
Please fill out this field yet.'))
return self.cleaned_data['post_code']
@@ -145,6 +144,7 @@ class RegistrationForm(forms.ModelForm):
user.is_active = False
if commit:
user.save()
activation = models.ActivationRequest.objects.create_pending_registration(user) # @IgnorePep8
activation = models.ActivationRequest.objects.create_pending_registration(
user) # @IgnorePep8
self.send_email(activation)
return user

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: kasu.membership\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-16 11:34+0200\n"
"PO-Revision-Date: 2015-08-16 11:37+0200\n"
"PO-Revision-Date: 2015-09-03 18:31+0200\n"
"Last-Translator: Christian Berg <xeniac.at@gmail.com>\n"
"Language-Team: Kasu <verein@kasu.at>\n"
"Language: de\n"
@@ -356,10 +356,10 @@ msgid ""
" confirm your email address, otherwise your can't login.\n"
" "
msgstr ""
"<p>Nach dem du deine Daten eingegeben hast, wirst du eine E-Mail zur "
"Bestätigung bekommen.</p>\n"
"<p>Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann "
"ist die Anmeldung möglich.</p>"
"Nach dem du deine Daten eingegeben hast, wirst du eine E-Mail zur "
"Bestätigung bekommen.\n"
"Bitte klicke auf den Link in dieser E-Mail zur Verifizierung, erst dann ist "
"die Anmeldung möglich."
#: templates/membership/register_form.html:30
msgid "reset"

View File

@@ -11,4 +11,3 @@ class Command(BaseCommand):
def handle(self, *args, **options):
for activation in ActivationRequest.objects.expired():
activation.user.delete()

View File

@@ -20,33 +20,57 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Membership',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('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, verbose_name='first name', blank=True)),
('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
('email', models.EmailField(max_length=254, verbose_name='email address', blank=True)),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('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')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('gender', models.CharField(max_length=1, verbose_name='Geschlecht', choices=[(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')])),
('id', models.AutoField(verbose_name='ID',
serialize=False, auto_created=True, primary_key=True)),
('password', models.CharField(
max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(
null=True, verbose_name='last login', blank=True)),
('is_superuser', models.BooleanField(default=False,
help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('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,
verbose_name='first name', blank=True)),
('last_name', models.CharField(max_length=30,
verbose_name='last name', blank=True)),
('email', models.EmailField(max_length=254,
verbose_name='email address', blank=True)),
('is_staff', models.BooleanField(default=False,
help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('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')),
('date_joined', models.DateTimeField(
default=django.utils.timezone.now, verbose_name='date joined')),
('gender', models.CharField(max_length=1, verbose_name='Geschlecht', choices=[
(b'm', 'M\xe4nnlich'), (b'f', 'Weiblich')])),
('website', models.URLField(blank=True)),
('avatar', models.ImageField(storage=utils.OverwriteStorage(), null=True, upload_to=membership.models.get_upload_path, blank=True)),
('membership', models.BooleanField(default=False, help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', verbose_name='Mitgliedschaft')),
('birthday', models.DateField(null=True, verbose_name='Geburtstag', blank=True)),
('telephone', models.CharField(max_length=30, null=True, verbose_name='Telefon', blank=True)),
('street_name', models.CharField(max_length=75, null=True, verbose_name='Adresse', blank=True)),
('post_code', models.PositiveSmallIntegerField(null=True, verbose_name='Postleitzahl', blank=True)),
('city', models.CharField(max_length=75, null=True, verbose_name='Ort', blank=True)),
('deposit', models.PositiveSmallIntegerField(default=0, editable=False)),
('avatar', models.ImageField(storage=utils.OverwriteStorage(
), null=True, upload_to=membership.models.get_upload_path, blank=True)),
('membership', models.BooleanField(default=False,
help_text='Ja, ich bin mit den Statuen einverstanden und m\xf6chte Mitglied werden.', verbose_name='Mitgliedschaft')),
('birthday', models.DateField(null=True,
verbose_name='Geburtstag', blank=True)),
('telephone', models.CharField(max_length=30,
null=True, verbose_name='Telefon', blank=True)),
('street_name', models.CharField(max_length=75,
null=True, verbose_name='Adresse', blank=True)),
('post_code', models.PositiveSmallIntegerField(
null=True, verbose_name='Postleitzahl', blank=True)),
('city', models.CharField(max_length=75,
null=True, verbose_name='Ort', blank=True)),
('deposit', models.PositiveSmallIntegerField(
default=0, editable=False)),
('registration_date', models.DateField(auto_now_add=True)),
('paid_until', models.DateField(null=True, verbose_name='Bezahlt bis', blank=True)),
('confirmed', models.BooleanField(default=False, help_text='Diese Person hat ihre Mitgliedschaft bezahlt', verbose_name='Best\xe4tigt')),
('paid_until', models.DateField(null=True,
verbose_name='Bezahlt bis', blank=True)),
('confirmed', models.BooleanField(default=False,
help_text='Diese Person hat ihre Mitgliedschaft bezahlt', verbose_name='Best\xe4tigt')),
('comment', models.TextField(blank=True)),
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', 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.', 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')),
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', 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.', 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={
'ordering': ('last_name', 'first_name'),
@@ -61,9 +85,12 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='ActivationRequest',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('activation_key', models.CharField(max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
('user', models.OneToOneField(verbose_name='Benutzer', to=settings.AUTH_USER_MODEL)),
('id', models.AutoField(verbose_name='ID',
serialize=False, auto_created=True, primary_key=True)),
('activation_key', models.CharField(
max_length=40, verbose_name='Aktivierungsschl\xfcssel')),
('user', models.OneToOneField(
verbose_name='Benutzer', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Ausstehende Aktivierung',

View File

@@ -13,6 +13,7 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='membership',
options={'ordering': ('username',), 'verbose_name': 'Mitgliedschaft', 'verbose_name_plural': 'Mitgliedschaften'},
options={'ordering': ('username',), 'verbose_name': 'Mitgliedschaft',
'verbose_name_plural': 'Mitgliedschaften'},
),
]

View File

@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('membership', '0003_auto_20150820_2122'),
]
operations = [
migrations.RemoveField(
model_name='membership',
name='comment',
),
]

View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import membership.models
import utils
import easy_thumbnails.fields
class Migration(migrations.Migration):
dependencies = [
('membership', '0004_remove_membership_comment'),
]
operations = [
migrations.AlterField(
model_name='membership',
name='avatar',
field=easy_thumbnails.fields.ThumbnailerImageField(storage=utils.OverwriteStorage(
), null=True, upload_to=membership.models.get_upload_path, blank=True),
),
]

View File

@@ -11,10 +11,8 @@ from django.contrib.auth.models import AbstractUser
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.translation import ugettext as _
from imagekit.models import ImageSpecField
from imagekit.processors import SmartResize
from . import PAID_MEMBERSHIP_GROUP
from easy_thumbnails.fields import ThumbnailerImageField
from utils import OverwriteStorage
@@ -152,7 +150,7 @@ class Membership(AbstractUser):
# last_name = models.CharField(_("Last Name"), max_length=30)
# email = models.EmailField(_('Email'), unique=True)
website = models.URLField(blank=True)
avatar = models.ImageField(
avatar = ThumbnailerImageField(
upload_to=get_upload_path,
storage=OverwriteStorage(),
blank=True,
@@ -201,21 +199,9 @@ class Membership(AbstractUser):
default=False,
help_text=_('This person has paid the membership fee.')
)
comment = models.TextField(blank=True)
# comment = models.TextField(blank=True)
# objects = MembershipManager()
thumbnail = ImageSpecField(
format='JPEG',
source='avatar',
processors=[SmartResize(width=60, height=60)],
)
profile = ImageSpecField(
processors=[SmartResize(width=140, height=140)],
format='PNG',
source='avatar',
)
class Meta(object):
ordering = ('username', )
swappable = 'AUTH_USER_MODEL'

View File

@@ -21,4 +21,4 @@ class Thumbnail(ImageSpec):
class Profile(ImageSpec):
pre_cache = False
processors = (ResizeProfile,)
processors = (ResizeProfile,)

View File

@@ -7,7 +7,7 @@
{% block maincontent %}
<h2 class="grid_12">Aktivierung fehlgeschlagen</h2>
<p class="grid_12">Leider war die Aktivierung des Schlüssels &ldquo;{{ activation_key }}&rdquo; war nicht erfolgreich, dies könnte mehrere Gründe haben:</p>
<p class="grid_12">Leider war die Aktivierung des Schlüssels &ldquo;{{ activation_key }}&rdquo; nicht erfolgreich, dies könnte mehrere Gründe haben:</p>
<img class="grid_4" src="" alt="" />
<ul class="grid_8">
<li><strong>Der Aktivierungs Link ist nicht korrekt.</strong> Bitte kopiere die ganze Zeile aus der E-Mail in die Adressleiste.</li>

View File

@@ -1,5 +1,5 @@
{% extends "base.html" %}
{% load i18n comments %}
{% load i18n comments thumbnail %}
{% block title %}{{ membership.first_name }} {{membership.last_name}}{% endblock %}
@@ -16,8 +16,8 @@
{% endblock %}
{% block maincontent %}
{% if membership.profile %}
<img class="grid_3" src="{{membership.profile.url}}" alt="{% trans 'Profile Image' %}"/>
{% if membership.avatar %}
<img class="grid_3" src="{% thumbnail membership.avatar '220x220' crop='smart' %}" alt="{% trans 'Profile Image' %}"/>
{% else %}
<div class="grid_3"> Noch kein Foto hoch geladen</div>
{% endif %}

View File

@@ -21,6 +21,8 @@ urlpatterns = patterns(
url(r'^activation_sent/$',
views.ActivationSent.as_view(),
name="membership-registration-complete"),
url(r'^(?P<username>[\-\.\d\w]+)/$', views.MembershipDetail.as_view(), name='membership-details'),
url(r'^(?P<username>[\-\.\d\w]+)/edit/$', views.EditMembership.as_view(), name="membership-edit")
)
url(r'^(?P<username>[\-\.\d\w]+)/$',
views.MembershipDetail.as_view(), name='membership-details'),
url(r'^(?P<username>[\-\.\d\w]+)/edit/$',
views.EditMembership.as_view(), name="membership-edit")
)

View File

@@ -49,7 +49,7 @@ class ActivateRegistration(generic.DetailView):
def login(self, user):
backend = auth.get_backends()[0]
user.backend = "%s.%s" % (
backend.__module__, backend.__class__.__name__) # @IgnorePep8
backend.__module__, backend.__class__.__name__) # @IgnorePep8
auth.login(self.request, user)
messages.success(self.request, _('Activation successful. \
You can now login anytime with you username and password.'))