mirror of
https://github.com/pretix/pretix.git
synced 2026-08-29 13:44:40 +00:00
Offer download options per position, not per order
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -67,7 +67,6 @@ event_urls = [
|
||||
"orders/ABC/extend",
|
||||
"orders/ABC/change",
|
||||
"orders/ABC/contact",
|
||||
"orders/ABC/download/pdf",
|
||||
"orders/ABC/",
|
||||
"orders/",
|
||||
"invoice/1",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user