excelexporters.tenantload.export()   B
last analyzed

Complexity

Conditions 5

Size

Total Lines 45
Code Lines 31

Duplication

Lines 45
Ratio 100 %

Importance

Changes 0
Metric Value
eloc 31
dl 45
loc 45
rs 8.6693
c 0
b 0
f 0
cc 5
nop 8

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
import base64
2
from core.utilities import get_translation
3
import os
4
import re
5
import uuid
6
import openpyxl.utils.cell as format_cell
7
from openpyxl import Workbook
8
from openpyxl.chart import LineChart, Reference
9
from openpyxl.drawing.image import Image
10
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
11
from core.utilities import round2
12
13
########################################################################################################################
14
# PROCEDURES
15
# Step 1: Validate the report data
16
# Step 2: Generate excel file
17
# Step 3: Encode the excel file to Base64
18
########################################################################################################################
19
20
21 View Code Duplication
def export(report,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
22
           name,
23
           base_period_start_datetime_local,
24
           base_period_end_datetime_local,
25
           reporting_start_datetime_local,
26
           reporting_end_datetime_local,
27
           period_type,
28
           language):
29
    ####################################################################################################################
30
    # Step 1: Validate the report data
31
    ####################################################################################################################
32
    if report is None:
33
        return None
34
35
    ####################################################################################################################
36
    # Step 2: Generate excel file from the report data
37
    ####################################################################################################################
38
    filename = generate_excel(report,
39
                              name,
40
                              base_period_start_datetime_local,
41
                              base_period_end_datetime_local,
42
                              reporting_start_datetime_local,
43
                              reporting_end_datetime_local,
44
                              period_type,
45
                              language)
46
    ####################################################################################################################
47
    # Step 3: Encode the excel file to Base64
48
    ####################################################################################################################
49
    binary_file_data = b''
50
    try:
51
        with open(filename, 'rb') as binary_file:
52
            binary_file_data = binary_file.read()
53
    except IOError as ex:
54
        print(str(ex))
55
56
    # Base64 encode the bytes
57
    base64_encoded_data = base64.b64encode(binary_file_data)
58
    # get the Base64 encoded data using human-readable characters.
59
    base64_message = base64_encoded_data.decode('utf-8')
60
    # delete the file from server
61
    try:
62
        os.remove(filename)
63
    except NotImplementedError as ex:
64
        print(str(ex))
65
    return base64_message
66
67
68 View Code Duplication
def generate_excel(report,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
69
                   name,
70
                   base_period_start_datetime_local,
71
                   base_period_end_datetime_local,
72
                   reporting_start_datetime_local,
73
                   reporting_end_datetime_local,
74
                   period_type,
75
                   language):
76
77
    trans = get_translation(language)
78
    trans.install()
79
    _ = trans.gettext
80
81
    wb = Workbook()
82
83
    # todo
84
    ws = wb.active
85
    ws.title = "TenantLoad"
86
    # Row height
87
    ws.row_dimensions[1].height = 102
88
    for i in range(2, 2000 + 1):
89
        ws.row_dimensions[i].height = 42
90
91
    # Col width
92
    ws.column_dimensions['A'].width = 1.5
93
94
    ws.column_dimensions['B'].width = 25.0
95
96
    for i in range(ord('C'), ord('Z')):
97
        ws.column_dimensions[chr(i)].width = 15.0
98
99
    # Font
100
    name_font = Font(name='Arial', size=15, bold=True)
101
    title_font = Font(name='Arial', size=15, bold=True)
102
103
    table_fill = PatternFill(fill_type='solid', fgColor='90ee90')
104
    f_border = Border(left=Side(border_style='medium'),
105
                      right=Side(border_style='medium'),
106
                      bottom=Side(border_style='medium'),
107
                      top=Side(border_style='medium')
108
                      )
109
    b_border = Border(
110
        bottom=Side(border_style='medium'),
111
    )
112
113
    b_c_alignment = Alignment(vertical='bottom',
114
                              horizontal='center',
115
                              text_rotation=0,
116
                              wrap_text=True,
117
                              shrink_to_fit=False,
118
                              indent=0)
119
    c_c_alignment = Alignment(vertical='center',
120
                              horizontal='center',
121
                              text_rotation=0,
122
                              wrap_text=True,
123
                              shrink_to_fit=False,
124
                              indent=0)
125
    b_r_alignment = Alignment(vertical='bottom',
126
                              horizontal='right',
127
                              text_rotation=0,
128
                              wrap_text=True,
129
                              shrink_to_fit=False,
130
                              indent=0)
131
132
    # Img
133
    img = Image("excelexporters/myems.png")
134
    ws.add_image(img, 'A1')
135
136
    # Title
137
    ws['B3'].alignment = b_r_alignment
138
    ws['B3'] = _('Name') + ':'
139
    ws['C3'].border = b_border
140
    ws['C3'].alignment = b_c_alignment
141
    ws['C3'] = name
142
143
    ws['D3'].alignment = b_r_alignment
144
    ws['D3'] = _('Period Type') + ':'
145
    ws['E3'].border = b_border
146
    ws['E3'].alignment = b_c_alignment
147
    ws['E3'] = period_type
148
149
    ws['B4'].alignment = b_r_alignment
150
    ws['B4'] = _('Reporting Start Datetime') + ':'
151
    ws['C4'].border = b_border
152
    ws['C4'].alignment = b_c_alignment
153
    ws['C4'] = reporting_start_datetime_local
154
155
    ws['D4'].alignment = b_r_alignment
156
    ws['D4'] = _('Reporting End Datetime') + ':'
157
    ws['E4'].border = b_border
158
    ws['E4'].alignment = b_c_alignment
159
    ws['E4'] = reporting_end_datetime_local
160
161
    is_base_period_timestamp_exists_flag = is_base_period_timestamp_exists(report['base_period'])
162
163
    if is_base_period_timestamp_exists_flag:
164
        ws['B5'].alignment = b_r_alignment
165
        ws['B5'] = _('Base Period Start Datetime') + ':'
166
        ws['C5'].border = b_border
167
        ws['C5'].alignment = b_c_alignment
168
        ws['C5'] = base_period_start_datetime_local
169
170
        ws['D5'].alignment = b_r_alignment
171
        ws['D5'] = _('Base Period End Datetime') + ':'
172
        ws['E5'].border = b_border
173
        ws['E5'].alignment = b_c_alignment
174
        ws['E5'] = base_period_end_datetime_local
175
176
    if "reporting_period" not in report.keys() or \
177
            "timestamps" not in report['reporting_period'].keys() or len(report['reporting_period']['timestamps']) == 0:
178
        filename = str(uuid.uuid4()) + '.xlsx'
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable str does not seem to be defined.
Loading history...
179
        wb.save(filename)
180
181
        return filename
182
183
    ####################################################################################################################
184
    current_row_number = 7
185
    if "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
186
        pass
187
    else:
188
        reporting_period_data = report['reporting_period']
189
        category = reporting_period_data['names']
190
        ca_len = len(category)
191
192
        ws['B' + str(current_row_number)].font = title_font
193
        ws['B' + str(current_row_number)] = name + _('Reporting Period Average Load')
194
195
        current_row_number += 1
196
197
        ws.row_dimensions[current_row_number].height = 60
198
        ws['B' + str(current_row_number)].fill = table_fill
199
        ws['B' + str(current_row_number)].border = f_border
200
201
        for i in range(0, ca_len):
202
            col = chr(ord('C') + i)
203
            ws[col + str(current_row_number)].fill = table_fill
204
            ws[col + str(current_row_number)].font = name_font
205
            ws[col + str(current_row_number)].alignment = c_c_alignment
206
            ws[col + str(current_row_number)].border = f_border
207
            ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \
208
                " (" + reporting_period_data['units'][i] + "/H)"
209
210
        current_row_number += 1
211
212
        ws['B' + str(current_row_number)].font = title_font
213
        ws['B' + str(current_row_number)].alignment = c_c_alignment
214
        ws['B' + str(current_row_number)].border = f_border
215
        ws['B' + str(current_row_number)] = _('Average Load')
216
217
        for i in range(0, ca_len):
218
            col = chr(ord('C') + i)
219
            ws[col + str(current_row_number)].font = name_font
220
            ws[col + str(current_row_number)].alignment = c_c_alignment
221
            ws[col + str(current_row_number)].border = f_border
222
            ws[col + str(current_row_number)] = round2(reporting_period_data['averages'][i], 2) \
223
                if reporting_period_data['averages'][i] is not None else 'N/A'
224
225
        current_row_number += 1
226
227
        ws['B' + str(current_row_number)].font = title_font
228
        ws['B' + str(current_row_number)].alignment = c_c_alignment
229
        ws['B' + str(current_row_number)].border = f_border
230
        ws['B' + str(current_row_number)] = _('Per Unit Area')
231
232
        for i in range(0, ca_len):
233
            col = chr(ord('C') + i)
234
            ws[col + str(current_row_number)].font = name_font
235
            ws[col + str(current_row_number)].alignment = c_c_alignment
236
            ws[col + str(current_row_number)].border = f_border
237
            ws[col + str(current_row_number)] = round2(reporting_period_data['averages_per_unit_area'][i], 2) \
238
                if reporting_period_data['averages_per_unit_area'][i] is not None else 'N/A'
239
240
        current_row_number += 1
241
242
        ws['B' + str(current_row_number)].font = title_font
243
        ws['B' + str(current_row_number)].alignment = c_c_alignment
244
        ws['B' + str(current_row_number)].border = f_border
245
        ws['B' + str(current_row_number)] = _('Increment Rate')
246
247
        for i in range(0, ca_len):
248
            col = chr(ord('C') + i)
249
            ws[col + str(current_row_number)].font = name_font
250
            ws[col + str(current_row_number)].alignment = c_c_alignment
251
            ws[col + str(current_row_number)].border = f_border
252
            ws[col + str(current_row_number)] = str(
253
                round2(reporting_period_data['averages_increment_rate'][i] * 100, 2)) + "%" \
254
                if reporting_period_data['averages_increment_rate'][i] is not None else "-"
255
256
        current_row_number += 2
257
258
        ws['B' + str(current_row_number)].font = title_font
259
        ws['B' + str(current_row_number)] = name + _('Reporting Period Maximum Load')
260
261
        current_row_number += 1
262
263
        ws.row_dimensions[current_row_number].height = 60
264
        ws['B' + str(current_row_number)].fill = table_fill
265
        ws['B' + str(current_row_number)].border = f_border
266
        for i in range(0, ca_len):
267
            col = chr(ord('C') + i)
268
            ws[col + str(current_row_number)].fill = table_fill
269
            ws[col + str(current_row_number)].font = name_font
270
            ws[col + str(current_row_number)].alignment = c_c_alignment
271
            ws[col + str(current_row_number)].border = f_border
272
            ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \
273
                " (" + reporting_period_data['units'][i] + "/H)"
274
275
        current_row_number += 1
276
277
        ws['B' + str(current_row_number)].font = title_font
278
        ws['B' + str(current_row_number)].alignment = c_c_alignment
279
        ws['B' + str(current_row_number)].border = f_border
280
        ws['B' + str(current_row_number)] = _('Maximum Load')
281
282
        for i in range(0, ca_len):
283
            col = chr(ord('C') + i)
284
            ws[col + str(current_row_number)].font = name_font
285
            ws[col + str(current_row_number)].alignment = c_c_alignment
286
            ws[col + str(current_row_number)].border = f_border
287
            ws[col + str(current_row_number)] = round2(reporting_period_data['maximums'][i], 2) \
288
                if reporting_period_data['maximums'][i] is not None else 'N/A'
289
290
        current_row_number += 1
291
292
        ws['B' + str(current_row_number)].font = title_font
293
        ws['B' + str(current_row_number)].alignment = c_c_alignment
294
        ws['B' + str(current_row_number)].border = f_border
295
        ws['B' + str(current_row_number)] = _('Per Unit Area')
296
297
        for i in range(0, ca_len):
298
            col = chr(ord('C') + i)
299
            ws[col + str(current_row_number)].font = name_font
300
            ws[col + str(current_row_number)].alignment = c_c_alignment
301
            ws[col + str(current_row_number)].border = f_border
302
            ws[col + str(current_row_number)] = round2(reporting_period_data['maximums_per_unit_area'][i], 2) \
303
                if reporting_period_data['maximums_per_unit_area'][i] is not None else 'N/A'
304
305
        current_row_number += 1
306
307
        ws['B' + str(current_row_number)].font = title_font
308
        ws['B' + str(current_row_number)].alignment = c_c_alignment
309
        ws['B' + str(current_row_number)].border = f_border
310
        ws['B' + str(current_row_number)] = _('Increment Rate')
311
312
        for i in range(0, ca_len):
313
            col = chr(ord('C') + i)
314
            ws[col + str(current_row_number)].font = name_font
315
            ws[col + str(current_row_number)].alignment = c_c_alignment
316
            ws[col + str(current_row_number)].border = f_border
317
            ws[col + str(current_row_number)] = str(
318
                round2(reporting_period_data['maximums_increment_rate'][i] * 100, 2)) + "%" \
319
                if reporting_period_data['maximums_increment_rate'][i] is not None else "-"
320
321
        current_row_number += 2
322
323
        ws['B' + str(current_row_number)].font = title_font
324
        ws['B' + str(current_row_number)] = name + _('Reporting Period Load Factor')
325
326
        current_row_number += 1
327
328
        ws.row_dimensions[current_row_number].height = 60
329
        ws['B' + str(current_row_number)].fill = table_fill
330
        ws['B' + str(current_row_number)].border = f_border
331
        for i in range(0, ca_len):
332
            col = chr(ord('C') + i)
333
            ws[col + str(current_row_number)].fill = table_fill
334
            ws[col + str(current_row_number)].font = name_font
335
            ws[col + str(current_row_number)].alignment = c_c_alignment
336
            ws[col + str(current_row_number)].border = f_border
337
            ws[col + str(current_row_number)] = reporting_period_data['names'][i]
338
339
        current_row_number += 1
340
341
        ws['B' + str(current_row_number)].font = title_font
342
        ws['B' + str(current_row_number)].alignment = c_c_alignment
343
        ws['B' + str(current_row_number)].border = f_border
344
        ws['B' + str(current_row_number)] = _('Load Factor')
345
346
        for i in range(0, ca_len):
347
            col = chr(ord('C') + i)
348
            ws[col + str(current_row_number)].font = name_font
349
            ws[col + str(current_row_number)].alignment = c_c_alignment
350
            ws[col + str(current_row_number)].border = f_border
351
            ws[col + str(current_row_number)] = round2(reporting_period_data['factors'][i], 2) \
352
                if reporting_period_data['factors'][i] is not None else '-'
353
354
        current_row_number += 1
355
356
        ws['B' + str(current_row_number)].font = title_font
357
        ws['B' + str(current_row_number)].alignment = c_c_alignment
358
        ws['B' + str(current_row_number)].border = f_border
359
        ws['B' + str(current_row_number)] = _('Increment Rate')
360
361
        for i in range(0, ca_len):
362
            col = chr(ord('C') + i)
363
            ws[col + str(current_row_number)].font = name_font
364
            ws[col + str(current_row_number)].alignment = c_c_alignment
365
            ws[col + str(current_row_number)].border = f_border
366
            ws[col + str(current_row_number)] = str(
367
                round2(reporting_period_data['factors_increment_rate'][i] * 100, 2)) + "%" \
368
                if reporting_period_data['factors_increment_rate'][i] is not None else "-"
369
370
        current_row_number += 2
371
372
    has_sub_averages_data_flag = True
373
    has_sub_maximums_data_flag = True
374
375
    if "sub_averages" not in report['reporting_period'].keys() or len(report['reporting_period']['sub_averages']) == 0:
376
        has_sub_averages_data_flag = False
377
378
    if "sub_maximums" not in report['reporting_period'].keys() or len(report['reporting_period']['sub_maximums']) == 0:
379
        has_sub_maximums_data_flag = False
380
381
    current_chart_row_number = current_row_number
382
383
    if has_sub_averages_data_flag or has_sub_maximums_data_flag:
384
        if not is_base_period_timestamp_exists_flag:
385
            reporting_period_data = report['reporting_period']
386
            category = reporting_period_data['names']
387
            ca_len = len(category)
388
            times = reporting_period_data['timestamps']
389
            time = times[0]
390
            real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
391
            ws['B' + str(current_row_number)].font = title_font
392
            ws['B' + str(current_row_number)] = name + _('Detailed Data')
393
394
            current_row_number += 1
395
            chart_start_number = current_row_number
396
            # 1: Stand for blank line  2: Stand for title
397
            current_row_number += real_timestamps_len * 6 + 1 + 2
398
            if has_sub_averages_data_flag:
399
                current_row_number = (current_row_number + ca_len * 6)
400
401
            if has_sub_maximums_data_flag:
402
                current_row_number = (current_row_number + ca_len * 6)
403
404
            table_start_number = current_row_number
405
406
            ws.row_dimensions[current_row_number].height = 60
407
            current_col_number = 2
408
            col = format_cell.get_column_letter(current_col_number)
409
            ws[col + str(current_row_number)].fill = table_fill
410
            ws[col + str(current_row_number)].font = title_font
411
            ws[col + str(current_row_number)].alignment = c_c_alignment
412
            ws[col + str(current_row_number)].border = f_border
413
            ws[col + str(current_row_number)] = _('Datetime')
414
415
            current_col_number = 3
416
            col = format_cell.get_column_letter(current_col_number)
417
418
            for i in range(0, ca_len):
419
                if has_sub_averages_data_flag:
420
                    ws[col + str(current_row_number)].fill = table_fill
421
                    ws[col + str(current_row_number)].font = title_font
422
                    ws[col + str(current_row_number)].alignment = c_c_alignment
423
                    ws[col + str(current_row_number)].border = f_border
424
                    ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \
425
                        " " + _('Average Load') + "(" + reporting_period_data['units'][i] + "/H)"
426
427
                    current_col_number += 1
428
                    col = format_cell.get_column_letter(current_col_number)
429
430
                if has_sub_maximums_data_flag:
431
                    ws[col + str(current_row_number)].fill = table_fill
432
                    ws[col + str(current_row_number)].font = title_font
433
                    ws[col + str(current_row_number)].alignment = c_c_alignment
434
                    ws[col + str(current_row_number)].border = f_border
435
                    ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \
436
                        " " + _('Maximum Load') + "(" + reporting_period_data['units'][i] + "/H)"
437
438
                    current_col_number += 1
439
                    col = format_cell.get_column_letter(current_col_number)
440
441
            current_row_number += 1
442
443
            for i in range(0, len(time)):
444
                current_col_number = 2
445
                col = format_cell.get_column_letter(current_col_number)
446
                ws[col + str(current_row_number)].font = title_font
447
                ws[col + str(current_row_number)].alignment = c_c_alignment
448
                ws[col + str(current_row_number)].border = f_border
449
                ws[col + str(current_row_number)] = time[i]
450
451
                current_col_number = 3
452
                col = format_cell.get_column_letter(current_col_number)
453
                for j in range(0, ca_len):
454
455
                    if has_sub_averages_data_flag:
456
                        ws[col + str(current_row_number)].font = title_font
457
                        ws[col + str(current_row_number)].alignment = c_c_alignment
458
                        ws[col + str(current_row_number)].border = f_border
459
                        ws[col + str(current_row_number)] = round2(reporting_period_data['sub_averages'][j][i], 2) \
460
                            if reporting_period_data['sub_averages'][j][i] is not None else None
461
                        current_col_number += 1
462
                        col = format_cell.get_column_letter(current_col_number)
463
464
                    if has_sub_maximums_data_flag:
465
                        ws[col + str(current_row_number)].font = title_font
466
                        ws[col + str(current_row_number)].alignment = c_c_alignment
467
                        ws[col + str(current_row_number)].border = f_border
468
                        ws[col + str(current_row_number)] = round2(reporting_period_data['sub_maximums'][j][i], 2) \
469
                            if reporting_period_data['sub_maximums'][j][i] is not None else None
470
                        current_col_number += 1
471
                        col = format_cell.get_column_letter(current_col_number)
472
473
                current_row_number += 1
474
475
            table_end_number = current_row_number - 1
476
477
            current_chart_col_number = 3
478
            current_chart_row_number = chart_start_number
479
480
            for i in range(0, ca_len):
481
                labels = Reference(ws, min_col=2, min_row=table_start_number + 1, max_row=table_end_number)
482
483
                if has_sub_averages_data_flag:
484
                    line = LineChart()
485
                    line.title = _('Reporting Period Average Load') + ' - ' \
486
                        + reporting_period_data['names'][i] + \
487
                        " " + _('Average Load') + "(" + reporting_period_data['units'][i] + "/H)"
488
                    datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number,
489
                                      max_row=table_end_number)
490
                    line.add_data(datas, titles_from_data=True)
491
                    line.set_categories(labels)
492
                    line_data = line.series[0]
493
                    line_data.marker.symbol = "auto"
494
                    line_data.smooth = True
495
                    line.x_axis.crosses = 'min'
496
                    line.height = 8.25
497
                    line.width = 24
498
                    ws.add_chart(line, "B" + str(current_chart_row_number))
499
                    current_chart_row_number += 6
500
                    current_chart_col_number += 1
501
502
                if has_sub_maximums_data_flag:
503
                    line = LineChart()
504
                    line.title = _('Reporting Period Maximum Load') + ' - ' \
505
                        + reporting_period_data['names'][i] + \
506
                        " " + _('Maximum Load') + "(" + reporting_period_data['units'][i] + "/H)"
507
                    datas = Reference(ws, min_col=current_chart_col_number, min_row=table_start_number,
508
                                      max_row=table_end_number)
509
                    line.add_data(datas, titles_from_data=True)
510
                    line.set_categories(labels)
511
                    line_data = line.series[0]
512
                    line_data.marker.symbol = "auto"
513
                    line_data.smooth = True
514
                    line.x_axis.crosses = 'min'
515
                    line.height = 8.25
516
                    line.width = 24
517
                    ws.add_chart(line, "B" + str(current_chart_row_number))
518
                    current_chart_row_number += 6
519
                    current_chart_col_number += 1
520
        else:
521
            base_period_data = report['base_period']
522
            reporting_period_data = report['reporting_period']
523
            base_period_timestamps = base_period_data['timestamps']
524
            reporting_period_timestamps = reporting_period_data['timestamps']
525
            # Tip:
526
            #     base_period_data['names'] == reporting_period_data['names']
527
            #     base_period_data['units'] == reporting_period_data['units']
528
            base_period_data_ca_len = len(base_period_data['names'])
529
            reporting_period_data_ca_len = len(reporting_period_data['names'])
530
            real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
531
            ws['B' + str(current_row_number)].font = title_font
532
            ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data')
533
534
            current_row_number += 1
535
            chart_start_number = current_row_number
536
537
            # 1: Stand for blank line  2: Stand for title
538
            current_row_number += real_timestamps_len * 6 + 1 + 2
539
540
            if has_sub_averages_data_flag:
541
                current_row_number = (current_row_number + reporting_period_data_ca_len * 6)
542
543
            if has_sub_maximums_data_flag:
544
                current_row_number = (current_row_number + reporting_period_data_ca_len * 6)
545
546
            table_start_row_number = current_row_number
547
548
            has_data = False
549
550
            if len(base_period_timestamps[0]) or len(reporting_period_timestamps[0]) > 0:
551
                has_data = True
552
553
            if has_data:
554
                ws.row_dimensions[current_row_number].height = 60
555
                current_col_number = 2
556
                col = format_cell.get_column_letter(current_col_number)
557
                ws[col + str(current_row_number)].fill = table_fill
558
                ws[col + str(current_row_number)].font = title_font
559
                ws[col + str(current_row_number)].border = f_border
560
                ws[col + str(current_row_number)].alignment = c_c_alignment
561
                ws[col + str(current_row_number)] = _('Base Period') + " - " + _('Datetime')
562
563
                for i in range(0, base_period_data_ca_len):
564
                    if has_sub_averages_data_flag:
565
                        current_col_number += 1
566
                        col = format_cell.get_column_letter(current_col_number)
567
568
                        ws[col + str(current_row_number)].fill = table_fill
569
                        ws[col + str(current_row_number)].font = title_font
570
                        ws[col + str(current_row_number)].alignment = c_c_alignment
571
                        ws[col + str(current_row_number)] = _('Base Period') + " - " \
572
                            + base_period_data['names'][i] + \
573
                            " " + _('Average Load') + "(" + base_period_data['units'][i] + "/H)"
574
                        ws[col + str(current_row_number)].border = f_border
575
576
                    if has_sub_maximums_data_flag:
577
                        current_col_number += 1
578
                        col = format_cell.get_column_letter(current_col_number)
579
580
                        ws[col + str(current_row_number)].fill = table_fill
581
                        ws[col + str(current_row_number)].font = title_font
582
                        ws[col + str(current_row_number)].alignment = c_c_alignment
583
                        ws[col + str(current_row_number)] = _('Base Period') + " - " \
584
                            + base_period_data['names'][i] + \
585
                            " " + _('Maximum Load') + "(" + base_period_data['units'][i] + "/H)"
586
                        ws[col + str(current_row_number)].border = f_border
587
588
                current_col_number += 1
589
                col = format_cell.get_column_letter(current_col_number)
590
591
                ws[col + str(current_row_number)].fill = table_fill
592
                ws[col + str(current_row_number)].font = title_font
593
                ws[col + str(current_row_number)].border = f_border
594
                ws[col + str(current_row_number)].alignment = c_c_alignment
595
                ws[col + str(current_row_number)] = _('Reporting Period') + " - " + _('Datetime')
596
597
                for i in range(0, reporting_period_data_ca_len):
598
                    if has_sub_averages_data_flag:
599
                        current_col_number += 1
600
                        col = format_cell.get_column_letter(current_col_number)
601
                        ws[col + str(current_row_number)].fill = table_fill
602
                        ws[col + str(current_row_number)].font = title_font
603
                        ws[col + str(current_row_number)].alignment = c_c_alignment
604
                        ws[col + str(current_row_number)] = _('Reporting Period') + " - " \
605
                            + reporting_period_data['names'][i] + \
606
                            " " + _('Average Load') + "(" + reporting_period_data['units'][i] + "/H)"
607
                        ws[col + str(current_row_number)].border = f_border
608
609
                    if has_sub_maximums_data_flag:
610
                        current_col_number += 1
611
                        col = format_cell.get_column_letter(current_col_number)
612
                        ws[col + str(current_row_number)].fill = table_fill
613
                        ws[col + str(current_row_number)].font = title_font
614
                        ws[col + str(current_row_number)].alignment = c_c_alignment
615
                        ws[col + str(current_row_number)] = _('Reporting Period') + " - " \
616
                            + reporting_period_data['names'][i] + \
617
                            " " + _('Maximum Load') + "(" + \
618
                            reporting_period_data['units'][i] + "/H)"
619
                        ws[col + str(current_row_number)].border = f_border
620
621
                current_row_number += 1
622
623
                max_timestamps_len = len(base_period_timestamps[0]) \
624
                    if len(base_period_timestamps[0]) >= len(reporting_period_timestamps[0]) \
625
                    else len(reporting_period_timestamps[0])
626
627
                for i in range(0, max_timestamps_len):
628
                    current_col_number = 2
629
                    col = format_cell.get_column_letter(current_col_number)
630
                    ws[col + str(current_row_number)].font = title_font
631
                    ws[col + str(current_row_number)].alignment = c_c_alignment
632
                    ws[col + str(current_row_number)] = base_period_timestamps[0][i] \
633
                        if i < len(base_period_timestamps[0]) else None
634
                    ws[col + str(current_row_number)].border = f_border
635
636
                    for j in range(0, base_period_data_ca_len):
637
                        if has_sub_averages_data_flag:
638
                            current_col_number += 1
639
                            col = format_cell.get_column_letter(current_col_number)
640
641
                            ws[col + str(current_row_number)].font = title_font
642
                            ws[col + str(current_row_number)].alignment = c_c_alignment
643
                            ws[col + str(current_row_number)] = round2(base_period_data['sub_averages'][j][i], 2) \
644
                                if i < len(base_period_data['sub_averages'][j]) \
645
                                and base_period_data['sub_averages'][j][i] is not None else None
646
                            ws[col + str(current_row_number)].border = f_border
647
648
                        if has_sub_maximums_data_flag:
649
                            current_col_number += 1
650
                            col = format_cell.get_column_letter(current_col_number)
651
652
                            ws[col + str(current_row_number)].font = title_font
653
                            ws[col + str(current_row_number)].alignment = c_c_alignment
654
                            ws[col + str(current_row_number)] = round2(base_period_data['sub_maximums'][j][i], 2) \
655
                                if i < len(base_period_data['sub_maximums'][j]) \
656
                                and base_period_data['sub_averages'][j][i] is not None else None
657
                            ws[col + str(current_row_number)].border = f_border
658
659
                    current_col_number += 1
660
                    col = format_cell.get_column_letter(current_col_number)
661
662
                    ws[col + str(current_row_number)].font = title_font
663
                    ws[col + str(current_row_number)].alignment = c_c_alignment
664
                    ws[col + str(current_row_number)] = reporting_period_timestamps[0][i] \
665
                        if i < len(reporting_period_timestamps[0]) else None
666
                    ws[col + str(current_row_number)].border = f_border
667
668
                    for j in range(0, reporting_period_data_ca_len):
669
                        if has_sub_averages_data_flag:
670
                            current_col_number += 1
671
                            col = format_cell.get_column_letter(current_col_number)
672
673
                            ws[col + str(current_row_number)].font = title_font
674
                            ws[col + str(current_row_number)].alignment = c_c_alignment
675
                            ws[col + str(current_row_number)] = round2(reporting_period_data['sub_averages'][j][i], 2) \
676
                                if i < len(reporting_period_data['sub_averages'][j]) \
677
                                and reporting_period_data['sub_averages'][j][i] is not None else None
678
                            ws[col + str(current_row_number)].border = f_border
679
680
                        if has_sub_maximums_data_flag:
681
                            current_col_number += 1
682
                            col = format_cell.get_column_letter(current_col_number)
683
684
                            ws[col + str(current_row_number)].font = title_font
685
                            ws[col + str(current_row_number)].alignment = c_c_alignment
686
                            ws[col + str(current_row_number)] = round2(reporting_period_data['sub_maximums'][j][i], 2) \
687
                                if i < len(reporting_period_data['sub_maximums'][j]) \
688
                                and reporting_period_data['sub_maximums'][j][i] is not None else None
689
                            ws[col + str(current_row_number)].border = f_border
690
691
                    current_row_number += 1
692
693
                current_chart_col_number = 3
694
                current_chart_row_number = chart_start_number
695
696
                for i in range(0, reporting_period_data_ca_len):
697
                    labels = Reference(ws, min_col=2 + base_period_data_ca_len * 2 + 1,
698
                                       min_row=table_start_row_number + 1,
699
                                       max_row=table_start_row_number + len(reporting_period_timestamps[0]))
700
701
                    if has_sub_averages_data_flag:
702
                        # line
703
                        line = LineChart()
704
                        line.title = _('Base Period Average Load') + ' / ' \
705
                            + _('Reporting Period Average Load') + ' - ' \
706
                            + reporting_period_data['names'][i] + \
707
                            " " + _('Average Load') + "(" + reporting_period_data['units'][i] + "/H)"
708
                        base_line_data = Reference(ws,
709
                                                   min_col=current_chart_col_number,
710
                                                   min_row=table_start_row_number,
711
                                                   max_row=table_start_row_number
712
                                                   + len(reporting_period_timestamps[0]))
713
714
                        data_distance = base_period_data_ca_len
715
                        if has_sub_maximums_data_flag:
716
                            data_distance *= 2
717
718
                        reporting_line_data = Reference(ws,
719
                                                        min_col=current_chart_col_number + data_distance + 1,
720
                                                        min_row=table_start_row_number,
721
                                                        max_row=table_start_row_number
722
                                                        + len(reporting_period_timestamps[0]))
723
                        line.add_data(base_line_data, titles_from_data=True)
724
                        line.add_data(reporting_line_data, titles_from_data=True)
725
                        line.set_categories(labels)
726
                        for j in range(len(line.series)):
727
                            line.series[j].marker.symbol = "auto"
728
                            line.series[j].smooth = True
729
                        line.x_axis.crosses = 'min'
730
                        line.height = 8.25
731
                        line.width = 24
732
                        chart_col = 'B'
733
                        chart_cell = chart_col + str(current_chart_row_number)
734
                        ws.add_chart(line, chart_cell)
735
                        current_chart_row_number += 6
736
                        current_chart_col_number += 1
737
738
                    if has_sub_maximums_data_flag:
739
                        # line
740
                        line = LineChart()
741
                        line.title = _('Base Period Maximum Load') + ' / ' \
742
                            + _('Reporting Period Maximum Load') + ' - ' \
743
                            + reporting_period_data['names'][i] + \
744
                            " " + _('Maximum Load') + "(" + reporting_period_data['units'][i] + "/H)"
745
                        base_line_data = Reference(ws,
746
                                                   min_col=current_chart_col_number,
747
                                                   min_row=table_start_row_number,
748
                                                   max_row=table_start_row_number
749
                                                   + len(reporting_period_timestamps[0]))
750
751
                        data_distance = base_period_data_ca_len
752
                        if has_sub_averages_data_flag:
753
                            data_distance *= 2
754
755
                        reporting_line_data = Reference(ws,
756
                                                        min_col=current_chart_col_number + data_distance + 1,
757
                                                        min_row=table_start_row_number,
758
                                                        max_row=table_start_row_number
759
                                                        + len(reporting_period_timestamps[0]))
760
                        line.add_data(base_line_data, titles_from_data=True)
761
                        line.add_data(reporting_line_data, titles_from_data=True)
762
                        line.set_categories(labels)
763
                        for j in range(len(line.series)):
764
                            line.series[j].marker.symbol = "auto"
765
                            line.series[j].smooth = True
766
                        line.x_axis.crosses = 'min'
767
                        line.height = 8.25
768
                        line.width = 24
769
                        chart_col = 'B'
770
                        chart_cell = chart_col + str(current_chart_row_number)
771
                        ws.add_chart(line, chart_cell)
772
                        current_chart_row_number += 6
773
                        current_chart_col_number += 1
774
775
                current_row_number += 2
776
777
    ####################################################################################################################
778
    current_sheet_parameters_row_number = current_chart_row_number + 1
779
    if 'parameters' not in report.keys() or \
780
            report['parameters'] is None or \
781
            'names' not in report['parameters'].keys() or \
782
            report['parameters']['names'] is None or \
783
            len(report['parameters']['names']) == 0 or \
784
            'timestamps' not in report['parameters'].keys() or \
785
            report['parameters']['timestamps'] is None or \
786
            len(report['parameters']['timestamps']) == 0 or \
787
            'values' not in report['parameters'].keys() or \
788
            report['parameters']['values'] is None or \
789
            len(report['parameters']['values']) == 0 or \
790
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
791
        pass
792
    else:
793
794
        ################################################################################################################
795
        # new worksheet
796
        ################################################################################################################
797
798
        parameters_data = report['parameters']
799
        parameters_names_len = len(parameters_data['names'])
800
801
        file_name = (re.sub(r'[^A-Z]', '', ws.title))+'_'
802
        parameters_ws = wb.create_sheet(file_name + _('Parameters'))
803
804
        parameters_timestamps_data_max_len = \
805
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))
806
807
        # Row height
808
        parameters_ws.row_dimensions[1].height = 102
809
        for i in range(2, 7 + 1):
810
            parameters_ws.row_dimensions[i].height = 42
811
812
        for i in range(8, parameters_timestamps_data_max_len + 10):
813
            parameters_ws.row_dimensions[i].height = 60
814
815
        # Col width
816
        parameters_ws.column_dimensions['A'].width = 1.5
817
818
        parameters_ws.column_dimensions['B'].width = 25.0
819
820
        for i in range(3, 12 + parameters_names_len * 3):
821
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
822
823
        # Img
824
        img = Image("excelexporters/myems.png")
825
        parameters_ws.add_image(img, 'A1')
826
827
        # Title
828
        parameters_ws['B3'].alignment = b_r_alignment
829
        parameters_ws['B3'] = _('Name') + ':'
830
        parameters_ws['C3'].border = b_border
831
        parameters_ws['C3'].alignment = b_c_alignment
832
        parameters_ws['C3'] = name
833
834
        parameters_ws['D3'].alignment = b_r_alignment
835
        parameters_ws['D3'] = _('Period Type') + ':'
836
        parameters_ws['E3'].border = b_border
837
        parameters_ws['E3'].alignment = b_c_alignment
838
        parameters_ws['E3'] = period_type
839
840
        parameters_ws['B4'].alignment = b_r_alignment
841
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
842
        parameters_ws['C4'].border = b_border
843
        parameters_ws['C4'].alignment = b_c_alignment
844
        parameters_ws['C4'] = reporting_start_datetime_local
845
846
        parameters_ws['D4'].alignment = b_r_alignment
847
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
848
        parameters_ws['E4'].border = b_border
849
        parameters_ws['E4'].alignment = b_c_alignment
850
        parameters_ws['E4'] = reporting_end_datetime_local
851
852
        parameters_ws_current_row_number = 6
853
854
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
855
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + _('Parameters')
856
857
        parameters_ws_current_row_number += 1
858
859
        parameters_table_start_row_number = parameters_ws_current_row_number
860
861
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
862
863
        parameters_ws_current_row_number += 1
864
865
        table_current_col_number = 2
866
867
        for i in range(0, parameters_names_len):
868
869
            if len(parameters_data['timestamps'][i]) == 0:
870
                continue
871
872
            col = format_cell.get_column_letter(table_current_col_number)
873
874
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
875
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
876
877
            col = format_cell.get_column_letter(table_current_col_number + 1)
878
879
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
880
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
881
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
882
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
883
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]
884
885
            table_current_row_number = parameters_ws_current_row_number
886
887
            for j, value in enumerate(list(parameters_data['timestamps'][i])):
888
                col = format_cell.get_column_letter(table_current_col_number)
889
890
                parameters_ws[col + str(table_current_row_number)].border = f_border
891
                parameters_ws[col + str(table_current_row_number)].font = title_font
892
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
893
                parameters_ws[col + str(table_current_row_number)] = value
894
895
                col = format_cell.get_column_letter(table_current_col_number + 1)
896
897
                parameters_ws[col + str(table_current_row_number)].border = f_border
898
                parameters_ws[col + str(table_current_row_number)].font = title_font
899
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
900
                parameters_ws[col + str(table_current_row_number)] = round2(parameters_data['values'][i][j], 2)
901
902
                table_current_row_number += 1
903
904
            table_current_col_number = table_current_col_number + 3
905
906
        ################################################################################################################
907
        # parameters chart and parameters table
908
        ################################################################################################################
909
910
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
911
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + _('Parameters')
912
913
        current_sheet_parameters_row_number += 1
914
915
        chart_start_row_number = current_sheet_parameters_row_number
916
917
        col_index = 0
918
919
        for i in range(0, parameters_names_len):
920
921
            if len(parameters_data['timestamps'][i]) == 0:
922
                continue
923
924
            line = LineChart()
925
            data_col = 3 + col_index * 3
926
            labels_col = 2 + col_index * 3
927
            col_index += 1
928
            line.title = _('Parameters') + ' - ' + \
929
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
930
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
931
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
932
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
933
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
934
            line.add_data(line_data, titles_from_data=True)
935
            line.set_categories(labels)
936
            line_data = line.series[0]
937
            line_data.marker.symbol = "auto"
938
            line_data.smooth = True
939
            line.x_axis.crosses = 'min'
940
            line.height = 8.25
941
            line.width = 24
942
            chart_col = 'B'
943
            chart_cell = chart_col + str(chart_start_row_number)
944
            chart_start_row_number += 6
945
            ws.add_chart(line, chart_cell)
946
947
        current_sheet_parameters_row_number = chart_start_row_number
948
949
        current_sheet_parameters_row_number += 1
950
    ####################################################################################################################
951
    filename = str(uuid.uuid4()) + '.xlsx'
952
    wb.save(filename)
953
954
    return filename
955
956
957
def timestamps_data_all_equal_0(lists):
958
    for i, value in enumerate(list(lists)):
959
        if len(value) > 0:
960
            return False
961
962
    return True
963
964
965
def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists):
966
    max_len = 0
967
    for i, value in enumerate(list(parameters_timestamps_lists)):
968
        if len(value) > max_len:
969
            max_len = len(value)
970
971
    return max_len
972
973
974
def timestamps_data_not_equal_0(lists):
975
    number = 0
976
    for i, value in enumerate(list(lists)):
977
        if len(value) > 0:
978
            number += 1
979
    return number
980
981
982 View Code Duplication
def is_base_period_timestamp_exists(base_period_data):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
983
    timestamps = base_period_data['timestamps']
984
985
    if len(timestamps) == 0:
986
        return False
987
988
    for timestamp in timestamps:
989
        if len(timestamp) > 0:
990
            return True
991
992
    return False
993