Gift cards: Improved support for cross-organizer acceptance (#3311)

Co-authored-by: Martin Gross <martin@pc-coholic.de>
This commit is contained in:
Raphael Michel
2023-06-15 14:17:40 +02:00
committed by GitHub
parent b3c917925c
commit f8be8296dd
22 changed files with 605 additions and 139 deletions

View File

@@ -19,14 +19,16 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from datetime import timedelta
from datetime import datetime, timedelta, timezone
from decimal import Decimal
import pytest
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import Order, Organizer, ReusableMedium
from pretix.base.models import (
Event, GiftCardAcceptance, Order, Organizer, ReusableMedium,
)
@pytest.fixture
@@ -49,11 +51,28 @@ def organizer2():
@pytest.fixture
def giftcard2(organizer2):
gc = organizer2.issued_gift_cards.create(secret="ABCDEF", currency="EUR")
gc = organizer2.issued_gift_cards.create(secret="IJKLMNOP", currency="EUR")
gc.transactions.create(value=Decimal('23.00'), acceptor=organizer2)
return gc
@pytest.fixture
def medium2(organizer2):
m = organizer2.reusable_media.create(identifier="ABCDEFGH", type="barcode", active=True)
return m
@pytest.fixture
@scopes_disabled()
def org2_event(organizer2):
e = Event.objects.create(
organizer=organizer2, name='Dummy2', slug='dummy2',
date_from=datetime(2017, 12, 27, 10, 0, 0, tzinfo=timezone.utc),
plugins='pretix.plugins.banktransfer,pretix.plugins.ticketoutputpdf'
)
return e
@pytest.fixture
def customer(organizer, event):
return organizer.customers.create(
@@ -67,6 +86,7 @@ def customer(organizer, event):
TEST_MEDIUM_RES = {
"id": 1,
"organizer": "dummy",
"identifier": "ABCDEFGH",
"type": "barcode",
"active": True,
@@ -357,3 +377,64 @@ def test_medium_autocreate(token_client, organizer):
)
assert resp.status_code == 200
assert resp.data["result"] is None
@pytest.mark.django_db
def test_medium_lookup_cross_organizer(token_client, organizer, organizer2, org2_event, medium2, giftcard2):
with scopes_disabled():
o = Order.objects.create(
code='FOO', event=org2_event, email='dummy@dummy.test',
status=Order.STATUS_PENDING, datetime=now(), expires=now() + timedelta(days=10),
total=14, locale='en'
)
ticket = org2_event.items.create(name='Early-bird ticket', category=None, default_price=23, admission=True,
personalized=True)
op = o.positions.create(item=ticket, price=Decimal("14"))
medium2.linked_orderposition = op
medium2.linked_giftcard = giftcard2
medium2.save()
resp = token_client.post(
'/api/v1/organizers/{}/reusablemedia/lookup/'.format(organizer.slug),
{
"type": medium2.type,
"identifier": medium2.identifier,
},
format='json'
)
assert resp.status_code == 200
assert resp.data["result"] is None
gca = GiftCardAcceptance.objects.create(
issuer=organizer2,
acceptor=organizer,
active=True,
reusable_media=False
)
resp = token_client.post(
'/api/v1/organizers/{}/reusablemedia/lookup/'.format(organizer.slug),
{
"type": medium2.type,
"identifier": medium2.identifier,
},
format='json'
)
assert resp.status_code == 200
assert resp.data["result"] is None
gca.reusable_media = True
gca.save()
resp = token_client.post(
'/api/v1/organizers/{}/reusablemedia/lookup/'.format(organizer.slug),
{
"type": medium2.type,
"identifier": medium2.identifier,
},
format='json'
)
assert resp.status_code == 200
assert resp.data["result"] is not None
assert resp.data["result"]["organizer"] == "partner"
assert resp.data["result"]["linked_giftcard"] is not None
assert resp.data["result"]["linked_orderposition"] is None