summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaurav Panchal <gan@openerp.com>2014-08-20 10:48:06 +0530
committerRichard Mathot <rim@odoo.com>2015-05-08 11:20:54 +0200
commit3fe06da63409d8015f739b6f601e976862370d33 (patch)
tree8fe0146e113e222293694c4532f0285b90a87a00
parent42316d5aa58eb0528e44896cabb30ab4b3738e4a (diff)
[IMP] project,project_issue,sale: display the current contract state on some various objects like issues or tasks.
Implements a dynamic widget for selection fields to display this state with color codes.
-rw-r--r--addons/analytic/models/analytic.py17
-rw-r--r--addons/project/project.py2
-rw-r--r--addons/project_issue/project_issue.py7
-rw-r--r--addons/project_issue/project_issue_view.xml2
-rw-r--r--addons/project_issue_sheet/project_issue_sheet.py5
-rw-r--r--addons/project_issue_sheet/project_issue_sheet_view.xml4
-rw-r--r--addons/project_timesheet/project_timesheet.py12
-rw-r--r--addons/project_timesheet/project_timesheet_view.xml7
-rw-r--r--addons/sale/sale.py2
-rw-r--r--addons/sale/sale_view.xml1
-rw-r--r--addons/sale_analytic_plans/sale_analytic_plans_view.xml9
-rw-r--r--addons/web/static/src/js/views/form_widgets.js18
12 files changed, 62 insertions, 24 deletions
diff --git a/addons/analytic/models/analytic.py b/addons/analytic/models/analytic.py
index 157739da8a7..7415422da57 100644
--- a/addons/analytic/models/analytic.py
+++ b/addons/analytic/models/analytic.py
@@ -28,6 +28,15 @@ from openerp.tools.translate import _
import openerp.addons.decimal_precision as dp
from openerp.exceptions import UserError
+ANALYTIC_ACCOUNT_STATE = [
+ ('template', 'Template'),
+ ('draft','New'),
+ ('open','In Progress'),
+ ('pending','To Renew'),
+ ('close','Closed'),
+ ('cancelled', 'Cancelled')
+]
+
class account_analytic_account(osv.osv):
_name = 'account.analytic.account'
_inherit = ['mail.thread']
@@ -191,13 +200,7 @@ class account_analytic_account(osv.osv):
'date_start': fields.date('Start Date'),
'date': fields.date('Expiration Date', select=True, track_visibility='onchange'),
'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.
- 'state': fields.selection([('template', 'Template'),
- ('draft','New'),
- ('open','In Progress'),
- ('pending','To Renew'),
- ('close','Closed'),
- ('cancelled', 'Cancelled')],
- 'Status', required=True,
+ 'state': fields.selection(ANALYTIC_ACCOUNT_STATE, 'Status', required=True,
track_visibility='onchange', copy=False),
'currency_id': fields.function(_currency, fnct_inv=_set_company_currency, #the currency_id field is readonly except if it's a view account and if there is no company
store = {
diff --git a/addons/project/project.py b/addons/project/project.py
index ea49a15dedf..01666950b67 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -630,7 +630,7 @@ class task(osv.osv):
project = self.pool.get('project.project').browse(cr, uid, project_id, context=context)
if project and project.partner_id:
return {'value': {'partner_id': project.partner_id.id}}
- return {}
+ return {'value': {'partner_id': False}}
def onchange_user_id(self, cr, uid, ids, user_id, context=None):
vals = {}
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index 2f505b9d2e7..6240b4b3016 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -171,7 +171,7 @@ class project_issue(osv.Model):
project = self.pool.get('project.project').browse(cr, uid, project_id, context=context)
if project and project.partner_id:
return {'value': {'partner_id': project.partner_id.id}}
- return {}
+ return {'value': {'partner_id': False}}
_columns = {
'id': fields.integer('ID', readonly=True),
@@ -292,11 +292,10 @@ class project_issue(osv.Model):
""" This function returns value of partner email address based on partner
:param part: Partner's id
"""
- result = {}
if partner_id:
partner = self.pool['res.partner'].browse(cr, uid, partner_id, context)
- result['email_from'] = partner.email
- return {'value': result}
+ return {'value': {'email_from': partner.email}}
+ return {'value': {'email_from': False}}
def get_empty_list_help(self, cr, uid, help, context=None):
context = dict(context or {})
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index d09319bcf3c..6153a16e8c8 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -33,7 +33,7 @@
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
<field name="email_from"/>
<label for="project_id"/>
- <div>
+ <div name="project">
<field name="project_id" on_change="on_change_project(project_id)" class="oe_inline" context="{'default_use_issues':1}"/>
<field name="can_escalate" invisible="1"/>
<button name="case_escalate" string="Escalate" type="object" class="oe_link" attrs="{'invisible':[('can_escalate','=',False)]}" groups="base.group_user"/>
diff --git a/addons/project_issue_sheet/project_issue_sheet.py b/addons/project_issue_sheet/project_issue_sheet.py
index 7b298ded6d3..fff046cb6ca 100644
--- a/addons/project_issue_sheet/project_issue_sheet.py
+++ b/addons/project_issue_sheet/project_issue_sheet.py
@@ -19,6 +19,7 @@
#
##############################################################################
+from openerp.addons.analytic.models import analytic
from openerp.osv import fields,osv,orm
from openerp.tools.translate import _
@@ -43,11 +44,12 @@ class project_issue(osv.osv):
}),
'timesheet_ids': fields.one2many('account.analytic.line', 'issue_id', 'Timesheets'),
'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
+ 'contract_state': fields.related('analytic_account_id', 'state', string='Contract Status', type='selection', selection=analytic.ANALYTIC_ACCOUNT_STATE),
}
def on_change_project(self, cr, uid, ids, project_id, context=None):
if not project_id:
- return {}
+ return {'value': {'analytic_account_id': False}}
result = super(project_issue, self).on_change_project(cr, uid, ids, project_id, context=context)
@@ -58,6 +60,7 @@ class project_issue(osv.osv):
account = project.analytic_account_id
if account:
result['value']['analytic_account_id'] = account.id
+ result['value']['contract_state'] = account.state
return result
diff --git a/addons/project_issue_sheet/project_issue_sheet_view.xml b/addons/project_issue_sheet/project_issue_sheet_view.xml
index 7d2eddb6361..eb8f1d978bc 100644
--- a/addons/project_issue_sheet/project_issue_sheet_view.xml
+++ b/addons/project_issue_sheet/project_issue_sheet_view.xml
@@ -17,6 +17,10 @@
domain="[('parent_id','!=',False),('partner_id', '=', partner_id),('type', '!=', 'view')]"
on_change='on_change_account_id(analytic_account_id)'/>
</field>
+ <xpath expr='//div[@name="project"]' position='after'>
+ <field name="contract_state" widget="label_selection" attrs="{'invisible': ['|', ('partner_id', '=', False), ('analytic_account_id', '=', False)]}"
+ options="{'classes': {'template': 'default', 'draft': 'info', 'open': 'success', 'pending': 'warning', 'close': 'danger', 'cancelled': 'warning'}}" readonly="1"/>
+ </xpath>
<xpath expr="//notebook/page[@name='extra_info']" position="before">
<page string="Timesheets">
<field name="timesheet_ids" colspan="4" nolabel="1" context="{'default_user_id' : uid, 'default_account_id' : analytic_account_id, 'default_is_timesheet':1}"
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py
index 4ce47563152..f37dd26fae5 100644
--- a/addons/project_timesheet/project_timesheet.py
+++ b/addons/project_timesheet/project_timesheet.py
@@ -22,6 +22,7 @@ import time
import datetime
from dateutil.relativedelta import relativedelta
+from openerp.addons.analytic.models import analytic
from openerp.osv import fields, osv
from openerp import tools
from openerp.tools.translate import _
@@ -220,6 +221,7 @@ class task(osv.osv):
'timesheet_ids': fields.one2many('account.analytic.line', 'task_id', 'Timesheets'),
'analytic_account_id': fields.related('project_id', 'analytic_account_id',
type='many2one', relation='account.analytic.account', string='Analytic Account', store=True),
+ 'contract_state': fields.related('project_id', 'analytic_account_id', 'state', relation="account.analytic.account", string='Contract Status', type='selection', selection=analytic.ANALYTIC_ACCOUNT_STATE),
}
_defaults = {
@@ -232,6 +234,16 @@ class task(osv.osv):
vals[task.id]['planned_hours'] += task.effective_hours
return vals
+ def onchange_project(self, cr, uid, ids, project_id, context=None):
+ result = super(task, self).onchange_project(cr, uid, ids, project_id, context=context)
+ if not project_id:
+ return result
+ if 'value' not in result:
+ result['value'] = {}
+ project = self.pool['project.project'].browse(cr, uid, project_id, context=context)
+ result['value']['contract_state'] = project.analytic_account_id.state
+ return result
+
class res_partner(osv.osv):
_inherit = 'res.partner'
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml
index 8d10c77fb23..3ce64bc1269 100644
--- a/addons/project_timesheet/project_timesheet_view.xml
+++ b/addons/project_timesheet/project_timesheet_view.xml
@@ -150,6 +150,13 @@
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2" />
<field name="arch" type="xml">
+ <field name="project_id" position="attributes">
+ <attribute name="on_change">onchange_project(project_id)</attribute>
+ </field>
+ <xpath expr='//field[@name="project_id"]' position='after'>
+ <field name="contract_state" widget="label_selection" attrs="{'invisible': ['|', ('project_id', '=', False), ('partner_id', '=', False)]}"
+ options="{'classes': {'template': 'default', 'draft': 'info', 'open': 'success', 'pending': 'warning', 'close': 'danger', 'cancelled': 'warning'}}" readonly="1"/>
+ </xpath>
<field name="categ_ids" position="after">
<field name="analytic_account_id" invisible="1"/>
<field name="progress" widget="progressbar"
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 6c4f194d312..482a7cfe5de 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -21,6 +21,7 @@
from datetime import datetime, timedelta
import time
+from openerp.addons.analytic.models import analytic
from openerp.osv import fields, osv
from openerp.tools.translate import _
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
@@ -175,6 +176,7 @@ class sale_order(osv.osv):
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Pricelist for current sales order."),
'currency_id': fields.related('pricelist_id', 'currency_id', type="many2one", relation="res.currency", string="Currency", readonly=True, required=True),
'project_id': fields.many2one('account.analytic.account', 'Contract / Analytic', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a sales order."),
+ 'contract_state': fields.related('project_id', 'state', string='Contract Status', type='selection', selection=analytic.ANALYTIC_ACCOUNT_STATE),
'order_line': fields.one2many('sale.order.line', 'order_id', 'Order Lines', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, copy=True),
'invoice_ids': fields.many2many('account.invoice', 'sale_order_invoice_rel', 'order_id', 'invoice_id', 'Invoices', readonly=True, copy=False, help="This is the list of invoices that have been generated for this sales order. The same sales order may have been invoiced in several times (by line for example)."),
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 92036c7f34d..707ad4304a6 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -128,6 +128,7 @@
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address" context="{'default_type':'invoice'}"/>
<field name="partner_shipping_id" on_change="onchange_delivery_id(company_id, partner_id, partner_shipping_id, fiscal_position_id)" groups="sale.group_delivery_invoice_address" context="{'default_type':'delivery'}"/>
<field name="project_id" context="{'partner_id':partner_invoice_id, 'manager_id': user_id, 'default_pricelist_id':pricelist_id, 'default_name':name, 'default_type': 'contract'}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
+ <field name="contract_state" groups="sale.group_analytic_accounting" widget="label_selection" attrs="{'invisible': [('project_id', '=', False)]}" options="{'classes': {'template': 'default', 'draft': 'info', 'open': 'success', 'pending': 'warning', 'close': 'danger', 'cancelled': 'warning'}}" readonly="1"/>
</group>
<group>
<field name="date_order"/>
diff --git a/addons/sale_analytic_plans/sale_analytic_plans_view.xml b/addons/sale_analytic_plans/sale_analytic_plans_view.xml
index 121efbdf12e..ba5b908c8ec 100644
--- a/addons/sale_analytic_plans/sale_analytic_plans_view.xml
+++ b/addons/sale_analytic_plans/sale_analytic_plans_view.xml
@@ -2,15 +2,6 @@
<openerp>
<data>
- <record model="ir.ui.view" id="view_order_form_inherit">
- <field name="name">sale.order.form.inherit</field>
- <field name="model">sale.order</field>
- <field name="inherit_id" ref="sale.view_order_form"/>
- <field name="arch" type="xml">
- <field name="project_id" position="replace"/>
- </field>
- </record>
-
<record model="ir.ui.view" id="view_order_form_inherit2">
<field name="name">sale.order.form.inherit2</field>
<field name="model">sale.order</field>
diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js
index 685151d8de4..273b18958a1 100644
--- a/addons/web/static/src/js/views/form_widgets.js
+++ b/addons/web/static/src/js/views/form_widgets.js
@@ -934,6 +934,21 @@ var TimezoneMismatch = FieldSelection.extend({
}
});
+var LabelSelection = FieldSelection.extend({
+ init: function(field_manager, node) {
+ this._super(field_manager, node);
+ this.classes = this.options && this.options.classes || {};
+ },
+ render_value: function() {
+ this._super.apply(this, arguments);
+ if (this.get("effective_readonly")) {
+ var value = this.get('value'),
+ bt_class = this.classes[value] || 'default';
+ this.$el.html(_.str.sprintf("<span class='label label-%s'>%s<span>", bt_class, this.$el.html()));
+ }
+ },
+});
+
var FieldRadio = common.AbstractField.extend(common.ReinitializeFieldMixin, {
template: 'FieldRadio',
events: {
@@ -1626,7 +1641,8 @@ core.form_widget_registry
.add('priority', Priority)
.add('kanban_state_selection', KanbanSelection)
.add('statinfo', StatInfo)
- .add('timezone_mismatch', TimezoneMismatch);
+ .add('timezone_mismatch', TimezoneMismatch)
+ .add('label_selection', LabelSelection);
/**