Browse Source
Merge pull request #376 from akretion/8-attachm-meta
Merge pull request #376 from akretion/8-attachm-meta
8 module attachment metadatapull/448/head
beau sebastien
9 years ago
7 changed files with 250 additions and 0 deletions
-
84attachment_metadata/README.rst
-
1attachment_metadata/__init__.py
-
21attachment_metadata/__openerp__.py
-
1attachment_metadata/models/__init__.py
-
51attachment_metadata/models/attachment.py
-
2attachment_metadata/security/ir.model.access.csv
-
90attachment_metadata/views/attachment_view.xml
@ -0,0 +1,84 @@ |
|||
|
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
|||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
|||
:alt: License: AGPL-3 |
|||
|
|||
==================== |
|||
Attachment Metadata |
|||
==================== |
|||
|
|||
This module extend ir.attachment model with some new fields for a better control |
|||
for import and export of files. |
|||
|
|||
The main feature is an integrity file check with a hash. |
|||
|
|||
A file hash is short representation (signature) computed from file data. |
|||
Hashes computed before send file and after received file can be compared to be |
|||
sure of the content integrity. |
|||
|
|||
An example of the use of this module, can be found in the external_file_location. |
|||
|
|||
|
|||
Usage |
|||
===== |
|||
|
|||
Go the menu Settings > Attachments |
|||
|
|||
You can create / see standard attachments with additional fields |
|||
|
|||
|
|||
|
|||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
|||
:alt: Try me on Runbot |
|||
:target: https://runbot.odoo-community.org/runbot/149/8.0 |
|||
|
|||
|
|||
Known issues / Roadmap |
|||
====================== |
|||
|
|||
The purpose of this module is not to import the data of the file but only exchange files with external application. |
|||
|
|||
|
|||
Bug Tracker |
|||
=========== |
|||
|
|||
Bugs are tracked on `GitHub Issues |
|||
<https://github.com/OCA/server-tools/issues>`_. In case of trouble, please |
|||
check there if your issue has already been reported. If you spotted it first, |
|||
help us smashing it by providing a detailed and welcomed `feedback |
|||
<https://github.com/OCA/ |
|||
server-tools/issues/new?body=module:%20 |
|||
attachment_metadata%0Aversion:%20 |
|||
8.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Images |
|||
------ |
|||
|
|||
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. |
|||
|
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* Valentin CHEMIERE <valentin.chemiere@akretion.com> |
|||
* Sebastien BEAU <sebastian.beau@akretion.com> |
|||
* Joel Grand-Guillaume Camptocamp |
|||
* initOS <http://initos.com> |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
.. image:: https://odoo-community.org/logo.png |
|||
:alt: Odoo Community Association |
|||
:target: https://odoo-community.org |
|||
|
|||
This module is maintained by the OCA. |
|||
|
|||
OCA, or the Odoo Community Association, is a nonprofit organization whose |
|||
mission is to support the collaborative development of Odoo features and |
|||
promote its widespread use. |
|||
|
|||
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1 @@ |
|||
from . import models |
@ -0,0 +1,21 @@ |
|||
# coding: utf-8 |
|||
# @ 2015 Valentin CHEMIERE @ Akretion |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
{ |
|||
'name': 'Attachment Metadata', |
|||
'version': '8.0.1.0.0', |
|||
'author': 'Akretion,Odoo Community Association (OCA)', |
|||
'website': 'www.akretion.com', |
|||
'license': 'AGPL-3', |
|||
'category': 'Generic Modules', |
|||
'depends': [ |
|||
], |
|||
'data': [ |
|||
'views/attachment_view.xml', |
|||
'security/ir.model.access.csv', |
|||
], |
|||
'installable': True, |
|||
'application': False, |
|||
'images': [], |
|||
} |
@ -0,0 +1 @@ |
|||
from . import attachment |
@ -0,0 +1,51 @@ |
|||
# coding: utf-8 |
|||
# Copyright (C) 2014 initOS GmbH & Co. KG (<http://www.initos.com>). |
|||
# @author: Joel Grand-Guillaume @ Camptocamp SA |
|||
# @ 2015 Valentin CHEMIERE @ Akretion |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from openerp import models, fields, api, _ |
|||
from openerp.exceptions import Warning as UserError |
|||
import hashlib |
|||
from base64 import b64decode |
|||
|
|||
|
|||
class IrAttachmentMetadata(models.Model): |
|||
_name = 'ir.attachment.metadata' |
|||
_inherits = {'ir.attachment': 'attachment_id'} |
|||
|
|||
internal_hash = fields.Char( |
|||
store=True, compute='_compute_hash', |
|||
help="File hash computed with file data to be compared " |
|||
"to external hash when provided.") |
|||
external_hash = fields.Char( |
|||
help="File hash comes from the external owner of the file.\n" |
|||
"If provided allow to check than downloaded file " |
|||
"is the exact copy of the original file.") |
|||
attachment_id = fields.Many2one( |
|||
'ir.attachment', required=True, ondelete='cascade', |
|||
help="Link to ir.attachment model ") |
|||
file_type = fields.Selection( |
|||
selection="_get_file_type", |
|||
string="File type", |
|||
help="The file type determines an import method to be used " |
|||
"to parse and transform data before their import in ERP") |
|||
|
|||
@api.depends('datas', 'external_hash') |
|||
def _compute_hash(self): |
|||
for attachment in self: |
|||
if attachment.datas: |
|||
attachment.internal_hash = hashlib.md5( |
|||
b64decode(attachment.datas)).hexdigest() |
|||
if attachment.external_hash and\ |
|||
attachment.internal_hash != attachment.external_hash: |
|||
raise UserError( |
|||
_("File corrupted: Something was wrong with " |
|||
"the retrieved file, please relaunch the task.")) |
|||
|
|||
def _get_file_type(self): |
|||
"""This is the method to be inherited for adding file types |
|||
The basic import do not apply any parsing or transform of the file. |
|||
The file is just added as an attachement |
|||
""" |
|||
return [('basic_import', 'Basic import')] |
@ -0,0 +1,2 @@ |
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink |
|||
access_attachment_metadata_user,ir.attachment.metadata.user,model_ir_attachment_metadata,base.group_user,1,0,0,0 |
@ -0,0 +1,90 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="view_attachment_improved_form" model="ir.ui.view"> |
|||
<field name="model">ir.attachment.metadata</field> |
|||
<field name="inherit_id" ref="base.view_attachment_form" /> |
|||
<field name="arch" type="xml"> |
|||
<field name="url" position="after"> |
|||
<field name="internal_hash"/> |
|||
<field name="external_hash"/> |
|||
<field name="file_type"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_external_attachment_tree" model="ir.ui.view"> |
|||
<field name="model">ir.attachment.metadata</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Attachments" > |
|||
<field name="name"/> |
|||
<field name="datas_fname"/> |
|||
<field name="file_type"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_external_attachment_search" model="ir.ui.view"> |
|||
<field name="model">ir.attachment.metadata</field> |
|||
<field name="arch" type="xml"> |
|||
<search string="Attachments"> |
|||
<field name="name" filter_domain="['|', ('name','ilike',self), ('datas_fname','ilike',self)]" string="Attachment"/> |
|||
<field name="create_date"/> |
|||
<filter icon="terp-stage" |
|||
string="URL" |
|||
domain="[('type','=','url')]"/> |
|||
<filter icon="terp-stock_align_left_24" |
|||
string="Binary" |
|||
domain="[('type','=','binary')]"/> |
|||
<separator/> |
|||
<filter name="my_documents_filter" |
|||
string="My Document(s)" |
|||
icon="terp-personal" |
|||
domain="[('create_uid','=',uid)]" |
|||
help="Filter on my documents"/> |
|||
<field name="create_uid"/> |
|||
<field name="type"/> |
|||
<group expand="0" string="Group By"> |
|||
<filter string="Owner" icon="terp-personal" domain="[]" context="{'group_by':'create_uid'}"/> |
|||
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type'}" groups="base.group_no_one"/> |
|||
<filter string="Company" icon="terp-gtk-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> |
|||
<filter string="Creation Month" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}"/> |
|||
<filter string="File type" domain="[]" context="{'group_by': 'file_type'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_attachment" model="ir.actions.act_window"> |
|||
<field name="name">Meta data Attachments</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">ir.attachment.metadata</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="view_id" eval="False"/> |
|||
<field name="search_view_id" ref="view_external_attachment_search"/> |
|||
</record> |
|||
|
|||
<record id="ir_attachment_view2" model="ir.actions.act_window.view"> |
|||
<field eval="10" name="sequence"/> |
|||
<field name="view_mode">tree</field> |
|||
<field name="view_id" ref="view_external_attachment_tree"/> |
|||
<field name="act_window_id" ref="action_attachment"/> |
|||
</record> |
|||
|
|||
<record id="ir_attachment_view3" model="ir.actions.act_window.view"> |
|||
<field eval="10" name="sequence"/> |
|||
<field name="view_mode">form</field> |
|||
<field name="view_id" ref="view_attachment_improved_form"/> |
|||
<field name="act_window_id" ref="action_attachment"/> |
|||
</record> |
|||
|
|||
|
|||
<menuitem id="menu_ir_attachment" |
|||
parent="base.next_id_9" |
|||
sequence="20" |
|||
action="action_attachment"/> |
|||
|
|||
</data> |
|||
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue