Skip to content

Commit 2256211

Browse files
committedJun 22, 2020
Merge PR #11 into 12.0
Signed-off-by ivantodorovich
2 parents 4b1c8b4 + 598aa4f commit 2256211

14 files changed

+757
-0
lines changed
 
+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
========================================
2+
Scheduling Meetings for Vehicle Services
3+
========================================
4+
5+
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6+
!! This file is generated by oca-gen-addon-readme !!
7+
!! changes will be overwritten. !!
8+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
9+
10+
.. |badge1| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
11+
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
12+
:alt: License: AGPL-3
13+
.. |badge2| image:: https://img.shields.io/badge/github-OCA%2Ffleet-lightgray.png?logo=github
14+
:target: https://github.com/OCA/fleet/tree/12.0/fleet_vehicle_service_calendar
15+
:alt: OCA/fleet
16+
.. |badge3| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
17+
:target: https://translation.odoo-community.org/projects/fleet-12-0/fleet-12-0-fleet_vehicle_service_calendar
18+
:alt: Translate me on Weblate
19+
.. |badge4| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
20+
:target: https://runbot.odoo-community.org/runbot/291/12.0
21+
:alt: Try me on Runbot
22+
23+
|badge1| |badge2| |badge3| |badge4|
24+
25+
This module adds the following features:
26+
27+
- A smart button in form view of services to schedule meetings.
28+
- Search events for specific services in calendar view.
29+
30+
**Table of contents**
31+
32+
.. contents::
33+
:local:
34+
35+
Bug Tracker
36+
===========
37+
38+
Bugs are tracked on `GitHub Issues <https://github.com/OCA/fleet/issues>`_.
39+
In case of trouble, please check there if your issue has already been reported.
40+
If you spotted it first, help us smashing it by providing a detailed and welcomed
41+
`feedback <https://github.com/OCA/fleet/issues/new?body=module:%20fleet_vehicle_service_calendar%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
42+
43+
Do not contact contributors directly about support or help with technical issues.
44+
45+
Credits
46+
=======
47+
48+
Authors
49+
~~~~~~~
50+
51+
* Druidoo
52+
53+
Contributors
54+
~~~~~~~~~~~~
55+
56+
* `Druidoo <https://www.druidoo.io>`_:
57+
58+
* Iván Todorovich <ivan.todorovich@druidoo.io>
59+
* Manuel Marquez <manuel.marquez@druidoo.io>
60+
61+
* `PnLUG - Gruppo Odoo <https://odoo.pnlug.it>`_:
62+
63+
* Stefano Consolaro <stefano.consolaro@mymage.it> (backport 13.0→12.0)
64+
65+
Maintainers
66+
~~~~~~~~~~~
67+
68+
This module is maintained by the OCA.
69+
70+
.. image:: https://odoo-community.org/logo.png
71+
:alt: Odoo Community Association
72+
:target: https://odoo-community.org
73+
74+
OCA, or the Odoo Community Association, is a nonprofit organization whose
75+
mission is to support the collaborative development of Odoo features and
76+
promote its widespread use.
77+
78+
.. |maintainer-mamcode| image:: https://github.com/mamcode.png?size=40px
79+
:target: https://github.com/mamcode
80+
:alt: mamcode
81+
.. |maintainer-ivantodorovich| image:: https://github.com/ivantodorovich.png?size=40px
82+
:target: https://github.com/ivantodorovich
83+
:alt: ivantodorovich
84+
85+
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
86+
87+
|maintainer-mamcode| |maintainer-ivantodorovich|
88+
89+
This module is part of the `OCA/fleet <https://github.com/OCA/fleet/tree/12.0/fleet_vehicle_service_calendar>`_ project on GitHub.
90+
91+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from . import models
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
{
5+
"name": "Scheduling Meetings for Vehicle Services",
6+
"summary": "Add a smart button in services to schedule meetings.",
7+
"category": "Human Resources/Fleet",
8+
"author": "Druidoo, Odoo Community Association (OCA)",
9+
"maintainers": ["mamcode", "ivantodorovich"],
10+
"development_status": "Stable",
11+
"website": "https://github.com/OCA/fleet",
12+
"license": "AGPL-3",
13+
"version": "12.0.1.0.0",
14+
"depends": ["calendar", "fleet_vehicle_service_kanban"],
15+
"data": [
16+
"views/fleet_vehicle_log_services_views.xml",
17+
"views/calendar_event_views.xml",
18+
],
19+
"installable": True,
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from . import calendar_event
5+
from . import fleet_vehicle_log_services
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from odoo import api, fields, models
5+
6+
7+
class CalendarEvent(models.Model):
8+
_inherit = "calendar.event"
9+
10+
vehicle_service_id = fields.Many2one(
11+
"fleet.vehicle.log.services", "Vehicle Service"
12+
)
13+
14+
@api.model
15+
def default_get(self, fields):
16+
if self.env.context.get("default_vehicle_service_id"):
17+
self = self.with_context(
18+
default_res_model_id=self.env.ref(
19+
"fleet.model_fleet_vehicle_log_services"
20+
).id,
21+
default_res_id=self.env.context["default_vehicle_service_id"],
22+
)
23+
defaults = super(CalendarEvent, self).default_get(fields)
24+
25+
# sync res_model / res_id to service id
26+
# (aka creating meeting from service chatter)
27+
ctx = self.env.context
28+
if "vehicle_service_id" not in defaults:
29+
defaults["vehicle_service_id"] = defaults.get("res_id", False) or ctx.get(
30+
"default_res_id", False
31+
)
32+
33+
return defaults
34+
35+
def _compute_is_highlighted(self):
36+
super(CalendarEvent, self)._compute_is_highlighted()
37+
if self.env.context.get("active_model") == "fleet.vehicle.log.services":
38+
vehicle_service_id = self.env.context.get("active_id")
39+
for event in self:
40+
if event.vehicle_service_id.id == vehicle_service_id:
41+
event.is_highlighted = True
42+
43+
@api.model
44+
def create(self, vals):
45+
event = super(CalendarEvent, self).create(vals)
46+
47+
if event.vehicle_service_id and not event.activity_ids:
48+
event.vehicle_service_id.log_meeting(
49+
event.name, event.start, event.duration
50+
)
51+
return event
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from odoo import _, fields, models
5+
6+
7+
class FleetVehicleLogServices(models.Model):
8+
_inherit = "fleet.vehicle.log.services"
9+
10+
meeting_count = fields.Integer("# Meetings", compute="_compute_meeting_count")
11+
12+
def _compute_meeting_count(self):
13+
meeting_data = self.env["calendar.event"].read_group(
14+
[("vehicle_service_id", "in", self.ids)],
15+
["vehicle_service_id"],
16+
["vehicle_service_id"],
17+
)
18+
mapped_data = {
19+
m["vehicle_service_id"][0]: m["vehicle_service_id_count"]
20+
for m in meeting_data
21+
}
22+
for record in self:
23+
record.meeting_count = mapped_data.get(record.id, 0)
24+
25+
def action_schedule_meeting(self):
26+
""" Open meeting's calendar view to schedule meeting on current service.
27+
:return dict: dictionary value for created Meeting view
28+
"""
29+
self.ensure_one()
30+
action = self.env.ref("calendar.action_calendar_event").read()[0]
31+
partner_ids = self.env.user.partner_id.ids
32+
if self.user_id:
33+
partner_ids += self.user_id.partner_id.ids
34+
action["context"] = {
35+
"default_vehicle_service_id": self.id,
36+
"default_partner_id": self.user_id.partner_id.id if self.user_id else False,
37+
"default_partner_ids": partner_ids,
38+
"default_name": "%s - %s"
39+
% (self.vehicle_id.name, self.cost_subtype_id.name),
40+
"search_default_vehicle_service_id": self.id,
41+
}
42+
return action
43+
44+
def log_meeting(self, meeting_subject, meeting_date, duration):
45+
if not duration:
46+
duration = _("unknown")
47+
else:
48+
duration = str(duration)
49+
meet_date = fields.Datetime.from_string(meeting_date)
50+
meeting_usertime = fields.Datetime.to_string(
51+
fields.Datetime.context_timestamp(self, meet_date)
52+
)
53+
html_time = "<time datetime='{}+00:00'>{}</time>".format(
54+
meeting_date, meeting_usertime,
55+
)
56+
message = _(
57+
"Meeting scheduled at '%s'<br> Subject: %s <br> Duration: %s hours"
58+
) % (html_time, meeting_subject, duration)
59+
return self.message_post(body=message)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
* `Druidoo <https://www.druidoo.io>`_:
2+
3+
* Iván Todorovich <ivan.todorovich@druidoo.io>
4+
* Manuel Marquez <manuel.marquez@druidoo.io>
5+
6+
* `PnLUG - Gruppo Odoo <https://odoo.pnlug.it>`_:
7+
8+
* Stefano Consolaro <stefano.consolaro@mymage.it> (backport 13.0→12.0)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
This module adds the following features:
2+
3+
- A smart button in form view of services to schedule meetings.
4+
- Search events for specific services in calendar view.
Loading

‎fleet_vehicle_service_calendar/static/description/index.html

+433
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from . import test_vehicle_service_calendar
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Copyright 2020-Present Druidoo - Manuel Marquez <manuel.marquez@druidoo.io>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
from datetime import datetime
5+
6+
from dateutil.relativedelta import relativedelta
7+
8+
from odoo.addons.fleet_vehicle_service_kanban.tests.common import (
9+
TestVehicleLogServicesCommon,
10+
)
11+
12+
13+
class TestVehicleServiceCalendar(TestVehicleLogServicesCommon):
14+
def test_service_calendar_meeting(self):
15+
"""Check correct creation of meeting for service."""
16+
smartbutton_action = self.service_repair.action_schedule_meeting()
17+
service_meeting = (
18+
self.env["calendar.event"]
19+
.with_context(smartbutton_action["context"])
20+
.create(
21+
{
22+
"start": datetime.now(),
23+
"stop": datetime.now() + relativedelta(hours=1),
24+
}
25+
)
26+
)
27+
self.assertEqual(service_meeting.vehicle_service_id, self.service_repair)
28+
meeting_subject = "{} - {}".format(
29+
self.service_repair.vehicle_id.name,
30+
self.service_repair.cost_subtype_id.name,
31+
)
32+
self.assertEqual(service_meeting.name, meeting_subject)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="view_calendar_event_search" model="ir.ui.view">
4+
<field name="name">calendar.event.search.vehicle.service</field>
5+
<field name="model">calendar.event</field>
6+
<field name="inherit_id" ref="calendar.view_calendar_event_search" />
7+
<field name="arch" type="xml">
8+
<field name="user_id" position="after">
9+
<field name="vehicle_service_id" />
10+
</field>
11+
</field>
12+
</record>
13+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="fleet_vehicle_log_services_view_form" model="ir.ui.view">
4+
<field name="name">fleet.vehicle.log.services.form.calendar</field>
5+
<field name="model">fleet.vehicle.log.services</field>
6+
<field
7+
name="inherit_id"
8+
ref="fleet_vehicle_service_kanban.fleet_vehicle_log_services_view_form"
9+
/>
10+
<field name="arch" type="xml">
11+
<div name="button_box" position="inside">
12+
<button
13+
name="action_schedule_meeting"
14+
type="object"
15+
class="oe_stat_button pull-right"
16+
icon="fa-calendar"
17+
>
18+
<div class="o_stat_info">
19+
<field name="meeting_count" class="o_stat_value" />
20+
<span
21+
class="o_stat_text"
22+
attrs="{'invisible': [('meeting_count', '&lt;', 2)]}"
23+
> Meetings</span>
24+
<span
25+
class="o_stat_text"
26+
attrs="{'invisible': [('meeting_count', '&gt;', 1)]}"
27+
> Meeting</span>
28+
</div>
29+
</button>
30+
</div>
31+
</field>
32+
</record>
33+
</odoo>

0 commit comments

Comments
 (0)
Please sign in to comment.