Passed
Push — master ( 02289f...d6a19b )
by Guangyu
08:58 queued 15s
created

excelexporters.spacesaving   F

Complexity

Total Complexity 114

Size/Duplication

Total Lines 1081
Duplicated Lines 47.73 %

Importance

Changes 0
Metric Value
wmc 114
eloc 817
dl 516
loc 1081
rs 1.783
c 0
b 0
f 0

7 Functions

Rating   Name   Duplication   Size   Complexity  
A is_base_period_timestamp_exists() 11 11 4
F generate_excel() 459 963 94
A sum_list() 0 7 2
B export() 46 46 5
A get_parameters_timestamps_lists_max_len() 0 7 3
A timestamps_data_not_equal_0() 0 6 3
A timestamps_data_all_equal_0() 0 6 3

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like excelexporters.spacesaving often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
import base64
2
import gettext
3
import os
4
import uuid
5
from decimal import Decimal
6
7
import openpyxl.utils.cell as format_cell
8
from openpyxl import Workbook
9
from openpyxl.chart import PieChart, 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
    locale_path = './i18n/'
80
    if language == 'zh_CN':
81
        trans = gettext.translation('myems', locale_path, languages=['zh_CN'])
82
    elif language == 'de':
83
        trans = gettext.translation('myems', locale_path, languages=['de'])
84
    elif language == 'en':
85
        trans = gettext.translation('myems', locale_path, languages=['en'])
86
    else:
87
        trans = gettext.translation('myems', locale_path, languages=['en'])
88
    trans.install()
89
    _ = trans.gettext
90
    wb = Workbook()
91
    ws = wb.active
92
    ws.title = "SpaceSaving"
93
94
    # Row height
95
    ws.row_dimensions[1].height = 102
96
    for i in range(2, 2000 + 1):
97
        ws.row_dimensions[i].height = 42
98
99
    # Col width
100
    ws.column_dimensions['A'].width = 1.5
101
102
    ws.column_dimensions['B'].width = 25.0
103
104
    for i in range(ord('C'), ord('Z')):
105
        ws.column_dimensions[chr(i)].width = 15.0
106
107
    # Font
108
    name_font = Font(name='Arial', size=15, bold=True)
109
    title_font = Font(name='Arial', size=15, bold=True)
110
111
    table_fill = PatternFill(fill_type='solid', fgColor='90ee90')
112
    f_border = Border(left=Side(border_style='medium'),
113
                      right=Side(border_style='medium'),
114
                      bottom=Side(border_style='medium'),
115
                      top=Side(border_style='medium')
116
                      )
117
    b_border = Border(
118
        bottom=Side(border_style='medium'),
119
    )
120
121
    b_c_alignment = Alignment(vertical='bottom',
122
                              horizontal='center',
123
                              text_rotation=0,
124
                              wrap_text=True,
125
                              shrink_to_fit=False,
126
                              indent=0)
127
    c_c_alignment = Alignment(vertical='center',
128
                              horizontal='center',
129
                              text_rotation=0,
130
                              wrap_text=True,
131
                              shrink_to_fit=False,
132
                              indent=0)
133
    b_r_alignment = Alignment(vertical='bottom',
134
                              horizontal='right',
135
                              text_rotation=0,
136
                              wrap_text=True,
137
                              shrink_to_fit=False,
138
                              indent=0)
139
140
    # Img
141
    img = Image("excelexporters/myems.png")
142
    ws.add_image(img, 'A1')
143
144
    # Title
145
    ws['B3'].alignment = b_r_alignment
146
    ws['B3'] = _('Name') + ':'
147
    ws['C3'].border = b_border
148
    ws['C3'].alignment = b_c_alignment
149
    ws['C3'] = name
150
151
    ws['D3'].alignment = b_r_alignment
152
    ws['D3'] = _('Period Type') + ':'
153
    ws['E3'].border = b_border
154
    ws['E3'].alignment = b_c_alignment
155
    ws['E3'] = period_type
156
157
    ws['B4'].alignment = b_r_alignment
158
    ws['B4'] = _('Reporting Start Datetime') + ':'
159
    ws['C4'].border = b_border
160
    ws['C4'].alignment = b_c_alignment
161
    ws['C4'] = reporting_start_datetime_local
162
163
    ws['D4'].alignment = b_r_alignment
164
    ws['D4'] = _('Reporting End Datetime') + ':'
165
    ws['E4'].border = b_border
166
    ws['E4'].alignment = b_c_alignment
167
    ws['E4'] = reporting_end_datetime_local
168
169
    is_base_period_timestamp_exists_flag = is_base_period_timestamp_exists(report['base_period'])
170
171
    if is_base_period_timestamp_exists_flag:
172
        ws['B5'].alignment = b_r_alignment
173
        ws['B5'] = _('Base Period Start Datetime') + ':'
174
        ws['C5'].border = b_border
175
        ws['C5'].alignment = b_c_alignment
176
        ws['C5'] = base_period_start_datetime_local
177
178
        ws['D5'].alignment = b_r_alignment
179
        ws['D5'] = _('Base Period End Datetime') + ':'
180
        ws['E5'].border = b_border
181
        ws['E5'].alignment = b_c_alignment
182
        ws['E5'] = base_period_end_datetime_local
183
184
    if "reporting_period" not in report.keys() or \
185
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
186
        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...
187
        wb.save(filename)
188
189
        return filename
190
191
    ####################################################################################################################
192
    current_row_number = 7
193
    reporting_period_data = report['reporting_period']
194
    if "names" not in reporting_period_data.keys() or \
195
            reporting_period_data['names'] is None or \
196
            len(reporting_period_data['names']) == 0:
197
        pass
198
    else:
199
        ws['B' + str(current_row_number)].font = title_font
200
        ws['B' + str(current_row_number)] = name + ' ' + _('Reporting Period Saving')
201
202
        current_row_number += 1
203
204
        category = reporting_period_data['names']
205
        ca_len = len(category)
206
207
        ws.row_dimensions[current_row_number].height = 75
208
        ws['B' + str(current_row_number)].fill = table_fill
209
        ws['B' + str(current_row_number)].border = f_border
210
211
        col = 'C'
212
213
        for i in range(0, ca_len):
214
            ws[col + str(current_row_number)].fill = table_fill
215
            ws[col + str(current_row_number)].font = name_font
216
            ws[col + str(current_row_number)].alignment = c_c_alignment
217
            ws[col + str(current_row_number)].border = f_border
218
            ws[col + str(current_row_number)] = \
219
                reporting_period_data['names'][i] + "   (" + _('Baseline') + ' - ' \
220
                + _('Actual') + ")(" + reporting_period_data['units'][i] + ")"
221
222
            col = chr(ord(col) + 1)
223
224
        ws[col + str(current_row_number)].fill = table_fill
225
        ws[col + str(current_row_number)].font = name_font
226
        ws[col + str(current_row_number)].alignment = c_c_alignment
227
        ws[col + str(current_row_number)].border = f_border
228
        ws[col + str(current_row_number)] = _('Ton of Standard Coal') + '  (' \
229
            + _('Baseline') + ' - ' + _('Actual') + ') (TCE)'
230
231
        col = chr(ord(col) + 1)
232
233
        ws[col + str(current_row_number)].fill = table_fill
234
        ws[col + str(current_row_number)].font = name_font
235
        ws[col + str(current_row_number)].alignment = c_c_alignment
236
        ws[col + str(current_row_number)].border = f_border
237
        ws[col + str(current_row_number)] = _('Ton of Carbon Dioxide Emissions') \
238
            + '  (' + _('Baseline') + ' - ' + _('Actual') + ') (TCO2E)'
239
240
        current_row_number += 1
241
242
        ws['B' + str(current_row_number)].font = title_font
243
        ws['B' + str(current_row_number)].alignment = c_c_alignment
244
        ws['B' + str(current_row_number)].border = f_border
245
        ws['B' + str(current_row_number)] = _('Saving')
246
247
        col = 'C'
248
249
        for i in range(0, ca_len):
250
            ws[col + str(current_row_number)].font = name_font
251
            ws[col + str(current_row_number)].alignment = c_c_alignment
252
            ws[col + str(current_row_number)].border = f_border
253
            ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2)
254
255
            col = chr(ord(col) + 1)
256
257
        ws[col + str(current_row_number)].font = name_font
258
        ws[col + str(current_row_number)].alignment = c_c_alignment
259
        ws[col + str(current_row_number)].border = f_border
260
        ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgce_saving'] / 1000, 2)
261
262
        col = chr(ord(col) + 1)
263
264
        ws[col + str(current_row_number)].font = name_font
265
        ws[col + str(current_row_number)].alignment = c_c_alignment
266
        ws[col + str(current_row_number)].border = f_border
267
        ws[col + str(current_row_number)] = round(reporting_period_data['total_in_kgco2e_saving'] / 1000, 2)
268
269
        current_row_number += 1
270
271
        ws['B' + str(current_row_number)].font = title_font
272
        ws['B' + str(current_row_number)].alignment = c_c_alignment
273
        ws['B' + str(current_row_number)].border = f_border
274
        ws['B' + str(current_row_number)] = _('Per Unit Area')
275
276
        col = 'C'
277
278
        for i in range(0, ca_len):
279
            ws[col + str(current_row_number)].font = name_font
280
            ws[col + str(current_row_number)].alignment = c_c_alignment
281
            ws[col + str(current_row_number)].border = f_border
282
            ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_per_unit_area_saving'][i], 2) \
283
                if reporting_period_data['subtotals_per_unit_area_saving'][i] is not None else ''
284
285
            col = chr(ord(col) + 1)
286
287
        ws[col + str(current_row_number)].font = name_font
288
        ws[col + str(current_row_number)].alignment = c_c_alignment
289
        ws[col + str(current_row_number)].border = f_border
290
        ws[col + str(current_row_number)] = \
291
            round(reporting_period_data['total_in_kgce_per_unit_area_saving'] / 1000, 2) \
292
            if reporting_period_data['total_in_kgce_per_unit_area_saving'] is not None else ''
293
294
        col = chr(ord(col) + 1)
295
296
        ws[col + str(current_row_number)].font = name_font
297
        ws[col + str(current_row_number)].alignment = c_c_alignment
298
        ws[col + str(current_row_number)].border = f_border
299
        ws[col + str(current_row_number)] = \
300
            round(reporting_period_data['total_in_kgco2e_per_unit_area_saving'] / 1000, 2) \
301
            if reporting_period_data['total_in_kgco2e_per_unit_area_saving'] is not None else ''
302
303
        current_row_number += 1
304
305
        ws['B' + str(current_row_number)].font = title_font
306
        ws['B' + str(current_row_number)].alignment = c_c_alignment
307
        ws['B' + str(current_row_number)].border = f_border
308
        ws['B' + str(current_row_number)] = _('Increment Rate')
309
310
        col = 'C'
311
312
        for i in range(0, ca_len):
313
            ws[col + str(current_row_number)].font = name_font
314
            ws[col + str(current_row_number)].alignment = c_c_alignment
315
            ws[col + str(current_row_number)].border = f_border
316
            ws[col + str(current_row_number)] = str(
317
                round(reporting_period_data['increment_rates_saving'][i] * 100, 2)) + '%' \
318
                if reporting_period_data['increment_rates_saving'][i] is not None else '-'
319
320
            col = chr(ord(col) + 1)
321
322
        ws[col + str(current_row_number)].font = name_font
323
        ws[col + str(current_row_number)].alignment = c_c_alignment
324
        ws[col + str(current_row_number)].border = f_border
325
        ws[col + str(current_row_number)] = str(
326
            round(reporting_period_data['increment_rate_in_kgce_saving'] * 100, 2)) + '%' \
327
            if reporting_period_data['increment_rate_in_kgce_saving'] is not None else '-'
328
329
        col = chr(ord(col) + 1)
330
331
        ws[col + str(current_row_number)].font = name_font
332
        ws[col + str(current_row_number)].alignment = c_c_alignment
333
        ws[col + str(current_row_number)].border = f_border
334
        ws[col + str(current_row_number)] = str(
335
            round(reporting_period_data['increment_rate_in_kgco2e_saving'] * 100, 2)) + '%' \
336
            if reporting_period_data['increment_rate_in_kgco2e_saving'] is not None else '-'
337
338
        current_row_number += 2
339
340
        ws['B' + str(current_row_number)].font = title_font
341
        ws['B' + str(current_row_number)] = name + ' ' + _('Ton of Standard Coal(TCE) by Energy Category')
342
343
        current_row_number += 1
344
        table_start_row_number = current_row_number
345
        chart_start_row_number = current_row_number
346
347
        ws.row_dimensions[current_row_number].height = 60
348
        ws['B' + str(current_row_number)].fill = table_fill
349
        ws['B' + str(current_row_number)].border = f_border
350
351
        ws['C' + str(current_row_number)].fill = table_fill
352
        ws['C' + str(current_row_number)].font = name_font
353
        ws['C' + str(current_row_number)].alignment = c_c_alignment
354
        ws['C' + str(current_row_number)].border = f_border
355
        ws['C' + str(current_row_number)] = _('Saving')
356
357
        ws['D' + str(current_row_number)].fill = table_fill
358
        ws['D' + str(current_row_number)].font = name_font
359
        ws['D' + str(current_row_number)].alignment = c_c_alignment
360
        ws['D' + str(current_row_number)].border = f_border
361
        ws['D' + str(current_row_number)] = _('Ton of Standard Coal(TCE) by Energy Category') 
362
363
        current_row_number += 1
364
365
        subtotals_in_kgce_saving_sum = sum_list(reporting_period_data['subtotals_in_kgce_saving'])
366
367
        for i in range(0, ca_len):
368
            ws['B' + str(current_row_number)].font = title_font
369
            ws['B' + str(current_row_number)].alignment = c_c_alignment
370
            ws['B' + str(current_row_number)].border = f_border
371
            ws['B' + str(current_row_number)] = reporting_period_data['names'][i]
372
373
            ws['C' + str(current_row_number)].font = name_font
374
            ws['C' + str(current_row_number)].alignment = c_c_alignment
375
            ws['C' + str(current_row_number)].border = f_border
376
            ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce_saving'][i] / 1000, 3)
377
378
            ws['D' + str(current_row_number)].font = name_font
379
            ws['D' + str(current_row_number)].alignment = c_c_alignment
380
            ws['D' + str(current_row_number)].border = f_border
381
            ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgce_saving'][i] /
382
                                                          subtotals_in_kgce_saving_sum * 100, 2)) + '%'\
383
                if abs(subtotals_in_kgce_saving_sum) > 0 else '-'
384
385
            current_row_number += 1
386
387
        table_end_row_number = current_row_number - 1
388
389
        if ca_len < 4:
390
            current_row_number = current_row_number - ca_len + 4
391
392
        current_row_number += 1
393
394
        pie = PieChart()
395
        pie.title = name + ' ' + _('Ton of Standard Coal(TCE) by Energy Category')
396
        labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
397
        pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number)
398
        pie.add_data(pie_data, titles_from_data=True)
399
        pie.set_categories(labels)
400
        pie.height = 7.25
401
        pie.width = 9
402
        s1 = pie.series[0]
403
        s1.dLbls = DataLabelList()
404
        s1.dLbls.showCatName = False
405
        s1.dLbls.showVal = True
406
        s1.dLbls.showPercent = True
407
        ws.add_chart(pie, 'E' + str(chart_start_row_number))
408
409
        ws['B' + str(current_row_number)].font = title_font
410
        ws['B' + str(current_row_number)] = name + ' ' + _('Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category')
411
412
        current_row_number += 1
413
        table_start_row_number = current_row_number
414
        chart_start_row_number = current_row_number
415
416
        ws.row_dimensions[current_row_number].height = 60
417
        ws['B' + str(current_row_number)].fill = table_fill
418
        ws['B' + str(current_row_number)].border = f_border
419
420
        ws['C' + str(current_row_number)].fill = table_fill
421
        ws['C' + str(current_row_number)].font = name_font
422
        ws['C' + str(current_row_number)].alignment = c_c_alignment
423
        ws['C' + str(current_row_number)].border = f_border
424
        ws['C' + str(current_row_number)] = _('Saving')
425
426
        ws['D' + str(current_row_number)].fill = table_fill
427
        ws['D' + str(current_row_number)].font = name_font
428
        ws['D' + str(current_row_number)].alignment = c_c_alignment
429
        ws['D' + str(current_row_number)].border = f_border
430
        ws['D' + str(current_row_number)] = _('Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category')
431
432
        current_row_number += 1
433
434
        subtotals_in_kgco2e_saving_sum = sum_list(reporting_period_data['subtotals_in_kgco2e_saving'])
435
436
        for i in range(0, ca_len):
437
            ws['B' + str(current_row_number)].font = title_font
438
            ws['B' + str(current_row_number)].alignment = c_c_alignment
439
            ws['B' + str(current_row_number)].border = f_border
440
            ws['B' + str(current_row_number)] = reporting_period_data['names'][i]
441
442
            ws['C' + str(current_row_number)].font = name_font
443
            ws['C' + str(current_row_number)].alignment = c_c_alignment
444
            ws['C' + str(current_row_number)].border = f_border
445
            ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / 1000, 3)
446
447
            ws['D' + str(current_row_number)].font = name_font
448
            ws['D' + str(current_row_number)].alignment = c_c_alignment
449
            ws['D' + str(current_row_number)].border = f_border
450
            ws['D' + str(current_row_number)] = str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] /
451
                                                          subtotals_in_kgco2e_saving_sum * 100, 2)) + '%'\
452
                if abs(subtotals_in_kgco2e_saving_sum) > 0 else '-'
453
454
            current_row_number += 1
455
456
        table_end_row_number = current_row_number - 1
457
458
        if ca_len < 4:
459
            current_row_number = current_row_number - ca_len + 4
460
461
        current_row_number += 1
462
463
        pie = PieChart()
464
        pie.title = name + ' ' + _('Ton of Carbon Dioxide Emissions(TCO2E) by Energy Category')
465
        labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
466
        pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number)
467
        pie.add_data(pie_data, titles_from_data=True)
468
        pie.set_categories(labels)
469
        pie.height = 7.25
470
        pie.width = 9
471
        s1 = pie.series[0]
472
        s1.dLbls = DataLabelList()
473
        s1.dLbls.showCatName = False
474
        s1.dLbls.showVal = True
475
        s1.dLbls.showPercent = True
476
        ws.add_chart(pie, 'E' + str(chart_start_row_number))
477
478
    ####################################################################################################################
479
    table_start_draw_flag = current_row_number + 1
480
481 View Code Duplication
    if 'values_saving' 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...
482
            reporting_period_data['values_saving'] is None or \
483
            len(reporting_period_data['values_saving']) == 0 or \
484
            'timestamps' not in reporting_period_data.keys() or \
485
            reporting_period_data['timestamps'] is None or \
486
            len(reporting_period_data['timestamps']) == 0 or \
487
            len(reporting_period_data['timestamps'][0]) == 0:
488
        pass
489
    else:
490
        if not is_base_period_timestamp_exists_flag:
491
            reporting_period_data = report['reporting_period']
492
            times = reporting_period_data['timestamps']
493
            ca_len = len(report['reporting_period']['names'])
494
            real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
495
            ws['B' + str(current_row_number)].font = title_font
496
            ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data')
497
498
            current_row_number += 1
499
            # 1: Stand for blank line  2: Stand for title
500
            current_row_number += ca_len * 6 + real_timestamps_len * 6 + 1 + 2
501
            table_start_row_number = current_row_number
502
503
            time = times[0]
504
            has_data = False
505
506
            if len(time) > 0:
507
                has_data = True
508
509
            if has_data:
510
511
                ws.row_dimensions[current_row_number].height = 60
512
                current_col_number = 2
513
                col = format_cell.get_column_letter(current_col_number)
514
                ws[col + str(current_row_number)].fill = table_fill
515
                ws[col + str(current_row_number)].font = title_font
516
                ws[col + str(current_row_number)].border = f_border
517
                ws[col + str(current_row_number)].alignment = c_c_alignment
518
                ws[col + str(current_row_number)] = _('Datetime')
519
520
                for i in range(0, ca_len):
521
                    current_col_number += 1
522
                    col = format_cell.get_column_letter(current_col_number)
523
524
                    ws[col + str(current_row_number)].fill = table_fill
525
                    ws[col + str(current_row_number)].font = title_font
526
                    ws[col + str(current_row_number)].alignment = c_c_alignment
527
                    ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \
528
                        " (" + reporting_period_data['units'][i] + ")"
529
                    ws[col + str(current_row_number)].border = f_border
530
531
                current_row_number += 1
532
533
                for i in range(0, len(time)):
534
                    current_col_number = 2
535
                    col = format_cell.get_column_letter(current_col_number)
536
                    ws[col + str(current_row_number)].font = title_font
537
                    ws[col + str(current_row_number)].alignment = c_c_alignment
538
                    ws[col + str(current_row_number)] = time[i]
539
                    ws[col + str(current_row_number)].border = f_border
540
541
                    for j in range(0, ca_len):
542
                        current_col_number += 1
543
                        col = format_cell.get_column_letter(current_col_number)
544
545
                        ws[col + str(current_row_number)].font = title_font
546
                        ws[col + str(current_row_number)].alignment = c_c_alignment
547
                        ws[col + str(current_row_number)] = round(reporting_period_data['values_saving'][j][i], 2)
548
                        ws[col + str(current_row_number)].border = f_border
549
550
                    current_row_number += 1
551
552
                table_end_row_number = current_row_number - 1
553
554
                current_col_number = 2
555
                col = format_cell.get_column_letter(current_col_number)
556
                ws[col + str(current_row_number)].font = title_font
557
                ws[col + str(current_row_number)].alignment = c_c_alignment
558
                ws[col + str(current_row_number)] = _('Subtotal')
559
                ws[col + str(current_row_number)].border = f_border
560
561
                for i in range(0, ca_len):
562
                    current_col_number += 1
563
                    col = format_cell.get_column_letter(current_col_number)
564
565
                    ws[col + str(current_row_number)].font = title_font
566
                    ws[col + str(current_row_number)].alignment = c_c_alignment
567
                    ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2)
568
                    ws[col + str(current_row_number)].border = f_border
569
570
                    # line
571
                    line = LineChart()
572
                    line.title = _('Reporting Period Saving') + ' - ' \
573
                        + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
574
                    labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
575
                    line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number,
576
                                          max_row=table_end_row_number)
577
                    line.add_data(line_data, titles_from_data=True)
578
                    line.set_categories(labels)
579
                    line_data = line.series[0]
580
                    line_data.marker.symbol = "circle"
581
                    line_data.smooth = True
582
                    line.x_axis.crosses = 'min'
583
                    line.height = 8.25
584
                    line.width = 24
585
                    line.dLbls = DataLabelList()
586
                    line.dLbls.dLblPos = 't'
587
                    line.dLbls.showVal = True
588
                    line.dLbls.showPercent = False
589
                    chart_col = 'B'
590
                    chart_cell = chart_col + str(table_start_draw_flag + 6 * i)
591
                    ws.add_chart(line, chart_cell)
592
593
                current_row_number += 2
594
        else:
595
            base_period_data = report['base_period']
596
            reporting_period_data = report['reporting_period']
597
            base_period_timestamps = base_period_data['timestamps']
598
            reporting_period_timestamps = reporting_period_data['timestamps']
599
            # Tip:
600
            #     base_period_data['names'] == reporting_period_data['names']
601
            #     base_period_data['units'] == reporting_period_data['units']
602
            base_period_data_ca_len = len(base_period_data['names'])
603
            reporting_period_data_ca_len = len(reporting_period_data['names'])
604
            real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
605
            ws['B' + str(current_row_number)].font = title_font
606
            ws['B' + str(current_row_number)] = name + ' ' + _('Detailed Data')
607
608
            current_row_number += 1
609
            # 1: Stand for blank line  2: Stand for title
610
            current_row_number += reporting_period_data_ca_len * 6 + real_timestamps_len * 6 + 1 + 2
611
            table_start_row_number = current_row_number
612
613
            has_data = False
614
615
            if len(base_period_timestamps[0]) or len(reporting_period_timestamps[0]) > 0:
616
                has_data = True
617
618
            if has_data:
619
                ws.row_dimensions[current_row_number].height = 60
620
                current_col_number = 2
621
                col = format_cell.get_column_letter(current_col_number)
622
                ws[col + str(current_row_number)].fill = table_fill
623
                ws[col + str(current_row_number)].font = title_font
624
                ws[col + str(current_row_number)].border = f_border
625
                ws[col + str(current_row_number)].alignment = c_c_alignment
626
                ws[col + str(current_row_number)] = _('Base Period') + " - " + _('Datetime')
627
628
                for i in range(0, base_period_data_ca_len):
629
                    current_col_number += 1
630
                    col = format_cell.get_column_letter(current_col_number)
631
632
                    ws[col + str(current_row_number)].fill = table_fill
633
                    ws[col + str(current_row_number)].font = title_font
634
                    ws[col + str(current_row_number)].alignment = c_c_alignment
635
                    ws[col + str(current_row_number)] = _('Base Period') + " - " + base_period_data['names'][i] + \
636
                        " (" + base_period_data['units'][i] + ")"
637
                    ws[col + str(current_row_number)].border = f_border
638
                current_col_number += 1
639
                col = format_cell.get_column_letter(current_col_number)
640
641
                ws[col + str(current_row_number)].fill = table_fill
642
                ws[col + str(current_row_number)].font = title_font
643
                ws[col + str(current_row_number)].border = f_border
644
                ws[col + str(current_row_number)].alignment = c_c_alignment
645
                ws[col + str(current_row_number)] = _('Reporting Period') + " - " + _('Datetime')
646
647
                for i in range(0, reporting_period_data_ca_len):
648
                    current_col_number += 1
649
                    col = format_cell.get_column_letter(current_col_number)
650
                    ws[col + str(current_row_number)].fill = table_fill
651
                    ws[col + str(current_row_number)].font = title_font
652
                    ws[col + str(current_row_number)].alignment = c_c_alignment
653
                    ws[col + str(current_row_number)] = _('Reporting Period') + " - " \
654
                        + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
655
                    ws[col + str(current_row_number)].border = f_border
656
657
                current_row_number += 1
658
659
                max_timestamps_len = len(base_period_timestamps[0]) \
660
                    if len(base_period_timestamps[0]) >= len(reporting_period_timestamps[0]) \
661
                    else len(reporting_period_timestamps[0])
662
663
                for i in range(0, max_timestamps_len):
664
                    current_col_number = 2
665
                    col = format_cell.get_column_letter(current_col_number)
666
                    ws[col + str(current_row_number)].font = title_font
667
                    ws[col + str(current_row_number)].alignment = c_c_alignment
668
                    ws[col + str(current_row_number)] = base_period_timestamps[0][i] \
669
                        if i < len(base_period_timestamps[0]) else None
670
                    ws[col + str(current_row_number)].border = f_border
671
672
                    for j in range(0, base_period_data_ca_len):
673
                        current_col_number += 1
674
                        col = format_cell.get_column_letter(current_col_number)
675
676
                        ws[col + str(current_row_number)].font = title_font
677
                        ws[col + str(current_row_number)].alignment = c_c_alignment
678
                        ws[col + str(current_row_number)] = round(base_period_data['values_saving'][j][i], 2) \
679
                            if i < len(base_period_data['values_saving'][j]) else None
680
                        ws[col + str(current_row_number)].border = f_border
681
                    current_col_number += 1
682
                    col = format_cell.get_column_letter(current_col_number)
683
684
                    ws[col + str(current_row_number)].font = title_font
685
                    ws[col + str(current_row_number)].alignment = c_c_alignment
686
                    ws[col + str(current_row_number)] = reporting_period_timestamps[0][i] \
687
                        if i < len(reporting_period_timestamps[0]) else None
688
                    ws[col + str(current_row_number)].border = f_border
689
690
                    for j in range(0, reporting_period_data_ca_len):
691
                        current_col_number += 1
692
                        col = format_cell.get_column_letter(current_col_number)
693
694
                        ws[col + str(current_row_number)].font = title_font
695
                        ws[col + str(current_row_number)].alignment = c_c_alignment
696
                        ws[col + str(current_row_number)] = round(reporting_period_data['values_saving'][j][i], 2) \
697
                            if i < len(reporting_period_data['values_saving'][j]) else None
698
                        ws[col + str(current_row_number)].border = f_border
699
700
                    current_row_number += 1
701
702
                current_col_number = 2
703
                col = format_cell.get_column_letter(current_col_number)
704
                ws[col + str(current_row_number)].font = title_font
705
                ws[col + str(current_row_number)].alignment = c_c_alignment
706
                ws[col + str(current_row_number)] = _('Subtotal')
707
                ws[col + str(current_row_number)].border = f_border
708
709
                for i in range(0, base_period_data_ca_len):
710
                    current_col_number += 1
711
                    col = format_cell.get_column_letter(current_col_number)
712
                    ws[col + str(current_row_number)].font = title_font
713
                    ws[col + str(current_row_number)].alignment = c_c_alignment
714
                    ws[col + str(current_row_number)] = round(base_period_data['subtotals_saving'][i], 2)
715
                    ws[col + str(current_row_number)].border = f_border
716
717
                current_col_number += 1
718
                col = format_cell.get_column_letter(current_col_number)
719
720
                ws[col + str(current_row_number)].font = title_font
721
                ws[col + str(current_row_number)].alignment = c_c_alignment
722
                ws[col + str(current_row_number)] = _('Subtotal')
723
                ws[col + str(current_row_number)].border = f_border
724
725
                for i in range(0, reporting_period_data_ca_len):
726
                    current_col_number += 1
727
                    col = format_cell.get_column_letter(current_col_number)
728
                    ws[col + str(current_row_number)].font = title_font
729
                    ws[col + str(current_row_number)].alignment = c_c_alignment
730
                    ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2)
731
                    ws[col + str(current_row_number)].border = f_border
732
733
                for i in range(0, reporting_period_data_ca_len):
734
                    # line
735
                    line = LineChart()
736
                    line.title = _('Reporting Period Saving') + ' / ' \
737
                        + _('Reporting Period Saving') + ' - ' \
738
                        + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
739
                    labels = Reference(ws, min_col=2 + base_period_data_ca_len + 1,
740
                                       min_row=table_start_row_number + 1,
741
                                       max_row=table_start_row_number + len(reporting_period_timestamps[0]))
742
                    base_line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number,
743
                                               max_row=table_start_row_number + len(reporting_period_timestamps[0]))
744
                    reporting_line_data = Reference(ws, min_col=3 + base_period_data_ca_len + 1 + i,
745
                                                    min_row=table_start_row_number,
746
                                                    max_row=table_start_row_number
747
                                                    + len(reporting_period_timestamps[0]))
748
                    line.add_data(base_line_data, titles_from_data=True)
749
                    line.add_data(reporting_line_data, titles_from_data=True)
750
                    line.set_categories(labels)
751
                    for j in range(len(line.series)):
752
                        line.series[j].marker.symbol = "circle"
753
                        line.series[j].smooth = True
754
                    line.x_axis.crosses = 'min'
755
                    line.height = 8.25
756
                    line.width = 24
757
                    line.dLbls = DataLabelList()
758
                    line.dLbls.dLblPos = 't'
759
                    line.dLbls.showVal = True
760
                    line.dLbls.showPercent = False
761
                    chart_col = 'B'
762
                    chart_cell = chart_col + str(table_start_draw_flag + 6 * i)
763
                    ws.add_chart(line, chart_cell)
764
765
                current_row_number += 2
766
767
    ####################################################################################################################
768
    if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \
769
            len(report['child_space']["energy_category_names"]) == 0 \
770
            or 'child_space_names_array' not in report['child_space'].keys() \
771
            or report['child_space']['energy_category_names'] is None \
772
            or len(report['child_space']['child_space_names_array']) == 0 \
773
            or len(report['child_space']['child_space_names_array'][0]) == 0:
774
        pass
775
    else:
776
        child_space_data = report['child_space']
777
        ca_len = len(child_space_data['energy_category_names'])
778
779
        ws['B' + str(current_row_number)].font = title_font
780
        ws['B' + str(current_row_number)] = name + ' ' + _('Child Spaces Data')
781
782
        current_row_number += 1
783
        table_start_row_number = current_row_number
784
785
        ws.row_dimensions[current_row_number].height = 60
786
        ws['B' + str(current_row_number)].fill = table_fill
787
        ws['B' + str(current_row_number)].font = name_font
788
        ws['B' + str(current_row_number)].alignment = c_c_alignment
789
        ws['B' + str(current_row_number)].border = f_border
790
        ws['B' + str(current_row_number)] = _('Child Space')
791
792
        col = 'C'
793
794
        for i in range(0, ca_len):
795
            ws[col + str(current_row_number)].fill = table_fill
796
            ws[col + str(current_row_number)].font = name_font
797
            ws[col + str(current_row_number)].alignment = c_c_alignment
798
            ws[col + str(current_row_number)].border = f_border
799
            ws[col + str(current_row_number)] = \
800
                child_space_data['energy_category_names'][i] + " (" + child_space_data['units'][i] + ")"
801
            col = chr(ord(col) + 1)
802
803
        current_row_number += 1
804
        ca_child_len = len(child_space_data['child_space_names_array'][0])
805
806
        for i in range(0, ca_child_len):
807
            ws['B' + str(current_row_number)].font = title_font
808
            ws['B' + str(current_row_number)].alignment = c_c_alignment
809
            ws['B' + str(current_row_number)].border = f_border
810
            ws['B' + str(current_row_number)] = child_space_data['child_space_names_array'][0][i]
811
            current_row_number += 1
812
813
        current_row_number -= ca_child_len
814
815
        for i in range(0, ca_child_len):
816
            col = 'C'
817
            for j in range(0, ca_len):
818
                ws[col + str(current_row_number)].font = name_font
819
                ws[col + str(current_row_number)].alignment = c_c_alignment
820
                ws[col + str(current_row_number)].border = f_border
821
                ws[col + str(current_row_number)] = round(child_space_data['subtotals_saving_array'][j][i], 2)
822
                col = chr(ord(col) + 1)
823
824
            current_row_number += 1
825
826
        table_end_row_number = current_row_number - 1
827
828
        for i in range(0, ca_len):
829
            pie = PieChart()
830
            labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
831
            pie_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number)
832
            pie.add_data(pie_data, titles_from_data=True)
833
            pie.set_categories(labels)
834
            pie.title = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
835
            pie.height = 6.6
836
            pie.width = 9
837
            s1 = pie.series[0]
838
            s1.dLbls = DataLabelList()
839
            s1.dLbls.showCatName = False
840
            s1.dLbls.showVal = True
841
            s1.dLbls.showPercent = True
842
            if i % 2 == 0:
843
                chart_cell = 'B' + str(current_row_number)
844
            else:
845
                chart_cell = 'E' + str(current_row_number)
846
                current_row_number += 5
847
            ws.add_chart(pie, chart_cell)
848
849
        if ca_len % 2 == 1:
850
            current_row_number += 5
851
852
        current_row_number += 1
853
    ####################################################################################################################
854
    current_sheet_parameters_row_number = table_start_draw_flag + len(reporting_period_data['names']) * 6 + 1
855 View Code Duplication
    if 'parameters' not in report.keys() or \
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
856
            report['parameters'] is None or \
857
            'names' not in report['parameters'].keys() or \
858
            report['parameters']['names'] is None or \
859
            len(report['parameters']['names']) == 0 or \
860
            'timestamps' not in report['parameters'].keys() or \
861
            report['parameters']['timestamps'] is None or \
862
            len(report['parameters']['timestamps']) == 0 or \
863
            'values' not in report['parameters'].keys() or \
864
            report['parameters']['values'] is None or \
865
            len(report['parameters']['values']) == 0 or \
866
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
867
        pass
868
    else:
869
        ################################################################################################################
870
        # new worksheet
871
        ################################################################################################################
872
873
        parameters_data = report['parameters']
874
        parameters_names_len = len(parameters_data['names'])
875
876
        file_name = ws.title
877
        parameters_ws = wb.create_sheet(file_name + _('Parameters'))
878
879
        parameters_timestamps_data_max_len = \
880
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))
881
882
        # Row height
883
        parameters_ws.row_dimensions[1].height = 102
884
        for i in range(2, 7 + 1):
885
            parameters_ws.row_dimensions[i].height = 42
886
887
        for i in range(8, parameters_timestamps_data_max_len + 10):
888
            parameters_ws.row_dimensions[i].height = 60
889
890
        # Col width
891
        parameters_ws.column_dimensions['A'].width = 1.5
892
893
        parameters_ws.column_dimensions['B'].width = 25.0
894
895
        for i in range(3, 12 + parameters_names_len * 3):
896
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0
897
898
        # Img
899
        img = Image("excelexporters/myems.png")
900
        parameters_ws.add_image(img, 'A1')
901
902
        # Title
903
        parameters_ws['B3'].alignment = b_r_alignment
904
        parameters_ws['B3'] = _('Name') + ':'
905
        parameters_ws['C3'].border = b_border
906
        parameters_ws['C3'].alignment = b_c_alignment
907
        parameters_ws['C3'] = name
908
909
        parameters_ws['D3'].alignment = b_r_alignment
910
        parameters_ws['D3'] = _('Period Type') + ':'
911
        parameters_ws['E3'].border = b_border
912
        parameters_ws['E3'].alignment = b_c_alignment
913
        parameters_ws['E3'] = period_type
914
915
        parameters_ws['B4'].alignment = b_r_alignment
916
        parameters_ws['B4'] = _('Reporting Start Datetime') + ':'
917
        parameters_ws['C4'].border = b_border
918
        parameters_ws['C4'].alignment = b_c_alignment
919
        parameters_ws['C4'] = reporting_start_datetime_local
920
921
        parameters_ws['D4'].alignment = b_r_alignment
922
        parameters_ws['D4'] = _('Reporting End Datetime') + ':'
923
        parameters_ws['E4'].border = b_border
924
        parameters_ws['E4'].alignment = b_c_alignment
925
        parameters_ws['E4'] = reporting_end_datetime_local
926
927
        parameters_ws_current_row_number = 6
928
929
        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
930
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' ' + _('Parameters')
931
932
        parameters_ws_current_row_number += 1
933
934
        parameters_table_start_row_number = parameters_ws_current_row_number
935
936
        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80
937
938
        parameters_ws_current_row_number += 1
939
940
        table_current_col_number = 2
941
942
        for i in range(0, parameters_names_len):
943
944
            if len(parameters_data['timestamps'][i]) == 0:
945
                continue
946
947
            col = format_cell.get_column_letter(table_current_col_number)
948
949
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
950
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
951
952
            col = format_cell.get_column_letter(table_current_col_number + 1)
953
954
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
955
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
956
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
957
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
958
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]
959
960
            table_current_row_number = parameters_ws_current_row_number
961
962
            for j, value in enumerate(list(parameters_data['timestamps'][i])):
963
                col = format_cell.get_column_letter(table_current_col_number)
964
965
                parameters_ws[col + str(table_current_row_number)].border = f_border
966
                parameters_ws[col + str(table_current_row_number)].font = title_font
967
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
968
                parameters_ws[col + str(table_current_row_number)] = value
969
970
                col = format_cell.get_column_letter(table_current_col_number + 1)
971
972
                parameters_ws[col + str(table_current_row_number)].border = f_border
973
                parameters_ws[col + str(table_current_row_number)].font = title_font
974
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
975
                parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2)
976
977
                table_current_row_number += 1
978
979
            table_current_col_number = table_current_col_number + 3
980
981
        ################################################################################################################
982
        # parameters chart and parameters table
983
        ################################################################################################################
984
985
        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
986
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' ' + _('Parameters')
987
988
        current_sheet_parameters_row_number += 1
989
990
        chart_start_row_number = current_sheet_parameters_row_number
991
992
        col_index = 0
993
994
        for i in range(0, parameters_names_len):
995
996
            if len(parameters_data['timestamps'][i]) == 0:
997
                continue
998
999
            line = LineChart()
1000
            data_col = 3 + col_index * 3
1001
            labels_col = 2 + col_index * 3
1002
            col_index += 1
1003
            line.title = _('Parameters') + ' - ' + \
1004
                parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
1005
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
1006
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
1007
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
1008
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
1009
            line.add_data(line_data, titles_from_data=True)
1010
            line.set_categories(labels)
1011
            line_data = line.series[0]
1012
            line_data.marker.symbol = "circle"
1013
            line_data.smooth = True
1014
            line.x_axis.crosses = 'min'
1015
            line.height = 8.25
1016
            line.width = 24
1017
            line.dLbls = DataLabelList()
1018
            line.dLbls.dLblPos = 't'
1019
            line.dLbls.showVal = False
1020
            line.dLbls.showPercent = False
1021
            chart_col = 'B'
1022
            chart_cell = chart_col + str(chart_start_row_number)
1023
            chart_start_row_number += 6
1024
            ws.add_chart(line, chart_cell)
1025
1026
        current_sheet_parameters_row_number = chart_start_row_number
1027
1028
        current_sheet_parameters_row_number += 1
1029
    ####################################################################################################################
1030
    filename = str(uuid.uuid4()) + '.xlsx'
1031
    wb.save(filename)
1032
1033
    return filename
1034
1035
1036
def sum_list(lists):
1037
    total = Decimal(0)
1038
1039
    for i in range(0, len(lists)):
1040
        total += lists[i]
1041
1042
    return total
1043
1044
1045
def timestamps_data_all_equal_0(lists):
1046
    for i, value in enumerate(list(lists)):
1047
        if len(value) > 0:
1048
            return False
1049
1050
    return True
1051
1052
1053
def get_parameters_timestamps_lists_max_len(parameters_timestamps_lists):
1054
    max_len = 0
1055
    for i, value in enumerate(list(parameters_timestamps_lists)):
1056
        if len(value) > max_len:
1057
            max_len = len(value)
1058
1059
    return max_len
1060
1061
1062
def timestamps_data_not_equal_0(lists):
1063
    number = 0
1064
    for i, value in enumerate(list(lists)):
1065
        if len(value) > 0:
1066
            number += 1
1067
    return number
1068
1069
1070 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...
1071
    timestamps = base_period_data['timestamps']
1072
1073
    if len(timestamps) == 0:
1074
        return False
1075
1076
    for timestamp in timestamps:
1077
        if len(timestamp) > 0:
1078
            return True
1079
1080
    return False
1081
1082