diff --git a/document_multiple_records/__init__.py b/document_multiple_records/__init__.py new file mode 100644 index 00000000..579abcbc --- /dev/null +++ b/document_multiple_records/__init__.py @@ -0,0 +1,26 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 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 . import document +from . import wizard + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/document_multiple_records/__openerp__.py b/document_multiple_records/__openerp__.py new file mode 100644 index 00000000..1118ff48 --- /dev/null +++ b/document_multiple_records/__openerp__.py @@ -0,0 +1,60 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 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 . +# +############################################################################## + +{ + 'name': 'Document Management System for Multiple Records', + 'version': '0.1', + 'category': 'Knowledge Management', + 'summary': 'Document Management System for Multiple Records', + 'description': """ +Document Management System for Multiple Records +============================================== + +Contributors +------------ +* El Hadji Dem (elhadji.dem@savoirfairelinux.com) +""", + 'author': 'Savoir-faire Linux', + 'website': 'www.savoirfairelinux.com', + 'license': 'AGPL-3', + 'depends': [ + 'document', + ], + 'data': [ + 'document_view.xml', + 'security/ir.model.access.csv', + 'wizard/document_wizard_view.xml', + ], + 'js': [ + 'static/src/js/document.js' + ], + 'qweb': [ + 'static/src/xml/document.xml' + ], + 'test': [], + 'demo': [ + ], + 'installable': True, + 'auto_install': False, +} + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/document_multiple_records/document.py b/document_multiple_records/document.py new file mode 100644 index 00000000..f576819b --- /dev/null +++ b/document_multiple_records/document.py @@ -0,0 +1,89 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 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 openerp.osv import orm, fields + + +class document_file(orm.Model): + _inherit = 'ir.attachment' + + _columns = { + 'attachment_document_ids': fields.one2many('ir.attachment.document', + 'attachment_id', + 'Records'), + } + + def create(self, cr, uid, data, context=None): + ir_attachment_document_obj = self.pool.get('ir.attachment.document') + res = super(document_file, self).create(cr, uid, data, context=context) + # Create attachment_document_ids with res_model, res_id and res_name + if 'res_model' in data and 'res_id' in data: + ir_attachment_document_obj.create(cr, uid, { + 'attachment_id': res, + 'res_model': data['res_model'], + 'res_id': data['res_id'], + 'res_name': data.get( + 'res_name', self.pool.get(data['res_model']).browse( + cr, uid, data['res_id'], + context=context).name_get()[0][1]), + }, context=context) + return res + + def unlink(self, cr, uid, ids, context=None, check=True): + ir_attach_doc_obj = self.pool.get('ir.attachment.document') + if context is None: + context = {} + # Deleting from dropdown list in the form view + res_model = context.get('multiple_records_res_model') + res_id = context.get('multiple_records_res_id') + if res_model and res_id: + query = [ + ('res_model', '=', res_model), + ('res_id', '=', res_id), + ('attachment_id', 'in', ids), + ] + ids_to_unlink = ir_attach_doc_obj.search( + cr, uid, query, context=context) + result = ir_attach_doc_obj.unlink( + cr, uid, ids_to_unlink, context=context) + else: + # Normal delete + result = super(document_file, self).unlink(cr, uid, ids, context=context) + return result + + +class ir_attachment_document(orm.Model): + _description = 'Attachment Documents' + _name = 'ir.attachment.document' + + _columns = { + 'res_id': fields.integer('Resource ID', readonly=True, + help="The record id this is attached to."), + 'res_model': fields.char('Resource Model', size=64, + readonly=True, + help="The database object this attachment will be attached to"), + 'res_name': fields.char('Resource Name', type='char', + size=128, + readonly=True), + 'attachment_id': fields.many2one( + 'ir.attachment', 'Attachment', ondelete='cascade'), + } diff --git a/document_multiple_records/document_view.xml b/document_multiple_records/document_view.xml new file mode 100644 index 00000000..0b564086 --- /dev/null +++ b/document_multiple_records/document_view.xml @@ -0,0 +1,30 @@ + + + + + + ir.attachment.multiple.models + ir.attachment + + + + + + + + + + +
+ + + + + +
+
+
+
+
+
+ diff --git a/document_multiple_records/i18n/document_multiple_records.pot b/document_multiple_records/i18n/document_multiple_records.pot new file mode 100644 index 00000000..29aa02b8 --- /dev/null +++ b/document_multiple_records/i18n/document_multiple_records.pot @@ -0,0 +1,140 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * document_multiple_records +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-02-06 19:28+0000\n" +"PO-Revision-Date: 2014-02-06 14:29-0500\n" +"Last-Translator: EL Hadji DEM \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 1.5.4\n" + +#. module: document_multiple_records +#: field:ir.attachment.document,res_id:0 +msgid "Resource ID" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment.wizard:0 +msgid "Select document(s)" +msgstr "" + +#. module: document_multiple_records +#. openerp-web +#: code:addons/document_multiple_records/static/src/xml/document.xml:7 +#, python-format +msgid "Add existing Doc..." +msgstr "" + +#. module: document_multiple_records +#: field:ir.attachment.document,attachment_id:0 +msgid "Attachment" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment.wizard:0 +msgid "AttachmentDocumentWizardTree" +msgstr "" + +#. module: document_multiple_records +#. openerp-web +#: code:addons/document_multiple_records/static/src/js/document.js:26 +#: model:ir.actions.act_window,name:document_multiple_records.action_view_document +#: view:ir.attachment.wizard:0 +#, python-format +msgid "Add Document" +msgstr "" + +#. module: document_multiple_records +#: field:ir.attachment.document,res_name:0 +msgid "Resource Name" +msgstr "" + +#. module: document_multiple_records +#: model:ir.model,name:document_multiple_records.model_ir_attachment_document +msgid "Attachment Documents" +msgstr "" + +#. module: document_multiple_records +#: field:ir.attachment,attachmentdocument_ids:0 +msgid "Records" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment:0 +msgid "AttachmentDocumentTree" +msgstr "" + +#. module: document_multiple_records +#: model:ir.model,name:document_multiple_records.model_ir_attachment +msgid "ir.attachment" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment:0 +msgid "Indexed Content" +msgstr "" + +#. module: document_multiple_records +#: model:ir.model,name:document_multiple_records.model_ir_attachment_wizard +msgid "Attachment wizard" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment:0 +msgid "AttachmentDocumentForm" +msgstr "" + +#. module: document_multiple_records +#: code:addons/document_multiple_records/wizard/document_wizard.py:46 +#, python-format +msgid "Error" +msgstr "" + +#. module: document_multiple_records +#: help:ir.attachment.document,res_model:0 +msgid "The database object this attachment will be attached to" +msgstr "" + +#. module: document_multiple_records +#: help:ir.attachment.document,res_id:0 +msgid "The record id this is attached to." +msgstr "" + +#. module: document_multiple_records +#: field:ir.attachment.wizard,attachment_ids:0 +msgid "Attachments" +msgstr "" + +#. module: document_multiple_records +#: field:ir.attachment.document,res_model:0 +msgid "Resource Model" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment.wizard:0 +msgid "Cancel" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment.wizard:0 +msgid "Apply" +msgstr "" + +#. module: document_multiple_records +#: view:ir.attachment.wizard:0 +msgid "or" +msgstr "" + +#. module: document_multiple_records +#: code:addons/document_multiple_records/wizard/document_wizard.py:47 +#, python-format +msgid "You have to select at least 1 Document. And try again" +msgstr "" diff --git a/document_multiple_records/i18n/fr.po b/document_multiple_records/i18n/fr.po new file mode 100644 index 00000000..707eb07c --- /dev/null +++ b/document_multiple_records/i18n/fr.po @@ -0,0 +1,151 @@ +# Translation of OpenERP Server. +# This file contains the translation of the following modules: +# * document_multiple_records +# +msgid "" +msgstr "" +"Project-Id-Version: OpenERP Server 7.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-03-25 18:24+0000\n" +"PO-Revision-Date: 2014-03-25 14:27-0500\n" +"Last-Translator: Marc Cassuto \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 1.5.4\n" + +#. module: document_multiple_records +#: field:ir.attachment.document,res_id:0 +msgid "Resource ID" +msgstr "Identifiant de la ressource" + +#. module: document_multiple_records +#: view:ir.attachment.existing.doc:0 +msgid "Select document(s)" +msgstr "Choisir un(des) document(s)" + +#. module: document_multiple_records +#: field:ir.attachment.document,attachment_id:0 +msgid "Attachment" +msgstr "Document joint" + +#. module: document_multiple_records +#: view:ir.attachment.existing.doc:0 +msgid "AttachmentDocumentWizardTree" +msgstr "AttachmentDocumentWizardTree" + +#. module: document_multiple_records +#. openerp-web +#: code:addons/document_multiple_records/static/src/js/document.js:42 +#, python-format +msgid "Uploading Error" +msgstr "Erreur lors du transfert" + +#. module: document_multiple_records +#: field:ir.attachment.document,res_name:0 +msgid "Resource Name" +msgstr "Nom de la ressource" + +#. module: document_multiple_records +#: model:ir.model,name:document_multiple_records.model_ir_attachment_document +msgid "Attachment Documents" +msgstr "Documents joints" + +#. module: document_multiple_records +#: field:ir.attachment,attachment_document_ids:0 +msgid "Records" +msgstr "Enregistrements" + +#. module: document_multiple_records +#: view:ir.attachment:0 +msgid "AttachmentDocumentTree" +msgstr "AttachmentDocumentTree" + +#. module: document_multiple_records +#: model:ir.model,name:document_multiple_records.model_ir_attachment +msgid "ir.attachment" +msgstr "ir.attachment" + +#. module: document_multiple_records +#: view:ir.attachment:0 +msgid "Indexed Content" +msgstr "Contenu indexé" + +#. module: document_multiple_records +#: view:ir.attachment:0 +msgid "AttachmentDocumentForm" +msgstr "AttachmentDocumentForm" + +#. module: document_multiple_records +#: code:addons/document_multiple_records/wizard/document_wizard.py:48 +#, python-format +msgid "Error" +msgstr "Erreur" + +#. module: document_multiple_records +#: help:ir.attachment.document,res_model:0 +msgid "The database object this attachment will be attached to" +msgstr "L'objet de la base de données auquel ce document sera attaché" + +#. module: document_multiple_records +#: help:ir.attachment.document,res_id:0 +msgid "The record id this is attached to." +msgstr "L'identifiant de l'enregistrement auquel est ce document est joint." + +#. module: document_multiple_records +#. openerp-web +#: code:addons/document_multiple_records/static/src/js/document.js:25 +#: model:ir.actions.act_window,name:document_multiple_records.action_view_document +#: view:ir.attachment.existing.doc:0 +#, python-format +msgid "Add existing document/attachment" +msgstr "Ajouter un document déjà joint dans le système" + +#. module: document_multiple_records +#: model:ir.model,name:document_multiple_records.model_ir_attachment_existing_doc +msgid "Add existing document/attachment wizard" +msgstr "Assistant pour ajouter un document déjà joint dans le système" + +#. module: document_multiple_records +#: field:ir.attachment.existing.doc,attachment_ids:0 +msgid "Attachments" +msgstr "Documents joints" + +#. module: document_multiple_records +#. openerp-web +#: code:addons/document_multiple_records/static/src/xml/document.xml:7 +#, python-format +msgid "Add existing document/attachment..." +msgstr "Ajouter un document déjà joint dans le système..." + +#. module: document_multiple_records +#: field:ir.attachment.document,res_model:0 +msgid "Resource Model" +msgstr "Modèle" + +#. module: document_multiple_records +#: view:ir.attachment.existing.doc:0 +msgid "Cancel" +msgstr "Annuler" + +#. module: document_multiple_records +#: view:ir.attachment.existing.doc:0 +msgid "Apply" +msgstr "Appliquer" + +#. module: document_multiple_records +#: view:ir.attachment.existing.doc:0 +msgid "or" +msgstr "ou" + +#. module: document_multiple_records +#: code:addons/document_multiple_records/wizard/document_wizard.py:49 +#, python-format +msgid "You have to select at least 1 Document. And try again" +msgstr "Vous devez sélectionner au moins un document et essayer de nouveau." + +#~ msgid "Add Document" +#~ msgstr "Ajouter un document" diff --git a/document_multiple_records/security/ir.model.access.csv b/document_multiple_records/security/ir.model.access.csv new file mode 100644 index 00000000..6920471b --- /dev/null +++ b/document_multiple_records/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 +access_ir_attachment_document_group_user,ir.attachment.document user,model_ir_attachment_document,base.group_document_user,1,1,1,1 +access_ir_attachment_existing_doc,access_ir_attachment_existing_doc,model_ir_attachment_existing_doc,base.group_document_user,1,1,1,1 diff --git a/document_multiple_records/static/src/js/document.js b/document_multiple_records/static/src/js/document.js new file mode 100644 index 00000000..e8808e81 --- /dev/null +++ b/document_multiple_records/static/src/js/document.js @@ -0,0 +1,79 @@ +openerp.document_multiple_records = function(instance, m) { +var _t = instance.web._t, + QWeb = instance.web.qweb; + + instance.web.Sidebar.include({ + redraw: function() { + var self = this; + this._super.apply(this, arguments); + self.$el.find('.oe_sidebar_add_attachment').after(QWeb.render('AddDocfromserver', {widget: self})) + self.$el.find('.open').on('click', function (e) { + self.on_call_new_view_function(); + }); + }, + on_call_new_view_function: function(state) { + var self = this; + var view = self.getParent(); + var ids = ( view.fields_view.type != "form" )? view.groups.get_selection().ids : [ view.datarecord.id ]; + // you can pass in other data using the context dictionary variable + var context = { + 'model': view.dataset.model, + 'ids': ids, + }; + // the action dictionary variable sends data in the "self.do_action" method + var action = { + name: _t("Add existing document"), + type: 'ir.actions.act_window', + res_model: 'ir.attachment.existing.doc', + view_mode: 'form', + view_type: 'form', + views: [[false, 'form']], + target: 'new', + context: context, + }; + // self.do_action accepts the action parameter and opens the new view + self.do_action(action, { + // refresh list of documents + on_close: function () { + self.do_attachement_update(self.dataset, self.model_id); + } + }); + + }, + on_attachment_delete: function(e) { + e.preventDefault(); + e.stopPropagation(); + var self = this; + var view = self.getParent(); + self.model_view = view.dataset.model + var ids = ( view.fields_view.type != "form" )? view.groups.get_selection().ids : [ view.datarecord.id ]; + // Context dictionary variable + var context = { + 'multiple_records_res_model': self.model_view, + 'multiple_records_res_id': ids[0], + }; + var $e = $(e.currentTarget); + if (confirm(_t("Do you really want to delete this attachment ?"))) { + (new instance.web.DataSet(this, 'ir.attachment', context)).unlink([parseInt($e.attr('data-id'), 10)]).done(function() { + self.do_attachement_update(self.dataset, self.model_id); + }); + } + }, + do_attachement_update: function(dataset, model_id, args) { + var self = this; + this.dataset = dataset; + this.model_id = model_id; + if (args && args[0].error) { + this.do_warn(_t('Uploading Error'), args[0].error); + } + if (!model_id) { + this.on_attachments_loaded([]); + } + else { + var dom = [ ['attachment_document_ids.res_model', '=', dataset.model], ['attachment_document_ids.res_id', '=', model_id], ['type', 'in', ['binary', 'url']] ]; + var ds = new instance.web.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom); + ds.read_slice(['name', 'url', 'type', 'create_uid', 'create_date', 'write_uid', 'write_date'], {}).done(this.on_attachments_loaded); + } + } + }); +}; diff --git a/document_multiple_records/static/src/xml/document.xml b/document_multiple_records/static/src/xml/document.xml new file mode 100644 index 00000000..da9c6987 --- /dev/null +++ b/document_multiple_records/static/src/xml/document.xml @@ -0,0 +1,10 @@ + + + + + +
  • Add existing document...
  • +
    + +
    diff --git a/document_multiple_records/wizard/__init__.py b/document_multiple_records/wizard/__init__.py new file mode 100644 index 00000000..108a1a20 --- /dev/null +++ b/document_multiple_records/wizard/__init__.py @@ -0,0 +1,25 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 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 . import document_wizard + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/document_multiple_records/wizard/document_wizard.py b/document_multiple_records/wizard/document_wizard.py new file mode 100644 index 00000000..68c4e7bb --- /dev/null +++ b/document_multiple_records/wizard/document_wizard.py @@ -0,0 +1,61 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# This module copyright (C) 2014 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 openerp.osv import fields, orm +from openerp.tools.translate import _ + + +class document_wizard(orm.Model): + _name = "ir.attachment.existing.doc" + _description = "Add existing document/attachment wizard" + _columns = { + 'attachment_ids': fields.many2many('ir.attachment', + 'document_attachment_rel', + 'wizard_id', + 'attachment_id', + 'Attachments'), + } + + def action_apply(self, cr, uid, ids, context=None): + if context is None: + context = {} + ir_attach_obj = self.pool.get('ir.attachment') + ir_attach_doc_obj = self.pool.get('ir.attachment.document') + ir_model_obj = self.pool.get(context.get('model') or context.get('active_model')) + + name = ir_model_obj.browse(cr, uid, context.get('ids') or context.get('active_ids'), context=context)[0]['name'] + data = self.read(cr, uid, ids, [], context=context)[0] + if not data['attachment_ids']: + raise orm.except_orm(_('Error'), + _('You have to select at least 1 Document. And try again')) + for attach in ir_attach_obj.browse(cr, uid, data['attachment_ids'], context=context): + data_attach = { + 'res_model': context.get('model') or context.get('active_model'), + 'res_id': context.get('ids') and context.get('ids')[0] or context.get('active_id'), + 'res_name': name, + 'attachment_id': attach.id, + } + #Created attachment_document_ids + ir_attach_doc_obj.create(cr, uid, data_attach, context=context) + return {'type': 'ir.actions.act_window_close'} + +# vim:expandtab:smartindent:toabstop=4:softtabstop=4:shiftwidth=4: diff --git a/document_multiple_records/wizard/document_wizard_view.xml b/document_multiple_records/wizard/document_wizard_view.xml new file mode 100644 index 00000000..9e4bb836 --- /dev/null +++ b/document_multiple_records/wizard/document_wizard_view.xml @@ -0,0 +1,41 @@ + + + + + + Add existing document/attachment + ir.attachment.existing.doc + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + Add existing document/attachment + ir.attachment.existing.doc + form + tree,form + + new + + +
    +
    +