Launchpad automatic translations update.
[odoo/odoo.git] / addons / analytic / analytic.py
index 13b4877..c16ed82 100644 (file)
@@ -20,7 +20,6 @@
 ##############################################################################
 
 import time
-from lxml import etree
 
 from osv import fields, osv
 from tools.translate import _
@@ -28,6 +27,7 @@ import decimal_precision as dp
 
 class account_analytic_account(osv.osv):
     _name = 'account.analytic.account'
+    _inherit = ['mail.thread']
     _description = 'Analytic Account'
 
     def _compute_level_tree(self, cr, uid, ids, child_ids, res, field_names, context=None):
@@ -156,7 +156,12 @@ class account_analytic_account(osv.osv):
         'name': fields.char('Account Name', size=128, required=True),
         'complete_name': fields.function(_complete_name_calc, type='char', string='Full Account Name'),
         'code': fields.char('Code/Reference', size=24, select=True),
-        'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Project')], 'Type of Account', help='If you select the View Type, it means you won\'t allow to create journal entries using that account.'),
+        'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Project')], 'Type of Account', required=True, 
+                                 help="If you select the View Type, it means you won\'t allow to create journal entries using that account.\n"\
+                                  "The type 'Analytic account' stands for usual accounts that you only want to use in accounting.\n"\
+                                  "If you select Contract or Project, it offers you the possibility to manage the validity and the invoicing options for this account.\n"\
+                                  "The special type 'Template of Project' allows you to define a template with default data that you can reuse easily."),
+        'template_id': fields.many2one('account.analytic.account', 'Template of Contract'),
         'description': fields.text('Description'),
         'parent_id': fields.many2one('account.analytic.account', 'Parent Analytic Account', select=2),
         'child_ids': fields.one2many('account.analytic.account', 'parent_id', 'Child Accounts'),
@@ -167,8 +172,9 @@ class account_analytic_account(osv.osv):
         'credit': fields.function(_debit_credit_bal_qtty, type='float', string='Credit', multi='debit_credit_bal_qtty', digits_compute=dp.get_precision('Account')),
         'quantity': fields.function(_debit_credit_bal_qtty, type='float', string='Quantity', multi='debit_credit_bal_qtty'),
         'quantity_max': fields.float('Maximum Time', help='Sets the higher limit of time to work on the contract.'),
-        'partner_id': fields.many2one('res.partner', 'Customer', required=True),
-        'user_id': fields.many2one('res.users', 'Account Manager'),
+        'partner_id': fields.many2one('res.partner', 'Customer'),
+        'user_id': fields.many2one('res.users', 'Project Manager'),
+        'manager_id': fields.many2one('res.users', 'Account Manager'),
         'date_start': fields.date('Date Start'),
         'date': fields.date('Date End', select=True),
         'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
@@ -179,13 +185,25 @@ class account_analytic_account(osv.osv):
             }, string='Currency', type='many2one', relation='res.currency'),
     }
     
+    def on_change_template(self, cr, uid, ids, template_id, context=None):
+        if not template_id:
+            return {}
+        res = {'value':{}}
+        template = self.browse(cr, uid, template_id, context=context)
+        res['value']['date_start'] = template.date_start
+        res['value']['date'] = template.date
+        res['value']['quantity_max'] = template.quantity_max
+        res['value']['description'] = template.description
+        return res
+    
     def on_change_partner_id(self, cr, uid, ids,partner_id, name, context={}):
         res={}
         if partner_id:
-            part = self.pool.get('res.partner').browse(cr, uid, partner_id,context=context)
+            partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
+            if partner.user_id:
+                res['manager_id'] = partner.user_id.id
             if not name:
-                res['name'] = part.name
-            if part.user_id:res['user_id'] = part.user_id.id
+                res['name'] = _('Contract: ') + partner.name
         return {'value': res}
 
     def _default_company(self, cr, uid, context=None):
@@ -224,20 +242,6 @@ class account_analytic_account(osv.osv):
         default['line_ids'] = []
         return super(account_analytic_account, self).copy(cr, uid, id, default, context=context)
 
-    def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
-        res = super(account_analytic_account, self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
-        if view_type == 'form':
-            doc = etree.XML(res['arch'])
-            nodes = doc.xpath("//field[@name='name']")
-            if context.get('default_type') == 'contract':
-                for node in nodes:
-                    node.set('string', 'Contract/Project Name')
-            if context.get('default_type') == 'template':
-                for node in nodes:
-                    node.set('string', 'Template/Project Name')
-            res['arch'] = etree.tostring(doc)
-        return res
-
     def on_change_company(self, cr, uid, id, company_id):
         if not company_id:
             return {}
@@ -285,6 +289,17 @@ class account_analytic_account(osv.osv):
             account = self.search(cr, uid, args, limit=limit, context=context)
         return self.name_get(cr, uid, account, context=context)
 
+    def create(self, cr, uid, vals, context=None):
+        contract =  super(account_analytic_account, self).create(cr, uid, vals, context=context)
+        if contract:
+            self.create_send_note(cr, uid, [contract], context=context)
+        return contract
+
+    def create_send_note(self, cr, uid, ids, context=None):
+        for obj in self.browse(cr, uid, ids, context=context):
+            self.message_subscribe(cr, uid, [obj.id], [obj.user_id.id], context=context)
+            self.message_append_note(cr, uid, [obj.id], body=_("Contract for <em>%s</em> has been <b>created</b>.") % (obj.partner_id.name), context=context)
+
 account_analytic_account()
 
 
@@ -309,17 +324,17 @@ class account_analytic_line(osv.osv):
     }
 
     _order = 'date desc'
-    
+
     def _check_no_view(self, cr, uid, ids, context=None):
         analytic_lines = self.browse(cr, uid, ids, context=context)
         for line in analytic_lines:
             if line.account_id.type == 'view':
                 return False
         return True
-    
+
     _constraints = [
         (_check_no_view, 'You can not create analytic line on view account.', ['account_id']),
-    ]    
+    ]
 
 account_analytic_line()