mirror of
https://github.com/Hopiu/django-embed-video.git
synced 2026-03-16 21:30:23 +00:00
Admin mixin and widget
This commit is contained in:
parent
521f4d74ec
commit
ba923eba43
2 changed files with 107 additions and 0 deletions
44
embed_video/admin.py
Normal file
44
embed_video/admin.py
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
from django import forms
|
||||
from django.utils.safestring import mark_safe
|
||||
|
||||
from .backends import detect_backend
|
||||
from .fields import EmbedVideoField
|
||||
|
||||
|
||||
class AdminVideoWidget(forms.TextInput):
|
||||
output_format = u'<div style="float:left" class="video">' \
|
||||
u'{video}<br />{input}</div>' \
|
||||
u'<hr style="visibility: hidden; clear:both">'
|
||||
|
||||
def __init__(self, attrs=None):
|
||||
default_attrs = {'size': '40'}
|
||||
|
||||
if attrs:
|
||||
default_attrs.update(attrs)
|
||||
|
||||
super(AdminVideoWidget, self).__init__(default_attrs)
|
||||
|
||||
def render(self, name, value='', attrs=None, size=(420, 315)):
|
||||
output = super(AdminVideoWidget, self).render(name, value, attrs)
|
||||
|
||||
if value:
|
||||
try:
|
||||
backend = detect_backend(value)
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
output = self.output_format.format(
|
||||
video=backend.get_embed_code(*size),
|
||||
input=output,
|
||||
)
|
||||
|
||||
return mark_safe(output)
|
||||
|
||||
|
||||
class AdminVideoMixin(object):
|
||||
def formfield_for_dbfield(self, db_field, **kwargs):
|
||||
if isinstance(db_field, EmbedVideoField):
|
||||
return db_field.formfield(widget=AdminVideoWidget)
|
||||
|
||||
return super(AdminVideoMixin, self) \
|
||||
.formfield_for_dbfield(db_field, **kwargs)
|
||||
63
embed_video/tests/tests_admin.py
Normal file
63
embed_video/tests/tests_admin.py
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
from unittest import TestCase
|
||||
|
||||
from django.forms import TextInput
|
||||
|
||||
from embed_video.admin import AdminVideoWidget, AdminVideoMixin
|
||||
from embed_video.backends import VimeoBackend
|
||||
from embed_video.fields import EmbedVideoField, EmbedVideoFormField
|
||||
|
||||
|
||||
class AdminVideoWidgetTestCase(TestCase):
|
||||
def test_size(self):
|
||||
widget = AdminVideoWidget()
|
||||
self.assertTrue('size' in widget.attrs)
|
||||
|
||||
def test_overwrite_size(self):
|
||||
widget = AdminVideoWidget(attrs={'size': 0})
|
||||
self.assertEqual(widget.attrs['size'], 0)
|
||||
|
||||
def test_add_to_attrs(self):
|
||||
widget = AdminVideoWidget(attrs={'name': 'foo'})
|
||||
self.assertEqual(widget.attrs['name'], 'foo')
|
||||
self.assertTrue('size' in widget.attrs)
|
||||
|
||||
def test_render_empty_value(self):
|
||||
widget = AdminVideoWidget(attrs={'size': '0'})
|
||||
self.assertEqual(widget.render('foo'),
|
||||
'<input name="foo" size="0" type="text" />')
|
||||
|
||||
def test_render(self):
|
||||
backend = VimeoBackend('https://vimeo.com/1')
|
||||
widget = AdminVideoWidget(attrs={'size': '0'})
|
||||
widget.output_format = '{video}{input}'
|
||||
|
||||
self.assertEqual(
|
||||
widget.render('foo', backend.url, size=(100, 100)),
|
||||
backend.get_embed_code(100, 100)
|
||||
+ '<input name="foo" size="0" type="text" value="%s" />'
|
||||
% backend.url
|
||||
)
|
||||
|
||||
def test_incorrect_value(self):
|
||||
widget = AdminVideoWidget()
|
||||
self.assertEqual(widget.render('foo', 'abcd'),
|
||||
'<input name="foo" size="40" type="text" value="abcd" />')
|
||||
|
||||
|
||||
class AdminVideoMixinTestCase(TestCase):
|
||||
def test_embedvideofield(self):
|
||||
foo = EmbedVideoField()
|
||||
mixin = AdminVideoMixin()
|
||||
self.assertTrue(isinstance(mixin.formfield_for_dbfield(foo),
|
||||
EmbedVideoFormField))
|
||||
|
||||
def test_other_fields(self):
|
||||
class Parent(object):
|
||||
def formfield_for_dbfield(*args, **kwargs):
|
||||
raise Exception
|
||||
|
||||
class MyAdmin(AdminVideoMixin, Parent):
|
||||
pass
|
||||
|
||||
myadmin = MyAdmin()
|
||||
self.assertRaises(Exception, myadmin.formfield_for_dbfield, 'foo')
|
||||
Loading…
Reference in a new issue