diff --git a/fleet_rest_api/README.rst b/fleet_rest_api/README.rst new file mode 100644 index 00000000..28928b73 --- /dev/null +++ b/fleet_rest_api/README.rst @@ -0,0 +1,93 @@ +============== +Fleet Rest Api +============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffleet-lightgray.png?logo=github + :target: https://github.com/OCA/fleet/tree/14.0/fleet_rest_api + :alt: OCA/fleet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/fleet-14-0/fleet-14-0-fleet_rest_api + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/291/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +TODO + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +TODO + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Escodoo + +Contributors +~~~~~~~~~~~~ + +* Marcel Savegnago + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Escodoo - `https://www.escodoo.com.br `_ + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-marcelsavegnago| image:: https://github.com/marcelsavegnago.png?size=40px + :target: https://github.com/marcelsavegnago + :alt: marcelsavegnago + +Current `maintainer `__: + +|maintainer-marcelsavegnago| + +This module is part of the `OCA/fleet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fleet_rest_api/__init__.py b/fleet_rest_api/__init__.py new file mode 100644 index 00000000..99c82ab1 --- /dev/null +++ b/fleet_rest_api/__init__.py @@ -0,0 +1,3 @@ +from . import controllers +from . import pydantic_models +from . import services diff --git a/fleet_rest_api/__manifest__.py b/fleet_rest_api/__manifest__.py new file mode 100644 index 00000000..642d15a7 --- /dev/null +++ b/fleet_rest_api/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2021 - TODAY, Escodoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Fleet Rest Api", + "summary": """Add a REST API to manage events""", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Escodoo,Odoo Community Association (OCA)", + "maintainers": ["marcelsavegnago"], + "website": "https://github.com/OCA/fleet", + "depends": ["base_rest", "base_rest_pydantic", "fleet"], + "data": [], + "demo": [], + "external_dependencies": { + "python": [ + "pydantic", + ] + }, +} diff --git a/fleet_rest_api/controllers/__init__.py b/fleet_rest_api/controllers/__init__.py new file mode 100644 index 00000000..12a7e529 --- /dev/null +++ b/fleet_rest_api/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/fleet_rest_api/controllers/main.py b/fleet_rest_api/controllers/main.py new file mode 100644 index 00000000..c3eb9482 --- /dev/null +++ b/fleet_rest_api/controllers/main.py @@ -0,0 +1,32 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.base_rest.controllers import main + + +class BaseFleetPublicApiController(main.RestController): + _root_path = "/fleet_rest_api/" + _collection_name = "fleet.rest.services" + _default_auth = "public" + + +# class BaseRestDemoPrivateApiController(main.RestController): +# _root_path = "/base_rest_demo_api/private/" +# _collection_name = "base.rest.demo.private.services" +# _default_auth = "user" +# +# +# class BaseRestDemoNewApiController(main.RestController): +# _root_path = "/base_rest_demo_api/new_api/" +# _collection_name = "base.rest.demo.new_api.services" +# _default_auth = "public" + + +# class BaseRestDemoJwtApiController(main.RestController): +# # JWT Demo Controller, to be used with auth_jwt_demo +# # https://github.com/OCA/server-auth/tree/14.0/auth_jwt_demo +# _root_path = "/base_rest_demo_api/jwt/" +# _collection_name = "base.rest.demo.jwt.services" +# _default_auth = "jwt_demo_keycloak" +# _component_context_provider = "auth_jwt_component_context_provider" +# _default_cors = "*" diff --git a/fleet_rest_api/pydantic_models/__init__.py b/fleet_rest_api/pydantic_models/__init__.py new file mode 100644 index 00000000..d67d1e37 --- /dev/null +++ b/fleet_rest_api/pydantic_models/__init__.py @@ -0,0 +1,16 @@ +from . import fleet_service_type_info +from . import fleet_service_type_search_filter +from . import fleet_vehicle_info +from . import fleet_vehicle_search_filter +from . import fleet_vehicle_state_info +from . import fleet_vehicle_state_search_filter +from . import fleet_vehicle_tag_info +from . import fleet_vehicle_tag_search_filter +from . import fleet_vehicle_odometer_info +from . import fleet_vehicle_odometer_search_filter +from . import fleet_vehicle_log_contract_info +from . import fleet_vehicle_log_contract_search_filter +from . import fleet_vehicle_log_services_info +from . import fleet_vehicle_log_services_search_filter +from . import fleet_vehicle_assignation_log_info +from . import fleet_vehicle_assignation_log_search_filter diff --git a/fleet_rest_api/pydantic_models/fleet_service_type_info.py b/fleet_rest_api/pydantic_models/fleet_service_type_info.py new file mode 100644 index 00000000..a2604947 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_service_type_info.py @@ -0,0 +1,17 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo.addons.pydantic import models, utils + + +class FleetServiceTypeInfo(models.BaseModel): + id: int + name: str + category: str + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_service_type_search_filter.py b/fleet_rest_api/pydantic_models/fleet_service_type_search_filter.py new file mode 100644 index 00000000..ea89dc84 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_service_type_search_filter.py @@ -0,0 +1,11 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.pydantic import models + + +class FleetServiceTypeSearchFilter(models.BaseModel): + + id: int = None + name: str = None + category: str = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_assignation_log_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_assignation_log_info.py new file mode 100644 index 00000000..c0b7f562 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_assignation_log_info.py @@ -0,0 +1,19 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date, datetime + +from odoo.addons.pydantic import models, utils + + +class FleetVehicleAssignationLogInfo(models.BaseModel): + id: int + vehicle_id: int + driver_id: int + date_start: date + date_end: date + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_assignation_log_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_assignation_log_search_filter.py new file mode 100644 index 00000000..b34145a3 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_assignation_log_search_filter.py @@ -0,0 +1,12 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo.addons.pydantic import models + + +class FleetVehicleAssignationLogSearchFilter(models.BaseModel): + + id: int = None + vehicle_id: int = None + driver_id: int = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_info.py new file mode 100644 index 00000000..b35e1959 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_info.py @@ -0,0 +1,75 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date, datetime +from typing import List + +import pydantic + +from odoo.addons.pydantic import models, utils + +from .fleet_vehicle_assignation_log_info import FleetVehicleAssignationLogInfo +from .fleet_vehicle_log_contract_info import FleetVehicleLogContractInfo +from .fleet_vehicle_log_services_info import FleetVehicleLogServicesInfo +from .fleet_vehicle_state_info import FleetVehicleStateInfo +from .fleet_vehicle_tag_info import FleetVehicleTagInfo + + +class FleetVehicleInfo(models.BaseModel): + id: int + name: str + description: str + active: bool + company_id: int + currency_id: int + license_plate: str + vin_sn: str + driver_id: int + future_driver_id: int + model_id: int + manager_id: int + brand_id: int + log_drivers: List[FleetVehicleAssignationLogInfo] = pydantic.Field( + [], alias="log_drivers" + ) + log_services: List[FleetVehicleLogServicesInfo] = pydantic.Field( + [], alias="log_services" + ) + log_contracts: List[FleetVehicleLogContractInfo] = pydantic.Field( + [], alias="log_contracts" + ) + contract_count: int + service_count: int + odometer_count: int + history_count: int + next_assignation_date: date + acquisition_date: date + first_contract_date: date + color: str + state: FleetVehicleStateInfo = pydantic.Field(None, alias="state_id") + location: str + seats: int + model_year: str + tag_ids: List[FleetVehicleTagInfo] = pydantic.Field([], alias="tag_ids") + odometer: float + odometer_unit: str + transmission: str + fuel_type: str + horsepower: int + horsepower_tax: float + power: int + co2: float + contract_renewal_due_soon: bool + contract_renewal_overdue: bool + contract_renewal_name: str + contract_renewal_total: str + car_value: float + net_car_value: float + residual_value: float + plan_to_change_car: bool + vehicle_type: str + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_log_contract_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_log_contract_info.py new file mode 100644 index 00000000..05dfb7e8 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_log_contract_info.py @@ -0,0 +1,40 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date, datetime +from typing import List + +import pydantic + +from odoo.addons.pydantic import models, utils + +from .fleet_service_type_info import FleetServiceTypeInfo + + +class FleetVehicleLogContractInfo(models.BaseModel): + id: int + name: str + active: bool + vehicle_id: int + cost_subtype_id: int + amount: float + date: date + company_id: int + currency_id: int + user_id: int + start_date: date + expiration_date: date + days_left: int + insurer_id: int + purchaser_id: int + ins_ref: str + state: str + notes: str + cost_generated: float + cost_frequency: str + services_ids: List[FleetServiceTypeInfo] = pydantic.Field([], alias="service_ids") + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_log_contract_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_log_contract_search_filter.py new file mode 100644 index 00000000..61d2869f --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_log_contract_search_filter.py @@ -0,0 +1,12 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.pydantic import models + + +class FleetVehicleLogContractSearchFilter(models.BaseModel): + + id: int = None + name: str = None + vehicle_id: int = None + user_id: int = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_log_services_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_log_services_info.py new file mode 100644 index 00000000..fcc94a60 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_log_services_info.py @@ -0,0 +1,31 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date, datetime + +from odoo.addons.pydantic import models, utils + + +class FleetVehicleLogServicesInfo(models.BaseModel): + id: int + active: bool + vehicle_id: int + amount: float + description: str + odometer_id: int + odometer: float + odometer_unit: str + date: date + company_id: int + currency_id: int + purchaser_id: int + inv_ref: str + vendor_id: int + notes: str + service_type_id: int + state: str + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_log_services_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_log_services_search_filter.py new file mode 100644 index 00000000..b5c971d4 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_log_services_search_filter.py @@ -0,0 +1,14 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.pydantic import models + + +class FleetVehicleLogServicesSearchFilter(models.BaseModel): + + id: int = None + service_type_id: int = None + vehicle_id: int = None + purchaser_id: int = None + vendor_id: int = None + state: str = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_odometer_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_odometer_info.py new file mode 100644 index 00000000..6b46f453 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_odometer_info.py @@ -0,0 +1,21 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo.addons.pydantic import models, utils + + +class FleetVehicleOdometerInfo(models.BaseModel): + id: int + name: str + value: float + vehicle_id: int + unit: str + driver_id: int + sequence: int = None + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_odometer_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_odometer_search_filter.py new file mode 100644 index 00000000..92e06726 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_odometer_search_filter.py @@ -0,0 +1,12 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.pydantic import models + + +class FleetVehicleOdometerSearchFilter(models.BaseModel): + + id: int = None + name: str = None + vehicle_id: int = None + driver_id: int = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_search_filter.py new file mode 100644 index 00000000..7a10d247 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_search_filter.py @@ -0,0 +1,13 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.pydantic import models + + +class FleetVehicleSearchFilter(models.BaseModel): + + id: int = None + name: str = None + stage_ids: List[int] = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_state_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_state_info.py new file mode 100644 index 00000000..c1a4aa72 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_state_info.py @@ -0,0 +1,17 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo.addons.pydantic import models, utils + + +class FleetVehicleStateInfo(models.BaseModel): + id: int + name: str + sequence: int = None + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_state_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_state_search_filter.py new file mode 100644 index 00000000..9b071070 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_state_search_filter.py @@ -0,0 +1,10 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.pydantic import models + + +class FleetVehicleStateSearchFilter(models.BaseModel): + + id: int = None + name: str = None diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_tag_info.py b/fleet_rest_api/pydantic_models/fleet_vehicle_tag_info.py new file mode 100644 index 00000000..df867195 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_tag_info.py @@ -0,0 +1,17 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo.addons.pydantic import models, utils + + +class FleetVehicleTagInfo(models.BaseModel): + id: int + name: str + color: int + write_date: datetime + + class Config: + orm_mode = True + getter_dict = utils.GenericOdooGetter diff --git a/fleet_rest_api/pydantic_models/fleet_vehicle_tag_search_filter.py b/fleet_rest_api/pydantic_models/fleet_vehicle_tag_search_filter.py new file mode 100644 index 00000000..73fb8b96 --- /dev/null +++ b/fleet_rest_api/pydantic_models/fleet_vehicle_tag_search_filter.py @@ -0,0 +1,10 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.addons.pydantic import models + + +class FleetVehicleTagSearchFilter(models.BaseModel): + + id: int = None + name: str = None diff --git a/fleet_rest_api/readme/CONTRIBUTORS.rst b/fleet_rest_api/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..61f9287b --- /dev/null +++ b/fleet_rest_api/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Marcel Savegnago diff --git a/fleet_rest_api/readme/CREDITS.rst b/fleet_rest_api/readme/CREDITS.rst new file mode 100644 index 00000000..7762abc8 --- /dev/null +++ b/fleet_rest_api/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Escodoo - `https://www.escodoo.com.br `_ diff --git a/fleet_rest_api/readme/DESCRIPTION.rst b/fleet_rest_api/readme/DESCRIPTION.rst new file mode 100644 index 00000000..1333ed77 --- /dev/null +++ b/fleet_rest_api/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +TODO diff --git a/fleet_rest_api/readme/USAGE.rst b/fleet_rest_api/readme/USAGE.rst new file mode 100644 index 00000000..1333ed77 --- /dev/null +++ b/fleet_rest_api/readme/USAGE.rst @@ -0,0 +1 @@ +TODO diff --git a/fleet_rest_api/services/__init__.py b/fleet_rest_api/services/__init__.py new file mode 100644 index 00000000..9e6eb2d4 --- /dev/null +++ b/fleet_rest_api/services/__init__.py @@ -0,0 +1,9 @@ +from . import service +from . import fleet_service_type +from . import fleet_vehicle +from . import fleet_vehicle_state +from . import fleet_vehicle_tag +from . import fleet_vehicle_odometer +from . import fleet_vehicle_log_contract +from . import fleet_vehicle_log_services +from . import fleet_vehicle_assignation_log diff --git a/fleet_rest_api/services/fleet_service_type.py b/fleet_rest_api/services/fleet_service_type.py new file mode 100644 index 00000000..fb277dd7 --- /dev/null +++ b/fleet_rest_api/services/fleet_service_type.py @@ -0,0 +1,54 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_service_type_info import FleetServiceTypeInfo +from ..pydantic_models.fleet_service_type_search_filter import ( + FleetServiceTypeSearchFilter, +) + + +class FleetServiceTypeService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.service.type.rest.service" + _usage = "service_type" + _expose_model = "fleet.service.type" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetServiceTypeInfo), + auth="public", + ) + def get(self, _id: int) -> FleetServiceTypeInfo: + fleet_tag = self._get(_id) + return FleetServiceTypeInfo.from_orm(fleet_tag) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.name: + domain.append(("name", "like", filters.name)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetServiceTypeSearchFilter), + output_param=PydanticModelList(FleetServiceTypeInfo), + auth="public", + ) + def search( + self, fleet_service_type_search_filter: FleetServiceTypeSearchFilter + ) -> List[FleetServiceTypeInfo]: + domain = self._get_search_domain(fleet_service_type_search_filter) + res: List[FleetServiceTypeInfo] = [] + for e in self.env["fleet.service.type"].sudo().search(domain): + res.append(FleetServiceTypeInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle.py b/fleet_rest_api/services/fleet_vehicle.py new file mode 100644 index 00000000..f6708406 --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle.py @@ -0,0 +1,52 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_info import FleetVehicleInfo +from ..pydantic_models.fleet_vehicle_search_filter import FleetVehicleSearchFilter + + +class FleetVehicleService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.rest.service" + _usage = "vehicle" + _expose_model = "fleet.vehicle" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleInfo: + fleet_vehicle = self._get(_id) + return FleetVehicleInfo.from_orm(fleet_vehicle) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.name: + domain.append(("name", "like", filters.name)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleSearchFilter), + output_param=PydanticModelList(FleetVehicleInfo), + auth="public", + ) + def search( + self, fleet_vehicle_search_filter: FleetVehicleSearchFilter + ) -> List[FleetVehicleInfo]: + domain = self._get_search_domain(fleet_vehicle_search_filter) + res: List[FleetVehicleInfo] = [] + for e in self.env["fleet.vehicle"].sudo().search(domain): + res.append(FleetVehicleInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle_assignation_log.py b/fleet_rest_api/services/fleet_vehicle_assignation_log.py new file mode 100644 index 00000000..74264e9d --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle_assignation_log.py @@ -0,0 +1,59 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_assignation_log_info import ( + FleetVehicleAssignationLogInfo, +) +from ..pydantic_models.fleet_vehicle_assignation_log_search_filter import ( + FleetVehicleAssignationLogSearchFilter, +) + + +class FleetVehicleAssignationLogService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.assignation.log.rest.service" + _usage = "vehicle_assignation_log" + _expose_model = "fleet.vehicle.assignation.log" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleAssignationLogInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleAssignationLogInfo: + fleet_vehicle_assignation_log = self._get(_id) + return FleetVehicleAssignationLogInfo.from_orm(fleet_vehicle_assignation_log) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.vehicle_id: + domain.append(("vehicle_id", "=", filters.vehicle_id)) + if filters.driver_id: + domain.append(("driver_id", "=", filters.driver_id)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleAssignationLogSearchFilter), + output_param=PydanticModelList(FleetVehicleAssignationLogInfo), + auth="public", + ) + def search( + self, + fleet_vehicle_assignation_log_search_filter: FleetVehicleAssignationLogSearchFilter, + ) -> List[FleetVehicleAssignationLogInfo]: + domain = self._get_search_domain(fleet_vehicle_assignation_log_search_filter) + res: List[FleetVehicleAssignationLogInfo] = [] + for e in self.env["fleet.vehicle.assignation.log"].sudo().search(domain): + res.append(FleetVehicleAssignationLogInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle_log_contract.py b/fleet_rest_api/services/fleet_vehicle_log_contract.py new file mode 100644 index 00000000..641ebb8e --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle_log_contract.py @@ -0,0 +1,61 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_log_contract_info import ( + FleetVehicleLogContractInfo, +) +from ..pydantic_models.fleet_vehicle_log_contract_search_filter import ( + FleetVehicleLogContractSearchFilter, +) + + +class FleetVehicleLogContractService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.log.contract.rest.service" + _usage = "vehicle_log_contract" + _expose_model = "fleet.vehicle.log.contract" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleLogContractInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleLogContractInfo: + fleet_vehicle_log_contract = self._get(_id) + return FleetVehicleLogContractInfo.from_orm(fleet_vehicle_log_contract) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.name: + domain.append(("name", "like", filters.name)) + if filters.vehicle_id: + domain.append(("vehicle_id", "=", filters.vehicle_id)) + if filters.user_id: + domain.append(("user_id", "=", filters.user_id)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleLogContractSearchFilter), + output_param=PydanticModelList(FleetVehicleLogContractInfo), + auth="public", + ) + def search( + self, + fleet_vehicle_log_contract_search_filter: FleetVehicleLogContractSearchFilter, + ) -> List[FleetVehicleLogContractInfo]: + domain = self._get_search_domain(fleet_vehicle_log_contract_search_filter) + res: List[FleetVehicleLogContractInfo] = [] + for e in self.env["fleet.vehicle.log.contract"].sudo().search(domain): + res.append(FleetVehicleLogContractInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle_log_services.py b/fleet_rest_api/services/fleet_vehicle_log_services.py new file mode 100644 index 00000000..cc133758 --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle_log_services.py @@ -0,0 +1,65 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_log_services_info import ( + FleetVehicleLogServicesInfo, +) +from ..pydantic_models.fleet_vehicle_log_services_search_filter import ( + FleetVehicleLogServicesSearchFilter, +) + + +class FleetVehicleLogServicesService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.log.services.rest.service" + _usage = "vehicle_log_services" + _expose_model = "fleet.vehicle.log.services" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleLogServicesInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleLogServicesInfo: + fleet_vehicle_log_services = self._get(_id) + return FleetVehicleLogServicesInfo.from_orm(fleet_vehicle_log_services) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.service_type_id: + domain.append(("service_type_id", "=", filters.service_type_id)) + if filters.vehicle_id: + domain.append(("vehicle_id", "=", filters.vehicle_id)) + if filters.purchaser_id: + domain.append(("purchaser_id", "=", filters.purchaser_id)) + if filters.vendor_id: + domain.append(("vendor_id", "=", filters.vendor_id)) + if filters.state: + domain.append(("state", "=", filters.state)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleLogServicesSearchFilter), + output_param=PydanticModelList(FleetVehicleLogServicesInfo), + auth="public", + ) + def search( + self, + fleet_vehicle_log_services_search_filter: FleetVehicleLogServicesSearchFilter, + ) -> List[FleetVehicleLogServicesInfo]: + domain = self._get_search_domain(fleet_vehicle_log_services_search_filter) + res: List[FleetVehicleLogServicesInfo] = [] + for e in self.env["fleet.vehicle.log.services"].sudo().search(domain): + res.append(FleetVehicleLogServicesInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle_odometer.py b/fleet_rest_api/services/fleet_vehicle_odometer.py new file mode 100644 index 00000000..7aa328cd --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle_odometer.py @@ -0,0 +1,58 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_odometer_info import FleetVehicleOdometerInfo +from ..pydantic_models.fleet_vehicle_odometer_search_filter import ( + FleetVehicleOdometerSearchFilter, +) + + +class FleetVehicleOdometerService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.odometer.rest.service" + _usage = "vehicle_odometer" + _expose_model = "fleet.vehicle.odometer" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleOdometerInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleOdometerInfo: + fleet_vehicle_odometer = self._get(_id) + return FleetVehicleOdometerInfo.from_orm(fleet_vehicle_odometer) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.name: + domain.append(("name", "like", filters.name)) + if filters.vehicle_id: + domain.append(("vehicle_id", "=", filters.vehicle_id)) + if filters.driver_id: + domain.append(("driver_id", "=", filters.driver_id)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleOdometerSearchFilter), + output_param=PydanticModelList(FleetVehicleOdometerInfo), + auth="public", + ) + def search( + self, fleet_vehicle_odometer_search_filter: FleetVehicleOdometerSearchFilter + ) -> List[FleetVehicleOdometerInfo]: + domain = self._get_search_domain(fleet_vehicle_odometer_search_filter) + res: List[FleetVehicleOdometerInfo] = [] + for e in self.env["fleet.vehicle.odometer"].sudo().search(domain): + res.append(FleetVehicleOdometerInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle_state.py b/fleet_rest_api/services/fleet_vehicle_state.py new file mode 100644 index 00000000..17dcec40 --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle_state.py @@ -0,0 +1,54 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_state_info import FleetVehicleStateInfo +from ..pydantic_models.fleet_vehicle_state_search_filter import ( + FleetVehicleStateSearchFilter, +) + + +class FleetVehicleStateService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.state.rest.service" + _usage = "vehicle_state" + _expose_model = "fleet.vehicle.state" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleStateInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleStateInfo: + fleet_vehicle_state = self._get(_id) + return FleetVehicleStateInfo.from_orm(fleet_vehicle_state) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.name: + domain.append(("name", "like", filters.name)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleStateSearchFilter), + output_param=PydanticModelList(FleetVehicleStateInfo), + auth="public", + ) + def search( + self, fleet_vehicle_state_search_filter: FleetVehicleStateSearchFilter + ) -> List[FleetVehicleStateInfo]: + domain = self._get_search_domain(fleet_vehicle_state_search_filter) + res: List[FleetVehicleStateInfo] = [] + for e in self.env["fleet.vehicle.state"].sudo().search(domain): + res.append(FleetVehicleStateInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/fleet_vehicle_tag.py b/fleet_rest_api/services/fleet_vehicle_tag.py new file mode 100644 index 00000000..95d5ecbb --- /dev/null +++ b/fleet_rest_api/services/fleet_vehicle_tag.py @@ -0,0 +1,54 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from typing import List + +from odoo.addons.base_rest import restapi +from odoo.addons.base_rest_pydantic.restapi import PydanticModel, PydanticModelList +from odoo.addons.component.core import Component + +from ..pydantic_models.fleet_vehicle_tag_info import FleetVehicleTagInfo +from ..pydantic_models.fleet_vehicle_tag_search_filter import ( + FleetVehicleTagSearchFilter, +) + + +class FleetVehicleTagService(Component): + _inherit = "base.fleet.rest.service" + _name = "fleet.vehicle.tag.rest.service" + _usage = "vehicle_tag" + _expose_model = "fleet.vehicle.tag" + _collection = "fleet.rest.services" + _description = __doc__ + + @restapi.method( + routes=[(["/"], "GET")], + output_param=PydanticModel(FleetVehicleTagInfo), + auth="public", + ) + def get(self, _id: int) -> FleetVehicleTagInfo: + fleet_vehicle_tag = self._get(_id) + return FleetVehicleTagInfo.from_orm(fleet_vehicle_tag) + + def _get_search_domain(self, filters): + domain = [] + if filters.id: + domain.append(("id", "=", filters.id)) + if filters.name: + domain.append(("name", "like", filters.name)) + return domain + + @restapi.method( + routes=[(["/", "/search"], "GET")], + input_param=PydanticModel(FleetVehicleTagSearchFilter), + output_param=PydanticModelList(FleetVehicleTagInfo), + auth="public", + ) + def search( + self, fleet_vehicle_tag_search_filter: FleetVehicleTagSearchFilter + ) -> List[FleetVehicleTagInfo]: + domain = self._get_search_domain(fleet_vehicle_tag_search_filter) + res: List[FleetVehicleTagInfo] = [] + for e in self.env["fleet.vehicle.tag"].sudo().search(domain): + res.append(FleetVehicleTagInfo.from_orm(e)) + return res diff --git a/fleet_rest_api/services/service.py b/fleet_rest_api/services/service.py new file mode 100644 index 00000000..dcb61b4f --- /dev/null +++ b/fleet_rest_api/services/service.py @@ -0,0 +1,24 @@ +# Copyright 2021 - TODAY, Marcel Savegnago +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _ +from odoo.exceptions import MissingError + +from odoo.addons.component.core import AbstractComponent + + +class BaseFleetService(AbstractComponent): + _inherit = "base.rest.service" + _name = "base.fleet.rest.service" + _collection = "fleet.rest.services" + _expose_model = None + + def _get(self, _id): + domain = [("id", "=", _id)] + record = self.env[self._expose_model].search(domain) + if not record: + raise MissingError( + _("The record %s %s does not exist") % (self._expose_model, _id) + ) + else: + return record diff --git a/fleet_rest_api/static/description/icon.png b/fleet_rest_api/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/fleet_rest_api/static/description/icon.png differ diff --git a/fleet_rest_api/static/description/index.html b/fleet_rest_api/static/description/index.html new file mode 100644 index 00000000..0ef96f3b --- /dev/null +++ b/fleet_rest_api/static/description/index.html @@ -0,0 +1,434 @@ + + + + + + +Fleet Rest Api + + + +
+

Fleet Rest Api

+ + +

Beta License: AGPL-3 OCA/fleet Translate me on Weblate Try me on Runbot

+

TODO

+

Table of contents

+ +
+

Usage

+

TODO

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Escodoo
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

marcelsavegnago

+

This module is part of the OCA/fleet project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/oca_dependencies.txt b/oca_dependencies.txt index ca3c726b..b2e375a1 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -1 +1,2 @@ # See https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#oca_dependencies-txt +rest-framework https://github.com/acsone/rest-framework 14.0-base-rest-pydantic-lmi diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..e582a798 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +# generated from manifests external_dependencies +pydantic diff --git a/setup/fleet_rest_api/odoo/addons/fleet_rest_api b/setup/fleet_rest_api/odoo/addons/fleet_rest_api new file mode 120000 index 00000000..74b1d14d --- /dev/null +++ b/setup/fleet_rest_api/odoo/addons/fleet_rest_api @@ -0,0 +1 @@ +../../../../fleet_rest_api \ No newline at end of file diff --git a/setup/fleet_rest_api/setup.py b/setup/fleet_rest_api/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/fleet_rest_api/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)