示例#1
0
def import_from_tc(request):
    """Update ticket information from TC."""
    data = yield from request.read()
    try:
        payload = jwt.decode(data, v1.app.cfg.TC_SECRET)
    except jwt.exceptions.DecodeError:
        raise muffin.HTTPForbidden()

    if not payload:
        raise muffin.HTTPBadRequest(reason='Payload is empty.')

    try:
        ticket = Ticket.get(Ticket.tc_id == payload['id'])
        if ticket.ts <= payload.get('ts', 0):

            for field in ('status', 'barcode', 'price', 'ts'):
                value = payload.get(field, getattr(ticket, field))
                if getattr(ticket, field) == value:
                    continue
                setattr(ticket, field, ticket._meta.fields[field].coerce(value))

            if 'order' in payload and ticket.order_id != payload['order']['id']:
                ticket.order = Order.from_tc(**payload)

            if 'partner' in payload and ticket.partner_id != payload['partner']['id']:
                ticket.partner = Partner.from_tc(**payload)

            if ticket.is_dirty():
                ticket.save(force_insert=False)

        else:

            if not ticket.history.where(History.status == payload['status']):
                History.create(
                    ticket=ticket, status=payload['status'],
                    created=payload.get('ts', time.time()))

    except KeyError as exc:
        raise muffin.HTTPBadRequest(reason='Field is required: %s' % exc)

    except Ticket.DoesNotExist:
        params = dict(
            tc_id=payload['id'],
            barcode=payload.get('barcode', ""),
            status=payload.get('status', Ticket.STATUS.vacant),
            price=payload.get('price', 0),
            event=Event.from_tc(**payload),
            ticketset=TicketSet.from_tc(**payload),
        )
        if 'order' in payload:
            params['order'] = Order.from_tc(**payload)

        if 'partner' in payload:
            params['partner'] = Partner.from_tc(**payload)

        try:
            ticket = Ticket.create(**params)
        except Exception as exc:
            raise muffin.HTTPBadRequest(reason=str(exc))

    return ticket.to_simple()
示例#2
0
def test_tc_import(app, client, mixer):
    client.get('/api/v1/tc/import', status=405)
    client.post('/api/v1/tc/import', status=403)

    import jwt

    client.post('/api/v1/tc/import', jwt.encode({}, app.cfg.TC_SECRET), status=400)

    response = client.post('/api/v1/tc/import', jwt.encode({
        'id': 111,
        'status': 'vacant',
        'event': {'id': 111},
        'ticketset': {'id': 111},
        'partner': {'id': 111},
    }, app.cfg.TC_SECRET))
    assert response.json

    ticket = Ticket.get(Ticket.tc_id == '111')
    assert ticket
    assert ticket.history.count() == 1

    response = client.post('/api/v1/tc/import', jwt.encode({
        'id': 111,
        'status': 'reserved',
        'event': {'id': 111},
        'ticketset': {'id': 111},
        'partner': {'id': 111},
    }, app.cfg.TC_SECRET))
    assert response.json
    assert response.json['status'] == 'reserved'

    ticket = mixer.reload(ticket)
    assert ticket.status == 'reserved'
    assert ticket.history.count() == 2

    response = client.post('/api/v1/tc/import', jwt.encode({
        'id': 111,
        'ts': 1450980430.8382525,
        'barcode': 111,
        'price': '10.45',
        'status': 'sold',
        'event': {'id': 111},
        'ticketset': {'id': 111},
        'partner': {'id': 111},
        'order': {'id': 111},
    }, app.cfg.TC_SECRET))
    assert response.json
    assert response.json['order']
    assert response.json['price'] == '10.45'
    assert response.json['barcode'] == '111'

    ticket = mixer.reload(ticket)
    assert ticket.status == 'sold'
    assert ticket.history.count() == 3

    update = ticket.history.where(History.status == 'sold').get()
    assert update.created == datetime.datetime.fromtimestamp(1450980430.8382525)

    response = client.post('/api/v1/tc/import', jwt.encode({
        'id': 111,
        'barcode': 111,
        'ts': 1450980429.8382525,
        'price': '10.45',
        'status': 'cancel',
        'event': {'id': 111},
        'ticketset': {'id': 111},
        'partner': {'id': 111},
        'order': {'id': 111},
    }, app.cfg.TC_SECRET))
    assert response.json

    ticket = mixer.reload(ticket)
    assert ticket.status == 'sold'
    assert ticket.history.count() == 4

    response = client.post('/api/v1/tc/import', jwt.encode({
        'id': 111,
        'barcode': 111,
        'ts': 1450980429.8382525,
        'price': '10.45',
        'status': 'cancel',
        'event': {'id': 111},
        'ticketset': {'id': 111},
        'partner': {'id': 111},
        'order': {'id': 111},
    }, app.cfg.TC_SECRET))
    assert response.json

    ticket = mixer.reload(ticket)
    assert ticket.status == 'sold'
    assert ticket.history.count() == 4