[IMP] (hr_)fleet: improve Claim Car Report

The "Claim Car Report" action was not working as expected.
Now the statbutton "Cars" will show the car history of a specific
driver.

closes odoo/odoo#76550

Related: odoo/upgrade#2882
Taskid: 2646113
Signed-off-by: Kevin Baptiste <kba@odoo.com>
This commit is contained in:
Kevin Baptiste
2021-10-04 11:29:55 +00:00
parent 67bcdbb2a2
commit 67a07865d1
10 changed files with 32 additions and 123 deletions
@@ -13,3 +13,13 @@ class FleetVehicleAssignationLog(models.Model):
driver_id = fields.Many2one('res.partner', string="Driver", required=True)
date_start = fields.Date(string="Start Date")
date_end = fields.Date(string="End Date")
def action_open_vehicle(self):
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'res_model': 'fleet.vehicle',
'res_id': self.vehicle_id.id,
'view_mode': 'form',
'context': dict(self.env.context, create=False),
}
+3 -2
View File
@@ -532,10 +532,11 @@
<field name="model">fleet.vehicle.assignation.log</field>
<field name="arch" type="xml">
<tree string="Assignment Logs" editable="bottom">
<field name="vehicle_id" invisible="1"/>
<field name="driver_id" widget="many2one_avatar"/>
<field name="vehicle_id" />
<field name="date_start"/>
<field name="date_end"/>
<field name="driver_id" widget="many2one_avatar" string="Current Driver" />
<button name="action_open_vehicle" type="object" string="Vehicle Details" class="btn-primary" />
</tree>
</field>
</record>
-1
View File
@@ -1,6 +1,5 @@
# -*- encoding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import controllers
from . import models
from . import wizard
-4
View File
@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import main
-77
View File
@@ -1,77 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import base64
import io
from PyPDF2 import PdfFileReader, PdfFileWriter
from reportlab.pdfgen import canvas
from odoo import _
from odoo.http import request, route, Controller
class HrFleet(Controller):
@route(["/fleet/print_claim_report/<int:employee_id>"], type='http', auth='user')
def get_claim_report_user(self, employee_id, **post):
if not request.env.user.has_group('fleet.fleet_group_manager'):
return request.not_found()
employee = request.env['hr.employee'].search([('id', '=', employee_id)], limit=1)
partner_ids = (employee.user_id.partner_id | employee.sudo().address_home_id).ids
if not employee or not partner_ids:
return request.not_found()
car_assignation_logs = request.env['fleet.vehicle.assignation.log'].search([('driver_id', 'in', partner_ids)])
doc_list = request.env['ir.attachment'].search([
('res_model', '=', 'fleet.vehicle.assignation.log'),
('res_id', 'in', car_assignation_logs.ids)], order='create_date')
writer = PdfFileWriter()
font = "Helvetica"
normal_font_size = 14
for document in doc_list:
car_line_doc = request.env['fleet.vehicle.assignation.log'].browse(document.res_id)
try:
reader = PdfFileReader(io.BytesIO(base64.b64decode(document.datas)), strict=False, overwriteWarnings=False)
except Exception:
continue
width = float(reader.getPage(0).mediaBox.getUpperRight_x())
height = float(reader.getPage(0).mediaBox.getUpperRight_y())
header = io.BytesIO()
can = canvas.Canvas(header)
can.setFont(font, normal_font_size)
can.setFillColorRGB(1, 0, 0)
car_name = car_line_doc.vehicle_id.display_name
date_start = car_line_doc.date_start
date_end = car_line_doc.date_end or '...'
text_to_print = _(
"%(car_name)s (driven from: %(date_start)s to %(date_end)s)",
car_name=car_name,
date_start=date_start,
date_end=date_end
)
can.drawCentredString(width / 2, height - normal_font_size, text_to_print)
can.save()
header_pdf = PdfFileReader(header, overwriteWarnings=False)
for page_number in range(0, reader.getNumPages()):
page = reader.getPage(page_number)
page.mergePage(header_pdf.getPage(0))
writer.addPage(page)
_buffer = io.BytesIO()
writer.write(_buffer)
merged_pdf = _buffer.getvalue()
_buffer.close()
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(merged_pdf))]
return request.make_response(merged_pdf, headers=pdfhttpheaders)
+8 -14
View File
@@ -17,29 +17,23 @@ class Employee(models.Model):
def action_open_employee_cars(self):
self.ensure_one()
cars = self.env['fleet.vehicle.assignation.log'].search([
('driver_id', 'in', (self.user_id.partner_id | self.sudo().address_home_id).ids)]).mapped('vehicle_id')
return {
"type": "ir.actions.act_window",
"res_model": "fleet.vehicle",
"views": [[False, "kanban"], [False, "form"], [False, "tree"]],
"domain": [("id", "in", cars.ids)],
"res_model": "fleet.vehicle.assignation.log",
"views": [[False, "tree"], [False, "form"]],
"domain": [("driver_employee_id", "in", self.ids)],
"context": dict(self._context, create=False),
"name": "History Employee Cars",
}
def _compute_employee_cars_count(self):
rg = self.env['fleet.vehicle.assignation.log'].read_group([
('driver_employee_id', 'in', self.ids),
], ['driver_employee_id'], ['driver_employee_id'])
cars_count = {r['driver_employee_id'][0]: r['driver_employee_id_count'] for r in rg}
for employee in self:
employee.employee_cars_count = len(employee.car_ids)
def action_get_claim_report(self):
self.ensure_one()
return {
'name': 'Claim Report',
'type': 'ir.actions.act_url',
'url': '/fleet/print_claim_report/%(employee_id)s' % {'employee_id': self.id},
}
employee.employee_cars_count = cars_count.get(employee.id, 0)
@api.constrains('address_home_id')
def _check_address_home_id(self):
@@ -1,15 +1,23 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
from odoo import api, fields, models
class FleetVehicleAssignationLog(models.Model):
_inherit = 'fleet.vehicle.assignation.log'
driver_employee_id = fields.Many2one(related="vehicle_id.driver_employee_id", string='Driver (Employee)')
driver_employee_id = fields.Many2one('hr.employee', string='Driver (Employee)', compute='_compute_driver_employee_id', store=True, readonly=False)
attachment_number = fields.Integer('Number of Attachments', compute='_compute_attachment_number')
@api.depends('driver_id')
def _compute_driver_employee_id(self):
employees = self.env['hr.employee'].search([('address_home_id', 'in', self.driver_id.ids)])
for log in self:
employee = employees.filtered(lambda e: e.address_home_id.id == log.driver_id.id)
log.driver_employee_id = employee and employee[0] or False
def _compute_attachment_number(self):
attachment_data = self.env['ir.attachment'].read_group([
('res_model', '=', 'fleet.vehicle.assignation.log'),
-3
View File
@@ -13,8 +13,5 @@ class User(models.Model):
def SELF_READABLE_FIELDS(self):
return super().SELF_READABLE_FIELDS + ['employee_cars_count']
def action_get_claim_report(self):
return self.employee_id.action_get_claim_report()
def action_open_employee_cars(self):
return self.employee_id.action_open_employee_cars()
+1 -16
View File
@@ -6,17 +6,10 @@
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form" />
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button name="action_get_claim_report" string="Claim Car Report"
class="btn btn-secondary"
type="object" groups="fleet.fleet_group_manager"
attrs="{'invisible': [('employee_cars_count','=', 0)]}"
confirm="This report will contain only PDF files. If you want all documents, please go on vehicle page. Do you want to proceed?"/>
</xpath>
<div name="button_box" position="inside">
<button name="action_open_employee_cars" type="object"
class="oe_stat_button" icon="fa-car" groups="fleet.fleet_group_manager"
attrs="{'invisible': [('employee_cars_count','=', 0)]}">
attrs="{'invisible': [('employee_cars_count', '=', 0)]}">
<field name="employee_cars_count" widget="statinfo" />
</button>
</div>
@@ -46,14 +39,6 @@
<field name="model">res.users</field>
<field name="inherit_id" ref="hr.res_users_view_form_profile" />
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button name="action_get_claim_report" string="Claim Car Report"
class="btn btn-primary"
type="object" groups="fleet.fleet_group_manager"
invisible="context.get('from_my_profile', False)"
attrs="{'invisible': [('employee_cars_count','=', 0)]}"
confirm="This report will contain only PDF files. If you want all documents, please go on vehicle page. Do you want to proceed?"/>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
<button name="action_open_employee_cars" type="object"
class="oe_stat_button" icon="fa-car" groups="fleet.fleet_group_manager"
@@ -16,10 +16,6 @@
<field name="model">fleet.vehicle.assignation.log</field>
<field name="inherit_id" ref="fleet.fleet_vehicle_assignation_log_view_list" />
<field name="arch" type="xml">
<xpath expr="//field[@name='date_end']" position="after">
<field name="attachment_number" string=" "/>
<button name="action_get_attachment_view" string="Attachments" type="object" icon="fa-paperclip"/>
</xpath>
<xpath expr="//field[@name='driver_id']" position="after">
<field name="driver_employee_id" widget="many2one_avatar" optional="hide"/>
</xpath>