Source code for anyblok.bloks.anyblok_core.documentation.model
# This file is a part of the AnyBlok project
#
# Copyright (C) 2015 Jean-Sebastien SUZANNE <jssuzanne@anybox.fr>
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file,You can
# obtain one at http://mozilla.org/MPL/2.0/.
from anyblok import Declarations, reload_module_if_blok_is_reloading
from anyblok.config import Configuration
[docs]@Declarations.register(Declarations.Model.Documentation)
class Model(Declarations.Mixin.DocElement):
def __init__(self, model):
self.model = model
self.fields = []
self.attributes = []
if self.exist():
self._auto_doc(
self.registry.Documentation.Model.Field, self.fields, self)
self._auto_doc(self.registry.Documentation.Model.Attribute,
self.attributes, self)
def exist(self):
return self.registry.has(self.model.name)
@classmethod
def get_all_models(cls, models):
Model = cls.registry.System.Model
res = []
for model in models:
if model[-2:] == '.*':
query = Model.query().filter(Model.name.like(model[:-1] + '%'))
res.extend(query.all().name)
else:
res.append(model)
return res
@classmethod
def filterModel(cls, query):
Model = cls.registry.System.Model
wanted_models = Configuration.get('doc_wanted_models')
if wanted_models:
wanted_models = cls.get_all_models(wanted_models)
query = query.filter(Model.name.in_(wanted_models))
else:
wanted_models = []
unwanted_models = Configuration.get('doc_unwanted_models')
if unwanted_models:
unwanted_models = cls.get_all_models(unwanted_models)
unwanted_models = [x for x in unwanted_models
if x not in wanted_models]
query = query.filter(Model.name.notin_(unwanted_models))
return query
@classmethod
def getelements(cls):
return cls.filterModel(cls.registry.System.Model.query()).all()
@classmethod
def header2RST(cls, doc):
doc.write("Models\n======\n\n"
"This the differents models defined "
"on the project" + ('\n' * 2))
@classmethod
def footer2RST(cls, doc):
pass
def toRST(self, doc):
doc.write(self.model.name + '\n' + '-' * len(self.model.name) + '\n\n')
self.toRST_docstring(doc)
self.toRST_properties(doc)
self.toRST_field(doc)
self.toRST_method(doc)
def toRST_field(self, doc):
if self.fields:
self._toRST(
doc, self.registry.Documentation.Model.Field, self.fields)
def toRST_method(self, doc):
if self.attributes:
self._toRST(
doc, self.registry.Documentation.Model.Attribute,
self.attributes)
def toRST_docstring(self, doc):
Model = self.registry.get(self.model.name)
if hasattr(Model, '__doc__') and Model.__doc__:
doc.write(Model.__doc__ + '\n\n')
def toRST_properties_get(self):
Model = self.registry.get(self.model.name)
tablename = getattr(Model, '__tablename__', 'No table')
return {
'table name': tablename,
}
def toRST_properties(self, doc):
properties = self.toRST_properties_get()
msg = 'Properties:\n\n* ' + '\n* '.join('**%s** : %s' % (x, y)
for x, y in properties.items())
doc.write(msg + '\n\n')
def toUML_add_model(self, dot):
dot.add_class(self.model.name)
def toUML_add_attributes(self, dot):
for f in self.fields:
f.toUML(dot)
for attr in self.attributes:
attr.toUML(dot, self.model.name)
def toSQL_add_table(self, dot):
Model = self.registry.get(self.model.name)
if hasattr(Model, '__tablename__'):
dot.add_table(Model.__tablename__)
def toSQL_add_fields(self, dot):
Model = self.registry.get(self.model.name)
if hasattr(Model, '__tablename__'):
for f in self.fields:
f.toSQL(dot)
from . import field # noqa
reload_module_if_blok_is_reloading(field)
from . import attribute # noqa
reload_module_if_blok_is_reloading(attribute)