diff --git a/base_export_email/__init__.py b/base_export_email/__init__.py new file mode 100755 index 000000000..9d55d5bba --- /dev/null +++ b/base_export_email/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Authors: Laetitia Gangloff +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 ir_actions diff --git a/base_export_email/__openerp__.py b/base_export_email/__openerp__.py new file mode 100755 index 000000000..f3f6553e9 --- /dev/null +++ b/base_export_email/__openerp__.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Authors: Laetitia Gangloff +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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": "Base export email addon", + "version": "0.1", + "author": "ACSONE SA/NV, Odoo Community Association (OCA)", + "category": "Other", + "website": "http://www.acsone.eu", + "depends": ['email_template', + ], + "description": """ + +Base export email addon +========================= + +Add server action type to send by email a data export +For this new action type you need to fill the following fields : +- Filter : it defines the filter to use on the data. +- Template : it is the mail template to send the email. +- Saved export : it is a saved export list. +- Fields to export : it is the list of field to export. It can be used alone + or to complete the saved export list. + +Example of use : in a cron for a periodic export of some data + to see the evolution. + +""", + "data": ["ir_actions_view.xml", + "ir_actions_data.xml"], + "demo": [], + "test": [], + "active": False, + "license": "AGPL-3", + "installable": True, + "auto_install": False, + "application": False, +} diff --git a/base_export_email/ir_actions.py b/base_export_email/ir_actions.py new file mode 100644 index 000000000..8f6831ee3 --- /dev/null +++ b/base_export_email/ir_actions.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Authors: Laetitia Gangloff +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 +from openerp.tools.translate import _ +from openerp.addons.web.controllers import main +from openerp.tools.safe_eval import safe_eval +import time +from dateutil.relativedelta import relativedelta +from datetime import datetime +import base64 + + +class actions_server(orm.Model): + _inherit = "ir.actions.server" + + def __init__(self, pool, cr): + super(actions_server, self).__init__(pool, cr) + # add state 'export_email' + new_state = ('export_email', _('Export data by email')) + if new_state not in self._columns['state'].selection: + self._columns['state'].selection.append(new_state) + return + + _columns = { + 'model': fields.related('model_id', 'model', + type="char", size=256, string='Model'), + 'filter_id': fields.many2one( + 'ir.filters', string='Filter', ondelete='restrict'), + 'email_template_id': fields.many2one( + 'email.template', string='Template', ondelete='restrict'), + 'saved_export_id': fields.many2one( + 'ir.exports', string='Saved export', ondelete='restrict'), + 'fields_to_export': fields.text( + 'Fields to export', + help="The list of fields to export. \ + The format is ['name', 'seller_ids/product_name']"), + 'export_format': fields.selection([('csv', 'CSV'), + ('xls', 'Excel')], + 'Export Formats'), + } + + def _get_email_template(self, cr, uid, context=None): + email_template_id = 0 + try: + model_data_obj = self.pool['ir.model.data'] + email_template_id = model_data_obj.get_object_reference( + cr, uid, 'base_export_email', 'export_data_email_template')[1] + except ValueError: + pass + return email_template_id + + _defaults = { + 'fields_to_export': '[]', + 'export_format': 'csv', + 'email_template_id': lambda self, cr, uid, c: + self._get_email_template(cr, uid, context=c), + } + + def onchange_model_id(self, cr, uid, ids, model_id, context=None): + """ + Used to set correct domain on filter_id and saved_export_id + """ + data = {'model': False, + 'filter_id': False, + 'saved_export_id': False} + if model_id: + model = self.pool['ir.model'].browse(cr, uid, model_id, + context=context) + data.update({'model': model.model}) + return {'value': data} + + def _search_data(self, cr, uid, action, context=None): + obj_pool = self.pool[action.model] + domain = action.filter_id and safe_eval( + action.filter_id.domain, {'time': time, + 'datetime': datetime, + 'relativedelta': relativedelta, + }) or [] + ctx = action.filter_id and safe_eval( + action.filter_id.context) or context + return obj_pool.search(cr, uid, domain, + offset=0, limit=False, order=False, + context=ctx) + + def _export_data(self, cr, uid, obj_ids, action, context=None): + obj_pool = self.pool[action.model] + export_fields = [] + if action.fields_to_export: + export_fields = safe_eval(action.fields_to_export) + if action.saved_export_id: + # retrieve fields of the selected list + export_fields.extend( + [efl.name for efl in + action.saved_export_id.export_fields]) + return export_fields, obj_pool.export_data( + cr, uid, obj_ids, export_fields, + context=context).get('datas', []) + + def _send_data_email(self, cr, uid, action, export_fields, export_data, + context=None): + """ + Prepare the exported data to send with the template + of the configuration + """ + if action.export_format == 'csv': + export = main.CSVExport() + else: + export = main.ExcelExport() + filename = export.filename(action.model) + content = export.from_data(export_fields, export_data) + + return self._send_email(cr, uid, action, filename, content, + context=context) + + def _send_email(self, cr, uid, action, filename, content, + context=None): + """ + Prepare a message with the exported data to send with the + template of the configuration + """ + mail_compose = self.pool['mail.compose.message'] + values = mail_compose.onchange_template_id( + cr, uid, 0, action.email_template_id, 'comment', + 'ir.actions.server', action.id, context=context)['value'] + values['partner_ids'] = [ + (4, partner_id) for partner_id in values.pop('partner_ids', + []) + ] + if context and context.get('encoded_base_64'): + data = content + else: + if isinstance(content, unicode): + content = content.encode('utf-8') + data = base64.b64encode(str(content)) + data_attach = { + 'name': filename, + 'datas': data, + 'datas_fname': filename, + 'description': filename, + } + + values['attachment_ids'] = [(0, 0, data_attach)] + compose_id = mail_compose.create( + cr, uid, values, context=context) + return mail_compose.send_mail(cr, uid, [compose_id], context=context) + + def run(self, cr, uid, ids, context=None): + """ + If the state of an action is export_email, + export data related to the configuration and send the result by email + """ + for action in self.browse(cr, uid, ids, context): + if action.state == 'export_email': + # search data to export + obj_ids = self._search_data(cr, uid, action, context=context) + # export data + export_fields, export_data = self._export_data( + cr, uid, obj_ids, action, context=context) + # Prepare a message with the exported data to send with the + # template of the configuration + self._send_data_email( + cr, uid, action, export_fields, export_data, + context=context) + return super(actions_server, self).run(cr, uid, ids, context=context) diff --git a/base_export_email/ir_actions_data.xml b/base_export_email/ir_actions_data.xml new file mode 100644 index 000000000..8c02c5f01 --- /dev/null +++ b/base_export_email/ir_actions_data.xml @@ -0,0 +1,12 @@ + + + + + Export data sample + Export data for ${object.model} + + + ]]> + + + diff --git a/base_export_email/ir_actions_view.xml b/base_export_email/ir_actions_view.xml new file mode 100644 index 000000000..fc76ac8ea --- /dev/null +++ b/base_export_email/ir_actions_view.xml @@ -0,0 +1,44 @@ + + + + + Server Action (base_export_email) + ir.actions.server + + + + onchange_model_id(model_id, context) + + + + + + {'required': [('state', '!=', 'export_email'), + ('state','!=','dummy'), + ('state','!=','sms'), + ('state','!=','code'), + ('state','!=','loop'), + ('state','!=','trigger'), + ('state','!=','object_copy'), + ('state','!=','client_action'), + ('state','!=','email'), + ('state','!=','sms'), + ('state','!=','other')]} + + + + + + + + + + + + + + + +