diff --git a/addons/analytic/analytic.py b/addons/analytic/analytic.py index 782fbc4f3ee..420c6516b38 100644 --- a/addons/analytic/analytic.py +++ b/addons/analytic/analytic.py @@ -166,7 +166,7 @@ class account_analytic_account(osv.osv): _columns = { 'name': fields.char('Account/Contract Name', size=128, required=True), 'complete_name': fields.function(_get_full_name, type='char', string='Full Account Name'), - 'code': fields.char('Reference', size=24, select=True), + 'code': fields.char('Reference', select=True), 'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Contract')], 'Type of Account', required=True, help="If you select the View Type, it means you won\'t allow to create journal entries using that account.\n"\ "The type 'Analytic account' stands for usual accounts that you only want to use in accounting.\n"\ diff --git a/addons/mail/__init__.py b/addons/mail/__init__.py index b34993ffd32..b759a08d778 100644 --- a/addons/mail/__init__.py +++ b/addons/mail/__init__.py @@ -35,5 +35,6 @@ import wizard import res_config import mail_group_menu import update +import controllers # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/controllers/__init__.py b/addons/mail/controllers/__init__.py new file mode 100644 index 00000000000..e11f9ba81bb --- /dev/null +++ b/addons/mail/controllers/__init__.py @@ -0,0 +1,3 @@ +import main + +# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/mail/controllers/main.py b/addons/mail/controllers/main.py new file mode 100644 index 00000000000..4c6f6e56064 --- /dev/null +++ b/addons/mail/controllers/main.py @@ -0,0 +1,22 @@ +import base64 +import openerp.addons.web.http as oeweb +from openerp.addons.web.controllers.main import content_disposition + +#---------------------------------------------------------- +# Controller +#---------------------------------------------------------- +class MailController(oeweb.Controller): + _cp_path = '/mail' + + @oeweb.httprequest + def download_attachment(self, req, model, id, method, attachment_id, **kw): + Model = req.session.model(model) + res = getattr(Model, method)(int(id), int(attachment_id)) + if res: + filecontent = base64.b64decode(res.get('base64')) + filename = res.get('filename') + if filecontent and filename: + return req.make_response(filecontent, + headers=[('Content-Type', 'application/octet-stream'), + ('Content-Disposition', content_disposition(filename, req))]) + return req.not_found() diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index a5080e48373..069e0118ec4 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -204,6 +204,22 @@ class mail_message(osv.Model): self.write(cr, SUPERUSER_ID, message.get('id'), {'vote_user_ids': [(3, uid)]}, context=context) return new_has_voted or False + #------------------------------------------------------ + # download an attachment + #------------------------------------------------------ + + def download_attachment(self, cr, uid, id_message, attachment_id, context=None): + """ Return the content of linked attachments. """ + message = self.browse(cr, uid, id_message, context=context) + if attachment_id in [attachment.id for attachment in message.attachment_ids]: + attachment = self.pool.get('ir.attachment').browse(cr, SUPERUSER_ID, attachment_id, context=context) + if attachment.datas and attachment.datas_fname: + return { + 'base64': attachment.datas, + 'filename': attachment.datas_fname, + } + return False + #------------------------------------------------------ # Notification API #------------------------------------------------------ @@ -294,7 +310,7 @@ class mail_message(osv.Model): partner_tree = dict((partner[0], partner) for partner in partners) # 2. Attachments - attachments = ir_attachment_obj.read(cr, uid, list(attachment_ids), ['id', 'datas_fname'], context=context) + attachments = ir_attachment_obj.read(cr, SUPERUSER_ID, list(attachment_ids), ['id', 'datas_fname'], context=context) attachments_tree = dict((attachment['id'], {'id': attachment['id'], 'filename': attachment['datas_fname']}) for attachment in attachments) # 3. Update message dictionaries diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 7181367cf85..b86aad91658 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -29,8 +29,13 @@ openerp.mail = function (session) { }, /* Get the url of an attachment {'id': id} */ - get_attachment_url: function (session, attachment) { - return session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: attachment['id']}); + get_attachment_url: function (session, message_id, attachment_id) { + return session.url('/mail/download_attachment', { + 'model': 'mail.message', + 'id': message_id, + 'method': 'download_attachment', + 'attachment_id': attachment_id + }); }, /** @@ -258,7 +263,7 @@ openerp.mail = function (session) { for (var l in this.attachment_ids) { var attach = this.attachment_ids[l]; if (!attach.formating) { - attach.url = mail.ChatterUtils.get_attachment_url(this.session, attach); + attach.url = mail.ChatterUtils.get_attachment_url(this.session, this.id, attach.id); attach.filetype = mail.ChatterUtils.filetype(attach.filename); attach.name = mail.ChatterUtils.breakword(attach.name || attach.filename); attach.formating = true; @@ -420,18 +425,23 @@ openerp.mail = function (session) { /* when the file is uploaded */ on_attachment_loaded: function (event, result) { - for (var i in this.attachment_ids) { - if (this.attachment_ids[i].filename == result.filename && this.attachment_ids[i].upload) { - this.attachment_ids[i]={ - 'id': result.id, - 'name': result.name, - 'filename': result.filename, - 'url': mail.ChatterUtils.get_attachment_url(this.session, result) - }; + + if (result.erorr || !result.id ) { + this.do_warn( session.web.qweb.render('mail.error_upload'), result.error); + this.attachment_ids = _.filter(this.attachment_ids, function (val) { return !val.upload; }); + } else { + for (var i in this.attachment_ids) { + if (this.attachment_ids[i].filename == result.filename && this.attachment_ids[i].upload) { + this.attachment_ids[i]={ + 'id': result.id, + 'name': result.name, + 'filename': result.filename, + 'url': mail.ChatterUtils.get_attachment_url(this.session, this.id, result.id) + }; + } } } this.display_attachments(); - var $input = this.$('input.oe_form_binary_file'); $input.after($input.clone(true)).remove(); this.$(".oe_attachment_file").show(); @@ -484,6 +494,11 @@ openerp.mail = function (session) { }, on_compose_fullmail: function (default_composition_mode) { + + if(!this.do_check_attachment_upload()) { + return false; + } + if (default_composition_mode == 'reply') { var context = { 'default_composition_mode': default_composition_mode, @@ -534,31 +549,31 @@ openerp.mail = function (session) { this.reinit(); }, + /* return true if all file are complete else return false and make an alert */ + do_check_attachment_upload: function () { + if (_.find(this.attachment_ids, function (file) {return file.upload;})) { + this.do_warn(session.web.qweb.render('mail.error_upload'), session.web.qweb.render('mail.error_upload_please_wait')); + return false; + } else { + return true; + } + }, + /*post a message and fetch the message*/ on_message_post: function (event) { var self = this; var comment_node = this.$('textarea'); var body = comment_node.val(); - comment_node.val(''); - var attachments=[]; - for (var i in this.attachment_ids) { - if (this.attachment_ids[i].upload) { - session.web.dialog($('