[migration] Faire que `sync_schema_props_perms` pour un attribut gère le passage de calculé à un non-calculé
Souhait abstrait
-
sync_schema_props_perms
est supposé mettre en conformité le schéma déclaré en Python et celui en base de données. - Actuellement,
sync_schema_props_perms
pour un attribut ne gère pas le passage de calculé (dont la valeur est défini par une requête RQL avecformula
) à un non-calculé (le cas classique). Ça plante. - Même si l'attribut n'a pas une valeur en dur, il a une valeur. La migration avec
sync_schema_props_perms
ne devrait pas l'enlever. Il faudrait donc à la migration que ce soit calculé avec l'ancienne formule les valeurs pour toutes les entités concernées déjà en base de données et que les valeurs calculées soient stockées en base de données, à moins bien sûr que le calcul ne se fasse pas à l'accès de l'attribut mais à chaque fois qu'il y a un changement dû à la formule et que la valeur calculée soit stockée en base de données.
Exemple
Schéma
Avant
class Network(EntityType):
json_mod_date = TZDatetime(
formula='Any MAX(D) WHERE E in_network X, E modification_date D')
Après
class Network(EntityType):
json_mod_date = TZDatetime()
Migration
Actuellement
drop_attribute('Network', 'json_mod_date')
add_attribute('Network', 'json_mod_date')
for network_search in cnx.find('Network'):
cnx.execute(
'SET N json_mod_date MAX(D) '
'WHERE N eid %(eid)s, E in_network N, E modification_date D',
{'eid': network_search[0]})
cnx.commit()
Ce qu'on voudrait
sync_schema_props_perms('Network', 'json_mod_date')
Il faudrait donc que sync_schema_props_perms
fasse que l'attribut ne soit plus calculé et qu'il calcule la valeur pour les entités existantes avec le dit attribut.
Tentative
$ diff-cleaned
a/migration/next.py b/migration/next.py
--- /dev/null
+++ b/migration/next.py
+sync_schema_props_perms('Network', 'json_mod_date')
diff --git a/schema.py b/schema.py
index 103ec15b9..2755a080e 100644
--- a/schema.py
+++ b/schema.py
class Network(EntityType):
- json_mod_date = TZDatetime(
- formula='Any MAX(D) WHERE E in_network X, E modification_date D')
+ json_mod_date = TZDatetime()
$ cubicweb-ctl shell my-instance migration/next.py
Traceback (most recent call last):
File "/home/nspanti/.virtualenvs/project/bin/cubicweb-ctl", line 33, in <module>
sys.exit(load_entry_point('cubicweb==3.38.9', 'console_scripts', 'cubicweb-ctl')())
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/cwctl.py", line 955, in run
CWCTL.run(args)
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/logilab/common/clcommands.py", line 148, in run
sys.exit(command.main_run(args, rcfile))
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/logilab/common/clcommands.py", line 289, in main_run
self.run(args)
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/cwctl.py", line 840, in run
mih.cmd_process_script(script, scriptargs=args)
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/server/migractions.py", line 218, in cmd_process_script
return super(ServerMigrationHelper, self).cmd_process_script(
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/migration.py", line 384, in cmd_process_script
exec(code, scriptlocals)
File "migration/next.py", line 1, in <module>
sync_schema_props_perms('Network', 'json_mod_date')
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/migration.py", line 141, in <lambda>
return lambda *args, **kwargs: self.interact(
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/migration.py", line 215, in interact
return meth(*args, **kwargs)
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/server/migractions.py", line 1413, in cmd_sync_schema_props_perms
self.commit()
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/server/migractions.py", line 334, in commit
self.cnx.commit()
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/server/session.py", line 156, in check_open
return func(cnx, *args, **kwargs)
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/server/session.py", line 734, in commit
operation.handle_event("precommit_event")
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/server/hook.py", line 825, in handle_event
getattr(self, event)()
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/cubicweb/hooks/synccomputed.py", line 46, in precommit_event
select = self.cnx.repo.vreg.rqlhelper.parse(formula).children[0]
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/rql/__init__.py", line 115, in parse
rqlst = parse(rqlstring, False)
File "/home/nspanti/.virtualenvs/project/lib/python3.9/site-packages/rql/__init__.py", line 244, in parse
rqlstring = rqlstring.strip()
AttributeError: 'NoneType' object has no attribute 'strip'