Offer download options per position, not per order

This commit is contained in:
Raphael Michel
2016-11-02 14:51:05 +01:00
parent 3344c02c80
commit ad35110166
25 changed files with 630 additions and 703 deletions
+2 -132
View File
@@ -3,13 +3,12 @@ from decimal import Decimal
import pytest
from django.core import mail
from django.core.files.uploadedfile import SimpleUploadedFile
from django.utils.timezone import now
from tests.base import SoupTest
from pretix.base.models import (
CachedTicket, Event, EventPermission, InvoiceAddress, Item, Order,
OrderPosition, Organizer, Quota, User,
Event, EventPermission, InvoiceAddress, Item, Order, OrderPosition,
Organizer, Quota, User,
)
from pretix.base.services.invoices import (
generate_cancellation, generate_invoice,
@@ -196,135 +195,6 @@ def test_order_transition(client, env, process):
assert o.status == process[0]
@pytest.mark.django_db
def test_order_detail_download_buttons_hidden_if_not_paid(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PENDING
o.save()
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', True)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/')
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content
@pytest.mark.django_db
def test_order_detail_download_buttons_visible(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', True)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/')
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' in response.rendered_content
@pytest.mark.django_db
def test_order_detail_download_buttons_hidden_of(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', False)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', True)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/')
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content
@pytest.mark.django_db
def test_order_detail_download_buttons_visible_before_date(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', True)
env[0].settings.set('ticketoutput_testdummy__enabled', True)
env[0].settings['ticket_download_date'] = now() + timedelta(days=30)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/')
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' in response.rendered_content
@pytest.mark.django_db
def test_order_detail_download_buttons_hidden_if_provider_disabled(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', False)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/')
assert '/control/event/dummy/dummy/orders/FOO/download/testdummy' not in response.rendered_content
@pytest.mark.django_db
def test_order_download_unpaid(client, env):
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', True)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy', follow=True)
assert 'alert-danger' in response.rendered_content
@pytest.mark.django_db
def test_order_download_unknown_provider(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/download/foobar', follow=True)
assert 'alert-danger' in response.rendered_content
@pytest.mark.django_db
def test_order_download_disabled_provider(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', False)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy', follow=True)
assert 'alert-danger' in response.rendered_content
@pytest.mark.django_db
def test_order_download_success(client, env, mocker):
from pretix.base.services import tickets
mocker.patch('pretix.base.services.tickets.generate.apply_async')
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_PAID
o.save()
env[0].settings.set('ticket_download', True)
del env[0].settings['ticket_download_date']
env[0].settings.set('ticketoutput_testdummy__enabled', True)
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy')
assert response.status_code == 302
tickets.generate.apply_async.assert_any_call(args=(o.id, 'testdummy'))
assert 'download' in response['Location']
dl = response['Location']
# test caching
mocker.resetall()
ct = CachedTicket.objects.get(order=o, provider='testdummy')
ct.cachedfile.file.save('foo.jpg', SimpleUploadedFile("sample_invalid_image.jpg", b"file_content",
content_type="image/jpeg"))
ct.cachedfile.save()
response = client.get('/control/event/dummy/dummy/orders/FOO/download/testdummy')
assert response.status_code == 302
tickets.generate.apply_async.assert_not_called()
assert dl == response['Location']
@pytest.mark.django_db
def test_order_invoice_create_forbidden(client, env):
client.login(email='dummy@dummy.dummy', password='dummy')
-1
View File
@@ -67,7 +67,6 @@ event_urls = [
"orders/ABC/extend",
"orders/ABC/change",
"orders/ABC/contact",
"orders/ABC/download/pdf",
"orders/ABC/",
"orders/",
"invoice/1",
+2 -2
View File
@@ -46,8 +46,8 @@ def test_generate_pdf(env, mocker):
event.settings.set('ticketoutput_pdf_code_y', 50)
event.settings.set('ticketoutput_pdf_code_s', 2)
o = PdfTicketOutput(event)
fname, ftype, buf = o.generate(order)
fname, ftype, buf = o.generate(order.positions.first())
assert ftype == 'application/pdf'
pdf = PdfFileReader(BytesIO(buf))
assert pdf.numPages == 2
assert pdf.numPages == 1
assert mocked.called
+14 -12
View File
@@ -307,7 +307,8 @@ class OrdersTest(TestCase):
self.event.settings.set('ticket_download', True)
del self.event.settings['ticket_download_date']
response = self.client.get(
'/%s/%s/order/%s/%s/download/pdf' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
'/%s/%s/order/%s/%s/download/%d/pdf' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret, self.ticket_pos.pk),
follow=True)
self.assertRedirects(response,
'/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
@@ -315,13 +316,14 @@ class OrdersTest(TestCase):
target_status_code=200)
response = self.client.get(
'/%s/%s/order/ABC/123/download/testdummy' % (self.orga.slug, self.event.slug)
'/%s/%s/order/ABC/123/download/%d/testdummy' % (self.orga.slug, self.event.slug,
self.ticket_pos.pk)
)
assert response.status_code == 404
response = self.client.get(
'/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret),
'/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret, self.ticket_pos.pk),
follow=True
)
self.assertRedirects(response,
@@ -332,15 +334,15 @@ class OrdersTest(TestCase):
self.order.status = Order.STATUS_PAID
self.order.save()
response = self.client.get(
'/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret),
'/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret, self.ticket_pos.pk),
)
assert response.status_code == 302
self.event.settings.set('ticket_download_date', now() + datetime.timedelta(days=1))
response = self.client.get(
'/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret),
'/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret, self.ticket_pos.pk),
follow=True
)
self.assertRedirects(response,
@@ -350,15 +352,15 @@ class OrdersTest(TestCase):
del self.event.settings['ticket_download_date']
response = self.client.get(
'/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret),
'/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret, self.ticket_pos.pk),
)
assert response.status_code == 302
self.event.settings.set('ticket_download', False)
response = self.client.get(
'/%s/%s/order/%s/%s/download/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret),
'/%s/%s/order/%s/%s/download/%d/testdummy' % (self.orga.slug, self.event.slug, self.order.code,
self.order.secret, self.ticket_pos.pk),
follow=True
)
self.assertRedirects(response, '/%s/%s/order/%s/%s/' % (self.orga.slug, self.event.slug, self.order.code,
+2 -3
View File
@@ -9,7 +9,6 @@ class DummyTicketOutput(BaseTicketOutput):
identifier = 'testdummy'
verbose_name = 'Test dummy'
download_button_text = 'Download test file'
download_button_icon = 'fa-print'
def generate(self, order):
return 'test.txt', 'text/plain', str(order.id)
def generate(self, op):
return 'test.txt', 'text/plain', str(op.order.id)