main.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # -*- coding:utf-8 -*-
  2. import base64
  3. import psycopg2
  4. import functools
  5. import openerp
  6. from openerp import SUPERUSER_ID
  7. from openerp import http
  8. from openerp.http import request
  9. from openerp.addons.web.controllers.main import content_disposition
  10. from openerp.addons.mail.controllers.main import MailController
  11. from openerp.addons.web.controllers.main import Binary
  12. import mimetypes
  13. import logging
  14. from openerp.http import request, serialize_exception as _serialize_exception
  15. _logger = logging.getLogger(__name__)
  16. def serialize_exception(f):
  17. @functools.wraps(f)
  18. def wrap(*args, **kwargs):
  19. try:
  20. return f(*args, **kwargs)
  21. except Exception, e:
  22. _logger.exception("An exception occured during an http request")
  23. se = _serialize_exception(e)
  24. error = {
  25. 'code': 200,
  26. 'message': "Odoo Server Error",
  27. 'data': se
  28. }
  29. return werkzeug.exceptions.InternalServerError(simplejson.dumps(error))
  30. return wrap
  31. class MyMailController(MailController):
  32. _cp_path = '/mail'
  33. @http.route('/mail/download_attachment', type='http', auth='user')
  34. def download_attachment(self, model, id, method, attachment_id, **kw):
  35. result = super(MyMailController, self).download_attachment(model, id, method, attachment_id, **kw)
  36. result.headers['Content-Disposition'] = result.headers['Content-Disposition'].replace('attachment', 'inline')
  37. return result
  38. class MyBinary(Binary):
  39. @http.route('/web/binary/saveas', type='http', auth="public")
  40. def saveas(self, model, field, id=None, filename_field=None, **kw):
  41. Model = request.registry[model]
  42. cr, uid, context = request.cr, request.uid, request.context
  43. fields = [field]
  44. if filename_field:
  45. fields.append(filename_field)
  46. if id:
  47. res = Model.read(cr, uid, [int(id)], fields, context)[0]
  48. else:
  49. res = Model.default_get(cr, uid, fields, context)
  50. filecontent = base64.b64decode(res.get(field) or '')
  51. if not filecontent:
  52. return request.not_found()
  53. else:
  54. content_type = ""
  55. filename = '%s_%s' % (model.replace('.', '_'), id)
  56. if filename_field:
  57. filename = res.get(filename_field, '') or filename
  58. content_type = mimetypes.guess_type(filename)
  59. return request.make_response(filecontent,
  60. headers=[('Content-Type', content_type[0] or 'application/octet-stream'),
  61. ('Content-Disposition', content_disposition(filename).replace('attachment', 'inline'))])