diff --git a/project_assignees/models/__init__.py b/project_assignees/models/__init__.py index 853e5dd..edf2d36 100644 --- a/project_assignees/models/__init__.py +++ b/project_assignees/models/__init__.py @@ -1,2 +1 @@ - -from . import project_task \ No newline at end of file +from . import project_task diff --git a/project_assignees/models/project_task.py b/project_assignees/models/project_task.py index 598f2b4..9aae74c 100644 --- a/project_assignees/models/project_task.py +++ b/project_assignees/models/project_task.py @@ -1,9 +1,7 @@ - from odoo import models, fields class Task(models.Model): _inherit = "project.task" - assignee_ids = fields.Many2many('res.users', 'assignee_ids_rel', string='Assignees') - + assignee_ids = fields.Many2many("res.users", "assignee_ids_rel", string="Assignees") diff --git a/project_average_acceptable_time/__manifest__.py b/project_average_acceptable_time/__manifest__.py index 12dae43..e7b66f3 100644 --- a/project_average_acceptable_time/__manifest__.py +++ b/project_average_acceptable_time/__manifest__.py @@ -65,11 +65,7 @@ This module is maintained by Elabore. """, # any module necessary for this one to work correctly - "depends": [ - "base", - "project", - "project_user_default_project" - ], + "depends": ["base", "project", "project_user_default_project"], "qweb": [ # "static/src/xml/*.xml", ], @@ -77,10 +73,7 @@ This module is maintained by Elabore. "python": [], }, # always loaded - "data": [ - "views/project_project.xml", - "views/portal_home_template.xml" - ], + "data": ["views/project_project.xml", "views/portal_home_template.xml"], # only loaded in demonstration mode "demo": [], "js": [], diff --git a/project_average_acceptable_time/controllers/__init__.py b/project_average_acceptable_time/controllers/__init__.py index 08cd71a..a68f3db 100644 --- a/project_average_acceptable_time/controllers/__init__.py +++ b/project_average_acceptable_time/controllers/__init__.py @@ -1,2 +1 @@ - -from . import custom_portal \ No newline at end of file +from . import custom_portal diff --git a/project_average_acceptable_time/controllers/custom_portal.py b/project_average_acceptable_time/controllers/custom_portal.py index 2226320..9ce4e31 100644 --- a/project_average_acceptable_time/controllers/custom_portal.py +++ b/project_average_acceptable_time/controllers/custom_portal.py @@ -7,15 +7,19 @@ from odoo.addons.portal.controllers.portal import CustomerPortal class CustomCustomerPortal(CustomerPortal): @route(["/my/account"], type="http", auth="user", website=True) def account(self, redirect=None, **post): - self.OPTIONAL_BILLING_FIELDS.append("average_acceptable_time") #unecessary save in res partner, but necessary to avoid error on form post + self.OPTIONAL_BILLING_FIELDS.append( + "average_acceptable_time" + ) # unecessary save in res partner, but necessary to avoid error on form post response = super(CustomCustomerPortal, self).account(redirect, **post) - + if post and request.httprequest.method == "POST": error, error_message = self.details_form_validate(post) if not error: user = request.env.user if user.default_project_id and post["average_acceptable_time"]: - user.default_project_id.average_acceptable_time = post["average_acceptable_time"] - + user.default_project_id.average_acceptable_time = post[ + "average_acceptable_time" + ] + return response diff --git a/project_average_acceptable_time/models/__init__.py b/project_average_acceptable_time/models/__init__.py index 8186acb..94c91a8 100644 --- a/project_average_acceptable_time/models/__init__.py +++ b/project_average_acceptable_time/models/__init__.py @@ -1,3 +1,2 @@ - from . import project_project -from . import res_partner \ No newline at end of file +from . import res_partner diff --git a/project_average_acceptable_time/models/project_project.py b/project_average_acceptable_time/models/project_project.py index 8655c6c..91d4889 100644 --- a/project_average_acceptable_time/models/project_project.py +++ b/project_average_acceptable_time/models/project_project.py @@ -1,10 +1,7 @@ - from odoo import models, fields, _, api class Project(models.Model): _inherit = "project.project" - average_acceptable_time = fields.Float('Average acceptable time') - - \ No newline at end of file + average_acceptable_time = fields.Float("Average acceptable time") diff --git a/project_average_acceptable_time/models/res_partner.py b/project_average_acceptable_time/models/res_partner.py index a5e5ec9..6916e10 100644 --- a/project_average_acceptable_time/models/res_partner.py +++ b/project_average_acceptable_time/models/res_partner.py @@ -1,10 +1,9 @@ - from odoo import models, fields, _, api class ResPartner(models.Model): _inherit = "res.partner" - average_acceptable_time = fields.Float('Average acceptable time') # not used, but necessary to post custom field from /my/account - - \ No newline at end of file + average_acceptable_time = fields.Float( + "Average acceptable time" + ) # not used, but necessary to post custom field from /my/account diff --git a/project_link_from_invoice/__init__.py b/project_link_from_invoice/__init__.py index a9e3372..0650744 100644 --- a/project_link_from_invoice/__init__.py +++ b/project_link_from_invoice/__init__.py @@ -1,2 +1 @@ - from . import models diff --git a/project_link_from_invoice/__manifest__.py b/project_link_from_invoice/__manifest__.py index 85bb22e..dafbca2 100644 --- a/project_link_from_invoice/__manifest__.py +++ b/project_link_from_invoice/__manifest__.py @@ -65,12 +65,7 @@ This module is maintained by Elabore. """, # any module necessary for this one to work correctly - "depends": [ - "base", - "project", - "account", - "sale" - ], + "depends": ["base", "project", "account", "sale"], "qweb": [ # "static/src/xml/*.xml", ], diff --git a/project_link_from_invoice/models/__init__.py b/project_link_from_invoice/models/__init__.py index 31ac2eb..9c0a421 100644 --- a/project_link_from_invoice/models/__init__.py +++ b/project_link_from_invoice/models/__init__.py @@ -1,2 +1 @@ - -from . import account_move \ No newline at end of file +from . import account_move diff --git a/project_link_from_invoice/models/account_move.py b/project_link_from_invoice/models/account_move.py index df5059b..2a10b6b 100644 --- a/project_link_from_invoice/models/account_move.py +++ b/project_link_from_invoice/models/account_move.py @@ -1,38 +1,46 @@ - from odoo import models, fields, api class AccountMove(models.Model): _inherit = "account.move" - project_ids = fields.Many2many('project.project', name="Projects", compute='get_related_project_ids') - project_count = fields.Integer("Project Count", compute='get_related_project_ids') - projects_name = fields.Char('Project(s)', compute='get_related_project_ids') + project_ids = fields.Many2many( + "project.project", name="Projects", compute="get_related_project_ids" + ) + project_count = fields.Integer("Project Count", compute="get_related_project_ids") + projects_name = fields.Char("Project(s)", compute="get_related_project_ids") def action_open_projects(self): - ''' - Open related projects, in form or tree view depending on project numbers - ''' + """ + Open related projects, in form or tree view depending on project numbers + """ project_ids = self.project_ids.ids - action = self.env["ir.actions.actions"]._for_xml_id("project.open_view_project_all") + action = self.env["ir.actions.actions"]._for_xml_id( + "project.open_view_project_all" + ) if self.project_count == 1: - action['res_id'] = project_ids[0] - action['views'] = [[False, "form"]] + action["res_id"] = project_ids[0] + action["views"] = [[False, "form"]] else: - action['views'] = [[False, "tree"], [False, "form"]] - - action['domain'] = [('id', 'in', project_ids)] + action["views"] = [[False, "tree"], [False, "form"]] + + action["domain"] = [("id", "in", project_ids)] + + del action["target"] # to display breadcrumbs - del action['target'] #to display breadcrumbs - return action - - @api.depends('line_ids.sale_line_ids') + @api.depends("line_ids.sale_line_ids") def get_related_project_ids(self): for move in self: - projects = self.env['project.task'].search([('sale_order_id','in',move.line_ids.sale_line_ids.order_id.ids)]).project_id + projects = ( + self.env["project.task"] + .search( + [("sale_order_id", "in", move.line_ids.sale_line_ids.order_id.ids)] + ) + .project_id + ) move.project_ids = projects.ids - move.projects_name = ' ; '.join([p.name for p in projects]) - move.project_count = len(projects) \ No newline at end of file + move.projects_name = " ; ".join([p.name for p in projects]) + move.project_count = len(projects) diff --git a/project_name_from_lead/__init__.py b/project_name_from_lead/__init__.py index 24c19d6..0650744 100644 --- a/project_name_from_lead/__init__.py +++ b/project_name_from_lead/__init__.py @@ -1,2 +1 @@ - -from . import models \ No newline at end of file +from . import models diff --git a/project_name_from_lead/__manifest__.py b/project_name_from_lead/__manifest__.py index 32ecbd4..9b8b059 100644 --- a/project_name_from_lead/__manifest__.py +++ b/project_name_from_lead/__manifest__.py @@ -33,4 +33,4 @@ # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_name_from_lead/models/__init__.py b/project_name_from_lead/models/__init__.py index 1b896aa..455aa05 100644 --- a/project_name_from_lead/models/__init__.py +++ b/project_name_from_lead/models/__init__.py @@ -1 +1 @@ -from . import sale_order, crm_lead \ No newline at end of file +from . import sale_order, crm_lead diff --git a/project_name_from_lead/models/crm_lead.py b/project_name_from_lead/models/crm_lead.py index 6031c71..f977527 100644 --- a/project_name_from_lead/models/crm_lead.py +++ b/project_name_from_lead/models/crm_lead.py @@ -1,17 +1,19 @@ from odoo import models + class Lead(models.Model): - _inherit = 'crm.lead' + _inherit = "crm.lead" def write(self, vals): - """update project name if project created from lead - """ + """update project name if project created from lead""" for lead in self: - if 'name' in vals: - sale = self.env['sale.order'].search([('opportunity_id','=',lead.id)]) + if "name" in vals: + sale = self.env["sale.order"].search([("opportunity_id", "=", lead.id)]) if sale: - project = self.env['project.project'].search([('sale_order_id','=',sale.id)]) + project = self.env["project.project"].search( + [("sale_order_id", "=", sale.id)] + ) if project: - project.name = vals['name'] + project.name = vals["name"] return super(Lead, self).write(vals) diff --git a/project_name_from_lead/models/sale_order.py b/project_name_from_lead/models/sale_order.py index 5d50ff1..5a89145 100644 --- a/project_name_from_lead/models/sale_order.py +++ b/project_name_from_lead/models/sale_order.py @@ -8,5 +8,5 @@ class SaleOrderLine(models.Model): def _timesheet_create_project_prepare_values(self): values = super(SaleOrderLine, self)._timesheet_create_project_prepare_values() if self.order_id and self.order_id.opportunity_id: - values['name'] = self.order_id.opportunity_id.name - return values \ No newline at end of file + values["name"] = self.order_id.opportunity_id.name + return values diff --git a/project_name_from_quote/__init__.py b/project_name_from_quote/__init__.py index 24c19d6..0650744 100644 --- a/project_name_from_quote/__init__.py +++ b/project_name_from_quote/__init__.py @@ -1,2 +1 @@ - -from . import models \ No newline at end of file +from . import models diff --git a/project_name_from_quote/__manifest__.py b/project_name_from_quote/__manifest__.py index 56230a7..ce8087a 100644 --- a/project_name_from_quote/__manifest__.py +++ b/project_name_from_quote/__manifest__.py @@ -33,4 +33,4 @@ # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_name_from_quote/models/__init__.py b/project_name_from_quote/models/__init__.py index 67427f4..6aacb75 100644 --- a/project_name_from_quote/models/__init__.py +++ b/project_name_from_quote/models/__init__.py @@ -1 +1 @@ -from . import sale_order \ No newline at end of file +from . import sale_order diff --git a/project_name_from_quote/models/sale_order.py b/project_name_from_quote/models/sale_order.py index 8c4caa2..e22887a 100644 --- a/project_name_from_quote/models/sale_order.py +++ b/project_name_from_quote/models/sale_order.py @@ -8,4 +8,4 @@ class SaleOrderLine(models.Model): def _timesheet_create_project_prepare_values(self): values = super(SaleOrderLine, self)._timesheet_create_project_prepare_values() values["name"] = self.order_id.so_title - return values \ No newline at end of file + return values diff --git a/project_parent_task/__manifest__.py b/project_parent_task/__manifest__.py index 1aeec39..87075bd 100644 --- a/project_parent_task/__manifest__.py +++ b/project_parent_task/__manifest__.py @@ -83,4 +83,4 @@ This module is maintained by Elabore. # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_request_data/__manifest__.py b/project_request_data/__manifest__.py index 5d7d802..2708bda 100644 --- a/project_request_data/__manifest__.py +++ b/project_request_data/__manifest__.py @@ -89,4 +89,4 @@ This module is maintained by Elabore. # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_request_data/models/__init__.py b/project_request_data/models/__init__.py index 9f9a9d4..84335e9 100644 --- a/project_request_data/models/__init__.py +++ b/project_request_data/models/__init__.py @@ -1,3 +1,3 @@ from . import task_service from . import request_type -from . import project_task \ No newline at end of file +from . import project_task diff --git a/project_request_data/models/project_task.py b/project_request_data/models/project_task.py index 39c3d5c..89029b5 100644 --- a/project_request_data/models/project_task.py +++ b/project_request_data/models/project_task.py @@ -1,9 +1,8 @@ - from odoo import models, fields class Task(models.Model): _inherit = "project.task" - service_id = fields.Many2one('task.service', string='Service') - request_type_id = fields.Many2one('request.type', string='Request Type') + service_id = fields.Many2one("task.service", string="Service") + request_type_id = fields.Many2one("request.type", string="Request Type") diff --git a/project_request_data/models/request_type.py b/project_request_data/models/request_type.py index affe262..4cbdd7e 100644 --- a/project_request_data/models/request_type.py +++ b/project_request_data/models/request_type.py @@ -5,5 +5,5 @@ class RequestType(models.Model): _name = "request.type" _description = "Request Type" - name = fields.Char('name', required=True) - sequence = fields.Integer() \ No newline at end of file + name = fields.Char("name", required=True) + sequence = fields.Integer() diff --git a/project_request_data/models/task_service.py b/project_request_data/models/task_service.py index f6b164d..e646f93 100644 --- a/project_request_data/models/task_service.py +++ b/project_request_data/models/task_service.py @@ -5,5 +5,5 @@ class TaskService(models.Model): _name = "task.service" _description = "Task service" - name = fields.Char('name', required=True) - sequence = fields.Integer() \ No newline at end of file + name = fields.Char("name", required=True) + sequence = fields.Integer() diff --git a/project_task_billable_hours/__manifest__.py b/project_task_billable_hours/__manifest__.py index c043a61..7aaeb08 100644 --- a/project_task_billable_hours/__manifest__.py +++ b/project_task_billable_hours/__manifest__.py @@ -11,13 +11,9 @@ "category": "Tools", "summary": "In task kanban view, display remaining billable hours instead of remaining hours", "description": "", - "depends": [ - "project", - "hr_timesheet", - "project_working_time_task_portal" - ], + "depends": ["project", "hr_timesheet", "project_working_time_task_portal"], "data": [ - "views/project_task_views.xml", + "views/project_task_views.xml", ], "installable": True, "application": False, diff --git a/project_task_portal_form/__manifest__.py b/project_task_portal_form/__manifest__.py index d19bb9a..123c06e 100644 --- a/project_task_portal_form/__manifest__.py +++ b/project_task_portal_form/__manifest__.py @@ -83,4 +83,4 @@ This module is maintained by Elabore. # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_task_portal_form/controllers/__init__.py b/project_task_portal_form/controllers/__init__.py index c4eb2d8..9d1b668 100644 --- a/project_task_portal_form/controllers/__init__.py +++ b/project_task_portal_form/controllers/__init__.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -from . import portal_task_creation \ No newline at end of file +from . import portal_task_creation diff --git a/project_task_portal_form/controllers/portal_task_creation.py b/project_task_portal_form/controllers/portal_task_creation.py index 4db3d7a..8861c65 100644 --- a/project_task_portal_form/controllers/portal_task_creation.py +++ b/project_task_portal_form/controllers/portal_task_creation.py @@ -11,9 +11,9 @@ class PortalTaskCreation(CustomerPortal): "name", "service_id", "request_type_id", - "small_description", #not in v14 - "access", #not in v14 - "bug_report", #not in v14 + "small_description", # not in v14 + "access", # not in v14 + "bug_report", # not in v14 "priority", ] @@ -26,24 +26,16 @@ class PortalTaskCreation(CustomerPortal): "partner": partner, } return self._get_page_view_values( - partner, - access_token, - values, - "my_task_creation_history", - False, - **kwargs + partner, access_token, values, "my_task_creation_history", False, **kwargs ) def _get_task_priorities(self): priorities = [] - for id, name in request.env['project.task']._fields['priority'].selection: - value = { - "id": id, - "name": name - } + for id, name in request.env["project.task"]._fields["priority"].selection: + value = {"id": id, "name": name} priorities.append(value) return priorities - + @http.route( ["/task/form"], type="http", @@ -51,7 +43,9 @@ class PortalTaskCreation(CustomerPortal): website=True, ) def portal_task_creation(self, access_token=None, redirect=None, **kw): - values = self._taskform_get_page_view_values(request.env.user.partner_id, access_token, **kw) + values = self._taskform_get_page_view_values( + request.env.user.partner_id, access_token, **kw + ) request_types = request.env["request.type"].sudo().search([]) task_services = request.env["task.service"].sudo().search([]) priorities = self._get_task_priorities() @@ -66,7 +60,9 @@ class PortalTaskCreation(CustomerPortal): "error_message": error_message, } ) - return request.render("project_task_portal_form.portal_task_creation_form", values) + return request.render( + "project_task_portal_form.portal_task_creation_form", values + ) def _compute_form_data(self, data): values = {} @@ -78,17 +74,23 @@ class PortalTaskCreation(CustomerPortal): values[field] = data.pop(field) description = "" if values.get("small_description", False): - description = description + "DESCRIPTION:
" + values["small_description"] - del values['small_description'] + description = ( + description + "DESCRIPTION:
" + values["small_description"] + ) + del values["small_description"] if values.get("access", False): - description = description + "

ACCESS:
" + values["access"] - del values['access'] + description = ( + description + "

ACCESS:
" + values["access"] + ) + del values["access"] if values.get("bug_report", False): - description = description + "

BUG REPORT:
" + values["bug_report"] - del values['bug_report'] + description = ( + description + "

BUG REPORT:
" + values["bug_report"] + ) + del values["bug_report"] values["description"] = description - values["attachments"] = request.httprequest.files.getlist("attachment") + values["attachments"] = request.httprequest.files.getlist("attachment") return values @@ -96,7 +98,7 @@ class PortalTaskCreation(CustomerPortal): ["/task/create"], type="http", auth="public", - methods=['POST'], + methods=["POST"], website=True, ) def create_task(self, **kwargs): @@ -107,21 +109,21 @@ class PortalTaskCreation(CustomerPortal): values["partner_id"] = user.partner_id.id values["user_ids"] = [(6, 0, [user.id])] - - files = values.get("attachments", False) - del values['attachments'] + del values["attachments"] # Create task - task_id = request.env["project.task"].sudo().create(values) #use sudo to avoid access error on resource calendar when user_id is set + task_id = ( + request.env["project.task"].sudo().create(values) + ) # use sudo to avoid access error on resource calendar when user_id is set # Add attachments for file in files: attachment_value = { - 'name': file.filename, - 'datas': base64.encodestring(file.read()), - 'res_model': "project.task", - 'res_id': task_id, - } - request.env['ir.attachment'].sudo().create(attachment_value) + "name": file.filename, + "datas": base64.encodestring(file.read()), + "res_model": "project.task", + "res_id": task_id, + } + request.env["ir.attachment"].sudo().create(attachment_value) return request.render("project_task_portal_form.portal_task_created", {}) diff --git a/project_timebox/__manifest__.py b/project_timebox/__manifest__.py index b859f27..02704f0 100644 --- a/project_timebox/__manifest__.py +++ b/project_timebox/__manifest__.py @@ -90,4 +90,4 @@ This module is maintained by Elabore. # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_timebox/models/__init__.py b/project_timebox/models/__init__.py index 31bd870..c5cb68c 100644 --- a/project_timebox/models/__init__.py +++ b/project_timebox/models/__init__.py @@ -1,2 +1,2 @@ from . import timebox -from . import project_task \ No newline at end of file +from . import project_task diff --git a/project_timebox/models/project_task.py b/project_timebox/models/project_task.py index 2e4ef70..bb98a61 100644 --- a/project_timebox/models/project_task.py +++ b/project_timebox/models/project_task.py @@ -1,9 +1,8 @@ - from odoo import models, fields class Task(models.Model): _inherit = "project.task" - timebox_min_id = fields.Many2one('timebox', string='Timebox Min') - timebox_max_id = fields.Many2one('timebox', string='Timebox Max') + timebox_min_id = fields.Many2one("timebox", string="Timebox Min") + timebox_max_id = fields.Many2one("timebox", string="Timebox Max") diff --git a/project_timebox/models/timebox.py b/project_timebox/models/timebox.py index ea9b56e..f751c4e 100644 --- a/project_timebox/models/timebox.py +++ b/project_timebox/models/timebox.py @@ -5,5 +5,5 @@ class Task(models.Model): _name = "timebox" _description = "Timebox" - name = fields.Char('name', required=True) - sequence = fields.Integer() \ No newline at end of file + name = fields.Char("name", required=True) + sequence = fields.Integer() diff --git a/project_usability_misc/__init__.py b/project_usability_misc/__init__.py index 7e99c3a..ba2c3a1 100644 --- a/project_usability_misc/__init__.py +++ b/project_usability_misc/__init__.py @@ -1 +1 @@ -# Empty __init__.py file for the project_usability_misc module. \ No newline at end of file +# Empty __init__.py file for the project_usability_misc module. diff --git a/project_user_default_project/__manifest__.py b/project_user_default_project/__manifest__.py index f8678e3..8b131d4 100644 --- a/project_user_default_project/__manifest__.py +++ b/project_user_default_project/__manifest__.py @@ -62,7 +62,8 @@ This module is maintained by Elabore. """, # any module necessary for this one to work correctly "depends": [ - "base", "project", + "base", + "project", ], "qweb": [ # "static/src/xml/*.xml", @@ -83,4 +84,4 @@ This module is maintained by Elabore. # and independently installed. Used for synergetic or glue modules. "auto_install": False, "application": False, -} \ No newline at end of file +} diff --git a/project_user_default_project/models/__init__.py b/project_user_default_project/models/__init__.py index 073e27b..8835165 100644 --- a/project_user_default_project/models/__init__.py +++ b/project_user_default_project/models/__init__.py @@ -1 +1 @@ -from . import res_users \ No newline at end of file +from . import res_users diff --git a/project_user_default_project/models/res_users.py b/project_user_default_project/models/res_users.py index 42563af..65081e1 100644 --- a/project_user_default_project/models/res_users.py +++ b/project_user_default_project/models/res_users.py @@ -1,6 +1,7 @@ from odoo import _, api, fields, models + class Users(models.Model): _inherit = "res.users" - default_project_id = fields.Many2one('project.project', string='Default Project') \ No newline at end of file + default_project_id = fields.Many2one("project.project", string="Default Project") diff --git a/project_working_time_task_portal/__init__.py b/project_working_time_task_portal/__init__.py index 9a7e03e..0650744 100644 --- a/project_working_time_task_portal/__init__.py +++ b/project_working_time_task_portal/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/project_working_time_task_portal/__manifest__.py b/project_working_time_task_portal/__manifest__.py index a03a72b..9f53bb8 100644 --- a/project_working_time_task_portal/__manifest__.py +++ b/project_working_time_task_portal/__manifest__.py @@ -25,7 +25,7 @@ "data": [ "views/hr_timesheet_portal.xml", "views/hr_timesheet_view_task_form2.xml", - "views/portal_tasks_list.xml" + "views/portal_tasks_list.xml", ], "assets": { "web.assets_frontend": [ diff --git a/project_working_time_task_portal/models/account_analytic_line.py b/project_working_time_task_portal/models/account_analytic_line.py index 6677398..81f49b6 100644 --- a/project_working_time_task_portal/models/account_analytic_line.py +++ b/project_working_time_task_portal/models/account_analytic_line.py @@ -5,9 +5,10 @@ from odoo import models from odoo.osv import expression + class AccountAnalyticLine(models.Model): - _inherit = 'account.analytic.line' + _inherit = "account.analytic.line" def _timesheet_get_portal_domain(self): domain = super()._timesheet_get_portal_domain() - return expression.AND([domain, [('exclude_from_sale_order', '=', False)]]) + return expression.AND([domain, [("exclude_from_sale_order", "=", False)]]) diff --git a/project_working_time_task_portal/models/project_task.py b/project_working_time_task_portal/models/project_task.py index b0c5dfd..c6f5d70 100644 --- a/project_working_time_task_portal/models/project_task.py +++ b/project_working_time_task_portal/models/project_task.py @@ -22,7 +22,7 @@ class Task(models.Model): compute="_compute_billable_remaining_hours", string="Billable Remaining Hours", store=True, - help="Total Billable remaining time (without exclude_from_sale_order timesheet lines), can be re-estimated periodically by the assignee of the task." + help="Total Billable remaining time (without exclude_from_sale_order timesheet lines), can be re-estimated periodically by the assignee of the task.", ) billable_progress = fields.Float( @@ -40,48 +40,83 @@ class Task(models.Model): recursive=True, ) - @api.depends('timesheet_ids.unit_amount') + @api.depends("timesheet_ids.unit_amount") def _compute_billable_effective_hours(self): if not any(self._ids): for task in self: - filtered_timesheets = task.timesheet_ids.filtered(lambda t: not t.exclude_from_sale_order) - task.billable_effective_hours = sum(filtered_timesheets.mapped('unit_amount')) + filtered_timesheets = task.timesheet_ids.filtered( + lambda t: not t.exclude_from_sale_order + ) + task.billable_effective_hours = sum( + filtered_timesheets.mapped("unit_amount") + ) return - - timesheet_read_group = self.env['account.analytic.line'].read_group( - [('task_id', 'in', self.ids), ('exclude_from_sale_order', '=', False)], # We exclude the lines (timesheet) which are excluded from billing - ['unit_amount', 'task_id'], - ['task_id'] + + timesheet_read_group = self.env["account.analytic.line"].read_group( + [ + ("task_id", "in", self.ids), + ("exclude_from_sale_order", "=", False), + ], # We exclude the lines (timesheet) which are excluded from billing + ["unit_amount", "task_id"], + ["task_id"], ) - timesheets_per_task = {res['task_id'][0]: res['unit_amount'] for res in timesheet_read_group} + timesheets_per_task = { + res["task_id"][0]: res["unit_amount"] for res in timesheet_read_group + } for task in self: task.billable_effective_hours = timesheets_per_task.get(task.id, 0.0) - @api.depends('effective_hours','billable_effective_hours') + @api.depends("effective_hours", "billable_effective_hours") def _compute_non_billable_effective_hours(self): for task in self: - task.non_billable_effective_hours = task.effective_hours - task.billable_effective_hours + task.non_billable_effective_hours = ( + task.effective_hours - task.billable_effective_hours + ) - @api.depends('billable_effective_hours', 'subtask_billable_effective_hours', 'planned_hours') + @api.depends( + "billable_effective_hours", "subtask_billable_effective_hours", "planned_hours" + ) def _compute_billable_remaining_hours(self): for task in self: - task.billable_remaining_hours = task.planned_hours - task.billable_effective_hours - task.subtask_billable_effective_hours + task.billable_remaining_hours = ( + task.planned_hours + - task.billable_effective_hours + - task.subtask_billable_effective_hours + ) - - @api.depends('child_ids.billable_effective_hours', 'child_ids.subtask_billable_effective_hours') + @api.depends( + "child_ids.billable_effective_hours", + "child_ids.subtask_billable_effective_hours", + ) def _compute_subtask_billable_effective_hours(self): for task in self: - task.subtask_billable_effective_hours = sum(child_task.billable_effective_hours + child_task.subtask_billable_effective_hours for child_task in task.child_ids) + task.subtask_billable_effective_hours = sum( + child_task.billable_effective_hours + + child_task.subtask_billable_effective_hours + for child_task in task.child_ids + ) - @api.depends('billable_effective_hours', 'subtask_billable_effective_hours', 'planned_hours') + @api.depends( + "billable_effective_hours", "subtask_billable_effective_hours", "planned_hours" + ) def _compute_billable_progress_hours(self): for task in self: - if (task.planned_hours > 0.0): - task_total_hours = task.billable_effective_hours + task.subtask_billable_effective_hours - if float_compare(task_total_hours, task.planned_hours, precision_digits=2) >= 0: + if task.planned_hours > 0.0: + task_total_hours = ( + task.billable_effective_hours + + task.subtask_billable_effective_hours + ) + if ( + float_compare( + task_total_hours, task.planned_hours, precision_digits=2 + ) + >= 0 + ): task.billable_progress = 100 else: - task.billable_progress = round(100.0 * task_total_hours / task.planned_hours, 2) + task.billable_progress = round( + 100.0 * task_total_hours / task.planned_hours, 2 + ) else: - task.billable_progress = 0.0 \ No newline at end of file + task.billable_progress = 0.0