Issues (1588)

reports/photovoltaicpowerstationitemdashboard.py (1 issue)

Severity
1
import re
2
from decimal import Decimal
3
import falcon
4
import mysql.connector
5
import simplejson as json
6
import config
7
from core.useractivity import access_control, api_key_control
8
9
10
class Reporting:
11
    def __init__(self):
12
        """Initializes Class"""
13
        pass
14
15
    @staticmethod
16
    def on_options(req, resp):
17
        _ = req
18
        resp.status = falcon.HTTP_200
19
20
    ####################################################################################################################
21
    # PROCEDURES
22
    # Step 1: valid parameters
23
    # Step 2: query the energy storage power station
24
    # Step 3: query generation energy data
25
    # Step 5: query generation billing data
26
    # Step 7: query generation carbon data
27
    # Step 9: construct the report
28
    ####################################################################################################################
29
    @staticmethod
30
    def on_get(req, resp):
31
        if 'API-KEY' not in req.headers or \
32
                not isinstance(req.headers['API-KEY'], str) or \
33
                len(str.strip(req.headers['API-KEY'])) == 0:
34
            access_control(req)
35
        else:
36
            api_key_control(req)
37
        # this procedure accepts energy storage power station id or uuid
38
        photovoltaic_power_station_id = req.params.get('id')
39
        photovoltaic_power_station_uuid = req.params.get('uuid')
40
41
        ################################################################################################################
42
        # Step 1: valid parameters
43
        ################################################################################################################
44
        if photovoltaic_power_station_id is None and photovoltaic_power_station_uuid is None:
45
            raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
46
                                   description='API.INVALID_photovoltaic_POWER_STATION_ID')
47
48
        if photovoltaic_power_station_id is not None:
49
            photovoltaic_power_station_id = str.strip(photovoltaic_power_station_id)
50
            if not photovoltaic_power_station_id.isdigit() or int(photovoltaic_power_station_id) <= 0:
51
                raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
52
                                       description='API.INVALID_photovoltaic_POWER_STATION_ID')
53
54
        if photovoltaic_power_station_uuid is not None:
55
            regex = re.compile(r'^[a-f0-9]{8}-?[a-f0-9]{4}-?4[a-f0-9]{3}-?[89ab][a-f0-9]{3}-?[a-f0-9]{12}\Z', re.I)
56
            match = regex.match(str.strip(photovoltaic_power_station_uuid))
57
            if not bool(match):
58
                raise falcon.HTTPError(status=falcon.HTTP_400, title='API.BAD_REQUEST',
59
                                       description='API.INVALID_photovoltaic_POWER_STATION_UUID')
60
61
        ################################################################################################################
62
        # Step 2: query the energy storage power station
63
        ################################################################################################################
64
        cnx_system_db = mysql.connector.connect(**config.myems_system_db)
65
        cursor_system_db = cnx_system_db.cursor()
66
        # Get Spaces associated with energy storage power stations
67
        query = (" SELECT se.photovoltaic_power_station_id, s.name "
68
                 " FROM tbl_spaces s, tbl_spaces_photovoltaic_power_stations se "
69
                 " WHERE se.space_id = s.id ")
70
        cursor_system_db.execute(query)
71
        rows_spaces = cursor_system_db.fetchall()
72
73
        space_dict = dict()
74
        if rows_spaces is not None and len(rows_spaces) > 0:
75
            for row in rows_spaces:
76
                space_dict[row[0]] = row[1]
77
        print(space_dict)
78
        # Get energy storage power station
79
        if photovoltaic_power_station_id is not None:
80
            query = (" SELECT id, name, uuid, "
81
                     "        address, latitude, longitude, rated_capacity, rated_power, "
82
                     "        contact_id, cost_center_id "
83
                     " FROM tbl_photovoltaic_power_stations "
84
                     " WHERE id = %s ")
85
            cursor_system_db.execute(query, (photovoltaic_power_station_id,))
86
            row = cursor_system_db.fetchone()
87
        elif photovoltaic_power_station_uuid is not None:
88
            query = (" SELECT id, name, uuid, "
89
                     "        address, latitude, longitude, rated_capacity, rated_power, "
90
                     "        contact_id, cost_center_id "
91
                     " FROM tbl_photovoltaic_power_stations "
92
                     " WHERE uuid = %s ")
93
            cursor_system_db.execute(query, (photovoltaic_power_station_uuid,))
94
            row = cursor_system_db.fetchone()
95
96
        if row is None:
0 ignored issues
show
The variable row does not seem to be defined for all execution paths.
Loading history...
97
            cursor_system_db.close()
98
            cnx_system_db.close()
99
            raise falcon.HTTPError(status=falcon.HTTP_404, title='API.NOT_FOUND',
100
                                   description='API.photovoltaic_POWER_STATION_NOT_FOUND')
101
        else:
102
            photovoltaic_power_station_id = row[0]
103
            photovoltaic_power_station = {
104
                "id": row[0],
105
                "name": row[1],
106
                "uuid": row[2],
107
                "address": row[3],
108
                "space_name": space_dict.get(row[0]),
109
                "latitude": row[4],
110
                "longitude": row[5],
111
                "rated_capacity": row[6],
112
                "rated_power": row[7]
113
            }
114
115
        ################################################################################################################
116
        # Step 3: query generation energy data
117
        ################################################################################################################
118
        cnx_energy_db = mysql.connector.connect(**config.myems_energy_db)
119
        cursor_energy_db = cnx_energy_db.cursor()
120
121
        cnx_billing_db = mysql.connector.connect(**config.myems_billing_db)
122
        cursor_billing_db = cnx_billing_db.cursor()
123
124
        cnx_carbon_db = mysql.connector.connect(**config.myems_billing_db)
125
        cursor_carbon_db = cnx_carbon_db.cursor()
126
127
        query = (" SELECT SUM(actual_value) "
128
                 " FROM tbl_photovoltaic_power_station_generation_hourly "
129
                 " WHERE photovoltaic_power_station_id = %s ")
130
        cursor_energy_db.execute(query, (photovoltaic_power_station_id, ))
131
        row = cursor_energy_db.fetchone()
132
        total_generation_energy = Decimal(0.0)
133
        if row is not None:
134
            total_generation_energy = row[0]
135
136
        ################################################################################################################
137
        # Step 5:  query generation billing data
138
        ################################################################################################################
139
        query = (" SELECT SUM(actual_value) "
140
                 " FROM tbl_photovoltaic_power_station_generation_hourly "
141
                 " WHERE photovoltaic_power_station_id = %s ")
142
        cursor_billing_db.execute(query, (photovoltaic_power_station_id, ))
143
        row = cursor_billing_db.fetchone()
144
        total_generation_billing = Decimal(0.0)
145
        if row is not None:
146
            total_generation_billing = row[0]
147
148
        ################################################################################################################
149
        # Step 7:  query generation carbon data
150
        ################################################################################################################
151
        query = (" SELECT SUM(actual_value) "
152
                 " FROM tbl_photovoltaic_power_station_generation_hourly "
153
                 " WHERE photovoltaic_power_station_id = %s ")
154
        cursor_carbon_db.execute(query, (photovoltaic_power_station_id, ))
155
        row = cursor_carbon_db.fetchone()
156
        total_generation_carbon = Decimal(0.0)
157
        if row is not None:
158
            total_generation_carbon = row[0]
159
160
        ################################################################################################################
161
        # Step 7: construct the report
162
        ################################################################################################################
163
        if cursor_system_db:
164
            cursor_system_db.close()
165
        if cnx_system_db:
166
            cnx_system_db.close()
167
168
        if cursor_energy_db:
169
            cursor_energy_db.close()
170
        if cnx_energy_db:
171
            cnx_energy_db.close()
172
173
        if cursor_billing_db:
174
            cursor_billing_db.close()
175
        if cnx_billing_db:
176
            cnx_billing_db.close()
177
178
        if cursor_carbon_db:
179
            cursor_carbon_db.close()
180
        if cnx_carbon_db:
181
            cnx_carbon_db.close()
182
183
        result = dict()
184
        result['photovoltaic_power_station'] = photovoltaic_power_station
185
        result['total_generation_energy'] = total_generation_energy
186
        result['total_generation_billing'] = total_generation_billing
187
        result['total_generation_carbon'] = total_generation_carbon
188
        resp.text = json.dumps(result)
189