From 6d1ecdc44f92b639635c94f576427334521b3029 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Sat, 15 Feb 2020 03:43:10 -0300 Subject: [PATCH 1/6] [ADD] document_page_portal --- document_page_portal/README.rst | 100 ++++ document_page_portal/__init__.py | 2 + document_page_portal/__manifest__.py | 28 ++ document_page_portal/controllers/__init__.py | 1 + document_page_portal/controllers/portal.py | 118 +++++ .../i18n/document_page_portal.pot | 94 ++++ document_page_portal/i18n/pt_BR.po | 72 +++ document_page_portal/models/__init__.py | 1 + document_page_portal/models/document_page.py | 14 + document_page_portal/readme/CONFIGURE.rst | 1 + document_page_portal/readme/CONTRIBUTORS.rst | 3 + document_page_portal/readme/CREDITS.rst | 3 + document_page_portal/readme/DESCRIPTION.rst | 1 + document_page_portal/readme/USAGE.rst | 1 + .../document_page_portal_security.xml | 22 + .../security/ir.model.access.csv | 3 + .../static/description/banner.png | Bin 0 -> 6733 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 444 ++++++++++++++++++ .../src/js/document_page_portal_tour.js | 37 ++ document_page_portal/tests/__init__.py | 1 + .../tests/test_document_page_portal.py | 33 ++ document_page_portal/views/assets.xml | 12 + document_page_portal/views/document_page.xml | 19 + .../views/document_page_portal_templates.xml | 102 ++++ 25 files changed, 1112 insertions(+) create mode 100644 document_page_portal/README.rst create mode 100644 document_page_portal/__init__.py create mode 100644 document_page_portal/__manifest__.py create mode 100644 document_page_portal/controllers/__init__.py create mode 100644 document_page_portal/controllers/portal.py create mode 100644 document_page_portal/i18n/document_page_portal.pot create mode 100644 document_page_portal/i18n/pt_BR.po create mode 100644 document_page_portal/models/__init__.py create mode 100644 document_page_portal/models/document_page.py create mode 100644 document_page_portal/readme/CONFIGURE.rst create mode 100644 document_page_portal/readme/CONTRIBUTORS.rst create mode 100644 document_page_portal/readme/CREDITS.rst create mode 100644 document_page_portal/readme/DESCRIPTION.rst create mode 100644 document_page_portal/readme/USAGE.rst create mode 100644 document_page_portal/security/document_page_portal_security.xml create mode 100644 document_page_portal/security/ir.model.access.csv create mode 100644 document_page_portal/static/description/banner.png create mode 100644 document_page_portal/static/description/icon.png create mode 100644 document_page_portal/static/description/index.html create mode 100644 document_page_portal/static/src/js/document_page_portal_tour.js create mode 100644 document_page_portal/tests/__init__.py create mode 100644 document_page_portal/tests/test_document_page_portal.py create mode 100644 document_page_portal/views/assets.xml create mode 100644 document_page_portal/views/document_page.xml create mode 100644 document_page_portal/views/document_page_portal_templates.xml diff --git a/document_page_portal/README.rst b/document_page_portal/README.rst new file mode 100644 index 00000000000..2757a1ce18c --- /dev/null +++ b/document_page_portal/README.rst @@ -0,0 +1,100 @@ +==================== +Document Page Portal +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github + :target: https://github.com/OCA/knowledge/tree/12.0/document_page_portal + :alt: OCA/knowledge +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/knowledge-12-0/knowledge-12-0-document_page_portal + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/118/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows documents to be made available on the portal. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +No configuration required. + +Usage +===== + +* Add a user as a follower of the document or configure the document as public so that it is visible through the user portal. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub 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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Escodoo + +Contributors +~~~~~~~~~~~~ + +* `Escodoo `_: + + * Marcel Savegnago + +Other credits +~~~~~~~~~~~~~ + +The development of this module has been financially supported by: + +* Escodoo + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-marcelsavegnago| image:: https://github.com/marcelsavegnago.png?size=40px + :target: https://github.com/marcelsavegnago + :alt: marcelsavegnago + +Current `maintainer `__: + +|maintainer-marcelsavegnago| + +This module is part of the `OCA/knowledge `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_portal/__init__.py b/document_page_portal/__init__.py new file mode 100644 index 00000000000..91c5580fed3 --- /dev/null +++ b/document_page_portal/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/document_page_portal/__manifest__.py b/document_page_portal/__manifest__.py new file mode 100644 index 00000000000..80ba91de723 --- /dev/null +++ b/document_page_portal/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright (C) 2020 - TODAY, Marcel Savegnago - Escodoo). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +{ + 'name': 'Document Page Portal', + 'summary': """ + This module enables document page portal""", + 'version': '12.0.1.0.0', + 'category': 'Knowledge Management', + 'author': 'Escodoo, Odoo Community Association (OCA)', + 'maintainers': ['marcelsavegnago'], + 'images': ['static/description/banner.png'], + 'website': 'https://github.com/OCA/knowledge', + 'license': 'AGPL-3', + 'depends': [ + 'base', + 'portal', + 'document_page' + ], + 'data': [ + 'views/assets.xml', + 'views/document_page.xml', + 'security/document_page_portal_security.xml', + 'security/ir.model.access.csv', + 'views/document_page_portal_templates.xml', + ], +} diff --git a/document_page_portal/controllers/__init__.py b/document_page_portal/controllers/__init__.py new file mode 100644 index 00000000000..8c3feb6f562 --- /dev/null +++ b/document_page_portal/controllers/__init__.py @@ -0,0 +1 @@ +from . import portal diff --git a/document_page_portal/controllers/portal.py b/document_page_portal/controllers/portal.py new file mode 100644 index 00000000000..30d8c8e2117 --- /dev/null +++ b/document_page_portal/controllers/portal.py @@ -0,0 +1,118 @@ +# Copyright (C) 2020 - TODAY, Marcel Savegnago - Escodoo). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import http +from odoo.exceptions import AccessError, MissingError +from odoo.http import request +from odoo.tools.translate import _ +from odoo.addons.portal.controllers.portal import pager as portal_pager, CustomerPortal +from odoo.osv.expression import OR + + +class CustomerPortal(CustomerPortal): + + def _prepare_portal_layout_values(self): + values = super(CustomerPortal, self)._prepare_portal_layout_values() + values['document_page_count'] = request.env[ + 'document.page'].search_count([('type', '=', 'content')]) + return values + + def _document_page_get_page_view_values(self, document_page, + access_token, **kwargs): + values = { + 'page_name': 'document_page', + 'document_page': document_page, + } + return self._get_page_view_values( + document_page, access_token, values, + 'my_document_pages_history', False, **kwargs) + + @http.route( + ['/my/knowledge/documents/', '/my/knowledge/documents/page/'], + type='http', auth="user", website=True) + def portal_my_knowledge_document_pages(self, page=1, date_begin=None, + date_end=None, sortby=None, + search=None, search_in='content', **kw): + values = self._prepare_portal_layout_values() + domain = [('type', '=', 'content')] + + searchbar_sortings = { + 'date': {'label': _('Newest'), 'order': 'create_date desc'}, + 'name': {'label': _('Name'), 'order': 'name'}, + 'parent': {'label': _('Category'), 'order': 'parent_id'}, + } + searchbar_inputs = { + 'content': {'input': 'content', 'label': _( + 'Search (in Content)')}, + 'all': {'input': 'all', 'label': _('Search in All')}, + } + + # default sort by value + if not sortby: + sortby = 'date' + order = searchbar_sortings[sortby]['order'] + + # archive groups - Default Group By 'create_date' + archive_groups = self._get_archive_groups('document.page', domain) + if date_begin and date_end: + domain += [ + ('create_date', '>', date_begin), + ('create_date', '<=', date_end), + ] + + # search + if search and search_in: + search_domain = [] + if search_in in ('content', 'all'): + search_domain = OR([search_domain, [ + '|', ('name', 'ilike', search), ('content', 'ilike', search)]]) + domain += search_domain + + # pager + document_pages_count = request.env['document.page'].search_count(domain) + pager = portal_pager( + url="/my/knowledge/documents", + url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby}, + total=document_pages_count, + page=page, + step=self._items_per_page + ) + + document_pages = request.env['document.page'].search( + domain, order=order, limit=self._items_per_page, offset=pager['offset']) + request.session['my_document_pages_history'] = document_pages.ids[:100] + + values.update({ + 'date': date_begin, + 'document_pages': document_pages, + 'page_name': 'document_page', + 'default_url': '/my/knowledge/s', + 'pager': pager, + 'archive_groups': archive_groups, + 'searchbar_sortings': searchbar_sortings, + 'searchbar_inputs': searchbar_inputs, + 'sortby': sortby, + 'search_in': search_in, + 'search': search, + }) + return request.render( + "document_page_portal.portal_my_knowledge_document_pages", values) + + @http.route([ + "/knowledge/document/", + "/knowledge/document//", + '/my/knowledge/document/' + ], type='http', auth="public", website=True) + def document_pages_followup(self, document_page_id=None, + access_token=None, **kw): + try: + document_page_sudo = self._document_check_access( + 'document.page', document_page_id, access_token) + except (AccessError, MissingError): + return request.redirect('/my') + + values = self._document_page_get_page_view_values( + document_page_sudo, access_token, **kw) + return request.render( + "document_page_portal.document_pages_followup", values) diff --git a/document_page_portal/i18n/document_page_portal.pot b/document_page_portal/i18n/document_page_portal.pot new file mode 100644 index 00000000000..7a8271e9743 --- /dev/null +++ b/document_page_portal/i18n/document_page_portal.pot @@ -0,0 +1,94 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_portal +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \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: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.document_pages_followup +msgid "No content" +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.document_pages_followup +msgid "Category:" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:43 +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +#, python-format +msgid "Category" +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.document_pages_followup +msgid "Current Category of this document" +msgstr "" + +#. module: document_page_portal +#: model:ir.model,name:document_page_portal.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_portal +#: model:ir.model.fields,help:document_page_portal.field_document_page__is_public +msgid "If true it allows any user of the portal to have access to this document." +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_home_Knowledge_document_page +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_home_menu_Knowledge +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +msgid "Knowledge Documents" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:42 +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +#, python-format +msgid "Name" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:41 +#, python-format +msgid "Newest" +msgstr "" + +#. module: document_page_portal +#: model:ir.model.fields,field_description:document_page_portal.field_document_page__is_public +msgid "Public Page" +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +msgid "Ref" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:46 +#, python-format +msgid "Search (in Content)" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:48 +#, python-format +msgid "Search in All" +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +msgid "There are currently no Knowledge Document for your account." +msgstr "" + diff --git a/document_page_portal/i18n/pt_BR.po b/document_page_portal/i18n/pt_BR.po new file mode 100644 index 00000000000..a81ca1be978 --- /dev/null +++ b/document_page_portal/i18n/pt_BR.po @@ -0,0 +1,72 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_portal +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-27 14:08+0000\n" +"PO-Revision-Date: 2019-11-27 11:11-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 2.2.4\n" +"Last-Translator: \n" +"Language: pt_BR\n" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_document_page_page +msgid "" +"
\n" +" Category:" +msgstr "" +"
\n" +" Categoria:" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_document_page_page +msgid "" +"
\n" +" Date:" +msgstr "" +"
\n" +" Data:" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:55 +#, python-format +msgid "All" +msgstr "Todos" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents +msgid "Category" +msgstr "Categoria" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_layout +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_home +msgid "Documents" +msgstr "Documentos" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:53 +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents +#, python-format +msgid "Name" +msgstr "Nome" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:52 +#, python-format +msgid "Newest" +msgstr "Mais Recentes" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents +msgid "There are no documents in your account." +msgstr "Não há documentos em sua conta." diff --git a/document_page_portal/models/__init__.py b/document_page_portal/models/__init__.py new file mode 100644 index 00000000000..427be24e72a --- /dev/null +++ b/document_page_portal/models/__init__.py @@ -0,0 +1 @@ +from . import document_page diff --git a/document_page_portal/models/document_page.py b/document_page_portal/models/document_page.py new file mode 100644 index 00000000000..fef21ad465c --- /dev/null +++ b/document_page_portal/models/document_page.py @@ -0,0 +1,14 @@ +# Copyright 2020 - TODAY, Marcel Savegnago - Escodoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class DocumentPage(models.Model): + + _inherit = 'document.page' + + is_public = fields.Boolean( + 'Public Page', + help='If true it allows any user of the portal to have ' + 'access to this document.') diff --git a/document_page_portal/readme/CONFIGURE.rst b/document_page_portal/readme/CONFIGURE.rst new file mode 100644 index 00000000000..e7dc235973a --- /dev/null +++ b/document_page_portal/readme/CONFIGURE.rst @@ -0,0 +1 @@ +No configuration required. diff --git a/document_page_portal/readme/CONTRIBUTORS.rst b/document_page_portal/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..ae453a60bdb --- /dev/null +++ b/document_page_portal/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Escodoo `_: + + * Marcel Savegnago diff --git a/document_page_portal/readme/CREDITS.rst b/document_page_portal/readme/CREDITS.rst new file mode 100644 index 00000000000..fcb24d04573 --- /dev/null +++ b/document_page_portal/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The development of this module has been financially supported by: + +* Escodoo diff --git a/document_page_portal/readme/DESCRIPTION.rst b/document_page_portal/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..d5ab614d4c2 --- /dev/null +++ b/document_page_portal/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows documents to be made available on the portal. diff --git a/document_page_portal/readme/USAGE.rst b/document_page_portal/readme/USAGE.rst new file mode 100644 index 00000000000..e15b4b2fb81 --- /dev/null +++ b/document_page_portal/readme/USAGE.rst @@ -0,0 +1 @@ +* Add a user as a follower of the document or configure the document as public so that it is visible through the user portal. diff --git a/document_page_portal/security/document_page_portal_security.xml b/document_page_portal/security/document_page_portal_security.xml new file mode 100644 index 00000000000..98ce80f5a96 --- /dev/null +++ b/document_page_portal/security/document_page_portal_security.xml @@ -0,0 +1,22 @@ + + + + + Documents: knowledge user: see all + + [(1, '=', 1)] + + + + Documents: portal users: portal or following + + + [ + '|', '|', ('type', '!=', 'content'), ('is_public', '=', True), + ('message_partner_ids', 'child_of', [user.partner_id.commercial_partner_id.id]) + ] + + + + + diff --git a/document_page_portal/security/ir.model.access.csv b/document_page_portal/security/ir.model.access.csv new file mode 100644 index 00000000000..2fcb00561ca --- /dev/null +++ b/document_page_portal/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +document_page_portal,document.page portal,document_page.model_document_page,base.group_portal,1,0,0,0 +document_page_portal_user,document.page portal user,document_page.model_document_page,base.group_user,1,0,0,0 \ No newline at end of file diff --git a/document_page_portal/static/description/banner.png b/document_page_portal/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..da4f6de2a24707c5658d507c81cdd7625d9bf9e4 GIT binary patch literal 6733 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 literal 0 HcmV?d00001 diff --git a/document_page_portal/static/description/icon.png b/document_page_portal/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/document_page_portal/static/description/index.html b/document_page_portal/static/description/index.html new file mode 100644 index 00000000000..c3581991489 --- /dev/null +++ b/document_page_portal/static/description/index.html @@ -0,0 +1,444 @@ + + + + + + +Document Page Portal + + + +
+

Document Page Portal

+ + +

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runbot

+

This module allows documents to be made available on the portal.

+

Table of contents

+ +
+

Configuration

+

No configuration required.

+
+
+

Usage

+
    +
  • Add a user as a follower of the document or configure the document as public so that it is visible through the user portal.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub 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.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Escodoo
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The development of this module has been financially supported by:

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

marcelsavegnago

+

This module is part of the OCA/knowledge project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/document_page_portal/static/src/js/document_page_portal_tour.js b/document_page_portal/static/src/js/document_page_portal_tour.js new file mode 100644 index 00000000000..264df980a6a --- /dev/null +++ b/document_page_portal/static/src/js/document_page_portal_tour.js @@ -0,0 +1,37 @@ +odoo.define('document_page_portal.tour', function (require) { + 'use strict'; + + var tour = require("web_tour.tour"); + + tour.register('document_page_portal_tour', { + test: true, + url: '/my', + }, + [ + { + content: "Check document_page_portal is loaded", + trigger: 'a[href*="/my/knowledge/documents"]:contains("Knowledge Documents"):first', + }, + { + content: "Check public document_page is loaded", + trigger: 'a[href*="/knowledge/document/"]:contains("Test Public Page 1"):first', + }, + ]); + + tour.register('document_page_portal_search_tour', { + test: true, + url: '/my/knowledge/documents', + }, + [ + { + content: "Search", + trigger: "input[name='search']", + run: "text Test", + }, + { + content: "Click Search.", + extra_trigger: "#wrap:not(:has(input[name=search]:propValue('')))", + trigger: '.search-submit', + }, + ]); +}); diff --git a/document_page_portal/tests/__init__.py b/document_page_portal/tests/__init__.py new file mode 100644 index 00000000000..7e42ded9a53 --- /dev/null +++ b/document_page_portal/tests/__init__.py @@ -0,0 +1 @@ +from . import test_document_page_portal diff --git a/document_page_portal/tests/test_document_page_portal.py b/document_page_portal/tests/test_document_page_portal.py new file mode 100644 index 00000000000..ae65ad761ec --- /dev/null +++ b/document_page_portal/tests/test_document_page_portal.py @@ -0,0 +1,33 @@ +# Copyright 2020 - TODAY, Marcel Savegnago - Escodoo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl + +import odoo.tests + + +@odoo.tests.tagged('post_install', '-at_install') +class TestUi(odoo.tests.HttpCase): + def test_01_document_page_portal_tour(self): + # Create a public document + self.env['document.page'].create({ + 'name': 'Test Public Page 1', + 'content': 'Test content', + 'is_public': True, + }) + + self.phantom_js( + "/", + "odoo.__DEBUG__.services['web_tour.tour']" + ".run('document_page_portal_tour')", + "odoo.__DEBUG__.services['web_tour.tour']" + ".tours.document_page_portal_tour.ready", + login="portal" + ) + + self.phantom_js( + "/", + "odoo.__DEBUG__.services['web_tour.tour']" + ".run('document_page_portal_search_tour')", + "odoo.__DEBUG__.services['web_tour.tour']" + ".tours.document_page_portal_search_tour.ready", + login="portal" + ) diff --git a/document_page_portal/views/assets.xml b/document_page_portal/views/assets.xml new file mode 100644 index 00000000000..9b3edfbb515 --- /dev/null +++ b/document_page_portal/views/assets.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/document_page_portal/views/document_page.xml b/document_page_portal/views/document_page.xml new file mode 100644 index 00000000000..27c3e352fa0 --- /dev/null +++ b/document_page_portal/views/document_page.xml @@ -0,0 +1,19 @@ + + + + + + + document.page.form (in document_page_portal) + document.page + + + + + + + + + + diff --git a/document_page_portal/views/document_page_portal_templates.xml b/document_page_portal/views/document_page_portal_templates.xml new file mode 100644 index 00000000000..995b7bfbc72 --- /dev/null +++ b/document_page_portal/views/document_page_portal_templates.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + From 6b9dd283df59b616912463a8b1a9fef283341515 Mon Sep 17 00:00:00 2001 From: Marcel Savegnago Date: Sun, 28 Feb 2021 17:26:09 -0300 Subject: [PATCH 2/6] [MIG] document_page_portal: Migration to 13.0 --- document_page_portal/README.rst | 10 +- document_page_portal/__manifest__.py | 36 ++-- document_page_portal/controllers/portal.py | 162 +++++++++++------- .../i18n/document_page_portal.pot | 20 +-- document_page_portal/i18n/pt_BR.po | 113 ++++++++---- document_page_portal/models/document_page.py | 9 +- .../document_page_portal_security.xml | 7 +- .../security/ir.model.access.csv | 2 +- .../static/description/index.html | 6 +- .../src/js/document_page_portal_tour.js | 64 ++++--- .../tests/test_document_page_portal.py | 21 ++- document_page_portal/views/assets.xml | 15 +- document_page_portal/views/document_page.xml | 7 +- .../views/document_page_portal_templates.xml | 73 ++++++-- 14 files changed, 341 insertions(+), 204 deletions(-) diff --git a/document_page_portal/README.rst b/document_page_portal/README.rst index 2757a1ce18c..8e5204fe70b 100644 --- a/document_page_portal/README.rst +++ b/document_page_portal/README.rst @@ -14,13 +14,13 @@ Document Page Portal :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github - :target: https://github.com/OCA/knowledge/tree/12.0/document_page_portal + :target: https://github.com/OCA/knowledge/tree/13.0/document_page_portal :alt: OCA/knowledge .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/knowledge-12-0/knowledge-12-0-document_page_portal + :target: https://translation.odoo-community.org/projects/knowledge-13-0/knowledge-13-0-document_page_portal :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/118/12.0 + :target: https://runbot.odoo-community.org/runbot/118/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -48,7 +48,7 @@ Bug Tracker Bugs are tracked on `GitHub 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -95,6 +95,6 @@ Current `maintainer `__: |maintainer-marcelsavegnago| -This module is part of the `OCA/knowledge `_ project on GitHub. +This module is part of the `OCA/knowledge `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_portal/__manifest__.py b/document_page_portal/__manifest__.py index 80ba91de723..5b28d0a6c5c 100644 --- a/document_page_portal/__manifest__.py +++ b/document_page_portal/__manifest__.py @@ -3,26 +3,22 @@ { - 'name': 'Document Page Portal', - 'summary': """ + "name": "Document Page Portal", + "summary": """ This module enables document page portal""", - 'version': '12.0.1.0.0', - 'category': 'Knowledge Management', - 'author': 'Escodoo, Odoo Community Association (OCA)', - 'maintainers': ['marcelsavegnago'], - 'images': ['static/description/banner.png'], - 'website': 'https://github.com/OCA/knowledge', - 'license': 'AGPL-3', - 'depends': [ - 'base', - 'portal', - 'document_page' - ], - 'data': [ - 'views/assets.xml', - 'views/document_page.xml', - 'security/document_page_portal_security.xml', - 'security/ir.model.access.csv', - 'views/document_page_portal_templates.xml', + "version": "13.0.1.0.0", + "category": "Knowledge Management", + "author": "Escodoo, Odoo Community Association (OCA)", + "maintainers": ["marcelsavegnago"], + "images": ["static/description/banner.png"], + "website": "https://github.com/OCA/knowledge", + "license": "AGPL-3", + "depends": ["base", "portal", "document_page"], + "data": [ + "views/assets.xml", + "views/document_page.xml", + "security/document_page_portal_security.xml", + "security/ir.model.access.csv", + "views/document_page_portal_templates.xml", ], } diff --git a/document_page_portal/controllers/portal.py b/document_page_portal/controllers/portal.py index 30d8c8e2117..a6c01711e96 100644 --- a/document_page_portal/controllers/portal.py +++ b/document_page_portal/controllers/portal.py @@ -5,114 +5,146 @@ from odoo import http from odoo.exceptions import AccessError, MissingError from odoo.http import request -from odoo.tools.translate import _ -from odoo.addons.portal.controllers.portal import pager as portal_pager, CustomerPortal from odoo.osv.expression import OR +from odoo.tools.translate import _ +from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager -class CustomerPortal(CustomerPortal): +class CustomerPortal(CustomerPortal): def _prepare_portal_layout_values(self): values = super(CustomerPortal, self)._prepare_portal_layout_values() - values['document_page_count'] = request.env[ - 'document.page'].search_count([('type', '=', 'content')]) + values["document_page_count"] = request.env["document.page"].search_count( + [("type", "=", "content")] + ) return values - def _document_page_get_page_view_values(self, document_page, - access_token, **kwargs): + def _document_page_get_page_view_values( + self, document_page, access_token, **kwargs + ): values = { - 'page_name': 'document_page', - 'document_page': document_page, + "page_name": "document_page", + "document_page": document_page, } return self._get_page_view_values( - document_page, access_token, values, - 'my_document_pages_history', False, **kwargs) + document_page, + access_token, + values, + "my_document_pages_history", + False, + **kwargs + ) @http.route( - ['/my/knowledge/documents/', '/my/knowledge/documents/page/'], - type='http', auth="user", website=True) - def portal_my_knowledge_document_pages(self, page=1, date_begin=None, - date_end=None, sortby=None, - search=None, search_in='content', **kw): + ["/my/knowledge/documents/", "/my/knowledge/documents/page/"], + type="http", + auth="user", + website=True, + ) + def portal_my_knowledge_document_pages( + self, + page=1, + date_begin=None, + date_end=None, + sortby=None, + search=None, + search_in="content", + **kw + ): values = self._prepare_portal_layout_values() - domain = [('type', '=', 'content')] + domain = [("type", "=", "content")] searchbar_sortings = { - 'date': {'label': _('Newest'), 'order': 'create_date desc'}, - 'name': {'label': _('Name'), 'order': 'name'}, - 'parent': {'label': _('Category'), 'order': 'parent_id'}, + "date": {"label": _("Newest"), "order": "create_date desc"}, + "name": {"label": _("Name"), "order": "name"}, + "parent": {"label": _("Category"), "order": "parent_id"}, } searchbar_inputs = { - 'content': {'input': 'content', 'label': _( - 'Search (in Content)')}, - 'all': {'input': 'all', 'label': _('Search in All')}, + "content": { + "input": "content", + "label": _('Search (in Content)'), + }, + "all": {"input": "all", "label": _("Search in All")}, } # default sort by value if not sortby: - sortby = 'date' - order = searchbar_sortings[sortby]['order'] + sortby = "date" + order = searchbar_sortings[sortby]["order"] # archive groups - Default Group By 'create_date' - archive_groups = self._get_archive_groups('document.page', domain) + archive_groups = self._get_archive_groups("document.page", domain) if date_begin and date_end: domain += [ - ('create_date', '>', date_begin), - ('create_date', '<=', date_end), + ("create_date", ">", date_begin), + ("create_date", "<=", date_end), ] # search if search and search_in: search_domain = [] - if search_in in ('content', 'all'): - search_domain = OR([search_domain, [ - '|', ('name', 'ilike', search), ('content', 'ilike', search)]]) + if search_in in ("content", "all"): + search_domain = OR( + [ + search_domain, + ["|", ("name", "ilike", search), ("content", "ilike", search)], + ] + ) domain += search_domain # pager - document_pages_count = request.env['document.page'].search_count(domain) + document_pages_count = request.env["document.page"].search_count(domain) pager = portal_pager( url="/my/knowledge/documents", - url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby}, + url_args={"date_begin": date_begin, "date_end": date_end, "sortby": sortby}, total=document_pages_count, page=page, - step=self._items_per_page + step=self._items_per_page, ) - document_pages = request.env['document.page'].search( - domain, order=order, limit=self._items_per_page, offset=pager['offset']) - request.session['my_document_pages_history'] = document_pages.ids[:100] - - values.update({ - 'date': date_begin, - 'document_pages': document_pages, - 'page_name': 'document_page', - 'default_url': '/my/knowledge/s', - 'pager': pager, - 'archive_groups': archive_groups, - 'searchbar_sortings': searchbar_sortings, - 'searchbar_inputs': searchbar_inputs, - 'sortby': sortby, - 'search_in': search_in, - 'search': search, - }) + document_pages = request.env["document.page"].search( + domain, order=order, limit=self._items_per_page, offset=pager["offset"] + ) + request.session["my_document_pages_history"] = document_pages.ids[:100] + + values.update( + { + "date": date_begin, + "document_pages": document_pages, + "page_name": "document_page", + "default_url": "/my/knowledge/s", + "pager": pager, + "archive_groups": archive_groups, + "searchbar_sortings": searchbar_sortings, + "searchbar_inputs": searchbar_inputs, + "sortby": sortby, + "search_in": search_in, + "search": search, + } + ) return request.render( - "document_page_portal.portal_my_knowledge_document_pages", values) - - @http.route([ - "/knowledge/document/", - "/knowledge/document//", - '/my/knowledge/document/' - ], type='http', auth="public", website=True) - def document_pages_followup(self, document_page_id=None, - access_token=None, **kw): + "document_page_portal.portal_my_knowledge_document_pages", values + ) + + @http.route( + [ + "/knowledge/document/", + "/knowledge/document//", + "/my/knowledge/document/", + ], + type="http", + auth="public", + website=True, + ) + def document_pages_followup(self, document_page_id=None, access_token=None, **kw): try: document_page_sudo = self._document_check_access( - 'document.page', document_page_id, access_token) + "document.page", document_page_id, access_token + ) except (AccessError, MissingError): - return request.redirect('/my') + return request.redirect("/my") values = self._document_page_get_page_view_values( - document_page_sudo, access_token, **kw) - return request.render( - "document_page_portal.document_pages_followup", values) + document_page_sudo, access_token, **kw + ) + return request.render("document_page_portal.document_pages_followup", values) diff --git a/document_page_portal/i18n/document_page_portal.pot b/document_page_portal/i18n/document_page_portal.pot index 7a8271e9743..14c9dc58927 100644 --- a/document_page_portal/i18n/document_page_portal.pot +++ b/document_page_portal/i18n/document_page_portal.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * document_page_portal +# * document_page_portal # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Category:" msgstr "" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:43 +#: code:addons/document_page_portal/controllers/portal.py:0 #: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages #, python-format msgid "Category" @@ -42,7 +42,8 @@ msgstr "" #. module: document_page_portal #: model:ir.model.fields,help:document_page_portal.field_document_page__is_public -msgid "If true it allows any user of the portal to have access to this document." +msgid "" +"If true it allows any user of the portal to have access to this document." msgstr "" #. module: document_page_portal @@ -53,14 +54,14 @@ msgid "Knowledge Documents" msgstr "" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:42 +#: code:addons/document_page_portal/controllers/portal.py:0 #: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages #, python-format msgid "Name" msgstr "" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:41 +#: code:addons/document_page_portal/controllers/portal.py:0 #, python-format msgid "Newest" msgstr "" @@ -76,13 +77,13 @@ msgid "Ref" msgstr "" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:46 +#: code:addons/document_page_portal/controllers/portal.py:0 #, python-format msgid "Search (in Content)" msgstr "" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:48 +#: code:addons/document_page_portal/controllers/portal.py:0 #, python-format msgid "Search in All" msgstr "" @@ -91,4 +92,3 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages msgid "There are currently no Knowledge Document for your account." msgstr "" - diff --git a/document_page_portal/i18n/pt_BR.po b/document_page_portal/i18n/pt_BR.po index a81ca1be978..f88df8b7716 100644 --- a/document_page_portal/i18n/pt_BR.po +++ b/document_page_portal/i18n/pt_BR.po @@ -4,69 +4,118 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-27 14:08+0000\n" "PO-Revision-Date: 2019-11-27 11:11-0300\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Language: pt_BR\n" #. module: document_page_portal -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_document_page_page -msgid "" -"
\n" -" Category:" +#: model_terms:ir.ui.view,arch_db:document_page_portal.document_pages_followup +msgid "No content" msgstr "" -"
\n" -" Categoria:" #. module: document_page_portal -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_document_page_page -msgid "" -"
\n" -" Date:" +#: model_terms:ir.ui.view,arch_db:document_page_portal.document_pages_followup +msgid "Category:" msgstr "" -"
\n" -" Data:" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:55 +#: code:addons/document_page_portal/controllers/portal.py:0 +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages #, python-format -msgid "All" -msgstr "Todos" - -#. module: document_page_portal -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents msgid "Category" msgstr "Categoria" #. module: document_page_portal -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_layout -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_home -msgid "Documents" -msgstr "Documentos" +#: model_terms:ir.ui.view,arch_db:document_page_portal.document_pages_followup +msgid "Current Category of this document" +msgstr "" + +#. module: document_page_portal +#: model:ir.model,name:document_page_portal.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_portal +#: model:ir.model.fields,help:document_page_portal.field_document_page__is_public +msgid "" +"If true it allows any user of the portal to have access to this document." +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_home_Knowledge_document_page +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_home_menu_Knowledge +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +msgid "Knowledge Documents" +msgstr "" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:53 -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents +#: code:addons/document_page_portal/controllers/portal.py:0 +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages #, python-format msgid "Name" msgstr "Nome" #. module: document_page_portal -#: code:addons/document_page_portal/controllers/portal.py:52 +#: code:addons/document_page_portal/controllers/portal.py:0 #, python-format msgid "Newest" msgstr "Mais Recentes" #. module: document_page_portal -#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_documents -msgid "There are no documents in your account." -msgstr "Não há documentos em sua conta." +#: model:ir.model.fields,field_description:document_page_portal.field_document_page__is_public +msgid "Public Page" +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +msgid "Ref" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:0 +#, python-format +msgid "Search (in Content)" +msgstr "" + +#. module: document_page_portal +#: code:addons/document_page_portal/controllers/portal.py:0 +#, python-format +msgid "Search in All" +msgstr "" + +#. module: document_page_portal +#: model_terms:ir.ui.view,arch_db:document_page_portal.portal_my_knowledge_document_pages +msgid "There are currently no Knowledge Document for your account." +msgstr "" + +#~ msgid "" +#~ "
\n" +#~ " Category:" +#~ msgstr "" +#~ "
\n" +#~ " Categoria:" + +#~ msgid "" +#~ "
\n" +#~ " Date:" +#~ msgstr "" +#~ "
\n" +#~ " Data:" + +#~ msgid "All" +#~ msgstr "Todos" + +#~ msgid "Documents" +#~ msgstr "Documentos" + +#~ msgid "There are no documents in your account." +#~ msgstr "Não há documentos em sua conta." diff --git a/document_page_portal/models/document_page.py b/document_page_portal/models/document_page.py index fef21ad465c..72bf4082fc9 100644 --- a/document_page_portal/models/document_page.py +++ b/document_page_portal/models/document_page.py @@ -6,9 +6,10 @@ class DocumentPage(models.Model): - _inherit = 'document.page' + _inherit = "document.page" is_public = fields.Boolean( - 'Public Page', - help='If true it allows any user of the portal to have ' - 'access to this document.') + "Public Page", + help="If true it allows any user of the portal to have " + "access to this document.", + ) diff --git a/document_page_portal/security/document_page_portal_security.xml b/document_page_portal/security/document_page_portal_security.xml index 98ce80f5a96..28177488897 100644 --- a/document_page_portal/security/document_page_portal_security.xml +++ b/document_page_portal/security/document_page_portal_security.xml @@ -1,4 +1,4 @@ - + @@ -16,7 +16,10 @@ ('message_partner_ids', 'child_of', [user.partner_id.commercial_partner_id.id]) ] - + diff --git a/document_page_portal/security/ir.model.access.csv b/document_page_portal/security/ir.model.access.csv index 2fcb00561ca..660b8280169 100644 --- a/document_page_portal/security/ir.model.access.csv +++ b/document_page_portal/security/ir.model.access.csv @@ -1,3 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink document_page_portal,document.page portal,document_page.model_document_page,base.group_portal,1,0,0,0 -document_page_portal_user,document.page portal user,document_page.model_document_page,base.group_user,1,0,0,0 \ No newline at end of file +document_page_portal_user,document.page portal user,document_page.model_document_page,base.group_user,1,0,0,0 diff --git a/document_page_portal/static/description/index.html b/document_page_portal/static/description/index.html index c3581991489..91a5f6ada3a 100644 --- a/document_page_portal/static/description/index.html +++ b/document_page_portal/static/description/index.html @@ -367,7 +367,7 @@

Document Page Portal

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runbot

This module allows documents to be made available on the portal.

Table of contents

@@ -399,7 +399,7 @@

Bug Tracker

Bugs are tracked on GitHub 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.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -435,7 +435,7 @@

Maintainers

promote its widespread use.

Current maintainer:

marcelsavegnago

-

This module is part of the OCA/knowledge project on GitHub.

+

This module is part of the OCA/knowledge project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/document_page_portal/static/src/js/document_page_portal_tour.js b/document_page_portal/static/src/js/document_page_portal_tour.js index 264df980a6a..ee5068c8c8f 100644 --- a/document_page_portal/static/src/js/document_page_portal_tour.js +++ b/document_page_portal/static/src/js/document_page_portal_tour.js @@ -1,37 +1,45 @@ -odoo.define('document_page_portal.tour', function (require) { - 'use strict'; +odoo.define("document_page_portal.tour", function(require) { + "use strict"; var tour = require("web_tour.tour"); - tour.register('document_page_portal_tour', { - test: true, - url: '/my', - }, - [ + tour.register( + "document_page_portal_tour", { - content: "Check document_page_portal is loaded", - trigger: 'a[href*="/my/knowledge/documents"]:contains("Knowledge Documents"):first', + test: true, + url: "/my", }, - { - content: "Check public document_page is loaded", - trigger: 'a[href*="/knowledge/document/"]:contains("Test Public Page 1"):first', - }, - ]); + [ + { + content: "Check document_page_portal is loaded", + trigger: + 'a[href*="/my/knowledge/documents"]:contains("Knowledge Documents"):first', + }, + { + content: "Check public document_page is loaded", + trigger: + 'a[href*="/knowledge/document/"]:contains("Test Public Page 1"):first', + }, + ] + ); - tour.register('document_page_portal_search_tour', { - test: true, - url: '/my/knowledge/documents', - }, - [ - { - content: "Search", - trigger: "input[name='search']", - run: "text Test", - }, + tour.register( + "document_page_portal_search_tour", { - content: "Click Search.", - extra_trigger: "#wrap:not(:has(input[name=search]:propValue('')))", - trigger: '.search-submit', + test: true, + url: "/my/knowledge/documents", }, - ]); + [ + { + content: "Search", + trigger: "input[name='search']", + run: "text Test", + }, + { + content: "Click Search.", + extra_trigger: "#wrap:not(:has(input[name=search]:propValue('')))", + trigger: ".search-submit", + }, + ] + ); }); diff --git a/document_page_portal/tests/test_document_page_portal.py b/document_page_portal/tests/test_document_page_portal.py index ae65ad761ec..af3c2bc5ce2 100644 --- a/document_page_portal/tests/test_document_page_portal.py +++ b/document_page_portal/tests/test_document_page_portal.py @@ -4,15 +4,17 @@ import odoo.tests -@odoo.tests.tagged('post_install', '-at_install') -class TestUi(odoo.tests.HttpCase): +@odoo.tests.tagged("post_install", "-at_install") +class TestPortalDocumentPage(odoo.tests.HttpCase): def test_01_document_page_portal_tour(self): # Create a public document - self.env['document.page'].create({ - 'name': 'Test Public Page 1', - 'content': 'Test content', - 'is_public': True, - }) + self.env["document.page"].create( + { + "name": "Test Public Page 1", + "content": "Test content", + "is_public": True, + } + ) self.phantom_js( "/", @@ -20,14 +22,15 @@ def test_01_document_page_portal_tour(self): ".run('document_page_portal_tour')", "odoo.__DEBUG__.services['web_tour.tour']" ".tours.document_page_portal_tour.ready", - login="portal" + login="portal", ) + def test_02_document_page_portal_tour(self): self.phantom_js( "/", "odoo.__DEBUG__.services['web_tour.tour']" ".run('document_page_portal_search_tour')", "odoo.__DEBUG__.services['web_tour.tour']" ".tours.document_page_portal_search_tour.ready", - login="portal" + login="portal", ) diff --git a/document_page_portal/views/assets.xml b/document_page_portal/views/assets.xml index 9b3edfbb515..496baf9d62a 100644 --- a/document_page_portal/views/assets.xml +++ b/document_page_portal/views/assets.xml @@ -1,11 +1,18 @@ - + - -