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