summaryrefslogtreecommitdiff
path: root/addons/base_calendar
diff options
context:
space:
mode:
authorAjay Chauhan (OpenERP) <cha@tinyerp.com>2012-07-10 15:52:01 +0530
committerAjay Chauhan (OpenERP) <cha@tinyerp.com>2012-07-10 15:52:01 +0530
commit6dbd4e000dcb22d2ffcfeb7a9080eeffcbbcc7f8 (patch)
tree5d1c3d763d9282312b22ca9e226515f20ce37d47 /addons/base_calendar
parent4e08b80952c7f50357f8f97b69495562631e9d55 (diff)
parentf25ad676a34670f4ba1ac14bf2d6babd8ccc88b5 (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__.py26
-rw-r--r--addons/base_calendar/__openerp__.py5
-rw-r--r--addons/base_calendar/crm_meeting.py82
-rw-r--r--addons/base_calendar/crm_meeting_view.xml371
-rw-r--r--addons/base_calendar/security/ir.model.access.csv6
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