When I am creating a Calendar Event directly from Calendar Event form it will not showing any error, but when I am creating Calendar Event from Customer form through a Gym Planner Smart Button it shows the error.
error:
Traceback (most recent call last):
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/http.py", line 641, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/http.py", line 683, in dispatch
result = self._call_function(**self.params)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/http.py", line 333, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/service/model.py", line 101, in wrapper
return f(dbname, *args, **kwargs)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/http.py", line 326, in checked_call
result = self.endpoint(*a, **kw)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/http.py", line 941, in __call__
return self.method(*args, **kw)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/http.py", line 506, in response_wrap
response = f(*args, **kw)
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/web/controllers/main.py", line 890, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/web/controllers/main.py", line 882, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/api.py", line 687, in call_kw
return call_kw_model(method, model, args, kwargs)
File "/home/ramit/workspace/openerp/odoo10/odoo/odoo/api.py", line 672, in call_kw_model
result = method(recs, *args, **kwargs)
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/crm/models/calendar.py", line 15, in create
event = super(CalendarEvent, self).create(vals)
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/calendar/models/calendar.py", line 1454, in create
meeting.with_context(dont_notify=True).create_attendees()
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/calendar/models/calendar.py", line 955, in create_attendees
to_notify._send_mail_to_attendees('calendar.calendar_template_meeting_invitation')
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/calendar/models/calendar.py", line 141, in _send_mail_to_attendees
ics_files = self.mapped('event_id').get_ics_file()
File "/home/ramit/workspace/openerp/odoo10/odoo/addons/calendar/models/calendar.py", line 924, in get_ics_file
result[meeting.id] = cal.serialize()
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 186, in serialize
return behavior.serialize(self, buf, lineLength, validate)
File "/usr/lib/python2.7/dist-packages/vobject/behavior.py", line 157, in serialize
out = base.defaultSerialize(transformed, buf, lineLength)
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 947, in defaultSerialize
child.serialize(outbuf, lineLength, validate=False)
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 186, in serialize
return behavior.serialize(self, buf, lineLength, validate)
File "/usr/lib/python2.7/dist-packages/vobject/behavior.py", line 157, in serialize
out = base.defaultSerialize(transformed, buf, lineLength)
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 947, in defaultSerialize
child.serialize(outbuf, lineLength, validate=False)
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 186, in serialize
return behavior.serialize(self, buf, lineLength, validate)
File "/usr/lib/python2.7/dist-packages/vobject/behavior.py", line 157, in serialize
out = base.defaultSerialize(transformed, buf, lineLength)
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 953, in defaultSerialize
if obj.behavior and not startedEncoded: obj.behavior.encode(obj)
File "/usr/lib/python2.7/dist-packages/vobject/icalendar.py", line 609, in encode
line.value = backslashEscape(line.value)
File "/usr/lib/python2.7/dist-packages/vobject/base.py", line 1137, in backslashEscape
s=s.replace("\\","\\\\").replace(";","\;").replace(",","\,")
AttributeError: 'bool' object has no attribute 'replace'
gym_planner.py
import babel.dates
import collections
from datetime import datetime, timedelta
from dateutil import parser
from dateutil import rrule
from dateutil.relativedelta import relativedelta
import logging
from operator import itemgetter
import pytz
import re
import time
import uuid
from odoo import api, fields, models
from odoo import tools
from odoo.tools.translate import _
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT
from odoo.exceptions import UserError, ValidationError
class Meeting(models.Model):
_inherit = 'calendar.event'
_rec_name = 'customer_id'
name = fields.Char('Meeting Subject', required=False, states={'done': [('readonly', True)]})
customer_id = fields.Many2one('res.partner', ondelete='cascade', string='Customer Name')
trainer_id = fields.Many2one('hr.employee', string='Trainer')
equipment_id = fields.Many2one('maintenance.equipment', string='Equipment')
absent = fields.Boolean(string='Absent')
gym_name = fields.Many2one('gym.gym', string='Gym Name')
activity = fields.Many2one('gym.activity', string='Activity')
@api.onchange('customer_id')
def _onchange_customer(self):
if self.customer_id:
self.trainer_id = self.customer_id.trainer_id.id
class Gym(models.Model):
_name = 'gym.gym'
_rec_name = 'name'
name = fields.Char(string='Gym Name')
class GymActivity(models.Model):
_name = 'gym.activity'
_rec_name = 'name'
name = fields.Char(string='Activity')
class Partner(models.Model):
_inherit = 'res.partner'
trainer_id = fields.Many2one('hr.employee', string='Trainer')
gym_planner_ids = fields.Many2many('calendar.event', string='Customer Associated with Gym Planner')
gym_planner_count = fields.Integer(compute='_compute_gym_planner_count', string='# Gym Planner')
gym_plan_ids = fields.One2many('calendar.event', 'customer_id')
@api.multi
def _compute_gym_planner_count(self):
res = {}
for data in self:
gym_planner_list = self.env['calendar.event'].search([('customer_id', '=', data.name)]) if data.name else []
res[data.id] = len(gym_planner_list)
return res
@api.multi
def gym_planner_tree_view(self):
for data in self:
return {
'name': _('Gym Planner'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'calendar.event',
'type': 'ir.actions.act_window',
'domain': [('customer_id', '=', data.id)],
'context': {'default_customer_id': data.id},
}
class Employee(models.Model):
_inherit = 'hr.employee'
is_trainer = fields.Boolean(string='Is a Trainer')
gym_planner_trainer_ids = fields.Many2many('calendar.event', string='Customer Associated with Gym Planner')
gym_planner_trainer_count = fields.Integer(compute='_compute_gym_planner_trainer_count', string='# Gym Planner')
@api.multi
def _compute_gym_planner_trainer_count(self):
res = {}
for data in self:
gym_planner_trainer_list = self.env['calendar.event'].search([('trainer_id', '=', data.name)]) if data.name else []
res[data.id] = len(gym_planner_trainer_list)
return res
@api.multi
def gym_planner_trainer_tree_view(self):
for data in self:
return {
'name': _('Gym Planner'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'calendar.event',
'type': 'ir.actions.act_window',
'domain': [('trainer_id.name', '=', data.name)],
}
gym_planner_view.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Menus -->
<menuitem
id="calendar.mail_menu_calendar"
name="Gym Planner"
sequence="2"
action="calendar.action_calendar_event"
web_icon="calendar,static/description/icon.png"
groups="base.group_user"/>
<menuitem
id="maintenance.menu_maintenance_title"
name="Equipments"
web_icon="maintenance,static/description/icon.png"
sequence="110"/>
<menuitem
id="hr.menu_hr_root"
name="Employees/Trainer"
groups="hr.group_hr_manager,hr.group_hr_user,base.group_user"
web_icon="hr,static/description/icon.png"
sequence="75"/>
<menuitem
id="hr.menu_open_view_employee_list_my"
name="Employees/Trainer"
action="hr.open_view_employee_list_my"
parent="hr.menu_hr_root"
sequence="3"/>
<menuitem id="sales_team.menu_sales_team_act" action="sales_team.crm_team_salesteams_act" sequence="2" parent="sales_team.menu_base_partner" name="Dashboard"/>
<menuitem name="Customers"
id="sales_team.menu_base_partner"
web_icon="sale,static/description/icon.png"/>
<menuitem id="sales_team.menu_sales" name="Customers" parent="sales_team.menu_base_partner" sequence="1"/>
<menuitem
id="crm.menu_crm_leads"
name="Leads"
parent="sales_team.menu_sales"
sequence="3"
action="crm.crm_lead_all_leads"
groups="crm.group_use_lead"/>
<!-- Search View -->
<record id="calendar.view_calendar_event_search" model="ir.ui.view">
<field name="name">calendar.event.search</field>
<field name="model">calendar.event</field>
<field name="arch" type="xml">
<search string="Search Meetings">
<field name="name" string="Meeting" filter_domain="[('name','ilike',self)]"/>
<field name="partner_ids"/>
<field name="customer_id"/>
<field name="trainer_id"/>
<field name="gym_name"/>
<field name="activity"/>
<field name="categ_ids"/>
<field name="user_id"/>
<field name="show_as"/>
<field name="privacy" string="Privacy"/>
<filter string="My Events" domain="[('user_id','=',uid)]" help="My Events"/>
<filter string="My Meetings" help="My Meetings" name="mymeetings" context='{"mymeetings": 1}'/>
<filter string="Unread Messages" name="message_needaction" domain="[('message_needaction','=',True)]"/>
<separator/>
<group expand="0" string="Group By">
<filter string="Responsible" domain="[]" context="{'group_by':'user_id'}"/>
<filter string="Availability" domain="[]" context="{'group_by':'show_as'}"/>
<filter string="Privacy" domain="[]" context="{'group_by':'privacy'}"/>
</group>
</search>
</field>
</record>
<!-- Calendar Event Tree View Inherit -->
<record id="calendar.view_calendar_event_tree" model="ir.ui.view">
<field name="name">calendar.event.tree</field>
<field name="model">calendar.event</field>
<field name="arch" type="xml">
<tree string="Gym Planner" decoration-bf="message_needaction==True"
colors="red:absent == True"
default_order="start desc">
<!-- <field name="name" string="Subject"/> -->
<field name="customer_id"/>
<field name="trainer_id"/>
<field name="equipment_id"/>
<field name="gym_name"/>
<field name="activity"/>
<field name="allday" invisible="True"/>
<field name="start" string="Start Date"/>
<field name="stop" string="End Date"/>
<field name="partner_ids" invisible="True"/>
<!-- <field name="location"/> -->
<field name="state" invisible="True"/>
<field name="duration" widget="float_time"/>
<field name="absent"/>
<field name="message_needaction" invisible="1"/>
</tree>
</field>
</record>
<!-- Calendar Event Form View Inherit -->
<record id="view_calendar_inherit_event_form" model="ir.ui.view">
<field name="name">calendar.event.form</field>
<field name="model">calendar.event</field>
<field name="priority" eval="1"/>
<field name="inherit_id" ref="calendar.view_calendar_event_form"/>
<field name="arch" type="xml">
<xpath expr="//sheet/div[@class='oe_title']" position="replace">
<div class="oe_title">
<div class="oe_edit_only">
<label for="name" invisible="True"/>
</div>
<h1>
<field name="name" placeholder="e.g. Business Lunch" invisible="True"/>
</h1>
<label for="partner_ids" string="Attendees" class="oe_edit_only" invisible="True"/>
<h2>
<field name="partner_ids" widget="many2manyattendee"
placeholder="Select attendees..."
context="{'force_email':True}"
class="oe_inline" invisible="True"/>
</h2>
</div>
</xpath>
<xpath expr="//field[@name='is_attendee']" position="after">
<group>
<group>
<field name="customer_id" required="True"/>
<field name="trainer_id" required="True"
domain="[('is_trainer','=', True)]"/>
</group>
<group>
<field name="equipment_id" required="True"/>
<field name="gym_name"/>
<field name="activity"/>
</group>
</group>
</xpath>
<xpath expr="//field[@name='allday']" position="after">
<field name="absent"/>
</xpath>
</field>
</record>
<record id="calendar.action_calendar_event" model="ir.actions.act_window">
<field name="name">Gym Planner</field>
<field name="res_model">calendar.event</field>
<field name="view_mode">tree,calendar,form</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="calendar.view_calendar_event_search"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to schedule a new meeting.
</p><p>
The calendar is shared between employees and fully integrated with
other applications such as the employee holidays or the business
opportunities.
</p>
</field>
</record>
<record id="calendar.action_view_calendar_event_tree" model="ir.actions.act_window.view">
<field name="act_window_id" ref="calendar.action_calendar_event"/>
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="calendar.view_calendar_event_tree"/>
</record>
<record id="calendar.action_view_calendar_event_calendar" model="ir.actions.act_window.view">
<field name="act_window_id" ref="calendar.action_calendar_event"/>
<field name="sequence" eval="2"/>
<field name="view_mode">calendar</field>
<field name="view_id" ref="calendar.view_calendar_event_calendar"/>
</record>
<record id="calendar.action_view_calendar_event_form" model="ir.actions.act_window.view">
<field name="act_window_id" ref="calendar.action_calendar_event"/>
<field name="sequence" eval="3"/>
<field name="view_mode">form</field>
<field name="view_id" ref="calendar.view_calendar_event_form"/>
</record>
<!-- For Gym Name -->
<record id="gym_name_form_view" model="ir.ui.view">
<field name="name">gym.gym.form</field>
<field name="model">gym.gym</field>
<field name="arch" type="xml">
<form string="Gym Name">
<sheet>
<group>
<group>
<field name="name" required="True"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_gym_name_tree" model="ir.ui.view">
<field name="name">gym.gym.tree</field>
<field name="model">gym.gym</field>
<field name="arch" type="xml">
<tree string="Gym Name">
<field name="name"/>
</tree>
</field>
</record>
<record id="action_view_gym_name" model="ir.actions.act_window">
<field name="name">Gym Name</field>
<field name="res_model">gym.gym</field>
<field name="view_type">form</field>
<!-- <field name="context">{'readonly_by_pass': True}</field> -->
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_view_gym_name"
action="action_view_gym_name"
parent="calendar.menu_calendar_configuration"
sequence="5"/>
<!-- For Gym Activity -->
<record id="gym_activity_form_view" model="ir.ui.view">
<field name="name">gym.activity.form</field>
<field name="model">gym.activity</field>
<field name="arch" type="xml">
<form string="Activity">
<sheet>
<group>
<group>
<field name="name" required="True"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_gym_activity_tree" model="ir.ui.view">
<field name="name">gym.activity.tree</field>
<field name="model">gym.activity</field>
<field name="arch" type="xml">
<tree string="Activity">
<field name="name"/>
</tree>
</field>
</record>
<record id="action_gym_activity" model="ir.actions.act_window">
<field name="name">Activity</field>
<field name="res_model">gym.activity</field>
<field name="view_type">form</field>
<!-- <field name="context">{'readonly_by_pass': True}</field> -->
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="menu_gym_activity"
action="action_gym_activity"
parent="calendar.menu_calendar_configuration"
sequence="6"/>
<!-- Inherit Partner form -->
<record id="view_partner_form_inherit" model="ir.ui.view">
<field name="name">res.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="priority" eval="1"/>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='category_id']" position="after">
<field name="trainer_id" domain="[('is_trainer','=', True)]"/>
<!-- <field name="gym_plan_ids" invisible="1"/> -->
</xpath>
<field name="company_type" position="attributes">
<attribute name="invisible">True</attribute>
</field>
</field>
</record>
<record id="res_partner_view_buttons_inherit" model="ir.ui.view">
<field name="name">res.partner.view.buttons</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="sale.res_partner_view_buttons" />
<field name="priority" eval="20"/>
<field name="groups_id" eval="[(4, ref('sales_team.group_sale_salesman'))]"/>
<field name="arch" type="xml">
<xpath expr="//button[@icon='fa-usd']" position="after">
<field name="gym_planner_ids" invisible="1"/>
<button class="oe_stat_button" name="gym_planner_tree_view" type="object" icon="fa-files-o">
<field string="Gym Planner" name="gym_planner_count" widget="statinfo"/>
</button>
</xpath>
</field>
</record>
<!-- Inherit Employee form -->
<record id="inherit_employee_view_form" model="ir.ui.view">
<field name="name">hr.employee.form</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='parent_id']" position="after">
<field name="is_trainer"/>
</xpath>
<xpath expr="//field[@name='coach_id']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//button[@name='toggle_active']" position="after">
<field name="gym_planner_trainer_ids" invisible="1"/>
<button class="oe_stat_button" name="gym_planner_trainer_tree_view"
type="object" icon="fa-files-o">
<field string="Gym Planner" name="gym_planner_trainer_count"
widget="statinfo"/>
</button>
</xpath>
</field>
</record>
<record id="hr.open_view_employee_list_my" model="ir.actions.act_window">
<field name="name">Employees/Trainer</field>
<field name="res_model">hr.employee</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="view_id" eval="False"/>
<field name="search_view_id" ref="hr.view_employee_filter"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a new employee.
</p><p>
With just a quick glance on the Odoo employee screen, you
can easily find all the information you need for each person;
contact data, job position, availability, etc.
</p>
</field>
</record>
</odoo>
__manifest__.py
{
'name': 'Gym Planning',
'version': '10.0',
'website': '',
'category': 'Gym Planning',
'sequence': 20,
'summary': 'Scheduling and Rescheduling Gym Planning',
'depends': [
'base',
'crm',
'calendar',
'maintenance',
'sale',
'hr',
],
'description': """
""",
'data': [
'security/ir.model.access.csv',
'views/gym_planner_view.xml',
],
'qweb': [],
'demo': [],
'test': [
],
'installable': True,
'auto_install': False,
'application': True,
}