diff --git a/livestyled/models/ticket.py b/livestyled/models/ticket.py index f7ef73e..5e857b6 100644 --- a/livestyled/models/ticket.py +++ b/livestyled/models/ticket.py @@ -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 @@ -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( @@ -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, @@ -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 ''.format(self=self) @@ -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): diff --git a/livestyled/schemas/tests/fixtures/example_ticket.json b/livestyled/schemas/tests/fixtures/example_ticket.json new file mode 100644 index 0000000..77f3271 --- /dev/null +++ b/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" +} \ No newline at end of file diff --git a/livestyled/schemas/tests/fixtures/example_ticket_shared.json b/livestyled/schemas/tests/fixtures/example_ticket_shared.json new file mode 100644 index 0000000..5839428 --- /dev/null +++ b/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" +} \ No newline at end of file diff --git a/livestyled/schemas/tests/fixtures/example_ticket_shared_redeemed.json b/livestyled/schemas/tests/fixtures/example_ticket_shared_redeemed.json new file mode 100644 index 0000000..03f8e15 --- /dev/null +++ b/livestyled/schemas/tests/fixtures/example_ticket_shared_redeemed.json @@ -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" +} \ No newline at end of file diff --git a/livestyled/schemas/tests/test_ticket.py b/livestyled/schemas/tests/test_ticket.py new file mode 100644 index 0000000..d2a10f3 --- /dev/null +++ b/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')), + } diff --git a/livestyled/schemas/ticket.py b/livestyled/schemas/ticket.py index e861494..2aa99ca 100644 --- a/livestyled/schemas/ticket.py +++ b/livestyled/schemas/ticket.py @@ -1,10 +1,18 @@ from marshmallow import EXCLUDE, fields, Schema +from marshmallow_polyfield import PolyField from livestyled.models.ticket import Ticket from livestyled.schemas.fields import RelatedResourceLinkField from livestyled.schemas.user import UserSchema +def parent_ticket_selector(parent_ticket, ticket): + if isinstance(parent_ticket, str): + return RelatedResourceLinkField(schema=Ticket, required=False, missing=None, data_key='parentTicket') + elif isinstance(parent_ticket, dict): + return fields.Nested(TicketSchema) + + class TicketSchema(Schema): class Meta: unknown = EXCLUDE @@ -38,3 +46,17 @@ class Meta: updated_at = fields.AwareDateTime(data_key='updatedAt', allow_none=False) user_id = RelatedResourceLinkField(schema=UserSchema, required=False, missing=None, data_key='user') can_share = fields.Boolean(data_key='canShare', allow_none=False, required=False, missing=False) + share_code = fields.String(data_key='shareCode', allow_none=True, required=False, missing=None) + sharer_email = fields.String(data_key='sharerEmail', allow_none=True, required=False, missing=None) + redeemer_email = fields.String(data_key='redeemerEmail', allow_none=True, required=False, missing=None) + redeemed_at = fields.AwareDateTime(data_key='redeemedAt', required=False, missing=None) + shared_at = fields.AwareDateTime(data_key='sharedAt', required=False, missing=None) + sharer_id = RelatedResourceLinkField(schema=UserSchema, required=False, missing=None, data_key='sharer') + redeemer_id = RelatedResourceLinkField(schema=UserSchema, required=False, missing=None, data_key='redeemer') + parent_ticket = PolyField( + deserialization_schema_selector=parent_ticket_selector, + data_key='parentTicket', + required=False, + missing=None, + allow_none=True + ) diff --git a/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket.json b/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket.json new file mode 100644 index 0000000..77f3271 --- /dev/null +++ b/livestyled/tests/fixtures/mock_responses/ls_api/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" +} \ No newline at end of file diff --git a/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket_shared.json b/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket_shared.json new file mode 100644 index 0000000..5839428 --- /dev/null +++ b/livestyled/tests/fixtures/mock_responses/ls_api/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" +} \ No newline at end of file diff --git a/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket_shared_redeemed.json b/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket_shared_redeemed.json new file mode 100644 index 0000000..03f8e15 --- /dev/null +++ b/livestyled/tests/fixtures/mock_responses/ls_api/example_ticket_shared_redeemed.json @@ -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" +} \ No newline at end of file diff --git a/livestyled/tests/test_resource_client_ticket.py b/livestyled/tests/test_resource_client_ticket.py new file mode 100644 index 0000000..5337f20 --- /dev/null +++ b/livestyled/tests/test_resource_client_ticket.py @@ -0,0 +1,147 @@ +from datetime import datetime, timedelta, timezone +import os + +from livestyled.models.ticket import Ticket +from livestyled.models.user import User +from livestyled.resource_client import LiveStyledResourceClient +from livestyled.tests.utils import configure_mock_responses + +FIXTURES_DIR = os.path.join(os.path.dirname(__file__), 'fixtures') +TEST_API_DOMAIN = 'test.livestyled.com' +CONTENT_TYPE = 'application/ld+json' + + +def test_get_ticket(requests_mock): + mock_responses = ( + ('GET', 'https://' + TEST_API_DOMAIN + '/v4/tickets/44', 'mock_responses/ls_api/example_ticket.json', 200), + ) + configure_mock_responses(requests_mock, mock_responses, FIXTURES_DIR, CONTENT_TYPE) + + resource_client = LiveStyledResourceClient(TEST_API_DOMAIN, 'bar') + ticket = resource_client.get_ticket(44) + assert ticket + assert isinstance(ticket, Ticket) + assert ticket.id == 44 + assert ticket.external_ticket_id == '99999999' + assert ticket.seat == '1' + assert ticket.qr_code_url == '' + assert ticket.session_date == datetime(2020, 12, 24, 0, 0, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.barcode is None + assert ticket.can_share is True + assert ticket.client_email == 'test@livestyled.com' + assert ticket.client_name is None + assert ticket.created_at == datetime(2019, 5, 16, 15, 31, 45, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.entrance is None + assert ticket.external_customer_ref is None + assert ticket.external_event_id is None + assert ticket.parent_ticket is None + assert ticket.premium is False + assert ticket.price == 199 + assert ticket.price_code is None + assert ticket.redeemer_email is None + assert ticket.redeemer_id is None + assert ticket.redeemer is None + assert ticket.row == 'U' + assert ticket.section == '128' + assert ticket.sector_name is None + assert ticket.share_code is None + assert ticket.share_link is None + assert ticket.shared_at is None + assert ticket.sharer_email is None + assert ticket.updated_at == datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.user_id is None + assert ticket.user is None + assert ticket.venue_name is None + assert ticket.venue_room is None + assert ticket.redeemed_at is None + + +def test_get_ticket_shared(requests_mock): + mock_responses = ( + ('GET', 'https://' + TEST_API_DOMAIN + '/v4/tickets/44', 'mock_responses/ls_api/example_ticket_shared.json', 200), + ) + configure_mock_responses(requests_mock, mock_responses, FIXTURES_DIR, CONTENT_TYPE) + + resource_client = LiveStyledResourceClient(TEST_API_DOMAIN, 'bar') + ticket = resource_client.get_ticket(44) + assert ticket + assert isinstance(ticket, Ticket) + assert ticket.id == 44 + assert ticket.external_ticket_id == '99999999' + assert ticket.seat == '1' + assert ticket.qr_code_url == '' + assert ticket.session_date == datetime(2020, 12, 24, 0, 0, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.barcode is None + assert ticket.can_share is True + assert ticket.client_email == 'test@livestyled.com' + assert ticket.client_name is None + assert ticket.created_at == datetime(2019, 5, 16, 15, 31, 45, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.entrance is None + assert ticket.external_customer_ref is None + assert ticket.external_event_id is None + assert ticket.parent_ticket is None + assert ticket.premium is False + assert ticket.price == 199 + assert ticket.price_code is None + assert ticket.redeemer_email is None + assert ticket.redeemer_id is None + assert ticket.redeemer is None + assert ticket.row == 'U' + assert ticket.section == '128' + assert ticket.sector_name is None + assert ticket.share_code == 'ABCDEF12345' + assert ticket.share_link is None + assert ticket.shared_at == datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.sharer_email == 'test@livestyled.com' + assert ticket.updated_at == datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.user_id is None + assert ticket.user is None + assert ticket.venue_name is None + assert ticket.venue_room is None + assert ticket.redeemed_at is None + + +def test_get_ticket_shared_redeemed(requests_mock): + mock_responses = ( + ('GET', 'https://' + TEST_API_DOMAIN + '/v4/tickets/44', 'mock_responses/ls_api/example_ticket_shared_redeemed.json', 200), + ) + configure_mock_responses(requests_mock, mock_responses, FIXTURES_DIR, CONTENT_TYPE) + + resource_client = LiveStyledResourceClient(TEST_API_DOMAIN, 'bar') + ticket = resource_client.get_ticket(44) + assert ticket + assert isinstance(ticket, Ticket) + assert ticket.id == 44 + assert ticket.external_ticket_id == '99999999' + assert ticket.seat == '1' + assert ticket.qr_code_url == '' + assert ticket.session_date == datetime(2020, 12, 24, 0, 0, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.barcode is None + assert ticket.can_share is True + assert ticket.client_email == 'test@livestyled.com' + assert ticket.client_name is None + assert ticket.created_at == datetime(2019, 5, 16, 15, 31, 45, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.entrance is None + assert ticket.external_customer_ref is None + assert ticket.external_event_id is None + assert ticket.parent_ticket is None + assert ticket.premium is False + assert ticket.price == 199 + assert ticket.price_code is None + assert ticket.redeemer_email == 'someoneelse@livestyled.com' + assert ticket.redeemer_id == 1234 + assert isinstance(ticket.redeemer, User) + assert ticket.redeemer.id == 1234 + assert ticket.row == 'U' + assert ticket.section == '128' + assert ticket.sector_name is None + assert ticket.share_code == 'ABCDEF12345' + assert ticket.share_link is None + assert ticket.shared_at == datetime(2019, 5, 24, 12, 41, 22, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.sharer_email == 'test@livestyled.com' + assert ticket.updated_at == datetime(2019, 5, 24, 13, 41, 22, tzinfo=timezone(timedelta(0), '+0000')) + assert ticket.user_id is None + assert ticket.user is None + assert ticket.venue_name is None + assert ticket.venue_room is None + assert ticket.redeemed_at == datetime(2019, 5, 24, 13, 41, 22, tzinfo=timezone(timedelta(0), '+0000')) diff --git a/requirements.txt b/requirements.txt index 095a83c..622daed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ marshmallow==3.3.0 +marshmallow-polyfield==5.7 pytz requests==2.22.0