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 - -