[IMP] migration of project_task_portal_form v14

This commit is contained in:
clementthomas
2023-07-24 10:25:32 +02:00
parent da60ebb310
commit 5a30d61fee
10 changed files with 611 additions and 0 deletions

2
project_task_portal_form/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*.*~
*pyc

View File

@@ -0,0 +1,7 @@
=====================
project_task_portal_form
=====================
Add a portal form to create project tasks
This is an Odoo addon.

View File

@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import controllers

View File

@@ -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 <https://github.com/elabore-coop/project-tools/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.
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,
}

View File

@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import portal_task_creation

View File

@@ -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 + "<b>DESCRIPTION:</b><br/>" + values["small_description"]
if values.get("access", False):
description = description + "<br/><br/><b>ACCESS:</b><br/>" + values["access"]
if values.get("bug_report", False):
description = description + "<br/><br/><b>BUG REPORT:</b><br/>" + 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", {})

View File

@@ -0,0 +1 @@
This directory should contain the *.po for Odoo translation.

View File

@@ -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 "<br/>\n"
" Task created"
msgstr "<br/>\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 "<span>Be precise. If there is a bug/error, please describe how to reproduce it</span>"
msgstr "<span>Soyez précis. Si vous avez une erreur, veuillez décrire le scénario pour la reproduire</span>"
#. module: project_task_portal_form
#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form
msgid "<span>Link toward error or additional information</span>"
msgstr "<span>Lien vers l'erreur ou des informations supplémentaires</span>"
#. module: project_task_portal_form
#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form
msgid "<span>Paste here the complete error message (ex: error code Odoo)</span>"
msgstr "<span>COpier ici le message d'erreur complet (ex: error code Odoo)</span>"
#. 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"
" <span class=\"fa fa-long-arrow-right\"/>"
msgstr "Retour sur mon espace\n"
" <span class=\"fa fa-long-arrow-right\"/>"
#. 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"
" <span class=\"fa fa-long-arrow-right\"/>"
msgstr "Soumettre\n"
" <span class=\"fa fa-long-arrow-right\"/>"
#. 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"
" <br/>\n"
" A new task has been saved and you can keep track on your request handling from your portal account!\n"
" <br/>"
msgstr "Merci pour votre demande !\n"
" <br/>\n"
" Une nouvelle tâche a été créée et vous pouvez suivre votre demande depuis votre compte portail !\n"
" <br/>"
#. module: project_task_portal_form
#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form
msgid "Title"
msgstr "Titre"

View File

@@ -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 "<br/>\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 "<span>Be precise. If there is a bug/error, please describe how to reproduce it</span>"
msgstr ""
#. module: project_task_portal_form
#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form
msgid "<span>Link toward error or additional information</span>"
msgstr ""
#. module: project_task_portal_form
#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form
msgid "<span>Paste here the complete error message (ex: error code Odoo)</span>"
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"
" <span class=\"fa fa-long-arrow-right\"/>"
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"
" <span class=\"fa fa-long-arrow-right\"/>"
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"
" <br/>\n"
" A new task has been saved and you can keep track on your request handling from your portal account!\n"
" <br/>"
msgstr ""
#. module: project_task_portal_form
#: model_terms:ir.ui.view,arch_db:project_task_portal_form.portal_task_creation_form
msgid "Title"
msgstr ""

View File

@@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="portal_task_creation_form" name="Portal: Task creation form">
<t t-call="portal.portal_layout">
<!-- <div id="wrap" class="col-lg-6 container"></div> -->
<t t-set="additional_title">Task creation form</t>
<form
action="/task/create"
method="post"
accept-charset="UTF-8"
class="s_website_form col-md-12 mt32"
data-model_name="project.task"
data-force_action=""
data-success_page=""
enctype="multipart/form-data">
<div class="oe_structure" id="oe_structure_portal_task_creation_form_1" />
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
<div class="row">
<div t-attf-class="form-group #{error.get('name') and 'o_has_error' or ''} col-xl-12">
<label class="col-form-label" for="name">Title</label>
<label class="text-danger"> *</label>
<input type="text" name="name" t-attf-class="form-control #{error.get('name') and 'is-invalid' or ''}" t-att-value="name" required="True" />
</div>
</div>
<div class="row">
<div t-attf-class="form-group #{error.get('request_type_id') and 'o_has_error' or ''} col-xl-6">
<label class="col-form-label" for="request_type_id">Request type</label>
<label class="text-danger"> *</label>
<select name="request_type_id" t-attf-class="form-control" required="True">
<option value="">Choose a type...</option>
<t t-foreach="request_types or []" t-as="request_type">
<option t-att-value="request_type.id">
<t t-esc="request_type.name" />
</option>
</t>
</select>
</div>
<div t-attf-class="form-group #{error.get('service_id') and 'o_has_error' or ''} col-xl-6">
<label class="col-form-label" for="service_id">Service</label>
<label class="text-danger"> *</label>
<select name="service_id" t-attf-class="form-control" required="True">
<option value="">Choose a service...</option>
<t t-foreach="task_services or []" t-as="task_service">
<option t-att-value="task_service.id">
<t t-esc="task_service.name" />
</option>
</t>
</select>
</div>
</div>
<div class="row">
<div t-attf-class="form-group #{error.get('small_description') and 'o_has_error' or ''} col-xl-12">
<label class="col-form-label" for="small_description">Description</label>
<label class="text-danger"> *</label>
<textarea rows="4" name="small_description" t-attf-class="form-control #{error.get('small_description') and 'is-invalid' or ''}" t-att-value="small_description" required="True" />
<span>Be precise. If there is a bug/error, please describe how to reproduce it</span>
</div>
</div>
<div class="row">
<div t-attf-class="form-group #{error.get('access') and 'o_has_error' or ''} col-xl-12">
<label class="col-form-label" for="access">Access</label>
<input type="text" name="access" t-attf-class="form-control #{error.get('access') and 'is-invalid' or ''}" t-att-value="access" />
<span>Link toward error or additional information</span>
</div>
</div>
<div class="row">
<div t-attf-class="form-group #{error.get('bug_report') and 'o_has_error' or ''} col-xl-12">
<label class="col-form-label" for="bug_report">Bug report</label>
<textarea rows="4" name="bug_report" t-attf-class="form-control #{error.get('bug_report') and 'is-invalid' or ''}" t-att-value="bug_report" />
<span>Paste here the complete error message (ex: error code Odoo)</span>
</div>
</div>
<!-- ## IMPORT FILE -->
<div class="form-group form-field form-field-binary" data-model-field="false" data-optional="true">
<label class="col-form-label" for="attachment">
<span>Join document</span>
</label>
<i>
<input type="file" name="attachment" multiple="true" data-show-upload="true" data-show-caption="true" data-show-preview="true" />
</i>
<p class="form-text text-muted">
<i>Join a screenshot to your request or any other helpfull document.</i>
<br />
</p>
</div>
<div class="row">
<div t-attf-class="form-group #{error.get('priority') and 'o_has_error' or ''} col-xl-6">
<label class="col-form-label" for="priority">Priority</label>
<label class="text-danger"> *</label>
<select name="priority" t-attf-class="form-control" required="True">
<option value="">Choose a priority...</option>
<t t-foreach="priorities or []" t-as="priority">
<option t-att-value="priority['id']">
<t t-esc="priority['name']" />
</option>
</t>
</select>
</div>
</div>
<div class="clearfix">
<br />
<button type="submit" class="btn btn-primary float-right mb32 ">
Submit
<span class="fa fa-long-arrow-right" />
</button>
</div>
<div class="oe_structure" id="oe_structure_portal_task_creation_form_2" />
</form>
</t>
</template>
<template id="portal_task_created" name="Portal: Task created">
<t t-call="portal.portal_layout">
<t t-set="additional_title">Task created</t>
<form action="/my/tasks" method="post">
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()" />
<h3>
<br />
Task created
</h3>
<div>
<p>
Thanks for request!
<br />
A new task has been saved and you can keep track on your request handling from your portal account!
<br />
</p>
</div>
<div class="clearfix">
<br />
<button type="submit" class="btn btn-primary float-right mb32 ">
Back to my Tasks
<span class="fa fa-long-arrow-right" />
</button>
</div>
</form>
</t>
</template>
</odoo>