diff --git a/src/pretix/base/migrations/0005_item_picture.py b/src/pretix/base/migrations/0005_item_picture.py new file mode 100644 index 000000000..dbb7a4480 --- /dev/null +++ b/src/pretix/base/migrations/0005_item_picture.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0004_eventpermission_can_change_permissions'), + ] + + operations = [ + migrations.AddField( + model_name='item', + name='picture', + field=models.ImageField(upload_to='', null=True, verbose_name='Product picture', blank=True), + ), + ] diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 0d435792a..bbe54818c 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -875,6 +875,14 @@ class Item(Versionable): position = models.IntegerField( default=0 ) + picture = models.ImageField( + verbose_name=_("Product picture"), + null=True, blank=True, + upload_to=lambda instance, filename: '%s/%s/item-%s.%s' % ( + instance.event.organizer.slug, instance.event.slug, instance.identity, + filename.split('.')[-1] + ) + ) class Meta: verbose_name = _("Product") diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 900372bed..07a9e4a5c 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -128,6 +128,7 @@ class ItemFormGeneral(VersionedModelForm): 'admission', 'short_description', 'long_description', + 'picture', 'default_price', 'tax_rate', 'properties', diff --git a/src/pretix/control/templates/pretixcontrol/item/index.html b/src/pretix/control/templates/pretixcontrol/item/index.html index 4657830fa..b043f8a35 100644 --- a/src/pretix/control/templates/pretixcontrol/item/index.html +++ b/src/pretix/control/templates/pretixcontrol/item/index.html @@ -2,7 +2,7 @@ {% load i18n %} {% load bootstrap3 %} {% block inside %} -
+ {% csrf_token %}
{% trans "General information" %} @@ -12,6 +12,7 @@ {% bootstrap_field form.admission layout="horizontal" %} {% bootstrap_field form.short_description layout="horizontal" %} {% bootstrap_field form.long_description layout="horizontal" %} + {% bootstrap_field form.picture layout="horizontal" %}
{% trans "Price settings" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index 9dda8f53e..a1364617a 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -1,5 +1,6 @@ {% extends "pretixpresale/event/base.html" %} {% load i18n %} +{% load thumbnail %} {% block title %}{% trans "Presale" %}{% endblock %} {% block content %} @@ -60,6 +61,11 @@
+ {% if item.picture %} + {{ item.name }} + {% endif %} {{ item.name }} diff --git a/src/pretix/settings.py b/src/pretix/settings.py index a6fbb4037..2f6ab491c 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -137,6 +137,7 @@ INSTALLED_APPS = ( 'pretix.plugins.paypal', 'pretix.plugins.ticketoutputpdf', 'pretix.plugins.sendmail', + 'easy_thumbnails', ) MIDDLEWARE_CLASSES = ( @@ -247,6 +248,12 @@ MESSAGE_TAGS = { messages.SUCCESS: 'alert-success', } +THUMBNAIL_ALIASES = { + '': { + 'productlist': {'size': (60, 60), 'crop': True}, + }, +} + loglevel = 'DEBUG' if DEBUG else 'INFO' LOGGING = { diff --git a/src/requirements/production.txt b/src/requirements/production.txt index 4d569a85d..fcc59d773 100644 --- a/src/requirements/production.txt +++ b/src/requirements/production.txt @@ -9,6 +9,7 @@ django-bootstrap3>=6.1,<6.2 django-compressor>=1.5,<2.0 reportlab>=3.1.44,<3.2 -e git+https://github.com/pretix/PyPDF2.git@pretix#egg=PyPDF2 +easy-thumbnails>=2.2,<3 # Deployment / static file compilation requirements BeautifulSoup4 diff --git a/src/static/pretixpresale/less/event.less b/src/static/pretixpresale/less/event.less index 3973e07bf..4e8ae7254 100644 --- a/src/static/pretixpresale/less/event.less +++ b/src/static/pretixpresale/less/event.less @@ -20,6 +20,11 @@ color: @alert-warning-text; } } + + .productpicture { + float: left; + margin-right: 10px; + } } .item-with-variations .product-row.headline, .product-row.simple { border-top: 2px solid @table-border-color;