From 6b1606f8de023dadb9118ed1ba2faf4a726b445c Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 3 Jul 2012 15:14:53 +0200 Subject: [PATCH 01/16] [IMP] move crm.wizard.mail_compose_message to module mail, to reduce module dependencies on crm bzr revid: rco@openerp.com-20120703131453-dz0gpdq3t9155bfw --- addons/crm/crm_lead.py | 1 + addons/crm/wizard/__init__.py | 1 - addons/crm/wizard/mail_compose_message.py | 63 ---------------------- addons/crm_claim/crm_claim.py | 4 +- addons/crm_fundraising/crm_fundraising.py | 4 +- addons/crm_helpdesk/crm_helpdesk.py | 4 +- addons/hr_recruitment/hr_recruitment.py | 6 +-- addons/mail/wizard/mail_compose_message.py | 39 ++++++++++++++ addons/project_issue/project_issue.py | 4 +- 9 files changed, 45 insertions(+), 81 deletions(-) delete mode 100644 addons/crm/wizard/mail_compose_message.py diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 69d390ff04d..015fa10c27f 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -41,6 +41,7 @@ class crm_lead(base_stage, osv.osv): _description = "Lead/Opportunity" _order = "priority,date_action,id desc" _inherit = ['ir.needaction_mixin', 'mail.thread'] + _mail_compose_message = True def _get_default_section_id(self, cr, uid, context=None): """ Gives default section by checking if present in the context """ diff --git a/addons/crm/wizard/__init__.py b/addons/crm/wizard/__init__.py index 2fc39c51505..9d128492422 100644 --- a/addons/crm/wizard/__init__.py +++ b/addons/crm/wizard/__init__.py @@ -19,7 +19,6 @@ # ############################################################################## -import mail_compose_message import crm_add_note import crm_lead_to_partner diff --git a/addons/crm/wizard/mail_compose_message.py b/addons/crm/wizard/mail_compose_message.py deleted file mode 100644 index b82c3083f3a..00000000000 --- a/addons/crm/wizard/mail_compose_message.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2010-Today OpenERP SA () -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see -# -############################################################################## - -from osv import osv -from osv import fields -import tools - -SUPPORTED_MODELS = ['crm.lead',] - -class mail_compose_message(osv.osv_memory): - _inherit = 'mail.compose.message' - - def get_value(self, cr, uid, model, res_id, context=None): - """Returns a defaults-like dict with initial values for the composition - wizard when sending an email related to the document record identified - by ``model`` and ``res_id``. - - Overrides the default implementation to provide more default field values - related to the corresponding CRM case. - - :param str model: model name of the document record this mail is related to. - :param int res_id: id of the document record this mail is related to. - :param dict context: several context values will modify the behavior - of the wizard, cfr. the class description. - """ - result = super(mail_compose_message, self).get_value(cr, uid, model, res_id, context=context) - if model in SUPPORTED_MODELS and res_id: - model_obj = self.pool.get(model) - data = model_obj.browse(cr, uid , res_id, context) - user = self.pool.get('res.users').browse(cr, uid, uid, context=context) - result.update({ - 'subject' : data.name or False, - 'email_to' : data.email_from or False, - 'email_from' : user.user_email or tools.config.get('email_from', False), - 'body_text' : '\n' + tools.ustr(user.signature or ''), - 'email_cc' : tools.ustr(data.email_cc or ''), - 'model': model, - 'res_id': res_id, - 'subtype': 'plain', - }) - if hasattr(data, 'section_id'): - result.update({'reply_to' : data.section_id and data.section_id.reply_to or False}) - return result - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py index 5b98258240c..ec6252bcdca 100644 --- a/addons/crm_claim/crm_claim.py +++ b/addons/crm_claim/crm_claim.py @@ -22,14 +22,11 @@ from base_status.base_stage import base_stage import binascii from crm import crm -from crm import wizard from osv import fields, osv import time import tools from tools.translate import _ -wizard.mail_compose_message.SUPPORTED_MODELS.append('crm.claim') - CRM_CLAIM_PENDING_STATES = ( crm.AVAILABLE_STATES[2][0], # Cancelled crm.AVAILABLE_STATES[3][0], # Done @@ -75,6 +72,7 @@ class crm_claim(base_stage, osv.osv): _description = "Claim" _order = "priority,date desc" _inherit = ['mail.thread'] + _mail_compose_message = True _columns = { 'id': fields.integer('ID', readonly=True), 'name': fields.char('Claim Subject', size=128, required=True), diff --git a/addons/crm_fundraising/crm_fundraising.py b/addons/crm_fundraising/crm_fundraising.py index 20d90795ffc..495be4d729c 100644 --- a/addons/crm_fundraising/crm_fundraising.py +++ b/addons/crm_fundraising/crm_fundraising.py @@ -21,12 +21,9 @@ from base_status.base_stage import base_stage from crm import crm -from crm import wizard from osv import fields, osv from tools.translate import _ -wizard.mail_compose_message.SUPPORTED_MODELS.append('crm.fundraising') - class crm_fundraising(base_stage, osv.osv): """ Fund Raising Cases """ @@ -34,6 +31,7 @@ class crm_fundraising(base_stage, osv.osv): _description = "Fund Raising" _order = "id desc" _inherit = ['mail.thread'] + _mail_compose_message = True _columns = { 'id': fields.integer('ID', readonly=True), 'name': fields.char('Name', size=128, required=True), diff --git a/addons/crm_helpdesk/crm_helpdesk.py b/addons/crm_helpdesk/crm_helpdesk.py index fe7b0581e9b..4b0cb2e3ffa 100644 --- a/addons/crm_helpdesk/crm_helpdesk.py +++ b/addons/crm_helpdesk/crm_helpdesk.py @@ -21,7 +21,6 @@ from base_status.base_state import base_state from crm import crm -from crm import wizard from osv import fields, osv import tools from tools.translate import _ @@ -32,8 +31,6 @@ CRM_HELPDESK_STATES = ( crm.AVAILABLE_STATES[4][0], # Pending ) -wizard.mail_compose_message.SUPPORTED_MODELS.append('crm.helpdesk') - class crm_helpdesk(base_state, osv.osv): """ Helpdesk Cases """ @@ -41,6 +38,7 @@ class crm_helpdesk(base_state, osv.osv): _description = "Helpdesk" _order = "id desc" _inherit = ['mail.thread'] + _mail_compose_message = True _columns = { 'id': fields.integer('ID', readonly=True), 'name': fields.char('Name', size=128, required=True), diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 7b0090d60ea..21aa1b4327d 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -24,15 +24,10 @@ import time from datetime import datetime, timedelta from osv import fields, osv -from crm import crm import tools import collections import binascii -import tools from tools.translate import _ -from crm import wizard - -wizard.mail_compose_message.SUPPORTED_MODELS.append('hr.applicant') AVAILABLE_STATES = [ ('draft', 'New'), @@ -98,6 +93,7 @@ class hr_applicant(base_stage, osv.Model): _description = "Applicant" _order = "id desc" _inherit = ['ir.needaction_mixin', 'mail.thread'] + _mail_compose_message = True def _get_default_department_id(self, cr, uid, context=None): """ Gives default department by checking if present in the context """ diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index cb2ed1eec19..1b19a383c10 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -292,4 +292,43 @@ class mail_compose_message(osv.osv_memory): return tools.ustr(result) return template and EXPRESSION_PATTERN.sub(merge, template) + + +class mail_compose_message_extended(osv.osv_memory): + """ Extension of 'mail.compose.message' to support default field values related + to CRM-like models that follow the following conventions: + + 1. The model object must have an attribute '_mail_compose_message' equal to True. + + 2. The model should define the following fields: + - 'name' as subject of the message (required); + - 'email_from' as destination email address (required); + - 'email_cc' as cc email addresses (required); + - 'section_id.reply_to' as reply-to address (optional). + """ + _inherit = 'mail.compose.message' + + def get_value(self, cr, uid, model, res_id, context=None): + """Overrides the default implementation to provide more default field values + related to the corresponding CRM case. + """ + result = super(mail_compose_message_extended, self).get_value(cr, uid, model, res_id, context=context) + model_obj = self.pool.get(model) + if getattr(model_obj, '_mail_compose_message', False) and res_id: + data = model_obj.browse(cr, uid , res_id, context) + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + result.update({ + 'model': model, + 'res_id': res_id, + 'email_from': user.user_email or tools.config.get('email_from', False), + 'email_to': data.email_from or False, + 'email_cc': tools.ustr(data.email_cc or ''), + 'subject': data.name or False, + 'body_text': '\n' + tools.ustr(user.signature or ''), + 'subtype': 'plain', + }) + if hasattr(data, 'section_id'): + result['reply_to'] = data.section_id and data.section_id.reply_to or False + return result + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index fea7a64d2b7..5f9b0a369ca 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -27,9 +27,6 @@ from tools.translate import _ import binascii import time import tools -from crm import wizard - -wizard.mail_compose_message.SUPPORTED_MODELS.append('project.issue') class project_issue_version(osv.osv): _name = "project.issue.version" @@ -50,6 +47,7 @@ class project_issue(base_stage, osv.osv): _description = "Project Issue" _order = "priority, create_date desc" _inherit = ['ir.needaction_mixin', 'mail.thread'] + _mail_compose_message = True def _get_default_project_id(self, cr, uid, context=None): """ Gives default project by checking if present in the context """ From 3bf79cdb7840d5942f963f63acf16510718de475 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 4 Jul 2012 13:27:54 +0200 Subject: [PATCH 02/16] [IMP] crm: remove dummy Python class definition by reordering Python module imports bzr revid: rco@openerp.com-20120704112754-u6kg6pxe279zmgvf --- addons/crm/__init__.py | 2 +- addons/crm/crm_meeting.py | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/addons/crm/__init__.py b/addons/crm/__init__.py index 95cf8b53f27..729d54e0fc6 100644 --- a/addons/crm/__init__.py +++ b/addons/crm/__init__.py @@ -22,8 +22,8 @@ import crm import crm_action_rule import crm_segmentation -import crm_meeting import crm_lead +import crm_meeting import crm_phonecall import report import wizard diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py index 37f03d80ec4..e0915590d6a 100644 --- a/addons/crm/crm_meeting.py +++ b/addons/crm/crm_meeting.py @@ -28,10 +28,6 @@ import tools from tools.translate import _ _logger = logging.getLogger(__name__) -class crm_lead(base_stage, osv.osv): - """ CRM Leads """ - _name = 'crm.lead' - class crm_meeting(base_state, osv.Model): """ Model for CRM meetings """ _name = 'crm.meeting' From bd1d436f9daae1696adbdb69d16ca31c5f97e354 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 4 Jul 2012 16:10:42 +0200 Subject: [PATCH 03/16] [IMP] crm, base_calendar: move the core of crm.meeting into base_calendar bzr revid: rco@openerp.com-20120704141042-fiy0o7pdhc8hboht --- addons/base_calendar/__init__.py | 26 ++++ addons/base_calendar/__openerp__.py | 2 +- addons/base_calendar/crm_meeting.py | 112 ++++++++++++++++++ addons/base_status/base_state.py | 1 + addons/crm/crm_meeting.py | 97 +-------------- addons/crm/crm_meeting_data.xml | 12 +- addons/crm/crm_meeting_view.xml | 30 +++-- addons/hr_recruitment/hr_recruitment_data.xml | 6 +- 8 files changed, 169 insertions(+), 117 deletions(-) create mode 100644 addons/base_calendar/__init__.py create mode 100644 addons/base_calendar/crm_meeting.py diff --git a/addons/base_calendar/__init__.py b/addons/base_calendar/__init__.py new file mode 100644 index 00000000000..ec4f5070d63 --- /dev/null +++ b/addons/base_calendar/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import base_calendar +import crm_meeting +import wizard + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py index 1c8d35099b8..d3a9d9e533d 100644 --- a/addons/base_calendar/__openerp__.py +++ b/addons/base_calendar/__openerp__.py @@ -22,7 +22,7 @@ { "name": "Calendar Layer", "version": "1.0", - "depends": ["base", "mail"], + "depends": ["base", "base_status", "mail"], 'description': """ This is a full-featured calendar system. ======================================== diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py new file mode 100644 index 00000000000..7c18f6826e8 --- /dev/null +++ b/addons/base_calendar/crm_meeting.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-today OpenERP SA () +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from osv import osv, fields +import tools +from tools.translate import _ + +import base_calendar +from base_status.base_state import base_state + +# +# crm.meeting is defined here so that it may be used by modules other than crm, +# without forcing the installation of crm. +# + +class crm_meeting_type(osv.Model): + _name = 'crm.meeting.type' + _description = 'Meeting Type' + _columns = { + 'name': fields.char('Name', size=64, required=True, translate=True), + } + +class crm_meeting(base_state, osv.Model): + """ Model for CRM meetings """ + _name = 'crm.meeting' + _description = "Meeting" + _order = "id desc" + _inherit = ["calendar.event", 'ir.needaction_mixin', "mail.thread"] + _columns = { + # base_state required fields + 'create_date': fields.datetime('Creation Date', readonly=True), + 'write_date': fields.datetime('Write Date', readonly=True), + 'date_open': fields.datetime('Confirmed', readonly=True), + 'date_closed': fields.datetime('Closed', readonly=True), + 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}), + 'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, + help="These people will receive email."), + 'state': fields.selection( + [('draft', 'Unconfirmed'), ('open', 'Confirmed'), ('cancel', 'Cancelled'), ('done', 'Done')], + string='Status', size=16, readonly=True), + # Meeting fields + 'name': fields.char('Summary', size=128, required=True, states={'done': [('readonly', True)]}), + 'categ_id': fields.many2one('crm.meeting.type', 'Meeting Type'), + 'attendee_ids': fields.many2many('calendar.attendee', 'meeting_attendee_rel',\ + 'event_id', 'attendee_id', 'Attendees', states={'done': [('readonly', True)]}), + } + _defaults = { + 'state': 'draft', + } + + def create(self, cr, uid, vals, context=None): + obj_id = super(crm_meeting, self).create(cr, uid, vals, context=context) + self.create_send_note(cr, uid, [obj_id], context=context) + return obj_id + + # ---------------------------------------- + # OpenChatter + # ---------------------------------------- + + def case_get_note_msg_prefix(self, cr, uid, id, context=None): + return 'Meeting' + + def create_send_note(self, cr, uid, ids, context=None): + if context is None: + context = {} + # update context: if come from phonecall, default state values can make the message_append_note crash + context.pop('default_state', False) + for meeting in self.browse(cr, uid, ids, context=context): + # convert datetime field to a datetime, using server format, then + # convert it to the user TZ and re-render it with %Z to add the timezone + meeting_datetime = fields.DT.datetime.strptime(meeting.date, tools.DEFAULT_SERVER_DATETIME_FORMAT) + meeting_date_str = fields.datetime.context_timestamp(cr, uid, meeting_datetime, context=context).strftime(tools.DATETIME_FORMATS_MAP['%+'] + " (%Z)") + message = _("A meeting has been scheduled on %s.") % (meeting_date_str) + if meeting.opportunity_id: # meeting can be create from phonecalls or opportunities, therefore checking for the parent + lead = meeting.opportunity_id + parent_message = _("Meeting linked to the opportunity %s has been created and cscheduled on %s.") % (lead.name, meeting.date) + lead.message_append_note(_('System Notification'), message) + elif meeting.phonecall_id: + phonecall = meeting.phonecall_id + parent_message = _("Meeting linked to the phonecall %s has been created and cscheduled on %s.") % (phonecall.name, meeting.date) + phonecall.message_append_note(body=message) + else: + parent_message = message + if parent_message: + meeting.message_append_note(body=parent_message) + return True + + def case_open_send_note(self, cr, uid, ids, context=None): + return self.message_append_note(cr, uid, ids, body=_("Meeting has been confirmed."), context=context) + + def case_close_send_note(self, cr, uid, ids, context=None): + return self.message_append_note(cr, uid, ids, body=_("Meeting has been done."), context=context) + + diff --git a/addons/base_status/base_state.py b/addons/base_status/base_state.py index 5baf71a01b6..35995ac7da3 100644 --- a/addons/base_status/base_state.py +++ b/addons/base_status/base_state.py @@ -29,6 +29,7 @@ class base_state(object): - ``date_closed`` (datetime field) - ``user_id`` (many2one to res.users) - ``partner_id`` (many2one to res.partner) + - ``email_from`` (char field) - ``state`` (selection field) """ diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py index e0915590d6a..e16e03f2206 100644 --- a/addons/crm/crm_meeting.py +++ b/addons/crm/crm_meeting.py @@ -19,104 +19,24 @@ # ############################################################################## -from base_calendar import base_calendar -from base_status.base_state import base_state -from base_status.base_stage import base_stage -import logging from osv import fields, osv import tools from tools.translate import _ +import logging _logger = logging.getLogger(__name__) -class crm_meeting(base_state, osv.Model): +# +# crm.meeting is defined in module base_calendar +# +class crm_meeting(osv.Model): """ Model for CRM meetings """ - _name = 'crm.meeting' - _description = "Meeting" - _order = "id desc" - _inherit = ["calendar.event", 'ir.needaction_mixin', "mail.thread"] + _inherit = 'crm.meeting' _columns = { - # base_state required fields - 'partner_id': fields.many2one('res.partner', 'Partner', states={'done': [('readonly', True)]}), 'section_id': fields.many2one('crm.case.section', 'Sales Team', states={'done': [('readonly', True)]}, select=True, groups='base.group_sale_salesman', help='Sales team to which Case belongs to.'), - 'email_from': fields.char('Email', size=128, states={'done': [('readonly', True)]}, help="These people will receive email."), - 'create_date': fields.datetime('Creation Date' , readonly=True), - 'write_date': fields.datetime('Write Date' , readonly=True), - 'date_action_last': fields.datetime('Last Action', readonly=1), - 'date_action_next': fields.datetime('Next Action', readonly=1), - # Meeting fields - 'name': fields.char('Summary', size=124, required=True, states={'done': [('readonly', True)]}), - 'categ_id': fields.many2one('crm.case.categ', 'Meeting Type', \ - domain="[('object_id.model', '=', 'crm.meeting')]", \ - ), 'phonecall_id': fields.many2one ('crm.phonecall', 'Phonecall'), 'opportunity_id': fields.many2one ('crm.lead', 'Opportunity', domain="[('type', '=', 'opportunity')]"), - 'attendee_ids': fields.many2many('calendar.attendee', 'meeting_attendee_rel',\ - 'event_id', 'attendee_id', 'Attendees', states={'done': [('readonly', True)]}), - 'date_closed': fields.datetime('Closed', readonly=True), - 'date_deadline': fields.datetime('Deadline', states={'done': [('readonly', True)]}), - 'state': fields.selection([ ('draft', 'Unconfirmed'), - ('open', 'Confirmed'), - ('cancel', 'Cancelled'), - ('done', 'Done')], - string='Status', size=16, readonly=True), } - _defaults = { - 'state': 'draft', - 'active': 1, - 'user_id': lambda self, cr, uid, ctx: uid, - } - - def create(self, cr, uid, vals, context=None): - obj_id = super(crm_meeting, self).create(cr, uid, vals, context=context) - self.create_send_note(cr, uid, [obj_id], context=context) - return obj_id - - def case_open(self, cr, uid, ids, context=None): - """ Confirms meeting """ - res = super(crm_meeting, self).case_open(cr, uid, ids, context) - for (id, name) in self.name_get(cr, uid, ids): - id=base_calendar.base_calendar_id2real_id(id) - return res - - # ---------------------------------------- - # OpenChatter - # ---------------------------------------- - - def case_get_note_msg_prefix(self, cr, uid, id, context=None): - return 'Meeting' - - def create_send_note(self, cr, uid, ids, context=None): - if context is None: - context = {} - # update context: if come from phonecall, default state values can make the message_append_note crash - context.pop('default_state', False) - for meeting in self.browse(cr, uid, ids, context=context): - # convert datetime field to a datetime, using server format, then - # convert it to the user TZ and re-render it with %Z to add the timezone - meeting_datetime = fields.DT.datetime.strptime(meeting.date, tools.DEFAULT_SERVER_DATETIME_FORMAT) - meeting_date_str = fields.datetime.context_timestamp(cr, uid, meeting_datetime, context=context).strftime(tools.DATETIME_FORMATS_MAP['%+'] + " (%Z)") - message = _("A meeting has been scheduled on %s.") % (meeting_date_str) - if meeting.opportunity_id: # meeting can be create from phonecalls or opportunities, therefore checking for the parent - lead = meeting.opportunity_id - parent_message = _("Meeting linked to the opportunity %s has been created and cscheduled on %s.") % (lead.name, meeting.date) - lead.message_append_note(_('System Notification'), message) - elif meeting.phonecall_id: - phonecall = meeting.phonecall_id - parent_message = _("Meeting linked to the phonecall %s has been created and cscheduled on %s.") % (phonecall.name, meeting.date) - phonecall.message_append_note(body=message) - else: - parent_message = message - if parent_message: - meeting.message_append_note(body=parent_message) - return True - - def case_open_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Meeting has been confirmed."), context=context) - - def case_close_send_note(self, cr, uid, ids, context=None): - return self.message_append_note(cr, uid, ids, body=_("Meeting has been done."), context=context) - class calendar_attendee(osv.osv): """ Calendar Attendee """ @@ -151,8 +71,6 @@ class calendar_attendee(osv.osv): relation="crm.case.categ", multi='categ_id'), } -calendar_attendee() - class res_users(osv.osv): _name = 'res.users' _inherit = 'res.users' @@ -173,7 +91,4 @@ class res_users(osv.osv): _logger.debug('Skipped meetings shortcut for user "%s"', data.get('name',' - + Customer Meeting - - - + Internal Meeting - - - + Phone Call - - diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml index 5473b727ea3..34d6ebd1aca 100644 --- a/addons/crm/crm_meeting_view.xml +++ b/addons/crm/crm_meeting_view.xml @@ -39,21 +39,29 @@ client_action_multi - + + + + Meeting Types Tree + crm.meeting.type + tree + + + + + + - Meeting Categories - crm.case.categ + Meeting Types + crm.meeting.type form - - [('object_id.model', '=', 'crm.meeting')] - + Create different meeting categories to better organize and classify your meetings. - + @@ -122,9 +130,7 @@ - + diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index 13436bef45a..fe5d3d9969b 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -5,11 +5,9 @@ --> - - + + Interview - - From 5e973e676b62155c6155db3f1c7c0a34b9ee4336 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 10:00:09 +0200 Subject: [PATCH 04/16] [FIX] base_calendar: move method accessing opportunities and phone calls back to module crm bzr revid: rco@openerp.com-20120705080009-dine29zce1d865rw --- addons/base_calendar/crm_meeting.py | 30 ----------------------------- addons/crm/crm_meeting.py | 27 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py index 7c18f6826e8..dcc97156681 100644 --- a/addons/base_calendar/crm_meeting.py +++ b/addons/base_calendar/crm_meeting.py @@ -66,11 +66,6 @@ class crm_meeting(base_state, osv.Model): 'state': 'draft', } - def create(self, cr, uid, vals, context=None): - obj_id = super(crm_meeting, self).create(cr, uid, vals, context=context) - self.create_send_note(cr, uid, [obj_id], context=context) - return obj_id - # ---------------------------------------- # OpenChatter # ---------------------------------------- @@ -78,31 +73,6 @@ class crm_meeting(base_state, osv.Model): def case_get_note_msg_prefix(self, cr, uid, id, context=None): return 'Meeting' - def create_send_note(self, cr, uid, ids, context=None): - if context is None: - context = {} - # update context: if come from phonecall, default state values can make the message_append_note crash - context.pop('default_state', False) - for meeting in self.browse(cr, uid, ids, context=context): - # convert datetime field to a datetime, using server format, then - # convert it to the user TZ and re-render it with %Z to add the timezone - meeting_datetime = fields.DT.datetime.strptime(meeting.date, tools.DEFAULT_SERVER_DATETIME_FORMAT) - meeting_date_str = fields.datetime.context_timestamp(cr, uid, meeting_datetime, context=context).strftime(tools.DATETIME_FORMATS_MAP['%+'] + " (%Z)") - message = _("A meeting has been scheduled on %s.") % (meeting_date_str) - if meeting.opportunity_id: # meeting can be create from phonecalls or opportunities, therefore checking for the parent - lead = meeting.opportunity_id - parent_message = _("Meeting linked to the opportunity %s has been created and cscheduled on %s.") % (lead.name, meeting.date) - lead.message_append_note(_('System Notification'), message) - elif meeting.phonecall_id: - phonecall = meeting.phonecall_id - parent_message = _("Meeting linked to the phonecall %s has been created and cscheduled on %s.") % (phonecall.name, meeting.date) - phonecall.message_append_note(body=message) - else: - parent_message = message - if parent_message: - meeting.message_append_note(body=parent_message) - return True - def case_open_send_note(self, cr, uid, ids, context=None): return self.message_append_note(cr, uid, ids, body=_("Meeting has been confirmed."), context=context) diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py index e16e03f2206..bdc5e91ad33 100644 --- a/addons/crm/crm_meeting.py +++ b/addons/crm/crm_meeting.py @@ -38,6 +38,33 @@ class crm_meeting(osv.Model): 'opportunity_id': fields.many2one ('crm.lead', 'Opportunity', domain="[('type', '=', 'opportunity')]"), } + def create(self, cr, uid, vals, context=None): + obj_id = super(crm_meeting, self).create(cr, uid, vals, context=context) + self.create_send_note(cr, uid, [obj_id], context=context) + return obj_id + + def create_send_note(self, cr, uid, ids, context=None): + if context is None: + context = {} + # update context: if come from phonecall, default state values can make the message_append_note crash + context.pop('default_state', False) + for meeting in self.browse(cr, uid, ids, context=context): + # in the message, transpose meeting.date to the timezone of the current user + meeting_date = fields.DT.datetime.strptime(meeting.date, tools.DEFAULT_SERVER_DATETIME_FORMAT) + meeting_date_tz = fields.datetime.context_timestamp(cr, uid, meeting_date, context=context).strftime(tools.DATETIME_FORMATS_MAP['%+'] + " (%Z)") + if meeting.opportunity_id: # meeting can be create from phonecalls or opportunities, therefore checking for the parent + lead = meeting.opportunity_id + message = _("Meeting linked to the opportunity %s has been created and scheduled on %s.") % (lead.name, meeting_date_tz) + lead.message_append_note(_('System Notification'), message) + elif meeting.phonecall_id: + phonecall = meeting.phonecall_id + message = _("Meeting linked to the phonecall %s has been created and scheduled on %s.") % (phonecall.name, meeting_date_tz) + phonecall.message_append_note(body=message) + else: + message = _("A meeting has been scheduled on %s.") % (meeting_date_tz) + meeting.message_append_note(body=message) + return True + class calendar_attendee(osv.osv): """ Calendar Attendee """ From 7163de4d2c42cf507448ec2ac391affba844ff9f Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 10:06:16 +0200 Subject: [PATCH 05/16] [FIX] base_calendar: define access rights for crm.meeting and crm.meeting.type bzr revid: rco@openerp.com-20120705080616-k9rhleajvmdg0ieu --- addons/base_calendar/security/ir.model.access.csv | 6 ++++++ addons/crm/security/ir.model.access.csv | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/base_calendar/security/ir.model.access.csv b/addons/base_calendar/security/ir.model.access.csv index 34543f0e912..24af1abf0e5 100644 --- a/addons/base_calendar/security/ir.model.access.csv +++ b/addons/base_calendar/security/ir.model.access.csv @@ -5,3 +5,9 @@ access_res_alarm,res.alarm,model_res_alarm,base.group_user,1,1,1,1 access_calendar_todo,calendar.todo,model_calendar_todo,base.group_user,1,1,1,1 access_calendar_event,calendar.event,model_calendar_event,base.group_user,1,1,1,1 access_calendar_attendee_survey_user,calendar.attendee,model_calendar_attendee,base.group_survey_user,1,0,0,0 +access_crm_meeting_manager,crm.meeting.manager,model_crm_meeting,base.group_sale_manager,1,1,1,1 +access_crm_meeting,crm.meeting,model_crm_meeting,base.group_sale_salesman,1,1,1,0 +access_crm_meeting_all,crm.meeting_allll,model_crm_meeting,base.group_user,1,0,0,0 +access_crm_meeting_partner_manager,crm.meeting.partner.manager,model_crm_meeting,base.group_partner_manager,1,1,1,1 +access_crm_meeting_type_manager,crm.meeting.type.manager,model_crm_meeting_type,base.group_sale_manager,1,1,1,0 +access_crm_meeting_type_manager,crm.meeting.type.manager,model_crm_meeting_type,base.group_system,1,1,1,1 diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 7707118324f..5665839f365 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -7,12 +7,9 @@ access_crm_case_channel_user,crm.case.channel user,model_crm_case_channel,base.g access_crm_case_channel_manager,crm.case.channel manager,model_crm_case_channel,base.group_sale_manager,1,1,1,1 access_crm_case_section,crm.case.section,model_crm_case_section,base.group_user,1,0,0,0 access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_sale_salesman,1,1,1,0 -access_crm_meeting_manager,crm.meeting.manager,model_crm_meeting,base.group_sale_manager,1,1,1,1 access_crm_lead_manager,crm.lead.manager,model_crm_lead,base.group_sale_manager,1,1,1,1 access_crm_phonecall_manager,crm.phonecall.manager,model_crm_phonecall,base.group_sale_manager,1,1,1,1 access_crm_case_categ,crm.case.categ,model_crm_case_categ,base.group_user,1,0,0,0 -access_crm_meeting,crm.meeting,model_crm_meeting,base.group_sale_salesman,1,1,1,0 -access_crm_meeting_all,crm.meeting_allll,model_crm_meeting,base.group_user,1,0,0,0 access_crm_lead,crm.lead,model_crm_lead,base.group_sale_salesman,1,1,1,0 access_crm_lead_all,crm.lead.all,model_crm_lead,base.group_user,1,0,0,0 access_crm_phonecall,crm.phonecall,model_crm_phonecall,base.group_sale_salesman,1,1,1,0 @@ -40,4 +37,3 @@ access_crm_lead_report_user,crm.lead.report user,model_crm_lead_report,base.grou access_res_partner_bank_type_crm_user,res.partner.bank.type.crm.user,base.model_res_partner_bank_type,base.group_sale_salesman,1,0,0,0 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_meeting_partner_manager,crm.meeting.partner.manager,model_crm_meeting,base.group_partner_manager,1,1,1,1 From 76500b8a5e9d6f80b9734a2df3f1d5b09ff98e64 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 10:06:59 +0200 Subject: [PATCH 06/16] [IMP] hr_holidays: remove dependency on module crm bzr revid: rco@openerp.com-20120705080659-983x3zcr3cdz48ob --- addons/hr_holidays/__openerp__.py | 2 +- addons/hr_holidays/hr_holidays.py | 40 +++++++++---------------- addons/hr_holidays/hr_holidays_view.xml | 13 ++------ 3 files changed, 17 insertions(+), 38 deletions(-) diff --git a/addons/hr_holidays/__openerp__.py b/addons/hr_holidays/__openerp__.py index 09809e488ba..c5c2d370cd1 100644 --- a/addons/hr_holidays/__openerp__.py +++ b/addons/hr_holidays/__openerp__.py @@ -50,7 +50,7 @@ Note that: for example, you maybe will do it for the user 'admin'. """, 'images': ['images/hr_allocation_requests.jpeg', 'images/hr_leave_requests.jpeg', 'images/leaves_analysis.jpeg'], - 'depends': ['hr', 'crm', 'process', 'resource'], + 'depends': ['hr', 'base_calendar', 'process', 'resource'], 'init_xml': [], 'update_xml': [ 'security/ir.model.access.csv', diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index a1ab0ae04f3..2a2648f1beb 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -74,7 +74,8 @@ class hr_holidays_status(osv.osv): _columns = { 'name': fields.char('Leave Type', size=64, required=True, translate=True), - 'categ_id': fields.many2one('crm.case.categ', 'Meeting', domain="[('object_id.model', '=', 'crm.meeting')]", help='If you set a meeting type, OpenERP will create a meeting in the calendar once a leave is validated.'), + 'categ_id': fields.many2one('crm.meeting.type', 'Meeting Type', + help='Once a leave is validated, OpenERP will create a corresponding meeting of this type in the calendar.'), 'color_name': fields.selection([('red', 'Red'),('blue','Blue'), ('lightgreen', 'Light Green'), ('lightblue','Light Blue'), ('lightyellow', 'Light Yellow'), ('magenta', 'Magenta'),('lightcyan', 'Light Cyan'),('black', 'Black'),('lightpink', 'Light Pink'),('brown', 'Brown'),('violet', 'Violet'),('lightcoral', 'Light Coral'),('lightsalmon', 'Light Salmon'),('lavender', 'Lavender'),('wheat', 'Wheat'),('ivory', 'Ivory')],'Color in Report', required=True, help='This color will be used in the leaves summary located in Reporting\Leaves by Departement'), 'limit': fields.boolean('Allow to Override Limit', help='If you select this checkbox, the system allows the employees to take more leaves than the available ones for this type.'), 'active': fields.boolean('Active', help="If the active field is set to false, it will allow you to hide the leave type without removing it."), @@ -128,7 +129,7 @@ class hr_holidays(osv.osv): 'notes': fields.text('Reasons',readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}), 'number_of_days_temp': fields.float('Number of Days', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}), 'number_of_days': fields.function(_compute_number_of_days, string='Number of Days', store=True), - 'case_id': fields.many2one('crm.meeting', 'Meeting'), + 'meeting_id': fields.many2one('crm.meeting', 'Meeting'), 'type': fields.selection([('remove','Leave Request'),('add','Allocation Request')], 'Request Type', required=True, readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, help="Choose 'Leave Request' if someone wants to take an off-day. \nChoose 'Allocation Request' if you want to increase the number of leaves available for someone", select=True), 'parent_id': fields.many2one('hr.holidays', 'Parent'), 'linked_request_ids': fields.one2many('hr.holidays', 'parent_id', 'Linked Requests',), @@ -217,19 +218,12 @@ class hr_holidays(osv.osv): } return result - def onchange_sec_id(self, cr, uid, ids, status, context=None): - warning = {} + def onchange_status_id(self, cr, uid, ids, status_id, context=None): double_validation = False - obj_holiday_status = self.pool.get('hr.holidays.status') - if status: - holiday_status = obj_holiday_status.browse(cr, uid, status, context=context) + if status_id: + holiday_status = self.pool.get('hr.holidays.status').browse(cr, uid, status_id, context=context) double_validation = holiday_status.double_validation - if holiday_status.categ_id and holiday_status.categ_id.section_id and not holiday_status.categ_id.section_id.allow_unlink: - warning = { - 'title': "Warning for ", - 'message': "You won\'t be able to cancel this leave request because the CRM Sales Team of the leave type disallows." - } - return {'warning': warning, 'value': {'double_validation': double_validation}} + return {'value': {'double_validation': double_validation}} def set_to_draft(self, cr, uid, ids, context=None): self.write(cr, uid, ids, { @@ -271,7 +265,7 @@ class hr_holidays(osv.osv): holiday_ids.append(record.id) if record.holiday_type == 'employee' and record.type == 'remove': meeting_obj = self.pool.get('crm.meeting') - vals = { + meeting_vals = { 'name': record.name, 'categ_id': record.holiday_status_id.categ_id.id, 'duration': record.number_of_days_temp * 8, @@ -280,11 +274,11 @@ class hr_holidays(osv.osv): 'date': record.date_from, 'end_date': record.date_to, 'date_deadline': record.date_to, - 'leave_id': record.id, + 'state': 'done', # to block that meeting date in the calendar } - case_id = meeting_obj.create(cr, uid, vals) + meeting_id = meeting_obj.create(cr, uid, meeting_vals) self._create_resource_leave(cr, uid, [record], context=context) - self.write(cr, uid, ids, {'case_id': case_id}) + self.write(cr, uid, ids, {'meeting_id': meeting_id}) elif record.holiday_type == 'category': emp_ids = obj_emp.search(cr, uid, [('category_ids', 'child_of', [record.category_id.id])]) leave_ids = [] @@ -330,11 +324,11 @@ class hr_holidays(osv.osv): return True def holidays_cancel(self, cr, uid, ids, context=None): - obj_crm_meeting = self.pool.get('crm.meeting') + meeting_obj = self.pool.get('crm.meeting') for record in self.browse(cr, uid, ids): # Delete the meeting - if record.case_id: - obj_crm_meeting.unlink(cr, uid, [record.case_id.id]) + if record.meeting_id: + meeting_obj.unlink(cr, uid, [record.meeting_id.id]) # If a category that created several holidays, cancel all related wf_service = netsvc.LocalService("workflow") @@ -519,10 +513,4 @@ class hr_employee(osv.osv): hr_employee() -class crm_meeting(osv.osv): - _inherit = 'crm.meeting' - _columns = { - 'leave_id': fields.many2one('hr.holidays','Leave'), - } - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index bda18f1bc6c..dc541b20ceb 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -122,7 +122,7 @@ - + @@ -168,7 +168,7 @@ - + @@ -556,14 +556,5 @@ - - From c9345ee6583c8f8231f7bf90bebe81f53053c279 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 10:31:57 +0200 Subject: [PATCH 07/16] [FIX] crm_caldav: fix incorrect field references (because crm.meeting changed module) bzr revid: rco@openerp.com-20120705083157-b8kgwb12c6u182hs --- addons/crm_caldav/crm_caldav_setup.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/crm_caldav/crm_caldav_setup.xml b/addons/crm_caldav/crm_caldav_setup.xml index 7e20a318e4f..36f3c3fd78b 100644 --- a/addons/crm_caldav/crm_caldav_setup.xml +++ b/addons/crm_caldav/crm_caldav_setup.xml @@ -29,7 +29,7 @@ [('user_id','=', dctx_user_id)] vevent - + @@ -103,7 +103,7 @@ - + field @@ -127,7 +127,7 @@ - + field @@ -163,7 +163,7 @@ - + {'tentative': 'draft', 'confirmed': 'open', 'cancelled': 'cancel'} field @@ -176,7 +176,7 @@ - + datetime_utc From 50dbf218c2b47962b299753ca60d9291b78a3623 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 11:14:43 +0200 Subject: [PATCH 08/16] [FIX] crm: fix stupid test (wrong search on ir.model) bzr revid: rco@openerp.com-20120705091443-2lkfftu0slyb6dl4 --- addons/crm/test/process/action_rule.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/crm/test/process/action_rule.yml b/addons/crm/test/process/action_rule.yml index b13c9b086cc..d394e65ac29 100644 --- a/addons/crm/test/process/action_rule.yml +++ b/addons/crm/test/process/action_rule.yml @@ -2,10 +2,9 @@ I create a record rule. - !python {model: base.action.rule}: | - modle_id = self.pool.get("ir.model").search(cr, uid, [('name', '=', 'crm.lead')]) + model_ids = self.pool.get("ir.model").search(cr, uid, [('model', '=', 'crm.lead')]) from datetime import datetime - new_id = self.create(cr, uid, {'name': 'New Rule', 'model_id': modle_id[0], 'trg_user_id': ref('base.user_root'), 'trg_partner_id': ref('base.res_partner_asus'), 'act_user_id': ref('base.user_demo') }) - lead_obj = self.pool.get("crm.lead") + new_id = self.create(cr, uid, {'name': 'New Rule', 'model_id': model_ids[0], 'trg_user_id': ref('base.user_root'), 'trg_partner_id': ref('base.res_partner_asus'), 'act_user_id': ref('base.user_demo') }) self._check(cr, uid) - I create new lead to check record rule. From 37b6165dd4eed6c23963d2eff511aa3f62618d13 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 13:55:21 +0200 Subject: [PATCH 09/16] [REM] hr_recruitment: remove unused wizard hr.recruitment.job2phonecall bzr revid: rco@openerp.com-20120705115521-ox4hpbqfbrfcsbd0 --- addons/hr_recruitment/__openerp__.py | 1 - addons/hr_recruitment/wizard/__init__.py | 1 - .../wizard/hr_recruitment_phonecall.py | 126 ------------------ .../wizard/hr_recruitment_phonecall_view.xml | 40 ------ 4 files changed, 168 deletions(-) delete mode 100644 addons/hr_recruitment/wizard/hr_recruitment_phonecall.py delete mode 100644 addons/hr_recruitment/wizard/hr_recruitment_phonecall_view.xml diff --git a/addons/hr_recruitment/__openerp__.py b/addons/hr_recruitment/__openerp__.py index b83a482e1c1..a340cc18dc7 100644 --- a/addons/hr_recruitment/__openerp__.py +++ b/addons/hr_recruitment/__openerp__.py @@ -46,7 +46,6 @@ system to store and search in your CV base. 'fetchmail', ], 'update_xml': [ - 'wizard/hr_recruitment_phonecall_view.xml', 'wizard/hr_recruitment_employee_hired.xml', 'wizard/hr_recruitment_create_partner_job_view.xml', 'hr_recruitment_view.xml', diff --git a/addons/hr_recruitment/wizard/__init__.py b/addons/hr_recruitment/wizard/__init__.py index acabd219857..fde7df63456 100644 --- a/addons/hr_recruitment/wizard/__init__.py +++ b/addons/hr_recruitment/wizard/__init__.py @@ -20,7 +20,6 @@ ############################################################################## -import hr_recruitment_phonecall import hr_recruitment_create_partner_job import hr_recruitment_employee_hired diff --git a/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py b/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py deleted file mode 100644 index 12c294c20bc..00000000000 --- a/addons/hr_recruitment/wizard/hr_recruitment_phonecall.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved -# $Id$ -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -import time - -from osv import osv, fields -from tools.translate import _ - -class job2phonecall(osv.osv_memory): - _name = 'hr.recruitment.job2phonecall' - _description = 'Schedule Phone Call' - _columns = { - 'user_id': fields.many2one('res.users', 'Assign To'), - 'deadline': fields.datetime('Planned Date'), - 'note': fields.text('Goals'), - 'category_id': fields.many2one('crm.case.categ', 'Category', required=True), - } - - def _date_user(self, cr, uid, context=None): - case_obj = self.pool.get('hr.applicant') - if context is None: - context = {} - case = case_obj.browse(cr, uid, context.get('active_id', False), context=context) - return case.user_id and case.user_id.id or False - - def _date_category(self, cr, uid, context=None): - case_obj = self.pool.get('hr.applicant') - if context is None: - context = {} - case = case_obj.browse(cr, uid, context.get('active_id', False), context=context) - categ_id = self.pool.get('crm.case.categ').search(cr, uid, [('name','=','Outbound')], context=context) - return categ_id and categ_id[0] or case.categ_id and case.categ_id.id or False - - def _get_note(self, cr, uid, context=None): - mail_message = self.pool.get('mail.message') - if context is None: - context = {} - if context.get('active_id'): - case = self.pool.get('hr.applicant').browse(cr, uid, context['active_id'], context=context) - if case.description: - return case.description - else: - msg_ids = mail_message.search(cr, uid, [('model', '=', 'hr.applicant'), ('res_id', '=', case.id), ('email_from', '!=', ''), ('email_to', '!=', '')], limit=1) - if msg_ids: - return mail_message.browse(cr, uid, msg_ids[0], context=context).body_text - return False - - - _defaults = { - 'user_id': _date_user, - 'category_id': _date_category, - 'note': _get_note - } - - def make_phonecall(self, cr, uid, ids, context=None): - mod_obj = self.pool.get('ir.model.data') - job_case_obj = self.pool.get('hr.applicant') - data_obj = self.pool.get('ir.model.data') - phonecall_case_obj = self.pool.get('crm.phonecall') - if context is None: - context = {} - form = self.browse(cr, uid, ids, context=context)[0] - result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter') - res = mod_obj.read(cr, uid, result, ['res_id'], context=context) - # Select the view - - id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view') - id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view') - if id2: - id2 = data_obj.browse(cr, uid, id2, context=context).res_id - if id3: - id3 = data_obj.browse(cr, uid, id3, context=context).res_id - new_phonecall_id = [] - for job in job_case_obj.browse(cr, uid, context.get('active_ids', []), context=context): - #TODO: Take other info from job - new_phonecall_id = phonecall_case_obj.create(cr, uid, { - 'name': job.name, - 'user_id': form.user_id.id, - 'categ_id': form.category_id.id, - 'description': form.note, - 'date': form.deadline, - 'description': job.description, - 'partner_id': job.partner_id.id, - 'partner_phone': job.partner_phone, - 'partner_mobile': job.partner_mobile, - 'description': job.description, - 'date':job.date, - }, context=context) - new_phonecall = phonecall_case_obj.browse(cr, uid, new_phonecall_id, context=context) - vals = {} - job_case_obj.write(cr, uid, [job.id], vals, context=context) -# job_case_obj.case_cancel(cr, uid, [job.id]) - phonecall_case_obj.case_open(cr, uid, [new_phonecall_id]) - - return { - 'name': _('Phone Call'), - 'view_type': 'form', - 'view_mode': 'tree,form', - 'res_model': 'crm.phonecall', - 'res_id': new_phonecall_id, - 'views': [(id3,'form'), (id2,'tree'), (False,'calendar'), (False,'graph')], - 'type': 'ir.actions.act_window', - 'search_view_id': res['res_id'] - } - -job2phonecall() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/hr_recruitment/wizard/hr_recruitment_phonecall_view.xml b/addons/hr_recruitment/wizard/hr_recruitment_phonecall_view.xml deleted file mode 100644 index 8537186ac6f..00000000000 --- a/addons/hr_recruitment/wizard/hr_recruitment_phonecall_view.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - hr.recruitment.job2phonecall.form - hr.recruitment.job2phonecall - form - -
-
-
- - - - - - - - - - -
-
-
- - - Schedule Phone Call - ir.actions.act_window - hr.recruitment.job2phonecall - form - form - new - - -
-
From 16dd3b0b0875e108b7cecd2369a714e60d5af33c Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 14:20:15 +0200 Subject: [PATCH 10/16] [FIX] hr_recruitment: remove test about removed wizard bzr revid: rco@openerp.com-20120705122015-qcjhrkpbatjlfkmx --- addons/hr_recruitment/test/recruitment_process.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml index 38b84fccab2..841a49dc866 100644 --- a/addons/hr_recruitment/test/recruitment_process.yml +++ b/addons/hr_recruitment/test/recruitment_process.yml @@ -50,13 +50,6 @@ - !python {model: hr.applicant}: | self.write(cr, uid, [ref('hr_case_programmer')], {'job_id':ref('hr.job_developer')}) -- - I start communication with applicant, first schedule phonecall. -- - !python {model: hr.recruitment.job2phonecall}: | - context.update({'active_model': 'hr.applicant', 'active_id': ref("hr_case_programmer"), 'active_ids': [ref("hr_case_programmer")], 'survey_id': ref("survey_job_0")}) - id = self.create(cr, uid, {}, context=context) - self.make_phonecall(cr, uid, [id], context=context) - I schedule meeting with applicant for interview. - From b891603849e11580a4983d5269bf5465ee88157c Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 14:21:40 +0200 Subject: [PATCH 11/16] [REM] hr_recruitment: remove unused action bzr revid: rco@openerp.com-20120705122140-oeqtb9kagobt9qtw --- addons/hr_recruitment/hr_recruitment_view.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml index 00b300cb6f6..f3585b2e0ac 100644 --- a/addons/hr_recruitment/hr_recruitment_view.xml +++ b/addons/hr_recruitment/hr_recruitment_view.xml @@ -16,18 +16,6 @@ view_mode="tree,form,calendar,graph" view_type="form"/> - # ------------------------------------------------------ - # Job Categories - # ------------------------------------------------------ - - - Applicant Categories - crm.case.categ - form - - [('object_id.model', '=', 'hr.applicant')] - - # ------------------------------------------------------ # Stage # ------------------------------------------------------ From c407fa45ce7171ca47e11854eb6a45460f1c3dfd Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 5 Jul 2012 14:22:07 +0200 Subject: [PATCH 12/16] [FIX] hr_recruitment: fix default value of company_id bzr revid: rco@openerp.com-20120705122207-cs730asuew9w7vxz --- addons/hr_recruitment/hr_recruitment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 21aa1b4327d..32bebef3dc0 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -235,7 +235,7 @@ class hr_applicant(base_stage, osv.Model): 'stage_id': lambda s, cr, uid, c: s._get_default_stage_id(cr, uid, c), 'department_id': lambda s, cr, uid, c: s._get_default_department_id(cr, uid, c), 'priority': lambda *a: '', - 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c), + 'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'hr.applicant', context=c), 'color': 0, } From 788b670b2027cf46971ab40d94ec4dd10648f513 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Fri, 6 Jul 2012 10:24:16 +0200 Subject: [PATCH 13/16] [FIX] hr_holidays: change onchange method name bzr revid: rco@openerp.com-20120706082416-hi7fqtdevepvzwbk --- addons/hr_holidays/hr_holidays_view.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 1237cdb14f4..c22c4add718 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -119,7 +119,7 @@ - +