From 5ab0f47c96ee8b431d3778dd247060a0efd514db Mon Sep 17 00:00:00 2001
From: "13621160019@163.com" <13621160019@163.com>
Date: Mon, 22 Mar 2021 17:29:40 +0800
Subject: [PATCH] added last_run_datetime and next_run_datetime to rule in API
---
myems-api/README.md | 7 ++--
myems-api/core/rule.py | 79 +++++++++++++++++++++++++++---------------
2 files changed, 57 insertions(+), 29 deletions(-)
diff --git a/myems-api/README.md b/myems-api/README.md
index 6af162ae..dcd86d63 100644
--- a/myems-api/README.md
+++ b/myems-api/README.md
@@ -1164,13 +1164,16 @@ Result in JSON
| id | integer | Rule ID |
| name | string | Rule Name |
| uuid | string | Rule UUID |
-| fdd_code | string | SYSTEM01, SYSTEM02, ... SPACE01, SPACE02, ... METER01, METER02, ... |
-| category | string | SYSTEM, SPACE, METER, TENANT, STORE, SHOPFLOOR, EQUIPMENT, COMBINEDEQUIPMENT |
+| fdd_code | string | SYSTEM01, SYSTEM02, ..., REALTIME01, REALTIME02, ..., SPACE01, SPACE02, ... METER01, METER02, ... |
+| category | string | SYSTEM, REALTIME, SPACE, METER, TENANT, STORE, SHOPFLOOR, EQUIPMENT, COMBINEDEQUIPMENT |
| priority | string | CRITICAL, HIGH, MEDIUM, LOW |
| channel | string | WEB, EMAIL, SMS, WECHAT, CALL |
| expression | string | JSON string of diagnosed objects, points, values, and recipients |
| message_template | string | Plain text template that supports $-substitutions |
| is_enabled | boolean | Indicates if this rule is enabled |
+| last_run_datetime | float | null, or the number of milliseconds since January 1, 1970, 00:00:00, universal time |
+| next_run_datetime | float | null, or the number of milliseconds since January 1, 1970, 00:00:00, universal time |
+
```bash
$ curl -i -X GET {{base_url}}/rules/{id}
diff --git a/myems-api/core/rule.py b/myems-api/core/rule.py
index b7aa8865..e1c64102 100644
--- a/myems-api/core/rule.py
+++ b/myems-api/core/rule.py
@@ -1,8 +1,9 @@
import falcon
import json
import mysql.connector
-import config
import uuid
+from datetime import datetime, timezone, timedelta
+import config
class RuleCollection:
@@ -20,9 +21,9 @@ class RuleCollection:
cursor = cnx.cursor(dictionary=True)
query = (" SELECT id, name, uuid, "
- " fdd_code, category, priority, "
+ " category, fdd_code, priority, "
" channel, expression, message_template, "
- " is_enabled "
+ " is_enabled, last_run_datetime_utc, next_run_datetime_utc "
" FROM tbl_rules "
" ORDER BY id ")
cursor.execute(query)
@@ -33,11 +34,22 @@ class RuleCollection:
result = list()
if rows is not None and len(rows) > 0:
for row in rows:
+ last_run_datetime = None
+ if row['last_run_datetime_utc'] is not None:
+ last_run_datetime = row['last_run_datetime_utc'].replace(tzinfo=timezone.utc).timestamp() * 1000
+
+ next_run_datetime = None
+ if row['next_run_datetime_utc'] is not None:
+ next_run_datetime = row['next_run_datetime_utc'].replace(tzinfo=timezone.utc).timestamp() * 1000
+
meta_result = {"id": row['id'], "name": row['name'], "uuid": row['uuid'],
- "fdd_code": row['fdd_code'], "category": row['category'], "priority": row['priority'],
+ "category": row['category'], "fdd_code": row['fdd_code'], "priority": row['priority'],
"channel": row['channel'], "expression": row['expression'],
"message_template": row['message_template'].replace("
", ""),
- "is_enabled": bool(row['is_enabled'])}
+ "is_enabled": bool(row['is_enabled']),
+ "last_run_datetime": last_run_datetime,
+ "next_run_datetime": next_run_datetime,
+ }
result.append(meta_result)
resp.body = json.dumps(result)
@@ -58,6 +70,17 @@ class RuleCollection:
description='API.INVALID_RULE_NAME')
name = str.strip(new_values['data']['name'])
+ if 'category' not in new_values['data'].keys() or \
+ not isinstance(new_values['data']['category'], str) or \
+ len(str.strip(new_values['data']['category'])) == 0 or \
+ str.strip(new_values['data']['category']) not in \
+ ('SYSTEM', 'REALTIME', 'SPACE', 'METER', 'TENANT', 'STORE', 'SHOPFLOOR', 'EQUIPMENT',
+ 'COMBINEDEQUIPMENT'):
+ raise falcon.HTTPError(falcon.HTTP_400,
+ title='API.BAD_REQUEST',
+ description='API.INVALID_CATEGORY')
+ category = str.strip(new_values['data']['category'])
+
if 'fdd_code' not in new_values['data'].keys() or \
not isinstance(new_values['data']['fdd_code'], str) or \
len(str.strip(new_values['data']['fdd_code'])) == 0:
@@ -66,16 +89,6 @@ class RuleCollection:
description='API.INVALID_FDD_CODE')
fdd_code = str.strip(new_values['data']['fdd_code'])
- if 'category' not in new_values['data'].keys() or \
- not isinstance(new_values['data']['category'], str) or \
- len(str.strip(new_values['data']['category'])) == 0 or \
- str.strip(new_values['data']['category']) not in \
- ('SYSTEM', 'SPACE', 'METER', 'TENANT', 'STORE', 'SHOPFLOOR', 'EQUIPMENT', 'COMBINEDEQUIPMENT'):
- raise falcon.HTTPError(falcon.HTTP_400,
- title='API.BAD_REQUEST',
- description='API.INVALID_CATEGORY')
- category = str.strip(new_values['data']['category'])
-
if 'priority' not in new_values['data'].keys() or \
not isinstance(new_values['data']['priority'], str) or \
len(str.strip(new_values['data']['priority'])) == 0 or \
@@ -171,7 +184,8 @@ class RuleItem:
query = (" SELECT id, name, uuid, "
" fdd_code, category, priority, "
- " channel, expression, message_template, is_enabled "
+ " channel, expression, message_template, "
+ " is_enabled, last_run_datetime_utc, next_run_datetime_utc "
" FROM tbl_rules "
" WHERE id = %s ")
cursor.execute(query, (id_,))
@@ -181,12 +195,22 @@ class RuleItem:
if row is None:
raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND',
description='API.RULE_NOT_FOUND')
+ last_run_datetime = None
+ if row['last_run_datetime_utc'] is not None:
+ last_run_datetime = row['last_run_datetime_utc'].replace(tzinfo=timezone.utc).timestamp() * 1000
+
+ next_run_datetime = None
+ if row['next_run_datetime_utc'] is not None:
+ next_run_datetime = row['next_run_datetime_utc'].replace(tzinfo=timezone.utc).timestamp() * 1000
result = {"id": row['id'], "name": row['name'], "uuid": row['uuid'],
"fdd_code": row['fdd_code'], "category": row['category'], "priority": row['priority'],
"channel": row['channel'], "expression": row['expression'],
"message_template": row['message_template'].replace("
", ""),
- "is_enabled": bool(row['is_enabled'])}
+ "is_enabled": bool(row['is_enabled']),
+ "last_run_datetime": last_run_datetime,
+ "next_run_datetime": next_run_datetime,
+ }
resp.body = json.dumps(result)
@staticmethod
@@ -236,6 +260,17 @@ class RuleItem:
description='API.INVALID_RULE_NAME')
name = str.strip(new_values['data']['name'])
+ if 'category' not in new_values['data'].keys() or \
+ not isinstance(new_values['data']['category'], str) or \
+ len(str.strip(new_values['data']['category'])) == 0 or \
+ str.strip(new_values['data']['category']) not in \
+ ('SYSTEM', 'REALTIME', 'SPACE', 'METER', 'TENANT', 'STORE', 'SHOPFLOOR', 'EQUIPMENT',
+ 'COMBINEDEQUIPMENT'):
+ raise falcon.HTTPError(falcon.HTTP_400,
+ title='API.BAD_REQUEST',
+ description='API.INVALID_CATEGORY')
+ category = str.strip(new_values['data']['category'])
+
if 'fdd_code' not in new_values['data'].keys() or \
not isinstance(new_values['data']['fdd_code'], str) or \
len(str.strip(new_values['data']['fdd_code'])) == 0:
@@ -244,16 +279,6 @@ class RuleItem:
description='API.INVALID_FDD_CODE')
fdd_code = str.strip(new_values['data']['fdd_code'])
- if 'category' not in new_values['data'].keys() or \
- not isinstance(new_values['data']['category'], str) or \
- len(str.strip(new_values['data']['category'])) == 0 or \
- str.strip(new_values['data']['category']) not in \
- ('SYSTEM', 'SPACE', 'METER', 'TENANT', 'STORE', 'SHOPFLOOR', 'EQUIPMENT', 'COMBINEDEQUIPMENT'):
- raise falcon.HTTPError(falcon.HTTP_400,
- title='API.BAD_REQUEST',
- description='API.INVALID_CATEGORY')
- category = str.strip(new_values['data']['category'])
-
if 'priority' not in new_values['data'].keys() or \
not isinstance(new_values['data']['priority'], str) or \
len(str.strip(new_values['data']['priority'])) == 0 or \