@@ 993-1361 (lines=369) @@ | ||
990 | resp.location = '/combinedequipments/' + str(id_) + 'parameters/' + str(new_id) |
|
991 | ||
992 | ||
993 | class CombinedEquipmentParameterItem: |
|
994 | @staticmethod |
|
995 | def __init__(): |
|
996 | pass |
|
997 | ||
998 | @staticmethod |
|
999 | def on_options(req, resp, id_, pid): |
|
1000 | resp.status = falcon.HTTP_200 |
|
1001 | ||
1002 | @staticmethod |
|
1003 | def on_get(req, resp, id_, pid): |
|
1004 | if not id_.isdigit() or int(id_) <= 0: |
|
1005 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1006 | description='API.INVALID_COMBINED_EQUIPMENT_ID') |
|
1007 | ||
1008 | if not pid.isdigit() or int(pid) <= 0: |
|
1009 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1010 | description='API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID') |
|
1011 | ||
1012 | cnx = mysql.connector.connect(**config.myems_system_db) |
|
1013 | cursor = cnx.cursor(dictionary=True) |
|
1014 | ||
1015 | query = (" SELECT id, name " |
|
1016 | " FROM tbl_points ") |
|
1017 | cursor.execute(query) |
|
1018 | rows_points = cursor.fetchall() |
|
1019 | ||
1020 | point_dict = dict() |
|
1021 | if rows_points is not None and len(rows_points) > 0: |
|
1022 | for row in rows_points: |
|
1023 | point_dict[row['id']] = {"id": row['id'], |
|
1024 | "name": row['name']} |
|
1025 | ||
1026 | query = (" SELECT id, name, uuid " |
|
1027 | " FROM tbl_meters ") |
|
1028 | cursor.execute(query) |
|
1029 | rows_meters = cursor.fetchall() |
|
1030 | ||
1031 | meter_dict = dict() |
|
1032 | if rows_meters is not None and len(rows_meters) > 0: |
|
1033 | for row in rows_meters: |
|
1034 | meter_dict[row['uuid']] = {"type": 'meter', |
|
1035 | "id": row['id'], |
|
1036 | "name": row['name'], |
|
1037 | "uuid": row['uuid']} |
|
1038 | ||
1039 | query = (" SELECT id, name, uuid " |
|
1040 | " FROM tbl_offline_meters ") |
|
1041 | cursor.execute(query) |
|
1042 | rows_offline_meters = cursor.fetchall() |
|
1043 | ||
1044 | offline_meter_dict = dict() |
|
1045 | if rows_offline_meters is not None and len(rows_offline_meters) > 0: |
|
1046 | for row in rows_offline_meters: |
|
1047 | offline_meter_dict[row['uuid']] = {"type": 'offline_meter', |
|
1048 | "id": row['id'], |
|
1049 | "name": row['name'], |
|
1050 | "uuid": row['uuid']} |
|
1051 | ||
1052 | query = (" SELECT id, name, uuid " |
|
1053 | " FROM tbl_virtual_meters ") |
|
1054 | cursor.execute(query) |
|
1055 | rows_virtual_meters = cursor.fetchall() |
|
1056 | ||
1057 | virtual_meter_dict = dict() |
|
1058 | if rows_virtual_meters is not None and len(rows_virtual_meters) > 0: |
|
1059 | for row in rows_virtual_meters: |
|
1060 | virtual_meter_dict[row['uuid']] = {"type": 'virtual_meter', |
|
1061 | "id": row['id'], |
|
1062 | "name": row['name'], |
|
1063 | "uuid": row['uuid']} |
|
1064 | ||
1065 | query = (" SELECT id, name, parameter_type, " |
|
1066 | " constant, point_id, numerator_meter_uuid, denominator_meter_uuid " |
|
1067 | " FROM tbl_combined_equipments_parameters " |
|
1068 | " WHERE combined_equipment_id = %s AND id = %s ") |
|
1069 | cursor.execute(query, (id_, pid)) |
|
1070 | row = cursor.fetchone() |
|
1071 | cursor.close() |
|
1072 | cnx.disconnect() |
|
1073 | ||
1074 | if row is None: |
|
1075 | raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', |
|
1076 | description='API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH') |
|
1077 | else: |
|
1078 | constant = None |
|
1079 | point = None |
|
1080 | numerator_meter = None |
|
1081 | denominator_meter = None |
|
1082 | if row['parameter_type'] == 'point': |
|
1083 | point = point_dict.get(row['point_id'], None) |
|
1084 | constant = None |
|
1085 | numerator_meter = None |
|
1086 | denominator_meter = None |
|
1087 | elif row['parameter_type'] == 'constant': |
|
1088 | constant = row['constant'] |
|
1089 | point = None |
|
1090 | numerator_meter = None |
|
1091 | denominator_meter = None |
|
1092 | elif row['parameter_type'] == 'fraction': |
|
1093 | constant = None |
|
1094 | point = None |
|
1095 | # find numerator meter by uuid |
|
1096 | numerator_meter = meter_dict.get(row['numerator_meter_uuid'], None) |
|
1097 | if numerator_meter is None: |
|
1098 | numerator_meter = virtual_meter_dict.get(row['numerator_meter_uuid'], None) |
|
1099 | if numerator_meter is None: |
|
1100 | numerator_meter = offline_meter_dict.get(row['numerator_meter_uuid'], None) |
|
1101 | # find denominator meter by uuid |
|
1102 | denominator_meter = meter_dict.get(row['denominator_meter_uuid'], None) |
|
1103 | if denominator_meter is None: |
|
1104 | denominator_meter = virtual_meter_dict.get(row['denominator_meter_uuid'], None) |
|
1105 | if denominator_meter is None: |
|
1106 | denominator_meter = offline_meter_dict.get(row['denominator_meter_uuid'], None) |
|
1107 | ||
1108 | meta_result = {"id": row['id'], |
|
1109 | "name": row['name'], |
|
1110 | "parameter_type": row['parameter_type'], |
|
1111 | "constant": constant, |
|
1112 | "point": point, |
|
1113 | "numerator_meter": numerator_meter, |
|
1114 | "denominator_meter": denominator_meter} |
|
1115 | ||
1116 | resp.body = json.dumps(meta_result) |
|
1117 | ||
1118 | @staticmethod |
|
1119 | def on_delete(req, resp, id_, pid): |
|
1120 | if not id_.isdigit() or int(id_) <= 0: |
|
1121 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1122 | description='API.INVALID_COMBINED_EQUIPMENT_ID') |
|
1123 | ||
1124 | if not pid.isdigit() or int(pid) <= 0: |
|
1125 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1126 | description='API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID') |
|
1127 | ||
1128 | cnx = mysql.connector.connect(**config.myems_system_db) |
|
1129 | cursor = cnx.cursor() |
|
1130 | ||
1131 | cursor.execute(" SELECT name " |
|
1132 | " FROM tbl_combined_equipments " |
|
1133 | " WHERE id = %s ", |
|
1134 | (id_,)) |
|
1135 | row = cursor.fetchone() |
|
1136 | if row is None: |
|
1137 | cursor.close() |
|
1138 | cnx.disconnect() |
|
1139 | raise falcon.HTTPError(falcon.HTTP_400, |
|
1140 | title='API.NOT_FOUND', |
|
1141 | description='API.COMBINED_EQUIPMENT_NOT_FOUND') |
|
1142 | ||
1143 | cursor.execute(" SELECT name " |
|
1144 | " FROM tbl_combined_equipments_parameters " |
|
1145 | " WHERE combined_equipment_id = %s AND id = %s ", |
|
1146 | (id_, pid,)) |
|
1147 | row = cursor.fetchone() |
|
1148 | if row is None: |
|
1149 | cursor.close() |
|
1150 | cnx.disconnect() |
|
1151 | raise falcon.HTTPError(falcon.HTTP_400, |
|
1152 | title='API.NOT_FOUND', |
|
1153 | description='API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH') |
|
1154 | ||
1155 | cursor.execute(" DELETE FROM tbl_combined_equipments_parameters " |
|
1156 | " WHERE id = %s ", (pid, )) |
|
1157 | cnx.commit() |
|
1158 | ||
1159 | cursor.close() |
|
1160 | cnx.disconnect() |
|
1161 | ||
1162 | resp.status = falcon.HTTP_204 |
|
1163 | ||
1164 | @staticmethod |
|
1165 | def on_put(req, resp, id_, pid): |
|
1166 | """Handles POST requests""" |
|
1167 | if not id_.isdigit() or int(id_) <= 0: |
|
1168 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1169 | description='API.INVALID_COMBINED_EQUIPMENT_ID') |
|
1170 | ||
1171 | if not pid.isdigit() or int(pid) <= 0: |
|
1172 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1173 | description='API.INVALID_COMBINED_EQUIPMENT_PARAMETER_ID') |
|
1174 | ||
1175 | try: |
|
1176 | raw_json = req.stream.read().decode('utf-8') |
|
1177 | except Exception as ex: |
|
1178 | raise falcon.HTTPError(falcon.HTTP_400, title='API.ERROR', description=ex) |
|
1179 | ||
1180 | new_values = json.loads(raw_json, encoding='utf-8') |
|
1181 | ||
1182 | if 'name' not in new_values['data'].keys() or \ |
|
1183 | not isinstance(new_values['data']['name'], str) or \ |
|
1184 | len(str.strip(new_values['data']['name'])) == 0: |
|
1185 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1186 | description='API.INVALID_COMBINED_EQUIPMENT_PARAMETER_NAME') |
|
1187 | name = str.strip(new_values['data']['name']) |
|
1188 | ||
1189 | if 'parameter_type' not in new_values['data'].keys() or \ |
|
1190 | not isinstance(new_values['data']['parameter_type'], str) or \ |
|
1191 | len(str.strip(new_values['data']['parameter_type'])) == 0: |
|
1192 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1193 | description='API.INVALID_COMBINED_EQUIPMENT_PARAMETER_TYPE') |
|
1194 | ||
1195 | parameter_type = str.strip(new_values['data']['parameter_type']) |
|
1196 | ||
1197 | if parameter_type not in ('constant', 'point', 'fraction'): |
|
1198 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1199 | description='API.INVALID_COMBINED_EQUIPMENT_PARAMETER_TYPE') |
|
1200 | ||
1201 | constant = None |
|
1202 | if 'constant' in new_values['data'].keys(): |
|
1203 | if new_values['data']['constant'] is not None and \ |
|
1204 | isinstance(new_values['data']['constant'], str) and \ |
|
1205 | len(str.strip(new_values['data']['constant'])) > 0: |
|
1206 | constant = str.strip(new_values['data']['constant']) |
|
1207 | ||
1208 | point_id = None |
|
1209 | if 'point_id' in new_values['data'].keys(): |
|
1210 | if new_values['data']['point_id'] is not None and \ |
|
1211 | new_values['data']['point_id'] <= 0: |
|
1212 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1213 | description='API.INVALID_POINT_ID') |
|
1214 | point_id = new_values['data']['point_id'] |
|
1215 | ||
1216 | numerator_meter_uuid = None |
|
1217 | if 'numerator_meter_uuid' in new_values['data'].keys(): |
|
1218 | if new_values['data']['numerator_meter_uuid'] is not None and \ |
|
1219 | isinstance(new_values['data']['numerator_meter_uuid'], str) and \ |
|
1220 | len(str.strip(new_values['data']['numerator_meter_uuid'])) > 0: |
|
1221 | numerator_meter_uuid = str.strip(new_values['data']['numerator_meter_uuid']) |
|
1222 | ||
1223 | denominator_meter_uuid = None |
|
1224 | if 'denominator_meter_uuid' in new_values['data'].keys(): |
|
1225 | if new_values['data']['denominator_meter_uuid'] is not None and \ |
|
1226 | isinstance(new_values['data']['denominator_meter_uuid'], str) and \ |
|
1227 | len(str.strip(new_values['data']['denominator_meter_uuid'])) > 0: |
|
1228 | denominator_meter_uuid = str.strip(new_values['data']['denominator_meter_uuid']) |
|
1229 | ||
1230 | cnx = mysql.connector.connect(**config.myems_system_db) |
|
1231 | cursor = cnx.cursor(dictionary=True) |
|
1232 | ||
1233 | cursor.execute(" SELECT name " |
|
1234 | " FROM tbl_combined_equipments " |
|
1235 | " WHERE id = %s ", (id_,)) |
|
1236 | if cursor.fetchone() is None: |
|
1237 | cursor.close() |
|
1238 | cnx.disconnect() |
|
1239 | raise falcon.HTTPError(falcon.HTTP_400, title='API.NOT_FOUND', |
|
1240 | description='API.COMBINED_EQUIPMENT_NOT_FOUND') |
|
1241 | ||
1242 | cursor.execute(" SELECT name " |
|
1243 | " FROM tbl_combined_equipments_parameters " |
|
1244 | " WHERE combined_equipment_id = %s AND id = %s ", |
|
1245 | (id_, pid,)) |
|
1246 | row = cursor.fetchone() |
|
1247 | if row is None: |
|
1248 | cursor.close() |
|
1249 | cnx.disconnect() |
|
1250 | raise falcon.HTTPError(falcon.HTTP_400, |
|
1251 | title='API.NOT_FOUND', |
|
1252 | description='API.COMBINED_EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH') |
|
1253 | ||
1254 | cursor.execute(" SELECT name " |
|
1255 | " FROM tbl_combined_equipments_parameters " |
|
1256 | " WHERE name = %s AND combined_equipment_id = %s AND id != %s ", (name, id_, pid)) |
|
1257 | row = cursor.fetchone() |
|
1258 | if row is not None: |
|
1259 | cursor.close() |
|
1260 | cnx.disconnect() |
|
1261 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1262 | description='API.COMBINED_EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE') |
|
1263 | ||
1264 | # validate by parameter type |
|
1265 | if parameter_type == 'point': |
|
1266 | if point_id is None: |
|
1267 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1268 | description='API.INVALID_POINT_ID') |
|
1269 | ||
1270 | query = (" SELECT id, name " |
|
1271 | " FROM tbl_points " |
|
1272 | " WHERE id = %s ") |
|
1273 | cursor.execute(query, (point_id, )) |
|
1274 | row = cursor.fetchone() |
|
1275 | if row is None: |
|
1276 | cursor.close() |
|
1277 | cnx.disconnect() |
|
1278 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1279 | description='API.POINT_NOT_FOUND') |
|
1280 | ||
1281 | elif parameter_type == 'constant': |
|
1282 | if constant is None: |
|
1283 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1284 | description='API.INVALID_CONSTANT_VALUE') |
|
1285 | ||
1286 | elif parameter_type == 'fraction': |
|
1287 | ||
1288 | query = (" SELECT id, name, uuid " |
|
1289 | " FROM tbl_meters ") |
|
1290 | cursor.execute(query) |
|
1291 | rows_meters = cursor.fetchall() |
|
1292 | ||
1293 | meter_dict = dict() |
|
1294 | if rows_meters is not None and len(rows_meters) > 0: |
|
1295 | for row in rows_meters: |
|
1296 | meter_dict[row['uuid']] = {"type": 'meter', |
|
1297 | "id": row['id'], |
|
1298 | "name": row['name'], |
|
1299 | "uuid": row['uuid']} |
|
1300 | ||
1301 | query = (" SELECT id, name, uuid " |
|
1302 | " FROM tbl_offline_meters ") |
|
1303 | cursor.execute(query) |
|
1304 | rows_offline_meters = cursor.fetchall() |
|
1305 | ||
1306 | offline_meter_dict = dict() |
|
1307 | if rows_offline_meters is not None and len(rows_offline_meters) > 0: |
|
1308 | for row in rows_offline_meters: |
|
1309 | offline_meter_dict[row['uuid']] = {"type": 'offline_meter', |
|
1310 | "id": row['id'], |
|
1311 | "name": row['name'], |
|
1312 | "uuid": row['uuid']} |
|
1313 | ||
1314 | query = (" SELECT id, name, uuid " |
|
1315 | " FROM tbl_virtual_meters ") |
|
1316 | cursor.execute(query) |
|
1317 | rows_virtual_meters = cursor.fetchall() |
|
1318 | ||
1319 | virtual_meter_dict = dict() |
|
1320 | if rows_virtual_meters is not None and len(rows_virtual_meters) > 0: |
|
1321 | for row in rows_virtual_meters: |
|
1322 | virtual_meter_dict[row['uuid']] = {"type": 'virtual_meter', |
|
1323 | "id": row['id'], |
|
1324 | "name": row['name'], |
|
1325 | "uuid": row['uuid']} |
|
1326 | ||
1327 | # validate numerator meter uuid |
|
1328 | if meter_dict.get(numerator_meter_uuid) is None and \ |
|
1329 | virtual_meter_dict.get(numerator_meter_uuid) is None and \ |
|
1330 | offline_meter_dict.get(numerator_meter_uuid) is None: |
|
1331 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1332 | description='API.INVALID_NUMERATOR_METER_UUID') |
|
1333 | ||
1334 | # validate denominator meter uuid |
|
1335 | if denominator_meter_uuid == numerator_meter_uuid: |
|
1336 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1337 | description='API.INVALID_DENOMINATOR_METER_UUID') |
|
1338 | ||
1339 | if denominator_meter_uuid not in meter_dict and \ |
|
1340 | denominator_meter_uuid not in virtual_meter_dict and \ |
|
1341 | denominator_meter_uuid not in offline_meter_dict: |
|
1342 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1343 | description='API.INVALID_DENOMINATOR_METER_UUID') |
|
1344 | ||
1345 | add_values = (" UPDATE tbl_combined_equipments_parameters " |
|
1346 | " SET name = %s , parameter_type = %s, constant = %s, " |
|
1347 | " point_id = %s, numerator_meter_uuid = %s, denominator_meter_uuid =%s " |
|
1348 | " WHERE id = %s ") |
|
1349 | cursor.execute(add_values, (name, |
|
1350 | parameter_type, |
|
1351 | constant, |
|
1352 | point_id, |
|
1353 | numerator_meter_uuid, |
|
1354 | denominator_meter_uuid, |
|
1355 | pid)) |
|
1356 | cnx.commit() |
|
1357 | ||
1358 | cursor.close() |
|
1359 | cnx.disconnect() |
|
1360 | ||
1361 | resp.status = falcon.HTTP_200 |
|
1362 | ||
1363 | ||
1364 | class CombinedEquipmentMeterCollection: |
@@ 839-1207 (lines=369) @@ | ||
836 | resp.location = '/equipments/' + str(id_) + 'parameters/' + str(new_id) |
|
837 | ||
838 | ||
839 | class EquipmentParameterItem: |
|
840 | @staticmethod |
|
841 | def __init__(): |
|
842 | pass |
|
843 | ||
844 | @staticmethod |
|
845 | def on_options(req, resp, id_, pid): |
|
846 | resp.status = falcon.HTTP_200 |
|
847 | ||
848 | @staticmethod |
|
849 | def on_get(req, resp, id_, pid): |
|
850 | if not id_.isdigit() or int(id_) <= 0: |
|
851 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
852 | description='API.INVALID_EQUIPMENT_ID') |
|
853 | ||
854 | if not pid.isdigit() or int(pid) <= 0: |
|
855 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
856 | description='API.INVALID_EQUIPMENT_PARAMETER_ID') |
|
857 | ||
858 | cnx = mysql.connector.connect(**config.myems_system_db) |
|
859 | cursor = cnx.cursor(dictionary=True) |
|
860 | ||
861 | query = (" SELECT id, name " |
|
862 | " FROM tbl_points ") |
|
863 | cursor.execute(query) |
|
864 | rows_points = cursor.fetchall() |
|
865 | ||
866 | point_dict = dict() |
|
867 | if rows_points is not None and len(rows_points) > 0: |
|
868 | for row in rows_points: |
|
869 | point_dict[row['id']] = {"id": row['id'], |
|
870 | "name": row['name']} |
|
871 | ||
872 | query = (" SELECT id, name, uuid " |
|
873 | " FROM tbl_meters ") |
|
874 | cursor.execute(query) |
|
875 | rows_meters = cursor.fetchall() |
|
876 | ||
877 | meter_dict = dict() |
|
878 | if rows_meters is not None and len(rows_meters) > 0: |
|
879 | for row in rows_meters: |
|
880 | meter_dict[row['uuid']] = {"type": 'meter', |
|
881 | "id": row['id'], |
|
882 | "name": row['name'], |
|
883 | "uuid": row['uuid']} |
|
884 | ||
885 | query = (" SELECT id, name, uuid " |
|
886 | " FROM tbl_offline_meters ") |
|
887 | cursor.execute(query) |
|
888 | rows_offline_meters = cursor.fetchall() |
|
889 | ||
890 | offline_meter_dict = dict() |
|
891 | if rows_offline_meters is not None and len(rows_offline_meters) > 0: |
|
892 | for row in rows_offline_meters: |
|
893 | offline_meter_dict[row['uuid']] = {"type": 'offline_meter', |
|
894 | "id": row['id'], |
|
895 | "name": row['name'], |
|
896 | "uuid": row['uuid']} |
|
897 | ||
898 | query = (" SELECT id, name, uuid " |
|
899 | " FROM tbl_virtual_meters ") |
|
900 | cursor.execute(query) |
|
901 | rows_virtual_meters = cursor.fetchall() |
|
902 | ||
903 | virtual_meter_dict = dict() |
|
904 | if rows_virtual_meters is not None and len(rows_virtual_meters) > 0: |
|
905 | for row in rows_virtual_meters: |
|
906 | virtual_meter_dict[row['uuid']] = {"type": 'virtual_meter', |
|
907 | "id": row['id'], |
|
908 | "name": row['name'], |
|
909 | "uuid": row['uuid']} |
|
910 | ||
911 | query = (" SELECT id, name, parameter_type, " |
|
912 | " constant, point_id, numerator_meter_uuid, denominator_meter_uuid " |
|
913 | " FROM tbl_equipments_parameters " |
|
914 | " WHERE equipment_id = %s AND id = %s ") |
|
915 | cursor.execute(query, (id_, pid)) |
|
916 | row = cursor.fetchone() |
|
917 | cursor.close() |
|
918 | cnx.disconnect() |
|
919 | ||
920 | if row is None: |
|
921 | raise falcon.HTTPError(falcon.HTTP_404, title='API.NOT_FOUND', |
|
922 | description='API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH') |
|
923 | else: |
|
924 | constant = None |
|
925 | point = None |
|
926 | numerator_meter = None |
|
927 | denominator_meter = None |
|
928 | if row['parameter_type'] == 'point': |
|
929 | point = point_dict.get(row['point_id'], None) |
|
930 | constant = None |
|
931 | numerator_meter = None |
|
932 | denominator_meter = None |
|
933 | elif row['parameter_type'] == 'constant': |
|
934 | constant = row['constant'] |
|
935 | point = None |
|
936 | numerator_meter = None |
|
937 | denominator_meter = None |
|
938 | elif row['parameter_type'] == 'fraction': |
|
939 | constant = None |
|
940 | point = None |
|
941 | # find numerator meter by uuid |
|
942 | numerator_meter = meter_dict.get(row['numerator_meter_uuid'], None) |
|
943 | if numerator_meter is None: |
|
944 | numerator_meter = virtual_meter_dict.get(row['numerator_meter_uuid'], None) |
|
945 | if numerator_meter is None: |
|
946 | numerator_meter = offline_meter_dict.get(row['numerator_meter_uuid'], None) |
|
947 | # find denominator meter by uuid |
|
948 | denominator_meter = meter_dict.get(row['denominator_meter_uuid'], None) |
|
949 | if denominator_meter is None: |
|
950 | denominator_meter = virtual_meter_dict.get(row['denominator_meter_uuid'], None) |
|
951 | if denominator_meter is None: |
|
952 | denominator_meter = offline_meter_dict.get(row['denominator_meter_uuid'], None) |
|
953 | ||
954 | meta_result = {"id": row['id'], |
|
955 | "name": row['name'], |
|
956 | "parameter_type": row['parameter_type'], |
|
957 | "constant": constant, |
|
958 | "point": point, |
|
959 | "numerator_meter": numerator_meter, |
|
960 | "denominator_meter": denominator_meter} |
|
961 | ||
962 | resp.body = json.dumps(meta_result) |
|
963 | ||
964 | @staticmethod |
|
965 | def on_delete(req, resp, id_, pid): |
|
966 | if not id_.isdigit() or int(id_) <= 0: |
|
967 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
968 | description='API.INVALID_EQUIPMENT_ID') |
|
969 | ||
970 | if not pid.isdigit() or int(pid) <= 0: |
|
971 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
972 | description='API.INVALID_EQUIPMENT_PARAMETER_ID') |
|
973 | ||
974 | cnx = mysql.connector.connect(**config.myems_system_db) |
|
975 | cursor = cnx.cursor() |
|
976 | ||
977 | cursor.execute(" SELECT name " |
|
978 | " FROM tbl_equipments " |
|
979 | " WHERE id = %s ", |
|
980 | (id_,)) |
|
981 | row = cursor.fetchone() |
|
982 | if row is None: |
|
983 | cursor.close() |
|
984 | cnx.disconnect() |
|
985 | raise falcon.HTTPError(falcon.HTTP_400, |
|
986 | title='API.NOT_FOUND', |
|
987 | description='API.EQUIPMENT_NOT_FOUND') |
|
988 | ||
989 | cursor.execute(" SELECT name " |
|
990 | " FROM tbl_equipments_parameters " |
|
991 | " WHERE equipment_id = %s AND id = %s ", |
|
992 | (id_, pid,)) |
|
993 | row = cursor.fetchone() |
|
994 | if row is None: |
|
995 | cursor.close() |
|
996 | cnx.disconnect() |
|
997 | raise falcon.HTTPError(falcon.HTTP_400, |
|
998 | title='API.NOT_FOUND', |
|
999 | description='API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH') |
|
1000 | ||
1001 | cursor.execute(" DELETE FROM tbl_equipments_parameters " |
|
1002 | " WHERE id = %s ", (pid, )) |
|
1003 | cnx.commit() |
|
1004 | ||
1005 | cursor.close() |
|
1006 | cnx.disconnect() |
|
1007 | ||
1008 | resp.status = falcon.HTTP_204 |
|
1009 | ||
1010 | @staticmethod |
|
1011 | def on_put(req, resp, id_, pid): |
|
1012 | """Handles POST requests""" |
|
1013 | if not id_.isdigit() or int(id_) <= 0: |
|
1014 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1015 | description='API.INVALID_EQUIPMENT_ID') |
|
1016 | ||
1017 | if not pid.isdigit() or int(pid) <= 0: |
|
1018 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1019 | description='API.INVALID_EQUIPMENT_PARAMETER_ID') |
|
1020 | ||
1021 | try: |
|
1022 | raw_json = req.stream.read().decode('utf-8') |
|
1023 | except Exception as ex: |
|
1024 | raise falcon.HTTPError(falcon.HTTP_400, title='API.ERROR', description=ex) |
|
1025 | ||
1026 | new_values = json.loads(raw_json, encoding='utf-8') |
|
1027 | ||
1028 | if 'name' not in new_values['data'].keys() or \ |
|
1029 | not isinstance(new_values['data']['name'], str) or \ |
|
1030 | len(str.strip(new_values['data']['name'])) == 0: |
|
1031 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1032 | description='API.INVALID_EQUIPMENT_PARAMETER_NAME') |
|
1033 | name = str.strip(new_values['data']['name']) |
|
1034 | ||
1035 | if 'parameter_type' not in new_values['data'].keys() or \ |
|
1036 | not isinstance(new_values['data']['parameter_type'], str) or \ |
|
1037 | len(str.strip(new_values['data']['parameter_type'])) == 0: |
|
1038 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1039 | description='API.INVALID_EQUIPMENT_PARAMETER_TYPE') |
|
1040 | ||
1041 | parameter_type = str.strip(new_values['data']['parameter_type']) |
|
1042 | ||
1043 | if parameter_type not in ('constant', 'point', 'fraction'): |
|
1044 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1045 | description='API.INVALID_EQUIPMENT_PARAMETER_TYPE') |
|
1046 | ||
1047 | constant = None |
|
1048 | if 'constant' in new_values['data'].keys(): |
|
1049 | if new_values['data']['constant'] is not None and \ |
|
1050 | isinstance(new_values['data']['constant'], str) and \ |
|
1051 | len(str.strip(new_values['data']['constant'])) > 0: |
|
1052 | constant = str.strip(new_values['data']['constant']) |
|
1053 | ||
1054 | point_id = None |
|
1055 | if 'point_id' in new_values['data'].keys(): |
|
1056 | if new_values['data']['point_id'] is not None and \ |
|
1057 | new_values['data']['point_id'] <= 0: |
|
1058 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1059 | description='API.INVALID_POINT_ID') |
|
1060 | point_id = new_values['data']['point_id'] |
|
1061 | ||
1062 | numerator_meter_uuid = None |
|
1063 | if 'numerator_meter_uuid' in new_values['data'].keys(): |
|
1064 | if new_values['data']['numerator_meter_uuid'] is not None and \ |
|
1065 | isinstance(new_values['data']['numerator_meter_uuid'], str) and \ |
|
1066 | len(str.strip(new_values['data']['numerator_meter_uuid'])) > 0: |
|
1067 | numerator_meter_uuid = str.strip(new_values['data']['numerator_meter_uuid']) |
|
1068 | ||
1069 | denominator_meter_uuid = None |
|
1070 | if 'denominator_meter_uuid' in new_values['data'].keys(): |
|
1071 | if new_values['data']['denominator_meter_uuid'] is not None and \ |
|
1072 | isinstance(new_values['data']['denominator_meter_uuid'], str) and \ |
|
1073 | len(str.strip(new_values['data']['denominator_meter_uuid'])) > 0: |
|
1074 | denominator_meter_uuid = str.strip(new_values['data']['denominator_meter_uuid']) |
|
1075 | ||
1076 | cnx = mysql.connector.connect(**config.myems_system_db) |
|
1077 | cursor = cnx.cursor(dictionary=True) |
|
1078 | ||
1079 | cursor.execute(" SELECT name " |
|
1080 | " FROM tbl_equipments " |
|
1081 | " WHERE id = %s ", (id_,)) |
|
1082 | if cursor.fetchone() is None: |
|
1083 | cursor.close() |
|
1084 | cnx.disconnect() |
|
1085 | raise falcon.HTTPError(falcon.HTTP_400, title='API.NOT_FOUND', |
|
1086 | description='API.EQUIPMENT_NOT_FOUND') |
|
1087 | ||
1088 | cursor.execute(" SELECT name " |
|
1089 | " FROM tbl_equipments_parameters " |
|
1090 | " WHERE equipment_id = %s AND id = %s ", |
|
1091 | (id_, pid,)) |
|
1092 | row = cursor.fetchone() |
|
1093 | if row is None: |
|
1094 | cursor.close() |
|
1095 | cnx.disconnect() |
|
1096 | raise falcon.HTTPError(falcon.HTTP_400, |
|
1097 | title='API.NOT_FOUND', |
|
1098 | description='API.EQUIPMENT_PARAMETER_NOT_FOUND_OR_NOT_MATCH') |
|
1099 | ||
1100 | cursor.execute(" SELECT name " |
|
1101 | " FROM tbl_equipments_parameters " |
|
1102 | " WHERE name = %s AND equipment_id = %s AND id != %s ", (name, id_, pid)) |
|
1103 | row = cursor.fetchone() |
|
1104 | if row is not None: |
|
1105 | cursor.close() |
|
1106 | cnx.disconnect() |
|
1107 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1108 | description='API.EQUIPMENT_PARAMETER_NAME_IS_ALREADY_IN_USE') |
|
1109 | ||
1110 | # validate by parameter type |
|
1111 | if parameter_type == 'point': |
|
1112 | if point_id is None: |
|
1113 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1114 | description='API.INVALID_POINT_ID') |
|
1115 | ||
1116 | query = (" SELECT id, name " |
|
1117 | " FROM tbl_points " |
|
1118 | " WHERE id = %s ") |
|
1119 | cursor.execute(query, (point_id, )) |
|
1120 | row = cursor.fetchone() |
|
1121 | if row is None: |
|
1122 | cursor.close() |
|
1123 | cnx.disconnect() |
|
1124 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1125 | description='API.POINT_NOT_FOUND') |
|
1126 | ||
1127 | elif parameter_type == 'constant': |
|
1128 | if constant is None: |
|
1129 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1130 | description='API.INVALID_CONSTANT_VALUE') |
|
1131 | ||
1132 | elif parameter_type == 'fraction': |
|
1133 | ||
1134 | query = (" SELECT id, name, uuid " |
|
1135 | " FROM tbl_meters ") |
|
1136 | cursor.execute(query) |
|
1137 | rows_meters = cursor.fetchall() |
|
1138 | ||
1139 | meter_dict = dict() |
|
1140 | if rows_meters is not None and len(rows_meters) > 0: |
|
1141 | for row in rows_meters: |
|
1142 | meter_dict[row['uuid']] = {"type": 'meter', |
|
1143 | "id": row['id'], |
|
1144 | "name": row['name'], |
|
1145 | "uuid": row['uuid']} |
|
1146 | ||
1147 | query = (" SELECT id, name, uuid " |
|
1148 | " FROM tbl_offline_meters ") |
|
1149 | cursor.execute(query) |
|
1150 | rows_offline_meters = cursor.fetchall() |
|
1151 | ||
1152 | offline_meter_dict = dict() |
|
1153 | if rows_offline_meters is not None and len(rows_offline_meters) > 0: |
|
1154 | for row in rows_offline_meters: |
|
1155 | offline_meter_dict[row['uuid']] = {"type": 'offline_meter', |
|
1156 | "id": row['id'], |
|
1157 | "name": row['name'], |
|
1158 | "uuid": row['uuid']} |
|
1159 | ||
1160 | query = (" SELECT id, name, uuid " |
|
1161 | " FROM tbl_virtual_meters ") |
|
1162 | cursor.execute(query) |
|
1163 | rows_virtual_meters = cursor.fetchall() |
|
1164 | ||
1165 | virtual_meter_dict = dict() |
|
1166 | if rows_virtual_meters is not None and len(rows_virtual_meters) > 0: |
|
1167 | for row in rows_virtual_meters: |
|
1168 | virtual_meter_dict[row['uuid']] = {"type": 'virtual_meter', |
|
1169 | "id": row['id'], |
|
1170 | "name": row['name'], |
|
1171 | "uuid": row['uuid']} |
|
1172 | ||
1173 | # validate numerator meter uuid |
|
1174 | if meter_dict.get(numerator_meter_uuid) is None and \ |
|
1175 | virtual_meter_dict.get(numerator_meter_uuid) is None and \ |
|
1176 | offline_meter_dict.get(numerator_meter_uuid) is None: |
|
1177 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1178 | description='API.INVALID_NUMERATOR_METER_UUID') |
|
1179 | ||
1180 | # validate denominator meter uuid |
|
1181 | if denominator_meter_uuid == numerator_meter_uuid: |
|
1182 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1183 | description='API.INVALID_DENOMINATOR_METER_UUID') |
|
1184 | ||
1185 | if denominator_meter_uuid not in meter_dict and \ |
|
1186 | denominator_meter_uuid not in virtual_meter_dict and \ |
|
1187 | denominator_meter_uuid not in offline_meter_dict: |
|
1188 | raise falcon.HTTPError(falcon.HTTP_400, title='API.BAD_REQUEST', |
|
1189 | description='API.INVALID_DENOMINATOR_METER_UUID') |
|
1190 | ||
1191 | add_values = (" UPDATE tbl_equipments_parameters " |
|
1192 | " SET name = %s , parameter_type = %s, constant = %s, " |
|
1193 | " point_id = %s, numerator_meter_uuid = %s, denominator_meter_uuid =%s " |
|
1194 | " WHERE id = %s ") |
|
1195 | cursor.execute(add_values, (name, |
|
1196 | parameter_type, |
|
1197 | constant, |
|
1198 | point_id, |
|
1199 | numerator_meter_uuid, |
|
1200 | denominator_meter_uuid, |
|
1201 | pid)) |
|
1202 | cnx.commit() |
|
1203 | ||
1204 | cursor.close() |
|
1205 | cnx.disconnect() |
|
1206 | ||
1207 | resp.status = falcon.HTTP_200 |
|
1208 | ||
1209 | ||
1210 | class EquipmentMeterCollection: |