diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2020-12-02 17:45:58 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-02-28 12:15:22 +0100 |
commit | 8109708639238e5eb7a8be6c547a9b0f0a7976f0 (patch) | |
tree | ee022cb560a4b0e51935fedc2edbd0769ee79012 /docs/generate_values_doc.py | |
parent | 5be65ddbe992cad7951616fe2848e30433889cd3 (diff) | |
download | Ishtar-8109708639238e5eb7a8be6c547a9b0f0a7976f0.tar.bz2 Ishtar-8109708639238e5eb7a8be6c547a9b0f0a7976f0.zip |
Docs: autogen value documentation
Diffstat (limited to 'docs/generate_values_doc.py')
-rw-r--r-- | docs/generate_values_doc.py | 143 |
1 files changed, 114 insertions, 29 deletions
diff --git a/docs/generate_values_doc.py b/docs/generate_values_doc.py index ce1406663..024aa6097 100644 --- a/docs/generate_values_doc.py +++ b/docs/generate_values_doc.py @@ -2,12 +2,35 @@ from django.apps import apps from django.conf import settings from django.utils.translation import activate +import datetime from jinja2 import Template import os +from ishtar_common.version import get_version from ishtar_common.models_common import Address, GeoItem + +# TODO: à traduire +TYPES = { + 'IntegerField': "Entier", + 'PositiveIntegerField': "Entier positif", + 'FloatField': "Nombre à virgule", + 'TextField': "Texte", + 'CharField': "Chaîne de caractères", + 'DateField': "Date", + 'DateTimeField': "Date/heure", + 'EmailField': "Courriel", + 'NullBooleanField': "Booléen", + 'BooleanField': "Booléen", + 'ImageField': "Image", + 'FileField': "Fichier", + 'URLField': "Adresse web", + 'PointField': "Point", + 'LineStringField': "Ligne", + 'MultiPolygonField': "Multi-polygone", +} + TEMPLATES = ( ("fr/source/_templates/annexe-tech-3-variables-gen.jinja", "fr/source/annexe-tech-3-variables-gen.rst", @@ -16,65 +39,127 @@ TEMPLATES = ( TPL_MODEL = { "fr-fr": """{% for field_name, desc in fields %} -- `{{field_name}}` : {{desc}}{% endfor %}""" +- **{{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"] -} +EXCLUDED = [ + "id", "data", "history_creator", "history_m2m", "history_modifier", + "imports", "last_modified", "lock_user", "locked", "search_vector", + "uuid", "need_update", "merge_key", "merge_candidate", "merge_exclusion", + "archived", "ishtaruser", "profiles", "properties", + "relation_bitmap_image_above", "relation_bitmap_image_below", + "relation_dot", "relation_dot_above", "relation_dot_below", + "relation_image_above", "relation_image_below", "auto_external_id", + "history_date" +] +EXCLUDED += ["parcel_owner"] # temporary -APP_LIST = ["ishtar_common"] +MODELS = { + "ishtar_common": ["person", "organization", "author", "document"], + "archaeological_operations": ["operation", "archaeologicalsite", + "parcel", "administrativeact"], + "archaeological_files": ["file"], + "archaeological_context_records": ["dating", "contextrecord"], + "archaeological_finds": ["basefind", "find", "treatment", "treatmentfile"], + "archaeological_warehouse": ["warehouse", "container"], +} -def get_values(tpl_model, model, excluded): +def get_values(tpl_model, model, excluded, model_types): fields = {} related_fields = {} for field in model._meta.get_fields(): if field.name in excluded: continue + + help_text = "" + if getattr(field, "help_text", None): + help_text = str(field.help_text) + if getattr(field, "related_model", None): - related_fields[field.name] = \ - "-> " + str(field.related_model._meta.verbose_name) + key = field.name + "__" + rel = field.related_model + related_fields[key] = "*" + if getattr(field, "multiple", False): + related_fields[key] += "→ " + str( + rel._meta.verbose_name_plural) + else: + related_fields[key] += "→ " + str( + rel._meta.verbose_name) + + extra = "" + if not getattr(field, "verbose_name", None) and \ + hasattr(field.remote_field, "verbose_name"): + extra = str(field.remote_field.verbose_name).lower() + if hasattr(rel, "get_documentation_string"): + if extra: + extra += " - " + related_fields[key] += "* ({}{})".format( + extra, + rel.get_documentation_string()) + elif extra: + related_fields[key] += " ({})*".format(extra) + else: + related_fields[key] += "*" + if getattr(field, "verbose_name", None): + related_fields[key] += " - " + str(field.verbose_name) + " " + if help_text: + if related_fields[key]: + related_fields[key] += " - " + related_fields[key] += help_text + " " elif hasattr(field, "verbose_name"): + type_desc = "" + field_classes = [field.__class__.__name__] + [ + sub.__name__ for sub in field.__class__.__subclasses__()] + for model_class in model_types: + if model_class in field_classes: + type_desc = model_types[model_class] + break + if getattr(field, "max_length", None): + type_desc += " ({})".format(field.max_length) + if not type_desc: + print("Missing type", field.name, field_classes) fields[field.name] = str(field.verbose_name) + if type_desc: + fields[field.name] = "*{}* - {}".format( + type_desc, fields[field.name]) + if help_text: + fields[field.name] += " - " + help_text + else: + print("No doc for the field: " + field.name) + fields = sorted(list(fields.items()) + list(related_fields.items())) - dct = { + return { "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': {}} + render_dct = dict((app, {}) for app in MODELS) + render_dct['current_date'] = datetime.date.today().strftime("%Y-%m-%d") + render_dct['version'] = get_version() excluded = EXCLUDED[:] - address_values = get_values(tpl_model, Address, excluded=excluded) + address_values = get_values(tpl_model, Address, excluded=excluded, + model_types=TYPES) render_dct["ishtar_common"]["address"] = address_values excluded += address_values["fields"] - geo_values = get_values(tpl_model, GeoItem, excluded=excluded) + geo_values = get_values(tpl_model, GeoItem, excluded=excluded, + model_types=TYPES) 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) + for app_name in MODELS: + # print([m._meta.model_name + # for m in apps.get_app_config(app_name).get_models()]) + for model_name in MODELS[app_name]: + model = apps.get_app_config(app_name).get_model(model_name) + render_dct[app_name][model_name] = get_values( + tpl_model, model, excluded, TYPES) template_name = os.path.abspath( settings.ROOT_PATH + "../docs/" + template_name) |