diff --git a/document_page_approval/__init__.py b/document_page_approval/__init__.py
index bd56742e..d0594caf 100644
--- a/document_page_approval/__init__.py
+++ b/document_page_approval/__init__.py
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2013 Savoir-faire Linux ().
#
@@ -15,10 +15,8 @@
# 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 .
+# along with this program. If not, see .
#
##############################################################################
import document_page_approval
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/document_page_approval/__openerp__.py b/document_page_approval/__openerp__.py
index 22a9559e..75bbc31d 100644
--- a/document_page_approval/__openerp__.py
+++ b/document_page_approval/__openerp__.py
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2013 Savoir-faire Linux ().
#
@@ -15,28 +15,42 @@
# 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 .
+# along with this program. If not, see .
#
##############################################################################
{
'name': 'Document Page Approval',
'version': '1.0',
- "author" : "Savoir-faire Linux",
- "website" : "http://www.savoirfairelinux.com",
- "license" : "AGPL-3",
+ "author": "Savoir-faire Linux",
+ "website": "http://www.savoirfairelinux.com",
+ "license": "AGPL-3",
'category': 'Knowledge Management',
'description': """
-Add a workflow to approve page modification and show the approved version by default
+This module adds a workflow to approve page modification and show the approved version by default.
+
+Scenario
+========
+
+* Set a valid email address on the company settings.
+* Create a new page category and set an approver group. Make sure users belonging to that group
+ have valid email addresses.
+* Create a new page and choose the previously created category.
+* A notification is sent to the group with a link to the page history to review.
+* Depending on the review, the page history is approved or not.
+* Users reading the page see the last approved version.
""",
- 'depends': ['document_page', 'email_template'],
- 'update_xml': ['document_page_wkfl.xml','document_page_view.xml'],
- 'installable': True,
- 'auto_install': False,
- 'images': [],
+ 'depends': [
+ 'document_page',
+ 'email_template',
+ ],
'data': [
+ 'document_page_wkfl.xml',
+ 'document_page_view.xml',
'security/document_page_security.xml',
'security/ir.model.access.csv',
- ]
+ ],
+ 'installable': True,
+ 'auto_install': False,
+ 'images': ['images/category.png', 'images/page_history_list.png', 'images/page_history.png'],
}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/document_page_approval/document_page_approval.py b/document_page_approval/document_page_approval.py
index 20d8af0a..8feeabd9 100644
--- a/document_page_approval/document_page_approval.py
+++ b/document_page_approval/document_page_approval.py
@@ -1,6 +1,6 @@
# -*- encoding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2013 Savoir-faire Linux ().
#
@@ -15,183 +15,209 @@
# 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 .
+# along with this program. If not, see .
#
##############################################################################
+
+from datetime import datetime
from openerp.osv import fields, orm
-from datetime import *
+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):
- 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):
+
+ 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)
+ 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):
- self.write(cr, uid, ids, { 'state' : 'approved',
- 'approved_date' : datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
- 'approved_uid': uid
- })
+
+ 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)
+ 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)
-
+ 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
-
+ 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)
-
+ 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 = []
res.extend(self.get_approvers_guids_for_page(page.parent_id))
else:
- res=[]
-
+ res = []
+
return res
-
+
def get_approvers_email(self, cr, uid, ids, name, args, context):
- res = {}
+ 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)
+ 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.user_email:
- emails += user.user_email
+ 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)
+ 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]
+ emails = emails[:-1]
res[id] = emails
return res
-
+
def get_page_url(self, cr, uid, ids, name, args, context):
- res = {}
+ 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);
-
+ 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),
+ ('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="get page url", type='text', store=False),
+ '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=""
+ content = ""
if page.type == "category":
- content = self._get_page_index(cr, uid, page, link=False)
+ 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):
+ 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
+ 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')
+ 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
+ res[page.id] = approved_date
else:
- res[page.id] = ""
-
+ 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')
+ 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
+ res[page.id] = approved_uid
else:
- res[page.id] = ""
-
+ 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)
-
+ 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
-
+ 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'),
+ 'is_parent_approval_required': fields.function(
+ _is_parent_approval_required, string="parent approval", type='boolean'),
'approver_gid': fields.many2one("res.groups", "Approver group"),
}
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/document_page_approval/document_page_view.xml b/document_page_approval/document_page_view.xml
index afaa9fbf..04ef551c 100644
--- a/document_page_approval/document_page_view.xml
+++ b/document_page_approval/document_page_view.xml
@@ -30,7 +30,8 @@
-
+
diff --git a/document_page_approval/document_page_wkfl.xml b/document_page_approval/document_page_wkfl.xml
index 4ee782c7..f92d8463 100644
--- a/document_page_approval/document_page_wkfl.xml
+++ b/document_page_approval/document_page_wkfl.xml
@@ -1,6 +1,7 @@
+
document.page.history.aproval.wkf
document.page.history
@@ -34,6 +35,12 @@
edit
+
+
+
+
+
+
Automated new draft need approval Notification Mail
@@ -42,25 +49,29 @@
${object.get_approvers_email}
- ${object.employee_id.partner_id.lang}
-
- ${object.create_uid.partner_id.lang}
+ Hello,
-The page "${object.page_id.name}" has been modified and need aprobation.
+The page "${object.page_id.name}" has been modified and need your approval.
-You can view the new version there: ${object.get_page_url}
-
- ]]>
+You can review the new version here : ${object.get_page_url}
+
+Have a great day.
+--
+OpenERP
]]>
-
-
+You can review the new version here: ${object.get_page_url}
+
+Have a great day.
+--
+OpenERP]]>
+
diff --git a/document_page_approval/i18n/document_page_approval.pot b/document_page_approval/i18n/document_page_approval.pot
new file mode 100644
index 00000000..4ddc9733
--- /dev/null
+++ b/document_page_approval/i18n/document_page_approval.pot
@@ -0,0 +1,110 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * document_page_approval
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-19 03:58+0000\n"
+"PO-Revision-Date: 2013-07-19 03:58+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: document_page_approval
+#: field:document.page.history,state:0
+msgid "Status"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page,approval_required:0
+msgid "Require approval"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page,is_parent_approval_required:0
+#: field:document.page.history,is_parent_approval_required:0
+msgid "parent approval"
+msgstr ""
+
+#. module: document_page_approval
+#: model:email.template,body_html:document_page_approval.email_template_new_draft_need_approval
+msgid "\n"
+"Hello,
\n"
+"\n"
+"The page \"${object.page_id.name}\" has been modified and need your approval.
\n"
+"\n"
+"You can review the new version here : ${object.get_page_url}
\n"
+" \n"
+"Have a great day.
\n"
+"--
\n"
+"OpenERP
\n"
+" "
+msgstr ""
+
+#. module: document_page_approval
+#: model:ir.model,name:document_page_approval.model_document_page
+msgid "Document Page"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page,approved_uid:0
+#: field:document.page.history,approved_uid:0
+msgid "Approved By"
+msgstr ""
+
+#. module: document_page_approval
+#: model:email.template,subject:document_page_approval.email_template_new_draft_need_approval
+msgid "New version of \"${object.page_id.name}\" to approve"
+msgstr ""
+
+#. module: document_page_approval
+#: selection:document.page.history,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page.history,get_page_url:0
+msgid "URL"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page,approved_date:0
+#: field:document.page.history,approved_date:0
+msgid "Approved Date"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page.history,can_user_approve_page:0
+msgid "can user approve this page"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page,approver_gid:0
+msgid "Approver group"
+msgstr ""
+
+#. module: document_page_approval
+#: model:ir.model,name:document_page_approval.model_document_page_history
+msgid "Document Page History"
+msgstr ""
+
+#. module: document_page_approval
+#: view:document.page.history:0
+msgid "Approve"
+msgstr ""
+
+#. module: document_page_approval
+#: selection:document.page.history,state:0
+msgid "Approved"
+msgstr ""
+
+#. module: document_page_approval
+#: field:document.page.history,get_approvers_email:0
+msgid "get all approvers email"
+msgstr ""
+
diff --git a/document_page_approval/i18n/fr.po b/document_page_approval/i18n/fr.po
new file mode 100644
index 00000000..26573fa4
--- /dev/null
+++ b/document_page_approval/i18n/fr.po
@@ -0,0 +1,119 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * document_page_approval
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-19 03:58+0000\n"
+"PO-Revision-Date: 2013-07-19 03:58+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: document_page_approval
+#: field:document.page.history,state:0
+msgid "Status"
+msgstr "Statut"
+
+#. module: document_page_approval
+#: field:document.page,approval_required:0
+msgid "Require approval"
+msgstr "Nécessite une approbation"
+
+#. module: document_page_approval
+#: field:document.page,is_parent_approval_required:0
+#: field:document.page.history,is_parent_approval_required:0
+msgid "parent approval"
+msgstr "Approbation parente"
+
+#. module: document_page_approval
+#: model:email.template,body_html:document_page_approval.email_template_new_draft_need_approval
+msgid "\n"
+"Hello,
\n"
+"\n"
+"The page \"${object.page_id.name}\" has been modified and need your approval.
\n"
+"\n"
+"You can review the new version here : ${object.get_page_url}
\n"
+" \n"
+"Have a great day.
\n"
+"--
\n"
+"OpenERP
\n"
+" "
+msgstr "\n"
+"Bonjour,
\n"
+"\n"
+"La page \"${object.page_id.name}\" a été modifié et demande votre approbation.
\n"
+"\n"
+"Vous pouvez réviser la nouvelle version ici : ${object.get_page_url}
\n"
+" \n"
+"Bonne journée.
\n"
+"--
\n"
+"OpenERP
\n"
+" "
+
+#. module: document_page_approval
+#: model:ir.model,name:document_page_approval.model_document_page
+msgid "Document Page"
+msgstr "Page"
+
+#. module: document_page_approval
+#: field:document.page,approved_uid:0
+#: field:document.page.history,approved_uid:0
+msgid "Approved By"
+msgstr "Approuvée par"
+
+#. module: document_page_approval
+#: model:email.template,subject:document_page_approval.email_template_new_draft_need_approval
+msgid "New version of \"${object.page_id.name}\" to approve"
+msgstr "Nouvelle version de \"${object.page_id.name}\" à approuver"
+
+#. module: document_page_approval
+#: selection:document.page.history,state:0
+msgid "Draft"
+msgstr "Brouillon"
+
+#. module: document_page_approval
+#: field:document.page.history,get_page_url:0
+msgid "URL"
+msgstr "URL"
+
+#. module: document_page_approval
+#: field:document.page,approved_date:0
+#: field:document.page.history,approved_date:0
+msgid "Approved Date"
+msgstr "Date d'approbation"
+
+#. module: document_page_approval
+#: field:document.page.history,can_user_approve_page:0
+msgid "can user approve this page"
+msgstr "Est-ce que l'usager peut approuver cette page ?"
+
+#. module: document_page_approval
+#: field:document.page,approver_gid:0
+msgid "Approver group"
+msgstr "Groupe approbateur"
+
+#. module: document_page_approval
+#: model:ir.model,name:document_page_approval.model_document_page_history
+msgid "Document Page History"
+msgstr "Historique de la page"
+
+#. module: document_page_approval
+#: view:document.page.history:0
+msgid "Approve"
+msgstr "Approuver"
+
+#. module: document_page_approval
+#: selection:document.page.history,state:0
+msgid "Approved"
+msgstr "Approuvée"
+
+#. module: document_page_approval
+#: field:document.page.history,get_approvers_email:0
+msgid "get all approvers email"
+msgstr "Récupérer toutes les adresses courriels des approbateurs"
diff --git a/document_page_approval/images/category.png b/document_page_approval/images/category.png
new file mode 100644
index 00000000..b88e2091
Binary files /dev/null and b/document_page_approval/images/category.png differ
diff --git a/document_page_approval/images/page_history.png b/document_page_approval/images/page_history.png
new file mode 100644
index 00000000..80bee3c3
Binary files /dev/null and b/document_page_approval/images/page_history.png differ
diff --git a/document_page_approval/images/page_history_list.png b/document_page_approval/images/page_history_list.png
new file mode 100644
index 00000000..a2f52232
Binary files /dev/null and b/document_page_approval/images/page_history_list.png differ