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
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}
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()
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