added Menu actions to API

Merge branch 'PR57' into develop
pull/58/MERGE
13621160019@163.com 2021-08-01 12:13:36 +08:00
commit ec5ad8792c
4 changed files with 383 additions and 2 deletions

View File

@ -2904,6 +2904,105 @@
} }
] ]
}, },
{
"name": "Menu",
"item": [
{
"name": "GET All Menus",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{base_url}}/menus",
"host": [
"{{base_url}}"
],
"path": [
"menus"
]
}
},
"response": []
},
{
"name": "GET Menu by ID",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{base_url}}/menus/1",
"host": [
"{{base_url}}"
],
"path": [
"menus",
"1"
]
}
},
"response": []
},
{
"name": "PUT Update a Menu",
"request": {
"method": "PUT",
"header": [],
"body": {
"mode": "raw",
"raw": "{\"data\":{\"is_hidden\":true}}"
},
"url": {
"raw": "{{base_url}}/menus/1",
"host": [
"{{base_url}}"
],
"path": [
"menus",
"1"
]
}
},
"response": []
},
{
"name": "GET All Children of Menu by ID",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{base_url}}/menus/100/children",
"host": [
"{{base_url}}"
],
"path": [
"menus",
"100",
"children"
]
}
},
"response": []
},
{
"name": "GET All Menus for Web UI",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{base_url}}/menus/web",
"host": [
"{{base_url}}"
],
"path": [
"menus",
"web"
]
}
},
"response": []
}
]
},
{ {
"name": "Meter", "name": "Meter",
"item": [ "item": [

View File

@ -159,7 +159,7 @@ View in Postman: import the file MyEMS.postman_collection.json with Postman
[Data Source](#Data-Source) | [Point](#Point) [Data Source](#Data-Source) | [Point](#Point)
[Tariff](#Tariff) | [Cost Center](#Cost-Center) | [Cost File](#Offline-Cost-File) [Tariff](#Tariff) | [Cost Center](#Cost-Center) | [Cost File](#Cost-File)
[Meter](#Meter) | [Virtual Meter](#Virtual-Meter) | [Offline Meter](#Offline-Meter) | [Offline Meter File](#Offline-Meter-File) [Meter](#Meter) | [Virtual Meter](#Virtual-Meter) | [Offline Meter](#Offline-Meter) | [Offline Meter File](#Offline-Meter-File)
@ -179,6 +179,8 @@ View in Postman: import the file MyEMS.postman_collection.json with Postman
[Timezone](#Timezone) [Timezone](#Timezone)
[Menu](#Menu)
[Knowledge File](#Knowledge-File) [Knowledge File](#Knowledge-File)
[Reports](#Reports) [Reports](#Reports)
@ -953,6 +955,39 @@ $ curl -i -H "Content-Type: application/TBD" -X POST -d 'file: (binary)' {{base_
$ curl -i -X GET {{base_url}}/knowledgefiles/{id}/restore $ curl -i -X GET {{base_url}}/knowledgefiles/{id}/restore
``` ```
### Menu
* GET Menu by ID
```bash
$ curl -i -X GET {{base_url}}/menus/{id}
```
Result
| Name | Data Type | Description |
|---------------|-----------|-------------------------------------------|
| id | integer | Menu ID |
| name | string | Menu name |
| path | string | Menu path |
| parent_menu_id| integer | Parent Menu ID |
| is_hidden | boolean | The menu status| |
* GET All Menus
```bash
$ curl -i -X GET {{base_url}}/menus
```
* PUT Update a Menu
```bash
$ curl -i -H "Content-Type: application/json" -X PUT -d '{"data":{"is_hidden": false}}' {{base_url}}/menus/{id}
```
* Get All Menus for Web UI
```bash
$ curl -i -X GET {{base_url}}/menus/web
```
* GET All Children of Menu by ID
```bash
$ curl -i -X GET {{base_url}}/menus/{id}/children
```
### Meter ### Meter
* GET Meter by ID * GET Meter by ID

View File

@ -5,7 +5,7 @@ from core import energyflowdiagram, privilege, textmessage, distributioncircuit,
costcenter, point, knowledgefile, meter, gsmmodem, tariff, user, storetype, timezone, \ costcenter, point, knowledgefile, meter, gsmmodem, tariff, user, storetype, timezone, \
costfile, offlinemeterfile, version, contact, emailserver, combinedequipment, datasource, equipment, tenant, shopfloor, \ costfile, offlinemeterfile, version, contact, emailserver, combinedequipment, datasource, equipment, tenant, shopfloor, \
webmessage, distributionsystem, store, emailmessage, tenanttype, wechatmessage, space, gateway, offlinemeter, \ webmessage, distributionsystem, store, emailmessage, tenanttype, wechatmessage, space, gateway, offlinemeter, \
rule, energycategory, sensor, energyitem, notification rule, energycategory, sensor, energyitem, notification, menu
from reports import advancedreport from reports import advancedreport
from reports import distributionsystem as distributionsystemreport from reports import distributionsystem as distributionsystemreport
from reports import energyflowdiagram as energyflowdiagramreport from reports import energyflowdiagram as energyflowdiagramreport
@ -244,6 +244,15 @@ api.add_route('/knowledgefiles/{id_}',
api.add_route('/knowledgefiles/{id_}/restore', api.add_route('/knowledgefiles/{id_}/restore',
knowledgefile.KnowledgeFileRestore()) knowledgefile.KnowledgeFileRestore())
api.add_route('/menus',
menu.MenuCollection())
api.add_route('/menus/{id_}',
menu.MenuItem())
api.add_route('/menus/{id_}/children',
menu.MenuChildrenCollection())
api.add_route('/menus/web',
menu.MenuWebCollection())
api.add_route('/meters', api.add_route('/meters',
meter.MeterCollection()) meter.MeterCollection())
api.add_route('/meters/{id_}', api.add_route('/meters/{id_}',

238
myems-api/core/menu.py Normal file
View File

@ -0,0 +1,238 @@
import falcon
import simplejson as json
import mysql.connector
import config
import uuid
from datetime import datetime
from anytree import AnyNode
from anytree.exporter import JsonExporter
class MenuCollection:
@staticmethod
def __init__():
pass
@staticmethod
def on_options(req, resp):
resp.status = falcon.HTTP_200
@staticmethod
def on_get(req, resp):
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor(dictionary=True)
query = (" SELECT id, path, name, parent_menu_id, is_hidden "
" FROM tbl_menus ")
cursor.execute(query)
rows_menus = cursor.fetchall()
result = list()
if rows_menus is not None and len(rows_menus) > 0:
for row in rows_menus:
temp = {"id": row['id'],
"path": row['path'],
"name": row['name'],
"parent_menu_id": row['parent_menu_id'],
"is_hidden": row['is_hidden']}
result.append(temp)
cursor.close()
cnx.disconnect()
resp.body = json.dumps(result)
class MenuItem:
@staticmethod
def __init__():
pass
@staticmethod
def on_options(req, resp, id_):
resp.status = falcon.HTTP_200
@staticmethod
def on_get(req, resp, id_):
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_MENU_ID')
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor(dictionary=True)
query = (" SELECT id, path, name, parent_menu_id, is_hidden "
" FROM tbl_menus "
" WHERE id=%s ")
cursor.execute(query, (id_,))
rows_menu = cursor.fetchone()
result = None
if rows_menu is not None and len(rows_menu) > 0:
result = {"id": rows_menu['id'],
"path": rows_menu['path'],
"name": rows_menu['name'],
"parent_menu_id": rows_menu['parent_menu_id'],
"is_hidden": rows_menu['is_hidden']}
cursor.close()
cnx.disconnect()
resp.body = json.dumps(result)
@staticmethod
def on_put(req, resp, id_):
"""Handles PUT requests"""
try:
raw_json = req.stream.read().decode('utf-8')
except Exception as ex:
raise falcon.HTTPError(falcon.HTTP_400, title='API.EXCEPTION', description=ex)
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_MENU_ID')
new_values = json.loads(raw_json)
if 'is_hidden' not in new_values['data'].keys() or \
not isinstance(new_values['data']['is_hidden'], bool):
raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_IS_HIDDEN')
is_hidden = new_values['data']['is_hidden']
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor()
update_row = (" UPDATE tbl_menus "
" SET is_hidden = %s "
" WHERE id = %s ")
cursor.execute(update_row, (is_hidden,
id_))
cnx.commit()
cursor.close()
cnx.disconnect()
resp.status = falcon.HTTP_200
class MenuChildrenCollection:
@staticmethod
def __init__():
pass
@staticmethod
def on_options(req, resp, id_):
resp.status = falcon.HTTP_200
@staticmethod
def on_get(req, resp, id_):
if not id_.isdigit() or int(id_) <= 0:
raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST',
description='API.INVALID_MENU_ID')
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor(dictionary=True)
query = (" SELECT id, path, name, parent_menu_id, is_hidden "
" FROM tbl_menus "
" WHERE id = %s ")
cursor.execute(query, (id_,))
row_current_menu = cursor.fetchone()
if row_current_menu is None:
cursor.close()
cnx.disconnect()
raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND',
description='API.MENU_NOT_FOUND')
current_menu = None
current_menu_id = None
if row_current_menu is not None and len(row_current_menu) > 0:
current_menu = {"id": row_current_menu['id'],
"path": row_current_menu['path'],
"name": row_current_menu['name'],
"parent_menu_id": row_current_menu['parent_menu_id'],
"is_hidden": row_current_menu['is_hidden']}
current_menu_id = row_current_menu['id']
query = (" SELECT id, path, name, parent_menu_id, is_hidden"
" FROM tbl_menus "
" WHERE parent_menu_id = %s")
cursor.execute(query, (current_menu_id,))
rows_menus = cursor.fetchall()
children_menus = []
if rows_menus is not None and len(rows_menus) > 0:
for row in rows_menus:
children_menus.append(
{
"id": row['id'],
"path": row['path'],
"name": row['name'],
"parent_menu": current_menu,
"is_hidden": row['is_hidden']
}
)
result = {
"current": current_menu,
"children": children_menus,
}
cursor.close()
cnx.disconnect()
resp.body = json.dumps(result)
class MenuWebCollection:
@staticmethod
def __init__():
pass
@staticmethod
def on_options(req, resp):
resp.status = falcon.HTTP_200
@staticmethod
def on_get(req, resp):
cnx = mysql.connector.connect(**config.myems_system_db)
cursor = cnx.cursor(dictionary=True)
query = (" SELECT id, path, parent_menu_id, is_hidden "
" FROM tbl_menus "
" WHERE parent_menu_id is NULL "
" AND is_hidden=0 ")
cursor.execute(query)
rows_menus = cursor.fetchall()
first_paths = {}
if rows_menus is not None and len(rows_menus) > 0:
for row in rows_menus:
_id = row['id']
path = row['path']
first_paths[_id] = {
'path': path,
'children': []
}
query = (" SELECT id, path, parent_menu_id, is_hidden "
" FROM tbl_menus "
" WHERE parent_menu_id is not NULL "
" AND is_hidden=0 ")
cursor.execute(query)
rows_menus = cursor.fetchall()
if rows_menus is not None and len(rows_menus) > 0:
for row in rows_menus:
_id = row['id']
parent_menu_id = row['parent_menu_id']
path = row['path']
if parent_menu_id in first_paths.keys():
first_paths[parent_menu_id]['children'].append(path)
result = dict()
for _id, item in first_paths.items():
first_path = item['path']
children = item['children']
result[first_path] = children
cursor.close()
cnx.disconnect()
resp.body = json.dumps(result)