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

excelexporters.spacesaving.generate_excel()   F

Complexity

Conditions 94

Size

Total Lines 963
Code Lines 742

Duplication

Lines 459
Ratio 47.66 %

Importance

Changes 0
Metric Value
eloc 742
dl 459
loc 963
rs 0
c 0
b 0
f 0
cc 94
nop 8

How to fix   Long Method    Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like excelexporters.spacesaving.generate_excel() 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.

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 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