Merge lp:~unifield-team/unifield-server/bklg-35 into lp:unifield-server
- bklg-35
- Merge into trunk
Proposed by
jftempo
Status: | Merged |
---|---|
Merged at revision: | 4370 |
Proposed branch: | lp:~unifield-team/unifield-server/bklg-35 |
Merge into: | lp:unifield-server |
Diff against target: |
139 lines (+59/-8) (has conflicts) 1 file modified
bin/osv/orm.py (+59/-8) Text conflict in bin/osv/orm.py |
To merge this branch: | bzr merge lp:~unifield-team/unifield-server/bklg-35 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
UniField Reviewer Team | Pending | ||
Review via email: mp+322463@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bin/osv/orm.py' | |||
2 | --- bin/osv/orm.py 2017-04-06 09:08:50 +0000 | |||
3 | +++ bin/osv/orm.py 2017-04-12 14:53:38 +0000 | |||
4 | @@ -2715,8 +2715,11 @@ | |||
5 | 2715 | parent_table_name = parent_model._table | 2715 | parent_table_name = parent_model._table |
6 | 2716 | quoted_parent_table_name = '"%s"' % parent_table_name | 2716 | quoted_parent_table_name = '"%s"' % parent_table_name |
7 | 2717 | if quoted_parent_table_name not in query.tables: | 2717 | if quoted_parent_table_name not in query.tables: |
10 | 2718 | query.tables.append(quoted_parent_table_name) | 2718 | query.join([self._table, parent_table_name, inherits_field, 'id'], outer=True) |
11 | 2719 | query.where_clause.append('("%s".%s = %s.id)' % (self._table, inherits_field, parent_table_name)) | 2719 | # Use query.join() instead of just put new table and new where clause elements because |
12 | 2720 | # to be able to sort on translated values, we need JOIN between tables | ||
13 | 2721 | # query.tables.append(quoted_parent_table_name) | ||
14 | 2722 | # query.where_clause.append('("%s".%s = %s.id)' % (self._table, inherits_field, parent_table_name)) | ||
15 | 2720 | 2723 | ||
16 | 2721 | def _inherits_join_calc(self, field, query): | 2724 | def _inherits_join_calc(self, field, query): |
17 | 2722 | """ | 2725 | """ |
18 | @@ -4571,51 +4574,88 @@ | |||
19 | 4571 | return map(qualify, m2o_order) if isinstance(m2o_order, list) else qualify(m2o_order) | 4574 | return map(qualify, m2o_order) if isinstance(m2o_order, list) else qualify(m2o_order) |
20 | 4572 | 4575 | ||
21 | 4573 | 4576 | ||
23 | 4574 | def _generate_order_by(self, order_spec, query): | 4577 | def _generate_order_by(self, order_spec, query, context=None): |
24 | 4575 | """ | 4578 | """ |
25 | 4576 | Attempt to consruct an appropriate ORDER BY clause based on order_spec, which must be | 4579 | Attempt to consruct an appropriate ORDER BY clause based on order_spec, which must be |
26 | 4577 | a comma-separated list of valid field names, optionally followed by an ASC or DESC direction. | 4580 | a comma-separated list of valid field names, optionally followed by an ASC or DESC direction. |
27 | 4578 | 4581 | ||
28 | 4579 | :raise" except_orm in case order_spec is malformed | 4582 | :raise" except_orm in case order_spec is malformed |
29 | 4580 | """ | 4583 | """ |
30 | 4584 | if context is None: | ||
31 | 4585 | context = {} | ||
32 | 4581 | order_by_clause = self._order | 4586 | order_by_clause = self._order |
33 | 4587 | |||
34 | 4588 | if not order_spec: | ||
35 | 4589 | order_spec = self._order | ||
36 | 4590 | |||
37 | 4591 | from_order_clause = [] | ||
38 | 4592 | translation = 0 | ||
39 | 4582 | if order_spec: | 4593 | if order_spec: |
40 | 4583 | order_by_elements = [] | 4594 | order_by_elements = [] |
41 | 4584 | self._check_qorder(order_spec) | 4595 | self._check_qorder(order_spec) |
42 | 4585 | for order_part in order_spec.split(','): | 4596 | for order_part in order_spec.split(','): |
43 | 4597 | translatable = False | ||
44 | 4586 | order_split = order_part.strip().split(' ') | 4598 | order_split = order_part.strip().split(' ') |
45 | 4587 | order_field = order_split[0].strip() | 4599 | order_field = order_split[0].strip() |
46 | 4588 | order_direction = order_split[1].strip() if len(order_split) == 2 else '' | 4600 | order_direction = order_split[1].strip() if len(order_split) == 2 else '' |
47 | 4589 | inner_clause = None | 4601 | inner_clause = None |
48 | 4602 | end_inner_clause = [] | ||
49 | 4590 | if order_field == 'id': | 4603 | if order_field == 'id': |
51 | 4591 | inner_clause = '"%s"."%s"' % (self._table, order_field) | 4604 | end_inner_clause = '"%s"."%s"' % (self._table, order_field) |
52 | 4592 | elif order_field in self._columns: | 4605 | elif order_field in self._columns: |
53 | 4593 | order_column = self._columns[order_field] | 4606 | order_column = self._columns[order_field] |
54 | 4607 | translatable = order_column.translate | ||
55 | 4608 | if translatable: | ||
56 | 4609 | translation += 1 | ||
57 | 4610 | trans_name = '"ir_translation%s"' % translation | ||
58 | 4611 | end_inner_clause.append('%s."value"' % trans_name) | ||
59 | 4612 | left_join_clause = 'LEFT JOIN "ir_translation" %s' % trans_name | ||
60 | 4613 | on_clause = 'ON %s.src = "%s"."%s" AND %s.name = \'%s,%s\' AND %s.type = \'model\' AND %s.lang = \'%s\'' % ( | ||
61 | 4614 | trans_name, self._table, order_field, trans_name, self._name, order_field, trans_name, trans_name, context.get('lang', 'en_US')) | ||
62 | 4615 | from_order_clause.append('%s %s' % (left_join_clause, on_clause)) | ||
63 | 4594 | if order_column._classic_read: | 4616 | if order_column._classic_read: |
64 | 4595 | inner_clause = '"%s"."%s"' % (self._table, order_field) | 4617 | inner_clause = '"%s"."%s"' % (self._table, order_field) |
65 | 4596 | elif order_column._type == 'many2one': | 4618 | elif order_column._type == 'many2one': |
66 | 4597 | inner_clause = self._generate_m2o_order_by(order_field, query) | 4619 | inner_clause = self._generate_m2o_order_by(order_field, query) |
67 | 4598 | else: | 4620 | else: |
68 | 4599 | continue # ignore non-readable or "non-joinable" fields | 4621 | continue # ignore non-readable or "non-joinable" fields |
69 | 4622 | |||
70 | 4623 | if isinstance(inner_clause, list): | ||
71 | 4624 | end_inner_clause.extend(inner_clause) | ||
72 | 4625 | else: | ||
73 | 4626 | end_inner_clause.append(inner_clause) | ||
74 | 4600 | elif order_field in self._inherit_fields: | 4627 | elif order_field in self._inherit_fields: |
75 | 4601 | parent_obj = self.pool.get(self._inherit_fields[order_field][3]) | 4628 | parent_obj = self.pool.get(self._inherit_fields[order_field][3]) |
76 | 4602 | order_column = parent_obj._columns[order_field] | 4629 | order_column = parent_obj._columns[order_field] |
77 | 4630 | translatable = order_column.translate | ||
78 | 4631 | if translatable: | ||
79 | 4632 | translation += 1 | ||
80 | 4633 | trans_name = '"ir_translation%s"' % translation | ||
81 | 4634 | end_inner_clause.append('%s."value"' % trans_name) | ||
82 | 4635 | left_join_clause = 'LEFT JOIN "ir_translation" %s' % trans_name | ||
83 | 4636 | on_clause = 'ON %s.src = "%s"."%s" AND %s.name = \'%s,%s\' AND %s.type = \'model\' AND %s.lang = \'%s\'' % ( | ||
84 | 4637 | trans_name, self._table, order_field, trans_name, parent_obj._name, order_field, trans_name, trans_name, context.get('lang', 'en_US')) | ||
85 | 4638 | from_order_clause.append('%s %s' % (left_join_clause, on_clause)) | ||
86 | 4603 | if order_column._classic_read: | 4639 | if order_column._classic_read: |
87 | 4604 | inner_clause = self._inherits_join_calc(order_field, query) | 4640 | inner_clause = self._inherits_join_calc(order_field, query) |
88 | 4605 | elif order_column._type == 'many2one': | 4641 | elif order_column._type == 'many2one': |
89 | 4606 | inner_clause = self._generate_m2o_order_by(order_field, query) | 4642 | inner_clause = self._generate_m2o_order_by(order_field, query) |
90 | 4607 | else: | 4643 | else: |
91 | 4608 | continue # ignore non-readable or "non-joinable" fields | 4644 | continue # ignore non-readable or "non-joinable" fields |
92 | 4609 | if inner_clause: | ||
93 | 4610 | if isinstance(inner_clause, list): | 4645 | if isinstance(inner_clause, list): |
95 | 4611 | for clause in inner_clause: | 4646 | end_inner_clause.extend(inner_clause) |
96 | 4647 | else: | ||
97 | 4648 | end_inner_clause.append(inner_clause) | ||
98 | 4649 | if end_inner_clause: | ||
99 | 4650 | if isinstance(end_inner_clause, list): | ||
100 | 4651 | for clause in end_inner_clause: | ||
101 | 4612 | order_by_elements.append("%s %s" % (clause, order_direction)) | 4652 | order_by_elements.append("%s %s" % (clause, order_direction)) |
102 | 4613 | else: | 4653 | else: |
104 | 4614 | order_by_elements.append("%s %s" % (inner_clause, order_direction)) | 4654 | order_by_elements.append("%s %s" % (end_inner_clause, order_direction)) |
105 | 4615 | if order_by_elements: | 4655 | if order_by_elements: |
106 | 4616 | order_by_clause = ",".join(order_by_elements) | 4656 | order_by_clause = ",".join(order_by_elements) |
107 | 4617 | 4657 | ||
109 | 4618 | return order_by_clause and (' ORDER BY %s ' % order_by_clause) or '' | 4658 | return order_by_clause and (' ORDER BY %s ' % order_by_clause) or '', from_order_clause |
110 | 4619 | 4659 | ||
111 | 4620 | def _search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False, access_rights_uid=None): | 4660 | def _search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False, access_rights_uid=None): |
112 | 4621 | """ | 4661 | """ |
113 | @@ -4633,15 +4673,26 @@ | |||
114 | 4633 | 4673 | ||
115 | 4634 | query = self._where_calc(cr, user, args, context=context) | 4674 | query = self._where_calc(cr, user, args, context=context) |
116 | 4635 | self._apply_ir_rules(cr, user, query, 'read', context=context) | 4675 | self._apply_ir_rules(cr, user, query, 'read', context=context) |
117 | 4676 | <<<<<<< TREE | ||
118 | 4636 | if order == 'NO_ORDER': | 4677 | if order == 'NO_ORDER': |
119 | 4637 | order_by='' | 4678 | order_by='' |
120 | 4638 | else: | 4679 | else: |
121 | 4639 | order_by = self._generate_order_by(order, query) | 4680 | order_by = self._generate_order_by(order, query) |
122 | 4640 | 4681 | ||
123 | 4682 | ======= | ||
124 | 4683 | order_by, from_order_clause = self._generate_order_by(order, query, context=context) | ||
125 | 4684 | >>>>>>> MERGE-SOURCE | ||
126 | 4641 | from_clause, where_clause, where_clause_params = query.get_sql() | 4685 | from_clause, where_clause, where_clause_params = query.get_sql() |
127 | 4642 | 4686 | ||
128 | 4687 | <<<<<<< TREE | ||
129 | 4643 | limit_str = limit and ' LIMIT %d' % limit or '' | 4688 | limit_str = limit and ' LIMIT %d' % limit or '' |
130 | 4644 | offset_str = offset and ' OFFSET %d' % offset or '' | 4689 | offset_str = offset and ' OFFSET %d' % offset or '' |
131 | 4690 | ======= | ||
132 | 4691 | from_clause = from_clause + ' '.join(from_order_clause) | ||
133 | 4692 | |||
134 | 4693 | limit_str = limit and ' limit %d' % limit or '' | ||
135 | 4694 | offset_str = offset and ' offset %d' % offset or '' | ||
136 | 4695 | >>>>>>> MERGE-SOURCE | ||
137 | 4645 | where_str = where_clause and (" WHERE %s" % where_clause) or '' | 4696 | where_str = where_clause and (" WHERE %s" % where_clause) or '' |
138 | 4646 | 4697 | ||
139 | 4647 | if count: | 4698 | if count: |