diff options
| author | Ajay Chauhan (OpenERP) <cha@tinyerp.com> | 2012-07-10 15:52:01 +0530 |
|---|---|---|
| committer | Ajay Chauhan (OpenERP) <cha@tinyerp.com> | 2012-07-10 15:52:01 +0530 |
| commit | 6dbd4e000dcb22d2ffcfeb7a9080eeffcbbcc7f8 (patch) | |
| tree | 5d1c3d763d9282312b22ca9e226515f20ce37d47 /addons/base_calendar | |
| parent | 4e08b80952c7f50357f8f97b69495562631e9d55 (diff) | |
| parent | f25ad676a34670f4ba1ac14bf2d6babd8ccc88b5 (diff) | |
[MERGE] merge with parent branch
bzr revid: cha@tinyerp.com-20120710102201-h5mjjkoyprp70lf0
Diffstat (limited to 'addons/base_calendar')
| -rw-r--r-- | addons/base_calendar/__init__.py | 26 | ||||
| -rw-r--r-- | addons/base_calendar/__openerp__.py | 5 | ||||
| -rw-r--r-- | addons/base_calendar/crm_meeting.py | 82 | ||||
| -rw-r--r-- | addons/base_calendar/crm_meeting_view.xml | 371 | ||||
| -rw-r--r-- | addons/base_calendar/security/ir.model.access.csv | 6 |
5 files changed, 488 insertions, 2 deletions
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 (<http://tiny.be>). +# +# 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 <http://www.gnu.org/licenses/>. +# +############################################################################## + +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..3f6ca129f6f 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. ======================================== @@ -46,7 +46,8 @@ If you need to manage your meetings, you should install the CRM module. 'security/calendar_security.xml', 'security/ir.model.access.csv', 'wizard/base_calendar_invite_attendee_view.xml', - 'base_calendar_view.xml' + 'base_calendar_view.xml', + 'crm_meeting_view.xml', ], "test" : ['test/base_calendar_test.yml'], "installable": True, diff --git a/addons/base_calendar/crm_meeting.py b/addons/base_calendar/crm_meeting.py new file mode 100644 index 00000000000..dcc97156681 --- /dev/null +++ b/addons/base_calendar/crm_meeting.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-today OpenERP SA (<http://www.openerp.com>) +# +# 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 <http://www.gnu.org/licenses/>. +# +############################################################################## + +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', + } + + # ---------------------------------------- + # OpenChatter + # ---------------------------------------- + + def case_get_note_msg_prefix(self, cr, uid, id, context=None): + return 'Meeting' + + def case_open_send_note(self, cr, uid, ids, context=None): + return self.message_append_note(cr, uid, ids, body=_("Meeting has been <b>confirmed</b>."), 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 <b>done</b>."), context=context) + + diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml new file mode 100644 index 00000000000..b6365ebc53c --- /dev/null +++ b/addons/base_calendar/crm_meeting_view.xml @@ -0,0 +1,371 @@ +<?xml version="1.0"?> +<openerp> + <data> + + <!-- Read/Unread actions --> + + <record id="actions_server_crm_meeting_read" model="ir.actions.server"> + <field name="name">Mark read</field> + <field name="condition">True</field> + <field name="type">ir.actions.server</field> + <field name="model_id" ref="model_crm_meeting"/> + <field name="state">code</field> + <field name="code">self.message_check_and_set_read(cr, uid, context.get('active_ids'), context=context)</field> + </record> + <record id="action_crm_meeting_read" model="ir.values"> + <field name="name">action_crm_meeting_read</field> + <field name="action_id" ref="actions_server_crm_meeting_read"/> + <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_read'))" /> + <field name="key">action</field> + <field name="model_id" ref="model_crm_meeting" /> + <field name="model">crm.meeting</field> + <field name="key2">client_action_multi</field> + </record> + + <record id="actions_server_crm_meeting_unread" model="ir.actions.server"> + <field name="name">Mark unread</field> + <field name="condition">True</field> + <field name="type">ir.actions.server</field> + <field name="model_id" ref="model_crm_meeting"/> + <field name="state">code</field> + <field name="code">self.message_check_and_set_unread(cr, uid, context.get('active_ids'), context=context)</field> + </record> + <record id="action_crm_meeting_unread" model="ir.values"> + <field name="name">action_crm_meeting_unread</field> + <field name="action_id" ref="actions_server_crm_meeting_unread"/> + <field name="value" eval="'ir.actions.server,' + str(ref('actions_server_crm_meeting_unread'))" /> + <field name="key">action</field> + <field name="model_id" ref="model_crm_meeting" /> + <field name="model">crm.meeting</field> + <field name="key2">client_action_multi</field> + </record> + + <!-- CRM Meetings Types Form View --> + + <record id="view_crm_meeting_type_tree" model="ir.ui.view"> + <field name="name">Meeting Types Tree</field> + <field name="model">crm.meeting.type</field> + <field name="type">tree</field> + <field name="arch" type="xml"> + <tree string="Meeting Types" editable="bottom"> + <field name="name"/> + </tree> + </field> + </record> + + <record id="action_crm_meeting_type" model="ir.actions.act_window"> + <field name="name">Meeting Types</field> + <field name="res_model">crm.meeting.type</field> + <field name="view_type">form</field> + <field name="view_id" ref="view_crm_meeting_type_tree"/> + <field name="help">Create different meeting categories to better organize and classify your meetings.</field> + </record> + + <menuitem id="menu_crm_meeting_type" parent="base.menu_calendar_configuration" sequence="1" + action="action_crm_meeting_type" groups="base.group_no_one"/> + + <!-- CRM Meetings Form View --> + + <record model="ir.ui.view" id="view_crm_meeting_form"> + <field name="name">CRM - Meetings Form</field> + <field name="model">crm.meeting</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form string="Meetings" version="7.0"> + <header> + <button name="case_open" string="Confirm" type="object" class="oe_highlight" + states="draft"/> + <button name="case_close" string="Done" type="object" class="oe_highlight" + states="open"/> + <button name="case_reset" string="Reset to Unconfirmed" type="object" + states="cancel,done"/> + <button name="case_cancel" string="Cancel" type="object" + states="draft,open"/> + <field name="state" widget="statusbar" statusbar_visible="draft,open,done"/> + </header> + <sheet> + <div class="oe_title"> + <div class="oe_edit_only"> + <label for="name" string="Title"/> + (<field name="allday" on_change="onchange_dates(date,False,False,allday)" class="oe_inline"/> + <label for="allday" string="All Day?"/>) + </div> + <h1> + <field name="name"/> + </h1> + <h2> + <label for="date" string="Starting at"/> + <field name="date" required="1" class="oe_inline"/> + <label for="location" string="in" class="oe_inline" attrs="{'invisible': [('location', '=', False)]}"/> + <field name="location" placeholder="Specify the location here" class="oe_inline"/> + </h2> + <h2> + <label for="duration" string="Duration" /> + <field name="duration" widget="float_time" + on_change="onchange_dates(date,duration,False,allday)" + class="oe_inline"/> ( + <field name="date_deadline" + string="End Date" required="1" + on_change="onchange_dates(date,False,date_deadline)" + class="oe_inline"/> ) + </h2> + </div> + <group> + <group> + <field name="user_id" /> + <field name="organizer"/> + </group> + <group> + <field name="alarm_id" string="Reminder" widget="selection" /> + <field name="class" string="Privacy"/> + <field name="show_as" string="Show Time as"/> + <field name="recurrency" string="Recurrence" attrs="{'readonly': ['|', ('recurrent_uid','!=',False), ('state','=','done')]}"/> + </group> + <group> + <field name="partner_id" string="Partner" + on_change="onchange_partner_id(partner_id)" /> + <field name="email_from"/> + </group> + <group> + <field name="categ_id" widget="selection"/> + <field name="rrule" invisible="1" readonly="1"/> + <field name="recurrent_id" invisible="1"/> + <field name="recurrent_uid" invisible="1"/> + </group> + </group> + <separator string="Description"/> + <field name="description"/> + <notebook> + <page string="Invitation Detail"> + <button string="Invite People" + name="%(base_calendar.action_view_calendar_invite_attendee_wizard)d" + icon="terp-partner" type="action" + attrs="{'readonly': [('state', '=', 'done')]}" + context="{'model' : 'crm.meeting', 'attendee_field':'attendee_ids'}" colspan="2"/> + <field name="attendee_ids" widget="one2many" mode="tree"> + <tree string="Invitation details" editable="top"> + <field name="sent_by_uid" string="From"/> + <field name="user_id" string="To"/> + <field name="email" string="Mail To"/> + <field name="role" /> + <field name="state" /> + <button name="do_tentative" + states="needs-action,declined,accepted" + string="Uncertain" type="object" + icon="terp-crm" /> + <button name="do_accept" string="Accept" + states="needs-action,tentative,declined" + type="object" icon="gtk-apply" /> + <button name="do_decline" string="Decline" + states="needs-action,tentative,accepted" + type="object" icon="gtk-cancel" /> + <button + name="%(base_calendar.action_view_calendar_invite_attendee_wizard)d" + string="Delegate" type="action" + icon="gtk-sort-descending" + states="needs-action,tentative,declined,accepted" + context="{'model' : 'calendar.attendee', 'attendee_field' : 'child_ids'}" /> + </tree> + <form string="Invitation details" version="7.0"> + <header> + <button name="do_tentative" type="object" + states="needs-action,declined,accepted" + string="Uncertain" icon="terp-crm" /> + <button name="do_accept" type="object" + states="needs-action,tentative,declined" + string="Accept" icon="gtk-apply" /> + <button name="do_decline" type="object" + states="needs-action,tentative,accepted" + string="Decline" icon="gtk-cancel" /> + <button name="%(base_calendar.action_view_calendar_invite_attendee_wizard)d" type="action" + states="needs-action,tentative,declined,accepted" + string="Delegate" icon="gtk-sort-descending" + context="{'model' : 'calendar.attendee', 'attendee_field' : 'child_ids'}" /> + <field name="state" widget="statusbar" statusbar_visible="draft,open,done"/> + </header> + <group> + <group> + <field name="email" /> + <field name="rsvp" /> + <field name="cutype" /> + <field name="role" /> + </group> + <group> + <field name="user_id"/> + </group> + </group> + </form> + </field> + </page> + <page string="Recurrence Options"><!-- attrs="{'invisible': [('recurrency','=',False)], 'readonly': ['|', ('recurrent_uid','!=',False), ('state','=','done')]}">--> + <group col="4" colspan="4" name="rrule"> + <group col="4" colspan="4"> + <field name="rrule_type" string=" Recurrence Pattern" /> + <field name="interval" /> + <field name="end_type" /> + <label string=" " colspan="2" /> + <newline /> + <field name="count" attrs="{'invisible' : [('end_type', '!=', 'count')] }"/> + <label string=" " colspan="2" /> + <newline /> + <field name="end_date" attrs="{'invisible' : [('end_type', '!=', 'end_date')], 'required': [('end_type', '=', 'end_date')]}"/> + <newline /> + </group> + <group col="8" colspan="4" name="Select weekdays" attrs="{'invisible' :[('rrule_type','not in', ['weekly'])]}"> + <separator string="Choose day where repeat the meeting" colspan="8"/> + <field name="mo" colspan="1" /> + <field name="tu" colspan="1" /> + <field name="we" colspan="1" /> + <field name="th" colspan="1" /> + <newline/> + <field name="fr" colspan="1" /> + <field name="sa" colspan="1" /> + <field name="su" colspan="1" /> + <newline /> + </group> + <group col="10" colspan="4" + attrs="{'invisible' : [('rrule_type','!=','monthly')]}"> + <separator string="Choose day in the month where repeat the meeting" colspan="12"/> + <group col="2" colspan="1"> + <field name="select1" /> + </group> + <group col="2" colspan="1"> + <field name="day" + attrs="{'required' : [('select1','=','date'), ('rrule_type','=','monthly')], + 'invisible' : [('select1','=','day')]}" /> + </group> + <group col="3" colspan="1"> + <field name="byday" string="The" + attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible' : [('select1','=','date')]}" /> + <field name="week_list" nolabel="1" + attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')], 'invisible' : [('select1','=','date')]}" /> + </group> + </group> + </group> + </page> + </notebook> + </sheet> + <footer> + <field name="message_ids" widget="mail_thread"/> + </footer> + </form> + </field> + </record> + + <!-- CRM Meeting Tree View --> + + <record model="ir.ui.view" id="view_crm_meeting_tree"> + <field name="name">CRM - Meetings Tree</field> + <field name="model">crm.meeting</field> + <field name="type">tree</field> + <field name="arch" type="xml"> + <tree string="Meetings" fonts="bold:needaction_pending==True" + colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')"> + <field name="name" string="Subject" /> + <field name="user_id"/> + <field name="date"/> + <field name="state"/> + <field name="duration" /> + <field name="partner_id" string="Partner" /> + <field name="location" /> + <field name="categ_id"/> + <field name="needaction_pending" invisible="1"/> + </tree> + </field> + </record> + + <!-- CRM Meeting Calendar --> + + <record model="ir.ui.view" id="view_crm_meeting_calendar"> + <field name="name">CRM - Meetings Calendar</field> + <field name="model">crm.meeting</field> + <field name="type">calendar</field> + <field name="priority" eval="2"/> + <field name="arch" type="xml"> + <calendar string="Meetings" date_start="date" color="user_id" date_stop="date_deadline" date_delay="duration"> + <field name="name"/> + <field name="partner_id"/> + </calendar> + </field> + </record> + + <!-- CRM Meeting Gantt --> + + <record id="view_crm_meeting_gantt" model="ir.ui.view"> + <field name="name">CRM - Meetings Gantt</field> + <field name="model">crm.meeting</field> + <field name="type">gantt</field> + <field name="arch" type="xml"> + <gantt date_delay="duration" date_start="date" string="Meetings"/> + </field> + </record> + + <!-- CRM Meeting Search View --> + + <record id="view_crm_meeting_search" model="ir.ui.view"> + <field name="name">CRM - Meetings Search</field> + <field name="model">crm.meeting</field> + <field name="type">search</field> + <field name="arch" type="xml"> + <search string="Search Meetings"> + <group> + <field name="name" string="Meeting / Partner" + filter_domain="['|',('name','ilike',self),('partner_id','ilike', self)]"/> + <filter string="Inbox" help="Unread messages" icon="terp-mail-message-new" + name="needaction_pending" domain="[('needaction_pending','=',True)]"/> + <separator orientation="vertical"/> + <filter string="My Meetings" help="My Meetings" icon="terp-personal" + domain="[('user_id','=',uid)]"/> + <separator orientation="vertical"/> + <field name="user_id"/> + <field name="partner_id"/> + </group> + </search> + </field> + </record> + + <!-- CRM Meetings action and menu --> + + <record id="action_crm_meeting" model="ir.actions.act_window"> + <field name="name">Meetings</field> + <field name="res_model">crm.meeting</field> + <field name="view_mode">calendar,tree,form,gantt</field> + <field name="view_id" ref="view_crm_meeting_calendar"/> + <field name="search_view_id" ref="view_crm_meeting_search"/> + <field name="context">{"calendar_default_user_id": uid}</field> + <field name="help"> + The meeting calendar is shared between the sales teams and fully integrated with other applications + such as the employee holidays or the business opportunities. + You can also synchronize meetings with your mobile phone using the caldav interface. + </field> + </record> + <record model="ir.actions.act_window.view" id="action_view_crm_meeting_calendar"> + <field name="act_window_id" ref="action_crm_meeting"/> + <field name="sequence" eval="1"/> + <field name="view_mode">calendar</field> + <field name="view_id" ref="view_crm_meeting_calendar"/> + </record> + <record model="ir.actions.act_window.view" id="action_view_crm_meeting_tree"> + <field name="act_window_id" ref="action_crm_meeting"/> + <field name="sequence" eval="2"/> + <field name="view_mode">tree</field> + <field name="view_id" ref="view_crm_meeting_tree"/> + </record> + <record model="ir.actions.act_window.view" id="action_view_crm_meeting_form"> + <field name="act_window_id" ref="action_crm_meeting"/> + <field name="sequence" eval="3"/> + <field name="view_mode">form</field> + <field name="view_id" ref="view_crm_meeting_form"/> + </record> + <record model="ir.actions.act_window.view" id="action_view_crm_meeting_gantt"> + <field name="act_window_id" ref="action_crm_meeting"/> + <field name="sequence" eval="4"/> + <field name="view_mode">gantt</field> + <field name="view_id" ref="view_crm_meeting_gantt"/> + </record> + + <menuitem id="menu_crm_meeting" parent="base.menu_sales" sequence="8" + name="Meetings" action="action_crm_meeting"/> + + </data> +</openerp> 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
|
