Skip to content

Commit 75b4584

Browse files
committed
Refactor load_dump to pass the complexity checker
1 parent af3d183 commit 75b4584

File tree

2 files changed

+85
-53
lines changed

2 files changed

+85
-53
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ repos:
3030
rev: 6.0.0
3131
hooks:
3232
- id: flake8
33-
args: ["--ignore=E203,E501,W503"]
33+
args: ["--ignore=E203,E501,W503", "--max-complexity=10"]
3434
additional_dependencies:
3535
- flake8-bugbear
3636
- repo: https://github.com/pre-commit/mirrors-prettier

feincms3_data/data.py

Lines changed: 84 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -116,59 +116,91 @@ def load_dump(
116116

117117
with transaction.atomic(using=using):
118118
connection = connections[using]
119-
models = set()
120119
with connection.constraint_checks_disabled():
121-
for spec in data["specs"]:
122-
if objs := objects[spec["model"]]:
123-
for ds in objs:
124-
if ignore_missing_m2m := spec.get("ignore_missing_m2m"):
125-
for field_name in ignore_missing_m2m:
126-
ignore_missing_m2m_data[ds][
127-
field_name
128-
] = ds.m2m_data.pop(field_name, [])
129-
130-
# _do_save changes the PK if the model is in
131-
# save_as_new_models
132-
seen_pks[ds.object._meta.label_lower].add(ds.object.pk)
133-
_do_save(
134-
ds,
135-
pk_map=save_as_new_pk_map,
136-
save_as_new_models=save_as_new_models,
137-
)
138-
seen_pks[ds.object._meta.label_lower].add(ds.object.pk)
139-
models.add(ds.object.__class__)
140-
141-
progress(f"Saved {len(objs)} {spec['model']} objects")
142-
143-
for spec in reversed(data["specs"]):
144-
if not spec.get("delete_missing"):
145-
continue
146-
147-
queryset = _model_queryset(spec)
148-
deleted = queryset.exclude(pk__in=seen_pks[spec["model"]]).delete()
149-
if deleted[0]:
150-
progress(f"Deleted {spec['model']} objects: {deleted}")
151-
152-
pks = pk_cache()
153-
for ds, lists in ignore_missing_m2m_data.items():
154-
for field_name, field_pks in lists.items():
155-
field = ds.object._meta.get_field(field_name)
156-
existing = pks(field.related_model)
157-
getattr(ds.object, field_name).set(set(field_pks) & existing)
158-
159-
table_names = [model._meta.db_table for model in models]
160-
try:
161-
connection.check_constraints(table_names=table_names)
162-
except Exception as e:
163-
e.args = ("Problem installing fixtures: %s" % e,)
164-
raise
165-
166-
sequence_sql = connection.ops.sequence_reset_sql(no_style(), models)
167-
if sequence_sql:
168-
progress("Resetting sequences")
169-
with connection.cursor() as cursor:
170-
for line in sequence_sql:
171-
cursor.execute(line)
120+
models = set()
121+
_load_dump(
122+
data,
123+
objects,
124+
progress,
125+
seen_pks,
126+
save_as_new_pk_map,
127+
save_as_new_models,
128+
ignore_missing_m2m_data,
129+
models,
130+
)
131+
_finalize(
132+
progress,
133+
connection,
134+
models,
135+
)
136+
137+
138+
def _load_dump(
139+
data,
140+
objects,
141+
progress,
142+
seen_pks,
143+
save_as_new_pk_map,
144+
save_as_new_models,
145+
ignore_missing_m2m_data,
146+
models,
147+
):
148+
for spec in data["specs"]:
149+
if objs := objects[spec["model"]]:
150+
for ds in objs:
151+
for field_name in spec.get("ignore_missing_m2m", ()):
152+
ignore_missing_m2m_data[ds][field_name] = ds.m2m_data.pop(
153+
field_name, []
154+
)
155+
156+
# _do_save changes the PK if the model is in
157+
# save_as_new_models
158+
seen_pks[ds.object._meta.label_lower].add(ds.object.pk)
159+
_do_save(
160+
ds,
161+
pk_map=save_as_new_pk_map,
162+
save_as_new_models=save_as_new_models,
163+
)
164+
seen_pks[ds.object._meta.label_lower].add(ds.object.pk)
165+
models.add(ds.object.__class__)
166+
167+
progress(f"Saved {len(objs)} {spec['model']} objects")
168+
169+
for spec in reversed(data["specs"]):
170+
if not spec.get("delete_missing"):
171+
continue
172+
173+
queryset = _model_queryset(spec)
174+
deleted = queryset.exclude(pk__in=seen_pks[spec["model"]]).delete()
175+
if deleted[0]:
176+
progress(f"Deleted {spec['model']} objects: {deleted}")
177+
178+
pks = pk_cache()
179+
for ds, lists in ignore_missing_m2m_data.items():
180+
for field_name, field_pks in lists.items():
181+
field = ds.object._meta.get_field(field_name)
182+
existing = pks(field.related_model)
183+
getattr(ds.object, field_name).set(set(field_pks) & existing)
184+
185+
186+
def _finalize(
187+
progress,
188+
connection,
189+
models,
190+
):
191+
table_names = [model._meta.db_table for model in models]
192+
try:
193+
connection.check_constraints(table_names=table_names)
194+
except Exception as e:
195+
e.args = ("Problem installing fixtures: %s" % e,)
196+
raise
197+
198+
sequence_sql = connection.ops.sequence_reset_sql(no_style(), models)
199+
if sequence_sql:
200+
progress("Resetting sequences")
201+
with connection.cursor() as cursor:
202+
for line in sequence_sql:
203+
cursor.execute(line)
172204

173205

174206
def pk_cache():

0 commit comments

Comments
 (0)