From 675688d5df13aa7c4c26e0769df46c29b6fa8d30 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sat, 27 Sep 2014 12:36:56 +0200 Subject: [PATCH] Basic item settings --- src/locale/de/LC_MESSAGES/django.po | 113 ++++++++++++++---- src/tixlbase/models.py | 17 ++- .../templates/tixlcontrol/event/base.html | 1 + .../templates/tixlcontrol/item/base.html | 11 ++ .../templates/tixlcontrol/item/index.html | 39 ++++++ .../templates/tixlcontrol/items/base.html | 12 ++ .../templates/tixlcontrol/items/index.html | 20 ++++ src/tixlcontrol/urls.py | 10 +- src/tixlcontrol/views/item.py | 78 ++++++++++++ 9 files changed, 271 insertions(+), 30 deletions(-) create mode 100644 src/tixlcontrol/templates/tixlcontrol/item/base.html create mode 100644 src/tixlcontrol/templates/tixlcontrol/item/index.html create mode 100644 src/tixlcontrol/templates/tixlcontrol/items/base.html create mode 100644 src/tixlcontrol/templates/tixlcontrol/items/index.html create mode 100644 src/tixlcontrol/views/item.py diff --git a/src/locale/de/LC_MESSAGES/django.po b/src/locale/de/LC_MESSAGES/django.po index f03e9b198..2a239fcbe 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-16 22:52+0200\n" +"POT-Creation-Date: 2014-09-27 12:36+0200\n" "PO-Revision-Date: 2014-09-11 11:05+200\n" "Last-Translator: Raphael Michel \n" "Language-Team: Raphael Michel \n" @@ -26,31 +26,31 @@ msgstr "Deutsch" msgid "English" msgstr "Englisch" -#: tixlbase/admin.py:18 +#: tixlbase/admin.py:19 msgid "The two password fields didn't match." msgstr "Die beiden eingegebenen Passwörter stimmen nicht überein." -#: tixlbase/admin.py:20 tixlcontrol/views/auth.py:16 +#: tixlbase/admin.py:21 tixlcontrol/views/auth.py:16 msgid "Password" msgstr "Passwort" -#: tixlbase/admin.py:22 +#: tixlbase/admin.py:23 msgid "Password confirmation" msgstr "Passwort bestätigen" -#: tixlbase/admin.py:24 +#: tixlbase/admin.py:25 msgid "Enter the same password as above, for verification." msgstr "Geben Sie zur Bestätigung das selbe Passwort wie oben ein" -#: tixlbase/admin.py:52 +#: tixlbase/admin.py:53 msgid "Personal info" msgstr "Persönliche Daten" -#: tixlbase/admin.py:53 +#: tixlbase/admin.py:54 msgid "Locale" msgstr "Sprache" -#: tixlbase/admin.py:54 +#: tixlbase/admin.py:55 msgid "Permissions" msgstr "Berechtigungen" @@ -111,7 +111,7 @@ msgstr "Veranstalter" msgid "Can create events" msgstr "Kann Veranstaltungen erstellen" -#: tixlbase/models.py:178 tixlbase/models.py:314 +#: tixlbase/models.py:178 tixlbase/models.py:318 #, python-format msgid "%(name)s on %(object)s" msgstr "%(name)s für %(object)s" @@ -219,7 +219,7 @@ msgstr "" "Das Datum, bis zu dem Zahlungseingänge akzeptiert werden. Diese Einstellung " "hat Vorrang über der oben eingestellten Anzahl an Tagen" -#: tixlbase/models.py:294 +#: tixlbase/models.py:294 tixlbase/models.py:409 msgid "Event" msgstr "Veranstaltung" @@ -233,55 +233,99 @@ msgstr "Veranstaltungen" msgid "Can change event settings" msgstr "Kann Veranstaltungseinstellungen ändern" -#: tixlbase/models.py:320 +#: tixlbase/models.py:314 +msgid "Can change item settings" +msgstr "Kann Produkte ändern" + +#: tixlbase/models.py:324 msgid "Event permission" msgstr "Veranstaltungs-Berechtigung" -#: tixlbase/models.py:321 +#: tixlbase/models.py:325 msgid "Event permissions" msgstr "Veranstaltungs-Berechtigungen" -#: tixlbase/models.py:333 +#: tixlbase/models.py:337 msgid "Category name" msgstr "Bezeichnung" -#: tixlbase/models.py:343 +#: tixlbase/models.py:347 msgid "Item category" msgstr "Produktkategorie" -#: tixlbase/models.py:344 +#: tixlbase/models.py:348 msgid "Item categories" msgstr "Produktkategorien" -#: tixlbase/models.py:361 +#: tixlbase/models.py:362 +msgid "Property name" +msgstr "Bezeichnung" + +#: tixlbase/models.py:369 +msgid "Item property" +msgstr "Eigenschaft" + +#: tixlbase/models.py:370 +msgid "Item properties" +msgstr "Eigenschaften" + +#: tixlbase/models.py:386 +msgid "Value" +msgstr "" + +#: tixlbase/models.py:416 +msgid "Category" +msgstr "Kategorie" + +#: tixlbase/models.py:420 tixlcontrol/templates/tixlcontrol/items/index.html:9 msgid "Item name" msgstr "Produktbezeichnung" -#: tixlbase/models.py:366 +#: tixlbase/models.py:424 +msgid "Active" +msgstr "aktiviert" + +#: tixlbase/models.py:428 msgid "Short description" msgstr "Kurze Beschreibung" -#: tixlbase/models.py:367 +#: tixlbase/models.py:429 msgid "This is shown below the item name in lists." msgstr "Wird in Listen unter dem Name angezeigt." -#: tixlbase/models.py:371 +#: tixlbase/models.py:433 msgid "Long description" msgstr "Lange Beschreibung" -#: tixlbase/models.py:376 +#: tixlbase/models.py:438 tixlbase/models.py:503 msgid "Default price" msgstr "Basispreis" -#: tixlbase/models.py:381 -msgid "Included taxes in percent" +#: tixlbase/models.py:443 +msgid "Taxes included in percent" msgstr "Steuern inklusive in Prozent" -#: tixlbase/models.py:394 +#: tixlbase/models.py:449 tixlcontrol/templates/tixlcontrol/items/base.html:8 +msgid "Properties" +msgstr "Eigenschaften" + +#: tixlbase/models.py:451 +msgid "" +"The selected properties will be available for the user to select. After " +"saving this field, move to the 'Variations' tab to configure the details." +msgstr "" +"Die hier ausgewählten Eigenschaften stehen für dieses Produkt zur Verfügung. " +"Nach der Auswahl können Sie im Tab 'Varianten' die Details konfigurieren:" + +#: tixlbase/models.py:466 tixlcontrol/templates/tixlcontrol/item/base.html:3 msgid "Item" msgstr "Produkt" -#: tixlbase/models.py:395 +#: tixlbase/models.py:467 tixlcontrol/templates/tixlcontrol/event/base.html:20 +#: tixlcontrol/templates/tixlcontrol/items/base.html:3 +#: tixlcontrol/templates/tixlcontrol/items/base.html:6 +#: tixlcontrol/templates/tixlcontrol/items/index.html:3 +#: tixlcontrol/templates/tixlcontrol/items/index.html:5 msgid "Items" msgstr "Produkte" @@ -329,10 +373,14 @@ msgid "Settings" msgstr "Einstellungen" #: tixlcontrol/templates/tixlcontrol/event/settings.html:9 +#: tixlcontrol/templates/tixlcontrol/item/index.html:9 msgid "Your changes have been saved." msgstr "Die Änderungen wurden gespeichert." #: tixlcontrol/templates/tixlcontrol/event/settings.html:15 +#: tixlcontrol/templates/tixlcontrol/item/base.html:7 +#: tixlcontrol/templates/tixlcontrol/item/index.html:5 +#: tixlcontrol/templates/tixlcontrol/item/index.html:15 msgid "General information" msgstr "Allgemeine Informationen" @@ -349,6 +397,7 @@ msgid "Payment settings" msgstr "Zahlungseinstellungen" #: tixlcontrol/templates/tixlcontrol/event/settings.html:42 +#: tixlcontrol/templates/tixlcontrol/item/index.html:34 msgid "Save" msgstr "Speichern" @@ -373,6 +422,22 @@ msgstr "Beginn" msgid "End date" msgstr "Ende" +#: tixlcontrol/templates/tixlcontrol/item/base.html:5 +msgid "Modify item:" +msgstr "" + +#: tixlcontrol/templates/tixlcontrol/item/index.html:23 +msgid "Price settings" +msgstr "Preis" + +#: tixlcontrol/templates/tixlcontrol/item/index.html:28 +msgid "Variations" +msgstr "Varianten" + +#: tixlcontrol/templates/tixlcontrol/items/base.html:7 +msgid "Categories" +msgstr "Kategorien" + #: tixlcontrol/views/auth.py:15 msgid "E-mail address" msgstr "E-Mail-Adresse" diff --git a/src/tixlbase/models.py b/src/tixlbase/models.py index 1b2d614fc..7fc89b948 100644 --- a/src/tixlbase/models.py +++ b/src/tixlbase/models.py @@ -406,18 +406,23 @@ class Item(models.Model): Event, on_delete=models.PROTECT, related_name="items", + verbose_name=_("Event"), ) category = models.ForeignKey( ItemCategory, on_delete=models.PROTECT, related_name="items", - blank=True, null=True + blank=True, null=True, + verbose_name=_("Category"), ) name = models.CharField( max_length=255, verbose_name=_("Item name") ) - active = models.BooleanField(default=True) + active = models.BooleanField( + default=True, + verbose_name=_("Active"), + ) deleted = models.BooleanField(default=False) short_description = models.TextField( verbose_name=_("Short description"), @@ -435,12 +440,18 @@ class Item(models.Model): ) tax_rate = models.DecimalField( null=True, blank=True, - verbose_name=_("Included taxes in percent"), + verbose_name=_("Taxes included in percent"), max_digits=7, decimal_places=2 ) properties = models.ManyToManyField( Property, related_name='items', + verbose_name=_("Properties"), + help_text=_( + 'The selected properties will be available for the user ' + + 'to select. After saving this field, move to the ' + + '\'Variations\' tab to configure the details.' + ) ) def __str__(self): diff --git a/src/tixlcontrol/templates/tixlcontrol/event/base.html b/src/tixlcontrol/templates/tixlcontrol/event/base.html index 9c359455d..dce9aff9a 100644 --- a/src/tixlcontrol/templates/tixlcontrol/event/base.html +++ b/src/tixlcontrol/templates/tixlcontrol/event/base.html @@ -17,4 +17,5 @@
  • {% trans "Dashboard" %}
  • {% trans "Settings" %}
  • +
  • {% trans "Items" %}
  • {% endblock %} diff --git a/src/tixlcontrol/templates/tixlcontrol/item/base.html b/src/tixlcontrol/templates/tixlcontrol/item/base.html new file mode 100644 index 000000000..e618edf25 --- /dev/null +++ b/src/tixlcontrol/templates/tixlcontrol/item/base.html @@ -0,0 +1,11 @@ +{% extends "tixlcontrol/event/base.html" %} +{% load i18n %} +{% block title %}{{ item.name }} :: {% trans "Item" %}{% endblock %} +{% block content %} +

    {% trans "Modify item:" %} {{ item.name }}

    + + {% block inside %} + {% endblock %} +{% endblock %} diff --git a/src/tixlcontrol/templates/tixlcontrol/item/index.html b/src/tixlcontrol/templates/tixlcontrol/item/index.html new file mode 100644 index 000000000..c26d7bddc --- /dev/null +++ b/src/tixlcontrol/templates/tixlcontrol/item/index.html @@ -0,0 +1,39 @@ +{% extends "tixlcontrol/item/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block inside %} +

    {% trans "General information" %}

    + + {% if "success" in request.GET %} +
    + {% trans "Your changes have been saved." %} +
    + {% endif %} +
    + {% csrf_token %} +
    + {% trans "General information" %} + {% bootstrap_field form.name layout="horizontal" %} + {% bootstrap_field form.active layout="horizontal" %} + {% bootstrap_field form.category layout="horizontal" %} + {% bootstrap_field form.short_description layout="horizontal" %} + {% bootstrap_field form.long_description layout="horizontal" %} +
    +
    + {% trans "Price settings" %} + {% bootstrap_field form.default_price layout="horizontal" %} + {% bootstrap_field form.tax_rate layout="horizontal" %} +
    +
    + {% trans "Variations" %} + {% bootstrap_field form.properties layout="horizontal" %} +
    +
    +
    + +
    +
    +
    +{% endblock %} diff --git a/src/tixlcontrol/templates/tixlcontrol/items/base.html b/src/tixlcontrol/templates/tixlcontrol/items/base.html new file mode 100644 index 000000000..2c77ae621 --- /dev/null +++ b/src/tixlcontrol/templates/tixlcontrol/items/base.html @@ -0,0 +1,12 @@ +{% extends "tixlcontrol/event/base.html" %} +{% load i18n %} +{% block title %}{% trans "Items" %}{% endblock %} +{% block content %} + + {% block inside %} + {% endblock %} +{% endblock %} diff --git a/src/tixlcontrol/templates/tixlcontrol/items/index.html b/src/tixlcontrol/templates/tixlcontrol/items/index.html new file mode 100644 index 000000000..d4994706d --- /dev/null +++ b/src/tixlcontrol/templates/tixlcontrol/items/index.html @@ -0,0 +1,20 @@ +{% extends "tixlcontrol/items/base.html" %} +{% load i18n %} +{% block title %}{% trans "Items" %}{% endblock %} +{% block inside %} +

    {% trans "Items" %}

    + + + + + + + + {% for i in items %} + + + + {% endfor %} + +
    {% trans "Item name" %}
    {{ i.name }}
    +{% endblock %} diff --git a/src/tixlcontrol/urls.py b/src/tixlcontrol/urls.py index 5224b59a5..7f68a9e76 100644 --- a/src/tixlcontrol/urls.py +++ b/src/tixlcontrol/urls.py @@ -1,5 +1,5 @@ from django.conf.urls import patterns, url, include -from tixlcontrol.views import main, event +from tixlcontrol.views import main, event, item urlpatterns = patterns('',) urlpatterns += patterns( @@ -16,9 +16,13 @@ urlpatterns += patterns( 'tixlcontrol.views.event', url(r'^event/(?P[^/]+)/(?P[^/]+)/', include( patterns( - 'tixlcontrol.views.event', - url(r'^$', 'index', name='event.index'), + 'tixlcontrol.views', + url(r'^$', 'event.index', name='event.index'), url(r'^settings$', event.EventUpdate.as_view(), name='event.settings'), + url(r'^items$', item.ItemList.as_view(), name='event.items'), + url(r'^items/(?P\d+)/$', item.ItemUpdateGeneral.as_view(), name='event.item'), + url(r'^categories$', item.CategoryList.as_view(), name='event.items.categories'), + url(r'^properties$', item.PropertyList.as_view(), name='event.items.properties'), ) )) ) diff --git a/src/tixlcontrol/views/item.py b/src/tixlcontrol/views/item.py new file mode 100644 index 000000000..2274462ac --- /dev/null +++ b/src/tixlcontrol/views/item.py @@ -0,0 +1,78 @@ +from django.views.generic import ListView +from django.views.generic.edit import UpdateView +from django.core.urlresolvers import resolve, reverse +from django import forms + +from tixlbase.models import Item, ItemCategory, Property +from tixlcontrol.permissions import EventPermissionRequiredMixin + + +class ItemList(ListView): + model = Item + context_object_name = 'items' + template_name = 'tixlcontrol/items/index.html' + + def get_queryset(self): + return Item.objects.filter( + event=self.request.event + ) + + +class CategoryList(ListView): + model = ItemCategory + context_object_name = 'items' + template_name = 'tixlcontrol/items/index.html' + + def get_queryset(self): + return ItemCategory.objects.filter( + event=self.request.event + ) + + +class PropertyList(ListView): + model = Property + context_object_name = 'items' + template_name = 'tixlcontrol/items/index.html' + + def get_queryset(self): + return Property.objects.filter( + event=self.request.event + ) + + +class ItemUpdateFormGeneral(forms.ModelForm): + + class Meta: + model = Item + localized_fields = '__all__' + fields = [ + 'category', + 'name', + 'active', + 'short_description', + 'long_description', + 'default_price', + 'tax_rate', + 'properties', + ] + + +class ItemUpdateGeneral(EventPermissionRequiredMixin, UpdateView): + model = Item + form_class = ItemUpdateFormGeneral + template_name = 'tixlcontrol/item/index.html' + permission = 'can_change_items' + context_object_name = 'item' + + def get_object(self, queryset=None): + url = resolve(self.request.path_info) + return self.request.event.items.get( + id=url.kwargs['item'] + ) + + def get_success_url(self): + return reverse('control:event.item', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + 'item': self.get_object().pk, + }) + '?success=true'