Passed
Push — master ( c215ca...be0b67 )
by Guangyu
13:48 queued 12s
created

excelexporters.virtualmetercarbon.export()   B

Complexity

Conditions 8

Size

Total Lines 48
Code Lines 34

Duplication

Lines 48
Ratio 100 %

Importance

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