from __future__ import absolute_import, unicode_literals import logging from django.db.models.signals import post_save from django.dispatch import receiver import billard.utils as utils from billard.models import LocationData, Client, Accounting, ClientData log = logging.getLogger(__name__) @receiver(post_save, sender=ClientData) def process_client_data(sender, **kwargs): data = ClientData.objects.all().order_by('last_seen') for cd in data: client = Client.objects.get(uuid=cd.uuid) client.last_seen = cd.last_seen client.save() cd.delete() @receiver(post_save, sender=LocationData) def process_location_data(sender, **kwargs): log.info('Starte die Verarbeitung der Location-Data-Objecte') data = LocationData.objects.filter(processed=False).order_by('tst') for ld in data: try: cli = Client.objects.filter(uuid=ld.client_id, desks__desk_no=ld.desk_no) if cli.count() < 1: ld.processed = True ld.error_msg = 'No client object found. Stopp processing! {}, {}'.format(ld.client_id, ld.desk_no) ld.save() log.error(ld.error_msg) else: cli = cli[0] desk = cli.desks.filter(desk_no=ld.desk_no, enabled=True) if desk.count() != 1: ld.processed = True ld.error_msg = 'No desk object found. Stopp processing! {}, {}'.format(ld.client_id, ld.desk_no) ld.save() log.error(ld.error_msg) desk = desk[0] ac = desk.accounting_set.order_by('time_from').reverse() if ld.on_off: acc = None if ac.count() > 0 and ac[0].time_to is None: log.error('Vorheriges Accounting nicht abgeschlossen: Desk_id {}, Accounting_id {}' .format(desk.id, ac[0].id)) acc = ac[0] if acc is None: acc = Accounting( desk=desk, time_from=ld.tst, ) acc.save() ld.delete() else: if len(ac) > 0: acc = ac[0] acc.time_to = ld.tst acc.prize, acc.prize_normal, acc.prize_hh = utils.get_prize_for( start=acc.time_from, end=ld.tst, pph=desk.prize, hh_start=cli.location.happy_hour_start, hh_end=cli.location.happy_hour_end, pphh=desk.prize_hh, ) acc.reporter_uuid = cli.uuid acc.save() ld.delete() else: ld.processed = True ld.error_msg = 'No existing accountings found. Stopp processing! {}, {}'.format(ld.client_id, ld.desk_no) ld.save() log.error(ld.error_msg) except: log.exception('', exc_info=True) @receiver(post_save, sender=Accounting) def process_accounting_data(sender, **kwargs): log.info('Starte die Verarbeitung der Accounting-Data-Objecte') data = Accounting.objects.filter(prize=0.0, reporter_uuid__isnull=True).exclude(time_to__isnull=True) data.delete()