Пример #1
0
 def get_many(self, request):
     """Load barcodes."""
     qs = Ticket.select(
         Ticket, Partner.title, Event.title, TicketSet.title, Order.buyer, Order.phone)\
         .join(Partner).switch(Ticket)\
         .join(Event).switch(Ticket)\
         .join(TicketSet).switch(Ticket)\
         .join(Order, JOIN_LEFT_OUTER)
     return qs
Пример #2
0
def amount(request):
    """Provide data for render a month chart."""
    user = yield from v1.app.ps.session.load_user(request)
    if user is None:
        raise HTTPForbidden(reason='Access denied.')

    if not 'to' in request.GET:
        dtto = dt.datetime.now()
    else:
        dtto = request.GET.get('to')
        dtto = parser.parse(dtto)

    if not 'from' in request.GET:
        dtfrom = dtto - dt.timedelta(days=30)
    else:
        dtfrom = request.GET.get('from')
        dtfrom = parser.parse(dtfrom)

    statuses = ('sold', 'revoked', 'passed')
    qs = Ticket.select(Ticket.modified, Ticket.status, Ticket.price).where(
        Ticket.modified.between(dtfrom, dtto), Ticket.status << statuses).tuples()

    statuses = defaultdict(lambda: defaultdict(lambda: 0))
    prices = defaultdict(lambda: 0)

    for modified, status, price in qs:
        statuses[status][modified.date()] += 1
        if status == 'sold':
            prices[modified.date()] += int(price)

    labels = []
    data = defaultdict(list)
    values = list()
    while dtfrom < dtto:
        dtfrom += dt.timedelta(days=1)
        labels.append(str(dtfrom.date()))
        values.append(prices[dtfrom.date()])
        for status in ('sold', 'revoked', 'passed'):
            data[status].append(statuses[status][dtfrom.date()])

    return {'labels': labels, 'data': data, 'values': values}
Пример #3
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()
Пример #4
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