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

is_base_period_timestamp_exists()   A

Complexity

Conditions 4

Size

Total Lines 11
Code Lines 8

Duplication

Lines 11
Ratio 100 %

Importance

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