~opencrea/+junk/aprobio

« back to all changes in this revision

Viewing changes to mail_tracking/controllers/main.py

  • Committer: joannes
  • Date: 2017-05-17 09:40:42 UTC
  • Revision ID: joannes@debian-20170517094042-47q3j6on72w2h1il
community module

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
 
3
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
4
 
 
5
import werkzeug
 
6
from psycopg2 import OperationalError
 
7
from odoo import api, http, registry, SUPERUSER_ID
 
8
import logging
 
9
_logger = logging.getLogger(__name__)
 
10
 
 
11
BLANK = 'R0lGODlhAQABAIAAANvf7wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='
 
12
 
 
13
 
 
14
def _env_get(db, callback, tracking_id, event_type, **kw):
 
15
    res = 'NOT FOUND'
 
16
    reg = False
 
17
    current = http.request.db and db == http.request.db
 
18
    env = current and http.request.env
 
19
    if not env:
 
20
        with api.Environment.manage():
 
21
            try:
 
22
                reg = registry(db)
 
23
            except OperationalError:
 
24
                _logger.warning("Selected BD '%s' not found", db)
 
25
            except:  # pragma: no cover
 
26
                _logger.warning("Selected BD '%s' connection error", db)
 
27
            if reg:
 
28
                _logger.info("New environment for database '%s'", db)
 
29
                with reg.cursor() as new_cr:
 
30
                    new_env = api.Environment(new_cr, SUPERUSER_ID, {})
 
31
                    res = callback(new_env, tracking_id, event_type, **kw)
 
32
                    new_env.cr.commit()
 
33
    else:
 
34
        # make sudo when reusing environment
 
35
        env = env(user=SUPERUSER_ID)
 
36
        res = callback(env, tracking_id, event_type, **kw)
 
37
    return res
 
38
 
 
39
 
 
40
class MailTrackingController(http.Controller):
 
41
 
 
42
    def _request_metadata(self):
 
43
        request = http.request.httprequest
 
44
        return {
 
45
            'ip': request.remote_addr or False,
 
46
            'user_agent': request.user_agent or False,
 
47
            'os_family': request.user_agent.platform or False,
 
48
            'ua_family': request.user_agent.browser or False,
 
49
        }
 
50
 
 
51
    def _tracking_open(self, env, tracking_id, event_type, **kw):
 
52
        tracking_email = env['mail.tracking.email'].search([
 
53
            ('id', '=', tracking_id),
 
54
        ])
 
55
        if tracking_email:
 
56
            metadata = self._request_metadata()
 
57
            tracking_email.event_create('open', metadata)
 
58
        else:
 
59
            _logger.warning(
 
60
                "MailTracking email '%s' not found", tracking_id)
 
61
 
 
62
    def _tracking_event(self, env, tracking_id, event_type, **kw):
 
63
        metadata = self._request_metadata()
 
64
        return env['mail.tracking.email'].event_process(
 
65
            http.request, kw, metadata, event_type=event_type)
 
66
 
 
67
    @http.route('/mail/tracking/all/<string:db>',
 
68
                type='http', auth='none', csrf=False)
 
69
    def mail_tracking_all(self, db, **kw):
 
70
        return _env_get(db, self._tracking_event, None, None, **kw)
 
71
 
 
72
    @http.route('/mail/tracking/event/<string:db>/<string:event_type>',
 
73
                type='http', auth='none', csrf=False)
 
74
    def mail_tracking_event(self, db, event_type, **kw):
 
75
        return _env_get(db, self._tracking_event, None, event_type, **kw)
 
76
 
 
77
    @http.route('/mail/tracking/open/<string:db>'
 
78
                '/<int:tracking_email_id>/blank.gif',
 
79
                type='http', auth='none')
 
80
    def mail_tracking_open(self, db, tracking_email_id, **kw):
 
81
        _env_get(db, self._tracking_open, tracking_email_id, None, **kw)
 
82
 
 
83
        # Always return GIF blank image
 
84
        response = werkzeug.wrappers.Response()
 
85
        response.mimetype = 'image/gif'
 
86
        response.data = BLANK.decode('base64')
 
87
        return response