feat(drupal): reconstruit la hiérarchie de la DB pour que l ORM retrouve ses petits
This commit is contained in:
parent
db85024859
commit
6f98b69024
|
@ -6,6 +6,92 @@ from django.db import DEFAULT_DB_ALIAS, connections
|
||||||
from django.db.models.constants import LOOKUP_SEP
|
from django.db.models.constants import LOOKUP_SEP
|
||||||
|
|
||||||
|
|
||||||
|
# On reconstruit ici la hiérarchie de la DB que les dev php n'ont pas été
|
||||||
|
# capables de spécifier en sql. On en profite pour donner des noms explicites.
|
||||||
|
|
||||||
|
DB_RELATIONS = {
|
||||||
|
'drupal': {
|
||||||
|
'content_type_event': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
'vid': ('vid', 'node_revisions', 'revision'),
|
||||||
|
},
|
||||||
|
'content_type_revue_de_presse': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
'vid': ('vid', 'node_revisions', 'revision'),
|
||||||
|
},
|
||||||
|
'enclosure': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
},
|
||||||
|
'event': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
},
|
||||||
|
'i18n_node': {
|
||||||
|
'language': ('language', 'languages'),
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
},
|
||||||
|
'files': {
|
||||||
|
'uid': ('uid', 'users', 'user'),
|
||||||
|
},
|
||||||
|
'history': {
|
||||||
|
'uid': ('uid', 'users', 'user'),
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
},
|
||||||
|
'node': {
|
||||||
|
'uid': ('uid', 'users', 'user'),
|
||||||
|
# nb: vid est en redondance avec node_revisions.nid
|
||||||
|
# ceci étant la db est cohérente de ce point de vue
|
||||||
|
'vid': ('vid', 'node_revisions', 'published_revision', '+'),
|
||||||
|
'language': ('language', 'languages'),
|
||||||
|
'tnid': ('nid', 'node', 'translation source', '+'),
|
||||||
|
},
|
||||||
|
'node_revisions': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
'uid': ('uid', 'users', 'user'),
|
||||||
|
'format': ('format', 'FilterFormats'),
|
||||||
|
},
|
||||||
|
'node_access': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
'gid': ('tid', 'term_data', 'permission'),
|
||||||
|
},
|
||||||
|
'term_data': {
|
||||||
|
'vid': ('vid', 'vocabulary', 'theme'),
|
||||||
|
# nb: trid est un identifiant pour grouper les différentes
|
||||||
|
# variantes des termes pour dans différents langages (clé commune)
|
||||||
|
},
|
||||||
|
'term_node': {
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
'tid': ('tid', 'term_data', 'data'),
|
||||||
|
'vid': ('vid', 'node_revisions', 'revision'),
|
||||||
|
},
|
||||||
|
'term_synonym': {
|
||||||
|
'tid': ('tid', 'term_data', 'data'),
|
||||||
|
},
|
||||||
|
'upload': {
|
||||||
|
'fid': ('fid', 'files', 'file'),
|
||||||
|
'uid': ('uid', 'users', 'user'),
|
||||||
|
'nid': ('nid', 'node', 'node'),
|
||||||
|
'vid': ('vid', 'node_revisions', 'revision'),
|
||||||
|
},
|
||||||
|
'url_alias': {
|
||||||
|
'language': ('language', 'languages'),
|
||||||
|
},
|
||||||
|
'users_roles': {
|
||||||
|
'rid': ('rid', 'role', 'role'),
|
||||||
|
'uid': ('uid', 'users', 'user'),
|
||||||
|
},
|
||||||
|
'vocabulary': {
|
||||||
|
'language': ('language', 'languages'),
|
||||||
|
},
|
||||||
|
'vocabulary_node_types': {
|
||||||
|
'vid': ('vid', 'node_revisions', 'revision'),
|
||||||
|
'type': ('type', 'node_type', 'node_type'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'spip': {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = "Introspects the database tables in the given database and outputs a Django model module."
|
help = "Introspects the database tables in the given database and outputs a Django model module."
|
||||||
requires_system_checks = False
|
requires_system_checks = False
|
||||||
|
@ -80,6 +166,7 @@ class Command(BaseCommand):
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
relations = connection.introspection.get_relations(cursor, table_name)
|
relations = connection.introspection.get_relations(cursor, table_name)
|
||||||
|
relations.update(DB_RELATIONS[options['database']].get(table_name, {}))
|
||||||
except NotImplementedError:
|
except NotImplementedError:
|
||||||
relations = {}
|
relations = {}
|
||||||
try:
|
try:
|
||||||
|
@ -112,7 +199,8 @@ class Command(BaseCommand):
|
||||||
is_pk = column_name == primary_key_column
|
is_pk = column_name == primary_key_column
|
||||||
has_pk = primary_key_column
|
has_pk = primary_key_column
|
||||||
att_name, params, notes = self.normalize_col_name(
|
att_name, params, notes = self.normalize_col_name(
|
||||||
column_name, used_column_names, is_relation, is_pk, has_pk)
|
column_name, used_column_names, is_relation, is_pk, has_pk, relations
|
||||||
|
)
|
||||||
extra_params.update(params)
|
extra_params.update(params)
|
||||||
comment_notes.extend(notes)
|
comment_notes.extend(notes)
|
||||||
|
|
||||||
|
@ -130,6 +218,8 @@ class Command(BaseCommand):
|
||||||
rel_type = 'OneToOneField'
|
rel_type = 'OneToOneField'
|
||||||
else:
|
else:
|
||||||
rel_type = 'ForeignKey'
|
rel_type = 'ForeignKey'
|
||||||
|
if len(relations[column_name]) > 3:
|
||||||
|
extra_params['related_name'] = relations[column_name][3]
|
||||||
rel_to = (
|
rel_to = (
|
||||||
"self" if relations[column_name][1] == table_name
|
"self" if relations[column_name][1] == table_name
|
||||||
else table2model(relations[column_name][1])
|
else table2model(relations[column_name][1])
|
||||||
|
@ -183,7 +273,7 @@ class Command(BaseCommand):
|
||||||
for meta_line in self.get_meta(table_name, constraints, column_to_field_name, is_view, is_partition):
|
for meta_line in self.get_meta(table_name, constraints, column_to_field_name, is_view, is_partition):
|
||||||
yield meta_line
|
yield meta_line
|
||||||
|
|
||||||
def normalize_col_name(self, col_name, used_column_names, is_relation, is_pk, has_pk):
|
def normalize_col_name(self, col_name, used_column_names, is_relation, is_pk, has_pk, relations):
|
||||||
"""
|
"""
|
||||||
Modify the column name to make it Python-compatible as a field name
|
Modify the column name to make it Python-compatible as a field name
|
||||||
"""
|
"""
|
||||||
|
@ -191,9 +281,14 @@ class Command(BaseCommand):
|
||||||
field_notes = []
|
field_notes = []
|
||||||
|
|
||||||
new_name = col_name.lower()
|
new_name = col_name.lower()
|
||||||
|
|
||||||
if new_name != col_name:
|
if new_name != col_name:
|
||||||
field_notes.append('Field name made lowercase.')
|
field_notes.append('Field name made lowercase.')
|
||||||
|
|
||||||
|
if len(relations.get(col_name, [])) >= 3:
|
||||||
|
new_name = relations[col_name][2]
|
||||||
|
field_notes = ['Field named from forced relations.']
|
||||||
|
|
||||||
if is_relation:
|
if is_relation:
|
||||||
if new_name.endswith('_id'):
|
if new_name.endswith('_id'):
|
||||||
new_name = new_name[:-3]
|
new_name = new_name[:-3]
|
||||||
|
|
Loading…
Reference in New Issue