|
24 | 24 | from datetime import datetime |
25 | 25 | from io import StringIO |
26 | 26 | from plone.protect.interfaces import IDisableCSRFProtection |
27 | | -from plone.restapi.serializer.converters import json_compatible |
28 | 27 | from souper.soup import Record |
29 | 28 | from zExceptions import BadRequest |
30 | 29 | from zope.component import getMultiAdapter |
|
38 | 37 | SKIP_ATTRS = ["block_id", "fields_labels", "fields_order"] |
39 | 38 |
|
40 | 39 |
|
41 | | -def get_data(self): |
42 | | - store = getMultiAdapter((self.context, self.request), IFormDataStore) |
43 | | - sbuf = StringIO() |
44 | | - fixed_columns = ["date"] |
45 | | - columns = [] |
46 | | - # start patch |
47 | | - custom_colums = [] |
48 | | - if self.form_block.get("limit", None) is not None: |
49 | | - limit = int(self.form_block["limit"]) |
50 | | - if limit > -1: |
51 | | - custom_colums.append("waiting_list") |
52 | | - # end patch |
53 | | - |
54 | | - rows = [] |
55 | | - # start patch |
56 | | - for index, item in enumerate(reversed(store.search())): |
57 | | - # end patch |
58 | | - data = {} |
59 | | - fields_labels = item.attrs.get("fields_labels", {}) |
60 | | - for k in self.get_ordered_keys(item): |
61 | | - if k in SKIP_ATTRS: |
62 | | - continue |
63 | | - value = item.attrs.get(k, None) |
64 | | - label = fields_labels.get(k, k) |
65 | | - if label not in columns and label not in fixed_columns: |
66 | | - columns.append(label) |
67 | | - data[label] = json_compatible(value) |
68 | | - for k in fixed_columns: |
69 | | - # add fixed columns values |
70 | | - value = item.attrs.get(k, None) |
71 | | - data[k] = json_compatible(value) |
72 | | - |
73 | | - # start patch |
74 | | - if "waiting_list" in custom_colums: |
75 | | - data.update( |
76 | | - { |
77 | | - "waiting_list": ( |
78 | | - translate(_("yes_label", default="Yes")) |
79 | | - if not (index < limit) |
80 | | - else translate(_("no_label", default="No")) |
81 | | - ) |
82 | | - } |
83 | | - ) |
84 | | - # end patch |
85 | | - |
86 | | - rows.append(data) |
87 | | - columns.extend(fixed_columns) |
88 | | - columns.extend(custom_colums) |
89 | | - writer = csv.DictWriter(sbuf, fieldnames=columns, quoting=csv.QUOTE_ALL) |
90 | | - writer.writeheader() |
91 | | - for row in rows: |
92 | | - writer.writerow(row) |
93 | | - res = sbuf.getvalue() |
94 | | - sbuf.close() |
95 | | - return res |
| 40 | +def wrapper_get_data(orig): |
| 41 | + def get_data(self): |
| 42 | + res = orig(self) |
| 43 | + has_waiting_list = False |
| 44 | + if self.form_block.get("limit") is not None: |
| 45 | + limit = int(self.form_block["limit"]) |
| 46 | + if limit > -1: |
| 47 | + has_waiting_list = True |
| 48 | + if has_waiting_list: |
| 49 | + reader = csv.DictReader(StringIO(res)) |
| 50 | + columns = reader.fieldnames + ["waiting_list"] |
| 51 | + sbuf = StringIO() |
| 52 | + writer = csv.DictWriter(sbuf, fieldnames=columns, quoting=csv.QUOTE_ALL) |
| 53 | + writer.writeheader() |
| 54 | + for idx, row in enumerate(reader): |
| 55 | + if idx >= limit: |
| 56 | + row["waiting_list"] = translate(_("yes_label", default="Yes")) |
| 57 | + else: |
| 58 | + row["waiting_list"] = translate(_("no_label", default="No")) |
| 59 | + writer.writerow(row) |
| 60 | + res = sbuf.getvalue() |
| 61 | + sbuf.close() |
| 62 | + return res |
| 63 | + else: |
| 64 | + return res |
| 65 | + |
| 66 | + return get_data |
96 | 67 |
|
97 | 68 |
|
98 | 69 | def patch_FormDataExportGet_get_data(): |
99 | 70 | logger.info( |
100 | | - "Patch get_data methos of class FormDataExporterGet from collective.volto.formsupport" # noqa |
| 71 | + "Patch collective.volto.formsupport.restapi.services.form_data.csv.FormDataExportGet.get_data " |
| 72 | + "addding waiting_list feature" |
101 | 73 | ) |
102 | | - FormDataExportGet.get_data = get_data |
| 74 | + FormDataExportGet.get_data = wrapper_get_data(FormDataExportGet.get_data) |
103 | 75 |
|
104 | 76 |
|
105 | 77 | def reply(self): |
|
0 commit comments