summaryrefslogtreecommitdiff
path: root/addons/calendar
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2014-07-06 16:44:26 +0200
committerAntony Lesuisse <al@openerp.com>2014-07-06 17:05:41 +0200
commitcbe2dbb672a6c55d86f2e515f9d1cdfee426ef80 (patch)
treed6ff62b719fce32392397783c961b734b1e4c50e /addons/calendar
parentd78192c489d3be66cd6487b39f5ce7ba4733a187 (diff)
[MERGE] new v8 api by rco
A squashed merge is required as the conversion of the apiculture branch from bzr to git was not correctly done. The git history contains irrelevant blobs and commits. This branch brings a lot of changes and fixes, too many to list exhaustively. - New orm api, objects are now used instead of ids - Environements to encapsulates cr uid context while maintaining backward compatibility - Field compute attribute is a new object oriented way to define function fields - Shared browse record cache - New onchange protocol - Optional copy flag on fields - Documentation update - Dead code cleanup - Lots of fixes
Diffstat (limited to 'addons/calendar')
-rw-r--r--addons/calendar/base_calendar_view.xml291
-rw-r--r--addons/calendar/calendar.py24
-rw-r--r--addons/calendar/controllers/main.py6
-rw-r--r--addons/calendar/crm_meeting.py176
-rw-r--r--addons/calendar/crm_meeting_data.xml32
5 files changed, 11 insertions, 518 deletions
diff --git a/addons/calendar/base_calendar_view.xml b/addons/calendar/base_calendar_view.xml
deleted file mode 100644
index 7fa20a848fd..00000000000
--- a/addons/calendar/base_calendar_view.xml
+++ /dev/null
@@ -1,291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
-
- <!-- Calendar's menu -->
- <menuitem id="base.menu_calendar_configuration" name="Calendar"
- parent="base.menu_base_config" sequence="50" groups="base.group_no_one"/>
-
- <!-- Alarm form view -->
- <record id="res_alarm_form_view" model="ir.ui.view">
- <field name="name">res.alarm.form</field>
- <field name="model">res.alarm</field>
- <field name="arch" type="xml">
- <form string="Reminder details">
- <group col="4">
- <field name="name"/>
- <field name="active"/>
- <separator string="Reminder Details" colspan="4"/>
- <field name="trigger_duration"/>
- <field name="trigger_interval"/>
- <field name="trigger_occurs"/>
- <field name="trigger_related"/>
- </group>
- </form>
- </field>
- </record>
-
- <!-- Alarm list view -->
- <record id="res_alarm_tree_view" model="ir.ui.view">
- <field name="name">res.alarm.tree</field>
- <field name="model">res.alarm</field>
- <field name="arch" type="xml">
- <tree string="Reminder details">
- <field name="name"/>
- <field name="trigger_interval"/>
- <field name="trigger_duration"/>
- <field name="trigger_occurs"/>
- <field name="trigger_related"/>
- </tree>
- </field>
- </record>
- <record id="action_res_alarm_view" model="ir.actions.act_window">
- <field name="name">Alarms</field>
- <field name="type">ir.actions.act_window</field>
- <field name="res_model">res.alarm</field>
- <field name="view_type">form</field>
- <field name="view_mode">tree,form</field>
- <field name="help" type="html">
- <p class="oe_view_nocontent_create">
- Click to setup a new alarm type.
- </p><p>
- You can define a customized type of calendar alarm that may be
- assigned to calendar events or meetings.
- </p>
- </field>
- </record>
-
- <!-- Alarms menu -->
- <menuitem id="menu_crm_meeting_avail_alarm"
- groups="base.group_no_one"
- action="base_calendar.action_res_alarm_view"
- parent="base.menu_calendar_configuration" sequence="5"/>
-
- <!-- Event form view -->
- <record model="ir.ui.view" id="event_form_view">
- <field name="name">Event Form</field>
- <field name="model">calendar.event</field>
- <field name="arch" type="xml">
- <form string="Events">
- <header>
- <button name="do_confirm" string="Confirm" states="tentative,cancelled" type="object" class="oe_highlight"/>
- <button name="do_tentative" states="confirmed,cancelled" string="Uncertain" type="object" class="oe_highlight"/>
- <button name="do_cancel" string="Cancel Event" states="tentative,confirmed" type="object"/>
- <field name="state" widget="statusbar"
- statusbar_visible="tentative,confirmed" statusbar_colors='{"proforma":"blue"}'/>
- </header>
- <sheet>
- <group col="6">
- <field name="name" string="Summary"
- colspan="4" required="1"/>
- <field name="allday" colspan="2" on_change="onchange_dates(date,False,False,allday)"/>
- <newline/>
- <field name="date" string="Start Date" required="1"
- on_change="onchange_dates(date,duration,False,allday)"/>
- <field name="duration" widget="float_time"
- on_change="onchange_dates(date,duration,False,allday)" attrs="{'invisible': [('allday', '=', True)]}"/>
- <field name="date_deadline" string="End Date" required="1"
- on_change="onchange_dates(date,False,date_deadline)"/>
- <field name="location"/>
- <field name="alarm_id" string="Reminder"
- widget="selection"/>
- <group colspan="2" col="4" attrs="{'readonly': [('state','=','done')]}">
- <field name="recurrency"/>
- </group>
- </group>
- <notebook>
- <page string="Event">
- <group col="6" colspan="4">
- <separator colspan="6" string="Visibility"/>
- <field name="user_id" string="Responsible User"/>
- <field name="show_as" string="Show Time as"/>
- <field name="class" string="Privacy"/>
- <field name="recurrent_id_date" invisible="1"/>
- <field name="recurrent_id" invisible="1"/>
- </group>
- <separator string="Description"/>
- <field name="description"/>
- </page>
- <page string="Invitation Detail">
- <field name="attendee_ids" colspan="4"
- nolabel="1" 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"/>
- <field name="role" width="200"/>
- <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"/>
- </tree>
- <form string="Invitation details">
- <notebook colspan="4">
- <page string="Details">
- <group col="4">
- <field name="email"/>
- <field name="rsvp"/>
- <field name="cutype"/>
- <field name="role"/>
- </group>
- <group col="4">
- <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"/>
- </group>
- </page>
- </notebook>
- </form>
- </field>
- </page>
- <page string="Recurrency Option" attrs="{'invisible': [('recurrency','=',False)]}">
- <group col="4" colspan="4" name="rrule">
- <group col="4" colspan="4">
- <field name="rrule_type" string="Recurrency period"
- attrs="{'readonly':[('recurrent_id','!=',False)]}"/>
- <field name="interval"/>
- <separator string="End of Recurrence" colspan="4"/>
- <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')] }"/>
- <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'), ('rrule_type','!=','monthly')]}"/>
- </group>
- <group col="3" colspan="1"
- attrs="{'invisible' : ['|', ('select1','=','date'), ('rrule_type','!=','monthly')]}">
- <field name="byday" string="The"
- attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')]}"/>
- <field name="week_list" nolabel="1"
- attrs="{'required' : [('select1','=','day'), ('rrule_type','=','monthly')]}"/>
- </group>
- </group>
- </group>
-
- </page>
- </notebook>
- </sheet>
- </form>
- </field>
- </record>
-
- <!-- Event list view -->
- <record model="ir.ui.view" id="event_tree_view">
- <field name="name">Event Tree</field>
- <field name="model">calendar.event</field>
- <field name="arch" type="xml">
- <tree string="Events">
- <field name="name" string="Subject"/>
- <field name="date" string="Event Date"/>
- <field name="location"/>
- <field name="show_as"/>
- <field name="class" string="Privacy"/>
- <field name="user_id" invisible="1"/>
- <field name="state" invisible="1"/>
- </tree>
- </field>
- </record>
-
- <!-- Event calendar view -->
- <record model="ir.ui.view" id="event_calendar_view">
- <field name="name">Events Calendar</field>
- <field name="model">calendar.event</field>
- <field name="priority" eval="2"/>
- <field name="arch" type="xml">
- <calendar string="Events" date_start="date" color="show_as" date_delay="duration">
- <field name="name"/>
- <field name="class"/>
- <field name="show_as"/>
- </calendar>
- </field>
- </record>
-
- <!-- Event search view -->
- <record id="view_calendar_event_filter" model="ir.ui.view">
- <field name="name">Calendar Events Search</field>
- <field name="model">calendar.event</field>
- <field name="arch" type="xml">
- <search string="Search Events">
- <field name="name" filter_domain="['|',('name','ilike',self),('location','ilike',self)]" string="Event"/>
- <field name="show_as"/>
- <field name="class" string="Privacy"/>
- <filter icon="terp-go-today" string="My Events" domain="[('user_id','=',uid)]" help="My Events"/>
- <separator/>
- <filter icon="terp-check" string="Confirmed" domain="[('state','=','confirmed')]" help="Confirmed Events"/>
- <field name="user_id"/>
- <group expand="0" string="Group By">
- <filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
- <filter string="Availability" icon="terp-camera_test" domain="[]" context="{'group_by':'show_as'}"/>
- <filter string="Privacy" icon="terp-locked" domain="[]" context="{'group_by':'class'}"/>
- <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
- <filter string="Event Month" icon="terp-go-month" domain="[]" context="{'group_by':'date'}" help="Start Date of Event by Month"/>
- </group>
- </search>
- </field>
- </record>
-
-
- <!-- Event action -->
- <record id="action_view_event" model="ir.actions.act_window">
- <field name="name">Events</field>
- <field name="type">ir.actions.act_window</field>
- <field name="res_model">calendar.event</field>
- <field name="view_type">form</field>
- <field name="view_mode">calendar,tree,form</field>
- <field name="search_view_id" ref="view_calendar_event_filter"/>
- </record>
-
- <!-- Event menu -->
- <menuitem id="menu_events"
- name="Events" parent="base.menu_calendar_configuration"
- sequence="15" action="action_view_event"/>
-
- </data>
- </openerp>
diff --git a/addons/calendar/calendar.py b/addons/calendar/calendar.py
index 7108a2d1d73..a77eb5ea6f6 100644
--- a/addons/calendar/calendar.py
+++ b/addons/calendar/calendar.py
@@ -297,7 +297,7 @@ class res_partner(osv.Model):
Used by web_calendar.js : Many2ManyAttendee
"""
datas = []
- meeting = False
+ meeting = None
if meeting_id:
meeting = self.pool['calendar.event'].browse(cr, uid, get_real_ids(meeting_id), context=context)
for partner in self.browse(cr, uid, ids, context=context):
@@ -309,7 +309,7 @@ class res_partner(osv.Model):
datas.append(data)
return datas
- def calendar_last_notif_ack(self, cr, uid, context=None):
+ def _set_calendar_last_notif_ack(self, cr, uid, context=None):
partner = self.pool['res.users'].browse(cr, uid, uid, context=context).partner_id
self.write(cr, uid, partner.id, {'calendar_last_notif_ack': datetime.now()}, context=context)
return
@@ -708,6 +708,7 @@ class calendar_event(osv.Model):
return (format_date, format_time)
def get_display_time_tz(self, cr, uid, ids, tz=False, context=None):
+ context = dict(context or {})
if tz:
context["tz"] = tz
ev = self.browse(cr, uid, ids, context=context)[0]
@@ -720,8 +721,7 @@ class calendar_event(osv.Model):
1) if user add duration for 2 hours, return : August-23-2013 at (04-30 To 06-30) (Europe/Brussels)
2) if event all day ,return : AllDay, July-31-2013
"""
- if context is None:
- context = {}
+ context = dict(context or {})
tz = context.get('tz', False)
if not tz: # tz can have a value False, so dont do it in the default value of get !
@@ -782,7 +782,7 @@ class calendar_event(osv.Model):
if data.count and data.count <= 0:
raise osv.except_osv(_('Warning!'), _('Count cannot be negative or 0.'))
- data = self.read(cr, uid, id, ['id', 'byday', 'recurrency', 'month_list', 'final_date', 'rrule_type', 'month_by', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'day', 'week_list'], context=context)
+ data = self.read(cr, uid, id, ['id', 'byday', 'recurrency', 'final_date', 'rrule_type', 'month_by', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'day', 'week_list'], context=context)
event = data['id']
if data['recurrency']:
result[event] = self.compute_rule_string(data)
@@ -900,7 +900,7 @@ class calendar_event(osv.Model):
'categ_ids': fields.many2many('calendar.event.type', 'meeting_category_rel', 'event_id', 'type_id', 'Tags'),
'attendee_ids': fields.one2many('calendar.attendee', 'event_id', 'Attendees', ondelete='cascade'),
'partner_ids': fields.many2many('res.partner', 'calendar_event_res_partner_rel', string='Attendees', states={'done': [('readonly', True)]}),
- 'alarm_ids': fields.many2many('calendar.alarm', 'calendar_alarm_calendar_event_rel', string='Reminders', ondelete="restrict"),
+ 'alarm_ids': fields.many2many('calendar.alarm', 'calendar_alarm_calendar_event_rel', string='Reminders', ondelete="restrict", copy=False),
}
_defaults = {
'end_type': 'count',
@@ -1404,16 +1404,9 @@ class calendar_event(osv.Model):
return res
def copy(self, cr, uid, id, default=None, context=None):
- if context is None:
- context = {}
-
default = default or {}
-
self._set_date(cr, uid, default, id=default.get('id'), context=context)
- default['attendee_ids'] = False
-
- res = super(calendar_event, self).copy(cr, uid, calendar_id2real_id(id), default, context)
- return res
+ return super(calendar_event, self).copy(cr, uid, calendar_id2real_id(id), default, context)
def _detach_one_event(self, cr, uid, id, values=dict(), context=None):
real_event_id = calendar_id2real_id(id)
@@ -1547,8 +1540,7 @@ class calendar_event(osv.Model):
return res
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True):
- if not context:
- context = {}
+ context = dict(context or {})
if 'date' in groupby:
raise osv.except_osv(_('Warning!'), _('Group by date is not supported, use the calendar view instead.'))
diff --git a/addons/calendar/controllers/main.py b/addons/calendar/controllers/main.py
index 7480c85d629..d0fdb47ab0b 100644
--- a/addons/calendar/controllers/main.py
+++ b/addons/calendar/controllers/main.py
@@ -1,7 +1,7 @@
import simplejson
import openerp
-import openerp.addons.web.http as http
-from openerp.addons.web.http import request
+import openerp.http as http
+from openerp.http import request
import openerp.addons.web.controllers.main as webmain
import json
@@ -67,5 +67,5 @@ class meeting_invitation(http.Controller):
uid = request.session.uid
context = request.session.context
with registry.cursor() as cr:
- res = registry.get("res.partner").calendar_last_notif_ack(cr, uid, context=context)
+ res = registry.get("res.partner")._set_calendar_last_notif_ack(cr, uid, context=context)
return res
diff --git a/addons/calendar/crm_meeting.py b/addons/calendar/crm_meeting.py
deleted file mode 100644
index 66823e0b8f4..00000000000
--- a/addons/calendar/crm_meeting.py
+++ /dev/null
@@ -1,176 +0,0 @@
-# -*- 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/>.
-#
-##############################################################################
-
-import time
-
-from openerp.osv import fields, osv
-from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
-from openerp.tools.translate import _
-from base_calendar import get_real_ids, base_calendar_id2real_id
-#
-# 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(osv.Model):
- """ Model for CRM meetings """
- _name = 'crm.meeting'
- _description = "Meeting"
- _order = "id desc"
- _inherit = ["calendar.event", "mail.thread", "ir.needaction_mixin"]
- _columns = {
- '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_ids': fields.many2many('res.partner', 'crm_meeting_partner_rel', 'meeting_id', 'partner_id',
- string='Attendees', states={'done': [('readonly', True)]}),
- 'state': fields.selection(
- [('draft', 'Unconfirmed'), ('open', 'Confirmed')],
- string='Status', size=16, readonly=True, track_visibility='onchange'),
- # Meeting fields
- 'name': fields.char('Meeting Subject', size=128, required=True, states={'done': [('readonly', True)]}),
- 'categ_ids': fields.many2many('crm.meeting.type', 'meeting_category_rel',
- 'event_id', 'type_id', 'Tags'),
- 'attendee_ids': fields.many2many('calendar.attendee', 'meeting_attendee_rel',\
- 'event_id', 'attendee_id', 'Invited People', states={'done': [('readonly', True)]}),
- }
- _defaults = {
- 'state': 'open',
- }
-
- def message_get_subscription_data(self, cr, uid, ids, context=None):
- res = {}
- for virtual_id in ids:
- real_id = base_calendar_id2real_id(virtual_id)
- result = super(crm_meeting, self).message_get_subscription_data(cr, uid, [real_id], context=context)
- res[virtual_id] = result[real_id]
- return res
-
- def copy(self, cr, uid, id, default=None, context=None):
- default = default or {}
- default['attendee_ids'] = False
- return super(crm_meeting, self).copy(cr, uid, id, default, context)
-
- def write(self, cr, uid, ids, values, context=None):
- """ Override to add case management: open/close dates """
- if values.get('state')and values.get('state') == 'open':
- values['date_open'] = fields.datetime.now()
- return super(crm_meeting, self).write(cr, uid, ids, values, context=context)
-
- def onchange_partner_ids(self, cr, uid, ids, value, context=None):
- """ The basic purpose of this method is to check that destination partners
- effectively have email addresses. Otherwise a warning is thrown.
- :param value: value format: [[6, 0, [3, 4]]]
- """
- res = {'value': {}}
- if not value or not value[0] or not value[0][0] == 6:
- return
- res.update(self.check_partners_email(cr, uid, value[0][2], context=context))
- return res
-
- def check_partners_email(self, cr, uid, partner_ids, context=None):
- """ Verify that selected partner_ids have an email_address defined.
- Otherwise throw a warning. """
- partner_wo_email_lst = []
- for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context):
- if not partner.email:
- partner_wo_email_lst.append(partner)
- if not partner_wo_email_lst:
- return {}
- warning_msg = _('The following contacts have no email address :')
- for partner in partner_wo_email_lst:
- warning_msg += '\n- %s' % (partner.name)
- return {'warning': {
- 'title': _('Email addresses not found'),
- 'message': warning_msg,
- }
- }
- # ----------------------------------------
- # OpenChatter
- # ----------------------------------------
-
- # shows events of the day for this user
- def _needaction_domain_get(self, cr, uid, context=None):
- return [('date', '<=', time.strftime(DEFAULT_SERVER_DATE_FORMAT + ' 23:59:59')), ('date_deadline', '>=', time.strftime(DEFAULT_SERVER_DATE_FORMAT + ' 23:59:59')), ('user_id', '=', uid)]
-
- def message_post(self, cr, uid, thread_id, body='', subject=None, type='notification',
- subtype=None, parent_id=False, attachments=None, context=None, **kwargs):
- if isinstance(thread_id, str):
- thread_id = get_real_ids(thread_id)
- return super(crm_meeting, self).message_post(cr, uid, thread_id, body=body, subject=subject, type=type, subtype=subtype, parent_id=parent_id, attachments=attachments, context=context, **kwargs)
-
-class mail_message(osv.osv):
- _inherit = "mail.message"
-
- def search(self, cr, uid, args, offset=0, limit=0, order=None, context=None, count=False):
- '''
- convert the search on real ids in the case it was asked on virtual ids, then call super()
- '''
- for index in range(len(args)):
- if args[index][0] == "res_id" and isinstance(args[index][2], str):
- args[index][2] = get_real_ids(args[index][2])
- return super(mail_message, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=count)
-
- def _find_allowed_model_wise(self, cr, uid, doc_model, doc_dict, context=None):
- if doc_model == 'crm.meeting':
- for virtual_id in self.pool[doc_model].get_recurrent_ids(cr, uid, doc_dict.keys(), [], context=context):
- doc_dict.setdefault(virtual_id, doc_dict[get_real_ids(virtual_id)])
- return super(mail_message, self)._find_allowed_model_wise(cr, uid, doc_model, doc_dict, context=context)
-
-class ir_attachment(osv.osv):
- _inherit = "ir.attachment"
-
- def search(self, cr, uid, args, offset=0, limit=0, order=None, context=None, count=False):
- '''
- convert the search on real ids in the case it was asked on virtual ids, then call super()
- '''
- for index in range(len(args)):
- if args[index][0] == "res_id" and isinstance(args[index][2], str):
- args[index][2] = get_real_ids(args[index][2])
- return super(ir_attachment, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=count)
-
- def write(self, cr, uid, ids, vals, context=None):
- '''
- when posting an attachment (new or not), convert the virtual ids in real ids.
- '''
- if isinstance(vals.get('res_id'), str):
- vals['res_id'] = get_real_ids(vals.get('res_id'))
- return super(ir_attachment, self).write(cr, uid, ids, vals, context=context)
-
-class invite_wizard(osv.osv_memory):
- _inherit = 'mail.wizard.invite'
-
- def default_get(self, cr, uid, fields, context=None):
- '''
- in case someone clicked on 'invite others' wizard in the followers widget, transform virtual ids in real ids
- '''
- result = super(invite_wizard, self).default_get(cr, uid, fields, context=context)
- if 'res_id' in result:
- result['res_id'] = get_real_ids(result['res_id'])
- return result
diff --git a/addons/calendar/crm_meeting_data.xml b/addons/calendar/crm_meeting_data.xml
deleted file mode 100644
index d1cffddc403..00000000000
--- a/addons/calendar/crm_meeting_data.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<openerp>
- <data noupdate="1">
-
- <!-- CASE CATEGORY(categ_id) -->
-
- <record model="crm.meeting.type" id="categ_meet1">
- <field name="name">Customer Meeting</field>
- </record>
-
- <record model="crm.meeting.type" id="categ_meet2">
- <field name="name">Internal Meeting</field>
- </record>
-
- <record model="crm.meeting.type" id="categ_meet3">
- <field name="name">Off-site Meeting</field>
- </record>
-
- <record model="crm.meeting.type" id="categ_meet4">
- <field name="name">Open Discussion</field>
- </record>
-
- <record model="crm.meeting.type" id="categ_meet5">
- <field name="name">Feedback Meeting</field>
- </record>
-
- <record model="res.request.link" id="request_link_meeting">
- <field name="name">Meeting</field>
- <field name="object">crm.meeting</field>
- </record>
- </data>
-</openerp>