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