64d5c9820d3138f91a3c0c72bfc212378bcd6b64
[odoo/odoo.git] / openerp / tests / test_ir_filters.py
1 # -*- coding: utf-8 -*-
2 import functools
3
4 from openerp import exceptions
5 from . import common
6
7 def noid(d):
8     """ Removes `id` key from a dict so we don't have to keep these things
9     around when trying to match
10     """
11     if 'id' in d: del d['id']
12     return d
13
14 class FiltersCase(common.TransactionCase):
15     def build(self, model, *args):
16         Model = self.registry(model)
17         for vars in args:
18             Model.create(self.cr, common.ADMIN_USER_ID, vars, {})
19
20 class TestGetFilters(FiltersCase):
21     def setUp(self):
22         super(TestGetFilters, self).setUp()
23         self.USER = self.registry('res.users').name_search(self.cr, self.uid, 'demo')[0]
24         self.USER_ID = self.USER[0]
25
26     def test_own_filters(self):
27         self.build(
28             'ir.filters',
29             dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
30             dict(name='b', user_id=self.USER_ID, model_id='ir.filters'),
31             dict(name='c', user_id=self.USER_ID, model_id='ir.filters'),
32             dict(name='d', user_id=self.USER_ID, model_id='ir.filters'))
33
34         filters = self.registry('ir.filters').get_filters(
35             self.cr, self.USER_ID, 'ir.filters')
36
37         self.assertItemsEqual(map(noid, filters), [
38             dict(name='a', is_default=False, user_id=self.USER, domain='[]', context='{}'),
39             dict(name='b', is_default=False, user_id=self.USER, domain='[]', context='{}'),
40             dict(name='c', is_default=False, user_id=self.USER, domain='[]', context='{}'),
41             dict(name='d', is_default=False, user_id=self.USER, domain='[]', context='{}'),
42         ])
43
44     def test_global_filters(self):
45         self.build(
46             'ir.filters',
47             dict(name='a', user_id=False, model_id='ir.filters'),
48             dict(name='b', user_id=False, model_id='ir.filters'),
49             dict(name='c', user_id=False, model_id='ir.filters'),
50             dict(name='d', user_id=False, model_id='ir.filters'),
51         )
52
53         filters = self.registry('ir.filters').get_filters(
54             self.cr, self.USER_ID, 'ir.filters')
55
56         self.assertItemsEqual(map(noid, filters), [
57             dict(name='a', is_default=False, user_id=False, domain='[]', context='{}'),
58             dict(name='b', is_default=False, user_id=False, domain='[]', context='{}'),
59             dict(name='c', is_default=False, user_id=False, domain='[]', context='{}'),
60             dict(name='d', is_default=False, user_id=False, domain='[]', context='{}'),
61         ])
62
63     def test_no_third_party_filters(self):
64         self.build(
65             'ir.filters',
66             dict(name='a', user_id=False, model_id='ir.filters'),
67             dict(name='b', user_id=common.ADMIN_USER_ID, model_id='ir.filters'),
68             dict(name='c', user_id=self.USER_ID, model_id='ir.filters'),
69             dict(name='d', user_id=common.ADMIN_USER_ID, model_id='ir.filters')  )
70
71         filters = self.registry('ir.filters').get_filters(
72             self.cr, self.USER_ID, 'ir.filters')
73
74         self.assertItemsEqual(map(noid, filters), [
75             dict(name='a', is_default=False, user_id=False, domain='[]', context='{}'),
76             dict(name='c', is_default=False, user_id=self.USER, domain='[]', context='{}'),
77         ])
78
79 class TestOwnDefaults(FiltersCase):
80     def setUp(self):
81         super(TestOwnDefaults, self).setUp()
82         self.USER = self.registry('res.users').name_search(self.cr, self.uid, 'demo')[0]
83         self.USER_ID = self.USER[0]                 
84
85     def test_new_no_filter(self):
86         """
87         When creating a @is_default filter with no existing filter, that new
88         filter gets the default flag
89         """
90         Filters = self.registry('ir.filters')
91         Filters.create_or_replace(self.cr, self.USER_ID, {
92             'name': 'a',
93             'model_id': 'ir.filters',
94             'user_id': self.USER_ID,
95             'is_default': True,
96         })
97         filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters')
98
99         self.assertItemsEqual(map(noid, filters), [
100             dict(name='a', user_id=self.USER, is_default=True,
101                  domain='[]', context='{}')
102         ])
103
104     def test_new_filter_not_default(self):
105         """
106         When creating a @is_default filter with existing non-default filters,
107         the new filter gets the flag
108         """
109         self.build(
110             'ir.filters',
111             dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
112             dict(name='b', user_id=self.USER_ID, model_id='ir.filters'),
113         )
114
115         Filters = self.registry('ir.filters')
116         Filters.create_or_replace(self.cr, self.USER_ID, {
117             'name': 'c',
118             'model_id': 'ir.filters',
119             'user_id': self.USER_ID,
120             'is_default': True,
121         })
122         filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters')
123
124         self.assertItemsEqual(map(noid, filters), [
125             dict(name='a', user_id=self.USER, is_default=False, domain='[]', context='{}'),
126             dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'),
127             dict(name='c', user_id=self.USER, is_default=True, domain='[]', context='{}'),
128         ])
129
130     def test_new_filter_existing_default(self):
131         """
132         When creating a @is_default filter where an existing filter is already
133         @is_default, the flag should be *moved* from the old to the new filter
134         """
135         self.build(
136             'ir.filters',
137             dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
138             dict(name='b', is_default=True, user_id=self.USER_ID, model_id='ir.filters'),
139         )
140
141         Filters = self.registry('ir.filters')
142         Filters.create_or_replace(self.cr, self.USER_ID, {
143             'name': 'c',
144             'model_id': 'ir.filters',
145             'user_id': self.USER_ID,
146             'is_default': True,
147         })
148         filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters')
149
150         self.assertItemsEqual(map(noid, filters), [
151             dict(name='a', user_id=self.USER, is_default=False, domain='[]', context='{}'),
152             dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'),
153             dict(name='c', user_id=self.USER, is_default=True, domain='[]', context='{}'),
154         ])
155
156     def test_update_filter_set_default(self):
157         """
158         When updating an existing filter to @is_default, if an other filter
159         already has the flag the flag should be moved
160         """
161         self.build(
162             'ir.filters',
163             dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
164             dict(name='b', is_default=True, user_id=self.USER_ID, model_id='ir.filters'),
165         )
166
167         Filters = self.registry('ir.filters')
168         Filters.create_or_replace(self.cr, self.USER_ID, {
169             'name': 'a',
170             'model_id': 'ir.filters',
171             'user_id': self.USER_ID,
172             'is_default': True,
173         })
174         filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters')
175
176         self.assertItemsEqual(map(noid, filters), [
177             dict(name='a', user_id=self.USER, is_default=True, domain='[]', context='{}'),
178             dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'),
179         ])
180
181 class TestGlobalDefaults(FiltersCase):
182     def setUp(self):
183         super(TestGlobalDefaults, self).setUp()
184         self.USER = self.registry('res.users').name_search(self.cr, self.uid, 'demo')[0]
185         self.USER_ID = self.USER[0]
186
187     def test_new_filter_not_default(self):
188         """
189         When creating a @is_default filter with existing non-default filters,
190         the new filter gets the flag
191         """
192         self.build(
193             'ir.filters',
194             dict(name='a', user_id=False, model_id='ir.filters'),
195             dict(name='b', user_id=False, model_id='ir.filters'),
196         )
197
198         Filters = self.registry('ir.filters')
199         Filters.create_or_replace(self.cr, self.USER_ID, {
200             'name': 'c',
201             'model_id': 'ir.filters',
202             'user_id': False,
203             'is_default': True,
204         })
205         filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters')
206
207         self.assertItemsEqual(map(noid, filters), [
208             dict(name='a', user_id=False, is_default=False, domain='[]', context='{}'),
209             dict(name='b', user_id=False, is_default=False, domain='[]', context='{}'),
210             dict(name='c', user_id=False, is_default=True, domain='[]', context='{}'),
211         ])
212
213     def test_new_filter_existing_default(self):
214         """
215         When creating a @is_default filter where an existing filter is already
216         @is_default, an error should be generated
217         """
218         self.build(
219             'ir.filters',
220             dict(name='a', user_id=False, model_id='ir.filters'),
221             dict(name='b', is_default=True, user_id=False, model_id='ir.filters'),
222         )
223
224         Filters = self.registry('ir.filters')
225         with self.assertRaises(exceptions.Warning):
226             Filters.create_or_replace(self.cr, self.USER_ID, {
227                 'name': 'c',
228                 'model_id': 'ir.filters',
229                 'user_id': False,
230                 'is_default': True,
231             })
232
233     def test_update_filter_set_default(self):
234         """
235         When updating an existing filter to @is_default, if an other filter
236         already has the flag an error should be generated
237         """
238         self.build(
239             'ir.filters',
240             dict(name='a', user_id=False, model_id='ir.filters'),
241             dict(name='b', is_default=True, user_id=False, model_id='ir.filters'),
242         )
243
244         Filters = self.registry('ir.filters')
245
246         with self.assertRaises(exceptions.Warning):
247             Filters.create_or_replace(self.cr, self.USER_ID, {
248                 'name': 'a',
249                 'model_id': 'ir.filters',
250                 'user_id': False,
251                 'is_default': True,
252             })
253
254     def test_update_default_filter(self):
255         """
256         Replacing the current default global filter should not generate any error
257         """
258         self.build(
259             'ir.filters',
260             dict(name='a', user_id=False, model_id='ir.filters'),
261             dict(name='b', is_default=True, user_id=False, model_id='ir.filters'),
262         )
263
264         Filters = self.registry('ir.filters')
265         context_value = "{'some_key': True}"
266         Filters.create_or_replace(self.cr, self.USER_ID, {
267             'name': 'b',
268             'model_id': 'ir.filters',
269             'user_id': False,
270             'context': context_value,
271             'is_default': True,
272         })
273         filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters')
274
275         self.assertItemsEqual(map(noid, filters), [
276             dict(name='a', user_id=False, is_default=False, domain='[]', context='{}'),
277             dict(name='b', user_id=False, is_default=True, domain='[]', context=context_value),
278         ])