From 83758854681c7be2c102dabc1de7df2a19d1f8d5 Mon Sep 17 00:00:00 2001 From: Caozhenhui <823914102@qq.com> Date: Wed, 15 Dec 2021 14:40:13 +0800 Subject: [PATCH 1/3] If the login is successful, failed login count is cleared --- admin/views/users/user/user.html | 2 +- myems-api/core/user.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/admin/views/users/user/user.html b/admin/views/users/user/user.html index 41c399bc..eae9dd2d 100644 --- a/admin/views/users/user/user.html +++ b/admin/views/users/user/user.html @@ -36,7 +36,7 @@ {{'SETTING.EDIT' | translate}} {{'USER.RESET_PASSWORD' | translate}} {{'SETTING.DELETE' | translate}} - {{'SETTING.UNLOCK' | translate}} + {{'SETTING.UNLOCK' | translate}} diff --git a/myems-api/core/user.py b/myems-api/core/user.py index 69df28de..fae74f6a 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -27,7 +27,7 @@ class UserCollection: cursor = cnx.cursor() query = (" SELECT u.id, u.name, u.display_name, u.uuid, " " u.email, u.is_admin, p.id, p.name, " - " u.account_expiration_datetime_utc, u.password_expiration_datetime_utc " + " u.account_expiration_datetime_utc, u.password_expiration_datetime_utc, u.failed_login_count " " FROM tbl_users u " " LEFT JOIN tbl_privileges p ON u.privilege_id = p.id " " ORDER BY u.name ") @@ -59,7 +59,8 @@ class UserCollection: "account_expiration_datetime": account_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), "password_expiration_datetime": - password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S')} + password_expiration_datetime_local.strftime('%Y-%m-%dT%H:%M:%S'), + "failed_login_count": row[10]} result.append(meta_result) resp.text = json.dumps(result) @@ -523,6 +524,14 @@ class UserLogin: cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_PASSWORD') + if failed_login_count != 0: + update_failed_login_count = (" UPDATE tbl_users " + " SET failed_login_count = 0 " + " WHERE uuid = %s ") + user_uuid = result['uuid'] + cursor.execute(update_failed_login_count, (user_uuid, )) + cnx.commit() + if result['account_expiration_datetime_utc'] <= datetime.utcnow(): cursor.close() cnx.disconnect() From 82a9735a776b9ac4d9353041ec3d306b4c6dd89c Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 16 Dec 2021 21:57:16 +0800 Subject: [PATCH 2/3] added maximum_failed_login_count to config in api --- myems-api/config.py | 163 ++++++++++++++--------------------------- myems-api/core/user.py | 8 +- 2 files changed, 57 insertions(+), 114 deletions(-) diff --git a/myems-api/config.py b/myems-api/config.py index 29b019ae..3a9bb99b 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -1,154 +1,97 @@ from decouple import config -MYEMS_SYSTEM_DB_HOST = config('MYEMS_SYSTEM_DB_HOST', default='127.0.0.1') -MYEMS_SYSTEM_DB_PORT = config('MYEMS_SYSTEM_DB_PORT', default=3306, cast=int) -MYEMS_SYSTEM_DB_DATABASE = config('MYEMS_SYSTEM_DB_DATABASE', default='myems_system_db') -MYEMS_SYSTEM_DB_USER = config('MYEMS_SYSTEM_DB_USER', default='root') -MYEMS_SYSTEM_DB_PASSWORD = config('MYEMS_SYSTEM_DB_PASSWORD', default='!MyEMS1') - -MYEMS_ENERGY_DB_HOST = config('MYEMS_ENERGY_DB_HOST', default='127.0.0.1') -MYEMS_ENERGY_DB_PORT = config('MYEMS_ENERGY_DB_PORT', default=3306, cast=int) -MYEMS_ENERGY_DB_DATABASE = config('MYEMS_ENERGY_DB_DATABASE', default='myems_energy_db') -MYEMS_ENERGY_DB_USER = config('MYEMS_ENERGY_DB_USER', default='root') -MYEMS_ENERGY_DB_PASSWORD = config('MYEMS_ENERGY_DB_PASSWORD', default='!MyEMS1') - -MYEMS_ENERGY_BASELINE_DB_HOST = config('MYEMS_ENERGY_BASELINE_DB_HOST', default='127.0.0.1') -MYEMS_ENERGY_BASELINE_DB_PORT = config('MYEMS_ENERGY_BASELINE_DB_PORT', default=3306, cast=int) -MYEMS_ENERGY_BASELINE_DB_DATABASE = config('MYEMS_ENERGY_BASELINE_DB_DATABASE', default='myems_energy_baseline_db') -MYEMS_ENERGY_BASELINE_DB_USER = config('MYEMS_ENERGY_BASELINE_DB_USER', default='root') -MYEMS_ENERGY_BASELINE_DB_PASSWORD = config('MYEMS_ENERGY_BASELINE_DB_PASSWORD', default='!MyEMS1') - -MYEMS_BILLING_DB_HOST = config('MYEMS_BILLING_DB_HOST', default='127.0.0.1') -MYEMS_BILLING_DB_PORT = config('MYEMS_BILLING_DB_PORT', default=3306, cast=int) -MYEMS_BILLING_DB_DATABASE = config('MYEMS_BILLING_DB_DATABASE', default='myems_billing_db') -MYEMS_BILLING_DB_USER = config('MYEMS_BILLING_DB_USER', default='root') -MYEMS_BILLING_DB_PASSWORD = config('MYEMS_BILLING_DB_PASSWORD', default='!MyEMS1') - -MYEMS_BILLING_BASELINE_DB_HOST = config('MYEMS_BILLING_BASELINE_DB_HOST', default='127.0.0.1') -MYEMS_BILLING_BASELINE_DB_PORT = config('MYEMS_BILLING_BASELINE_DB_PORT', default=3306, cast=int) -MYEMS_BILLING_BASELINE_DB_DATABASE = config('MYEMS_BILLING_BASELINE_DB_DATABASE', default='myems_billing_baseline_db') -MYEMS_BILLING_BASELINE_DB_USER = config('MYEMS_BILLING_BASELINE_DB_USER', default='root') -MYEMS_BILLING_BASELINE_DB_PASSWORD = config('MYEMS_BILLING_BASELINE_DB_PASSWORD', default='!MyEMS1') - -MYEMS_HISTORICAL_DB_HOST = config('MYEMS_HISTORICAL_DB_HOST', default='127.0.0.1') -MYEMS_HISTORICAL_DB_PORT = config('MYEMS_HISTORICAL_DB_PORT', default=3306, cast=int) -MYEMS_HISTORICAL_DB_DATABASE = config('MYEMS_HISTORICAL_DB_DATABASE', default='myems_historical_db') -MYEMS_HISTORICAL_DB_USER = config('MYEMS_HISTORICAL_DB_USER', default='root') -MYEMS_HISTORICAL_DB_PASSWORD = config('MYEMS_HISTORICAL_DB_PASSWORD', default='!MyEMS1') - -MYEMS_USER_DB_HOST = config('MYEMS_USER_DB_HOST', default='127.0.0.1') -MYEMS_USER_DB_PORT = config('MYEMS_USER_DB_PORT', default=3306, cast=int) -MYEMS_USER_DB_DATABASE = config('MYEMS_USER_DB_DATABASE', default='myems_user_db') -MYEMS_USER_DB_USER = config('MYEMS_USER_DB_USER', default='root') -MYEMS_USER_DB_PASSWORD = config('MYEMS_USER_DB_PASSWORD', default='!MyEMS1') - -MYEMS_FDD_DB_HOST = config('MYEMS_FDD_DB_HOST', default='127.0.0.1') -MYEMS_FDD_DB_PORT = config('MYEMS_FDD_DB_PORT', default=3306, cast=int) -MYEMS_FDD_DB_DATABASE = config('MYEMS_FDD_DB_DATABASE', default='myems_fdd_db') -MYEMS_FDD_DB_USER = config('MYEMS_FDD_DB_USER', default='root') -MYEMS_FDD_DB_PASSWORD = config('MYEMS_FDD_DB_PASSWORD', default='!MyEMS1') - -MYEMS_REPORTING_DB_HOST = config('MYEMS_REPORTING_DB_HOST', default='127.0.0.1') -MYEMS_REPORTING_DB_PORT = config('MYEMS_REPORTING_DB_PORT', default=3306, cast=int) -MYEMS_REPORTING_DB_DATABASE = config('MYEMS_REPORTING_DB_DATABASE', default='myems_reporting_db') -MYEMS_REPORTING_DB_USER = config('MYEMS_REPORTING_DB_USER', default='root') -MYEMS_REPORTING_DB_PASSWORD = config('MYEMS_REPORTING_DB_PASSWORD', default='!MyEMS1') - -MINUTES_TO_COUNT = config('MINUTES_TO_COUNT', default=60, cast=int) -UTC_OFFSET = config('UTC_OFFSET', default='+08:00') -WORKING_DAY_START_TIME_LOCAL = config('WORKING_DAY_START_TIME_LOCAL', default='00:00:00') -UPLOAD_PATH = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') -CURRENCY_UNIT = config('CURRENCY_UNIT', default='CNY') - myems_system_db = { - 'host': MYEMS_SYSTEM_DB_HOST, - 'port': MYEMS_SYSTEM_DB_PORT, - 'database': MYEMS_SYSTEM_DB_DATABASE, - 'user': MYEMS_SYSTEM_DB_USER, - 'password': MYEMS_SYSTEM_DB_PASSWORD, + 'host': config('MYEMS_SYSTEM_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_SYSTEM_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_SYSTEM_DB_DATABASE', default='myems_system_db'), + 'user': config('MYEMS_SYSTEM_DB_USER', default='root'), + 'password': config('MYEMS_SYSTEM_DB_PASSWORD', default='!MyEMS1'), } myems_energy_db = { - 'host': MYEMS_ENERGY_DB_HOST, - 'port': MYEMS_ENERGY_DB_PORT, - 'database': MYEMS_ENERGY_DB_DATABASE, - 'user': MYEMS_ENERGY_DB_USER, - 'password': MYEMS_ENERGY_DB_PASSWORD, + 'host': config('MYEMS_ENERGY_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_ENERGY_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_ENERGY_DB_DATABASE', default='myems_energy_db'), + 'user': config('MYEMS_ENERGY_DB_USER', default='root'), + 'password': config('MYEMS_ENERGY_DB_PASSWORD', default='!MyEMS1'), } myems_energy_baseline_db = { - 'host': MYEMS_ENERGY_BASELINE_DB_HOST, - 'port': MYEMS_ENERGY_BASELINE_DB_PORT, - 'database': MYEMS_ENERGY_BASELINE_DB_DATABASE, - 'user': MYEMS_ENERGY_BASELINE_DB_USER, - 'password': MYEMS_ENERGY_BASELINE_DB_PASSWORD, + 'host': config('MYEMS_ENERGY_BASELINE_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_ENERGY_BASELINE_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_ENERGY_BASELINE_DB_DATABASE', default='myems_energy_baseline_db'), + 'user': config('MYEMS_ENERGY_BASELINE_DB_USER', default='root'), + 'password': config('MYEMS_ENERGY_BASELINE_DB_PASSWORD', default='!MyEMS1'), } myems_billing_db = { - 'host': MYEMS_BILLING_DB_HOST, - 'port': MYEMS_BILLING_DB_PORT, - 'database': MYEMS_BILLING_DB_DATABASE, - 'user': MYEMS_BILLING_DB_USER, - 'password': MYEMS_BILLING_DB_PASSWORD, + 'host': config('MYEMS_BILLING_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_BILLING_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_BILLING_DB_DATABASE', default='myems_billing_db'), + 'user': config('MYEMS_BILLING_DB_USER', default='root'), + 'password': config('MYEMS_BILLING_DB_PASSWORD', default='!MyEMS1'), } myems_billing_baseline_db = { - 'host': MYEMS_BILLING_BASELINE_DB_HOST, - 'port': MYEMS_BILLING_BASELINE_DB_PORT, - 'database': MYEMS_BILLING_BASELINE_DB_DATABASE, - 'user': MYEMS_BILLING_BASELINE_DB_USER, - 'password': MYEMS_BILLING_BASELINE_DB_PASSWORD, + 'host': config('MYEMS_BILLING_BASELINE_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_BILLING_BASELINE_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_BILLING_BASELINE_DB_DATABASE', default='myems_billing_baseline_db'), + 'user': config('MYEMS_BILLING_BASELINE_DB_USER', default='root'), + 'password': config('MYEMS_BILLING_BASELINE_DB_PASSWORD', default='!MyEMS1'), } myems_historical_db = { - 'host': MYEMS_HISTORICAL_DB_HOST, - 'port': MYEMS_HISTORICAL_DB_PORT, - 'database': MYEMS_HISTORICAL_DB_DATABASE, - 'user': MYEMS_HISTORICAL_DB_USER, - 'password': MYEMS_HISTORICAL_DB_PASSWORD, + 'host': config('MYEMS_HISTORICAL_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_HISTORICAL_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_HISTORICAL_DB_DATABASE', default='myems_historical_db'), + 'user': config('MYEMS_HISTORICAL_DB_USER', default='root'), + 'password': config('MYEMS_HISTORICAL_DB_PASSWORD', default='!MyEMS1'), } myems_user_db = { - 'host': MYEMS_USER_DB_HOST, - 'port': MYEMS_USER_DB_PORT, - 'database': MYEMS_USER_DB_DATABASE, - 'user': MYEMS_USER_DB_USER, - 'password': MYEMS_USER_DB_PASSWORD, + 'host': config('MYEMS_USER_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_USER_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_USER_DB_DATABASE', default='myems_user_db'), + 'user': config('MYEMS_USER_DB_USER', default='root'), + 'password': config('MYEMS_USER_DB_PASSWORD', default='!MyEMS1'), } myems_fdd_db = { - 'host': MYEMS_FDD_DB_HOST, - 'port': MYEMS_FDD_DB_PORT, - 'database': MYEMS_FDD_DB_DATABASE, - 'user': MYEMS_FDD_DB_USER, - 'password': MYEMS_FDD_DB_PASSWORD, + 'host': config('MYEMS_FDD_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_FDD_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_FDD_DB_DATABASE', default='myems_fdd_db'), + 'user': config('MYEMS_FDD_DB_USER', default='root'), + 'password': config('MYEMS_FDD_DB_PASSWORD', default='!MyEMS1'), } myems_reporting_db = { - 'host': MYEMS_REPORTING_DB_HOST, - 'port': MYEMS_REPORTING_DB_PORT, - 'database': MYEMS_REPORTING_DB_DATABASE, - 'user': MYEMS_REPORTING_DB_USER, - 'password': MYEMS_REPORTING_DB_PASSWORD, + 'host': config('MYEMS_REPORTING_DB_HOST', default='127.0.0.1'), + 'port': config('MYEMS_REPORTING_DB_PORT', default=3306, cast=int), + 'database': config('MYEMS_REPORTING_DB_DATABASE', default='myems_reporting_db'), + 'user': config('MYEMS_REPORTING_DB_USER', default='root'), + 'password': config('MYEMS_REPORTING_DB_PASSWORD', default='!MyEMS1'), } # indicated in how many minutes to calculate meter energy consumption # 30 for half hourly period # 60 for hourly period -minutes_to_count = MINUTES_TO_COUNT +minutes_to_count = config('MINUTES_TO_COUNT', default=60, cast=int) # indicates the project's time zone offset from UTC -utc_offset = UTC_OFFSET +utc_offset = config('UTC_OFFSET', default='+08:00') # indicates from when ( in local timezone) of the day to calculate working days -working_day_start_time_local = WORKING_DAY_START_TIME_LOCAL +working_day_start_time_local = config('WORKING_DAY_START_TIME_LOCAL', default='00:00:00') # indicates where user uploaded files will be saved to # must use the root folder of myems-admin web application # for example if you serve myems-admin at /var/www/html/admin # you should set the upload_path as below -upload_path = UPLOAD_PATH +upload_path = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') # main currency unit -currency_unit = CURRENCY_UNIT +currency_unit = config('CURRENCY_UNIT', default='CNY') + +# maximum failed login count, otherwise the user should be locked +maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=6, cast=int) diff --git a/myems-api/core/user.py b/myems-api/core/user.py index fae74f6a..aefd2e83 100644 --- a/myems-api/core/user.py +++ b/myems-api/core/user.py @@ -504,7 +504,7 @@ class UserLogin: failed_login_count = result['failed_login_count'] - if failed_login_count >= 3: + if failed_login_count >= config.maximum_failed_login_count: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_HAS_BEEN_LOCKED') @@ -515,8 +515,8 @@ class UserLogin: if hashed_password != result['password']: update_failed_login_count = (" UPDATE tbl_users " - " SET failed_login_count = %s " - " WHERE uuid = %s ") + " SET failed_login_count = %s " + " WHERE uuid = %s ") user_uuid = result['uuid'] cursor.execute(update_failed_login_count, (failed_login_count + 1, user_uuid)) cnx.commit() @@ -895,7 +895,7 @@ class Unlock: raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.INVALID_Id') failed_login_count = row[0] - if failed_login_count < 3: + if failed_login_count < config.maximum_failed_login_count: cursor.close() cnx.disconnect() raise falcon.HTTPError(falcon.HTTP_400, 'API.BAD_REQUEST', 'API.USER_ACCOUNT_IS_NOT_LOCKED') From 33e6c24e286cc6f47d2ef632a4412419f744c7c2 Mon Sep 17 00:00:00 2001 From: "13621160019@163.com" <13621160019@163.com> Date: Thu, 16 Dec 2021 22:24:04 +0800 Subject: [PATCH 3/3] added unlock user into api and admin --- myems-api/MyEMS.postman_collection.json | 481 +++++++++++++++++++++--- myems-api/README.md | 8 +- myems-api/config.py | 2 +- 3 files changed, 439 insertions(+), 52 deletions(-) diff --git a/myems-api/MyEMS.postman_collection.json b/myems-api/MyEMS.postman_collection.json index c2514164..9700132c 100644 --- a/myems-api/MyEMS.postman_collection.json +++ b/myems-api/MyEMS.postman_collection.json @@ -4577,7 +4577,19 @@ "name": "POST Create New Offline Meter", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"OfflinePM21\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"空调用电\"}}" @@ -4598,19 +4610,31 @@ "name": "PUT Update a Offline Meter", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"OfflinePM201\", \"energy_category_id\":1, \"hourly_low_limit\":0.000, \"hourly_high_limit\":999.99, \"is_counted\":true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"空调用电\"}}" }, "url": { - "raw": "{{base_url}}/offlinemeters/6", + "raw": "{{base_url}}/offlinemeters/3", "host": [ "{{base_url}}" ], "path": [ "offlinemeters", - "6" + "3" ] } }, @@ -4620,15 +4644,27 @@ "name": "DELETE Offline Meter by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { - "raw": "{{base_url}}/offlinemeters/2", + "raw": "{{base_url}}/offlinemeters/3", "host": [ "{{base_url}}" ], "path": [ "offlinemeters", - "2" + "3" ] } }, @@ -5161,7 +5197,8 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any Admin User's UUID" }, { "key": "Token", @@ -5193,7 +5230,8 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any Admin User's UUID" }, { "key": "Token", @@ -5226,7 +5264,8 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any Admin User's UUID" }, { "key": "Token", @@ -6157,7 +6196,19 @@ "name": "POST Create New Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMSSpace\", \"parent_space_id\":1, \"area\":999.99, \"timezone_id\":56, \"is_input_counted\":true, \"is_output_counted\":false, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"Space description\"}}" @@ -6178,7 +6229,19 @@ "name": "PUT Update a Space", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"name\":\"MyEMSSpace\", \"parent_space_id\":2, \"area\":999.99, \"timezone_id\":56, \"is_input_counted\":true, \"is_output_counted\":true, \"contact_id\":1, \"cost_center_id\":1, \"description\":\"Space description\"}}" @@ -6200,7 +6263,19 @@ "name": "DELETE a Space by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/57", "host": [ @@ -6256,7 +6331,19 @@ "name": "POST Bind a Combined Equipment to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"combined_equipment_id\":1}}" @@ -6279,7 +6366,19 @@ "name": "DELETE a Combined Equipment from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/combinedequipments/1", "host": [ @@ -6318,7 +6417,19 @@ "name": "POST Bind an Equipment to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"equipment_id\":1}}" @@ -6341,7 +6452,19 @@ "name": "DELETE an Equipment from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/equipments/1", "host": [ @@ -6380,7 +6503,18 @@ "name": "POST Bind a Meter to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"meter_id\":1}}" @@ -6400,10 +6534,22 @@ "response": [] }, { - "name": "DELETE a Meter from Space", + "name": "DELETE Unbind a Meter from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/meters/1", "host": [ @@ -6442,7 +6588,19 @@ "name": "POST Bind an OfflineMeter to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"offline_meter_id\":1}}" @@ -6462,10 +6620,22 @@ "response": [] }, { - "name": "DELETE an Offline Meter from Space", + "name": "DELETE Unbind an Offline Meter from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/offlinemeters/1", "host": [ @@ -6504,7 +6674,19 @@ "name": "POST Bind a Point to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"point_id\":1}}" @@ -6524,10 +6706,22 @@ "response": [] }, { - "name": "DELETE a Point from Space", + "name": "DELETE Unbind a Point from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/points/3", "host": [ @@ -6566,7 +6760,19 @@ "name": "POST Bind a Sensor to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"sensor_id\":1}}" @@ -6586,10 +6792,22 @@ "response": [] }, { - "name": "DELETE a Sensor from Space", + "name": "DELETE Unbind a Sensor from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/sensors/1", "host": [ @@ -6628,7 +6846,19 @@ "name": "POST Bind a Shopfloor to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"shopfloor_id\":1}}" @@ -6648,10 +6878,22 @@ "response": [] }, { - "name": "DELETE a Shopfloor from a Space", + "name": "DELETE Unbind a Shopfloor from a Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/shopfloors/1", "host": [ @@ -6690,7 +6932,19 @@ "name": "POST Bind a Store to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"store_id\":1}}" @@ -6710,10 +6964,22 @@ "response": [] }, { - "name": "DELETE a Store from Space", + "name": "DELETE Unbind a Store from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/stores/1", "host": [ @@ -6752,7 +7018,19 @@ "name": "POST Bind a Tenant to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"tenant_id\":1}}" @@ -6772,10 +7050,22 @@ "response": [] }, { - "name": "DELETE a Tenant from Space", + "name": "DELETE Unbind a Tenant from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/tenants/1", "host": [ @@ -6814,7 +7104,19 @@ "name": "POST Bind a Virtual Meter to a Space", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", "raw": "{\"data\":{\"virtual_meter_id\":1}}" @@ -6834,10 +7136,22 @@ "response": [] }, { - "name": "DELETE a Virtual Meter from Space", + "name": "DELETE Unbind a Virtual Meter from Space", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/spaces/1/virtualmeters/1", "host": [ @@ -6861,11 +7175,12 @@ { "key": "User-UUID", "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", - "type": "text" + "type": "text", + "description": "Any User's UUID" }, { "key": "Token", - "value": "e1879592cb12e4cbf0e1762ed42edde699499cd9", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", "type": "text" } ], @@ -8721,7 +9036,7 @@ }, { "key": "Token", - "value": "50bc979c9181699bc33927aa04a453fd83e2b8e8280544bfc3807fdedf2645201676fe474787e0ea3024502659a2ab4b1905c6ca4f444ffdba764a603c4eb691", + "value": "6c32302cb46cae4236fe9d04ccb21f950bce593267f33dc169e700bb98ea5c3446521251a1b4078ebcbe51b4ca4ba59ac01b395e0f69ef42fa0bc36d6bd5683c", "description": "Login to get a valid token", "type": "text" } @@ -9030,6 +9345,38 @@ } }, "response": [] + }, + { + "name": "PUT Unlock User", + "request": { + "method": "PUT", + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4", + "type": "text", + "description": "Any admin users' UUID" + }, + { + "key": "Token", + "value": "6c32302cb46cae4236fe9d04ccb21f950bce593267f33dc169e700bb98ea5c3446521251a1b4078ebcbe51b4ca4ba59ac01b395e0f69ef42fa0bc36d6bd5683c", + "type": "text", + "description": "Login to get a valid token" + } + ], + "url": { + "raw": "{{base_url}}/users/unlock/2", + "host": [ + "{{base_url}}" + ], + "path": [ + "users", + "unlock", + "2" + ] + } + }, + "response": [] } ] }, @@ -9075,10 +9422,22 @@ "name": "POST Create New Virtual Meter", "request": { "method": "POST", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"VM10\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1+x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":3},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":4},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":5}] } }}" + "raw": "{\"data\":{\"name\":\"VM10\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1+x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":1},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":2},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":3}] } }}" }, "url": { "raw": "{{base_url}}/virtualmeters", @@ -9096,10 +9455,22 @@ "name": "PUT Update a Virtual Meter by ID", "request": { "method": "PUT", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "body": { "mode": "raw", - "raw": "{\"data\":{\"name\":\"VM51\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1-x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":3},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":4},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":5}] } }}" + "raw": "{\"data\":{\"name\":\"VM11\", \"energy_category_id\":1, \"is_counted\": true, \"cost_center_id\":1, \"energy_item_id\":1, \"description\":\"virtual description\", \"expression\": {\"equation\":\"x1+x2-x3\", \"variables\":[{\"name\":\"x1\", \"meter_type\":\"meter\", \"meter_id\":1},{\"name\":\"x2\", \"meter_type\":\"meter\", \"meter_id\":2},{\"name\":\"x3\", \"meter_type\":\"meter\", \"meter_id\":3}] } }}" }, "url": { "raw": "{{base_url}}/virtualmeters/3", @@ -9118,7 +9489,19 @@ "name": "DELETE a Virtual Meter by ID", "request": { "method": "DELETE", - "header": [], + "header": [ + { + "key": "User-UUID", + "value": "dcdb67d1-6116-4987-916f-6fc6cf2bc0e4 ", + "type": "text", + "description": "Any Admin User's UUID" + }, + { + "key": "Token", + "value": "2ac29271a9c58218ba88928dd13bccb3662f2b320152cc5ef52f76f2c2450f48c12bad4fbd4c7b03bd35686c70909894e5e3637b67198108f3e403d4a6ca8f55", + "type": "text" + } + ], "url": { "raw": "{{base_url}}/virtualmeters/3", "host": [ diff --git a/myems-api/README.md b/myems-api/README.md index 71fdd398..b7688aa0 100644 --- a/myems-api/README.md +++ b/myems-api/README.md @@ -1981,11 +1981,11 @@ curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKE ### User * GET All Users ```bash -curl -i -X GET {{base_url}}/users +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/users ``` * GET a User by ID ```bash -curl -i -X GET {{base_url}}/users/{id} +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -X GET {{base_url}}/users/{id} ``` * DELETE User by id ```bash @@ -2019,6 +2019,10 @@ curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKE ```bash curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT -d '{"data":{"name":"johnson","password":"NewPassword1"}}' {{base_url}}/users/resetpassword ``` +* PUT User Unlock +```bash +curl -i -H "User-UUID: 793f1bb4-6e25-4242-8cdc-2f662b25484f" -H "Token: GET-TOKEN-AFTER-LOGIN" -H "Content-Type: application/json" -X PUT {{base_url}}/users/unlock/{id} +``` ### Virtual Meter * GET a Virtual Meter by ID diff --git a/myems-api/config.py b/myems-api/config.py index 3a9bb99b..30a590f2 100644 --- a/myems-api/config.py +++ b/myems-api/config.py @@ -94,4 +94,4 @@ upload_path = config('UPLOAD_PATH', default='/var/www/html/admin/upload/') currency_unit = config('CURRENCY_UNIT', default='CNY') # maximum failed login count, otherwise the user should be locked -maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=6, cast=int) +maximum_failed_login_count = config('MAXIMUM_FAILED_LOGIN_COUNT', default=3, cast=int)