From 288abf1ad0c6a636a3390e4f34a19da408248765 Mon Sep 17 00:00:00 2001 From: Robert Einsle Date: Mon, 6 Feb 2017 18:50:10 +0100 Subject: [PATCH 1/4] add celery stuff --- billard/tasks.py | 8 ++++++++ caromserver/__init__.py | 7 +++++++ caromserver/celery.py | 22 ++++++++++++++++++++++ caromserver/settings.py | 9 +++++++++ 4 files changed, 46 insertions(+) create mode 100644 billard/tasks.py create mode 100644 caromserver/celery.py diff --git a/billard/tasks.py b/billard/tasks.py new file mode 100644 index 0000000..fded6ad --- /dev/null +++ b/billard/tasks.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import, unicode_literals +from celery import shared_task +from . import models + + +@shared_task +def add(x, y): + return x + y diff --git a/caromserver/__init__.py b/caromserver/__init__.py index e69de29..3b91b07 100644 --- a/caromserver/__init__.py +++ b/caromserver/__init__.py @@ -0,0 +1,7 @@ +from __future__ import absolute_import, unicode_literals + +# This will make sure the app is always imported when +# Django starts so that shared_task will use this app. +from .celery import app as celery_app + +__all__ = ['celery_app'] diff --git a/caromserver/celery.py b/caromserver/celery.py new file mode 100644 index 0000000..8914e86 --- /dev/null +++ b/caromserver/celery.py @@ -0,0 +1,22 @@ +from __future__ import absolute_import, unicode_literals +import os +from celery import Celery + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'caromserver.settings') + +app = Celery('caromserver') + +# Using a string here means the worker don't have to serialize +# the configuration object to child processes. +# - namespace='CELERY' means all celery-related configuration keys +# should have a `CELERY_` prefix. +app.config_from_object('django.conf:settings') + +# Load task modules from all registered Django app configs. +#app.autodiscover_tasks() + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) \ No newline at end of file diff --git a/caromserver/settings.py b/caromserver/settings.py index fe18ef8..df5161a 100644 --- a/caromserver/settings.py +++ b/caromserver/settings.py @@ -138,6 +138,15 @@ LOGOUT_URL = 'logout' LOGIN_REDIRECT_URL = 'carom_index' LOGOUT_REDIRECT_URL = 'carom_index' +# CELERY STUFF +BROKER_URL = 'redis://localhost:6379' +CELERY_RESULT_BACKEND = 'redis://localhost:6379' +CELERY_ACCEPT_CONTENT = ['application/json'] +CELERY_TASK_SERIALIZER = 'json' +CELERY_RESULT_SERIALIZER = 'json' +CELERY_TIMEZONE = 'Europe/Berlin' + + STATIC_ROOT = "/srv/carom/carom-server/static/" try: From 3a48ac9c6b3841932a03f3d1422f40a7d47a0bf8 Mon Sep 17 00:00:00 2001 From: Robert Einsle Date: Mon, 6 Feb 2017 19:11:32 +0100 Subject: [PATCH 2/4] update celery call --- billard/models.py | 12 +++++++++++- billard/tasks.py | 8 ++++++-- caromserver/celery.py | 7 ++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/billard/models.py b/billard/models.py index f1171dd..8bfe549 100644 --- a/billard/models.py +++ b/billard/models.py @@ -3,6 +3,10 @@ from django.db import models from django.contrib.auth.models import User from datetime import datetime from . import utils +from . import tasks +from caromserver import celery +from django.contrib.auth.models import User +from django.db.models.signals import post_save class LocationData(models.Model): @@ -86,4 +90,10 @@ class Accounting(models.Model): class Meta: ordering = ['-time_from'] verbose_name = "Buchhaltungseintrag" - verbose_name_plural = "Buchhaltungseinträge" \ No newline at end of file + verbose_name_plural = "Buchhaltungseinträge" + + +def update_location_data(sender, instance, **kwargs): + tasks.process_location_data.delay() + +post_save.connect(update_location_data, sender=LocationData) diff --git a/billard/tasks.py b/billard/tasks.py index fded6ad..60e93cf 100644 --- a/billard/tasks.py +++ b/billard/tasks.py @@ -4,5 +4,9 @@ from . import models @shared_task -def add(x, y): - return x + y +def process_location_data(): + data = models.LocationData.objects.filter(processed=False) + print(len(data)) + for ld in data: + print(ld) + diff --git a/caromserver/celery.py b/caromserver/celery.py index 8914e86..4659ddc 100644 --- a/caromserver/celery.py +++ b/caromserver/celery.py @@ -1,5 +1,6 @@ from __future__ import absolute_import, unicode_literals import os +import django from celery import Celery # set the default Django settings module for the 'celery' program. @@ -14,7 +15,11 @@ app = Celery('caromserver') app.config_from_object('django.conf:settings') # Load task modules from all registered Django app configs. -#app.autodiscover_tasks() + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "caromserver.settings") +django.setup() + +app.autodiscover_tasks(['billard']) @app.task(bind=True) From dae777892bd60f81d9229c92a93466c0a8f08bdc Mon Sep 17 00:00:00 2001 From: Robert Einsle Date: Mon, 6 Feb 2017 19:58:32 +0100 Subject: [PATCH 3/4] add locationdata process logic --- billard/migrations/0005_auto_20170206_1926.py | 20 +++++++++++++++ billard/models.py | 13 +++++----- billard/tasks.py | 25 ++++++++++++++++--- 3 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 billard/migrations/0005_auto_20170206_1926.py diff --git a/billard/migrations/0005_auto_20170206_1926.py b/billard/migrations/0005_auto_20170206_1926.py new file mode 100644 index 0000000..232d6a0 --- /dev/null +++ b/billard/migrations/0005_auto_20170206_1926.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-02-06 18:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('billard', '0004_accounting'), + ] + + operations = [ + migrations.AlterField( + model_name='locationdata', + name='location_id', + field=models.UUIDField(), + ), + ] diff --git a/billard/models.py b/billard/models.py index 8bfe549..e8db414 100644 --- a/billard/models.py +++ b/billard/models.py @@ -4,18 +4,17 @@ from django.contrib.auth.models import User from datetime import datetime from . import utils from . import tasks -from caromserver import celery from django.contrib.auth.models import User from django.db.models.signals import post_save class LocationData(models.Model): - location_id = models.CharField(max_length=32, blank=False, null=False, name="Standort-ID") - table_no = models.IntegerField(blank=False, null=False, name="Tischnummer") - tst = models.DateTimeField(blank=False, null=False, name="Zeitstempel") - on_off = models.BooleanField(blank=False, null=False, name="Ein/Ausgebucht") - processed = models.BooleanField(default=False, name="Verarbeitet") - error_msg = models.CharField(max_length=16000, blank=True, null=True, name="Fehlermeldung") + location_id = models.UUIDField(blank=False, null=False) + table_no = models.IntegerField(blank=False, null=False) + tst = models.DateTimeField(blank=False, null=False) + on_off = models.BooleanField(blank=False, null=False) + processed = models.BooleanField(default=False) + error_msg = models.CharField(max_length=16000, blank=True, null=True) def __str__(self): return str(self.location_id) diff --git a/billard/tasks.py b/billard/tasks.py index 60e93cf..0e81fef 100644 --- a/billard/tasks.py +++ b/billard/tasks.py @@ -1,12 +1,31 @@ from __future__ import absolute_import, unicode_literals from celery import shared_task from . import models +from datetime import datetime +from . import utils @shared_task def process_location_data(): data = models.LocationData.objects.filter(processed=False) - print(len(data)) for ld in data: - print(ld) - + cli = models.Client.objects.get(uuid=ld.location_id) + ac = models.Accounting.objects.filter(client=cli).order_by('time_from').reverse()[0] + if ld.on_off: + if ac.time_to is None: + ac.time_to = datetime.now() + ac.save() + ac = models.Accounting( + client=cli, + desk_no=ld.table_no, + time_from=ld.tst, + ) + ac.save() + ld.processed=True + ld.save() + else: + ac.time_to = ld.tst + ac.prize = utils.get_prize_for(start=ac.time_from, end=ac.time_to, pph=cli.desk1_prize_ht) + ac.save() + ld.processed=True + ld.save() From e66d729b629da24cfb13c18108bf71254fb39d6d Mon Sep 17 00:00:00 2001 From: Robert Einsle Date: Mon, 6 Feb 2017 20:11:20 +0100 Subject: [PATCH 4/4] add tzinfo for calculating --- billard/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/billard/models.py b/billard/models.py index e8db414..1530f8f 100644 --- a/billard/models.py +++ b/billard/models.py @@ -1,7 +1,7 @@ import uuid from django.db import models from django.contrib.auth.models import User -from datetime import datetime +from datetime import datetime, timezone from . import utils from . import tasks from django.contrib.auth.models import User @@ -58,7 +58,7 @@ class Client(models.Model): t = Accounting.objects.filter(client_id=self.id, desk_no=desk_no)[:3][::-1] a = t[t.__len__() - 1] if a.time_to is None: - prize = utils.get_prize_for(start=a.time_from, end=datetime.now(), pph=pht) + prize = utils.get_prize_for(start=a.time_from, end=datetime.now(timezone.utc), pph=pht) if prize != a.prize: a.prize = prize return t