Commit 839bdc0c1470f80c90aa8b1c232b518dca94c161

Authored by Matheus de Sousa Faria
2 parents d3de2a35 4a22801d

Merge pull request #106 from colab/improve_widget

Improve widget
colab/widgets/templatetags/widgets_tag.py
... ... @@ -9,5 +9,7 @@ register = template.Library()
9 9 def import_widgets(context, area_id, widget_var=None):
10 10 if not widget_var:
11 11 widget_var = "widgets_{}".format(area_id)
  12 +
12 13 context[widget_var] = WidgetManager.get_widgets(area_id, context=context)
  14 +
13 15 return ""
... ...
colab/widgets/tests/test_widget_manager.py
... ... @@ -3,34 +3,54 @@ from django.test import TestCase
3 3 from colab.widgets.widget_manager import WidgetManager, Widget
4 4  
5 5  
  6 +class WigetMock(Widget):
  7 +
  8 + def __init__(self, content=""):
  9 + self.content = content
  10 +
  11 +
6 12 class WidgetManagerTest(TestCase):
7 13  
8 14 html_content = "<head><meta charset='UTF-8'></head><body><p>T</p></body>"
9 15 widget_area = 'profile'
10 16 widget_id = 'widget_id'
11 17  
12   - def custom_widget_instance(self, content):
  18 + def ovewrited_widget_instance(self, content):
13 19  
14   - class CustomWidget(Widget):
  20 + class WidgetOverwrited(Widget):
15 21 identifier = 'widget_id'
16 22  
17 23 def generate_content(self, request=None):
18 24 self.content = content
19   - return CustomWidget()
  25 + return WidgetOverwrited()
  26 +
  27 + def default_widget_instance(self):
  28 +
  29 + class WidgetDefault(Widget):
  30 + pass
  31 +
  32 + return WidgetDefault()
20 33  
21 34 def setUp(self):
22   - custom_widget = self.custom_widget_instance(self.html_content)
  35 + custom_widget = self.ovewrited_widget_instance(self.html_content)
23 36 WidgetManager.register_widget(self.widget_area, custom_widget)
24 37  
25 38 def tearDown(self):
26 39 WidgetManager.unregister_widget(self.widget_area, self.widget_id)
27 40  
  41 + def test_widget_default_values(self):
  42 + widget = self.default_widget_instance()
  43 + self.assertEqual(widget.identifier, None)
  44 + self.assertEqual(widget.name, None)
  45 + self.assertEqual(widget.content, '')
  46 + self.assertEqual(widget.template, '')
  47 +
28 48 def test_add_widgets_to_key_area(self):
29 49 self.assertEqual(len(WidgetManager.get_widgets(self.widget_area)), 1)
30 50  
31 51 def test_remove_widgets_in_key_area(self):
32 52 area = 'admin'
33   - widget_instance = self.custom_widget_instance(self.html_content)
  53 + widget_instance = self.ovewrited_widget_instance(self.html_content)
34 54  
35 55 WidgetManager.register_widget(area, widget_instance)
36 56 WidgetManager.unregister_widget(area, self.widget_id)
... ... @@ -38,17 +58,41 @@ class WidgetManagerTest(TestCase):
38 58 self.assertEqual(len(WidgetManager.get_widgets(area)), 0)
39 59  
40 60 def test_get_body(self):
41   - customWidget = self.custom_widget_instance(self.html_content)
  61 + custom_widget = self.ovewrited_widget_instance(self.html_content)
42 62  
43   - customWidget.generate_content()
44   - self.assertEqual(customWidget.get_body(), "<p>T</p>")
  63 + custom_widget.generate_content()
  64 + self.assertEqual(custom_widget.get_body(), "<p>T</p>")
45 65  
46 66 def test_get_header(self):
47   - customWidget = self.custom_widget_instance(self.html_content)
  67 + custom_widget = self.ovewrited_widget_instance(self.html_content)
  68 +
  69 + custom_widget.generate_content()
  70 + self.assertEqual(custom_widget.get_header(), "<meta charset='UTF-8'>")
  71 +
  72 + def test_get_header_wrong(self):
  73 + widget = self.default_widget_instance()
  74 + widget.content = "<head> Teste <head>"
  75 + self.assertEqual(widget.get_header(), '')
48 76  
49   - customWidget.generate_content()
50   - self.assertEqual(customWidget.get_header(), "<meta charset='UTF-8'>")
  77 + def test_get_body_wrong(self):
  78 + widget = self.default_widget_instance()
  79 + widget.content = "<body> Teste <body>"
  80 + self.assertEqual(widget.get_body(), '')
51 81  
52 82 def test_generate_content(self):
53 83 widgets = WidgetManager.get_widgets(self.widget_area)
54 84 self.assertEqual(widgets[0].content, self.html_content)
  85 +
  86 + def test_widget_with_invalid_area(self):
  87 + self.assertEqual(WidgetManager.get_widgets("area"), [])
  88 +
  89 + def test_generate_content_without_template(self):
  90 + widget = self.default_widget_instance()
  91 + with self.assertRaises(Exception):
  92 + widget.generate_content()
  93 +
  94 + def test_generate_content_with_template(self):
  95 + widget = self.default_widget_instance()
  96 + widget.template = self.html_content
  97 + with self.assertRaises(Exception):
  98 + widget.generate_content()
... ...
colab/widgets/tests/test_widgets.py
... ... @@ -2,16 +2,24 @@ import unittest
2 2 from mock import patch
3 3  
4 4 from colab.widgets.templatetags.widgets_tag import import_widgets
5   -from colab.widgets.widget_manager import WidgetManager
  5 +from colab.widgets.widget_manager import WidgetManager, Widget
  6 +from django.template import Context
  7 +
  8 +
  9 +class WigetMock(Widget):
  10 +
  11 + def __init__(self, content=""):
  12 + self.content = content
6 13  
7 14  
8 15 class WidgetsTest(unittest.TestCase):
  16 +
9 17 @patch.object(WidgetManager, 'get_widgets')
10 18 def test_import_widgets_tag(self, get_widgets):
11   - return_list = [1, 2, 3]
  19 + return_list = [WigetMock(), WigetMock(), WigetMock()]
12 20 get_widgets.return_value = return_list
13 21  
14   - context = {'request': ""}
  22 + context = Context({'request': ""})
15 23 import_widgets(context, 'area')
16 24  
17 25 self.assertIn('widgets_area', context)
... ... @@ -19,10 +27,10 @@ class WidgetsTest(unittest.TestCase):
19 27  
20 28 @patch.object(WidgetManager, 'get_widgets')
21 29 def test_import_widgets_tag_with_named_var(self, get_widgets):
22   - return_list = [1, 2, 3]
  30 + return_list = [WigetMock(), WigetMock(), WigetMock()]
23 31 get_widgets.return_value = return_list
24 32  
25   - context = {'request': ""}
  33 + context = Context({'request': ""})
26 34 import_widgets(context, 'area', 'var')
27 35  
28 36 self.assertIn('var', context)
... ...
colab/widgets/widget_manager.py
1 1 from django.utils.safestring import mark_safe
  2 +from django.template.loader import render_to_string
2 3  
3 4  
4 5 class Widget(object):
5 6 identifier = None
6 7 name = None
7 8 content = ''
  9 + template = ''
8 10  
9 11 def get_body(self):
10 12 # avoiding regex in favor of performance
... ... @@ -28,8 +30,11 @@ class Widget(object):
28 30 head = self.content[start + len('<head>'):end]
29 31 return mark_safe(head)
30 32  
31   - def generate_content(self, **kwarg):
32   - self.content = ''
  33 + def generate_content(self, **kwargs):
  34 + if not self.template:
  35 + class_name = self.__class__.__name__
  36 + raise Exception("Template not defined in {}.".format(class_name))
  37 + self.content = render_to_string(self.template, kwargs.get('context'))
33 38  
34 39  
35 40 class WidgetManager(object):
... ... @@ -50,11 +55,11 @@ class WidgetManager(object):
50 55 WidgetManager.widget_categories[category].remove(widget)
51 56  
52 57 @staticmethod
53   - def get_widgets(category, **kargs):
  58 + def get_widgets(category, **kwargs):
54 59 if category not in WidgetManager.widget_categories:
55 60 return []
56 61  
57 62 widgets = WidgetManager.widget_categories[category][:]
58 63 for widget in widgets:
59   - widget.generate_content(**kargs)
  64 + widget.generate_content(**kwargs)
60 65 return widgets
... ...