Admin mixin and widget

This commit is contained in:
Juda Kaleta 2013-10-04 09:37:40 +02:00
parent 521f4d74ec
commit ba923eba43
2 changed files with 107 additions and 0 deletions

44
embed_video/admin.py Normal file
View 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)

View 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')