From ba923eba43bdc651558e28e6d6b5e492ee8e67e2 Mon Sep 17 00:00:00 2001 From: Juda Kaleta Date: Fri, 4 Oct 2013 09:37:40 +0200 Subject: [PATCH] Admin mixin and widget --- embed_video/admin.py | 44 ++++++++++++++++++++++ embed_video/tests/tests_admin.py | 63 ++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 embed_video/admin.py create mode 100644 embed_video/tests/tests_admin.py diff --git a/embed_video/admin.py b/embed_video/admin.py new file mode 100644 index 0000000..da9ebd8 --- /dev/null +++ b/embed_video/admin.py @@ -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'
' \ + u'{video}
{input}
' \ + u'
' + + 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) diff --git a/embed_video/tests/tests_admin.py b/embed_video/tests/tests_admin.py new file mode 100644 index 0000000..a6ead30 --- /dev/null +++ b/embed_video/tests/tests_admin.py @@ -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'), + '') + + 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) + + '' + % backend.url + ) + + def test_incorrect_value(self): + widget = AdminVideoWidget() + self.assertEqual(widget.render('foo', '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')