Issues (1577)

myems-api/excelexporters/meterenergy.py (3 issues)

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