forked from feincms/feincms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
74 lines (61 loc) · 2.2 KB
/
Copy pathmodels.py
File metadata and controls
74 lines (61 loc) · 2.2 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
import re
from django.db import models
from django.utils.translation import gettext_lazy as _
from feincms.utils.tuple import AutoRenderTuple
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 AutoRenderTuple((self.get_templates(ctx["portal"]), ctx))