More fixes for the makeresources management command

- Legacy-Id: 13310
This commit is contained in:
Henrik Levkowetz 2017-05-11 05:06:41 +00:00
parent 405f76f238
commit c36e773a9d

View file

@ -43,8 +43,7 @@ class {{model.name}}Resource(ModelResource):{% if model.foreign_keys %}{% for fk
"{{ name }}": ALL_WITH_RELATIONS,{%endfor%}
}
api.{{app_label}}.register({{model.name}}Resource())
{% endfor %}{% endautoescape %}
"""
{% endfor %}{% endautoescape %}"""
def render(template, dictionary):
template = Template(template, None, None)
@ -69,14 +68,14 @@ class Command(AppCommand):
app_resources[n] = v
do_update_resources = False
missing_resources = []
for m in app_models:
model_name = m.__name__
rclass_name = model_name + "Resource"
resource_name = m.__name__.lower()
if not rclass_name in app_resources:
do_update_resources = True
missing_resources.append((m, rclass_name))
if do_update_resources:
if missing_resources:
print("Updating resources.py for %s" % app.name)
with open(resource_file_path, "a") as rfile:
info = dict(
@ -85,93 +84,91 @@ class Command(AppCommand):
date=datetime.datetime.now()
)
new_models = {}
for model in app_models:
for model, rclass_name in missing_resources:
model_name = model.__name__
rclass_name = model_name + "Resource"
resource_name = model.__name__.lower()
if not rclass_name in app_resources:
imports = collections.defaultdict(lambda: collections.defaultdict(list))
print("Adding resource class for %s" % model_name)
foreign_keys = []
plain_names = []
fk_names = []
m2m_names = []
#debug.pprint('dir(model)')
for field in model._meta.fields:
if isinstance(field, (models.ForeignKey, models.OneToOneField)):
#debug.show('field.name')
#debug.pprint('dir(field.rel.to)')
#exit()
rel_app=field.rel.to._meta.app_label
rel_model_name=field.rel.to.__name__
if rel_model_name == model_name:
# foreign key to self class -- quote
# the rmodel_name
rmodel_name="'%s.resources.%sResource'" % (app.name, rel_model_name)
else:
rmodel_name=rel_model_name+"Resource"
foreign_keys.append(dict(
field=field,
name=field.name,
app=rel_app,
module=rel_app.split('.')[-1],
model=field.rel.to,
model_name=rel_model_name,
rmodel_name=rmodel_name,
resource_name=field.rel.to.__name__.lower(),
))
imports[rel_app]["module"] = rel_app
imports[rel_app]["names"].append(rel_model_name)
fk_names.append(field.name)
imports = collections.defaultdict(lambda: collections.defaultdict(list))
print("Adding resource class for %s" % model_name)
foreign_keys = []
plain_names = []
fk_names = []
m2m_names = []
#debug.pprint('dir(model)')
for field in model._meta.fields:
if isinstance(field, (models.ForeignKey, models.OneToOneField)):
#debug.show('field.name')
#debug.pprint('dir(field.rel.to)')
#exit()
rel_app=field.rel.to._meta.app_label
rel_model_name=field.rel.to.__name__
if rel_model_name == model_name:
# foreign key to self class -- quote
# the rmodel_name
rmodel_name="'%s.resources.%sResource'" % (app.name, rel_model_name)
else:
plain_names.append(field.name)
m2m_keys = []
for field in model._meta.many_to_many:
#debug.show('field.name')
#debug.pprint('dir(field.rel.to)')
#exit()
rel_app=field.rel.to._meta.app_label
rel_model_name=field.rel.to.__name__
if rel_model_name == model_name:
# foreign key to self class -- quote
# the rmodel_name
rmodel_name="'%s.resources.%sResource'" % (app.name, rel_model_name)
else:
rmodel_name=rel_model_name+"Resource"
m2m_keys.append(dict(
field=field,
name=field.name,
app=rel_app,
module=rel_app.split('.')[-1],
model=field.rel.to,
model_name=rel_model_name,
rmodel_name=rmodel_name,
resource_name=field.rel.to.__name__.lower(),
))
imports[rel_app]["module"] = rel_app
imports[rel_app]["names"].append(rel_model_name)
m2m_names.append(field.name)
# some special import cases
if "auth" in imports:
imports["auth"]["module"] = 'utils'
if "contenttypes" in imports:
imports["contenttypes"]["module"] = 'utils'
for k in imports:
imports[k]["names"] = set(imports[k]["names"])
new_models[model_name] = dict(
app=app.name.split('.')[-1],
model=model,
fields=model._meta.fields,
m2m_fields=model._meta.many_to_many,
name=model_name,
imports=[ v for k,v in imports.items() ],
foreign_keys=foreign_keys,
m2m_keys=m2m_keys,
resource_name=resource_name,
plain_names=plain_names,
fk_names=fk_names,
m2m_names=m2m_names,
)
rmodel_name=rel_model_name+"Resource"
foreign_keys.append(dict(
field=field,
name=field.name,
app=rel_app,
module=rel_app.split('.')[-1],
model=field.rel.to,
model_name=rel_model_name,
rmodel_name=rmodel_name,
resource_name=field.rel.to.__name__.lower(),
))
imports[rel_app]["module"] = rel_app
imports[rel_app]["names"].append(rel_model_name)
fk_names.append(field.name)
else:
plain_names.append(field.name)
m2m_keys = []
for field in model._meta.many_to_many:
#debug.show('field.name')
#debug.pprint('dir(field.rel.to)')
#exit()
rel_app=field.rel.to._meta.app_label
rel_model_name=field.rel.to.__name__
if rel_model_name == model_name:
# foreign key to self class -- quote
# the rmodel_name
rmodel_name="'%s.resources.%sResource'" % (app.name, rel_model_name)
else:
rmodel_name=rel_model_name+"Resource"
m2m_keys.append(dict(
field=field,
name=field.name,
app=rel_app,
module=rel_app.split('.')[-1],
model=field.rel.to,
model_name=rel_model_name,
rmodel_name=rmodel_name,
resource_name=field.rel.to.__name__.lower(),
))
imports[rel_app]["module"] = rel_app
imports[rel_app]["names"].append(rel_model_name)
m2m_names.append(field.name)
# some special import cases
if "auth" in imports:
imports["auth"]["module"] = 'utils'
if "contenttypes" in imports:
imports["contenttypes"]["module"] = 'utils'
for k in imports:
imports[k]["names"] = set(imports[k]["names"])
new_models[model_name] = dict(
app=app.name.split('.')[-1],
model=model,
fields=model._meta.fields,
m2m_fields=model._meta.many_to_many,
name=model_name,
imports=[ v for k,v in imports.items() ],
foreign_keys=foreign_keys,
m2m_keys=m2m_keys,
resource_name=resource_name,
plain_names=plain_names,
fk_names=fk_names,
m2m_names=m2m_names,
)
# Sort resources according to internal FK reference depth
new_model_list = []
@ -212,6 +209,8 @@ class Command(AppCommand):
if rfile.tell() == 0:
print("Writing resource file head")
rfile.write(render(resource_head_template, info))
else:
print("\nNOTE: Not writing resource file head.\nYou may have to update the import from %s.models" % app.name)
info.update(dict(models=new_model_list))
rfile.write(render(resource_class_template, info))