diff --git a/project_task_portal_form/.gitignore b/project_task_portal_form/.gitignore new file mode 100644 index 0000000..6da5887 --- /dev/null +++ b/project_task_portal_form/.gitignore @@ -0,0 +1,2 @@ +*.*~ +*pyc diff --git a/project_task_portal_form/README.rst b/project_task_portal_form/README.rst new file mode 100644 index 0000000..7e38915 --- /dev/null +++ b/project_task_portal_form/README.rst @@ -0,0 +1,7 @@ +===================== +project_task_portal_form +===================== + +Add a portal form to create project tasks + +This is an Odoo addon. diff --git a/project_task_portal_form/__init__.py b/project_task_portal_form/__init__.py new file mode 100644 index 0000000..b0f26a9 --- /dev/null +++ b/project_task_portal_form/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers diff --git a/project_task_portal_form/__manifest__.py b/project_task_portal_form/__manifest__.py new file mode 100644 index 0000000..6faa144 --- /dev/null +++ b/project_task_portal_form/__manifest__.py @@ -0,0 +1,86 @@ +# Copyright 2022 Stéphan Sainléger (Elabore) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "project_task_portal_form", + "version": "14.0.1.1.0", + "author": "Elabore", + "website": "https://elabore.coop", + "maintainer": "Stéphan Sainléger", + "license": "AGPL-3", + "category": "Tools", + "summary": "Add a portal form to create project tasks", + "description": """ + :image: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +======================== +project_task_portal_form +======================== + +Add a portal form to create project tasks + +Installation +============ + +Use Odoo normal module installation procedure to install +``project_task_portal_form``. + +Known issues / Roadmap +====================== + +None yet. +Bug Tracker +=========== + +Bugs are tracked on `our issues website `_. 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. + +Credits +======= + +Contributors +------------ + +* Stéphan Sainléger + +Funders +------- + +The development of this module has been financially supported by: +* Elabore (https://elabore.coop) + + +Maintainer +---------- + +This module is maintained by Elabore. + +""", + # any module necessary for this one to work correctly + "depends": [ + "base", + "project", + "project_request_data", + "project_user_default_project", + ], + "qweb": [], + "external_dependencies": { + "python": [], + }, + # always loaded + "data": [ + "views/portal_task_creation_form.xml", + ], + # only loaded in demonstration mode + "demo": [], + "js": [], + "css": [], + "installable": True, + # Install this module automatically if all dependency have been previously + # 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 new file mode 100644 index 0000000..c4eb2d8 --- /dev/null +++ b/project_task_portal_form/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import portal_task_creation \ No newline at end of file diff --git a/project_task_portal_form/controllers/portal_task_creation.py b/project_task_portal_form/controllers/portal_task_creation.py new file mode 100644 index 0000000..a314412 --- /dev/null +++ b/project_task_portal_form/controllers/portal_task_creation.py @@ -0,0 +1,126 @@ +# Copyright 2020 Lokavaluto () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import base64 +from odoo import http +from odoo.http import request +from odoo.addons.portal.controllers.portal import CustomerPortal + + +class PortalTaskCreation(CustomerPortal): + _TASK_CREATION_FIELDS = [ + "name", + "service_id", + "request_type_id", + "small_description", #not in v14 + "access", #not in v14 + "bug_report", #not in v14 + "priority", + ] + + # Variable to update to add other fields in child classes + _EXTRA_FIELDS = [] + + def _taskform_get_page_view_values(self, partner, access_token, **kwargs): + values = { + "page_name": "portal_task_form", + "partner": partner, + } + return self._get_page_view_values( + 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 + } + priorities.append(value) + return priorities + + @http.route( + ["/task/form"], + type="http", + auth="user", + website=True, + ) + def portal_task_creation(self, access_token=None, redirect=None, **kw): + values = self._task_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() + error = dict() + error_message = [] + values.update( + { + "request_types": request_types, + "task_services": task_services, + "priorities": priorities, + "error": error, + "error_message": error_message, + } + ) + return request.render("project_task_portal_form.portal_task_creation_form", values) + + def _compute_form_data(self, data): + values = {} + for field in self._TASK_CREATION_FIELDS: + if data.get(field): + values[field] = data.pop(field) + for field in self._EXTRA_FIELDS: + if data.get(field): + values[field] = data.pop(field) + description = "" + if values.get("small_description", False): + description = description + "DESCRIPTION:
" + values["small_description"] + if values.get("access", False): + description = description + "

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

BUG REPORT:
" + values["bug_report"] + + values["description"] = description + values["attachments"] = request.httprequest.files.getlist("attachment") + + del values['small_description'] + del values['access'] + del values['bug_report'] + + return values + + @http.route( + ["/task/create"], + type="http", + auth="public", + methods=['POST'], + website=True, + ) + def create_task(self, **kwargs): + # Get form values + user = request.env.user + values = self._compute_form_data(kwargs) + values["project_id"] = user.default_project_id.id + values["partner_id"] = user.partner_id.id + values["user_id"] = user.id + + files = values.get("attachments", False) + 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 + + # 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) + return request.render("project_task_portal_form.portal_task_created", {}) diff --git a/project_task_portal_form/i18n/README b/project_task_portal_form/i18n/README new file mode 100644 index 0000000..62197a1 --- /dev/null +++ b/project_task_portal_form/i18n/README @@ -0,0 +1 @@ +This directory should contain the *.po for Odoo translation. diff --git a/project_task_portal_form/i18n/fr.po b/project_task_portal_form/i18n/fr.po new file mode 100644 index 0000000..cf2a77e --- /dev/null +++ b/project_task_portal_form/i18n/fr.po @@ -0,0 +1,124 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_task_portal_form +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-22 09:34+0000\n" +"PO-Revision-Date: 2022-09-22 09:34+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "
\n" +" Task created" +msgstr "
\n" +" Tâche créée" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Be precise. If there is a bug/error, please describe how to reproduce it" +msgstr "Soyez précis. Si vous avez une erreur, veuillez décrire le scénario pour la reproduire" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Link toward error or additional information" +msgstr "Lien vers l'erreur ou des informations supplémentaires" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Paste here the complete error message (ex: error code Odoo)" +msgstr "COpier ici le message d'erreur complet (ex: error code Odoo)" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Access" +msgstr "Accès" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "Back to my Home\n" +" " +msgstr "Retour sur mon espace\n" +" " + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Bug report" +msgstr "Rapport de bug" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Choose a priority..." +msgstr "Choisir la priorité..." + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Choose a service..." +msgstr "Choisir le logiciel" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Choose a type..." +msgstr "Choisir un type de demande" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Description" +msgstr "Description" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Priority" +msgstr "Priorité" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Request type" +msgstr "Type de demande" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Service" +msgstr "Logiciel" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Submit\n" +" " +msgstr "Soumettre\n" +" " + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "Task created" +msgstr "Tâche créée" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Task creation form" +msgstr "Formulaire de création de tâche" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "Thanks for request!\n" +"
\n" +" A new task has been saved and you can keep track on your request handling from your portal account!\n" +"
" +msgstr "Merci pour votre demande !\n" +"
\n" +" Une nouvelle tâche a été créée et vous pouvez suivre votre demande depuis votre compte portail !\n" +"
" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Title" +msgstr "Titre" + diff --git a/project_task_portal_form/i18n/project_task_portal_form.pot b/project_task_portal_form/i18n/project_task_portal_form.pot new file mode 100644 index 0000000..a8ced21 --- /dev/null +++ b/project_task_portal_form/i18n/project_task_portal_form.pot @@ -0,0 +1,118 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_task_portal_form +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-09-22 09:35+0000\n" +"PO-Revision-Date: 2022-09-22 09:35+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "
\n" +" Task created" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Be precise. If there is a bug/error, please describe how to reproduce it" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Link toward error or additional information" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Paste here the complete error message (ex: error code Odoo)" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Access" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "Back to my Home\n" +" " +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Bug report" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Choose a priority..." +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Choose a service..." +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Choose a type..." +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Description" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Priority" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Request type" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Service" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Submit\n" +" " +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "Task created" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Task creation form" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_created +msgid "Thanks for request!\n" +"
\n" +" A new task has been saved and you can keep track on your request handling from your portal account!\n" +"
" +msgstr "" + +#. module: project_task_portal_form +#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form +msgid "Title" +msgstr "" + diff --git a/project_task_portal_form/views/portal_task_creation_form.xml b/project_task_portal_form/views/portal_task_creation_form.xml new file mode 100644 index 0000000..983bebc --- /dev/null +++ b/project_task_portal_form/views/portal_task_creation_form.xml @@ -0,0 +1,141 @@ + + +