1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
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.
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.
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/>.
20 ##############################################################################
21 from osv import fields, osv
24 from tools.translate import _
27 class base_setup_installer(osv.osv_memory):
28 _name = 'base.setup.installer'
29 _inherit = 'res.config.installer'
32 ('sale','crm'): ['sale_crm'],
33 ('sale','project'): ['project_mrp'],
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"
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."),
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 "
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."),
91 def _if_knowledge(self, cr, uid, ids, context=None):
92 if self.pool.get('res.users').browse(cr, uid, uid, context=context)\
94 return ['document_ftp']
97 def _if_misc_tools(self, cr, uid, ids, context=None):
98 return ['profile_tools']
100 def onchange_moduleselection(self, cr, uid, ids, *args, **kargs):
103 closed, total = self.get_current_progress(cr, uid)
104 progress = round(100. * closed / (total + len(filter(None, args))))
105 value.update({'progress':progress})
109 return {'value':value}
112 def execute(self, cr, uid, ids, context=None):
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'):
122 modules_selected.append(mod)
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)
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, ))
137 base_setup_installer()
139 #Migrate data from another application Conf wiz
141 class migrade_application_installer_modules(osv.osv_memory):
142 _name = 'migrade.application.installer.modules'
143 _inherit = 'res.config.installer'
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"),
155 migrade_application_installer_modules()
157 class product_installer(osv.osv_memory):
158 _name = 'product.installer'
159 _inherit = 'res.config'
161 'customers': fields.selection([('create','Create'), ('import','Import')], 'Customers', size=32, required=True, help="Import or create customers"),
165 'customers': 'create',
168 def execute(self, cr, uid, ids, context=None):
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')
176 id2 = data_obj.browse(cr, uid, id2, context=context).res_id
180 'res_model': 'res.partner',
181 'views': [(id2, 'form')],
182 'type': 'ir.actions.act_window',
186 if val.customers == 'import':
187 return {'type': 'ir.actions.act_window'}
192 # Define default users preferences config wiz
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]
201 def _tz_get(self,cr,uid, context=None):
202 return [(x, x) for x in pytz.all_timezones]
204 class user_preferences_config(osv.osv_memory):
205 _name = 'user.preferences.config'
206 _inherit = 'res.config'
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"),
221 'view' : lambda self,cr,uid,*args: self.pool.get('res.users').browse(cr, uid, uid).view or 'simple',
222 'context_lang' : 'en_US',
226 def default_get(self, cr, uid, fields, context=None):
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})
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)
247 user_preferences_config()
249 # Specify Your Terminology
251 class specify_partner_terminology(osv.osv_memory):
252 _name = 'specify.partner.terminology'
253 _inherit = 'res.config'
255 'partner': fields.selection([('Customer','Customer'),
258 ('Patient','Patient'),
259 ('Partner','Partner'),
264 'Choose how to call a customer', required=True ),
267 'partner' :'Partner',
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)
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)
281 def execute(self, cr, uid, ids, context=None):
282 def _case_insensitive_replace(ref_string, src, value):
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)
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)
320 specify_partner_terminology()
323 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: