Ignorer les vues abstraites dans le système de sélection automatique des vues
Problème
Si une vue CubicWeb a un __select__
, elle semble toujours tentée. La nom de la classe a beau avoir un nom commençant par un underscore et avoir __abstract__ = True
, il est tout de même tenté de la sélectionner.
Exemple
from cubicweb_web import action
class _DownloadExecutableFileResult(action.Action):
__abstract__ = True
submenu = _('download results')
vid = 'nemo.bytes-attribute-download'
class _DownloadExecutableErrors(_DownloadExecutableFileResult):
__abstract__ = True
__regid__ = 'nemo.download_fcast_calibration_errors'
__select__ = (is_in_state('wfs_finished', 'wfs_failed')
& score_entity(lambda e: e.has_errors_file))
Souhait
On souhaite qu'un underscore au début du nom de la classe ou __abstract__ = True
fasse que la classe soit ignorée dans le mécanisme de sélection. Cela ne doit pas valoir pour la ou les classes qui en héritent et qui n'ont pas l'une de ses propriétés.
Notes
Pile d'appels incomplète
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/cwvreg.py:278: in possible_actions
actions = rset.possible_actions(**kwargs) # cached implementation
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/rset.py:104: in possible_actions
actions = self.req.vreg["actions"].poss_visible_objects(
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/cwvreg.py:272: in poss_visible_objects
return sorted(self.possible_objects(*args, **kwargs), key=lambda x: x.order)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:669: in possible_objects
obj = self._select_best(objects, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:714: in _select_best
objectscore = obj.__select__(obj, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:1255: in traced
ret = selector(cls, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:275: in __call__
partscore = selector(cls, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:1255: in traced
ret = selector(cls, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:1255: in traced
ret = selector(cls, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/logilab/common/registry.py:1255: in traced
ret = selector(cls, *args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/predicates.py:196: in __call__
escore = self.score(req, rset, row, col)
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/predicates.py:211: in score
return self.score_entity(rset.get_entity(row, col))
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/predicates.py:721: in intscore
score = scorefunc(*args, **kwargs)
../../.virtualenvs/nemo/lib/python3.9/site-packages/cubicweb/predicates.py:1138: in score
return self._score(adapted)
Tentative de recherche de l'origine
# logilab/common/registry.py
class RegistryStore(dict):
@classmethod
def is_registrable(cls, obj: Any) -> bool:
[some code]
if obj.__dict__.get("__abstract__", False):
return False
Malgré ça, le problème se pose.