diff --git a/src/locale/de/LC_MESSAGES/django.po b/src/locale/de/LC_MESSAGES/django.po index d47c1daeb..f62d4bb16 100644 --- a/src/locale/de/LC_MESSAGES/django.po +++ b/src/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-09-11 21:09+0200\n" +"POT-Creation-Date: 2014-09-12 20:56+0200\n" "PO-Revision-Date: 2014-09-11 11:05+200\n" "Last-Translator: Raphael Michel \n" "Language-Team: Raphael Michel \n" @@ -26,71 +26,188 @@ msgstr "Deutsch" msgid "English" msgstr "Englisch" -#: tixlbase/admin.py:16 +#: tixlbase/admin.py:18 msgid "The two password fields didn't match." msgstr "Die beiden eingegebenen Passwörter stimmen nicht überein." -#: tixlbase/admin.py:18 tixlcontrol/views/auth.py:15 +#: tixlbase/admin.py:20 tixlcontrol/views/auth.py:16 msgid "Password" msgstr "Passwort" -#: tixlbase/admin.py:20 +#: tixlbase/admin.py:22 msgid "Password confirmation" msgstr "Passwort bestätigen" -#: tixlbase/admin.py:22 +#: tixlbase/admin.py:24 msgid "Enter the same password as above, for verification." msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein" -#: tixlbase/admin.py:50 +#: tixlbase/admin.py:52 msgid "Personal info" msgstr "Persönliche Daten" -#: tixlbase/admin.py:51 +#: tixlbase/admin.py:53 msgid "Permissions" msgstr "Berechtigungen" -#: tixlbase/models.py:65 +#: tixlbase/models.py:66 msgid "Letters, digits and @/./+/-/_ only." msgstr "Nur Buchstaben, Zahlen und @/./+/-/_" -#: tixlbase/models.py:71 +#: tixlbase/models.py:72 msgid "E-mail" msgstr "E-Mail" -#: tixlbase/models.py:74 +#: tixlbase/models.py:75 msgid "Given name" msgstr "Vorname" -#: tixlbase/models.py:77 +#: tixlbase/models.py:78 msgid "Family name" msgstr "Nachname" +#: tixlbase/models.py:80 +msgid "Is active" +msgstr "Ist aktiviert" + +#: tixlbase/models.py:84 +msgid "Date joined" +msgstr "Registrierungsdatum" + +#: tixlbase/models.py:126 +msgid "User" +msgstr "Benutzer" + +#: tixlbase/models.py:127 +msgid "Users" +msgstr "Benutzer" + +#: tixlbase/models.py:139 tixlbase/models.py:209 +msgid "Name" +msgstr "Name" + +#: tixlbase/models.py:142 tixlbase/models.py:211 +msgid "Slug" +msgstr "Kurzform" + +#: tixlbase/models.py:150 +msgid "Organizer" +msgstr "Veranstalter" + +#: tixlbase/models.py:151 +msgid "Organizers" +msgstr "Veranstalter" + +#: tixlbase/models.py:165 +msgid "Can create events" +msgstr "Kann Veranstaltungen erstellen" + +#: tixlbase/models.py:169 tixlbase/models.py:271 +#, python-format +msgid "%(name)s on %(object)s" +msgstr "%(name)s für %(object)s" + +#: tixlbase/models.py:175 +msgid "Organizer permission" +msgstr "Veranstalter-Berechtigung" + +#: tixlbase/models.py:176 +msgid "Organizer permissions" +msgstr "Veranstalter-Berechtigungen" + +#: tixlbase/models.py:216 +msgid "Default locale" +msgstr "Standardsprache" + +#: tixlbase/models.py:218 +msgid "Default currency" +msgstr "Standardwährung" + +#: tixlbase/models.py:219 +msgid "Event start time" +msgstr "Veranstaltungsbeginn" + +#: tixlbase/models.py:221 +msgid "Event end time" +msgstr "Veranstaltungsende" + +#: tixlbase/models.py:224 +msgid "Show event end date" +msgstr "Zeige Veranstaltungsende" + +#: tixlbase/models.py:228 +msgid "Show dates with time" +msgstr "Zeige Uhrzeiten" + +#: tixlbase/models.py:232 +msgid "End of presale" +msgstr "Ende des Vorverkaufs" + +#: tixlbase/models.py:236 +msgid "Start of presale" +msgstr "Beginn des Vorverkaufs" + +#: tixlbase/models.py:240 +msgid "Payment term in days" +msgstr "Zahlungsziel in Tagen" + +#: tixlbase/models.py:244 +msgid "Last date of payments" +msgstr "Datum des letzten möglichen Zahlungseingangs" + +#: tixlbase/models.py:251 +msgid "Event" +msgstr "Veranstaltung" + +#: tixlbase/models.py:252 tixlcontrol/templates/tixlcontrol/base.html:28 +#: tixlcontrol/templates/tixlcontrol/events/index.html:3 +msgid "Events" +msgstr "Veranstaltungen" + +#: tixlbase/models.py:267 +msgid "Can change event settings" +msgstr "Kann Veranstaltungseinstellungen ändern" + +#: tixlbase/models.py:277 +msgid "Event permission" +msgstr "Veranstaltungs-Berechtigungen" + +#: tixlbase/models.py:278 +#, fuzzy +#| msgid "Permissions" +msgid "Event permissions" +msgstr "Berechtigungen" + +#: tixlcontrol/templates/tixlcontrol/auth/base.html:18 +#, python-format +msgid "powered by tixl" +msgstr "powered by tixl" + #: tixlcontrol/templates/tixlcontrol/auth/login.html:12 msgid "Log in" msgstr "Anmelden" #: tixlcontrol/templates/tixlcontrol/base.html:17 msgid "Toggle navigation" -msgstr "" +msgstr "Navigation umschalten" -#: tixlcontrol/templates/tixlcontrol/base.html:26 +#: tixlcontrol/templates/tixlcontrol/base.html:27 msgid "Dashboard" msgstr "Übersicht" -#: tixlcontrol/templates/tixlcontrol/base.html:30 +#: tixlcontrol/templates/tixlcontrol/base.html:33 msgid "Log out" msgstr "Abmelden" -#: tixlcontrol/views/auth.py:14 +#: tixlcontrol/views/auth.py:15 msgid "E-mail address" msgstr "E-Mail-Adresse" -#: tixlcontrol/views/auth.py:19 +#: tixlcontrol/views/auth.py:20 msgid "Please enter a correct e-mail address and password." msgstr "" "Bitte geben Sie eine gültige Kombination aus E-Mail-Adresse und Passwort ein." -#: tixlcontrol/views/auth.py:20 +#: tixlcontrol/views/auth.py:21 msgid "This account is inactive." msgstr "Dieses Konto ist deaktiviert." diff --git a/src/tixlbase/admin.py b/src/tixlbase/admin.py index 2dc9d3772..d9e5fcae4 100644 --- a/src/tixlbase/admin.py +++ b/src/tixlbase/admin.py @@ -3,7 +3,9 @@ from django.contrib.auth.admin import UserAdmin from django.utils.translation import ugettext as _ from django import forms -from tixlbase.models import User +from tixlbase.models import ( + User, Organizer, OrganizerPermission, Event, EventPermission +) class TixlUserCreationForm(forms.ModelForm): @@ -57,4 +59,36 @@ class TixlUserAdmin(UserAdmin): list_filter = ('is_staff', 'is_active', 'groups') add_form = TixlUserCreationForm + +class OrganizerPermissionInline(admin.TabularInline): + + model = OrganizerPermission + extra = 2 + + +class OrganizerAdmin(admin.ModelAdmin): + + model = Organizer + inlines = [OrganizerPermissionInline] + list_display = ('name', 'slug') + search_fields = ('name', 'slug') + + +class EventPermissionInline(admin.TabularInline): + + model = EventPermission + extra = 2 + + +class EventAdmin(admin.ModelAdmin): + + model = Event + inlines = [EventPermissionInline] + list_display = ('name', 'slug', 'organizer', 'date_from') + search_fields = ('name', 'slug') + list_filter = ('date_from', 'locale', 'currency') + + admin.site.register(User, TixlUserAdmin) +admin.site.register(Organizer, OrganizerAdmin) +admin.site.register(Event, EventAdmin) diff --git a/src/tixlbase/migrations/0006_auto_20140912_1855.py b/src/tixlbase/migrations/0006_auto_20140912_1855.py new file mode 100644 index 000000000..8546e2fd7 --- /dev/null +++ b/src/tixlbase/migrations/0006_auto_20140912_1855.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tixlbase', '0005_auto_20140911_2052'), + ] + + operations = [ + migrations.AlterModelOptions( + name='event', + options={'verbose_name_plural': 'Events', 'verbose_name': 'Event', 'ordering': ('date_from', 'name')}, + ), + migrations.AlterModelOptions( + name='eventpermission', + options={'verbose_name_plural': 'Event permissions', 'verbose_name': 'Event permission'}, + ), + migrations.AlterModelOptions( + name='organizer', + options={'verbose_name_plural': 'Organizers', 'verbose_name': 'Organizer', 'ordering': ('name',)}, + ), + migrations.AlterModelOptions( + name='organizerpermission', + options={'verbose_name_plural': 'Organizer permissions', 'verbose_name': 'Organizer permission'}, + ), + migrations.AlterModelOptions( + name='user', + options={'verbose_name_plural': 'Users', 'verbose_name': 'User'}, + ), + migrations.RenameField( + model_name='eventpermission', + old_name='organizer', + new_name='event', + ), + migrations.AlterField( + model_name='event', + name='currency', + field=models.CharField(max_length=10, verbose_name='Default currency'), + ), + migrations.AlterField( + model_name='event', + name='date_from', + field=models.DateTimeField(verbose_name='Event start time'), + ), + migrations.AlterField( + model_name='event', + name='date_to', + field=models.DateTimeField(blank=True, null=True, verbose_name='Event end time'), + ), + migrations.AlterField( + model_name='event', + name='locale', + field=models.CharField(max_length=10, verbose_name='Default locale', choices=[('de', 'German'), ('en', 'English')]), + ), + migrations.AlterField( + model_name='event', + name='name', + field=models.CharField(max_length=200, verbose_name='Name'), + ), + migrations.AlterField( + model_name='event', + name='payment_term_days', + field=models.IntegerField(verbose_name='Payment term in days', default=14), + ), + migrations.AlterField( + model_name='event', + name='payment_term_last', + field=models.DateTimeField(blank=True, null=True, verbose_name='Last date of payments'), + ), + migrations.AlterField( + model_name='event', + name='presale_end', + field=models.DateTimeField(blank=True, null=True, verbose_name='End of presale'), + ), + migrations.AlterField( + model_name='event', + name='presale_start', + field=models.DateTimeField(blank=True, null=True, verbose_name='Start of presale'), + ), + migrations.AlterField( + model_name='event', + name='show_date_to', + field=models.BooleanField(verbose_name='Show event end date', default=True), + ), + migrations.AlterField( + model_name='event', + name='show_times', + field=models.BooleanField(verbose_name='Show dates with time', default=True), + ), + migrations.AlterField( + model_name='event', + name='slug', + field=models.CharField(db_index=True, max_length=50, verbose_name='Slug'), + ), + migrations.AlterField( + model_name='eventpermission', + name='can_change_settings', + field=models.BooleanField(verbose_name='Can change event settings', default=True), + ), + migrations.AlterField( + model_name='organizer', + name='name', + field=models.CharField(max_length=200, verbose_name='Name'), + ), + migrations.AlterField( + model_name='organizer', + name='slug', + field=models.CharField(db_index=True, max_length=50, verbose_name='Slug', unique=True), + ), + migrations.AlterField( + model_name='organizerpermission', + name='can_create_events', + field=models.BooleanField(verbose_name='Can create events', default=True), + ), + migrations.AlterField( + model_name='user', + name='date_joined', + field=models.DateTimeField(verbose_name='Date joined', auto_now_add=True), + ), + migrations.AlterField( + model_name='user', + name='is_active', + field=models.BooleanField(verbose_name='Is active', default=True), + ), + migrations.AlterField( + model_name='user', + name='is_staff', + field=models.BooleanField(verbose_name='Is site admin', default=False), + ), + migrations.AlterUniqueTogether( + name='eventpermission', + unique_together=set([('event', 'user')]), + ), + ] diff --git a/src/tixlbase/models.py b/src/tixlbase/models.py index e5f770ef7..eaad76577 100644 --- a/src/tixlbase/models.py +++ b/src/tixlbase/models.py @@ -1,6 +1,7 @@ from django.db import models +from django.conf import settings from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin -from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy as _ class UserManager(BaseUserManager): @@ -75,9 +76,12 @@ class User(AbstractBaseUser, PermissionsMixin): familyname = models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Family name')) - is_active = models.BooleanField(default=True) - is_staff = models.BooleanField(default=False) - date_joined = models.DateTimeField(auto_now_add=True) + is_active = models.BooleanField(default=True, + verbose_name=_('Is active')) + is_staff = models.BooleanField(default=False, + verbose_name=('Is site admin')) + date_joined = models.DateTimeField(auto_now_add=True, + verbose_name=_('Date joined')) objects = UserManager() @@ -119,6 +123,8 @@ class User(AbstractBaseUser, PermissionsMixin): REQUIRED_FIELDS = ['username'] class Meta: + verbose_name = _("User") + verbose_name_plural = _("Users") unique_together = (("event", "username"),) @@ -129,13 +135,20 @@ class Organizer(models.Model): all lowercase) being used in URLs. """ - name = models.CharField(max_length=200) + name = models.CharField(max_length=200, + verbose_name=_("Name")) slug = models.CharField(max_length=50, - unique=True, db_index=True) + unique=True, db_index=True, + verbose_name=_("Slug")) permitted = models.ManyToManyField(User, through='OrganizerPermission', related_name="organizers") + def __str__(self): + return self.name + class Meta: + verbose_name = _("Organizer") + verbose_name_plural = _("Organizers") ordering = ("name",) @@ -147,9 +160,20 @@ class OrganizerPermission(models.Model): organizer = models.ForeignKey(Organizer) user = models.ForeignKey(User, related_name="organizer_perms") - can_create_events = models.BooleanField(default=True) + can_create_events = models.BooleanField( + default=True, + verbose_name=_("Can create events"), + ) + + def __str__(self): + return _("%(name)s on %(object)s") % { + 'name': str(self.user), + 'object': str(self.organizer), + } class Meta: + verbose_name = _("Organizer permission") + verbose_name_plural = _("Organizer permissions") unique_together = (("organizer", "user"),) @@ -181,22 +205,51 @@ class Event(models.Model): organizer = models.ForeignKey(Organizer, related_name="events", on_delete=models.PROTECT) - name = models.CharField(max_length=200) - slug = models.CharField(max_length=50, db_index=True) + name = models.CharField(max_length=200, + verbose_name=_("Name")) + slug = models.CharField(max_length=50, db_index=True, + verbose_name=_("Slug")) permitted = models.ManyToManyField(User, through='EventPermission', - related_name="events") - locale = models.CharField(max_length=10) - currency = models.CharField(max_length=10) - date_from = models.DateTimeField() - date_to = models.DateTimeField(null=True, blank=True) - show_date_to = models.BooleanField(default=True) - show_times = models.BooleanField(default=True) - presale_end = models.DateTimeField(null=True, blank=True) - presale_start = models.DateTimeField(null=True, blank=True) - payment_term_days = models.IntegerField(default=14) - payment_term_last = models.DateTimeField(null=True, blank=True) + related_name="events",) + locale = models.CharField(max_length=10, + choices=settings.LANGUAGES, + verbose_name=_("Default locale")) + currency = models.CharField(max_length=10, + verbose_name=_("Default currency")) + date_from = models.DateTimeField(verbose_name=_("Event start time")) + date_to = models.DateTimeField(null=True, blank=True, + verbose_name=_("Event end time")) + show_date_to = models.BooleanField( + default=True, + verbose_name=_("Show event end date") + ) + show_times = models.BooleanField( + default=True, + verbose_name=_("Show dates with time") + ) + presale_end = models.DateTimeField( + null=True, blank=True, + verbose_name=_("End of presale") + ) + presale_start = models.DateTimeField( + null=True, blank=True, + verbose_name=_("Start of presale") + ) + payment_term_days = models.IntegerField( + default=14, + verbose_name=_("Payment term in days") + ) + payment_term_last = models.DateTimeField( + null=True, blank=True, + verbose_name=_("Last date of payments") + ) + + def __str__(self): + return self.name class Meta: + verbose_name = _("Event") + verbose_name_plural = _("Events") unique_together = (("organizer", "slug"),) ordering = ("date_from", "name") @@ -207,9 +260,20 @@ class EventPermission(models.Model): access an event. """ - organizer = models.ForeignKey(Event) + event = models.ForeignKey(Event) user = models.ForeignKey(User, related_name="event_perms") - can_change_settings = models.BooleanField(default=True) + can_change_settings = models.BooleanField( + default=True, + verbose_name=_("Can change event settings") + ) + + def __str__(self): + return _("%(name)s on %(object)s") % { + 'name': str(self.user), + 'object': str(self.event), + } class Meta: - unique_together = (("organizer", "user"),) + verbose_name = _("Event permission") + verbose_name_plural = _("Event permissions") + unique_together = (("event", "user"),) diff --git a/src/tixlbase/views.py b/src/tixlbase/views.py index 91ea44a21..e69de29bb 100644 --- a/src/tixlbase/views.py +++ b/src/tixlbase/views.py @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here.