summaryrefslogtreecommitdiff
path: root/addons/website/tools.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/website/tools.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website/tools.py')
-rw-r--r--addons/website/tools.py114
1 files changed, 114 insertions, 0 deletions
diff --git a/addons/website/tools.py b/addons/website/tools.py
new file mode 100644
index 00000000..6930f8a5
--- /dev/null
+++ b/addons/website/tools.py
@@ -0,0 +1,114 @@
+# -*- encoding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+import contextlib
+import re
+from unittest.mock import Mock, MagicMock, patch
+
+import werkzeug
+
+import odoo
+from odoo.tools.misc import DotDict
+
+
+def get_video_embed_code(video_url):
+ ''' Computes the valid iframe from given URL that can be embedded
+ (or False in case of invalid URL).
+ '''
+
+ if not video_url:
+ return False
+
+ # To detect if we have a valid URL or not
+ validURLRegex = r'^(http:\/\/|https:\/\/|\/\/)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$'
+
+ # Regex for few of the widely used video hosting services
+ ytRegex = r'^(?:(?:https?:)?\/\/)?(?:www\.)?(?:youtu\.be\/|youtube(-nocookie)?\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((?:\w|-){11})(?:\S+)?$'
+ vimeoRegex = r'\/\/(player.)?vimeo.com\/([a-z]*\/)*([0-9]{6,11})[?]?.*'
+ dmRegex = r'.+dailymotion.com\/(video|hub|embed)\/([^_?]+)[^#]*(#video=([^_&]+))?'
+ igRegex = r'(.*)instagram.com\/p\/(.[a-zA-Z0-9]*)'
+ ykuRegex = r'(.*).youku\.com\/(v_show\/id_|embed\/)(.+)'
+
+ if not re.search(validURLRegex, video_url):
+ return False
+ else:
+ embedUrl = False
+ ytMatch = re.search(ytRegex, video_url)
+ vimeoMatch = re.search(vimeoRegex, video_url)
+ dmMatch = re.search(dmRegex, video_url)
+ igMatch = re.search(igRegex, video_url)
+ ykuMatch = re.search(ykuRegex, video_url)
+
+ if ytMatch and len(ytMatch.groups()[1]) == 11:
+ embedUrl = '//www.youtube%s.com/embed/%s?rel=0' % (ytMatch.groups()[0] or '', ytMatch.groups()[1])
+ elif vimeoMatch:
+ embedUrl = '//player.vimeo.com/video/%s' % (vimeoMatch.groups()[2])
+ elif dmMatch:
+ embedUrl = '//www.dailymotion.com/embed/video/%s' % (dmMatch.groups()[1])
+ elif igMatch:
+ embedUrl = '//www.instagram.com/p/%s/embed/' % (igMatch.groups()[1])
+ elif ykuMatch:
+ ykuLink = ykuMatch.groups()[2]
+ if '.html?' in ykuLink:
+ ykuLink = ykuLink.split('.html?')[0]
+ embedUrl = '//player.youku.com/embed/%s' % (ykuLink)
+ else:
+ # We directly use the provided URL as it is
+ embedUrl = video_url
+ return '<iframe class="embed-responsive-item" src="%s" allowFullScreen="true" frameborder="0"></iframe>' % embedUrl
+
+
+def werkzeugRaiseNotFound(*args, **kwargs):
+ raise werkzeug.exceptions.NotFound()
+
+
+@contextlib.contextmanager
+def MockRequest(
+ env, *, routing=True, multilang=True,
+ context=None,
+ cookies=None, country_code=None, website=None, sale_order_id=None
+):
+ router = MagicMock()
+ match = router.return_value.bind.return_value.match
+ if routing:
+ match.return_value[0].routing = {
+ 'type': 'http',
+ 'website': True,
+ 'multilang': multilang
+ }
+ else:
+ match.side_effect = werkzeugRaiseNotFound
+
+ if context is None:
+ context = {}
+ lang_code = context.get('lang', env.context.get('lang', 'en_US'))
+ context.setdefault('lang', lang_code)
+
+ request = Mock(
+ context=context,
+ db=None,
+ endpoint=match.return_value[0] if routing else None,
+ env=env,
+ httprequest=Mock(
+ host='localhost',
+ path='/hello/',
+ app=odoo.http.root,
+ environ={'REMOTE_ADDR': '127.0.0.1'},
+ cookies=cookies or {},
+ referrer='',
+ ),
+ lang=env['res.lang']._lang_get(lang_code),
+ redirect=werkzeug.utils.redirect,
+ session=DotDict(
+ geoip={'country_code': country_code},
+ debug=False,
+ sale_order_id=sale_order_id,
+ ),
+ website=website
+ )
+
+ with contextlib.ExitStack() as s:
+ odoo.http._request_stack.push(request)
+ s.callback(odoo.http._request_stack.pop)
+ s.enter_context(patch('odoo.http.root.get_db_router', router))
+
+ yield request