trytond-patches/issue5052_issue5207.diff

195 lines
8.3 KiB
Diff

diff -r ad9170e4838b trytond/trytond/ir/ui/tree.rnc
--- a/trytond/trytond/ir/ui/tree.rnc Tue Aug 30 14:38:04 2016 +0200
+++ b/trytond/trytond/ir/ui/tree.rnc Mon Feb 13 11:11:10 2017 +0100
@@ -9,6 +9,7 @@
attlist.tree &= attribute on_write { text }?
attlist.tree &= attribute editable { "top" | "bottom" }?
attlist.tree &= attribute sequence { text }?
+attlist.tree &= attribute colors { text }?
attlist.tree &=
[ a:defaultValue = "0" ] attribute keyword_open { "0" | "1" }?
attlist.tree &=
@@ -62,6 +63,7 @@
attlist.field &= attribute string { text }?
attlist.field &= [a:defaultValue = "1"] attribute factor { text }?
attlist.field &= attribute filename { text }?
+attlist.field &= attribute view_ids { text }?
prefix = element prefix { attlist.affix, empty }
suffix = element suffix { attlist.affix, empty }
attlist.affix &= attribute string { text }?
diff -r ad9170e4838b trytond/trytond/ir/ui/tree.rng
--- a/trytond/trytond/ir/ui/tree.rng Tue Aug 30 14:38:04 2016 +0200
+++ b/trytond/trytond/ir/ui/tree.rng Mon Feb 13 11:11:10 2017 +0100
@@ -38,6 +38,11 @@
</define>
<define name="attlist.tree" combine="interleave">
<optional>
+ <attribute name="colors"/>
+ </optional>
+ </define>
+ <define name="attlist.tree" combine="interleave">
+ <optional>
<attribute name="keyword_open" a:defaultValue="0">
<choice>
<value>0</value>
@@ -198,6 +203,11 @@
<attribute name="filename"/>
</optional>
</define>
+ <define name="attlist.field" combine="interleave">
+ <optional>
+ <attribute name="view_ids"/>
+ </optional>
+ </define>
<define name="prefix">
<element name="prefix">
<ref name="attlist.affix"/>
diff -r ad9170e4838b trytond/trytond/ir/ui/view.py
--- a/trytond/trytond/ir/ui/view.py Tue Aug 30 14:38:04 2016 +0200
+++ b/trytond/trytond/ir/ui/view.py Mon Feb 13 11:21:02 2017 +0100
@@ -155,7 +155,7 @@
}
def encode(element):
- for attr in ('states', 'domain', 'spell'):
+ for attr in ('states', 'domain', 'spell', 'colors'):
if element.get(attr):
try:
value = PYSONDecoder().decode(element.get(attr))
diff -r b1c807b558e9 trytond/trytond/model/modelview.py
--- a/trytond/trytond/model/modelview.py Wed Sep 28 08:14:45 2016 +0200
+++ b/trytond/trytond/model/modelview.py Wed Sep 28 08:19:23 2016 +0200
@@ -488,59 +488,67 @@
fields_attrs = {}
else:
fields_attrs = copy.deepcopy(fields_attrs)
- childs = True
- if element.tag in ('field', 'label', 'separator', 'group', 'suffix',
- 'prefix'):
+ def set_view_ids(element):
+ view_ids = []
+ if element.get('view_ids'):
+ for view_id in element.get('view_ids').split(','):
+ try:
+ view_ids.append(int(view_id))
+ except ValueError:
+ view_ids.append(ModelData.get_id(*view_id.split('.')))
+ element.attrib['view_ids'] = ','.join(map(str, view_ids))
+ return view_ids
+
+ def get_relation(field):
+ if hasattr(field, 'model_name'):
+ return field.model_name
+ elif hasattr(field, 'get_target'):
+ return field.get_target().__name__
+
+ def get_views(relation, view_ids, mode):
+ Relation = pool.get(relation)
+ views = {}
+ if field._type in ['one2many', 'many2many']:
+ # Prefetch only the first view to prevent infinite loop
+ if view_ids:
+ for view_id in view_ids:
+ view = Relation.fields_view_get(view_id=view_id)
+ views[str(view_id)] = view
+ break
+ else:
+ for view_type in mode:
+ views[view_type] = (
+ Relation.fields_view_get(view_type=view_type))
+ break
+ return views
+
+ for attr in ('name', 'icon'):
+ if not element.get(attr):
+ continue
+ fields_attrs.setdefault(element.get(attr), {})
+
+ if element.tag == 'field' and type in ['tree', 'form']:
for attr in ('name', 'icon'):
- if element.get(attr):
- fields_attrs.setdefault(element.get(attr), {})
- if type != 'form':
- continue
- try:
- field = cls._fields[element.get(attr)]
- if hasattr(field, 'model_name'):
- relation = field.model_name
- else:
- relation = field.get_target().__name__
- except Exception:
- relation = False
- if relation and element.tag == 'field':
- childs = False
- views = {}
- mode = (element.attrib.pop('mode', None)
- or 'tree,form').split(',')
- view_ids = []
- if element.get('view_ids'):
- for view_id in element.get('view_ids').split(','):
- try:
- view_ids.append(int(view_id))
- except ValueError:
- view_ids.append(ModelData.get_id(
- *view_id.split('.')))
- Relation = pool.get(relation)
- if (not len(element)
- and type == 'form'
- and field._type in ('one2many', 'many2many')):
- # Prefetch only the first view to prevent infinite
- # loop
- if view_ids:
- for view_id in view_ids:
- view = Relation.fields_view_get(
- view_id=view_id)
- views[str(view_id)] = view
- break
- else:
- for view_type in mode:
- views[view_type] = \
- Relation.fields_view_get(
- view_type=view_type)
- break
- element.attrib['mode'] = ','.join(mode)
- element.attrib['view_ids'] = ','.join(
- map(str, view_ids))
- fields_attrs[element.get(attr)].setdefault('views', {}
- ).update(views)
+ fname = element.get(attr)
+ if not fname:
+ continue
+ view_ids = set_view_ids(element)
+ if type != 'form':
+ continue
+ try:
+ field = cls._fields[fname]
+ relation = get_relation(field)
+ except:
+ relation = False
+ if not relation:
+ continue
+ mode = (
+ element.attrib.pop('mode', None) or 'tree,form').split(',')
+ views = get_views(relation, view_ids, mode)
+ element.attrib['mode'] = ','.join(mode)
+ fields_attrs[fname].setdefault('views', {}).update(views)
+
if type == 'tree' and element.get('name') in fields_width:
element.set('width', str(fields_width[element.get('name')]))
@@ -588,10 +593,9 @@
if element.get(attr):
fields_attrs.setdefault(element.get(attr), {})
- if childs:
- for field in element:
- fields_attrs = cls.__view_look_dom(field, type,
- fields_width=fields_width, fields_attrs=fields_attrs)
+ for field in element:
+ fields_attrs = cls.__view_look_dom(field, type,
+ fields_width=fields_width, fields_attrs=fields_attrs)
return fields_attrs
@staticmethod