Commit 2722d0a9 authored by Sylvain Thénault's avatar Sylvain Thénault
Browse files

[ui] Nicer display of concept within relation widget

* the best language is selected
* concepts are properly ordered
* should more performant (one query fetch all the data)
parent 0dba3e2c3a85
...@@ -87,13 +87,52 @@ class ContainedSearchForRelatedEntitiesView(rwdg.SearchForRelatedEntitiesView): ...@@ -87,13 +87,52 @@ class ContainedSearchForRelatedEntitiesView(rwdg.SearchForRelatedEntitiesView):
"""Return rset of entities to be displayed as possible values for the """Return rset of entities to be displayed as possible values for the
edited relation. You may want to override this. edited relation. You may want to override this.
""" """
container = int(self._cw.form['container'])
entity = self.compute_entity() entity = self.compute_entity()
rtype, tetype, role = self.rdef rtype, tetype, role = self.rdef
rdef = entity.e_schema.rdef(rtype, role, tetype) rdef = entity.e_schema.rdef(rtype, role, tetype)
assert len(rdef.constraints) == 1 and 'S container AT' in rdef.constraints[0].expression assert len(rdef.constraints) == 1 and 'S container AT' in rdef.constraints[0].expression
baserql = rdef.constraints[0].expression baserql = rdef.constraints[0].expression
rql = 'Any O WHERE ' + baserql.replace('S container AT', 'AT eid %(at)s') baserql = baserql.replace('S container AT', 'AT eid %(at)s')
return self._cw.execute(rql, {'at': int(self._cw.form['container'])}) # detect language first
languages = set(lang for lang, in self._cw.execute(
'DISTINCT Any OLC WHERE ' + baserql + ', O preferred_label OL, '
'OL language_code OLC', {'at': container}))
for lang in (self._cw.lang, 'en', 'sed-2'):
if lang in languages:
break
else:
assert languages, 'no preferred label'
lang = languages.pop()
# now build the query to prefetch/sort on the preferred label in the proper language
return self._cw.execute(
'DISTINCT Any O,OL,OLL ORDERBY OLL WHERE ' + baserql + ', O preferred_label OL, '
'OL label OLL, OL language_code %(lang)s',
{'at': container, 'lang': lang})
@staticmethod
def pref_label_label(concept):
return concept.cw_rset[concept.cw_row][2]
@staticmethod
def pref_label_column(w, concept):
w(tags.a(ContainedSearchForRelatedEntitiesView.pref_label_label(concept),
href=concept.absolute_url()))
class SelectConceptEntitiesTableView(rwdg.SelectEntitiesTableView):
"""Table view of the selectable entities in the relation widget
Selection of columns (and respective renderer) can be overridden by
updating `columns` and `column_renderers` class attributes.
"""
__select__ = rwdg.SelectEntitiesTableView.__select__ & is_instance('Concept')
column_renderers = rwdg.SelectEntitiesTableView.column_renderers.copy()
# speed-up things by considering rset shape from ContainedSearchForRelatedEntitiesView
column_renderers['entity'] = rwdg.SelectMainEntityColRenderer(
sortfunc=ContainedSearchForRelatedEntitiesView.pref_label_label,
renderfunc=ContainedSearchForRelatedEntitiesView.pref_label_column)
# hide some relation from autoform because of limitation of _container_eid # hide some relation from autoform because of limitation of _container_eid
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment