open-synergy/opensynid-fleet

View on GitHub
fleet_work_order_passanger/wizards/passanger_boarding_disembark.py

Summary

Maintainability
D
2 days
Test Coverage
# Copyright 2016 OpenSynergy Indonesia
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from openerp import api, fields, models


class PassangerBoardingDisembark(models.TransientModel):
    _name = "fleet.passanger_boarding_disembark"
    _description = "Passanger Boarding/Disembark"

    work_order_id = fields.Many2one(
        string="# Work Order", comodel_name="fleet.work.order"
    )

    @api.model
    def _default_device_id(self):
        result = False
        obj_fleet_work_order = self.env["fleet.work.order"]
        work_order_id = self._context.get("default_work_order_id", False)

        if work_order_id:

            criteria = [("id", "=", work_order_id)]

            work_order = obj_fleet_work_order.search(criteria)
            if work_order:
                vehicle = work_order.vehicle_id
            if vehicle:
                door = vehicle.door_ids[0]
                if door:
                    raspberry_relay = door.raspberry_relay_id
                    if raspberry_relay:
                        result = raspberry_relay.device_id
        return result

    passanger_code = fields.Char(
        string="# Passanger",
        default=False,
    )
    device_raspberry_id = fields.Many2one(
        string="# Device",
        comodel_name="proxy.backend_device",
        default=_default_device_id,
    )

    @api.model
    def _default_channel(self):
        result = False
        obj_fleet_work_order = self.env["fleet.work.order"]
        work_order_id = self._context.get("default_work_order_id", False)

        if work_order_id:

            criteria = [("id", "=", work_order_id)]

            work_order = obj_fleet_work_order.search(criteria)
            if work_order:
                vehicle = work_order.vehicle_id
            if vehicle:
                door = vehicle.door_ids[0]
                if door:
                    raspberry_relay = door.raspberry_relay_id
                    if raspberry_relay:
                        result = raspberry_relay.pin
        return result

    channel = fields.Integer(string="Channel", default=_default_channel)

    @api.onchange("passanger_code")
    def onchange_passanger(self):
        obj_passanger = self.env["fleet.work_order_passanger"]
        warning = {}
        domain = []
        if self.passanger_code:
            domain = self._prepare_domain()
            passangers = obj_passanger.search(domain)
            if len(passangers) == 1:
                warning = {"title": "A", "message": "B"}
                passanger = passangers[0]
                self.passanger_code = ""
                warning.update(
                    {
                        "action": self._open_door_gpio(passanger),
                    }
                )
            else:
                self.passanger_code = ""

        return {"warning": warning}

    @api.multi
    def _open_door_gpio(self, passanger):
        self.ensure_one()
        action = self.env.ref(
            "proxy_backend_gpio." "proxy_backend_raspberry_relay_on_off_timer_action"
        )
        context = {
            "device_id": self.device_raspberry_id.id,
            "pin": self.channel,
            "interval": 1,
        }

        if passanger.state in ["valid", "disembarking"]:
            passanger.write({"state": "boarding"})
        elif passanger.state == "boarding":
            passanger.write({"state": "disembarking"})

        result = action.read()[0]
        result.update({"context": context})
        return result

    @api.multi
    def _reload_action(self):
        self.ensure_one()
        wiz = self.env.ref(
            "fleet_work_order_passanger." "fleet_passanger_boarding_disembark_action"
        )
        return wiz.read()[0]

    @api.multi
    def _prepare_domain(self):
        self.ensure_one()
        return [
            ("name", "=", self.passanger_code),
            ("work_order_id", "=", self.work_order_id.id),
        ]

    @api.multi
    def action_clear_barcode(self):
        self.ensure_one()
        self.passanger_code = False
        return self._reload_action()