Skip to content

Commit a97e407

Browse files
committed
fix some shit
faulty query on 'like_pattern' revisions ignored if pattern out of the original data TODO: probably have to reject data introduced via XLSX files (they contain a weird json file)
1 parent 3afa339 commit a97e407

File tree

5 files changed

+63
-45
lines changed

5 files changed

+63
-45
lines changed

src/util/spreadsheet/data_wrappers.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ def create_data_source_from_cmd(cmd):
2222
if cmd["type"] in ["CREATE_CHART", "UPDATE_CHART"]:
2323
return OdooChartCmdV16(cmd)
2424
elif cmd["type"] == "INSERT_PIVOT":
25-
if version_gte("17.0"):
26-
pass # TODO
25+
if version_gte("saas~17.1"):
26+
return InsertPivotCmdV171(cmd)
27+
return InsertPivotCmdV16(cmd)
28+
elif cmd["type"] == "RE_INSERT_PIVOT":
2729
return InsertPivotCmdV16(cmd)
2830
elif cmd["type"] == "INSERT_ODOO_LIST":
2931
return InsertListCmdV16(cmd)
@@ -489,3 +491,9 @@ def col_group_by(self):
489491
@col_group_by.setter
490492
def col_group_by(self, group_by):
491493
self.definition["metaData"]["colGroupBys"] = group_by
494+
495+
496+
class InsertPivotCmdV171(InsertPivotCmdV16):
497+
@property
498+
def id(self):
499+
return self.cmd["pivotId"]

src/util/spreadsheet/fields.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,14 @@ def remove_field_in_all_spreadsheets(cr, model, field):
3333

3434

3535
def remove_field(cr, model, field, data, revisions=()):
36-
try:
37-
spreadsheet = Spreadsheet(data)
38-
_remove_field_from_filter_matching(cr, spreadsheet, model, field)
39-
adapters = _remove_field_from_list(spreadsheet, model, field)
40-
adapters += _remove_field_from_pivot(spreadsheet, model, field)
41-
adapters += _remove_field_from_graph(spreadsheet, model, field)
42-
adapters += _remove_field_from_view_link(spreadsheet, model, field)
43-
spreadsheet.clean_empty_cells()
44-
return spreadsheet.data, transform_revisions_data(revisions, *adapters)
45-
except:
46-
import ipdb;ipdb.set_trace()
36+
spreadsheet = Spreadsheet(data)
37+
_remove_field_from_filter_matching(cr, spreadsheet, model, field)
38+
adapters = _remove_field_from_list(spreadsheet, model, field)
39+
adapters += _remove_field_from_pivot(spreadsheet, model, field)
40+
adapters += _remove_field_from_graph(spreadsheet, model, field)
41+
adapters += _remove_field_from_view_link(spreadsheet, model, field)
42+
spreadsheet.clean_empty_cells()
43+
return spreadsheet.data, transform_revisions_data(revisions, *adapters)
4744

4845

4946
def _rename_function_fields(content, data_source_ids, functions, old, new):
@@ -335,25 +332,25 @@ def adapt_re_insert(cmd):
335332

336333

337334
def _remove_field_from_pivot(spreadsheet: Spreadsheet, model, field):
338-
pivot_to_delete = [
335+
pivots_to_delete = [
339336
pivot.id for pivot in spreadsheet.pivots if pivot.model == model and field in pivot_fields(pivot)
340337
]
341338

342339
adapters = remove_pivots(
343340
spreadsheet,
344-
pivot_to_delete,
341+
pivots_to_delete,
345342
lambda pivot: pivot.model == model and field in pivot_fields(pivot),
346343
)
347344
return adapters
348345

349346

350347
def _remove_field_from_graph(spreadsheet: Spreadsheet, model, field):
351-
chart_to_delete = [
348+
charts_to_delete = [
352349
chart.id for chart in spreadsheet.odoo_charts if chart.model == model and field in chart_fields(chart)
353350
]
354351
return remove_odoo_charts(
355352
spreadsheet,
356-
chart_to_delete,
353+
charts_to_delete,
357354
lambda chart: chart.model == model and field in chart_fields(chart),
358355
)
359356

src/util/spreadsheet/misc.py

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ def read_spreadsheet_initial_data(cr, like_pattern=""):
4545
cr.execute(
4646
"""
4747
SELECT doc.id AS document_id, a.id AS attachment_id, a.db_datas
48-
FROM documents_document doc
49-
LEFT JOIN ir_attachment a ON a.id = doc.attachment_id
50-
WHERE doc.handler='spreadsheet'
51-
AND position(%s::bytea in db_datas) > 0
48+
FROM documents_document doc
49+
LEFT JOIN ir_attachment a ON a.id = doc.attachment_id
50+
WHERE doc.handler='spreadsheet'
51+
AND position(%s::bytea in db_datas) > 0
5252
""",
5353
[like_pattern],
5454
)
@@ -85,30 +85,41 @@ def _magic_spreadsheet_field(cr):
8585
return cr.fetchone()[0] and 'spreadsheet_binary_data' or 'data'
8686

8787
def apply_in_all_spreadsheets(cr, like_pattern, callback):
88-
# _logger.info("upgrading initial data and revisions")
8988
print("like pattern : ", like_pattern)
9089
b = False
9190
# upgrade the initial data and all revisions based on it
9291
for attachment_id, res_model, res_id, db_datas in read_spreadsheet_initial_data(cr, like_pattern):
9392
print("attachment : ", attachment_id)
9493
print("datas: ", len(db_datas))
9594
b = True
96-
revisions_data = []
97-
revisions_ids = []
98-
## FIXME TODORAR batch the calls
99-
for revision_id, commands in get_revisions(cr, res_model, res_id, like_pattern):
100-
revisions_data.append(json.loads(commands))
101-
revisions_ids.append(revision_id)
102-
data, revisions = callback(db_datas, revisions_data)
95+
96+
data, _ = callback(db_datas, [])
10397
write_attachment(cr, attachment_id, data)
104-
for revision_id, revision in zip(revisions_ids, revisions):
98+
99+
## FIXME TODORAR batch the calls
100+
## FIXME we have to pass in the revisions regardless of the base data stuff
101+
# upgrade revisions
102+
# regardless of res_model res_id
103+
revisions_data = []
104+
revisions_ids = []
105+
106+
# if like_pattern == "tax_audit":
107+
# import ipdb;ipdb.set_trace()
108+
for revision_id, commands in get_revisions(cr, "res_model", "res_id", like_pattern):
109+
revisions_data.append(json.loads(commands))
110+
revisions_ids.append(revision_id)
111+
data, revisions = callback({}, revisions_data)
112+
# write_attachment(cr, attachment_id, data)
113+
print("wooooooooooooooooot\n"*20)
114+
print(revisions)
115+
for rev_id, revision in zip(revisions_ids, revisions):
105116
cr.execute(
106117
"""
107118
UPDATE spreadsheet_revision
108119
SET commands=%s
109120
WHERE id=%s
110121
""",
111-
[json.dumps(revision), revision_id],
122+
[json.dumps(revision), rev_id],
112123
)
113124
if b:
114125
_logger.info("upgrading initial data and revisions")
@@ -132,8 +143,8 @@ def write_attachment(cr, attachment_id, data):
132143
cr.execute(
133144
"""
134145
UPDATE ir_attachment
135-
SET db_datas=%s
136-
WHERE id=%s
146+
SET db_datas=%s
147+
WHERE id=%s
137148
""",
138149
[json.dumps(data).encode(), attachment_id]
139150
)
@@ -144,22 +155,19 @@ def get_revisions(cr, res_model, res_id, like_pattern):
144155
cr.execute(
145156
"""
146157
SELECT id, commands
147-
FROM spreadsheet_revision
148-
WHERE commands LIKE %s
149-
AND res_model=%s
150-
AND res_id=%s
158+
FROM spreadsheet_revision
159+
WHERE commands LIKE %s
151160
""",
152-
[like_pattern, res_model, res_id],
161+
['%' + like_pattern + '%'],
153162
)
154163
else:
155164
cr.execute(
156165
"""
157166
SELECT id, commands
158-
FROM spreadsheet_revision
159-
WHERE commands LIKE %s
160-
AND document_id=%s
167+
FROM spreadsheet_revision
168+
WHERE commands LIKE %s
161169
""",
162-
[like_pattern, res_id],
170+
[like_pattern],
163171
)
164172
return cr.fetchall()
165173

@@ -330,20 +338,24 @@ def remove_odoo_charts(spreadsheet: Spreadsheet, chart_ids: List[str], insert_cm
330338
spreadsheet.delete_figures(*chart_ids)
331339

332340
def adapt_create_chart(cmd):
341+
# import ipdb;ipdb.set_trace()
342+
333343
chart = create_data_source_from_cmd(cmd)
334344
if cmd["definition"]["type"].startswith("odoo_") and insert_cmd_predicate(chart):
335345
chart_ids.append(cmd["id"])
336346
return Drop
337347

338348
def adapt_chart_cmd_with_id(cmd):
349+
# import ipdb;ipdb.set_trace()
350+
339351
if cmd["id"] in chart_ids:
340352
return Drop
341353

342354
def adapt_global_filters(cmd):
343355
if cmd.get("chart"):
344356
for chart_id in chart_ids:
345357
cmd["chart"].pop(chart_id, None)
346-
358+
# import ipdb;ipdb.set_trace()
347359
return (
348360
CommandAdapter("CREATE_CHART", adapt_create_chart),
349361
CommandAdapter("UPDATE_CHART", adapt_chart_cmd_with_id),

src/util/spreadsheet/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def _remove_model_from_charts(model, spreadsheet: Spreadsheet):
125125
def _remove_model_from_filters(model, spreadsheet: Spreadsheet):
126126
global_filters = spreadsheet.global_filters
127127
to_delete = [
128-
filter["id"] for filter in global_filters if filter["type"] == "relation" and filter["modelName"] == model
128+
gFilter["id"] for gFilter in global_filters if gFilter["type"] == "relation" and gFilter["modelName"] == model
129129
]
130130
spreadsheet.delete_global_filters(*to_delete)
131131

src/util/spreadsheet/revisions.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ def transform_revisions(cr, revisions, *adapters: Iterable[CommandAdapter]):
4141
[json.dumps(data), revision_id],
4242
)
4343
def transform_revisions_data(revisions, *adapters: Iterable[CommandAdapter]):
44+
# import ipdb;ipdb.set_trace()
4445
for data in revisions:
4546
commands = data.get("commands", [])
4647
if not commands:
4748
continue
4849
new_commands = transform_commands(commands, *adapters)
4950
if new_commands is None:
50-
continue
51+
new_commands = []
5152
# ensures it's jsonyfiable (converts tuples to lists) (probably should be removed)
5253
data["commands"] = json.loads(json.dumps(new_commands))
5354
return revisions

0 commit comments

Comments
 (0)