[MERGE] from trunk-salesteams-chm
bzr revid: chm@openerp.com-20130128154423-xlq04czqoy2k7jo1
This commit is contained in:
commit
1e9cf860ae
|
@ -80,6 +80,8 @@ Dashboard for CRM will include:
|
|||
'crm_lead_view.xml',
|
||||
'crm_lead_menu.xml',
|
||||
|
||||
'crm_salesteams.xml',
|
||||
|
||||
'crm_meeting_menu.xml',
|
||||
|
||||
'crm_phonecall_view.xml',
|
||||
|
@ -113,6 +115,7 @@ Dashboard for CRM will include:
|
|||
'test/ui/duplicate_lead.yml',
|
||||
'test/ui/delete_lead.yml',
|
||||
],
|
||||
'css': ['static/src/css/crm.css'],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
'auto_install': False,
|
||||
|
|
|
@ -109,6 +109,20 @@ class crm_case_section(osv.osv):
|
|||
def get_full_name(self, cr, uid, ids, field_name, arg, context=None):
|
||||
return dict(self.name_get(cr, uid, ids, context=context))
|
||||
|
||||
def get_number_leads(self, cr, uid, section_ids, field_name, arg, context=None):
|
||||
res = dict.fromkeys(section_ids, 0)
|
||||
lead_obj = self.pool.get('crm.lead')
|
||||
for section_id in section_ids:
|
||||
res[section_id] = lead_obj.search(cr, uid, [("section_id", "=", section_id), '|', '|', ("type", "=", "lead"), ("type", "=", "both"), ("type", "=", False), ('state', 'not in', ['done', 'cancel'])], count=True, context=context)
|
||||
return res
|
||||
|
||||
def get_number_opportunities(self, cr, uid, section_ids, field_name, arg, context=None):
|
||||
res = dict.fromkeys(section_ids, 0)
|
||||
lead_obj = self.pool.get('crm.lead')
|
||||
for section_id in section_ids:
|
||||
res[section_id] = lead_obj.search(cr, uid, [("section_id", "=", section_id), '|', ("type", "=", "opportunity"), ("type", "=", "both"), ('state', 'not in', ['done', 'cancel'])], context=context, count=True)
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Sales Team', size=64, required=True, translate=True),
|
||||
'complete_name': fields.function(get_full_name, type='char', size=256, readonly=True, store=True),
|
||||
|
@ -128,6 +142,8 @@ class crm_case_section(osv.osv):
|
|||
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True,
|
||||
help="The email address associated with this team. New emails received will automatically "
|
||||
"create new leads assigned to the team."),
|
||||
'number_lead': fields.function(get_number_leads, type='integer', readonly=True),
|
||||
'number_opportunity': fields.function(get_number_opportunities, type='integer', readonly=True),
|
||||
}
|
||||
|
||||
def _get_stage_common(self, cr, uid, context):
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
</record>
|
||||
<record model="crm.case.stage" id="stage_lead6">
|
||||
<field name="name">Won</field>
|
||||
<field eval="True" name="fold"/>
|
||||
<field eval="1" name="case_default"/>
|
||||
<field name="state">done</field>
|
||||
<field eval="'100'" name="probability"/>
|
||||
|
|
|
@ -0,0 +1,151 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- CRM lead search by Salesteams -->
|
||||
|
||||
<record model="ir.actions.act_window" id="crm_case_form_view_salesteams_lead">
|
||||
<field name="name">Leads</field>
|
||||
<field name="res_model">crm.lead</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field>
|
||||
<field name="context">{
|
||||
'search_default_section_id': [active_id],
|
||||
'default_section_id': active_id,
|
||||
'search_default_new': True,
|
||||
'search_default_open': True
|
||||
}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new lead.
|
||||
</p><p>
|
||||
Use leads if you need a qualification step before creating an
|
||||
opportunity or a customer. It can be a business card you received,
|
||||
a contact form filled in your website, or a file of unqualified
|
||||
prospects you import, etc.
|
||||
</p><p>
|
||||
Once qualified, the lead can be converted into a business
|
||||
opportunity and/or a new customer in your address book.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- CRM opportunity search by Salesteams -->
|
||||
|
||||
<record model="ir.actions.act_window" id="crm_case_form_view_salesteams_opportunity">
|
||||
<field name="name">Leads</field>
|
||||
<field name="res_model">crm.lead</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="domain">[('type','=','opportunity')]</field>
|
||||
<field name="view_id" ref="crm.crm_case_kanban_view_leads"/>
|
||||
<field name="context">{
|
||||
'search_default_section_id': [active_id],
|
||||
'default_section_id': active_id,
|
||||
'search_default_new': True,
|
||||
'search_default_open': True
|
||||
}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new lead.
|
||||
</p><p>
|
||||
Use leads if you need a qualification step before creating an
|
||||
opportunity or a customer. It can be a business card you received,
|
||||
a contact form filled in your website, or a file of unqualified
|
||||
prospects you import, etc.
|
||||
</p><p>
|
||||
Once qualified, the lead can be converted into a business
|
||||
opportunity and/or a new customer in your address book.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Case Sections Salesteams kanban view -->
|
||||
|
||||
<record model="ir.ui.view" id="crm_case_section_salesteams_view_kanban">
|
||||
<field name="name">crm.case.section.kanban</field>
|
||||
<field name="model">crm.case.section</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban version="7.0">
|
||||
<field name="name"/>
|
||||
<field name="user_id"/>
|
||||
<field name="member_ids"/>
|
||||
<field name="note"/>
|
||||
<field name="alias_id"/>
|
||||
<field name="number_lead"/>
|
||||
<field name="number_opportunity"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div t-attf-class="oe_kanban_card oe_kanban_project oe_kanban_global_click oe_kanban_crm_salesteams" style="width:200px;">
|
||||
<div class="oe_dropdown_toggle oe_dropdown_kanban" groups="base.group_user">
|
||||
<span class="oe_e">í</span>
|
||||
<ul class="oe_dropdown_menu">
|
||||
<t t-if="widget.view.is_action_enabled('edit')"><li><a type="edit">Project Settings</a></li></t>
|
||||
<t t-if="widget.view.is_action_enabled('delete')"><li><a type="delete">Delete</a></li></t>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="oe_kanban_content">
|
||||
<h4>
|
||||
<field name="name"/>
|
||||
<div class="oe_kanban_crm_salesteams_leader">
|
||||
<small>
|
||||
<t t-if="record.user_id.raw_value">(<field name="user_id"/>)</t>
|
||||
<t t-if="!record.user_id.raw_value"><br/></t>
|
||||
</small>
|
||||
</div>
|
||||
</h4>
|
||||
<div class="oe_kanban_crm_salesteams_list">
|
||||
<a name="%(crm_case_form_view_salesteams_lead)d" type="action">
|
||||
<field name="number_lead"/>
|
||||
<t t-if="record.number_lead.raw_value > 1">Leads</t>
|
||||
<t t-if="record.number_lead.raw_value <= 1">Lead</t>
|
||||
</a><br/>
|
||||
<a name="%(crm_case_form_view_salesteams_opportunity)d" type="action">
|
||||
<field name="number_opportunity"/>
|
||||
<t t-if="record.number_opportunity.raw_value > 1">Opportunities</t>
|
||||
<t t-if="record.number_opportunity.raw_value <= 1">Opportunity</t>
|
||||
</a>
|
||||
</div>
|
||||
<div class="oe_kanban_crm_salesteams_avatars">
|
||||
<t t-foreach="record.member_ids.raw_value.slice(0,11)" t-as="member">
|
||||
<img t-att-src="kanban_image('res.users', 'image_small', member)" t-att-data-member_id="member"/>
|
||||
</t>
|
||||
</div>
|
||||
<br/>
|
||||
<small style="position: absolute; bottom: 5px;">
|
||||
<field name="alias_id"/>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Case Sections Action -->
|
||||
|
||||
<record id="crm_case_section_salesteams_act" model="ir.actions.act_window">
|
||||
<field name="name">Sales Teams</field>
|
||||
<field name="res_model">crm.case.section</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">kanban,tree,form</field>
|
||||
<field name="view_id" ref="crm_case_section_salesteams_view_kanban"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to define a new sales team.
|
||||
</p><p>
|
||||
Use sales team to organize your different salespersons or
|
||||
departments into separate teams. Each team will work in
|
||||
its own list of opportunities.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem
|
||||
action="crm_case_section_salesteams_act"
|
||||
id="crm.menu_crm_case_section_act"
|
||||
sequence="1"
|
||||
parent="base.menu_sales"
|
||||
groups="base.group_sale_manager,base.group_sale_salesman"/>
|
||||
</data>
|
||||
</openerp>
|
|
@ -77,56 +77,58 @@
|
|||
<field name="model">crm.case.section</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Sales Team" version="7.0">
|
||||
<group>
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="name" colspan="2"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="code"/>
|
||||
</group>
|
||||
|
||||
<group>
|
||||
<field name="user_id"/>
|
||||
<field name="resource_calendar_id"/>
|
||||
<field name="active"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Sales Team">
|
||||
<group>
|
||||
<field name="alias_id" invisible="1" required="0"/>
|
||||
<label for="alias_name" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
|
||||
<div attrs="{'invisible': [('alias_domain', '=', False)]}">
|
||||
<field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="change_responsible"/>
|
||||
<group>
|
||||
<field name="name" colspan="2"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="code"/>
|
||||
</group>
|
||||
<separator string="Team Members"/>
|
||||
<field name="member_ids" widget="many2many_kanban">
|
||||
<kanban quick_create="false" create="true">
|
||||
<field name="name"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div style="position: relative">
|
||||
<a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
|
||||
<div class="oe_module_vignette">
|
||||
<div class="oe_module_desc">
|
||||
<field name="name"/>
|
||||
|
||||
<group>
|
||||
<field name="user_id"/>
|
||||
<field name="resource_calendar_id"/>
|
||||
<field name="active"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Sales Team">
|
||||
<group>
|
||||
<field name="alias_id" invisible="1" required="0"/>
|
||||
<label for="alias_name" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
|
||||
<div attrs="{'invisible': [('alias_domain', '=', False)]}">
|
||||
<field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
|
||||
</div>
|
||||
<field name="change_responsible"/>
|
||||
</group>
|
||||
<separator string="Team Members"/>
|
||||
<field name="member_ids" widget="many2many_kanban">
|
||||
<kanban quick_create="false" create="true">
|
||||
<field name="name"/>
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div style="position: relative">
|
||||
<a t-if="! read_only_mode" type="delete" style="position: absolute; right: 0; padding: 4px; diplay: inline-block">X</a>
|
||||
<div class="oe_module_vignette">
|
||||
<div class="oe_module_desc">
|
||||
<field name="name"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Stages">
|
||||
<separator string="Select Stages for this Sales Team"/>
|
||||
<field name="stage_ids"/>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<field name="note"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Stages">
|
||||
<separator string="Select Stages for this Sales Team"/>
|
||||
<field name="stage_ids"/>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<field name="note"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
<field name="message_follower_ids" widget="mail_followers" help="Follow this salesteam to automatically track the events associated to users of this team."/>
|
||||
<field name="message_ids" widget="mail_thread"/>
|
||||
|
|
|
@ -36,4 +36,4 @@ access_res_partner_bank_type_crm_user,res.partner.bank.type.crm.user,base.model_
|
|||
access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.group_partner_manager,1,0,0,0
|
||||
access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1
|
||||
access_crm_payment_mode_user,crm.payment.mode,model_crm_payment_mode,base.group_sale_salesman,1,0,0,0
|
||||
access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1
|
||||
access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1
|
|
|
@ -0,0 +1,22 @@
|
|||
.oe_kanban_crm_salesteams {
|
||||
width: 220px;
|
||||
min-height: 160px;
|
||||
}
|
||||
.oe_kanban_crm_salesteams_avatars {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.oe_kanban_crm_salesteams_avatars img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
padding-left: 0px;
|
||||
margin-top: 3px;
|
||||
-moz-border-radius: 2px;
|
||||
-webkit-border-radius: 2px;
|
||||
border-radius: 2px;
|
||||
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
|
|
@ -4,7 +4,7 @@ mail.message
|
|||
============
|
||||
|
||||
Models
|
||||
+++++++
|
||||
++++++
|
||||
|
||||
``mail.message`` is a class for holding the main attributes of a message object
|
||||
(notification for system message, reciving email message or sent messages). It
|
||||
|
@ -19,7 +19,8 @@ should inherit from this class.
|
|||
.. versionchanged:: 7.0
|
||||
|
||||
ClientAction (ir.actions.client)
|
||||
+++++++
|
||||
++++++++++++++++++++++++++++++++
|
||||
|
||||
<record id="action_mail_inbox_feeds" model="ir.actions.client">
|
||||
<field name="name">Inbox</field>
|
||||
<field name="tag">mail.wall</field>
|
||||
|
@ -56,7 +57,7 @@ ClientAction (ir.actions.client)
|
|||
- ``readonly`` : Read only mode, hide all action buttons and composer
|
||||
|
||||
Fields
|
||||
+++++++
|
||||
++++++
|
||||
|
||||
- ``type`` : usually 'email', 'comment', 'notification'.
|
||||
Message type: email for external email message recieve, notification for system
|
||||
|
@ -64,7 +65,7 @@ Fields
|
|||
- ``subtype_id`` :
|
||||
Subtype of the notification for system message. The users can followe a document
|
||||
and choose the subtype of this document (eg: Create, Comment, Done).
|
||||
You can defined new subtypes and choose his name, by agreement the id begin by "mt_" on the model
|
||||
You can defined new subtypes and choose his name, by agreement the id begin by "mt\_" on the model
|
||||
"mail.message.subtype".
|
||||
- ``partner_ids`` :
|
||||
List of recipients, the recipients have this message in their personal mailboxe.
|
||||
|
@ -104,4 +105,4 @@ Methods
|
|||
sort by id. The messages that the user can read but not in his search, are group in
|
||||
expandable messages. The expandable messages contain the domain to expand.
|
||||
- ``check_access_rule`` :
|
||||
Overwrite the initial message for this model.
|
||||
Overwrite the initial message for this model.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
.. _mail_state:
|
||||
|
||||
message_unread
|
||||
=============
|
||||
==============
|
||||
|
||||
``message_unread`` is a boolean field that states whether the document
|
||||
has unread messages. In previous versions, some documents were going
|
||||
|
@ -10,7 +10,7 @@ gateway. Now the state related to messages differs from the state or
|
|||
stage of the document itself.
|
||||
|
||||
message_unread and need action mechanism
|
||||
+++++++++++++++++++++++++++++++++++++++
|
||||
++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
The ``mail`` module introduces a default behavior for the need_action
|
||||
mechanism [REF].
|
||||
|
|
Loading…
Reference in New Issue