from django.apps import apps from django.conf import settings from django.utils.translation import activate from jinja2 import Template import os from ishtar_common.models_common import Address, GeoItem TEMPLATES = ( ("fr/source/_templates/annexe-tech-3-variables-gen.jinja", "fr/source/annexe-tech-3-variables-gen.rst", "fr-fr"), ) TPL_MODEL = { "fr-fr": """{% for field_name, desc in fields %} - `{{field_name}}` : {{desc}}{% endfor %}""" } EXCLUDED = ["id", "data", "history_creator", "history_m2m", "history_modifier", "imports", "last_modified", "lock_user", "locked", "search_vector", "uuid"] EXCLUDED_MODELS = {} ONLY_MODELS = { "ishtar_common": ["person", "organization", "author", "document"] } APP_LIST = ["ishtar_common"] def get_values(tpl_model, model, excluded): fields = {} related_fields = {} for field in model._meta.get_fields(): if field.name in excluded: continue if getattr(field, "related_model", None): related_fields[field.name] = \ "-> " + str(field.related_model._meta.verbose_name) elif hasattr(field, "verbose_name"): fields[field.name] = str(field.verbose_name) fields = sorted(list(fields.items()) + list(related_fields.items())) dct = { "fields": [k for k, __ in fields], "render": tpl_model.render({"fields": fields}) } return dct for template_name, template_name_dest, language in TEMPLATES: tpl_model = Template(TPL_MODEL[language]) activate(language) render_dct = {'ishtar_common': {}} excluded = EXCLUDED[:] address_values = get_values(tpl_model, Address, excluded=excluded) render_dct["ishtar_common"]["address"] = address_values excluded += address_values["fields"] geo_values = get_values(tpl_model, GeoItem, excluded=excluded) render_dct["ishtar_common"]["geoitem"] = geo_values excluded += geo_values["fields"] for app_name in APP_LIST: app_models = apps.get_app_config(app_name).get_models() for model in list(app_models): model_name = model._meta.model_name if app_name in EXCLUDED_MODELS and \ model_name in EXCLUDED_MODELS[app_name]: continue if app_name in ONLY_MODELS and \ model_name not in ONLY_MODELS[app_name]: continue render_dct[app_name][model._meta.model_name] = get_values( tpl_model, model, excluded) template_name = os.path.abspath( settings.ROOT_PATH + "../docs/" + template_name) template_name_dest = os.path.abspath( settings.ROOT_PATH + "../docs/" + template_name_dest) with open(template_name, "r") as tpl: rendered = Template(tpl.read()) with open(template_name_dest, "w") as tpl_dest: tpl_dest.write(rendered.render(render_dct))