diff --git a/__unported__/document_page_approval/document_page_approval.py b/__unported__/document_page_approval/document_page_approval.py
deleted file mode 100644
index 5bc78b9e..00000000
--- a/__unported__/document_page_approval/document_page_approval.py
+++ /dev/null
@@ -1,243 +0,0 @@
-# -*- encoding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2013 Savoir-faire Linux ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from datetime import datetime
-from openerp.osv import fields, orm
-from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
-
-
-class document_page_history_wkfl(orm.Model):
- _inherit = 'document.page.history'
-
- def page_approval_draft(self, cr, uid, ids, context=None):
- self.write(cr, uid, ids, {'state': 'draft'})
-
- template_id = self.pool.get('ir.model.data').get_object_reference(
- cr, uid,
- 'document_page_approval',
- 'email_template_new_draft_need_approval')[1]
- for page in self.browse(cr, uid, ids, context=context):
- if page.is_parent_approval_required:
- self.pool.get('email.template').send_mail(
- cr, uid, template_id, page.id, force_send=True
- )
-
- return True
-
- def page_approval_approved(self, cr, uid, ids, context=None):
- self.write(cr, uid, ids, {
- 'state': 'approved',
- 'approved_date': datetime.now().strftime(
- DEFAULT_SERVER_DATETIME_FORMAT),
- 'approved_uid': uid
- }, context=context)
- return True
-
- def can_user_approve_page(self, cr, uid, ids, name, args, context=None):
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
- res = {}
- for page in self.browse(cr, uid, ids, context=context):
- res[page.id] = self.can_user_approve_this_page(page.page_id, user)
-
- return res
-
- def can_user_approve_this_page(self, page, user):
- if page:
- res = page.approver_gid in user.groups_id
- res = res or self.can_user_approve_this_page(page.parent_id, user)
- else:
- res = False
-
- return res
-
- def get_approvers_guids(self, cr, uid, ids, name, args, context=None):
- res = {}
- for page in self.browse(cr, uid, ids, context=context):
- res[page.id] = self.get_approvers_guids_for_page(page.page_id)
-
- return res
-
- def get_approvers_guids_for_page(self, page):
- if page:
- if page.approver_gid:
- res = [page.approver_gid.id]
- else:
- res = []
- res.extend(self.get_approvers_guids_for_page(page.parent_id))
- else:
- res = []
-
- return res
-
- def get_approvers_email(self, cr, uid, ids, name, args, context):
- res = {}
- for id in ids:
- emails = ''
- guids = self.get_approvers_guids(
- cr, uid, ids, name, args, context=context)
- uids = self.pool.get('res.users').search(
- cr, uid, [('groups_id', 'in', guids[id])])
- users = self.pool.get('res.users').browse(
- cr, uid, uids, context=context)
-
- for user in users:
- if user.email:
- emails += user.email
- emails += ','
- else:
- empl_id = self.pool.get('hr.employee').search(
- cr, uid, [('login', '=', user.login)])[0]
- empl = self.pool.get('hr.employee').browse(
- cr, uid, empl_id, context=context)
- if empl.work_email:
- emails += empl.work_email
- emails += ','
-
- emails = emails[:-1]
- res[id] = emails
- return res
-
- def get_page_url(self, cr, uid, ids, name, args, context):
- res = {}
- for id in ids:
- base_url = self.pool.get('ir.config_parameter').get_param(
- cr, uid, 'web.base.url', default='http://localhost:8069',
- context=context)
-
- res[id] = base_url + (
- '/#db=%s&id=%s&view_type=form&model=document.page.history' %
- (cr.dbname, id))
-
- return res
-
- _columns = {
- 'state': fields.selection([
- ('draft', 'Draft'),
- ('approved', 'Approved')], 'Status', readonly=True),
- 'approved_date': fields.datetime("Approved Date"),
- 'approved_uid': fields.many2one('res.users', "Approved By"),
- 'is_parent_approval_required': fields.related(
- 'page_id', 'is_parent_approval_required',
- string="parent approval", type='boolean', store=False),
- 'can_user_approve_page': fields.function(
- can_user_approve_page, string="can user approve this page",
- type='boolean', store=False),
- 'get_approvers_email': fields.function(
- get_approvers_email, string="get all approvers email",
- type='text', store=False),
- 'get_page_url': fields.function(get_page_url, string="URL",
- type='text', store=False),
- }
-
-
-class document_page_approval(orm.Model):
- _inherit = 'document.page'
-
- def _get_display_content(self, cr, uid, ids, name, args, context=None):
- res = {}
- for page in self.browse(cr, uid, ids, context=context):
- content = ""
- if page.type == "category":
- content = self._get_page_index(cr, uid, page, link=False)
- else:
- history = self.pool.get('document.page.history')
- if self.is_approval_required(page):
- history_ids = history.search(
- cr, uid, [
- ('page_id', '=', page.id),
- ('state', '=', 'approved')
- ], limit=1, order='create_date DESC')
- for h in history.browse(cr, uid, history_ids,
- context=context):
- content = h.content
- else:
- content = page.content
- res[page.id] = content
- return res
-
- def _get_approved_date(self, cr, uid, ids, name, args, context=None):
- res = {}
- for page in self.browse(cr, uid, ids, context=context):
- if self.is_approval_required(page):
- history = self.pool.get('document.page.history')
- history_ids = history.search(
- cr, uid, [
- ('page_id', '=', page.id),
- ('state', '=', 'approved')
- ], limit=1, order='create_date DESC')
- approved_date = False
- for h in history.browse(cr, uid, history_ids):
- approved_date = h.approved_date
- res[page.id] = approved_date
- else:
- res[page.id] = ""
-
- return res
-
- def _get_approved_uid(self, cr, uid, ids, name, args, context=None):
- res = {}
- for page in self.browse(cr, uid, ids, context=context):
- if self.is_approval_required(page):
- history = self.pool.get('document.page.history')
- history_ids = history.search(cr, uid, [
- ('page_id', '=', page.id),
- ('state', '=', 'approved')], limit=1,
- order='create_date DESC')
- approved_uid = False
- for h in history.browse(cr, uid, history_ids):
- approved_uid = h.approved_uid.id
- res[page.id] = approved_uid
- else:
- res[page.id] = ""
-
- return res
-
- def _is_parent_approval_required(self, cr, uid, ids, name, args,
- context=None):
- res = {}
- for page in self.browse(cr, uid, ids, context=context):
- res[page.id] = self.is_approval_required(page)
-
- return res
-
- def is_approval_required(self, page):
- if page:
- res = page.approval_required
- res = res or self.is_approval_required(page.parent_id)
- else:
- res = False
-
- return res
-
- _columns = {
- 'display_content': fields.function(
- _get_display_content, string='Displayed Content', type='text'),
- 'approved_date': fields.function(
- _get_approved_date, string="Approved Date", type='datetime'),
- 'approved_uid': fields.function(
- _get_approved_uid, string="Approved By", type='many2one',
- obj='res.users'),
- 'approval_required': fields.boolean("Require approval"),
- 'is_parent_approval_required': fields.function(
- _is_parent_approval_required, string="parent approval",
- type='boolean'),
- 'approver_gid': fields.many2one("res.groups", "Approver group"),
- }
diff --git a/__unported__/document_page_approval/document_page_view.xml b/__unported__/document_page_approval/document_page_view.xml
deleted file mode 100644
index 04ef551c..00000000
--- a/__unported__/document_page_approval/document_page_view.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
- document.page.history.form
- document.page.history
-
-
-
-
-
-
-
-
-
- document.page.form
- document.page
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- document.page.history.tree
- document.page.history
-
-
-
-
-
-
-
-
-
-
diff --git a/__unported__/document_page_approval/document_page_wkfl.xml b/__unported__/document_page_approval/document_page_wkfl.xml
deleted file mode 100644
index f92d8463..00000000
--- a/__unported__/document_page_approval/document_page_wkfl.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
- document.page.history.aproval.wkf
- document.page.history
- True
-
-
-
-
- True
- draft
- function
- page_approval_draft()
-
-
-
-
- approved
- function
- page_approval_approved()
- True
-
-
-
-
-
- page_approval_approve
-
-
-
-
-
- edit
-
-
-
-
-
-
-
-
-
- Automated new draft need approval Notification Mail
- ${object.create_uid.company_id.email or 'noreply@localhost.com'}
- New version of "${object.page_id.name}" to approve
- ${object.get_approvers_email}
-
-
- ${object.create_uid.partner_id.lang}
- Hello,
-
-The page "${object.page_id.name}" has been modified and need your approval.
-
-You can review the new version here : ${object.get_page_url}
-
-Have a great day.
---
-OpenERP
]]>
-
-
-
-
-
-
diff --git a/document_page/__openerp__.py b/document_page/__openerp__.py
index 4761340c..769422ea 100644
--- a/document_page/__openerp__.py
+++ b/document_page/__openerp__.py
@@ -32,7 +32,7 @@ Web pages
'website': 'http://www.openerp.com/',
'license': 'AGPL-3',
'depends': [
- 'knowledge'
+ 'knowledge',
],
'data': [
'wizard/document_page_create_menu_view.xml',
diff --git a/document_page/document_page.py b/document_page/document_page.py
index 8983ba00..57e6d050 100644
--- a/document_page/document_page.py
+++ b/document_page/document_page.py
@@ -18,9 +18,12 @@
# along with this program. If not, see .
#
##############################################################################
+import logging
import difflib
from openerp import models, fields, api, _
+_logger = logging.getLogger(__name__)
+
class document_page(models.Model):
_name = "document.page"
@@ -177,3 +180,14 @@ class document_page_history(models.Model):
"Revision-{}".format(v2),
context=True
)
+
+ def __getattr__(self, attr):
+ """Return a dummy callabale"""
+ if attr in ['_sql', 'init', '_ids']:
+ raise AttributeError
+
+ _logger.warning(
+ "Trying to access attribute %s on document_page_history",
+ attr
+ )
+ return (lambda *a, **b: None)
diff --git a/__unported__/document_page_approval/__init__.py b/document_page_approval/__init__.py
similarity index 96%
rename from __unported__/document_page_approval/__init__.py
rename to document_page_approval/__init__.py
index d0594caf..d2b3bb9e 100644
--- a/__unported__/document_page_approval/__init__.py
+++ b/document_page_approval/__init__.py
@@ -18,5 +18,4 @@
# along with this program. If not, see .
#
##############################################################################
-
-import document_page_approval
+from . import document_page_approval
diff --git a/__unported__/document_page_approval/__openerp__.py b/document_page_approval/__openerp__.py
similarity index 95%
rename from __unported__/document_page_approval/__openerp__.py
rename to document_page_approval/__openerp__.py
index e5aadb7c..dcb7429b 100644
--- a/__unported__/document_page_approval/__openerp__.py
+++ b/document_page_approval/__openerp__.py
@@ -43,16 +43,18 @@ Scenario
* Users reading the page see the last approved version.
""",
'depends': [
+ 'knowledge',
'document_page',
'email_template',
- ],
+ ],
'data': [
+ 'data/email_template.xml',
'document_page_wkfl.xml',
'document_page_view.xml',
'security/document_page_security.xml',
'security/ir.model.access.csv',
- ],
- 'installable': False,
+ ],
+ 'installable': True,
'auto_install': False,
'images': [
'images/category.png',
diff --git a/document_page_approval/data/email_template.xml b/document_page_approval/data/email_template.xml
new file mode 100644
index 00000000..af77719d
--- /dev/null
+++ b/document_page_approval/data/email_template.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+ Automated new draft need approval Notification Mail
+ ${object.create_uid.company_id.email or 'noreply@localhost.com'}
+ New version of "${object.page_id.name}" to approve
+ ${object.get_approvers_email}
+
+
+ ${object.create_uid.partner_id.lang}
+ Hello,
+
+The page "${object.page_id.name}" has been modified and need your approval.
+
+You can review the new version here : ${object.get_page_url}
+
+Have a great day.
+--
+OpenERP
]]>
+
+
+
+
+
diff --git a/document_page_approval/document_page_approval.py b/document_page_approval/document_page_approval.py
new file mode 100644
index 00000000..1d5002d5
--- /dev/null
+++ b/document_page_approval/document_page_approval.py
@@ -0,0 +1,258 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2013 Savoir-faire Linux ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+from datetime import datetime
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
+from openerp import models, fields
+
+
+class document_page_history_wkfl(models.Model):
+ _inherit = 'document.page.history'
+
+ def page_approval_draft(self, cr, uid, ids, context=None):
+ self.write(cr, uid, ids, {'state': 'draft'})
+ template_id = self.pool.get('ir.model.data').get_object_reference(
+ cr, uid,
+ 'document_page_approval',
+ 'email_template_new_draft_need_approval')[1]
+ for page in self.browse(cr, uid, ids, context=context):
+ if page.is_parent_approval_required:
+ self.pool.get('email.template').send_mail(
+ cr,
+ uid,
+ template_id,
+ page.id,
+ force_send=True
+ )
+ return True
+
+ def page_approval_approved(self, cr, uid, ids, context=None):
+ self.write(cr, uid, ids, {
+ 'state': 'approved',
+ 'approved_date': datetime.now().strftime(
+ DEFAULT_SERVER_DATETIME_FORMAT),
+ 'approved_uid': uid
+ }, context=context)
+ return True
+
+ def _can_user_approve_page(self):
+ user = self.env.user
+ for page in self:
+ page.can_user_approve_page = page.can_user_approve_this_page(
+ page.page_id,
+ user
+ )
+
+ def can_user_approve_this_page(self, page, user):
+ if page:
+ res = page.approver_gid in user.groups_id
+ res = res or self.can_user_approve_this_page(page.parent_id, user)
+ else:
+ res = False
+ return res
+
+ def get_approvers_guids(self):
+ res = {}
+ for page in self:
+ res[page.id] = self.get_approvers_guids_for_page(page.page_id)
+ return res
+
+ def get_approvers_guids_for_page(self, page):
+ if page:
+ if page.approver_gid:
+ res = [page.approver_gid.id]
+ else:
+ res = []
+ res.extend(self.get_approvers_guids_for_page(page.parent_id))
+ else:
+ res = []
+
+ return res
+
+ def _get_approvers_email(self):
+ for page in self:
+ emails = ''
+ guids = self.get_approvers_guids()
+ uids = [i.id for i in self.env['res.users'].search([
+ ('groups_id', 'in', guids[page.id])
+ ])]
+ users = self.env['res.users'].browse(uids)
+
+ for user in users:
+ if user.email:
+ emails += user.email
+ emails += ','
+ else:
+ empl = self.env['hr.employee'].search([
+ ('login', '=', user.login)
+ ])
+ if empl.work_email:
+ emails += empl.work_email
+ emails += ','
+
+ page.get_approvers_email = emails[:-1]
+
+ def _get_page_url(self):
+ for page in self:
+ base_url = self.env['ir.config_parameter'].get_param(
+ 'web.base.url',
+ default='http://localhost:8069'
+ )
+
+ page.get_page_url = (
+ '{}/#db={}&id={}&view_type=form&'
+ 'model=document.page.history').format(
+ base_url,
+ self.env.cr.dbname,
+ page.id
+ )
+
+ state = fields.Selection(
+ [('draft', 'Draft'), ('approved', 'Approved')],
+ 'Status',
+ readonly=True
+ )
+
+ approved_date = fields.Datetime("Approved Date")
+
+ approved_uid = fields.Many2one(
+ 'res.users',
+ "Approved By"
+ )
+
+ is_parent_approval_required = fields.Boolean(
+ related='page_id.is_parent_approval_required',
+ string="parent approval",
+ store=False
+ )
+
+ can_user_approve_page = fields.Boolean(
+ compute=_can_user_approve_page,
+ string="can user approve this page",
+ store=False
+ )
+ get_approvers_email = fields.Text(
+ compute=_get_approvers_email,
+ string="get all approvers email",
+ store=False
+ )
+ get_page_url = fields.Text(
+ compute=_get_page_url,
+ string="URL",
+ store=False
+ )
+
+
+class document_page_approval(models.Model):
+ _inherit = 'document.page'
+
+ def _get_display_content(self):
+ for page in self:
+ content = ""
+ if page.type == "category":
+ content = self._get_page_index(page, link=False)
+ else:
+ history = self.env['document.page.history']
+ if self.is_approval_required(page):
+ history_ids = history.search(
+ [
+ ('page_id', '=', page.id),
+ ('state', '=', 'approved')
+ ],
+ limit=1,
+ order='create_date DESC'
+ )
+ content = history_ids.content
+ else:
+ content = page.content
+ page.display_content = content
+
+ def _get_approved_date(self):
+ for page in self:
+ approved_date = False
+ if self.is_approval_required(page):
+ history = self.env['document.page.history']
+ history_ids = history.search(
+ [
+ ('page_id', '=', page.id),
+ ('state', '=', 'approved')
+ ],
+ limit=1,
+ order='create_date DESC'
+ )
+ approved_date = history_ids.approved_date
+ page.approved_date = approved_date
+
+ def _get_approved_uid(self):
+ for page in self:
+ approved_uid = False
+ if self.is_approval_required(page):
+ history = self.env['document.page.history']
+ history_ids = history.search(
+ [
+ ('page_id', '=', page.id),
+ ('state', '=', 'approved')
+ ],
+ limit=1,
+ order='create_date DESC'
+ )
+ approved_uid = history_ids.approved_uid.id
+ page.approved_uid = approved_uid
+
+ def _is_parent_approval_required(self):
+ for page in self:
+ page.is_parent_approval_required = self.is_approval_required(page)
+
+ def is_approval_required(self, page):
+ if page:
+ res = page.approval_required
+ res = res or self.is_approval_required(page.parent_id)
+ else:
+ res = False
+ return res
+
+ display_content = fields.Text(
+ compute=_get_display_content,
+ string='Displayed Content'
+ )
+
+ approved_date = fields.Datetime(
+ compute=_get_approved_date,
+ string="Approved Date"
+ )
+
+ approved_uid = fields.Many2one(
+ 'res.users',
+ compute=_get_approved_uid,
+ string="Approved By",
+ )
+
+ approval_required = fields.Boolean("Require approval")
+
+ is_parent_approval_required = fields.Boolean(
+ compute=_is_parent_approval_required,
+ string="parent approval"
+ )
+
+ approver_gid = fields.Many2one(
+ "res.groups",
+ "Approver group"
+ )
diff --git a/document_page_approval/document_page_view.xml b/document_page_approval/document_page_view.xml
new file mode 100644
index 00000000..3cf9e574
--- /dev/null
+++ b/document_page_approval/document_page_view.xml
@@ -0,0 +1,70 @@
+
+
+
+
+ document.page.history.form
+ document.page.history
+
+
+
+
+
+
+
+
+
+ document.page.form
+ document.page
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ document.page.history.tree
+ document.page.history
+
+
+
+
+
+
+
+
+
+
diff --git a/document_page_approval/document_page_wkfl.xml b/document_page_approval/document_page_wkfl.xml
new file mode 100644
index 00000000..7dc85019
--- /dev/null
+++ b/document_page_approval/document_page_wkfl.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+ document.page.history.aproval.wkf
+ document.page.history
+ True
+
+
+
+
+ approved
+ function
+ page_approval_approved()
+ True
+
+
+
+
+ True
+ draft
+ function
+ page_approval_draft()
+
+
+
+
+
+ page_approval_approve
+
+
+
+
+
+ edit
+
+
+
+
+
diff --git a/__unported__/document_page_approval/i18n/document_page_approval.pot b/document_page_approval/i18n/document_page_approval.pot
similarity index 100%
rename from __unported__/document_page_approval/i18n/document_page_approval.pot
rename to document_page_approval/i18n/document_page_approval.pot
diff --git a/__unported__/document_page_approval/i18n/fr.po b/document_page_approval/i18n/fr.po
similarity index 100%
rename from __unported__/document_page_approval/i18n/fr.po
rename to document_page_approval/i18n/fr.po
diff --git a/__unported__/document_page_approval/images/category.png b/document_page_approval/images/category.png
similarity index 100%
rename from __unported__/document_page_approval/images/category.png
rename to document_page_approval/images/category.png
diff --git a/__unported__/document_page_approval/images/page_history.png b/document_page_approval/images/page_history.png
similarity index 100%
rename from __unported__/document_page_approval/images/page_history.png
rename to document_page_approval/images/page_history.png
diff --git a/__unported__/document_page_approval/images/page_history_list.png b/document_page_approval/images/page_history_list.png
similarity index 100%
rename from __unported__/document_page_approval/images/page_history_list.png
rename to document_page_approval/images/page_history_list.png
diff --git a/__unported__/document_page_approval/security/document_page_security.xml b/document_page_approval/security/document_page_security.xml
similarity index 100%
rename from __unported__/document_page_approval/security/document_page_security.xml
rename to document_page_approval/security/document_page_security.xml
diff --git a/__unported__/document_page_approval/security/ir.model.access.csv b/document_page_approval/security/ir.model.access.csv
similarity index 100%
rename from __unported__/document_page_approval/security/ir.model.access.csv
rename to document_page_approval/security/ir.model.access.csv