diff --git a/src/pretix/base/exporter.py b/src/pretix/base/exporter.py index 0654d7f08f..49439007d4 100644 --- a/src/pretix/base/exporter.py +++ b/src/pretix/base/exporter.py @@ -131,6 +131,7 @@ class JSONExporter(BaseExporter): 'variation': position.variation_id, 'price': position.price, 'attendee_name': position.attendee_name, + 'secret': position.secret, 'answers': [ { 'question': answer.question_id, diff --git a/src/pretix/base/migrations/0010_orderposition_secret.py b/src/pretix/base/migrations/0010_orderposition_secret.py new file mode 100644 index 0000000000..e9f2da8707 --- /dev/null +++ b/src/pretix/base/migrations/0010_orderposition_secret.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-03-03 17:13 +from __future__ import unicode_literals + +from django.db import migrations, models + +import pretix.base.models.orders + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0009_auto_20160222_2002'), + ] + + operations = [ + migrations.AddField( + model_name='orderposition', + name='secret', + field=models.CharField(default=pretix.base.models.orders.generate_position_secret, max_length=64), + ), + ] diff --git a/src/pretix/base/models/__init__.py b/src/pretix/base/models/__init__.py index 623016d7d3..7a0db98b34 100644 --- a/src/pretix/base/models/__init__.py +++ b/src/pretix/base/models/__init__.py @@ -7,7 +7,7 @@ from .items import ( from .log import LogEntry from .orders import ( AbstractPosition, CachedTicket, CartPosition, InvoiceAddress, Order, - OrderPosition, QuestionAnswer, generate_secret, + OrderPosition, QuestionAnswer, generate_position_secret, generate_secret, ) from .organizer import Organizer, OrganizerPermission, OrganizerSetting from .vouchers import Voucher @@ -17,5 +17,5 @@ __all__ = [ 'ItemCategory', 'Item', 'Property', 'PropertyValue', 'ItemVariation', 'VariationsField', 'Question', 'BaseRestriction', 'Quota', 'Order', 'CachedTicket', 'QuestionAnswer', 'AbstractPosition', 'OrderPosition', 'CartPosition', 'EventSetting', 'OrganizerSetting', 'EventLock', 'cachedfile_name', 'itempicture_upload_to', - 'generate_secret', 'Voucher', 'LogEntry', 'InvoiceAddress' + 'generate_secret', 'Voucher', 'LogEntry', 'InvoiceAddress', 'generate_position_secret' ] diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 991ea62aa8..35ab765986 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -19,6 +19,11 @@ def generate_secret(): return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(16)) +def generate_position_secret(): + # Exclude o,0,1,i,l to avoid confusion with bad fonts/printers + return ''.join(random.choice('abcdefghjkmnpqrstuvwxyz23456789') for _ in range(32)) + + class Order(LoggedModel): """ An order is created when a user clicks 'buy' on his cart. It holds @@ -371,6 +376,7 @@ class OrderPosition(AbstractPosition): max_digits=10, decimal_places=2, verbose_name=_('Tax value') ) + secret = models.CharField(max_length=64, default=generate_position_secret) class Meta: verbose_name = _("Order position") diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index 27cb913429..ca344aa89c 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -69,7 +69,7 @@ class PdfTicketOutput(BaseTicketOutput): qr_s = self.settings.get('qr_s', default=80, as_type=float) if qr_s: reqs = qr_s * units.mm - qrw = QrCodeWidget(op.id, barLevel='H') + qrw = QrCodeWidget(op.secret, barLevel='H') b = qrw.getBounds() w = b[2] - b[0] h = b[3] - b[1] @@ -84,7 +84,7 @@ class PdfTicketOutput(BaseTicketOutput): p.setFont("Helvetica", code_s) code_x = self.settings.get('code_x', default=15, as_type=float) code_y = self.settings.get('code_y', default=130, as_type=float) - p.drawString(code_x * units.mm, code_y * units.mm, op.id) + p.drawString(code_x * units.mm, code_y * units.mm, op.secret) p.showPage()