summaryrefslogtreecommitdiff
path: root/docs/generate_values_doc.py
diff options
context:
space:
mode:
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
commit3e80e0a84ede2ea2362d3602c5e7f984e8863fbb (patch)
treeee022cb560a4b0e51935fedc2edbd0769ee79012 /docs/generate_values_doc.py
parenta4e298339d8305eb2611c04543131954f8105ea9 (diff)
downloadIshtar-3e80e0a84ede2ea2362d3602c5e7f984e8863fbb.tar.bz2
Ishtar-3e80e0a84ede2ea2362d3602c5e7f984e8863fbb.zip
Docs: autogen value documentation
Diffstat (limited to 'docs/generate_values_doc.py')
-rw-r--r--docs/generate_values_doc.py143
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)