shopinvader/odoo-shopinvader

View on GitHub
shopinvader/controllers/main.py

Summary

Maintainability
A
35 mins
Test Coverage
# -*- coding: utf-8 -*-
# Copyright 2016 Akretion (http://www.akretion.com)
# Sébastien BEAU <sebastien.beau@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

import logging

from odoo import _
from odoo.exceptions import MissingError
from odoo.http import request, route

from odoo.addons.base_rest.controllers import main

_logger = logging.getLogger(__name__)


class InvaderController(main.RestController):

    _root_path = "/shopinvader/"
    _collection_name = "shopinvader.backend"
    _default_auth = "api_key"

    @route(["/shopinvader/<service>/<int:_id>/download"], methods=["GET"])
    def service_download(self, service, _id=None, **params):
        params["id"] = _id
        return self._process_method(
            service, "download", _id=_id, params=params
        )

    @classmethod
    def _get_partner_from_headers(cls, headers):
        partner_model = request.env["shopinvader.partner"]
        partner_email = headers.get("HTTP_PARTNER_EMAIL")
        backend = cls._get_shopinvader_backend_from_request()
        if partner_email:
            partner_domain = [
                ("partner_email", "=", partner_email),
                ("backend_id", "=", backend.id),
            ]
            partner = partner_model.search(partner_domain)
            if len(partner) == 1:
                return partner.record_id
            else:
                _logger.warning("Wrong HTTP_PARTNER_EMAIL, header ignored")
                if len(partner) > 1:
                    _logger.warning(
                        "More than one shopinvader.partner found for domain:"
                        " %s",
                        partner_domain,
                    )
                # Could be because the email is not related to a partner or
                # because the partner is inactive
                raise MissingError(_("The given partner is not found!"))
        return partner_model.browse([]).record_id

    @classmethod
    def _get_shopinvader_backend_from_request(cls):
        backend_model = request.env["shopinvader.backend"]
        return backend_model._get_from_http_request()

    @classmethod
    def _get_shopinvader_session_from_headers(cls, headers):
        # HTTP_SESS are data that are store in the shopinvader session
        # and forwarded to odoo at each request
        # it allow to access to some specific field of the user session
        # By security always force typing
        # Note: rails cookies store session are serveless ;)
        return {"cart_id": int(headers.get("HTTP_SESS_CART_ID", 0))}

    def _get_component_context(self):
        """
        This method adds the component context:
        * the partner
        * the cart_id
        * the shopinvader_backend
        """
        res = super(InvaderController, self)._get_component_context()
        headers = request.httprequest.environ
        res["partner"] = self._get_partner_from_headers(headers)
        res[
            "shopinvader_session"
        ] = self._get_shopinvader_session_from_headers(headers)
        res[
            "shopinvader_backend"
        ] = self._get_shopinvader_backend_from_request()
        return res