From bc277483965a604153d5d2bee91b015ed0026cfb Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Sat, 15 Oct 2022 23:28:46 +0100 Subject: [PATCH] Parse Drakdoo response into model fields --- core/lib/serde/drakdoo.py | 5 ++++- core/models.py | 11 ++++++++++- core/templates/registration/login.html | 2 +- core/views/hooks.py | 27 ++++++++++++++++++-------- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/core/lib/serde/drakdoo.py b/core/lib/serde/drakdoo.py index 8a1bb1c..5571c76 100644 --- a/core/lib/serde/drakdoo.py +++ b/core/lib/serde/drakdoo.py @@ -1,18 +1,21 @@ from serde import Model, fields + class Market(Model): exchange = fields.Str() item = fields.Str() currency = fields.Str() contract = fields.Str() + class Timestamp(Model): sent = fields.DateTime() trade = fields.DateTime() + class BaseDrakdoo(Model): title = fields.Str() message = fields.Str() period = fields.Str() market = fields.Nested(Market) - timestamp = fields.Nested(Timestamp) \ No newline at end of file + timestamp = fields.Nested(Timestamp) diff --git a/core/models.py b/core/models.py index 6b1e15f..55c3f1b 100644 --- a/core/models.py +++ b/core/models.py @@ -83,7 +83,16 @@ class Hook(models.Model): class Callback(models.Model): hook = models.ForeignKey(Hook, on_delete=models.CASCADE) - data = models.JSONField() + title = models.CharField(max_length=1024, null=True, blank=True) + message = models.CharField(max_length=1024, null=True, blank=True) + period = models.CharField(max_length=255, null=True, blank=True) + market = models.CharField(max_length=255, null=True, blank=True) + timestamp_sent = models.DateTimeField(null=True, blank=True) + timestamp_trade = models.DateTimeField(null=True, blank=True) + market_exchange = models.CharField(max_length=255, null=True, blank=True) + market_item = models.CharField(max_length=255, null=True, blank=True) + market_currency = models.CharField(max_length=255, null=True, blank=True) + market_contract = models.CharField(max_length=255, null=True, blank=True) # class Perms(models.Model): diff --git a/core/templates/registration/login.html b/core/templates/registration/login.html index 8bde98d..eefea58 100644 --- a/core/templates/registration/login.html +++ b/core/templates/registration/login.html @@ -21,5 +21,5 @@ - + \ {% endblock %} diff --git a/core/views/hooks.py b/core/views/hooks.py index aef3d0f..e4f3c69 100644 --- a/core/views/hooks.py +++ b/core/views/hooks.py @@ -7,16 +7,16 @@ from django.shortcuts import render from django.views import View from rest_framework.parsers import FormParser, JSONParser from rest_framework.views import APIView +from serde import ValidationError +from util import log from core.forms import HookForm -from core.models import Callback, Hook - from core.lib.serde import drakdoo -from serde import ValidationError -from util import log +from core.models import Callback, Hook log = log.get_logger(__name__) + def get_hooks(user): hooks = Hook.objects.filter(user=user) return hooks @@ -41,6 +41,20 @@ class HookAPI(APIView): log.error(f"HookAPI POST: {e}") return HttpResponseBadRequest(e) + data = { + "title": hook_resp.title, + "message": hook_resp.message, + "period": hook_resp.period, + "market": hook_resp.market, + "timestamp_sent": hook_resp.timestamp.sent, + "timestamp_trade": hook_resp.timestamp.trade, + "market_exchange": hook_resp.market.exchange, + "market_item": hook_resp.market.item, + "market_currency": hook_resp.market.currency, + "market_contract": hook_resp.market.contract, + } + log.debug("HookAPI callback: data: %s", data) + # Try getting the hook try: hook = Hook.objects.get(hook=hook_name) @@ -48,10 +62,7 @@ class HookAPI(APIView): return HttpResponseBadRequest("Hook does not exist.") # Create the callback object - callback = Callback.objects.create( - hook=hook, - data=request.data, - ) + callback = Callback.objects.create(hook=hook, **data) callback.save() # Bump received count hook.received = hook.received + 1