diff --git a/.travis.yml b/.travis.yml
index 96d6c780e70..187571898b1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,8 +20,8 @@ env:
- secure: "k8/ebCIiOPGEIcL4Pzji2tanrjAzP5bqY0dSOmZwdNVNfncCrQREYbQgPhuTJHKuEX5E76kCuJJE70x0PEFhtaJt6K8KLvIF3B7/FJNUdXy6cjOKgBNfJuBSJRmkRM8mfxS2K+mqi4R3OEy4R2v4X/syK6F7vKxNhcRmindDfY8="
matrix:
- - LINT_CHECK="1"
- - TRANSIFEX="1"
+ - LINT_CHECK="1"
+ - TRANSIFEX="1"
- TESTS="1" ODOO_REPO="OCA/OCB"
- TESTS="1" ODOO_REPO="odoo/odoo"
diff --git a/attachment_preview/i18n/tr.po b/attachment_preview/i18n/tr.po
new file mode 100644
index 00000000000..1abf07fa884
--- /dev/null
+++ b/attachment_preview/i18n/tr.po
@@ -0,0 +1,30 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * attachment_preview
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2022-01-06 16:40+0000\n"
+"Last-Translator: Yavuz Avci \n"
+"Language-Team: none\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3.2\n"
+
+#. module: attachment_preview
+#: model:ir.model,name:attachment_preview.model_ir_attachment
+msgid "Attachment"
+msgstr "Ek"
+
+#. module: attachment_preview
+#. openerp-web
+#: code:addons/attachment_preview/static/src/js/attachment_preview.js:188
+#: code:addons/attachment_preview/static/src/js/attachment_preview.js:216
+#, python-format
+msgid "Preview %s"
+msgstr "%s Önizle"
diff --git a/document_page/__manifest__.py b/document_page/__manifest__.py
index 12fc41e6661..47bc367db11 100644
--- a/document_page/__manifest__.py
+++ b/document_page/__manifest__.py
@@ -3,36 +3,31 @@
{
- 'name': 'Document Page',
- 'version': '12.0.1.2.0',
- 'category': 'Knowledge Management',
- 'author': 'OpenERP SA, Odoo Community Association (OCA)',
- 'images': [
- 'images/category_list.png',
- 'images/create_category.png',
- 'images/page_list.png',
- 'images/create_page.png',
- 'images/customer_invoice.jpeg',
- 'images/page_history.png',
+ "name": "Documentation Page",
+ "version": "12.0.1.4.0",
+ "category": "Knowledge Management",
+ "author": "OpenERP SA, Odoo Community Association (OCA)",
+ "images": [
+ "images/category_list.png",
+ "images/create_category.png",
+ "images/page_list.png",
+ "images/create_page.png",
+ "images/customer_invoice.jpeg",
+ "images/page_history.png",
],
- 'website': 'https://github.com/OCA/knowledge',
- 'license': 'AGPL-3',
- 'depends': [
- 'mail',
- 'knowledge',
- ],
- 'data': [
- 'security/document_page_security.xml',
- 'security/ir.model.access.csv',
- 'wizard/document_page_create_menu.xml',
- 'wizard/document_page_show_diff.xml',
- 'views/document_page.xml',
- 'views/document_page_category.xml',
- 'views/document_page_history.xml',
- 'views/document_page_assets.xml',
- 'views/report_document_page.xml',
- ],
- 'demo': [
- 'demo/document_page.xml'
+ "website": "https://github.com/OCA/knowledge",
+ "license": "AGPL-3",
+ "depends": ["mail", "knowledge"],
+ "data": [
+ "security/document_page_security.xml",
+ "security/ir.model.access.csv",
+ "wizard/document_page_create_menu.xml",
+ "wizard/document_page_show_diff.xml",
+ "views/document_page.xml",
+ "views/document_page_category.xml",
+ "views/document_page_history.xml",
+ "views/document_page_assets.xml",
+ "views/report_document_page.xml",
],
+ "demo": ["demo/document_page.xml"],
}
diff --git a/document_page/demo/document_page.xml b/document_page/demo/document_page.xml
index a45a115731e..f3c959b3eb3 100644
--- a/document_page/demo/document_page.xml
+++ b/document_page/demo/document_page.xml
@@ -1,9 +1,11 @@
-
+
-
+
@@ -11,7 +13,7 @@
1.0Initcategory
-
+
Summary of the feature
Long explanation
@@ -25,7 +27,7 @@ Additional ressources
OpenERP 6.1. Functional Demo
-
+ 1.0Init
@@ -56,7 +58,7 @@ company, with your clients and implement it now for your business. Personalise Dashboards
-
+ 1.0Init
@@ -99,7 +101,7 @@ you change your mind there is a reset button to return to the default view. Touchscreen Point of Sale
-
+ 1.0Init
diff --git a/document_page/models/document_page.py b/document_page/models/document_page.py
index 84cb012c6bc..56582c3d0e8 100644
--- a/document_page/models/document_page.py
+++ b/document_page/models/document_page.py
@@ -1,7 +1,7 @@
# Copyright (C) 2004-2010 Tiny SPRL ().
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from odoo import api, fields, models, _
+from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
@@ -9,49 +9,46 @@ class DocumentPage(models.Model):
"""This class is use to manage Document."""
_name = "document.page"
- _inherit = ['mail.thread', 'mail.activity.mixin']
+ _inherit = ["mail.thread", "mail.activity.mixin"]
_description = "Document Page"
- _order = 'name'
+ _parent_name = "parent_id"
+ _parent_store = True
+ _rec_name = "complete_name"
+ _order = "type, sequence, complete_name"
- name = fields.Char('Title', required=True)
+ name = fields.Char("Title", required=True)
type = fields.Selection(
- [('content', 'Content'), ('category', 'Category')],
- 'Type',
+ [("content", "Content"), ("category", "Category")],
+ "Type",
help="Page type",
- default="content"
+ default="content",
)
active = fields.Boolean(default=True)
parent_id = fields.Many2one(
- 'document.page',
- 'Category',
- domain=[('type', '=', 'category')]
- )
- child_ids = fields.One2many(
- 'document.page',
- 'parent_id',
- 'Children'
+ "document.page", "Category", domain=[("type", "=", "category")]
)
+ child_ids = fields.One2many("document.page", "parent_id", "Children")
content = fields.Text(
"Content",
- compute='_compute_content',
- inverse='_inverse_content',
- search='_search_content',
+ compute="_compute_content",
+ inverse="_inverse_content",
+ search="_search_content",
required=True,
copy=True,
)
# no-op computed field
draft_name = fields.Char(
- string='Name',
- help='Name for the changes made',
+ string="Name",
+ help="Name for the changes made",
compute=lambda x: x,
inverse=lambda x: x,
)
# no-op computed field
draft_summary = fields.Char(
- string='Summary',
- help='Describe the changes made',
+ string="Summary",
+ help="Describe the changes made",
compute=lambda x: x,
inverse=lambda x: x,
)
@@ -59,58 +56,88 @@ class DocumentPage(models.Model):
template = fields.Html(
"Template",
help="Template that will be used as a content template "
- "for all new page of this category.",
+ "for all new page of this category.",
)
history_head = fields.Many2one(
- 'document.page.history',
- 'HEAD',
- compute='_compute_history_head',
+ "document.page.history",
+ "HEAD",
+ compute="_compute_history_head",
store=True,
auto_join=True,
)
history_ids = fields.One2many(
- 'document.page.history',
- 'page_id',
- 'History',
- order='create_date DESC',
- readonly=True,
- )
- menu_id = fields.Many2one(
- 'ir.ui.menu',
- "Menu",
+ "document.page.history",
+ "page_id",
+ "History",
+ order="create_date DESC",
readonly=True,
)
+ menu_id = fields.Many2one("ir.ui.menu", "Menu", readonly=True,)
content_date = fields.Datetime(
- 'Last Contribution Date',
- related='history_head.create_date',
+ "Last Contribution Date",
+ related="history_head.create_date",
store=True,
index=True,
readonly=True,
)
content_uid = fields.Many2one(
- 'res.users',
- 'Last Contributor',
- related='history_head.create_uid',
+ "res.users",
+ "Last Contributor",
+ related="history_head.create_uid",
store=True,
index=True,
readonly=True,
)
company_id = fields.Many2one(
- 'res.company',
- 'Company',
- help='If set, page is accessible only from this company',
+ "res.company",
+ "Company",
+ help="If set, page is accessible only from this company",
index=True,
- ondelete='cascade',
+ ondelete="cascade",
)
backend_url = fields.Char(
- string='Backend URL',
- help='Use it to link resources univocally',
- compute='_compute_backend_url',
+ string="Backend URL",
+ help="Use it to link resources univocally",
+ compute="_compute_backend_url",
+ )
+
+ sequence = fields.Integer(
+ string="Sequence", default=10, help="Used to organise the category."
+ )
+
+ parent_path = fields.Char(index=True)
+ complete_name = fields.Char(
+ "Complete Name", compute="_compute_complete_name", store=True
)
- @api.depends('menu_id', 'parent_id.menu_id')
+ image = fields.Binary("Image", attachment=True,)
+
+ color = fields.Integer(string="Color Index")
+
+ @api.multi
+ def write(self, vals):
+ child_ids = self
+ if vals.get("color", False) and len(vals) == 1:
+ child_ids = self.search(
+ [("type", "=", "category"),
+ ("parent_id", "child_of", self.ids)]
+ )
+ res = super(DocumentPage, child_ids).write(vals)
+ return res
+
+ @api.depends("name", "parent_id.complete_name")
+ def _compute_complete_name(self):
+ for category in self:
+ if category.parent_id:
+ category.complete_name = "{} / {}".format(
+ category.parent_id.complete_name, category.name,
+ )
+ else:
+ category.complete_name = category.name
+
+ @api.depends("menu_id", "parent_id.menu_id")
def _compute_backend_url(self):
- tmpl = '/web#id={}&model=document.page&view_type=form'
+ tmpl = "/web#id={}&model=document.page&view_type=form"
for rec in self:
url = tmpl.format(rec.id)
# retrieve action
@@ -120,13 +147,13 @@ def _compute_backend_url(self):
action = parent.menu_id.action
parent = parent.parent_id
if action:
- url += '&action={}'.format(action.id)
+ url += "&action={}".format(action.id)
rec.backend_url = url
- @api.constrains('parent_id')
+ @api.constrains("parent_id")
def _check_parent_id(self):
if not self._check_recursion():
- raise ValidationError(_('You cannot create recursive categories.'))
+ raise ValidationError(_("You cannot create recursive categories."))
@api.multi
def _get_page_index(self, link=True):
@@ -135,7 +162,7 @@ def _get_page_index(self, link=True):
index = []
for subpage in self.child_ids:
index += ["
" + subpage._get_page_index() + "
"]
- r = ''
+ r = ""
if link:
r = '{}'.format(self.backend_url, self.name)
if index:
@@ -143,35 +170,37 @@ def _get_page_index(self, link=True):
return r
@api.multi
- @api.depends('history_head')
+ @api.depends("history_head")
def _compute_content(self):
for rec in self:
- if rec.type == 'category':
+ if rec.type == "category":
rec.content = rec._get_page_index(link=False)
else:
if rec.history_head:
rec.content = rec.history_head.content
else:
# html widget's default, so it doesn't trigger ghost save
- rec.content = '
'
+ rec.content = "
"
@api.multi
def _inverse_content(self):
for rec in self:
- if rec.type == 'content' and \
- rec.content != rec.history_head.content:
- rec._create_history({
- 'name': rec.draft_name,
- 'summary': rec.draft_summary,
- 'content': rec.content,
- })
+ if rec.type == "content" \
+ and rec.content != rec.history_head.content:
+ rec._create_history(
+ {
+ "name": rec.draft_name,
+ "summary": rec.draft_summary,
+ "content": rec.content,
+ }
+ )
@api.multi
def _search_content(self, operator, value):
- return [('history_head.content', operator, value)]
+ return [("history_head.content", operator, value)]
@api.multi
- @api.depends('history_ids')
+ @api.depends("history_ids")
def _compute_history_head(self):
for rec in self:
if rec.history_ids:
@@ -180,20 +209,20 @@ def _compute_history_head(self):
@api.multi
def _create_history(self, vals):
self.ensure_one()
- history = self.env['document.page.history']
- vals['page_id'] = self.id
+ history = self.env["document.page.history"]
+ vals["page_id"] = self.id
return history.create(vals)
@api.onchange("parent_id")
def _onchange_parent_id(self):
"""We Set it the right content to the new parent."""
- if not self.content or self.content == '
':
+ if not self.content or self.content == "
":
if self.parent_id and self.parent_id.type == "category":
- self.content = self.parent_id.template
+ self.content = self.parent_id.template
@api.multi
def unlink(self):
- menus = self.mapped('menu_id')
+ menus = self.mapped("menu_id")
res = super().unlink()
menus.unlink()
return res
diff --git a/document_page/models/document_page_history.py b/document_page/models/document_page_history.py
index 7467cf05afa..bb27a2042ec 100644
--- a/document_page/models/document_page_history.py
+++ b/document_page/models/document_page_history.py
@@ -2,6 +2,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import difflib
+
from odoo import api, fields, models
from odoo.tools.translate import _
@@ -11,19 +12,19 @@ class DocumentPageHistory(models.Model):
_name = "document.page.history"
_description = "Document Page History"
- _order = 'id DESC'
+ _order = "id DESC"
- page_id = fields.Many2one('document.page', 'Page', ondelete='cascade')
+ page_id = fields.Many2one("document.page", "Page", ondelete="cascade")
name = fields.Char(index=True)
summary = fields.Char(index=True)
content = fields.Text()
- diff = fields.Text(compute='_compute_diff')
+ diff = fields.Text(compute="_compute_diff")
company_id = fields.Many2one(
- 'res.company',
- 'Company',
- help='If set, page is accessible only from this company',
- related='page_id.company_id',
+ "res.company",
+ "Company",
+ help="If set, page is accessible only from this company",
+ related="page_id.company_id",
store=True,
index=True,
readonly=True,
@@ -32,13 +33,16 @@ class DocumentPageHistory(models.Model):
@api.multi
def _compute_diff(self):
"""Shows a diff between this version and the previous version"""
- history = self.env['document.page.history']
+ history = self.env["document.page.history"]
for rec in self:
- prev = history.search([
- ('page_id', '=', rec.page_id.id),
- ('create_date', '<', rec.create_date)],
+ prev = history.search(
+ [
+ ("page_id", "=", rec.page_id.id),
+ ("create_date", "<", rec.create_date),
+ ],
limit=1,
- order='create_date DESC')
+ order="create_date DESC",
+ )
if prev:
rec.diff = self._get_diff(prev.id, rec.id)
else:
@@ -47,23 +51,24 @@ def _compute_diff(self):
@api.model
def _get_diff(self, v1, v2):
"""Return the difference between two version of document version."""
- text1 = v1 and self.browse(v1).content or ''
- text2 = v2 and self.browse(v2).content or ''
+ text1 = v1 and self.browse(v1).content or ""
+ text2 = v2 and self.browse(v2).content or ""
# Include line breaks to make it more readable
# TODO: consider using a beautify library directly on the content
- text1 = text1.replace('