~unifield-team/unifield-wm/us-826

« back to all changes in this revision

Viewing changes to msf_instance/msf_instance.py

UF-1099: [FIX] added msf_instance module

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
#    OpenERP, Open Source Management Solution
 
5
#    Copyright (C) 2011 MSF, TeMPO Consulting.
 
6
#
 
7
#    This program is free software: you can redistribute it and/or modify
 
8
#    it under the terms of the GNU Affero General Public License as
 
9
#    published by the Free Software Foundation, either version 3 of the
 
10
#    License, or (at your option) any later version.
 
11
#
 
12
#    This program is distributed in the hope that it will be useful,
 
13
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
#    GNU Affero General Public License for more details.
 
16
#
 
17
#    You should have received a copy of the GNU Affero General Public License
 
18
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
19
#
 
20
##############################################################################
 
21
 
 
22
from osv import fields, osv
 
23
 
 
24
class msf_instance(osv.osv):
 
25
    _name = 'msf.instance'
 
26
    
 
27
    _columns = {
 
28
        'level': fields.selection([('section', 'Section'),
 
29
                                   ('coordo', 'Coordo'),
 
30
                                   ('project', 'Project')], 'Level', required=True),
 
31
        'code': fields.char('Code', size=64, required=True),
 
32
        'mission': fields.char('Mission', size=64),
 
33
        'instance': fields.char('Instance', size=64),
 
34
        'parent_id': fields.many2one('msf.instance', 'Parent', domain=[('level', '!=', 'project'), ('state', '=', 'active')]),
 
35
        'name': fields.char('Name', size=64, required=True),
 
36
        'note': fields.char('Note', size=256),
 
37
        'cost_center_id': fields.many2one('account.analytic.account', 'Cost Center', domain=[('category', '=', 'OC')], required=True),
 
38
        'state': fields.selection([('draft', 'Draft'),
 
39
                                   ('active', 'Active'),
 
40
                                   ('inactive', 'Inactive')], 'State', required=True),
 
41
    }
 
42
    
 
43
    _defaults = {
 
44
        'state': 'draft',
 
45
    }
 
46
 
 
47
    def _check_name_code_unicity(self, cr, uid, ids, context=None):
 
48
        if not context:
 
49
            context = {}
 
50
        for instance in self.browse(cr, uid, ids, context=context):
 
51
            bad_ids = self.search(cr, uid, [('&'),
 
52
                                            ('state', '!=', 'inactive'),
 
53
                                            ('|'),
 
54
                                            ('name', '=ilike', instance.name),
 
55
                                            ('code', '=ilike', instance.code)])
 
56
            if len(bad_ids) and len(bad_ids) > 1:
 
57
                return False
 
58
        return True
 
59
 
 
60
    def _check_cost_center_unicity(self, cr, uid, ids, context=None):
 
61
        if not context:
 
62
            context = {}
 
63
        for instance in self.browse(cr, uid, ids, context=context):
 
64
            bad_ids = self.search(cr, uid, [('&'),
 
65
                                            ('state', '!=', 'inactive'),
 
66
                                            ('cost_center_id','=',instance.cost_center_id.id)])
 
67
            if len(bad_ids) and len(bad_ids) > 1:
 
68
                return False
 
69
        return True
 
70
 
 
71
    def _check_database_unicity(self, cr, uid, ids, context=None):
 
72
        if not context:
 
73
            context = {}
 
74
        for instance in self.browse(cr, uid, ids, context=context):
 
75
            bad_ids = self.search(cr, uid, [('&'),
 
76
                                            ('state', '!=', 'inactive'),
 
77
                                            ('&'),
 
78
                                            ('instance', '!=', False),
 
79
                                            ('instance', '=', instance.instance)])
 
80
            if len(bad_ids) and len(bad_ids) > 1:
 
81
                return False
 
82
        return True
 
83
 
 
84
    _constraints = [
 
85
        (_check_name_code_unicity, 'You cannot have the same code or name than an active instance!', ['code', 'name']),
 
86
        (_check_cost_center_unicity, 'You cannot have the same cost_center than an active instance!', ['cost_center_id']),
 
87
        (_check_database_unicity, 'You cannot have the same database than an active instance!', ['instance']),
 
88
    ]
 
89
    
 
90
    def name_get(self, cr, user, ids, context=None):
 
91
        result = self.browse(cr, user, ids, context=context)
 
92
        res = []
 
93
        for rs in result:
 
94
            txt = rs.code
 
95
            res += [(rs.id, txt)]
 
96
        return res
 
97
    
 
98
    def button_deactivate(self, cr, uid, ids, context=None):
 
99
        """
 
100
        Deactivate instance
 
101
        """
 
102
        self.write(cr, uid, ids, {'state': 'inactive'}, context=context)
 
103
        return True
 
104
    
 
105
msf_instance()
 
106
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: