From fe6472b73d9de78953eb3bc1856cb4cc09e25ecb Mon Sep 17 00:00:00 2001 From: Tomasz Torcz Date: Tue, 4 Jun 2024 21:02:48 +0200 Subject: [PATCH] compatibility fixes for the database schema When using PostgreSQL: - `CharField()` is limited to 255 character; use `TextField()` - `IntegerField()` is signed, current unix timestamps exceeds its range; use correct TimestampField() --- src/api.py | 6 +++--- src/moj_licznik.py | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/api.py b/src/api.py index d050ca5..9fc5920 100644 --- a/src/api.py +++ b/src/api.py @@ -207,7 +207,7 @@ def charts(): zone = request.args.get('zone', None) negative = request.args.get('negative', type=bool, default=False) logger.debug(f"API: GET /charts - {start_date} - {end_date}") - query = MainChartTable.select().where((MainChartTable.tm >= int(start_date)) & (MainChartTable.tm <= int(end_date))) + query = MainChartTable.select().where((MainChartTable.tm >= int(start_date)/1000) & (MainChartTable.tm <= int(end_date)/1000)) logger.debug(f"{query}") factor = 1 if negative: @@ -226,13 +226,13 @@ def charts(): charts = [] for p in result_ppes: - czas = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(p.tm/1000)) + czas = p.tm.strftime("%Y-%m-%d %H:%M:%S") chart = { 'mp': p.mp, 'meter_type': p.meter_type, 'meter_type_url': urllib.parse.quote_plus(p.meter_type), 'zone': p.zone, - 'time_tm': p.tm, + 'time_tm': int(p.tm.timestamp()*1000), 'time': czas, 'value': p.value * factor } diff --git a/src/moj_licznik.py b/src/moj_licznik.py index 4f17746..7ecfdc0 100644 --- a/src/moj_licznik.py +++ b/src/moj_licznik.py @@ -5,7 +5,7 @@ import http.cookiejar as cookiejar from requests.exceptions import HTTPError from bs4 import BeautifulSoup from enum import Enum -from peewee import AutoField, Model, CharField, IntegerField, DateField, BooleanField, CompositeKey, DecimalField, ForeignKeyField, SQL +from peewee import AutoField, Model, CharField, IntegerField, DateField, BooleanField, CompositeKey, DecimalField, ForeignKeyField, SQL, TextField, TimestampField import urllib.parse logger = logging.getLogger("energaMeter") @@ -31,7 +31,7 @@ class PPETable(Model): class Meta: database = db table_name = 'PPE' - constraints = [SQL('UNIQUE (ppe, tariffCode)')] + constraints = [SQL('UNIQUE ("ppe", "tariffCode")')] class MeterTable(Model): id = AutoField() # Meter point @@ -43,7 +43,7 @@ class MeterTable(Model): class Meta: database = db table_name = 'METER' - constraints = [SQL('UNIQUE (ppe_id, meter_type)')] + constraints = [SQL('UNIQUE ("ppe_id", "meter_type")')] class CounterTable(Model): id = AutoField() @@ -71,7 +71,7 @@ class ChartTable(Model): year = IntegerField() month = IntegerField(null=True) day = IntegerField(null=True) - value =CharField() + value = TextField() class Meta: database = db @@ -82,7 +82,7 @@ class MainChartTable(Model): mp = CharField() meter_type = CharField() zone = IntegerField() - tm = IntegerField() + tm = TimestampField() value = DecimalField(max_digits=20, decimal_places=16, null=True) tarAvg = DecimalField(max_digits=20, decimal_places=16, null=True) est = BooleanField(default=False) @@ -360,16 +360,17 @@ class MojLicznik: try: logger.debug(f"save_main_charts: mp: {mp}, val: {val}, meter_type: {m_type}") z = val["zones"] + tm = int(val["tm"]) / 1000 # convert JS timestamp (milliseconds) to unix (seconds) if z[0]: # MainChartTable.get_or_create(tm = val["tm"], zone = 1, value = z[0], tarAvg=val["tarAvg"], est=val["est"], cplt=val["cplt"]) try: - existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == val["tm"]) & (MainChartTable.zone == 1)) + existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == tm) & (MainChartTable.zone == 1)) except MainChartTable.DoesNotExist: # Jeśli rekord nie istnieje, utwórz nowy MainChartTable.create( mp=mp, meter_type=m_type, - tm=val["tm"], + tm=tm, zone=1, value=z[0], tarAvg=val["tarAvg"], @@ -379,13 +380,13 @@ class MojLicznik: if z[1]: try: - existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == val["tm"]) & (MainChartTable.zone == 2)) + existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == tm) & (MainChartTable.zone == 2)) except MainChartTable.DoesNotExist: # Jeśli rekord nie istnieje, utwórz nowy MainChartTable.create( mp=mp, meter_type=m_type, - tm=val["tm"], + tm=tm, zone=2, value=z[1], tarAvg=val["tarAvg"], @@ -395,13 +396,13 @@ class MojLicznik: if z[2]: try: - existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == val["tm"]) & (MainChartTable.zone == 3)) + existing_record = MainChartTable.get((MainChartTable.meter_type == m_type) & (MainChartTable.mp == mp) & (MainChartTable.tm == tm) & (MainChartTable.zone == 3)) except MainChartTable.DoesNotExist: # Jeśli rekord nie istnieje, utwórz nowy MainChartTable.create( mp=mp, meter_type=m_type, - tm=val["tm"], + tm=tm, zone=3, value=z[2], tarAvg=val["tarAvg"],