Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 69faf1327eb3554fa4b043c682de816a0e46b4a6
  • 14.0 par défaut
  • 13.0
  • 12.0 protégée
4 résultats

cgscop_timesheet_print_wizard.py

Blame
  • main.py 9,58 Kio
    # Copyright 2021- Le Filament (https://le-filament.com)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
    import werkzeug
    
    from odoo import _, http
    from odoo.exceptions import AccessError
    from odoo.http import request
    
    from odoo.addons.oacc_portal.controllers.main import CustomerPortal as CustomerPortal
    
    
    class CustomerPortal(CustomerPortal):
        def _get_data_date(self, is_data_cdc, operation=None, partner_id=None):
            vals = {}
            # Si des données existent, récupérer les dates min/max/début/fin
            # de l'opération
            if is_data_cdc:
                vals["data_values"] = operation._get_values_init_graph(partner_id)
    
            else:
                vals["data_values"] = {
                    "date_day_start": False,
                    "date_day_end": False,
                    "date_week_start": False,
                    "date_week_end": False,
                    "date_month_start": False,
                    "date_month_end": False,
                    "date_year_start": False,
                    "date_year_end": False,
                }
    
            vals["data_values"].update(operation.get_date_min_max(partner_id))
    
            return vals
    
        @http.route(
            ['/operation/<model("acc.operation"):operation>/pmo'],
            type="http",
            auth="user",
            website=True,
        )
        def pmo(self, operation, **kw):
            render_values = {}
            render_values.update(self._get_role(operation))
            render_values.update(
                self._get_data_date(render_values.get("isDataCdc"), operation)
            )
    
            render_values.update(
                {
                    "page_name": "pmo-view",
                    "page_breadcrumbs": "Vue globale",
                    "scale": "month",
                }
            )
    
            return request.render("oacc_portal_overview_cdc.operation_pmo", render_values)
    
        @http.route(
            ['/operation/<model("acc.operation"):operation>/consumer'],
            type="http",
            auth="user",
            website=True,
        )
        def consumer(self, operation, **kw):
            render_values = {}
            render_values.update(self._get_role(operation))
            partner_ids = []
            if (
                render_values.get("isAdmin")
                or render_values.get("isSuperAdmin")
                or render_values.get("isPmo")
            ):
                render_values.update(
                    self._get_data_date(render_values.get("isDataCdc"), operation)
                )
                partner_ids = operation.acc_delivery_period_ids.mapped("partner_id").sorted(
                    key=lambda p: p.name
                )
            elif render_values.get("isConsumer"):
                render_values.update(
                    self._get_data_date(
                        render_values.get("isDataCdc"),
                        operation,
                        request.env.user.commercial_partner_id.id,
                    )
                )
                partner_ids = request.env.user.commercial_partner_id
    
            render_values.update(
                {
                    "partners": partner_ids,
                    "page_name": "conso",
                    "page_breadcrumbs": "Suivi consommation",
                    "scale": "month",
                }
            )
    
            return request.render(
                "oacc_portal_overview_cdc.operation_consumer", render_values
            )
    
        @http.route(
            [
                '/operation/<model("acc.operation"):operation>/productor',
            ],
            type="http",
            auth="user",
            website=True,
        )
        def productor(self, operation, **kw):
            render_values = {}
            render_values.update(self._get_role(operation))
            partner_ids = []
            if (
                render_values.get("isAdmin")
                or render_values.get("isSuperAdmin")
                or render_values.get("isPmo")
            ):
                render_values.update(
                    self._get_data_date(render_values.get("isDataCdc"), operation)
                )
                partner_ids = operation.acc_injection_period_ids.mapped(
                    "partner_id"
                ).sorted(key=lambda p: p.name)
            elif render_values.get("isProductor"):
                render_values.update(
                    self._get_data_date(
                        render_values.get("isDataCdc"),
                        operation,
                        request.env.user.commercial_partner_id.id,
                    )
                )
                partner_ids = request.env.user.commercial_partner_id
    
            render_values.update(
                {
                    "partners": partner_ids,
                    "page_name": "prod",
                    "page_breadcrumbs": "Suivi production",
                    "scale": "month",
                }
            )
    
            return request.render(
                "oacc_portal_overview_cdc.operation_productor", render_values
            )
    
        @http.route(
            ["/chart/update_json"],
            type="json",
            auth="user",
            methods=["POST"],
            website=True,
            csrf=False,
        )
        def chart_update_json(
            self,
            operation_id,
            partner_id=None,
            prm_id=None,
            start_date=None,
            end_date=None,
            data_type=None,
            graph_type="histo",
            **kw,
        ):
            """
            This route is called :
                - When click on button period
                - When click on a consumer, a productor or a PRM
                - When click on date range
            """
            operation = request.env["acc.operation"].browse(operation_id)
            try:
                roles = self._get_role(operation)
            except AccessError as e:
                raise werkzeug.exceptions.abort(
                    werkzeug.wrappers.Response(status=401)
                ) from e
            # Si l'opération n'a pas de courbes on renvoie une erreur 401
            # Si l'utilisateur n'est pas soit superAdmin, soit Admin, soit Pmo,
            # 1. si prm_id est passé il doit aussi y avoir un partner_id
            # 2. il faut vérifier qu'il est bien autorisé à accéder au partner_id
            # si passé en paramètre
            # sinon on renvoie une erreur 401
            # (on ne vérifie pas qu'il ait bien accès au prm, aucune donnée ne sera renvoyée
            # si les courbes du prm demandées n'appartiennent pas à ce partner)
            if not roles.get("isDataCdc") or (
                not roles.get("isSuperAdmin")
                and not roles.get("isAdmin")
                and not roles.get("isPmo")
                and (prm_id or partner_id)
                and (
                    (prm_id and not partner_id)
                    or (
                        partner_id
                        and partner_id != request.env.user.commercial_partner_id.id
                    )
                )
            ):
                raise werkzeug.exceptions.abort(werkzeug.wrappers.Response(status=401))
            vals = operation.get_graph(
                start_date, end_date, partner_id, prm_id, data_type, graph_type
            )
    
            return vals
    
        @http.route(
            ["/chart/export_cdc"],
            type="http",
            auth="user",
            methods=["GET"],
            website=True,
            csrf=False,
        )
        def chart_export_cdc(
            self,
            operation_id=None,
            partner_id=None,
            prm_id=None,
            start_date=None,
            end_date=None,
            data_type=None,
            **kw,
        ):
            """
            This route is called :
                - When click on button export
            """
            operation = request.env["acc.operation"].sudo().browse(int(operation_id))
            try:
                if (
                    request.env.user.commercial_partner_id.id
                    not in operation.partner_role_ids.partner_id.ids
                    and not request.env.user.has_group("oacc.group_operation_superadmin")
                ):
                    raise AccessError(_("You are not allowed to access this operation"))
                roles = self._get_role(operation)
    
            except AccessError as e:
                raise werkzeug.exceptions.abort(
                    werkzeug.wrappers.Response(status=401)
                ) from e
    
            # Si l'opération n'a pas de courbes on renvoie une erreur 401
            # Si l'utilisateur n'est pas soit superAdmin, soit Admin, soit Pmo,
            # 1. le partner_id est obligatoire
            # 2. il faut vérifier qu'il est bien autorisé à accéder au partner_id
            # 3. il faut vérifier que le PRM correspond bien à une période de ce partner_id
            # sur l'opération
            # sinon on renvoie une erreur 401
            # (on ne vérifie pas qu'il ait bien accès au prm, aucune donnée ne sera renvoyée
            # si les courbes du prm demandées n'appartiennent pas à ce partner)
            if not roles.get("isDataCdc") or (
                not roles.get("isSuperAdmin")
                and not roles.get("isAdmin")
                and not roles.get("isPmo")
                and (
                    not partner_id
                    or (
                        partner_id
                        and int(partner_id) != request.env.user.commercial_partner_id.id
                    )
                    or (
                        prm_id
                        and (
                            int(prm_id)
                            not in operation.acc_injection_period_ids.filtered(
                                lambda p: p.partner_id.id == int(partner_id)
                            ).acc_counter_id.ids
                            and int(prm_id)
                            not in operation.acc_delivery_period_ids.filtered(
                                lambda p: p.partner_id.id == int(partner_id)
                            ).acc_counter_id.ids
                        )
                    )
                )
            ):
                raise werkzeug.exceptions.abort(werkzeug.wrappers.Response(status=401))
    
            file_values = operation._export_cdc(
                start_date, end_date, partner_id, prm_id, data_type
            )
    
            return request.make_response(
                file_values.get("data"), headers=file_values.get("headers")
            )