Passed
Push — master ( 414b30...be43ee )
by Guangyu
14:19 queued 13s
created

excelexporters.combinedequipmentoutput.export()   B

Complexity

Conditions 5

Size

Total Lines 46
Code Lines 32

Duplication

Lines 46
Ratio 100 %

Importance

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