request.geoip is no more a dictionnary cached in the session. It is now a full blown object with lazy and smart geolocalisation capabilities. Among other things, the previous dictionnary API is now deprecated. The changes are: * `request.geoip['country_name']` -> `request.geoip.country_name` * `request.geoip['country_code']` -> `request.geoip.country_code` * `request.geoip['city']` -> `request.geoip.city.name` * `request.geoip['latitude']` -> `request.geoip.location.latitude` * `request.geoip['longitude']` -> `request.geoip.location.longitude` * `request.geoip['region']` -> `(request.geoip.subdivisions[0].iso_code if request.geoip.subdivisions else None)` * `request.geoip['time_zone']` -> `request.geoip.location.time_zone` It is safe to access all the attributes. Doing `request.geoip.city.name` when the geolocalization failed (missing db, invalid address, ...) evaluates to None. It does not raise an AttributeError. Task: 2848206 Part-of: odoo/odoo#91337
24 lines
819 B
Python
24 lines
819 B
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from werkzeug.exceptions import NotFound
|
|
|
|
from odoo import http
|
|
from odoo.http import request
|
|
|
|
|
|
class LinkTracker(http.Controller):
|
|
|
|
@http.route('/r/<string:code>', type='http', auth='public', website=True)
|
|
def full_url_redirect(self, code, **post):
|
|
if not request.env['ir.http'].is_a_bot():
|
|
request.env['link.tracker.click'].sudo().add_click(
|
|
code,
|
|
ip=request.httprequest.remote_addr,
|
|
country_code=request.geoip.country_code,
|
|
)
|
|
redirect_url = request.env['link.tracker'].get_url_from_code(code)
|
|
if not redirect_url:
|
|
raise NotFound()
|
|
return request.redirect(redirect_url, code=301, local=False)
|