summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGery Debongnie <ged@openerp.com>2014-04-10 16:51:31 +0200
committerGery Debongnie <ged@openerp.com>2014-04-10 16:51:31 +0200
commit2e9ee9c76e7eae0a98af773ad8abd7585d4ea0ec (patch)
tree7bff96787a2521001e88f9a985f07c584b85516f
parentac2f58ce68481dfbc05ca8bb496c94c59b137565 (diff)
parent4c0f7b1be8d188734b44856f093fa525f6837489 (diff)
[MERGE] merge from rma branch
bzr revid: ged@openerp.com-20140410145131-fj17mdpi13wa5a9m
-rw-r--r--addons/account/partner.py4
-rw-r--r--addons/account/partner_view.xml8
-rw-r--r--addons/account_analytic_default/account_analytic_default.py15
-rw-r--r--addons/account_analytic_default/account_analytic_default_view.xml5
-rw-r--r--addons/account_asset/account_asset.py10
-rw-r--r--addons/account_asset/account_asset_view.xml4
-rw-r--r--addons/account_followup/account_followup_customers.xml16
-rw-r--r--addons/account_payment/account_payment_view.xml10
-rw-r--r--addons/account_voucher/account_voucher_view.xml6
-rw-r--r--addons/claim_from_delivery/claim_delivery_view.xml7
-rw-r--r--addons/crm/crm_lead.py11
-rw-r--r--addons/crm/crm_lead_view.xml17
-rw-r--r--addons/crm/crm_phonecall.py11
-rw-r--r--addons/crm/crm_phonecall_view.xml19
-rw-r--r--addons/crm_claim/crm_claim.py9
-rw-r--r--addons/crm_claim/res_partner_view.xml8
-rw-r--r--addons/crm_project_issue/project_issue_view.xml3
-rw-r--r--addons/email_template/email_template_view.xml15
-rw-r--r--addons/event/event.py14
-rw-r--r--addons/event/event_view.xml12
-rw-r--r--addons/fleet/fleet.py21
-rw-r--r--addons/fleet/fleet_view.xml45
-rw-r--r--addons/gamification/models/challenge.py11
-rw-r--r--addons/gamification/views/challenge.xml8
-rw-r--r--addons/hr/hr.py39
-rw-r--r--addons/hr_contract/hr_contract_view.xml8
-rw-r--r--addons/hr_evaluation/hr_evaluation_view.xml7
-rw-r--r--addons/hr_holidays/hr_holidays_view.xml8
-rw-r--r--addons/hr_payroll/hr_payroll.py10
-rw-r--r--addons/hr_payroll/hr_payroll_view.xml15
-rw-r--r--addons/hr_recruitment/hr_recruitment_view.xml46
-rw-r--r--addons/hr_timesheet/hr_timesheet_view.xml6
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet.py14
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml19
-rw-r--r--addons/marketing_campaign/marketing_campaign.py11
-rw-r--r--addons/marketing_campaign/marketing_campaign_view.xml11
-rw-r--r--addons/mrp/mrp.py16
-rw-r--r--addons/mrp/mrp_view.xml15
-rw-r--r--addons/point_of_sale/point_of_sale_view.xml6
-rw-r--r--addons/procurement/procurement.py9
-rw-r--r--addons/procurement/procurement_view.xml5
-rw-r--r--addons/project/project.py18
-rw-r--r--addons/project/project_view.xml15
-rw-r--r--addons/project/res_partner.py11
-rw-r--r--addons/project/res_partner_view.xml10
-rw-r--r--addons/project_issue/project_issue.py32
-rw-r--r--addons/project_issue/project_issue_view.xml16
-rw-r--r--addons/project_long_term/project_long_term.py10
-rw-r--r--addons/project_long_term/project_long_term_view.xml13
-rw-r--r--addons/project_timesheet/project_timesheet_view.xml5
-rw-r--r--addons/purchase/partner.py21
-rw-r--r--addons/purchase/partner_view.xml14
-rw-r--r--addons/purchase/purchase.py24
-rw-r--r--addons/purchase/purchase_view.xml5
-rw-r--r--addons/purchase/stock_view.xml12
-rw-r--r--addons/sale/res_partner_view.xml7
-rw-r--r--addons/sale/sale.py14
-rw-r--r--addons/sale/sale_view.xml5
-rw-r--r--addons/stock/product.py11
-rw-r--r--addons/stock/product_view.xml10
-rw-r--r--addons/stock/stock.py12
-rw-r--r--addons/stock/stock_view.xml35
-rw-r--r--addons/survey/survey_view.xml15
-rw-r--r--addons/website_event_track/views/event_backend.xml7
64 files changed, 671 insertions, 185 deletions
diff --git a/addons/account/partner.py b/addons/account/partner.py
index 0c3395de1b2..6ae83368143 100644
--- a/addons/account/partner.py
+++ b/addons/account/partner.py
@@ -163,13 +163,14 @@ class res_partner(osv.osv):
return self._asset_difference_search(cr, uid, obj, name, 'payable', args, context=context)
def _invoice_journal_item_count(self, cr, uid, ids, field_name, arg, context=None):
- res = dict(map(lambda x: (x,{'invoice_count': 0, 'journal_item_count': 0}), ids))
+ res = dict(map(lambda x: (x,{'invoice_count': 0, 'journal_item_count': 0, 'cotracts_count': 0 }), ids))
# the user may not have access rights
try:
for partner in self.browse(cr, uid, ids, context):
res[partner.id] = {
'invoice_count': len(partner.invoice_ids),
'journal_item_count': len(partner.journal_item_ids),
+ 'cotracts_count': len(partner.contract_ids)
}
except:
pass
@@ -204,6 +205,7 @@ class res_partner(osv.osv):
'debit': fields.function(_credit_debit_get, fnct_search=_debit_search, string='Total Payable', multi='dc', help="Total amount you have to pay to this supplier."),
'debit_limit': fields.float('Payable Limit'),
'invoice_count': fields.function(_invoice_journal_item_count, string="Invoices", type='integer', multi="invoice_journal"),
+ 'cotracts_count': fields.function(_invoice_journal_item_count, string="Contracts", type='integer', multi="invoice_journal"),
'journal_item_ids': fields.one2many('account.move.line', 'partner_id', 'Journal Items'),
'journal_item_count': fields.function(_invoice_journal_item_count, string="Journal Items", type="integer", multi="invoice_journal"),
'property_account_payable': fields.property(
diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml
index b64f2a4f88c..402337204ae 100644
--- a/addons/account/partner_view.xml
+++ b/addons/account/partner_view.xml
@@ -71,11 +71,13 @@
context="{'search_default_partner_id': active_id,'default_partner_id': active_id}" groups="account.group_account_invoice">
<field string="Invoices" name="invoice_count" widget="statinfo" attrs="{'readonly':1}"/>
</button>
- <button type="action" class="oe_stat_button" name="%(account.action_account_moves_all_tree)d" groups="account.group_account_user" icon="fa-book">
+ <button type="action" class="oe_stat_button" name="%(account.action_account_moves_all_tree)d" groups="account.group_account_user" icon="fa-list">
<field string="Journal Items" name="journal_item_count" widget="statinfo"/>
</button>
- <button type="action" string="Contracts" name="%(account.action_open_partner_analytic_accounts)d"
- groups="analytic.group_analytic_accounting"/>
+ <button class="oe_inline oe_stat_button" type="action" name="%(account.action_open_partner_analytic_accounts)d"
+ icon="fa-book" groups="analytic.group_analytic_accounting">
+ <field string="Contracts" name="cotracts_count" widget="statinfo"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/account_analytic_default/account_analytic_default.py b/addons/account_analytic_default/account_analytic_default.py
index 563a6a3eb9a..1faf75d5eee 100644
--- a/addons/account_analytic_default/account_analytic_default.py
+++ b/addons/account_analytic_default/account_analytic_default.py
@@ -114,6 +114,19 @@ class sale_order_line(osv.osv):
if rec:
inv_line_obj.write(cr, uid, [line.id], {'account_analytic_id': rec.analytic_id.id}, context=context)
return create_ids
-
+class product_product(osv.Model):
+ _inherit = 'product.product'
+ def _rules_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for rule in self.browse(cr, uid, ids, context=context):
+ res[rule.id] = len(rule.rules_ids)
+ except:
+ pass
+ return res
+ _columns = {
+ 'rules_ids': fields.one2many('account.analytic.default', 'product_id', 'Analytic Rules '),
+ 'rules_count': fields.function(_rules_count, string='# Analytic Rules', type='integer'),
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_analytic_default/account_analytic_default_view.xml b/addons/account_analytic_default/account_analytic_default_view.xml
index 8ff323e45c7..38f51a9ef20 100644
--- a/addons/account_analytic_default/account_analytic_default_view.xml
+++ b/addons/account_analytic_default/account_analytic_default_view.xml
@@ -80,7 +80,10 @@
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button string="Analytic Rules" name= "%(action_product_default_list)d" type="action" groups="analytic.group_analytic_accounting" />
+ <button class="oe_inline oe_stat_button" name= "%(action_product_default_list)d" type="action"
+ groups="analytic.group_analytic_accounting" icon="fa-xing">
+ <field string="Analytic Rules" name="rules_count" widget="statinfo" />
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py
index f4e5d17a8e0..6552281e4c2 100644
--- a/addons/account_asset/account_asset.py
+++ b/addons/account_asset/account_asset.py
@@ -237,9 +237,17 @@ class account_asset_asset(osv.osv):
if salvage_value:
val['value_residual'] = purchase_value - salvage_value
return {'value': val}
-
+ def _entry_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for entry in self.browse(cr, uid, ids, context=context):
+ res[entry.id] = len(entry.account_move_line_ids)
+ except:
+ pass
+ return res
_columns = {
'account_move_line_ids': fields.one2many('account.move.line', 'asset_id', 'Entries', readonly=True, states={'draft':[('readonly',False)]}),
+ 'entry_count': fields.function(_entry_count, string='# Asset Entries', type='integer'),
'name': fields.char('Asset Name', size=64, required=True, readonly=True, states={'draft':[('readonly',False)]}),
'code': fields.char('Reference', size=32, readonly=True, states={'draft':[('readonly',False)]}),
'purchase_value': fields.float('Gross Value', required=True, readonly=True, states={'draft':[('readonly',False)]}),
diff --git a/addons/account_asset/account_asset_view.xml b/addons/account_asset/account_asset_view.xml
index fe1fcf473ba..b0a5deacfcb 100644
--- a/addons/account_asset/account_asset_view.xml
+++ b/addons/account_asset/account_asset_view.xml
@@ -84,7 +84,9 @@
</header>
<sheet>
<div class="oe_button_box oe_right">
- <button name="open_entries" string="Entries" type="object" class="oe_inline"/>
+ <button class="oe_inline oe_stat_button" name="open_entries" type="object" icon="fa-pencil">
+ <field string="Entries" name="entry_count" widget="statinfo" />
+ </button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
diff --git a/addons/account_followup/account_followup_customers.xml b/addons/account_followup/account_followup_customers.xml
index fba0bce460b..bdd258237c8 100644
--- a/addons/account_followup/account_followup_customers.xml
+++ b/addons/account_followup/account_followup_customers.xml
@@ -78,14 +78,18 @@
<field name="model">res.partner</field>
<field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/>
<field name="arch" type="xml" >
+ <xpath expr="//div[@name='buttons']" position="inside" groups="account.group_account_invoice">
+ <button class="oe_inline oe_stat_button" type="object" name="do_button_print"
+ icon="fa-print" string="Print Overdue" widget="statinfo" groups="account.group_account_user"
+ help="Print overdue payments report independent of follow-up line"
+ attrs="{'invisible':[('payment_amount_due', '&lt;=', 0.0)]}"/>
+ <button class="oe_inline oe_stat_button" type="object" name="do_partner_mail"
+ icon="fa-envelope-o" string="Mail Overdue" widget="statinfo"
+ help="If not specified by the latest follow-up level, it will send from the default email template"
+ attrs="{'invisible':[('payment_amount_due', '&lt;=', 0.0)]}" groups="account.group_account_user"/>
+ </xpath>
<page string="Accounting" position="before" version="7.0">
<page string="Payment Follow-up" groups="account.group_account_invoice" name="followup_tab">
- <div class="oe_right oe_button_box" name="followup_button">
- <button name="do_button_print" type="object" string="Print Overdue Payments" groups="account.group_account_user"
- help="Print overdue payments report independent of follow-up line" attrs="{'invisible':[('payment_amount_due', '&lt;=', 0.0)]}" />
- <button name="do_partner_mail" type="object" string="Send Overdue Email" groups="account.group_account_user"
- help="If not specified by the latest follow-up level, it will send from the default email template" attrs="{'invisible':[('payment_amount_due', '&lt;=', 0.0)]}"/>
- </div>
<p attrs="{'invisible':[('latest_followup_date','=', False)]}">
The <field name="latest_followup_date" class = "oe_inline"/>, the latest payment follow-up
was: <field name="latest_followup_level_id" class="oe_inline"/>
diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml
index e49d6dfe93b..d62a7969754 100644
--- a/addons/account_payment/account_payment_view.xml
+++ b/addons/account_payment/account_payment_view.xml
@@ -69,14 +69,14 @@
<field name="state" widget="statusbar" statusbar_visible="draft,open"/>
</header>
<sheet string="Payment order">
- <div class="oe_button_box">
- <button name="%(action_create_payment_order)d" string="Select Invoices to Pay"
- type="action" attrs="{'invisible':[('state','=','done')]}" icon="gtk-find"/>
- </div>
<div class="oe_title">
<label for="reference" class="oe_edit_only"/>
<h1><field name="reference"/></h1>
</div>
+ <div class=" oe_right oe_button_box">
+ <button class="oe_inline oe_stat_button oe_right" name="%(action_create_payment_order)d" string="Invoices" Help="Select Invoices to Pay"
+ type="action" attrs="{'invisible':[('state','=','done')]}" icon="fa-pencil-square-o" widget="statinfo"/>
+ </div>
<group>
<group>
<field name="user_id" context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'account.group_account_invoice']}"/>
@@ -292,7 +292,7 @@
<field name="inherit_id" ref="account.view_bank_statement_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='import_buttons']" position="inside">
- <button name="%(action_account_populate_statement_confirm)d" attrs="{'invisible':[('state','=','confirm')]}" string="Import Payment Lines" type="action" icon="gtk-execute"/>
+ <button class="oe_inline oe_stat_button" name="%(action_account_populate_statement_confirm)d" attrs="{'invisible':[('state','=','confirm')]}" string="Import Lines" help="Import Payment Lines" type="action" icon="fa-cogs" widget="statinfo"/>
</xpath>
</field>
</record>
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 3e4f1635914..a5885156442 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -200,9 +200,9 @@
<field name="inherit_id" ref="account.view_bank_statement_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='import_buttons']" position="inside">
- <button name="%(action_view_account_statement_from_invoice_lines)d"
- string="Import Invoices" type="action"
- attrs="{'invisible':[('state','=','confirm')]}"/>
+ <button class="oe_inline oe_stat_button" name="%(action_view_account_statement_from_invoice_lines)d"
+ string="Import Invoice" type="action"
+ attrs="{'invisible':[('state','=','confirm')]}" widget="statinfo" icon="fa-pencil-square-o"/>
</xpath>
</field>
</record>
diff --git a/addons/claim_from_delivery/claim_delivery_view.xml b/addons/claim_from_delivery/claim_delivery_view.xml
index 9187b1d11ca..852d602c269 100644
--- a/addons/claim_from_delivery/claim_delivery_view.xml
+++ b/addons/claim_from_delivery/claim_delivery_view.xml
@@ -9,7 +9,6 @@
<field name="context">{'default_ref': 'stock.picking.out,'+str(context.get('active_id', False))}</field>
<field name="domain">[('ref','=','stock.picking.out,'+str(context.get('active_id',False)))]</field>
</record>
-
<record id="crm_claim_from_delivery" model="ir.ui.view">
<field name="name">crm.claim.from_delivery.form</field>
<field name="model">stock.picking.out</field>
@@ -17,11 +16,13 @@
<field name="arch" type="xml">
<xpath expr="/form/sheet/h1" position="before">
<div class="oe_right oe_button_box">
- <button name="%(action_claim_from_delivery)d" string="Claims" type="action"/>
+ <button class="oe_inline oe_stat_button" type="action"
+ name="%(action_claim_from_delivery)d" icon="fa-comments" >
+ <field string="Claims" name="claim_count" widget="statinfo"/>
+ </button>
</div>
</xpath>
</field>
</record>
-
</data>
</openerp>
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index 9dfe22202ec..f3ce3ace549 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -214,7 +214,14 @@ class crm_lead(format_address, osv.osv):
duration = len(no_days)
res[lead.id][field] = abs(int(duration))
return res
-
+ def _meeting_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for meeting in self.browse(cr, uid, ids, context=context):
+ res[meeting.id] = len(meeting.opportunity_ids)
+ except:
+ pass
+ return res
_columns = {
'partner_id': fields.many2one('res.partner', 'Partner', ondelete='set null', track_visibility='onchange',
select=True, help="Linked partner (optional). Usually created when converting the lead."),
@@ -289,6 +296,8 @@ class crm_lead(format_address, osv.osv):
'payment_mode': fields.many2one('crm.payment.mode', 'Payment Mode', \
domain="[('section_id','=',section_id)]"),
'planned_cost': fields.float('Planned Costs'),
+ 'opportunity_ids': fields.one2many('calendar.event', 'opportunity_id', 'Opportunities'),
+ 'meeting_count': fields.function(_meeting_count, string='# Meetings', type='integer'),
}
_defaults = {
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index a33b215fb8f..beed7ba5c97 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -103,9 +103,8 @@
</header>
<sheet>
<div class="oe_right oe_button_box" name="buttons">
- <button string="Schedule/Log Call"
- name="%(opportunity2phonecall_act)d"
- type="action"/>
+ <button class="oe_inline oe_stat_button" type="action" name="%(opportunity2phonecall_act)d" icon="fa-phone"
+ widget="statinfo" string="Calls"/>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
@@ -389,11 +388,13 @@
</header>
<sheet>
<div class="oe_right oe_button_box">
- <button string="Schedule/Log Call" type="action"
- name="%(opportunity2phonecall_act)d"/>
- <button string="Meeting" type="object"
- name="action_makeMeeting"
- context="{'search_default_attendee_id': active_id, 'default_attendee_id' : active_id}"/>
+ <button class="oe_inline oe_stat_button" type="action" name="%(opportunity2phonecall_act)d" icon="fa-phone"
+ widget="statinfo" string="Calls"/>
+ <button class="oe_inline oe_stat_button" type="object"
+ context="{'search_default_attendee_id': active_id, 'default_attendee_id' : active_id}"
+ name="action_makeMeeting" icon="fa-calendar">
+ <field string="Meetings" name="meeting_count" widget="statinfo"/>
+ </button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
diff --git a/addons/crm/crm_phonecall.py b/addons/crm/crm_phonecall.py
index 19bc98c585a..be92fcad2bf 100644
--- a/addons/crm/crm_phonecall.py
+++ b/addons/crm/crm_phonecall.py
@@ -31,6 +31,15 @@ class crm_phonecall(osv.osv):
_description = "Phonecall"
_order = "id desc"
_inherit = ['mail.thread']
+
+ def _meeting_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for meeting in self.browse(cr, uid, ids, context=context):
+ res[meeting.id] = len(meeting.meeting_ids)
+ except:
+ pass
+ return res
_columns = {
'date_action_last': fields.datetime('Last Action', readonly=1),
'date_action_next': fields.datetime('Next Action', readonly=1),
@@ -65,6 +74,8 @@ class crm_phonecall(osv.osv):
'date_closed': fields.datetime('Closed', readonly=True),
'date': fields.datetime('Date'),
'opportunity_id': fields.many2one ('crm.lead', 'Lead/Opportunity'),
+ 'meeting_ids': fields.one2many('calendar.event', 'phonecall_id', 'Phonecalls'),
+ 'meeting_count': fields.function(_meeting_count, string='# Meetings', type='integer'),
}
def _get_default_state(self, cr, uid, context=None):
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index 60b5934ac53..25cddce10b6 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -64,15 +64,16 @@
<field name="state" nolabel="1" widget="statusbar" clickable="True"/>
</header>
<sheet string="Phone Call">
- <div class="oe_right">
- <button string="Convert to Opportunity"
- type="object"
- name="action_button_convert2opportunity"
- attrs="{'invisible':[ '|', ('opportunity_id','!=',False), ('state', 'not in', ('open', 'done'))]}"/>
- <button string="Schedule Other Call"
- name="%(phonecall_to_phonecall_act)d"
- type="action"/>
- <button string="Schedule a Meeting" name="action_make_meeting" type="object"/>
+ <div class="oe_right oe_button_box">
+ <button class="oe_inline oe_stat_button" type="object" name="action_button_convert2opportunity"
+ icon="fa-star" string="Opportunity"
+ attrs="{'invisible':[ '|', ('opportunity_id','!=',False), ('state', 'not in', ('open', 'done'))]}"
+ help="Convert to Opportunity" widget="statinfo"/>
+ <button class="oe_inline oe_stat_button" type="action"
+ name="%(phonecall_to_phonecall_act)d" icon="fa-phone" string="Other Call" widget="statinfo"/>
+ <button class="oe_inline oe_stat_button" name="action_make_meeting" type="object" icon="fa-calendar fa-fw">
+ <field string="Plan Meeting" name="meeting_count" widget="statinfo" />
+ </button>
</div>
<div class="oe_title">
<div class="oe_edit_only">
diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py
index 50cbe4a6c44..d55036193c4 100644
--- a/addons/crm_claim/crm_claim.py
+++ b/addons/crm_claim/crm_claim.py
@@ -190,8 +190,17 @@ class crm_claim(osv.osv):
class res_partner(osv.osv):
_inherit = 'res.partner'
+ def _claim_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for partner in self.browse(cr, uid, ids, context=context):
+ res[partner.id] = len(partner.claims_ids)
+ except:
+ pass
+ return res
_columns = {
'claims_ids': fields.one2many('crm.claim', 'partner_id', 'Claims'),
+ 'claim_count': fields.function(_claim_count, string='# Claims', type='integer'),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/crm_claim/res_partner_view.xml b/addons/crm_claim/res_partner_view.xml
index 4a5db879311..6d5d54498ee 100644
--- a/addons/crm_claim/res_partner_view.xml
+++ b/addons/crm_claim/res_partner_view.xml
@@ -9,11 +9,11 @@
<field name="priority" eval="50"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button class="oe_inline" type="action"
- name="%(crm_case_categ_claim0)d"
- string="Claims"
+ <button class="oe_inline oe_stat_button" type="action"
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}"
- groups="base.group_sale_salesman" />
+ name="%(crm_case_categ_claim0)d" icon="fa-comments" groups="base.group_sale_salesman">
+ <field string="Claims" name="claim_count" widget="statinfo"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/crm_project_issue/project_issue_view.xml b/addons/crm_project_issue/project_issue_view.xml
index b62e5f74880..65ca274f086 100644
--- a/addons/crm_project_issue/project_issue_view.xml
+++ b/addons/crm_project_issue/project_issue_view.xml
@@ -36,7 +36,8 @@
<field name="inherit_id" ref="crm.crm_case_form_view_leads" />
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']/button" position="after">
- <button name="%(convert_lead2projectissue_wizard_action)d" string="Convert to Issue" type="action" help="Convert to Issue" />
+ <button class="oe_inline oe_stat_button" type="action" name="%(convert_lead2projectissue_wizard_action)d" icon="fa-bug"
+ help="Convert to Issue" widget="statinfo" string="Move to Issue"/>
</xpath>
</field>
</record>
diff --git a/addons/email_template/email_template_view.xml b/addons/email_template/email_template_view.xml
index 4f7828cb531..52fb270eb12 100644
--- a/addons/email_template/email_template_view.xml
+++ b/addons/email_template/email_template_view.xml
@@ -14,15 +14,16 @@
</div>
<div class="oe_right oe_button_box" name="buttons">
<field name="ref_ir_act_window" invisible="1"/>
- <button name="create_action" string="Add context action" type="object"
- attrs="{'invisible':[('ref_ir_act_window','!=',False)]}"
- help="Display an option on related documents to open a composition wizard with this template"/>
- <button name="unlink_action" string="Remove context action" type="object"
+ <button class="oe_inline oe_stat_button" name="create_action" string="Add action" type="object"
+ attrs="{'invisible':[('ref_ir_act_window','!=',False)]}" icon="fa-plus"
+ help="Display an option on related documents to open a composition wizard with this template" widget="statinfo"/>
+ <button name="unlink_action" string="Drop action" type="object"
+ class="oe_stat_button" icon="fa-minus"
attrs="{'invisible':[('ref_ir_act_window','=',False)]}"
- help="Remove the contextual action to use this template on related documents"/>
- <button name="%(wizard_email_template_preview)d" string="Preview"
+ help="Remove the contextual action to use this template on related documents" widget="statinfo"/>
+ <button class="oe_inline oe_stat_button" name="%(wizard_email_template_preview)d" icon="fa-search-plus" string="Preview"
type="action" target="new"
- context="{'template_id':active_id}"/>
+ context="{'template_id':active_id}" widget="statinfo"/>
</div>
<notebook>
<page string="Mailing Template">
diff --git a/addons/event/event.py b/addons/event/event.py
index 7ee99402158..497d75f9be0 100644
--- a/addons/event/event.py
+++ b/addons/event/event.py
@@ -149,6 +149,17 @@ class event_event(osv.osv):
res[event.id]= True
continue
return res
+
+ def _count_all(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'count_regitrations': 0, 'count_tracks': 0,}), ids))
+ try:
+ for data in self.browse(cr, uid, ids, context=context):
+ res[data.id] = {'count_regitrations': len(data.registration_ids),
+ 'count_tracks': len(data.track_ids),
+ }
+ except:
+ pass
+ return res
_columns = {
'name': fields.char('Event Name', size=64, required=True, translate=True, readonly=False, states={'done': [('readonly', True)]}),
@@ -169,6 +180,7 @@ class event_event(osv.osv):
store={'event.registration': (_get_events_from_registrations, ['state'], 10),
'event.event': (lambda self, cr, uid, ids, c = {}: ids, ['seats_max', 'registration_ids'], 20)}),
'registration_ids': fields.one2many('event.registration', 'event_id', 'Registrations', readonly=False, states={'done': [('readonly', True)]}),
+ 'track_ids': fields.one2many('event.track', 'event_id', 'Tracks', readonly=False),
'date_begin': fields.datetime('Start Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'date_end': fields.datetime('End Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'state': fields.selection([
@@ -191,6 +203,8 @@ class event_event(osv.osv):
'company_id': fields.many2one('res.company', 'Company', required=False, change_default=True, readonly=False, states={'done': [('readonly', True)]}),
'is_subscribed' : fields.function(_subscribe_fnc, type="boolean", string='Subscribed'),
'organizer_id': fields.many2one('res.partner', "Organizer"),
+ 'count_regitrations': fields.function(_count_all, type="integer", string="Registrations", multi=True),
+ 'count_tracks': fields.function(_count_all, type='integer', string='Tracks', multi=True),
}
_defaults = {
'state': 'draft',
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index 07a36ea3a6b..6f41646d156 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -65,13 +65,19 @@
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,done"/>
</header>
<sheet>
- <div class="oe_right oe_button_box" groups="base.group_user">
- <button name="%(event.act_event_list_register_event)d" type="action" string="Registrations" help="Register with this event"/>
- </div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
</div>
+ <div class="oe_right oe_button_box" groups="base.group_user">
+ <button name="%(event.act_event_list_register_event)d"
+ type="action"
+ class="oe_stat_button oe_inline"
+ icon="fa-github"
+ help="Register with this event">
+ <field name="count_regitrations" widget="statinfo" string="Registrations"/>
+ </button>
+ </div>
<group name="main_field_group">
<group>
<field name="address_id" context="{'show_address': 1}" options='{"always_reload": True}'/>
diff --git a/addons/fleet/fleet.py b/addons/fleet/fleet.py
index 8aea73ba405..0e964cafc80 100644
--- a/addons/fleet/fleet.py
+++ b/addons/fleet/fleet.py
@@ -313,6 +313,20 @@ class fleet_vehicle(osv.Model):
except ValueError:
model_id = False
return model_id
+
+ def _count_all(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'odometer_count': 0, 'fuel_logs_count': 0, 'service_count': 0, 'contract_count': 0, 'cost_count': 0,}), ids))
+ try:
+ for costs in self.browse(cr, uid, ids, context=context):
+ res[costs.id] = {'odometer_count': len(costs.odometer_ids),
+ 'fuel_logs_count': len(costs.log_fuel),
+ 'service_count': len(costs.log_services),
+ 'contract_count': len(costs.log_contracts),
+ 'cost_count': len(costs.costs_ids)
+ }
+ except:
+ pass
+ return res
_name = 'fleet.vehicle'
_description = 'Information on a vehicle'
@@ -327,6 +341,13 @@ class fleet_vehicle(osv.Model):
'log_fuel': fields.one2many('fleet.vehicle.log.fuel', 'vehicle_id', 'Fuel Logs'),
'log_services': fields.one2many('fleet.vehicle.log.services', 'vehicle_id', 'Services Logs'),
'log_contracts': fields.one2many('fleet.vehicle.log.contract', 'vehicle_id', 'Contracts'),
+ 'costs_ids': fields.one2many('fleet.vehicle.cost', 'vehicle_id', 'Costs'),
+ 'odometer_ids': fields.one2many('fleet.vehicle.odometer', 'vehicle_id', 'Odometer'),
+ 'cost_count': fields.function(_count_all, type='integer', string="Costs" , multi=True),
+ 'contract_count': fields.function(_count_all, type='integer', string='Contracts', multi=True),
+ 'service_count': fields.function(_count_all, type='integer', string='Services', multi=True),
+ 'fuel_logs_count': fields.function(_count_all, type='integer', string='Fuel Logs', multi=True),
+ 'odometer_count': fields.function(_count_all, type='integer', string='Odometer', multi=True),
'acquisition_date': fields.date('Acquisition Date', required=False, help='Date when the vehicle has been bought'),
'color': fields.char('Color', size=32, help='Color of the vehicle'),
'state_id': fields.many2one('fleet.vehicle.state', 'State', help='Current state of the vehicle', ondelete="set null"),
diff --git a/addons/fleet/fleet_view.xml b/addons/fleet/fleet_view.xml
index d8c47e43b9d..e4cdbe886f7 100644
--- a/addons/fleet/fleet_view.xml
+++ b/addons/fleet/fleet_view.xml
@@ -211,11 +211,46 @@
<field name="tag_ids" widget="many2many_tags" />
</div>
<div class="oe_right oe_button_box">
- <button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_log_contract_act'}" string="Contracts" help="show the contract for this vehicle" />
- <button name="act_show_log_cost" type="object" string="Costs" help="show all the costs for this vehicle" groups="fleet.group_fleet_manager"/>
- <button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_log_services_act'}" string="Services" help="show the services logs for this vehicle" />
- <button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_log_fuel_act'}" string="Fuel Logs" help="show the fuel logs for this vehicle" />
- <button name="return_action_to_open" type="object" context="{'xml_id':'fleet_vehicle_odometer_act'}" string="Odometer Logs" help="show the odometer logs for this vehicle" />
+ <button name="return_action_to_open"
+ type="object"
+ class="oe_stat_button"
+ icon="fa-book"
+ context="{'xml_id':'fleet_vehicle_log_contract_act'}"
+ help="show the contract for this vehicle">
+ <field name="contract_count" widget="statinfo" string="Contracts"/>
+ </button>
+ <button name="act_show_log_cost"
+ type="object"
+ class="oe_stat_button"
+ icon="fa-usd"
+ help="show all the costs for this vehicle"
+ groups="fleet.group_fleet_manager">
+ <field name="cost_count" widget="statinfo" string="Costs"/>
+ </button>
+ <button name="return_action_to_open"
+ type="object"
+ class="oe_stat_button"
+ icon="fa-wrench"
+ context="{'xml_id':'fleet_vehicle_log_services_act'}"
+ help="show the services logs for this vehicle" >
+ <field name="service_count" widget="statinfo" string="Services"/>
+ </button>
+ <button name="return_action_to_open"
+ type="object"
+ class="oe_stat_button"
+ icon="fa-flask"
+ context="{'xml_id':'fleet_vehicle_log_fuel_act'}"
+ help="show the fuel logs for this vehicle" >
+ <field name="fuel_logs_count" widget="statinfo" string="Fuel"/>
+ </button>
+ <button name="return_action_to_open"
+ type="object"
+ class="oe_stat_button"
+ icon="fa-tachometer"
+ context="{'xml_id':'fleet_vehicle_odometer_act'}"
+ help="show the odometer logs for this vehicle" >
+ <field name="odometer_count" widget="statinfo" string="Odometer"/>
+ </button>
</div>
<group col="2" string="General Properties">
<group >
diff --git a/addons/gamification/models/challenge.py b/addons/gamification/models/challenge.py
index 06d0c44baac..11b5f787bdd 100644
--- a/addons/gamification/models/challenge.py
+++ b/addons/gamification/models/challenge.py
@@ -114,6 +114,15 @@ class gamification_challenge(osv.Model):
return self.pool.get('ir.model.data').get_object_reference(cr, uid, 'gamification', 'simple_report_template')[1]
except ValueError:
return False
+
+ def _count_goals(self, cr, uid, ids, field_name, arg, context=None):
+ res = {}
+ try:
+ for goals in self.browse(cr, uid, ids, context=context):
+ res[goals.id] = len(goals.goals_ids)
+ except:
+ pass
+ return res
_order = 'end_date, start_date, name, id'
_columns = {
@@ -191,6 +200,8 @@ class gamification_challenge(osv.Model):
'category': fields.selection(lambda s, *a, **k: s._get_categories(*a, **k),
string="Appears in", help="Define the visibility of the challenge through menus", required=True),
+ 'goals_ids': fields.one2many('gamification.goal', 'challenge_id', 'Related Goals'),
+ 'goals_count': fields.function(_count_goals, type='integer', string='Related Goals')
}
_defaults = {
diff --git a/addons/gamification/views/challenge.xml b/addons/gamification/views/challenge.xml
index 075afcaccfa..9683557a14c 100644
--- a/addons/gamification/views/challenge.xml
+++ b/addons/gamification/views/challenge.xml
@@ -53,7 +53,13 @@
<!-- action buttons -->
<div class="oe_right oe_button_box">
- <button type="action" name="%(goals_from_challenge_act)d" string="Related Goals" attrs="{'invisible': [('state','=','draft')]}" />
+ <button type="action"
+ name="%(goals_from_challenge_act)d"
+ class="oe_stat_button"
+ icon="fa-gift"
+ attrs="{'invisible': [('state','=','draft')]}">
+ <field name="goals_count" widget="statinfo" string="Goals" help="Related Goals"/>
+ </button>
</div>
<group>
<group>
diff --git a/addons/hr/hr.py b/addons/hr/hr.py
index a13a1866493..4efa72e8f5e 100644
--- a/addons/hr/hr.py
+++ b/addons/hr/hr.py
@@ -92,6 +92,17 @@ class hr_job(osv.Model):
res.append(employee.job_id.id)
return res
+ def _count_all(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'documents_count': 0, 'application_count': 0,}), ids))
+ try:
+ for data in self.browse(cr, uid, ids, context=context):
+ res[data.id] = {'documents_count': len(data.document_ids),
+ 'application_count': len(data.applicant_ids),
+ }
+ except:
+ pass
+ return res
+
_name = "hr.job"
_description = "Job Position"
_inherit = ['mail.thread', 'ir.needaction_mixin']
@@ -122,6 +133,10 @@ class hr_job(osv.Model):
track_visibility='always',
help="By default 'Closed', set it to 'In Recruitment' if recruitment process is going on for this job position."),
'write_date': fields.datetime('Update Date', readonly=True),
+ 'applicant_ids':fields.one2many('hr.applicant', 'job_id', 'Applications'),
+ 'application_count': fields.function(_count_all, type='integer', string='Applications', multi=True),
+ 'document_ids': fields.one2many('ir.attachment', 'company_id', 'Documents'),
+ 'documents_count': fields.function(_count_all, type='integer', string='Documents', multi=True),
}
_defaults = {
@@ -186,6 +201,20 @@ class hr_employee(osv.osv):
def _set_image(self, cr, uid, id, name, value, args, context=None):
return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
+
+ def _count_all(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'appraisal_count': 0, 'leaves_count': 0, 'contracts_count': 0, 'timesheet_count': 0, 'payslip_count': 0,}), ids))
+ try:
+ for datas in self.browse(cr, uid, ids, context=context):
+ res[datas.id] = {'appraisal_count': len(datas.appraisal_ids),
+ 'leaves_count': len(datas.leave_ids),
+ 'contracts_count': len(datas.contract_ids),
+ 'timesheet_count': len(datas.timsheet_ids),
+ 'payslip_count': len(datas.payslip_ids)
+ }
+ except:
+ pass
+ return res
_columns = {
#we need a related field in order to be able to sort the employee by name
@@ -237,6 +266,16 @@ class hr_employee(osv.osv):
'city': fields.related('address_id', 'city', type='char', string='City'),
'login': fields.related('user_id', 'login', type='char', string='Login', readonly=1),
'last_login': fields.related('user_id', 'date', type='datetime', string='Latest Connection', readonly=1),
+ 'appraisal_ids': fields.one2many('hr.evaluation.interview', 'user_to_review_id', 'Appraisal Interviews'),
+ 'leave_ids': fields.one2many('hr.holidays', 'employee_id', 'Leaves'),
+ 'contracts_ids': fields.one2many('hr.contract', 'employee_id', 'Contracts'),
+ 'timsheet_ids': fields.one2many('hr_timesheet_sheet.sheet', 'employee_id', 'Timesheets'),
+ 'payslip_ids': fields.one2many('hr.payslip', 'employee_id', 'Payslips'),
+ 'appraisal_count': fields.function(_count_all, type='integer', string='Appraisal Interviews', multi=True),
+ 'leaves_count': fields.function(_count_all, type='integer', string='Leaves', multi=True),
+ 'contracts_count': fields.function(_count_all, type='integer', string='Contracts', multi=True),
+ 'timesheet_count': fields.function(_count_all, type='integer', string='Timsheets', multi=True),
+ 'payslip_count': fields.function(_count_all, type='integer', string='Payslips', multi=True),
}
def _get_default_image(self, cr, uid, context=None):
diff --git a/addons/hr_contract/hr_contract_view.xml b/addons/hr_contract/hr_contract_view.xml
index c21690401f2..f97aefd70ed 100644
--- a/addons/hr_contract/hr_contract_view.xml
+++ b/addons/hr_contract/hr_contract_view.xml
@@ -21,7 +21,13 @@
<field name="arch" type="xml">
<data>
<xpath expr="//div[@name='button_box']" position="inside">
- <button name="%(act_hr_employee_2_hr_contract)d" string="Contracts" type="action" groups="base.group_hr_manager"/>
+ <button name="%(act_hr_employee_2_hr_contract)d"
+ class="oe_stat_button"
+ icon="fa-book"
+ type="action"
+ groups="base.group_hr_manager">
+ <field name="contracts_count" widget="statinfo" string="Contracts"/>
+ </button>
</xpath>
<xpath expr="//field[@name='coach_id']" position="after">
<field name="manager"/>
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml
index 28bc4a6c96e..ab8363049c1 100644
--- a/addons/hr_evaluation/hr_evaluation_view.xml
+++ b/addons/hr_evaluation/hr_evaluation_view.xml
@@ -145,7 +145,12 @@
</group>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
- <button name="%(act_hr_employee_2_hr__evaluation_interview)d" string="Appraisal Interviews" type="action"/>
+ <button name="%(act_hr_employee_2_hr__evaluation_interview)d"
+ class="oe_stat_button"
+ icon="fa-sitemap"
+ type="action">
+ <field name="appraisal_count" widget="statinfo" string="Form"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index d4b84bab012..a15a18d20aa 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -483,7 +483,13 @@
</group>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
- <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action" groups="base.group_hr_user"/>
+ <button name="%(act_hr_employee_holiday_request)d"
+ type="action"
+ class="oe_stat_button"
+ icon="fa-calendar"
+ groups="base.group_hr_user">
+ <field name="leaves_count" widget="statinfo" string="Leaves"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py
index 3c01847f812..8a8353ad5a0 100644
--- a/addons/hr_payroll/hr_payroll.py
+++ b/addons/hr_payroll/hr_payroll.py
@@ -258,6 +258,15 @@ class hr_payslip(osv.osv):
for r in res:
result[r[0]].append(r[1])
return result
+
+ def _count_detail_payslip(self, cr, uid, ids, field_name, arg, context=None):
+ res = {}
+ try:
+ for details in self.browse(cr, uid, ids, context=context):
+ res[details.id] = len(details.line_ids)
+ except:
+ pass
+ return res
_columns = {
'struct_id': fields.many2one('hr.payroll.structure', 'Structure', readonly=True, states={'draft': [('readonly', False)]}, help='Defines the rules that have to be applied to this payslip, accordingly to the contract chosen. If you let empty the field contract, this field isn\'t mandatory anymore and thus the rules applied will be all the rules set on the structure of all contracts of the employee valid for the chosen period'),
@@ -287,6 +296,7 @@ class hr_payslip(osv.osv):
'details_by_salary_rule_category': fields.function(_get_lines_salary_rule_category, method=True, type='one2many', relation='hr.payslip.line', string='Details by Salary Rule Category'),
'credit_note': fields.boolean('Credit Note', help="Indicates this payslip has a refund of another", readonly=True, states={'draft': [('readonly', False)]}),
'payslip_run_id': fields.many2one('hr.payslip.run', 'Payslip Batches', readonly=True, states={'draft': [('readonly', False)]}),
+ 'payslip_count': fields.function(_count_detail_payslip, type='integer', string="Payslip Computation Details"),
}
_defaults = {
'date_from': lambda *a: time.strftime('%Y-%m-01'),
diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml
index 4410784c63c..4cf7597d87e 100644
--- a/addons/hr_payroll/hr_payroll_view.xml
+++ b/addons/hr_payroll/hr_payroll_view.xml
@@ -222,7 +222,12 @@
</header>
<sheet>
<div class="oe_right oe_button_box">
- <button name="%(act_payslip_lines)d" string="Payslip Computation Details" type="action"/>
+ <button name="%(act_payslip_lines)d"
+ class="oe_stat_button"
+ icon="fa-money"
+ type="action">
+ <field name="payslip_count" widget="statinfo" string="Payslip" help="Payslip Computation Details"/>
+ </button>
</div>
<div class="oe_title">
<label for="employee_id" class="oe_edit_only"/>
@@ -387,7 +392,13 @@
<field name="arch" type="xml">
<data>
<xpath expr="//div[@name='button_box']" position="inside">
- <button name="%(act_hr_employee_payslip_list)d" string="Payslips" type="action" groups="base.group_hr_user"/>
+ <button name="%(act_hr_employee_payslip_list)d"
+ class="oe_stat_button"
+ icon="fa-money"
+ type="action"
+ groups="base.group_hr_user">
+ <field name="payslip_count" widget="statinfo" string="Payslips"/>
+ </button>
</xpath>
</data>
</field>
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index c9dc0d04ffb..6221d0d83f1 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -74,16 +74,27 @@
</header>
<sheet>
<div class="oe_right oe_button_box">
- <button name="action_makeMeeting" type="object"
- string="Schedule Meeting" help="Schedule interview with this applicant"/>
- <button name="%(survey.action_view_survey_question_message)d" type="action"
- string="Start Interview" help="Answer related job question"
+ <button name="action_makeMeeting" class="oe_stat_button" icon="fa-calendar" type="object"
+ string="Meeting" help="Schedule interview with this applicant"/>
+ <button name="%(survey.action_view_survey_question_message)d"
+ class="oe_stat_button"
+ icon="fa-user"
+ type="action"
+ string="Interview" help="Answer related job question"
context="{'survey_id': survey, 'response_id': [response], 'response_no':0 ,'active' : response, 'object' : 'hr.applicant'}"
attrs="{'invisible':[('survey','=',False)]}"/>
- <button name="action_print_survey" type="object"
- string="Print Interview" help="Print interview report"
+ <button name="action_print_survey"
+ class="oe_stat_button"
+ icon="fa-print"
+ type="object"
+ string="Print" help="Print interview report"
attrs="{'invisible':[('survey','=',False)]}"/>
- <button name="action_get_attachment_tree_view" string="Documents" type="object"/>
+ <button name="action_get_attachment_tree_view"
+ class="oe_stat_button"
+ icon="fa-book"
+ type="object">
+ <field name="attachment_number" widget="statinfo" string="Documents"/>
+ </button>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
@@ -367,10 +378,23 @@
<xpath expr="//field[@name='department_id']" position="after">
<field name="user_id" class="oe_inline"/>
</xpath>
- <div name="buttons" position="inside">
- <button string="Applications" name="%(action_hr_job_applications)d" context="{'default_user_id': user_id}" type="action"/>
- <button string="Documents" name="action_get_attachment_tree_view" type="object"/>
- </div>
+ <xpath expr="//div[@name='buttons']" position="inside">
+ <div class="oe_button_box" >
+ <button class="oe_stat_button"
+ icon="fa-file-o"
+ name="%(action_hr_job_applications)d"
+ context="{'default_user_id': user_id}"
+ type="action">
+ <field name="application_count" widget="statinfo" string="Applications"/>
+ </button>
+ <button class="oe_stat_button"
+ icon="fa-book"
+ name="action_get_attachment_tree_view"
+ type="object">
+ <field name="documents_count" widget="statinfo" string="Documents"/>
+ </button>
+ </div>
+ </xpath>
</field>
</record>
diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml
index 0cd8a880a68..a9de1bb19c9 100644
--- a/addons/hr_timesheet/hr_timesheet_view.xml
+++ b/addons/hr_timesheet/hr_timesheet_view.xml
@@ -118,10 +118,8 @@
<label for="use_timesheets"/>
</xpath>
<xpath expr='//div[@name="buttons"]' position='inside'>
- <button string="Costs and Revenues"
- name="%(act_analytic_cost_revenue)d"
- type="action"/>
-
+ <button class="oe_inline oe_stat_button" type="action" name="%(act_analytic_cost_revenue)d"
+ icon="fa-usd" string="Cost/Revenue" widget="statinfo"/>
</xpath>
</field>
</record>
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index 9226787e908..d71d083fbcd 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -103,6 +103,17 @@ class hr_timesheet_sheet(osv.osv):
for sheet in self.browse(cr, uid, ids, context=context):
if sheet.employee_id.id not in employee_ids: employee_ids.append(sheet.employee_id.id)
return hr_employee.attendance_action_change(cr, uid, employee_ids, context=context)
+
+ def _count_all(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'timesheet_activity_count': 0, 'attendance_count': 0,}), ids))
+ try:
+ for datas in self.browse(cr, uid, ids, context=context):
+ res[datas.id] = {'timesheet_activity_count': len(datas.timesheet_activity_ids),
+ 'attendance_count': len(datas.attendances_ids),
+ }
+ except:
+ pass
+ return res
_columns = {
'name': fields.char('Note', size=64, select=1,
@@ -134,6 +145,9 @@ class hr_timesheet_sheet(osv.osv):
'account_ids': fields.one2many('hr_timesheet_sheet.sheet.account', 'sheet_id', 'Analytic accounts', readonly=True),
'company_id': fields.many2one('res.company', 'Company'),
'department_id':fields.many2one('hr.department','Department'),
+ 'timesheet_activity_ids': fields.one2many('hr.analytic.timesheet', 'sheet_id', 'Timesheet Activities'),
+ 'timesheet_activity_count': fields.function(_count_all, type='integer', string='Timesheet Activities', multi=True),
+ 'attendance_count': fields.function(_count_all, type='integer', string="Attendances", multi=True),
}
def _default_date_from(self, cr, uid, context=None):
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
index 644586ec502..a60afda8531 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
@@ -73,10 +73,15 @@
<div class="oe_right oe_button_box" name="buttons">
<button type="action"
name="%(act_hr_timesheet_sheet_sheet_2_hr_analytic_timesheet)d"
- string="Timesheet Activities" />
+ class="oe_stat_button"
+ icon="fa-clock-o">
+ <field name="timesheet_activity_count" widget="statinfo" string="Timesheet" help="Timesheet Activities"/>
+ </button>
<button type="action" groups="base.group_hr_attendance"
- name="%(act_hr_timesheet_sheet_sheet_2_hr_attendance)d"
- string="Attendances" />
+ class="oe_stat_button" icon="fa-users"
+ name="%(act_hr_timesheet_sheet_sheet_2_hr_attendance)d">
+ <field name="attendance_count" widget="statinfo" string="Attendances"/>
+ </button>
</div>
<div class="oe_title">
<label for="employee_id" class="oe_edit_only"/>
@@ -365,7 +370,13 @@
<field name="inherit_id" ref="hr_timesheet.hr_timesheet_employee_extd_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
- <button name="%(act_hr_employee_2_hr_timesheet)d" string="Timesheets" type="action" groups="base.group_hr_manager"/>
+ <button name="%(act_hr_employee_2_hr_timesheet)d"
+ type="action"
+ class="oe_stat_button"
+ icon="fa-clock-o"
+ groups="base.group_hr_manager">
+ <field name="timesheet_count" widget="statinfo" string="Timesheets"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py
index e434090ad76..142d059e1f9 100644
--- a/addons/marketing_campaign/marketing_campaign.py
+++ b/addons/marketing_campaign/marketing_campaign.py
@@ -85,6 +85,15 @@ translate_selections = {
class marketing_campaign(osv.osv):
_name = "marketing.campaign"
_description = "Marketing Campaign"
+
+ def _count_segments(self, cr, uid, ids, field_name, arg, context=None):
+ res = {}
+ try:
+ for segments in self.browse(cr, uid, ids, context=context):
+ res[segments.id] = len(segments.segment_ids)
+ except:
+ pass
+ return res
_columns = {
'name': fields.char('Name', size=64, required=True),
@@ -121,6 +130,8 @@ Normal - the campaign runs normally and automatically sends all emails and repor
'activity_ids': fields.one2many('marketing.campaign.activity',
'campaign_id', 'Activities'),
'fixed_cost': fields.float('Fixed Cost', help="Fixed cost for running this campaign. You may also specify variable cost and revenue on each campaign activity. Cost and Revenue statistics are included in Campaign Reporting.", digits_compute=dp.get_precision('Product Price')),
+ 'segment_ids': fields.one2many('marketing.campaign.segment', 'campaign_id', 'Segments', readonly=False),
+ 'segments_count': fields.function(_count_segments, type='integer', string='Segments')
}
_defaults = {
diff --git a/addons/marketing_campaign/marketing_campaign_view.xml b/addons/marketing_campaign/marketing_campaign_view.xml
index 6503cc482ab..20c3a1bb6e7 100644
--- a/addons/marketing_campaign/marketing_campaign_view.xml
+++ b/addons/marketing_campaign/marketing_campaign_view.xml
@@ -64,12 +64,19 @@
<div class="oe_right oe_button_box" name="button_box">
<button type="action"
name="%(act_marketing_campaing_stat)d"
- string="Campaign Statistics"/>
+ class="oe_stat_button"
+ icon="fa-keyboard-o"
+ string="Statistics" help="Marketing Campaign Statistics"/>
<button type="action"
name="%(act_marketing_campaing_segment_opened)d"
- string="Segments"/>
+ class="oe_stat_button"
+ icon="fa-table">
+ <field name="segments_count" widget="statinfo" string="Segments"/>
+ </button>
<button type="action"
name="%(act_marketing_campaing_followup)d"
+ class="oe_stat_button"
+ icon="fa-thumbs-up"
string="Follow-Up"/>
</div>
<div class="oe_title">
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 91d50e93236..537e3f5bfda 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -1111,8 +1111,24 @@ class mrp_production_product_line(osv.osv):
class product_product(osv.osv):
_inherit = "product.product"
+ def _bom_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'bom_count': 0, 'mo_count': 0, 'bom_strct':0}), ids))
+ try:
+ for bom in self.browse(cr, uid, ids, context=context):
+ res[bom.id] = {
+ 'bom_count': len(bom.bom_ids),
+ 'mo_count': len(bom.mo_ids),
+ 'bom_strct':len(bom.bom_ids),
+ }
+ except:
+ pass
+ return res
_columns = {
'bom_ids': fields.one2many('mrp.bom', 'product_id', 'Bill of Materials'),
+ 'mo_ids': fields.one2many('mrp.production', 'product_id', 'Manufacturing Orders'),
+ 'bom_count': fields.function(_bom_count, string='# Bill of Material', type='integer', multi="bom_count"),
+ 'bom_strct': fields.function(_bom_count, string='# Bill of Material Structure', type='integer', multi="bom_count"),
+ 'mo_count': fields.function(_bom_count, string='# Manufacturing Orders', type='integer', multi="bom_count"),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 6073d02fcc0..eb42b970add 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -1040,9 +1040,18 @@
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button string="Bill of Materials" name="%(product_open_bom)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}"/>
- <button string="BoM Structure" name="%(act_product_mrp_bom_open)d" type="action" groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}"/>
- <button string="Manufacturing Orders" name="%(act_product_mrp_production)d" type="action" groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}"/>
+ <button class="oe_inline oe_stat_button" name="%(product_open_bom)d" type="action"
+ groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
+ <field string="Bill of Materials" name="bom_count" widget="statinfo" />
+ </button>
+ <button class="oe_inline oe_stat_button" name="%(act_product_mrp_bom_open)d" type="action"
+ groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
+ <field string="BoM Structure" name="bom_strct" widget="statinfo" />
+ </button>
+ <button class="oe_inline oe_stat_button" name="%(act_product_mrp_production)d" type="action"
+ groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
+ <field string="Manufacturing" name="mo_count" widget="statinfo" />
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml
index 7740020e37f..1d1bd73703f 100644
--- a/addons/point_of_sale/point_of_sale_view.xml
+++ b/addons/point_of_sale/point_of_sale_view.xml
@@ -843,8 +843,10 @@
</header>
<sheet>
<div class="oe_right oe_button_box">
- <button name="%(action_pos_box_in)d" string="Put Money In" type="action" states="opened,closing_control"/>
- <button name="%(action_pos_box_out)d" string="Take Money Out" type="action" states="opened,closing_control"/>
+ <button class="oe_stat_button" name="%(action_pos_box_in)d" string="Put Money"
+ type="action" states="opened,closing_control" icon="fa-level-down"/>
+ <button class="oe_stat_button" name="%(action_pos_box_out)d" string="Take Money"
+ type="action" states="opened,closing_control" icon="fa-level-up"/>
</div>
<h1 class="oe_title">
Session:
diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py
index 1e7076d9c8f..8e1a83ed65c 100644
--- a/addons/procurement/procurement.py
+++ b/addons/procurement/procurement.py
@@ -614,8 +614,17 @@ class product_template(osv.osv):
class product_product(osv.osv):
_inherit="product.product"
+ def _orderpoint_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for orderpoint in self.browse(cr, uid, ids, context=context):
+ res[orderpoint.id] = len(orderpoint.orderpoint_ids)
+ except:
+ pass
+ return res
_columns = {
'orderpoint_ids': fields.one2many('stock.warehouse.orderpoint', 'product_id', 'Minimum Stock Rules'),
+ 'orderpoint_count': fields.function(_orderpoint_count, string='# Orderpoints', type='integer'),
}
diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml
index faec656cf20..596ce2f0ba0 100644
--- a/addons/procurement/procurement_view.xml
+++ b/addons/procurement/procurement_view.xml
@@ -357,7 +357,10 @@
<button string="⇒ Request Procurement" name="%(act_make_procurement)d" type="action" class="oe_link"/>
</xpath>
<xpath expr="//div[@name='buttons']" position="inside">
- <button string="Orderpoints" name="%(product_open_orderpoint)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}"/>
+ <button class="oe_inline oe_stat_button" name="%(product_open_orderpoint)d" type="action"
+ attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-pinterest">
+ <field string="Orderpoints" name="orderpoint_count" widget="statinfo" />
+ </button>
</xpath>
<xpath expr="//field[@name='cost_method']" position="before">
<field name="procure_method" groups="base.group_user"
diff --git a/addons/project/project.py b/addons/project/project.py
index 5c6143148d4..e074d241cef 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -186,20 +186,11 @@ class project(osv.osv):
task_attachments = attachment.search(cr, uid, [('res_model', '=', 'project.task'), ('res_id', 'in', task_ids)], context=context, count=True)
res[id] = (project_attachments or 0) + (task_attachments or 0)
return res
-
def _task_count(self, cr, uid, ids, field_name, arg, context=None):
- """ :deprecated: this method will be removed with OpenERP v8. Use task_ids
- fields instead. """
- if context is None:
- context = {}
- res = dict.fromkeys(ids, 0)
- ctx = context.copy()
- ctx['active_test'] = False
- task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)], context=ctx)
- for task in self.pool.get('project.task').browse(cr, uid, task_ids, context):
- res[task.project_id.id] += 1
+ res={}
+ for tasks in self.browse(cr, uid, ids, context):
+ res[tasks.id] = len(tasks.task_ids)
return res
-
def _get_alias_models(self, cr, uid, context=None):
""" Overriden in project_issue to offer more options """
return [('project.task', "Tasks")]
@@ -265,8 +256,7 @@ class project(osv.osv):
}),
'resource_calendar_id': fields.many2one('resource.calendar', 'Working Time', help="Timetable working hours to adjust the gantt diagram report", states={'close':[('readonly',True)]} ),
'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}),
- 'task_count': fields.function(_task_count, type='integer', string="Open Tasks",
- deprecated="This field will be removed in OpenERP v8. Use task_ids one2many field instead."),
+ 'task_count': fields.function(_task_count, type='integer', string="Tasks",),
'task_ids': fields.one2many('project.task', 'project_id',
domain=[('stage_id.fold', '=', False)]),
'color': fields.integer('Color Index'),
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 3ee673a4d2f..f362a9266ed 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -93,21 +93,26 @@
</div>
</div>
<div class="oe_right oe_button_box" name="buttons" groups="base.group_user">
- <field name="tasks" widget="x2many_counter" string="Tasks" attrs="{'invisible':[('use_tasks','=', False)]}" options='{"views": [[false, "kanban"], [false, "tree"], [false, "form"], [false, "calendar"], [false, "gantt"], [false, "graph"]]}'/>
- <button name="attachment_tree_view" string="Documents" type="object"/>
+ <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_tasks','=', 0)]}"
+ name="%(act_project_project_2_project_task_all)d" icon="fa-tasks">
+ <field string="Task" name="task_count" widget="statinfo"/>
+ </button>
+ <button class="oe_inline oe_stat_button" name="attachment_tree_view" type="object" icon="fa-files-o">
+ <field string="Documents" name="doc_count" widget="statinfo"/>
+ </button>
</div>
<group>
- <group>
+ <group col="4">
<field name="user_id" string="Project Manager"
attrs="{'readonly':[('state','in',['close', 'cancelled'])]}"
context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'project.group_project_manager']}"/>
+ <newline/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
- <span></span>
+ </group>
<p attrs="{'invisible': [('analytic_account_id','=',False)]}">
To invoice or setup invoicing and renewal options, go to the related contract:
<field name="analytic_account_id" readonly="1" required="0" class="oe_inline" nolabel="1"/>.
</p>
- </group>
<group name="group_alias"
attrs="{'invisible': [('alias_domain', '=', False)]}">
<label for="alias_name" string="Email Alias"/>
diff --git a/addons/project/res_partner.py b/addons/project/res_partner.py
index e49cacf4f89..79af0413385 100644
--- a/addons/project/res_partner.py
+++ b/addons/project/res_partner.py
@@ -22,11 +22,20 @@
from openerp.osv import fields,osv
class res_partner(osv.osv):
-
+ def _task_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for partner in self.browse(cr, uid, ids, context):
+ res[partner.id] = len(partner.task_ids)
+ except:
+ pass
+ return res
+
""" Inherits partner and adds Tasks information in the partner form """
_inherit = 'res.partner'
_columns = {
'task_ids': fields.one2many('project.task', 'partner_id', 'Tasks'),
+ 'task_count': fields.function(_task_count, string='# Tasks', type='integer'),
}
def copy(self, cr, uid, record_id, default=None, context=None):
diff --git a/addons/project/res_partner_view.xml b/addons/project/res_partner_view.xml
index f12189b5163..a77ea467dcb 100644
--- a/addons/project/res_partner_view.xml
+++ b/addons/project/res_partner_view.xml
@@ -10,11 +10,13 @@
<field name="priority" eval="50"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button class="oe_inline" type="action"
- name="%(action_view_task)d"
- string="Tasks"
+ <button class="oe_inline oe_stat_button" type="action" name="%(action_view_task)d"
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}"
- groups="project.group_project_user" />
+ icon="fa-tasks" groups="project.group_project_user">
+ <field string="Tasks" name="task_count" widget="statinfo"/>
+ </button>
+
+
</xpath>
</field>
</record>
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index bfc65ca7d88..098826c0a06 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -229,7 +229,6 @@ class project_issue(osv.Model):
if work.task_id:
issues += issue_pool.search(cr, uid, [('task_id','=',work.task_id.id)])
return issues
-
_columns = {
'id': fields.integer('ID', readonly=True),
'name': fields.char('Issue', size=128, required=True),
@@ -491,21 +490,15 @@ class project(osv.Model):
return [('project.task', "Tasks"), ("project.issue", "Issues")]
def _issue_count(self, cr, uid, ids, field_name, arg, context=None):
- """ :deprecated: this method will be removed with OpenERP v8. Use issue_ids
- fields instead. """
- res = dict.fromkeys(ids, 0)
- issue_ids = self.pool.get('project.issue').search(cr, uid, [('project_id', 'in', ids)])
- for issue in self.pool.get('project.issue').browse(cr, uid, issue_ids, context):
- if issue.stage_id and not issue.stage_id.fold:
- res[issue.project_id.id] += 1
+ res={}
+ for issues in self.browse(cr, uid, ids, context):
+ res[issues.id] = len(issues.issue_ids)
return res
-
_columns = {
'project_escalation_id': fields.many2one('project.project', 'Project Escalation',
help='If any issue is escalated from the current Project, it will be listed under the project selected here.',
states={'close': [('readonly', True)], 'cancelled': [('readonly', True)]}),
- 'issue_count': fields.function(_issue_count, type='integer', string="Unclosed Issues",
- deprecated="This field will be removed in OpenERP v8. Use issue_ids one2many field instead."),
+ 'issue_count': fields.function(_issue_count, type='integer', string="Issues",),
'issue_ids': fields.one2many('project.issue', 'project_id',
domain=[('stage_id.fold', '=', False)])
}
@@ -575,5 +568,20 @@ class project_project(osv.Model):
self._check_create_write_values(cr, uid, vals, context=context)
return super(project_project, self).write(cr, uid, ids, vals, context=context)
-
+class res_partner(osv.osv):
+ def _issue_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for partner in self.browse(cr, uid, ids, context=context):
+ res[partner.id] = len(partner.issue_ids)
+ except:
+ pass
+ return res
+
+ """ Inherits partner and adds Issue information in the partner form """
+ _inherit = 'res.partner'
+ _columns = {
+ 'issue_ids': fields.one2many('project.issue', 'partner_id', 'Issues'),
+ 'issue_count': fields.function(_issue_count, string='# Issues', type='integer'),
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 3af9ee608d6..a312b8e78d8 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -306,7 +306,10 @@
<label for="use_issues"/>
</xpath>
<xpath expr='//div[@name="buttons"]' position='inside'>
- <button name="%(act_project_project_2_project_issue_all)d" string="Issues" type="action" attrs="{'invisible':[('use_issues','=', 0)]}"/>
+ <button class="oe_inline oe_stat_button" type="action" attrs="{'invisible':[('use_issues','=', 0)]}"
+ name="%(act_project_project_2_project_issue_all)d" icon="fa-bug">
+ <field string="Issues" name="issue_count" widget="statinfo"/>
+ </button>
</xpath>
<xpath expr='//page[@name="project_stages"]' position="attributes">
<attribute name="attrs">{'invisible': [('use_tasks', '=', False),('use_issues','=',False)]}</attribute>
@@ -375,11 +378,14 @@
<field name="priority" eval="50"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button class="oe_inline" type="action" string="Issues"
- attrs="{'invisible': [('customer', '=', False)]}"
- name="%(action_view_issues)d"
+ <button class="oe_inline oe_stat_button" type="action" name="%(action_view_issues)d"
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}"
- groups="project.group_project_user"/>
+ attrs="{'invisible': [('customer', '=', False)]}"
+ icon="fa-bug" groups="project.group_project_user">
+ <field string="Issues" name="issue_count" widget="statinfo"/>
+ </button>
+
+
</xpath>
</field>
</record>
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index 29e94591094..3bb78892994 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -98,7 +98,14 @@ class project_phase(osv.osv):
else:
res[phase.id] = round(100.0 * done / tot, 2)
return res
-
+ def _tasks_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for task in self.browse(cr, uid, ids, context=context):
+ res[task.id] = len(task.task_ids)
+ except:
+ pass
+ return res
_columns = {
'name': fields.char("Name", size=64, required=True),
'date_start': fields.datetime('Start Date', select=True, help="It's computed by the scheduler according the project date or the end date of the previous phase.", states={'done':[('readonly',True)], 'cancelled':[('readonly',True)]}),
@@ -119,6 +126,7 @@ class project_phase(osv.osv):
help='If the phase is created the status \'Draft\'.\n If the phase is started, the status becomes \'In Progress\'.\n If review is needed the phase is in \'Pending\' status.\
\n If the phase is over, the status is set to \'Done\'.'),
'progress': fields.function(_compute_progress, string='Progress', help="Computed based on related tasks"),
+ 'tasks_count': fields.function(_tasks_count, string='# Related Tasks', type='integer'),
}
_defaults = {
'state': 'draft',
diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml
index 36fb83000ce..4af0a7aed0a 100644
--- a/addons/project_long_term/project_long_term_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -102,9 +102,10 @@
<label for="use_phases"/>
</xpath>
<xpath expr="//div[@name='buttons']" position='inside'>
- <button name="%(act_project_phases)d"
- string="Phases" type="action"
- attrs="{'invisible':[('use_phases','=', 0)]}"/>
+ <button class="oe_inline oe_stat_button" type="action"
+ attrs="{'invisible':[('use_phases','=', 0)]}" name="%(act_project_phases)d" icon="fa-qrcode">
+ <field string="Phases" name="phase_count" widget="statinfo"/>
+ </button>
</xpath>
</field>
</record>
@@ -151,7 +152,11 @@
<field name="state" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}'/>
</header>
<sheet>
- <button name="%(project_phase_task_list)d" string="Related Tasks" type="action" class="oe_right"/>
+ <div class="oe_button_box oe_right">
+ <button class=" oe_inline oe_stat_button " name= "%(project_phase_task_list)d" type="action" icon="fa-tasks">
+ <field string="Tasks" name="tasks_count" widget="statinfo"/>
+ </button>
+ </div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml
index 548264eb07b..a51c7976602 100644
--- a/addons/project_timesheet/project_timesheet_view.xml
+++ b/addons/project_timesheet/project_timesheet_view.xml
@@ -30,7 +30,10 @@
<label for="use_timesheets"/>
</xpath>
<xpath expr='//div[@name="buttons"]' position="inside">
- <button name="open_timesheets" string="Timesheets" type="object" attrs="{'invisible':[('use_timesheets','=', 0)]}"/>
+ <button class="oe_inline oe_stat_button" name="open_timesheets" type="object" attrs="{'invisible':[('use_timesheets','=', 0)]}"
+ icon="fa-calendar" widget="statinfo">
+ <field name="hours_quantity" string="Timesheets" widget="statinfo"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/purchase/partner.py b/addons/purchase/partner.py
index d8cda9b20b9..b7757c2f91f 100644
--- a/addons/purchase/partner.py
+++ b/addons/purchase/partner.py
@@ -26,15 +26,14 @@ class res_partner(osv.osv):
_inherit = 'res.partner'
def _purchase_order_count(self, cr, uid, ids, field_name, arg, context=None):
- res = dict(map(lambda x: (x,0), ids))
- # this user may not have access to user rights
- try:
- for partner in self.browse(cr, uid, ids, context=context):
- res[partner.id] = len(partner.purchase_order_ids)
- except:
- pass
+ res = dict(map(lambda x: (x,{'purchase_order_count': 0, 'supplier_invoice_count': 0}), ids))
+ invoice_ids = self.pool.get('account.invoice').search(cr,uid, [('type', '=', 'in_invoice'), ('partner_id', '=', ids[0])])
+ for partner in self.browse(cr, uid, ids, context=context):
+ res[partner.id] = {
+ 'purchase_order_count': len(partner.purchase_order_ids),
+ 'supplier_invoice_count': len(invoice_ids),
+ }
return res
-
def copy(self, cr, uid, id, default=None, context=None):
if default is None:
default = {}
@@ -53,8 +52,10 @@ class res_partner(osv.osv):
domain=[('type','=','purchase')],
string="Purchase Pricelist",
help="This pricelist will be used, instead of the default one, for purchases from the current partner"),
- 'purchase_order_count': fields.function(_purchase_order_count, string='# of Purchase Order', type='integer'),
- 'purchase_order_ids': fields.one2many('purchase.order','partner_id','Purchase Order')
+ 'purchase_order_count': fields.function(_purchase_order_count, string='# of Purchase Order', type='integer', multi="count"),
+ 'purchase_order_ids': fields.one2many('purchase.order','partner_id','Purchase Order'),
+ 'invoice_ids': fields.one2many('account.invoice','partner_id','Supplier Invoices'),
+ 'supplier_invoice_count': fields.function(_purchase_order_count, string='# Supplier Invoices', type='integer', multi="count"),
}
diff --git a/addons/purchase/partner_view.xml b/addons/purchase/partner_view.xml
index 25aeb3d8119..6d1916f9cc3 100644
--- a/addons/purchase/partner_view.xml
+++ b/addons/purchase/partner_view.xml
@@ -74,13 +74,15 @@
<field name="priority" eval="20"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button name="%(purchase.act_res_partner_2_purchase_order)d" type="action"
- string="Purchase Orders"
+ <button class="oe_inline oe_stat_button" name="%(purchase.act_res_partner_2_purchase_order)d" type="action"
attrs="{'invisible': [('supplier', '=', False)]}"
- groups="purchase.group_purchase_user"/>
- <button name="%(purchase.act_res_partner_2_supplier_invoices)d" type="action"
- attrs="{'invisible': [('supplier', '=', False)]}"
- string="Supplier Invoices"/>
+ groups="purchase.group_purchase_user" icon="fa-shopping-cart">
+ <field string="Purchases" name="purchase_order_count" widget="statinfo"/>
+ </button>
+ <button class="oe_inline oe_stat_button" name="%(purchase.act_res_partner_2_supplier_invoices)d" type="action"
+ attrs="{'invisible': [('supplier', '=', False)]}" icon="fa-pencil-square-o" help="Supplier Invoices">
+ <field string="Pay Invoices" name="supplier_invoice_count" widget="statinfo"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index ed131670737..a27dfce1985 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -150,6 +150,17 @@ class purchase_order(osv.osv):
limit=1)
return res and res[0] or False
+ def _count_all(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,{'shipment_count': 0, 'invoice_count': 0,}), ids))
+ try:
+ for data in self.browse(cr, uid, ids, context=context):
+ res[data.id] = {'shipment_count': len(data.picking_ids),
+ 'invoice_count': len(data.invoice_ids),
+ }
+ except:
+ pass
+ return res
+
STATE_SELECTION = [
('draft', 'Draft PO'),
('sent', 'RFQ Sent'),
@@ -226,6 +237,8 @@ class purchase_order(osv.osv):
'create_uid': fields.many2one('res.users', 'Responsible'),
'company_id': fields.many2one('res.company','Company',required=True,select=1, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)]}),
'journal_id': fields.many2one('account.journal', 'Journal'),
+ 'shipment_count': fields.function(_count_all, type='integer', string='Incoming Shipments', multi=True),
+ 'invoice_count': fields.function(_count_all, type='integer', string='Invoices', multi=True)
}
_defaults = {
'date_order': fields.date.context_today,
@@ -1257,8 +1270,19 @@ class mail_mail(osv.Model):
class product_template(osv.Model):
_name = 'product.template'
_inherit = 'product.template'
+
+ def _purchase_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for purchase in self.browse(cr, uid, ids, context=context):
+ res[purchase.id] = len(purchase.purchase_ids)
+ except:
+ pass
+ return res
_columns = {
'purchase_ok': fields.boolean('Can be Purchased', help="Specify if the product can be selected in a purchase order line."),
+ 'purchase_ids': fields.one2many('purchase.order', 'product_id', 'Purchases'),
+ 'purchase_count': fields.function(_purchase_count, string='# Purchases', type='integer'),
}
_defaults = {
'purchase_ok': 1,
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 209bad47495..1b603092028 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -631,7 +631,10 @@
<field name="inherit_id" ref="account.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button string="Purchases" name="%(action_purchase_line_product_tree)d" type="action" groups="purchase.group_purchase_user"/>
+ <button class="oe_inline oe_stat_button" name="%(action_purchase_line_product_tree)d" type="action"
+ groups="purchase.group_purchase_user" icon="fa-shopping-cart">
+ <field string="Purchases" name="purchase_count" widget="statinfo" />
+ </button>
</xpath>
<field name="property_account_expense" position="replace" >
<field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" groups="account.group_account_user"/>
diff --git a/addons/purchase/stock_view.xml b/addons/purchase/stock_view.xml
index 0ba48a63512..33972c90fb6 100644
--- a/addons/purchase/stock_view.xml
+++ b/addons/purchase/stock_view.xml
@@ -47,9 +47,17 @@
<div class="oe_right oe_button_box" name="buttons">
<button type="object"
name="view_picking"
- string="Incoming Shipments" states="approved"/>
+ class="oe_stat_button"
+ icon="fa-truck"
+ states="approved">
+ <field name="shipment_count" widget="statinfo" string="In Shipments" help="Incoming Shipments"/>
+ </button>
<button type="object" name="invoice_open"
- string="Invoices" attrs="{'invisible': [('state', 'in', ['draft','sent'])]}"/>
+ class="oe_stat_button"
+ icon="fa-pencil-square-o"
+ attrs="{'invisible': [('state', 'in', ['draft','sent'])]}">
+ <field name="invoice_count" widget="statinfo" string="Invoices"/>
+ </button>
</div>
</xpath>
</field>
diff --git a/addons/sale/res_partner_view.xml b/addons/sale/res_partner_view.xml
index 5107f0c17af..e689cac1476 100644
--- a/addons/sale/res_partner_view.xml
+++ b/addons/sale/res_partner_view.xml
@@ -48,10 +48,11 @@
<field name="priority" eval="20"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button name="%(sale.act_res_partner_2_sale_order)d" type="action"
- string="Quotations and Sales"
+ <button class="oe_inline oe_stat_button" type="action" name="%(sale.act_res_partner_2_sale_order)d"
attrs="{'invisible': [('customer', '=', False)]}"
- groups="base.group_sale_salesman"/>
+ icon="fa-strikethrough" groups="base.group_sale_salesman">
+ <field string="Sales" name="sale_order_count" widget="statinfo"/>
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 48b09ec7493..20a806f4d7f 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -1024,4 +1024,18 @@ class account_invoice(osv.Model):
workflow.trg_validate(uid, 'account.invoice', id, 'invoice_cancel', cr)
return super(account_invoice, self).unlink(cr, uid, ids, context=context)
+class product_product(osv.Model):
+ _inherit = 'product.product'
+ def _sales_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for sale in self.browse(cr, uid, ids, context=context):
+ res[sale.id] = len(sale.sales_ids)
+ except:
+ pass
+ return res
+ _columns = {
+ 'sales_ids': fields.one2many('sale.order.line', 'product_id', 'Sales '),
+ 'sales_count': fields.function(_sales_count, string='# Sales', type='integer'),
+ }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index c9ffb94b985..7ea9d441c5c 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -499,7 +499,10 @@
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button string="Sales" name="%(action_order_line_product_tree)d" type="action" groups="base.group_sale_salesman"/>
+ <button class="oe_inline oe_stat_button" name="%(action_order_line_product_tree)d"
+ type="action" groups="base.group_sale_salesman" icon="fa-strikethrough">
+ <field string="Sales" name="sales_count" widget="statinfo" />
+ </button>
</xpath>
</field>
</record>
diff --git a/addons/stock/product.py b/addons/stock/product.py
index 3eddf0a1c72..863b7111bb0 100644
--- a/addons/stock/product.py
+++ b/addons/stock/product.py
@@ -352,7 +352,14 @@ class product_product(osv.osv):
for id in ids:
res[id][f] = stock.get(id, 0.0)
return res
-
+ def _move_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = dict(map(lambda x: (x,0), ids))
+ try:
+ for move in self.browse(cr, uid, ids, context=context):
+ res[move.id] = len(move.move_ids)
+ except:
+ pass
+ return res
_columns = {
'reception_count': fields.function(_stock_move_count, string="Reception", type='integer', multi='pickings'),
'delivery_count': fields.function(_stock_move_count, string="Delivery", type='integer', multi='pickings'),
@@ -413,6 +420,8 @@ class product_product(osv.osv):
help="If real-time valuation is enabled for a product, the system will automatically write journal entries corresponding to stock moves." \
"The inventory variation account set on the product category will represent the current inventory value, and the stock input and stock output account will hold the counterpart moves for incoming and outgoing products."
, required=True),
+ 'move_ids': fields.one2many('stock.move', 'product_id', 'Moves'),
+ 'move_count': fields.function(_move_count, string='# Moves', type='integer'),
}
_defaults = {
diff --git a/addons/stock/product_view.xml b/addons/stock/product_view.xml
index 11f970d6ddb..a3fa9224bbe 100644
--- a/addons/stock/product_view.xml
+++ b/addons/stock/product_view.xml
@@ -73,8 +73,14 @@
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='buttons']" position="inside">
- <button string="Inventory" name="%(action_product_location_tree)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_locations"/>
- <button string="Moves" name= "%(act_product_stock_move_open)d" type="action" attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_stock_user"/>
+ <button class="oe_inline oe_stat_button"
+ name="%(action_product_location_tree)d" type="action"
+ attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_locations" icon="fa-files-o" string="Inventory" />
+ <button class="oe_inline oe_stat_button" name= "%(act_product_stock_move_open)d" type="action"
+ attrs="{'invisible':[('type', '=', 'service')]}" groups="stock.group_stock_user" icon="fa-exchange">
+ <field string="Moves" name="move_count" widget="statinfo"/>
+ </button>
+
</xpath>
<group name="procurement_uom" position="before">
<group name="delay" string="Delays">
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index 7e73d7fcd53..bd0254a81d3 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -636,7 +636,11 @@ class stock_picking(osv.osv):
vals['name'] = self.pool.get('ir.sequence').get(cr, user, seq_obj_name)
new_id = super(stock_picking, self).create(cr, user, vals, context)
return new_id
-
+ def _claim_count(self, cr, uid, ids, field_name, arg, context=None):
+ res = {}
+ claim = self.pool.get('crm.claim').search(cr, uid, [('ref', '=',('stock.picking.out,' + str(ids[0])))], context=context)
+ res[ids[0]] = len(claim)
+ return res
_columns = {
'name': fields.char('Reference', size=64, select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
'origin': fields.char('Source Document', size=64, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="Reference of the document", select=True),
@@ -680,6 +684,7 @@ class stock_picking(osv.osv):
("none", "Not Applicable")], "Invoice Control",
select=True, required=True, readonly=True, track_visibility='onchange', states={'draft': [('readonly', False)]}),
'company_id': fields.many2one('res.company', 'Company', required=True, select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'claim_count': fields.function(_claim_count, string='Claims', type='integer'),
}
_defaults = {
'name': lambda self, cr, uid, context: '/',
@@ -3122,7 +3127,9 @@ class stock_picking_out(osv.osv):
out_defaults = super(stock_picking_out, self).default_get(cr, uid, fields_list, context=context)
defaults.update(out_defaults)
return defaults
-
+ def _claim_count(self, cr, uid, ids, field_name, arg, context=None):
+ return super(stock_picking_out, self)._claim_count(cr, uid, ids, field_name, arg, context=context)
+
_columns = {
'backorder_id': fields.many2one('stock.picking.out', 'Back Order of', states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}, help="If this shipment was split, then this field links to the shipment which contains the already processed part.", select=True),
'state': fields.selection(
@@ -3139,6 +3146,7 @@ class stock_picking_out(osv.osv):
* Ready to Deliver: products reserved, simply waiting for confirmation.\n
* Delivered: has been processed, can't be modified or cancelled anymore\n
* Cancelled: has been cancelled, can't be confirmed anymore"""),
+ 'claim_count': fields.function(_claim_count, string='Claims', type='integer'),
}
_defaults = {
'type': 'out',
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index e96652c11aa..b9518cc03c3 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -239,12 +239,23 @@
<field name="date"/>
<field name="active"/>
</group>
- <group groups="stock.group_tracking_lot" string="Traceability">
- <button name="action_traceability" string="Upstream Traceability" type="object"
- colspan="2"/>
- <button name="action_traceability" string="Downstream Traceability" type="object"
- context="{'type': 'move_history_ids'}" colspan="2"/>
- </group>
+ <group class="oe_right" groups="stock.group_tracking_lot" string="Traceability">
+ <div class="oe_right oe_button_box">
+ <button name="action_traceability"
+ string="Upstream"
+ help="Upstream Traceability"
+ class="oe_stat_button"
+ icon="fa-arrow-up"
+ type="object" colspan="2"/>
+ <button name="action_traceability"
+ string="Downstream"
+ help="Downstream Traceability"
+ class="oe_stat_button"
+ icon="fa-arrow-down"
+ type="object"
+ context="{'type': 'move_history_ids'}" colspan="2"/>
+ </div>
+ </group>
</group>
<field name="move_ids"/>
</form>
@@ -344,8 +355,16 @@
<field name="arch" type="xml">
<form string="Serial Number" version="7.0">
<div class="oe_button_box oe_right">
- <button name="action_traceability" string="Upstream Traceability" type="object" context="{'type': 'move_history_ids2', 'field': 'prodlot_id'}"/>
- <button name="action_traceability" string="Downstream Traceability" type="object" context="{'type': 'move_history_ids', 'field': 'prodlot_id'}"/>
+ <button name="action_traceability"
+ string="Upstream" class="oe_stat_button"
+ help="Upstream Traceability"
+ icon="fa-arrow-up" type="object"
+ context="{'type': 'move_history_ids2', 'field': 'prodlot_id'}"/>
+ <button name="action_traceability"
+ string="Downstream" class="oe_stat_button"
+ icon="fa-arrow-down" type="object"
+ help="Downstream Traceability"
+ context="{'type': 'move_history_ids', 'field': 'prodlot_id'}"/>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml
index 2c43364871d..ba906cc4377 100644
--- a/addons/survey/survey_view.xml
+++ b/addons/survey/survey_view.xml
@@ -28,11 +28,16 @@
</header>
<sheet>
<div class="oe_button_box oe_right">
- <button name="test_survey" states="open,draft,close,cancel" string="Test Survey" type="object" icon="gtk-new" context="{'survey_id': active_id}" attrs="{'invisible':[('id','=',0)]}"/>
- <button name="fill_survey" states="open" string="Answer Survey" type="object" icon="gtk-execute" context="{'survey_id': active_id}" attrs="{'invisible':[('state','!=','open')]}"/>
- <button name="action_print_survey" states="open,draft,close,cancel" string="Print Answer" type="object"/>
- <button name="edit_survey" states="open,draft,close,cancel"
- string="Edit Survey" type="object" context="{'active':True,'edit' : True,'survey_id': active_id}"/>
+ <button class="oe_inline oe_stat_button" name="test_survey" states="open,draft,close,cancel"
+ string="Test Survey" type="object" icon="fa-file-o" context="{'survey_id': active_id}"
+ attrs="{'invisible':[('id','=',0)]}"/>
+ <button class="oe_inline oe_stat_button" name="fill_survey" states="open" string="Reply Survey"
+ type="object" icon="fa-star-half-o" context="{'survey_id': active_id}"
+ attrs="{'invisible':[('state','!=','open')]}"/>
+ <button class="oe_inline oe_stat_button" name="action_print_survey" states="open,draft,close,cancel"
+ string="Print Answer" type="object" icon="fa-print"/>
+ <button class="oe_inline oe_stat_button" name="edit_survey" states="open,draft,close,cancel"
+ string="Edit Survey" type="object" context="{'active':True,'edit' : True,'survey_id': active_id}" icon="fa-cog"/>
</div>
<div class="oe_title">
diff --git a/addons/website_event_track/views/event_backend.xml b/addons/website_event_track/views/event_backend.xml
index c028b8b47d4..3e77909d308 100644
--- a/addons/website_event_track/views/event_backend.xml
+++ b/addons/website_event_track/views/event_backend.xml
@@ -160,7 +160,12 @@
<field name="model">event.event</field>
<field name="arch" type="xml">
<xpath expr="//div[@class='oe_right oe_button_box']" position="inside">
- <button name="%(website_event_track.act_event_list_tracks)d" type="action" string="Tracks"/>
+ <button name="%(website_event_track.act_event_list_tracks)d"
+ type="action"
+ class="oe_stat_button oe_inline"
+ icon="fa-inbox">
+ <field name="count_tracks" widget="statinfo"/>
+ </button>
</xpath>
<xpath expr="//field[@name='organizer_id']" position="after">
<field name="timezone_of_event" />