diff --git a/openerp/addons/base/ir/ir_filters.py b/openerp/addons/base/ir/ir_filters.py index 02a723c116c..f716a4f8d43 100644 --- a/openerp/addons/base/ir/ir_filters.py +++ b/openerp/addons/base/ir/ir_filters.py @@ -46,7 +46,7 @@ class ir_filters(osv.osv): """ # available filters: private filters (user_id=uid) and public filters (uid=NULL) act_ids = self.search(cr, uid, [('model_id','=',model),('user_id','in',[uid, False])]) - my_acts = self.read(cr, uid, act_ids, ['name', 'domain', 'context', 'user_id']) + my_acts = self.read(cr, uid, act_ids, ['name', 'is_default', 'domain', 'context', 'user_id']) return my_acts def create_or_replace(self, cr, uid, vals, context=None): @@ -57,6 +57,13 @@ class ir_filters(osv.osv): # f.user_id is False and vals.user_id is False or missing, # or f.user_id.id == vals.user_id if (f['user_id'] and f['user_id'][0]) == vals.get('user_id', False)] + + if 'user_id' in vals and vals.get('is_default'): + act_ids = self.search(cr, uid, [('model_id', '=', vals['model_id']), + ('user_id', '=', vals['user_id'])], + context=context) + self.write(cr, uid, act_ids, {'is_default': False}, context=context) + # When a filter exists for the same (name, model, user) triple, we simply # replace its definition. if matching_filters: @@ -87,11 +94,13 @@ class ir_filters(osv.osv): 'domain': fields.text('Domain', required=True), 'context': fields.text('Context', required=True), 'model_id': fields.selection(_list_all_models, 'Model', required=True), + 'is_default': fields.boolean('Default filter') } _defaults = { 'domain': '[]', 'context':'{}', 'user_id': lambda self,cr,uid,context=None: uid, + 'is_default': False } ir_filters() diff --git a/openerp/tests/test_ir_filters.py b/openerp/tests/test_ir_filters.py index c27583f37e1..98714d7f46b 100644 --- a/openerp/tests/test_ir_filters.py +++ b/openerp/tests/test_ir_filters.py @@ -42,10 +42,10 @@ class TestGetFilters(common.TransactionCase): self.cr, self.USER_ID, 'ir.filters') self.assertItemsEqual(map(noid, filters), [ - dict(name='a', user_id=self.USER, domain='[]', context='{}'), - dict(name='b', user_id=self.USER, domain='[]', context='{}'), - dict(name='c', user_id=self.USER, domain='[]', context='{}'), - dict(name='d', user_id=self.USER, domain='[]', context='{}'), + dict(name='a', is_default=False, user_id=self.USER, domain='[]', context='{}'), + dict(name='b', is_default=False, user_id=self.USER, domain='[]', context='{}'), + dict(name='c', is_default=False, user_id=self.USER, domain='[]', context='{}'), + dict(name='d', is_default=False, user_id=self.USER, domain='[]', context='{}'), ]) @fixtures( @@ -59,10 +59,10 @@ class TestGetFilters(common.TransactionCase): self.cr, self.USER_ID, 'ir.filters') self.assertItemsEqual(map(noid, filters), [ - dict(name='a', user_id=False, domain='[]', context='{}'), - dict(name='b', user_id=False, domain='[]', context='{}'), - dict(name='c', user_id=False, domain='[]', context='{}'), - dict(name='d', user_id=False, domain='[]', context='{}'), + dict(name='a', is_default=False, user_id=False, domain='[]', context='{}'), + dict(name='b', is_default=False, user_id=False, domain='[]', context='{}'), + dict(name='c', is_default=False, user_id=False, domain='[]', context='{}'), + dict(name='d', is_default=False, user_id=False, domain='[]', context='{}'), ]) @fixtures( @@ -76,7 +76,100 @@ class TestGetFilters(common.TransactionCase): self.cr, self.USER_ID, 'ir.filters') self.assertItemsEqual(map(noid, filters), [ - dict(name='a', user_id=False, domain='[]', context='{}'), - dict(name='c', user_id=self.USER, domain='[]', context='{}'), + dict(name='a', is_default=False, user_id=False, domain='[]', context='{}'), + dict(name='c', is_default=False, user_id=self.USER, domain='[]', context='{}'), ]) +class TestOwnDefaults(common.TransactionCase): + USER_ID = 3 + USER = (3, u'Demo User') + + def test_new_no_filter(self): + """ + When creating a @is_default filter with no existing filter, that new + filter gets the default flag + """ + Filters = self.registry('ir.filters') + Filters.create_or_replace(self.cr, self.USER_ID, { + 'name': 'a', + 'model_id': 'ir.filters', + 'user_id': self.USER_ID, + 'is_default': True, + }) + filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters') + + self.assertItemsEqual(map(noid, filters), [ + dict(name='a', user_id=self.USER, is_default=True, + domain='[]', context='{}') + ]) + + @fixtures( + ('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')), + ('ir.filters', dict(name='b', user_id=USER_ID, model_id='ir.filters')), + ) + def test_new_filter_not_default(self): + """ + When creating a @is_default filter with existing non-default filters, + the new filter gets the flag + """ + Filters = self.registry('ir.filters') + Filters.create_or_replace(self.cr, self.USER_ID, { + 'name': 'c', + 'model_id': 'ir.filters', + 'user_id': self.USER_ID, + 'is_default': True, + }) + filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters') + + self.assertItemsEqual(map(noid, filters), [ + dict(name='a', user_id=self.USER, is_default=False, domain='[]', context='{}'), + dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'), + dict(name='c', user_id=self.USER, is_default=True, domain='[]', context='{}'), + ]) + + @fixtures( + ('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')), + ('ir.filters', dict(name='b', is_default=True, user_id=USER_ID, model_id='ir.filters')), + ) + def test_new_filter_existing_default(self): + """ + When creating a @is_default filter where an existing filter is already + @is_default, the flag should be *moved* from the old to the new filter + """ + Filters = self.registry('ir.filters') + Filters.create_or_replace(self.cr, self.USER_ID, { + 'name': 'c', + 'model_id': 'ir.filters', + 'user_id': self.USER_ID, + 'is_default': True, + }) + filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters') + + self.assertItemsEqual(map(noid, filters), [ + dict(name='a', user_id=self.USER, is_default=False, domain='[]', context='{}'), + dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'), + dict(name='c', user_id=self.USER, is_default=True, domain='[]', context='{}'), + ]) + + @fixtures( + ('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')), + ('ir.filters', dict(name='b', is_default=True, user_id=USER_ID, model_id='ir.filters')), + ) + def test_update_filter_set_default(self): + """ + When updating an existing filter to @is_default, if an other filter + already has the flag the flag should be moved + """ + Filters = self.registry('ir.filters') + Filters.create_or_replace(self.cr, self.USER_ID, { + 'name': 'a', + 'model_id': 'ir.filters', + 'user_id': self.USER_ID, + 'is_default': True, + }) + filters = Filters.get_filters(self.cr, self.USER_ID, 'ir.filters') + + self.assertItemsEqual(map(noid, filters), [ + dict(name='a', user_id=self.USER, is_default=True, domain='[]', context='{}'), + dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'), + ])