Repository navigation
Expand file tree
/
Copy pathmodels.py
More file actions
76 lines (62 loc) · 2.33 KB
/
Copy pathmodels.py
File metadata and controls
76 lines (62 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from __future__ import absolute_import, unicode_literals
import re
from django.db import models
from django.utils.translation import ugettext_lazy as _
from feincms._internal import ct_render_to_string
class VideoContent(models.Model):
"""
Copy-paste a URL to youtube or vimeo into the text box, this content type
will automatically generate the necessary embed code.
Other portals aren't supported currently, but would be easy to add if
anyone would take up the baton.
You should probably use feincms-oembed.
"""
PORTALS = (
('youtube', re.compile(r'youtube'), lambda url: {
'v': re.search(r'([?&]v=|./././)([^#&]+)', url).group(2),
}),
('vimeo', re.compile(r'vimeo'), lambda url: {
'id': re.search(r'/(\d+)', url).group(1),
}),
('sf', re.compile(r'sf\.tv'), lambda url: {
'id': re.search(r'/([a-z0-9\-]+)', url).group(1),
}),
)
video = models.URLField(
_('video link'),
help_text=_(
'This should be a link to a youtube or vimeo video,'
' i.e.: http://www.youtube.com/watch?v=zmj1rpzDRZ0'))
class Meta:
abstract = True
verbose_name = _('video')
verbose_name_plural = _('videos')
def get_context_dict(self):
"Extend this if you need more variables passed to template"
return {'content': self, 'portal': 'unknown'}
def get_templates(self, portal='unknown'):
"Extend/override this if you want to modify the templates used"
return [
'content/video/%s.html' % portal,
'content/video/unknown.html',
]
def ctx_for_video(self, vurl):
"Get a context dict for a given video URL"
ctx = self.get_context_dict()
for portal, match, context_fn in self.PORTALS:
if match.search(vurl):
try:
ctx.update(context_fn(vurl))
ctx['portal'] = portal
break
except AttributeError:
continue
return ctx
def render(self, **kwargs):
ctx = self.ctx_for_video(self.video)
return ct_render_to_string(
self.get_templates(ctx['portal']),
ctx,
request=kwargs.get('request'),
context=kwargs.get('context'),
)