Skip to content

Commit

Permalink
support shared tickets
Browse files Browse the repository at this point in the history
  • Loading branch information
geuben committed May 21, 2020
1 parent b576c91 commit 9012e1b
Show file tree
Hide file tree
Showing 11 changed files with 580 additions and 4 deletions.
136 changes: 132 additions & 4 deletions livestyled/models/ticket.py
Expand Up @@ -30,6 +30,14 @@ def __init__(
status,
session_date=None,
can_share=False,
sharer_email=None,
sharer_id=None,
redeemed_at=None,
redeemer_id=None,
share_code=None,
redeemer_email=None,
parent_ticket=None,
shared_at=None,
):
self.id = id
self.external_ticket_id = external_ticket_id
Expand All @@ -54,9 +62,74 @@ def __init__(
self.section = section
self.row = row
self.price_code = price_code
self._user = User.placeholder(id=user_id)
if user_id:
self._user = User.placeholder(id=user_id)
else:
self._user = None
self.status = status
self.can_share = can_share
self.sharer_email = sharer_email
self.redeemed_at = redeemed_at
self.share_code = share_code
self.redeemer_email = redeemer_email
self.shared_at = shared_at
if sharer_id:
self._sharer = User.placeholder(id=sharer_id)
else:
self._sharer = None
if redeemer_id:
self._redeemer = User.placeholder(id=redeemer_id)
else:
self._redeemer = None
if parent_ticket:
if isinstance(parent_ticket, dict):
self._parent_ticket = Ticket(**parent_ticket)
elif isinstance(parent_ticket, (int, str)):
self._parent_ticket = Ticket.placeholder(id=int(parent_ticket))
else:
self._parent_ticket = None

@classmethod
def placeholder(
cls,
id
):
return cls(
id=id,
external_ticket_id=None,
seat=None,
qr_code_url=None,
title=None,
external_event_id=None,
barcode=None,
sector_name=None,
venue_name=None,
venue_room=None,
client_name=None,
premium=None,
client_email=None,
price=None,
share_link=None,
external_customer_ref=None,
entrance=None,
section=None,
row=None,
price_code=None,
created_at=None,
updated_at=None,
user_id=None,
status=None,
session_date=None,
can_share=False,
sharer_email=None,
sharer_id=None,
redeemed_at=None,
redeemer_id=None,
share_code=None,
redeemer_email=None,
parent_ticket=None,
shared_at=None,
)

@classmethod
def create_new(
Expand Down Expand Up @@ -84,6 +157,14 @@ def create_new(
entrance=None,
status=None,
can_share=False,
sharer_email=None,
sharer: User or str or int or None = None,
redeemed_at=None,
redeemer: User or str or int or None = None,
share_code=None,
redeemer_email=None,
parent_ticket=None,
shared_at=None,
):
ticket = Ticket(
id=None,
Expand Down Expand Up @@ -111,21 +192,67 @@ def create_new(
price_code=price_code,
user_id=None,
status=status,
can_share=can_share
can_share=can_share,
sharer_email=sharer_email,
sharer_id=None,
redeemed_at=redeemed_at,
redeemer_id=None,
share_code=share_code,
redeemer_email=redeemer_email,
parent_ticket=None,
shared_at=shared_at,
)
if isinstance(user, (str, int)):
user = User.placeholder(id=user)
ticket._user = user
if isinstance(sharer, (str or int)):
sharer = User.placeholder(id=sharer)
ticket._sharer = sharer
if isinstance(redeemer, (str or int)):
redeemer = User.placeholder(id=redeemer)
ticket._redeemer = redeemer
if isinstance(parent_ticket, (str or int)):
parent_ticket = Ticket.placeholder(id=parent_ticket)
ticket._parent_ticket = parent_ticket
return ticket

@property
def user_id(self):
return self._user.id
if self._user:
return self._user.id
else:
return None

@property
def user(self):
return self._user

@property
def redeemer_id(self):
if self._redeemer:
return self._redeemer.id
else:
return None

@property
def redeemer(self):
return self._redeemer

@property
def sharer_id(self):
if self._sharer:
return self._sharer.id
else:
return None

@property
def sharer(self):
return self.sharer

@property
def parent_ticket(self):
return self._parent_ticket

def __repr__(self):
return '<Ticket(id={self.id!r})>'.format(self=self)

Expand All @@ -134,7 +261,8 @@ def diff(self, other):
fields = (
'external_ticket_id', 'seat', 'qr_code_url', 'session_date', 'title', 'external_event_id',
'barcode', 'sector_name', 'venue_name', 'venue_room', 'client_name', 'premium', 'client_email',
'price', 'status', 'can_share'
'price', 'status', 'can_share', 'sharer_email', 'redeemed_at', 'redeemer_id', 'share_code',
'redeemer_email', 'parent_ticket', 'shared_at'
)
for field in fields:
if getattr(self, field) != getattr(other, field):
Expand Down
21 changes: 21 additions & 0 deletions livestyled/schemas/tests/fixtures/example_ticket.json
@@ -0,0 +1,21 @@
{
"@context": "/v4/contexts/Ticket",
"@id": "/v4/tickets/44",
"@type": "Ticket",
"id": 44,
"externalTicketId": "99999999",
"seat": "1",
"qrCodeUrl": "",
"sessionDate": "2020-12-24T00:00:00+00:00",
"title": "128_U_1",
"section": "128",
"row": "U",
"premium": false,
"clientEmail": "test@livestyled.com",
"price": 199.9,
"currency": "/v4/currencies/2",
"createdAt": "2019-05-16T15:31:45+00:00",
"updatedAt": "2019-05-24T12:41:22+00:00",
"canShare": true,
"status": "active"
}
24 changes: 24 additions & 0 deletions livestyled/schemas/tests/fixtures/example_ticket_shared.json
@@ -0,0 +1,24 @@
{
"@context": "/v4/contexts/Ticket",
"@id": "/v4/tickets/44",
"@type": "Ticket",
"id": 44,
"externalTicketId": "99999999",
"seat": "1",
"qrCodeUrl": "",
"sessionDate": "2020-12-24T00:00:00+00:00",
"title": "128_U_1",
"section": "128",
"row": "U",
"premium": false,
"clientEmail": "test@livestyled.com",
"price": 199.9,
"currency": "/v4/currencies/2",
"createdAt": "2019-05-16T15:31:45+00:00",
"updatedAt": "2019-05-24T12:41:22+00:00",
"canShare": true,
"status": "shared",
"shareCode": "ABCDEF12345",
"sharedAt": "2019-05-24T12:41:22+00:00",
"sharerEmail": "test@livestyled.com"
}
@@ -0,0 +1,27 @@
{
"@context": "/v4/contexts/Ticket",
"@id": "/v4/tickets/44",
"@type": "Ticket",
"id": 44,
"externalTicketId": "99999999",
"seat": "1",
"qrCodeUrl": "",
"sessionDate": "2020-12-24T00:00:00+00:00",
"title": "128_U_1",
"section": "128",
"row": "U",
"premium": false,
"clientEmail": "test@livestyled.com",
"price": 199.9,
"currency": "/v4/currencies/2",
"createdAt": "2019-05-16T15:31:45+00:00",
"updatedAt": "2019-05-24T13:41:22+00:00",
"canShare": true,
"status": "redeemed",
"shareCode": "ABCDEF12345",
"sharedAt": "2019-05-24T12:41:22+00:00",
"sharerEmail": "test@livestyled.com",
"redeemerEmail": "someoneelse@livestyled.com",
"redeemedAt": "2019-05-24T13:41:22+00:00",
"redeemer": "/v4/users/1234"
}
134 changes: 134 additions & 0 deletions livestyled/schemas/tests/test_ticket.py
@@ -0,0 +1,134 @@
from datetime import datetime, timedelta, timezone
import os

from livestyled.schemas.ticket import TicketSchema


FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures')
TEST_API_DOMAIN = 'test.livestyled.com'


def test_deserialize_ticket():
with open(os.path.join(FIXTURES_DIR, 'example_ticket.json'), 'r') as fixture_file:
ticket = fixture_file.read()
deserialized_ticket = TicketSchema().loads(ticket)
assert deserialized_ticket == {
'barcode': None,
'can_share': True,
'client_email': 'test@livestyled.com',
'client_name': None,
'created_at': datetime(2019, 5, 16, 15, 31, 45, tzinfo=timezone(timedelta(0), '+0000')),
'entrance': None,
'external_customer_ref': None,
'external_event_id': None,
'external_ticket_id': '99999999',
'id': 44,
'parent_ticket': None,
'premium': False,
'price': 199,
'price_code': None,
'qr_code_url': '',
'redeemer_email': None,
'redeemer_id': None,
'row': 'U',
'seat': '1',
'section': '128',
'sector_name': None,
'session_date': datetime(2020, 12, 24, 0, 0, tzinfo=timezone(timedelta(0), '+0000')),
'share_code': None,
'share_link': None,
'shared_at': None,
'sharer_email': None,
'sharer_id': None,
'status': 'active',
'title': '128_U_1',
'updated_at': datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')),
'user_id': None,
'venue_name': None,
'venue_room': None,
'redeemed_at': None,
}


def test_deserialize_ticket_shared():
with open(os.path.join(FIXTURES_DIR, 'example_ticket_shared.json'), 'r') as fixture_file:
ticket = fixture_file.read()
deserialized_ticket = TicketSchema().loads(ticket)
assert deserialized_ticket == {
'barcode': None,
'can_share': True,
'client_email': 'test@livestyled.com',
'client_name': None,
'created_at': datetime(2019, 5, 16, 15, 31, 45, tzinfo=timezone(timedelta(0), '+0000')),
'entrance': None,
'external_customer_ref': None,
'external_event_id': None,
'external_ticket_id': '99999999',
'id': 44,
'parent_ticket': None,
'premium': False,
'price': 199,
'price_code': None,
'qr_code_url': '',
'redeemer_email': None,
'redeemer_id': None,
'row': 'U',
'seat': '1',
'section': '128',
'sector_name': None,
'session_date': datetime(2020, 12, 24, 0, 0, tzinfo=timezone(timedelta(0), '+0000')),
'share_code': 'ABCDEF12345',
'share_link': None,
'shared_at': datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')),
'sharer_email': 'test@livestyled.com',
'sharer_id': None,
'status': 'shared',
'title': '128_U_1',
'updated_at': datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')),
'user_id': None,
'venue_name': None,
'venue_room': None,
'redeemed_at': None,
}


def test_deserialize_ticket_shared_redeemed():
with open(os.path.join(FIXTURES_DIR, 'example_ticket_shared_redeemed.json'), 'r') as fixture_file:
ticket = fixture_file.read()
deserialized_ticket = TicketSchema().loads(ticket)
assert deserialized_ticket == {
'barcode': None,
'can_share': True,
'client_email': 'test@livestyled.com',
'client_name': None,
'created_at': datetime(2019, 5, 16, 15, 31, 45, tzinfo=timezone(timedelta(0), '+0000')),
'entrance': None,
'external_customer_ref': None,
'external_event_id': None,
'external_ticket_id': '99999999',
'id': 44,
'parent_ticket': None,
'premium': False,
'price': 199,
'price_code': None,
'qr_code_url': '',
'redeemer_email': 'someoneelse@livestyled.com',
'redeemer_id': 1234,
'row': 'U',
'seat': '1',
'section': '128',
'sector_name': None,
'session_date': datetime(2020, 12, 24, 0, 0, tzinfo=timezone(timedelta(0), '+0000')),
'share_code': 'ABCDEF12345',
'share_link': None,
'shared_at': datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')),
'sharer_email': 'test@livestyled.com',
'sharer_id': None,
'status': 'redeemed',
'title': '128_U_1',
'updated_at': datetime(2019, 5, 24, 13, 41, 22, tzinfo=timezone(timedelta(0), '+0000')),
'user_id': None,
'venue_name': None,
'venue_room': None,
'redeemed_at': datetime(2019, 5, 24, 13, 41, 22, tzinfo=timezone(timedelta(0), '+0000')),
}

0 comments on commit 9012e1b

Please sign in to comment.