[REM]: base_setup: Moved name_get of res.currency at server side
[odoo/odoo.git] / addons / base_setup / installer.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
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 from osv import fields, osv
22 import pooler
23 import pytz
24 from tools.translate import _
25 import tools
26
27 class base_setup_installer(osv.osv_memory):
28     _name = 'base.setup.installer'
29     _inherit = 'res.config.installer'
30
31     _install_if = {
32         ('sale','crm'): ['sale_crm'],
33         ('sale','project'): ['project_mrp'],
34     }
35     _columns = {
36         # Generic modules
37         'crm':fields.boolean('Customer Relationship Management',
38             help="Helps you track and manage relations with customers such as"
39                  " leads, requests or issues. Can automatically send "
40                  "reminders, escalate requests or trigger business-specific "
41                  "actions based on standard events."),
42         'sale':fields.boolean('Sales Management',
43             help="Helps you handle your quotations, sale orders and invoicing"
44                  "."),
45         'project':fields.boolean('Project Management',
46             help="Helps you manage your projects and tasks by tracking them, "
47                  "generating plannings, etc..."),
48         'knowledge':fields.boolean('Knowledge Management',
49             help="Lets you install addons geared towards sharing knowledge "
50                  "with and between your employees."),
51         'stock':fields.boolean('Warehouse Management',
52             help="Helps you manage your inventory and main stock operations: delivery orders, receptions, etc."),
53         'mrp':fields.boolean('Manufacturing',
54             help="Helps you manage your manufacturing processes and generate "
55                  "reports on those processes."),
56         'account_voucher':fields.boolean('Invoicing',
57             help="Allows you to create your invoices and track the payments. It is an easier version of the accounting module for managers who are not accountants."),
58         'account_accountant':fields.boolean('Accounting & Finance',
59             help="Helps you handle your accounting needs, if you are not an accountant, we suggest you to install only the Invoicing "),
60         'purchase':fields.boolean('Purchase Management',
61             help="Helps you manage your purchase-related processes such as "
62                  "requests for quotations, supplier invoices, etc..."),
63         'hr':fields.boolean('Human Resources',
64             help="Helps you manage your human resources by encoding your employees structure, generating work sheets, tracking attendance and more."),
65         'point_of_sale':fields.boolean('Point of Sales',
66             help="Helps you get the most out of your points of sales with "
67                  "fast sale encoding, simplified payment mode encoding, "
68                  "automatic picking lists generation and more."),
69         'marketing':fields.boolean('Marketing',
70             help="Helps you manage your marketing campaigns step by step."),
71         'profile_tools':fields.boolean('Extra Tools',
72             help="Lets you install various interesting but non-essential tools "
73                 "like Survey, Lunch and Ideas box."),
74         'report_designer':fields.boolean('Advanced Reporting',
75             help="Lets you install various tools to simplify and enhance "
76                  "OpenERP's report creation."),
77         # Vertical modules
78         'product_expiry':fields.boolean('Food Industry',
79             help="Installs a preselected set of OpenERP applications "
80                 "which will help you manage your industry."),
81         'association':fields.boolean('Associations',
82             help="Installs a preselected set of OpenERP "
83                  "applications which will help you manage your association "
84                  "more efficiently."),
85         'auction':fields.boolean('Auction Houses',
86             help="Installs a preselected set of OpenERP "
87                  "applications selected to help you manage your auctions "
88                  "as well as the business processes around them."),
89         }
90
91     def _if_knowledge(self, cr, uid, ids, context=None):
92         if self.pool.get('res.users').browse(cr, uid, uid, context=context)\
93                .view == 'simple':
94             return ['document_ftp']
95         return None
96
97     def _if_misc_tools(self, cr, uid, ids, context=None):
98         return ['profile_tools']
99
100     def onchange_moduleselection(self, cr, uid, ids, *args, **kargs):
101         value = {}
102         # Calculate progress
103         closed, total = self.get_current_progress(cr, uid)
104         progress = round(100. * closed / (total + len(filter(None, args))))
105         value.update({'progress':progress})
106         if progress < 10.:
107             progress = 10.
108         
109         return {'value':value}
110
111
112     def execute(self, cr, uid, ids, context=None):
113         if context is None:
114              context = {}
115         module_pool = self.pool.get('ir.module.module')
116         modules_selected = []
117         datas = self.read(cr, uid, ids, context=context)[0]
118         for mod in datas.keys():
119             if mod in ('id', 'progress'):
120                 continue
121             if datas[mod] == 1:
122                 modules_selected.append(mod)
123
124         module_ids = module_pool.search(cr, uid, [('name', 'in', modules_selected)], context=context)
125         for module in module_pool.browse(cr, uid, module_ids, context=context):
126             if module.state == 'uninstalled':
127                 module_pool.state_update(cr, uid, [module.id], 'to install', ['uninstalled'], context)
128                 cr.commit()
129                 new_db, self.pool = pooler.restart_pool(cr.dbname, update_module=True)
130             elif module.state == 'installed':
131                 cr.execute("update ir_actions_todo set state='open' \
132                                     from ir_model_data as data where data.res_id = ir_actions_todo.id \
133                                     and ir_actions_todo.type='special'\
134                                     and data.model = 'ir.actions.todo' and data.module=%s", (module.name, ))
135         return
136     
137 base_setup_installer()
138
139 #Migrate data from another application Conf wiz
140
141 class migrade_application_installer_modules(osv.osv_memory):
142     _name = 'migrade.application.installer.modules'
143     _inherit = 'res.config.installer'
144     _columns = {
145         'import_saleforce': fields.boolean('Import Saleforce',
146             help="For Import Saleforce"),
147         'import_sugarcrm': fields.boolean('Import Sugarcrm',
148             help="For Import Sugarcrm"),
149         'sync_google_contact': fields.boolean('Sync Google Contact',
150             help="For Sync Google Contact"),
151         'quickbooks_ippids': fields.boolean('Quickbooks Ippids',
152             help="For Quickbooks Ippids"),
153     }
154     
155 migrade_application_installer_modules()
156
157 class product_installer(osv.osv_memory):
158     _name = 'product.installer'
159     _inherit = 'res.config'
160     _columns = {
161                 'customers': fields.selection([('create','Create'), ('import','Import')], 'Customers', size=32, required=True, help="Import or create customers"),
162
163     }
164     _defaults = {
165                  'customers': 'create',
166     }
167     
168     def execute(self, cr, uid, ids, context=None):
169         if context is None:
170              context = {}
171         data_obj = self.pool.get('ir.model.data')
172         val = self.browse(cr, uid, ids, context=context)[0]
173         if val.customers == 'create':
174             id2 = data_obj._get_id(cr, uid, 'base', 'view_partner_form')
175             if id2:
176                 id2 = data_obj.browse(cr, uid, id2, context=context).res_id
177             return {
178                     'view_type': 'form',
179                     'view_mode': 'form',
180                     'res_model': 'res.partner',
181                     'views': [(id2, 'form')],
182                     'type': 'ir.actions.act_window',
183                     'target': 'current',
184                     'nodestroy':False,
185                 }
186         if val.customers == 'import':
187             return {'type': 'ir.actions.act_window'}
188
189 product_installer()
190
191
192 #       Define default users preferences config wiz
193
194 def _lang_get(self, cr, uid, context=None):
195     obj = self.pool.get('res.lang')
196     ids = obj.search(cr, uid, [('translatable','=',True)])
197     res = obj.read(cr, uid, ids, ['code', 'name'], context=context)
198     res = [(r['code'], r['name']) for r in res]
199     return res
200
201 def _tz_get(self,cr,uid, context=None):
202     return [(x, x) for x in pytz.all_timezones]
203
204 class user_preferences_config(osv.osv_memory):
205     _name = 'user.preferences.config'
206     _inherit = 'res.config'
207     _columns = {
208         'context_tz': fields.selection(_tz_get,  'Timezone', size=64,
209             help="Set default for new user's timezone, used to perform timezone conversions "
210                  "between the server and the client."),
211         'context_lang': fields.selection(_lang_get, 'Language', required=True,
212             help="Sets default language for the all user interface, when UI "
213                 "translations are available. If you want to Add new Language, you can add it from 'Load an Official Translation' wizard  from 'Administration' menu."),
214         'view': fields.selection([('simple','Simplified'),
215                                   ('extended','Extended')],
216                                  'Interface', required=True, help= "If you use OpenERP for the first time we strongly advise you to select the simplified interface, which has less features but is easier. You can always switch later from the user preferences." ),
217         'menu_tips': fields.boolean('Display Tips', help="Check out this box if you want to always display tips on each menu action"),
218                                  
219     }
220     _defaults={
221                'view' : lambda self,cr,uid,*args: self.pool.get('res.users').browse(cr, uid, uid).view or 'simple',
222                'context_lang' : 'en_US',
223                'menu_tips' : True
224     }
225     
226     def default_get(self, cr, uid, fields, context=None):
227         if context is None:
228             context = {}
229         res = super(user_preferences_config, self).default_get(cr, uid, fields, context=context)
230         res_default = self.pool.get('ir.values').get(cr, uid, 'default', False, ['res.users'])
231         for id, field, value in res_default:
232             res.update({field: value})
233         return res
234
235     def execute(self, cr, uid, ids, context=None):
236         user_obj = self.pool.get('res.users')
237         user_ids = user_obj.search(cr, uid, [], context=context)
238         for o in self.browse(cr, uid, ids, context=context):
239             user_obj.write(cr , uid, user_ids ,{'context_tz' : o.context_tz, 'context_lang' : o.context_lang, 'view' : o.view, 'menu_tips' : o.menu_tips}, context=context)
240             ir_values_obj = self.pool.get('ir.values')
241             ir_values_obj.set(cr, uid, 'default', False, 'context_tz', ['res.users'], o.context_tz)
242             ir_values_obj.set(cr, uid, 'default', False, 'context_lang', ['res.users'], o.context_lang)
243             ir_values_obj.set(cr, uid, 'default', False, 'view', ['res.users'], o.view)
244             ir_values_obj.set(cr, uid, 'default', False, 'menu_tips', ['res.users'], o.menu_tips)
245         return {}
246
247 user_preferences_config()
248
249 # Specify Your Terminology
250
251 class specify_partner_terminology(osv.osv_memory):
252     _name = 'specify.partner.terminology'
253     _inherit = 'res.config'
254     _columns = {
255         'partner': fields.selection([('Customer','Customer'),
256                                   ('Client','Client'),
257                                   ('Member','Member'),
258                                   ('Patient','Patient'),
259                                   ('Partner','Partner'),
260                                   ('Donor','Donor'),
261                                   ('Guest','Guest'),
262                                   ('Tenant','Tenant')
263                                   ],
264                                  'Choose how to call a customer', required=True ),
265     }
266     _defaults={
267                'partner' :'Partner',
268     }
269     
270     def make_translations(self, cr, uid, ids, name, type, src, value, res_id=0, context=None):
271         trans_obj = self.pool.get('ir.translation')
272         user_obj = self.pool.get('res.users')
273         context_lang = user_obj.browse(cr, uid, uid, context=context).context_lang
274         existing_trans_ids = trans_obj.search(cr, uid, [('name','=',name), ('lang','=',context_lang), ('type','=',type), ('src','=',src), ('res_id','=',res_id)])
275         if existing_trans_ids:
276             trans_obj.write(cr, uid, existing_trans_ids, {'value': value}, context=context)
277         else:
278             create_id = trans_obj.create(cr, uid, {'name': name,'lang': context_lang, 'type': type, 'src': src, 'value': value , 'res_id': res_id}, context=context)
279         return {}
280     
281     def execute(self, cr, uid, ids, context=None):
282         def _case_insensitive_replace(ref_string, src, value):
283             import re
284             pattern = re.compile(src, re.IGNORECASE)
285             return pattern.sub(_(value), _(ref_string))
286         trans_obj = self.pool.get('ir.translation')
287         fields_obj = self.pool.get('ir.model.fields')
288         menu_obj = self.pool.get('ir.ui.menu')
289         act_window_obj = self.pool.get('ir.actions.act_window')
290         for o in self.browse(cr, uid, ids, context=context):
291             #translate label of field
292             field_ids = fields_obj.search(cr, uid, [('field_description','ilike','Customer')])
293             for f_id in fields_obj.browse(cr ,uid, field_ids, context=context):
294                 field_ref = f_id.model_id.model + ',' + f_id.name
295                 self.make_translations(cr, uid, ids, field_ref, 'field', f_id.field_description, _case_insensitive_replace(f_id.field_description,'Customer',o.partner), context=context)
296             #translate help tooltip of field
297             for obj in self.pool.obj_pool.values():
298                 for field_name, field_rec in obj._columns.items():
299                     if field_rec.help.lower().count('customer'):
300                         field_ref = obj._name + ',' + field_name
301                         self.make_translations(cr, uid, ids, field_ref, 'help', field_rec.help, _case_insensitive_replace(field_rec.help,'Customer',o.partner), context=context)
302             #translate menuitems
303             menu_ids = menu_obj.search(cr,uid, [('name','ilike','Customer')])
304             for m_id in menu_obj.browse(cr, uid, menu_ids, context=context):
305                 menu_name = m_id.name
306                 menu_ref = 'ir.ui.menu' + ',' + 'name'
307                 self.make_translations(cr, uid, ids, menu_ref, 'model', menu_name, _case_insensitive_replace(menu_name,'Customer',o.partner), res_id=m_id.id, context=context)
308             #translate act window name
309             act_window_ids = act_window_obj.search(cr, uid, [('name','ilike','Customer')])
310             for act_id in act_window_obj.browse(cr ,uid, act_window_ids, context=context):
311                 act_ref = 'ir.actions.act_window' + ',' + 'name'
312                 self.make_translations(cr, uid, ids, act_ref, 'model', act_id.name, _case_insensitive_replace(act_id.name,'Customer',o.partner), res_id=act_id.id, context=context)
313             #translate act window tooltips
314             act_window_ids = act_window_obj.search(cr, uid, [('help','ilike','Customer')])
315             for act_id in act_window_obj.browse(cr ,uid, act_window_ids, context=context):
316                 act_ref = 'ir.actions.act_window' + ',' + 'help'
317                 self.make_translations(cr, uid, ids, act_ref, 'model', act_id.help, _case_insensitive_replace(act_id.help,'Customer',o.partner), res_id=act_id.id, context=context)
318         return {}
319     
320 specify_partner_terminology()
321
322
323 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: