From 4c9e39cfbd9401d94e3fb71aa33e56a97bdd8439 Mon Sep 17 00:00:00 2001 From: David Beguin Date: Fri, 4 Sep 2020 14:04:10 +0000 Subject: [PATCH] [FIX] website: get visitor tz directly from cookie Since tz is now (from 6eb4762fee20a158023d774a90e7ee90c2cacec5) added to the client cookie, visitor timezone can directly be set when creating the visitor, using the request. Jstz can be removed as even for module in ENT that used this lib, we can get the timezone using Intl lib instead. This will also reduce the number of request made only to get visitor's timezone. This commit reverts part of 17e84025239ed78716ed5d5d92c0ee0e10fbfb29 Linked ENT PR: 12963 Task ID: 2333825 closes odoo/odoo#59501 X-original-commit: 3d9a2de3575777c87327691319d89f9de6b8eada Related: odoo/enterprise#13918 Signed-off-by: Thibault Delavallee (tde) --- addons/website/controllers/main.py | 9 ----- addons/website/models/website_visitor.py | 21 ++++++++++- addons/website/static/lib/jstz.min.js | 3 +- .../website/static/src/js/visitor_timezone.js | 37 +------------------ addons/website/views/assets.xml | 2 - 5 files changed, 22 insertions(+), 50 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index f4fc6574ed3..e0cab93db9a 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -502,15 +502,6 @@ class Website(Home): request.env['web_editor.assets'].make_scss_customization(url, values) return True - @http.route(['/website/update_visitor_timezone'], type='json', auth="public", website=True) - def update_visitor_timezone(self, timezone): - visitor_sudo = request.env['website.visitor']._get_visitor_from_request() - if visitor_sudo: - if timezone in pytz.all_timezones: - visitor_sudo.write({'timezone': timezone}) - return True - return False - # ------------------------------------------------------ # Server actions # ------------------------------------------------------ diff --git a/addons/website/models/website_visitor.py b/addons/website/models/website_visitor.py index b4950ae9aa6..223353fa7d9 100644 --- a/addons/website/models/website_visitor.py +++ b/addons/website/models/website_visitor.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta import uuid +import pytz from odoo import fields, models, api, _ from odoo.addons.base.models.res_partner import _tz_get @@ -185,7 +186,11 @@ class WebsiteVisitor(models.Model): # Cookie associated to a Partner visitor = Visitor - if force_create and not visitor: + if visitor and not visitor.timezone: + tz = self._get_visitor_timezone() + if tz: + visitor.timezone = tz + if not visitor and force_create: visitor = self._create_visitor() return visitor @@ -235,6 +240,11 @@ class WebsiteVisitor(models.Model): 'country_id': country_id, 'website_id': request.website.id, } + + tz = self._get_visitor_timezone() + if tz: + vals['timezone'] = tz + if not self.env.user._is_public(): vals['partner_id'] = self.env.user.partner_id.id vals['name'] = self.env.user.partner_id.name @@ -298,3 +308,12 @@ class WebsiteVisitor(models.Model): self.env.cr.execute(query, (date_now, self.id), log_exceptions=False) except Exception: pass + + def _get_visitor_timezone(self): + tz = request.httprequest.cookies.get('tz') if request else None + if tz in pytz.all_timezones: + return tz + elif not self.env.user._is_public(): + return self.env.user.tz + else: + return None diff --git a/addons/website/static/lib/jstz.min.js b/addons/website/static/lib/jstz.min.js index a6be0f665e2..b8441beae4b 100644 --- a/addons/website/static/lib/jstz.min.js +++ b/addons/website/static/lib/jstz.min.js @@ -1,2 +1 @@ -/* jstz.min.js Version: 1.0.6 Build date: 2015-11-04 */ -!function(e){var a=function(){"use strict";var e="s",s={DAY:864e5,HOUR:36e5,MINUTE:6e4,SECOND:1e3,BASELINE_YEAR:2014,MAX_SCORE:864e6,AMBIGUITIES:{"America/Denver":["America/Mazatlan"],"Europe/London":["Africa/Casablanca"],"America/Chicago":["America/Mexico_City"],"America/Asuncion":["America/Campo_Grande","America/Santiago"],"America/Montevideo":["America/Sao_Paulo","America/Santiago"],"Asia/Beirut":["Asia/Amman","Asia/Jerusalem","Europe/Helsinki","Asia/Damascus","Africa/Cairo","Asia/Gaza","Europe/Minsk"],"Pacific/Auckland":["Pacific/Fiji"],"America/Los_Angeles":["America/Santa_Isabel"],"America/New_York":["America/Havana"],"America/Halifax":["America/Goose_Bay"],"America/Godthab":["America/Miquelon"],"Asia/Dubai":["Asia/Yerevan"],"Asia/Jakarta":["Asia/Krasnoyarsk"],"Asia/Shanghai":["Asia/Irkutsk","Australia/Perth"],"Australia/Sydney":["Australia/Lord_Howe"],"Asia/Tokyo":["Asia/Yakutsk"],"Asia/Dhaka":["Asia/Omsk"],"Asia/Baku":["Asia/Yerevan"],"Australia/Brisbane":["Asia/Vladivostok"],"Pacific/Noumea":["Asia/Vladivostok"],"Pacific/Majuro":["Asia/Kamchatka","Pacific/Fiji"],"Pacific/Tongatapu":["Pacific/Apia"],"Asia/Baghdad":["Europe/Minsk","Europe/Moscow"],"Asia/Karachi":["Asia/Yekaterinburg"],"Africa/Johannesburg":["Asia/Gaza","Africa/Cairo"]}},i=function(e){var a=-e.getTimezoneOffset();return null!==a?a:0},r=function(){var a=i(new Date(s.BASELINE_YEAR,0,2)),r=i(new Date(s.BASELINE_YEAR,5,2)),n=a-r;return 0>n?a+",1":n>0?r+",1,"+e:a+",0"},n=function(){var e,a;if("undefined"!=typeof Intl&&"undefined"!=typeof Intl.DateTimeFormat&&(e=Intl.DateTimeFormat(),"undefined"!=typeof e&&"undefined"!=typeof e.resolvedOptions))return a=e.resolvedOptions().timeZone,a&&(a.indexOf("/")>-1||"UTC"===a)?a:void 0},o=function(e){for(var a=new Date(e,0,1,0,0,1,0).getTime(),s=new Date(e,12,31,23,59,59).getTime(),i=a,r=new Date(i).getTimezoneOffset(),n=null,o=null;s-864e5>i;){var t=new Date(i),A=t.getTimezoneOffset();A!==r&&(r>A&&(n=t),A>r&&(o=t),r=A),i+=864e5}return n&&o?{s:u(n).getTime(),e:u(o).getTime()}:!1},u=function l(e,a,i){"undefined"==typeof a&&(a=s.DAY,i=s.HOUR);for(var r=new Date(e.getTime()-a).getTime(),n=e.getTime()+a,o=new Date(r).getTimezoneOffset(),u=r,t=null;n-i>u;){var A=new Date(u),c=A.getTimezoneOffset();if(c!==o){t=A;break}u+=i}return a===s.DAY?l(t,s.HOUR,s.MINUTE):a===s.HOUR?l(t,s.MINUTE,s.SECOND):t},t=function(e,a,s,i){if("N/A"!==s)return s;if("Asia/Beirut"===a){if("Africa/Cairo"===i.name&&13983768e5===e[6].s&&14116788e5===e[6].e)return 0;if("Asia/Jerusalem"===i.name&&13959648e5===e[6].s&&14118588e5===e[6].e)return 0}else if("America/Santiago"===a){if("America/Asuncion"===i.name&&14124816e5===e[6].s&&1397358e6===e[6].e)return 0;if("America/Campo_Grande"===i.name&&14136912e5===e[6].s&&13925196e5===e[6].e)return 0}else if("America/Montevideo"===a){if("America/Sao_Paulo"===i.name&&14136876e5===e[6].s&&1392516e6===e[6].e)return 0}else if("Pacific/Auckland"===a&&"Pacific/Fiji"===i.name&&14142456e5===e[6].s&&13961016e5===e[6].e)return 0;return s},A=function(e,i){for(var r=function(a){for(var r=0,n=0;n=a.rules[n].s&&e[n].e<=a.rules[n].e)){r="N/A";break}if(r=0,r+=Math.abs(e[n].s-a.rules[n].s),r+=Math.abs(a.rules[n].e-e[n].e),r>s.MAX_SCORE){r="N/A";break}}return r=t(e,i,r,a)},n={},o=a.olson.dst_rules.zones,u=o.length,A=s.AMBIGUITIES[i],c=0;u>c;c++){var m=o[c],l=r(o[c]);"N/A"!==l&&(n[m.name]=l)}for(var f in n)if(n.hasOwnProperty(f))for(var d=0;d