Functionnal on 8.0 server instance with external_file_location, working

on refactor to new API
This commit is contained in:
Valentin Chemiere 2015-03-19 16:26:53 +01:00
parent 1abf6202ca
commit 9330dcd908
10 changed files with 94 additions and 89 deletions

View File

@ -32,6 +32,7 @@
""", """,
'depends': [ 'depends': [
'base', 'base',
'mail'
], ],
'data': [ 'data': [
'attachment_view.xml', 'attachment_view.xml',

View File

@ -31,6 +31,7 @@ from base64 import b64decode
class IrAttachmentMetadata(models.Model): class IrAttachmentMetadata(models.Model):
_name = 'ir.attachment.metadata' _name = 'ir.attachment.metadata'
_inherits = {'ir.attachment': 'attachment_id'} _inherits = {'ir.attachment': 'attachment_id'}
_inherit = ['mail.thread', 'ir.needaction_mixin']
internal_hash = fields.Char(store=True, compute='_compute_hash') internal_hash = fields.Char(store=True, compute='_compute_hash')
external_hash = fields.Char() external_hash = fields.Char()

View File

@ -72,7 +72,7 @@
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/> <field name="view_id" eval="False"/>
<field name="domain">[('task_id', '!=', False)]</field> <!-- <field name="domain">[('task_id', '!=', False)]</field> -->
<field name="search_view_id" ref="view_external_attachment_search"/> <field name="search_view_id" ref="view_external_attachment_search"/>
</record> </record>

View File

@ -20,5 +20,5 @@
# #
############################################################################### ###############################################################################
import file_document import attachment_metadata
import fetchmail import fetchmail

View File

@ -27,16 +27,16 @@
'license': 'AGPL-3', 'license': 'AGPL-3',
'description': """Abstract module for importing and processing the 'description': """Abstract module for importing and processing the
attachment of an email. The attachment of the email will be imported attachment of an email. The attachment of the email will be imported
as a file_document and then in your custom module you can process it. as a attachment_metadata and then in your custom module you can process it.
An example of processing can be found in account_statement_email An example of processing can be found in account_statement_email
""", """,
'author': 'Akretion', 'author': 'Akretion',
'website': 'http://www.akretion.com/', 'website': 'http://www.akretion.com/',
'depends': ['file_document', 'fetchmail'], 'depends': ['external_file_location', 'fetchmail'],
'init_xml': [], 'init_xml': [],
'update_xml': [ 'update_xml': [
"fetchmail_view.xml", "fetchmail_view.xml",
"file_document_view.xml", "attachment_metadata_view.xml",
], ],
'demo_xml': [], 'demo_xml': [],
'installable': True, 'installable': True,

View File

@ -24,22 +24,21 @@ from openerp.osv import fields, orm
import base64 import base64
class file_document(orm.Model): class IrAttachmentMetadata(orm.Model):
_inherit = "file.document" _inherit = "ir.attachment.metadata"
_columns = { _columns = {
'fetchmail_server_id': fields.many2one('fetchmail.server', 'Email Server'), 'fetchmail_server_id': fields.many2one('fetchmail.server', 'Email Server'),
} }
def message_process(self, cr, uid, model, message, custom_values=None, def message_process(self, cr, uid, model, message, custom_values=None,
save_original=False, strip_attachments=False, save_original=False, strip_attachments=False,
thread_id=None, context=None): thread_id=None, context=None):
if context is None: if context is None:
context = {} context = {}
context['no_post'] = True context['no_post'] = True
return super(file_document, self).message_process(self, cr, uid, model, return super(IrAttachmentMetadata, self).message_process(self, cr, uid, model,
message, message,
custom_values=custom_values, custom_values=custom_values,
save_original=save_original, save_original=save_original,
@ -52,7 +51,7 @@ class file_document(orm.Model):
content_subtype='html', **kwargs): content_subtype='html', **kwargs):
if context.get('no_post'): if context.get('no_post'):
return None return None
return super(file_document, self).message_post(cr, uid, thread_id, return super(IrAttachmentMetadata, self).message_post(cr, uid, thread_id,
body=body, body=body,
subject=subject, subject=subject,
type='notification', type='notification',
@ -63,7 +62,7 @@ class file_document(orm.Model):
content_subtype=content_subtype, content_subtype=content_subtype,
**kwargs) **kwargs)
def _get_file_document_data(self, cr, uid, condition, msg, att, context=None): def _get_attachment_metadata_data(self, cr, uid, condition, msg, att, context=None):
values = { values = {
'file_type': condition.server_id.file_type, 'file_type': condition.server_id.file_type,
'name': msg['subject'], 'name': msg['subject'],
@ -80,22 +79,22 @@ class file_document(orm.Model):
if condition.from_email in msg['from'] and condition.mail_subject in msg['subject']: if condition.from_email in msg['from'] and condition.mail_subject in msg['subject']:
for att in msg['attachments']: for att in msg['attachments']:
if condition.file_extension in att[0]: if condition.file_extension in att[0]:
vals = self._get_file_document_data(cr, uid, condition, msg, att, context=context) vals = self._get_attachment_metadata_data(cr, uid, condition, msg, att, context=context)
break break
return vals return vals
def _prepare_data_for_file_document(self, cr, uid, msg, context=None): def _prepare_data_for_attachment_metadata(self, cr, uid, msg, context=None):
"""Method to prepare the data for creating a file document. """Method to prepare the data for creating a attachment metadata.
:param msg: a dictionnary with the email data :param msg: a dictionnary with the email data
:type: dict :type: dict
:return: a list of dictionnary that containt the file document data :return: a list of dictionnary that containt the attachment metadata data
:rtype: list :rtype: list
""" """
res = [] res = []
server_id = context.get('default_fetchmail_server_id', False) server_id = context.get('default_fetchmail_server_id', False)
doc_file_condition_obj = self.pool.get('file.document.condition') doc_file_condition_obj = self.pool.get('ir.attachment.metadata.condition')
cond_ids = doc_file_condition_obj.search(cr, uid, [('server_id', '=', server_id)]) cond_ids = doc_file_condition_obj.search(cr, uid, [('server_id', '=', server_id)])
if cond_ids: if cond_ids:
for cond in doc_file_condition_obj.browse(cr, uid, cond_ids): for cond in doc_file_condition_obj.browse(cr, uid, cond_ids):
@ -109,10 +108,10 @@ class file_document(orm.Model):
def message_new(self, cr, uid, msg, custom_values, context=None): def message_new(self, cr, uid, msg, custom_values, context=None):
created_ids = [] created_ids = []
res = self._prepare_data_for_file_document(cr, uid, msg, context=context) res = self._prepare_data_for_attachment_metadata(cr, uid, msg, context=context)
if res: if res:
for vals in res: for vals in res:
default = context.get('default_file_document_vals') default = context.get('default_attachment_metadata_vals')
if default: if default:
for key in default: for key in default:
if not key in vals: if not key in vals:
@ -124,20 +123,20 @@ class file_document(orm.Model):
return None return None
class file_document_condition(orm.Model): class IrAttachmentMetadataCondition(orm.Model):
_name = "file.document.condition" _name = "ir.attachment.metadata.condition"
_description = "File Document Conditions" _description = "Attachment Metadata Conditions"
def _get_file_document_condition_type(self, cr, uid, context=None): def _get_attachment_metadata_condition_type(self, cr, uid, context=None):
return self.get_file_document_condition_type(cr, uid, context=context) return self.get_attachment_metadata_condition_type(cr, uid, context=context)
def get_file_document_condition_type(self, cr, uid, context=None): def get_attachment_metadata_condition_type(self, cr, uid, context=None):
return [('normal', 'Normal')] return [('normal', 'Normal')]
_columns = { _columns = {
'from_email': fields.char('Email', size=64), 'from_email': fields.char('Email', size=64),
'mail_subject': fields.char('Mail Subject', size=64), 'mail_subject': fields.char('Mail Subject', size=64),
'type': fields.selection(_get_file_document_condition_type, 'type': fields.selection(_get_attachment_metadata_condition_type,
'Type', help="Create your own type if the normal type \ 'Type', help="Create your own type if the normal type \
do not correspond to your need", required=True), do not correspond to your need", required=True),
'file_extension' : fields.char('File Extension', size=64, 'file_extension' : fields.char('File Extension', size=64,

View File

@ -0,0 +1,65 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- SEARCH -->
<record id="attachment_metadata_view_search" model="ir.ui.view">
<field name="name">ir.attachment.metadata.search</field>
<field name="model">ir.attachment.metadata</field>
<field name="type">search</field>
<field name="inherit_id" ref="external_file_location.view_external_attachment_search"/>
<field name="arch" type="xml">
<field name="type" position="after">
<field name="fetchmail_server_id"/>
</field>
</field>
</record>
<!-- Views and menus for the new object prepare.ir.attachment.metadata -->
<record id="view_attachment_metadata_condition_tree" model="ir.ui.view">
<field name="name">view_attachment_metadata_condition_tree</field>
<field name="model">ir.attachment.metadata.condition</field>
<field name="arch" type="xml">
<tree string="Configuration for ir.attachment.metadata">
<field name="from_email"/>
<field name="mail_subject"/>
<field name="type"/>
<field name="file_extension"/>
<field name="server_id"/>
</tree>
</field>
</record>
<record id="view_attachment_metadata_condition_form" model="ir.ui.view">
<field name="name">view_attachment_metadata_condition_form</field>
<field name="model">ir.attachment.metadata.condition</field>
<field name="arch" type="xml">
<form string="Configuration for ir.attachment.metadata">
<sheet>
<group col="4">
<field name="from_email" attrs="{'required': [('type', '=', 'normal')]}"/>
<field name="mail_subject" attrs="{'required': [('type', '=', 'normal')]}"/>
<field name="type"/>
<field name="file_extension"/>
<field name="server_id"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_attachment_metadata_configuration" model="ir.actions.act_window">
<field name="name">Configuration</field>
<field name="res_model">ir.attachment.metadata.condition</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_attachment_metadata_configuration"
action="action_attachment_metadata_configuration"
parent="external_file_location.menu_file_exchange"
sequence="50" />
</data>
</openerp>

View File

@ -36,7 +36,7 @@ class fetchmail_server(orm.Model):
'file_type': fields.selection(_get_file_type, 'File Type', 'file_type': fields.selection(_get_file_type, 'File Type',
help='The file type will show some special option'), help='The file type will show some special option'),
'company_id': fields.many2one('res.company', 'Company', required=True),#Why this field do not exist by default? 'company_id': fields.many2one('res.company', 'Company', required=True),#Why this field do not exist by default?
'file_document_condition_ids': fields.one2many('file.document.condition', 'server_id', 'File Document ') 'attachment_metadata_condition_ids': fields.one2many('ir.attachment.metadata.condition', 'server_id', 'Attachment')
} }
_defaults = { _defaults = {
@ -49,7 +49,7 @@ class fetchmail_server(orm.Model):
ctx = {} ctx = {}
else: else:
ctx = context.copy() ctx = context.copy()
ctx['default_file_document_vals'] = {} ctx['default_attachment_metadata_vals'] = {}
server = self.browse(cr, uid, server_id, context=context) server = self.browse(cr, uid, server_id, context=context)
ctx['default_company_id'] = server.company_id.id ctx['default_company_id'] = server.company_id.id
ctx['default_fetchmail_server_id'] = server_id ctx['default_fetchmail_server_id'] = server_id

View File

@ -13,7 +13,7 @@
<field name="file_type"/> <!-- TODO attrs="{'invisible': [('object_id','!=', 'file.document')]}"/>--> <field name="file_type"/> <!-- TODO attrs="{'invisible': [('object_id','!=', 'file.document')]}"/>-->
</field> </field>
<field name="action_id" position="after"> <field name="action_id" position="after">
<field name="file_document_condition_ids" nolabel="1"/> <field name="attachment_metadata_condition_ids" nolabel="1" colspan="4"/>
</field> </field>
</field> </field>
</record> </record>

View File

@ -1,61 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- SEARCH -->
<record id="file_document_view_search" model="ir.ui.view">
<field name="name">file.document.search</field>
<field name="model">file.document</field>
<field name="type">search</field>
<field name="inherit_id" ref="file_document.file_document_view_search"/>
<field name="arch" type="xml">
<field name="ext_id" position="after">
<field name="fetchmail_server_id"/>
</field>
</field>
</record>
<!-- Views and menus for the new object prepare.file.document -->
<record id="view_file_document_condition_tree" model="ir.ui.view">
<field name="name">view_file_document_condition_tree</field>
<field name="model">file.document.condition</field>
<field name="arch" type="xml">
<tree string="Configuration for File Document">
<field name="from_email"/>
<field name="mail_subject"/>
<field name="type"/>
<field name="file_extension"/>
<field name="server_id"/>
</tree>
</field>
</record>
<record id="view_file_document_condition_form" model="ir.ui.view">
<field name="name">view_file_document_condition_form</field>
<field name="model">file.document.condition</field>
<field name="arch" type="xml">
<form string="Configuration for File Document">
<field name="from_email" attrs="{'required': [('type', '=', 'normal')]}"/>
<field name="mail_subject" attrs="{'required': [('type', '=', 'normal')]}"/>
<field name="type"/>
<field name="file_extension"/>
<field name="server_id"/>
</form>
</field>
</record>
<record id="action_file_document_configuration" model="ir.actions.act_window">
<field name="name">Configuration</field>
<field name="res_model">file.document.condition</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_file_document_configuration"
action="action_file_document_configuration"
parent="file_document.menu_file_exchange_root"
sequence="50" />
</data>
</openerp>