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,5 +9,7 @@ register = template.Library()
9 def import_widgets(context, area_id, widget_var=None): 9 def import_widgets(context, area_id, widget_var=None):
10 if not widget_var: 10 if not widget_var:
11 widget_var = "widgets_{}".format(area_id) 11 widget_var = "widgets_{}".format(area_id)
  12 +
12 context[widget_var] = WidgetManager.get_widgets(area_id, context=context) 13 context[widget_var] = WidgetManager.get_widgets(area_id, context=context)
  14 +
13 return "" 15 return ""
colab/widgets/tests/test_widget_manager.py
@@ -3,34 +3,54 @@ from django.test import TestCase @@ -3,34 +3,54 @@ from django.test import TestCase
3 from colab.widgets.widget_manager import WidgetManager, Widget 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 class WidgetManagerTest(TestCase): 12 class WidgetManagerTest(TestCase):
7 13
8 html_content = "<head><meta charset='UTF-8'></head><body><p>T</p></body>" 14 html_content = "<head><meta charset='UTF-8'></head><body><p>T</p></body>"
9 widget_area = 'profile' 15 widget_area = 'profile'
10 widget_id = 'widget_id' 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 identifier = 'widget_id' 21 identifier = 'widget_id'
16 22
17 def generate_content(self, request=None): 23 def generate_content(self, request=None):
18 self.content = content 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 def setUp(self): 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 WidgetManager.register_widget(self.widget_area, custom_widget) 36 WidgetManager.register_widget(self.widget_area, custom_widget)
24 37
25 def tearDown(self): 38 def tearDown(self):
26 WidgetManager.unregister_widget(self.widget_area, self.widget_id) 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 def test_add_widgets_to_key_area(self): 48 def test_add_widgets_to_key_area(self):
29 self.assertEqual(len(WidgetManager.get_widgets(self.widget_area)), 1) 49 self.assertEqual(len(WidgetManager.get_widgets(self.widget_area)), 1)
30 50
31 def test_remove_widgets_in_key_area(self): 51 def test_remove_widgets_in_key_area(self):
32 area = 'admin' 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 WidgetManager.register_widget(area, widget_instance) 55 WidgetManager.register_widget(area, widget_instance)
36 WidgetManager.unregister_widget(area, self.widget_id) 56 WidgetManager.unregister_widget(area, self.widget_id)
@@ -38,17 +58,41 @@ class WidgetManagerTest(TestCase): @@ -38,17 +58,41 @@ class WidgetManagerTest(TestCase):
38 self.assertEqual(len(WidgetManager.get_widgets(area)), 0) 58 self.assertEqual(len(WidgetManager.get_widgets(area)), 0)
39 59
40 def test_get_body(self): 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 def test_get_header(self): 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 def test_generate_content(self): 82 def test_generate_content(self):
53 widgets = WidgetManager.get_widgets(self.widget_area) 83 widgets = WidgetManager.get_widgets(self.widget_area)
54 self.assertEqual(widgets[0].content, self.html_content) 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,16 +2,24 @@ import unittest
2 from mock import patch 2 from mock import patch
3 3
4 from colab.widgets.templatetags.widgets_tag import import_widgets 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 class WidgetsTest(unittest.TestCase): 15 class WidgetsTest(unittest.TestCase):
  16 +
9 @patch.object(WidgetManager, 'get_widgets') 17 @patch.object(WidgetManager, 'get_widgets')
10 def test_import_widgets_tag(self, get_widgets): 18 def test_import_widgets_tag(self, get_widgets):
11 - return_list = [1, 2, 3] 19 + return_list = [WigetMock(), WigetMock(), WigetMock()]
12 get_widgets.return_value = return_list 20 get_widgets.return_value = return_list
13 21
14 - context = {'request': ""} 22 + context = Context({'request': ""})
15 import_widgets(context, 'area') 23 import_widgets(context, 'area')
16 24
17 self.assertIn('widgets_area', context) 25 self.assertIn('widgets_area', context)
@@ -19,10 +27,10 @@ class WidgetsTest(unittest.TestCase): @@ -19,10 +27,10 @@ class WidgetsTest(unittest.TestCase):
19 27
20 @patch.object(WidgetManager, 'get_widgets') 28 @patch.object(WidgetManager, 'get_widgets')
21 def test_import_widgets_tag_with_named_var(self, get_widgets): 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 get_widgets.return_value = return_list 31 get_widgets.return_value = return_list
24 32
25 - context = {'request': ""} 33 + context = Context({'request': ""})
26 import_widgets(context, 'area', 'var') 34 import_widgets(context, 'area', 'var')
27 35
28 self.assertIn('var', context) 36 self.assertIn('var', context)
colab/widgets/widget_manager.py
1 from django.utils.safestring import mark_safe 1 from django.utils.safestring import mark_safe
  2 +from django.template.loader import render_to_string
2 3
3 4
4 class Widget(object): 5 class Widget(object):
5 identifier = None 6 identifier = None
6 name = None 7 name = None
7 content = '' 8 content = ''
  9 + template = ''
8 10
9 def get_body(self): 11 def get_body(self):
10 # avoiding regex in favor of performance 12 # avoiding regex in favor of performance
@@ -28,8 +30,11 @@ class Widget(object): @@ -28,8 +30,11 @@ class Widget(object):
28 head = self.content[start + len('<head>'):end] 30 head = self.content[start + len('<head>'):end]
29 return mark_safe(head) 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 class WidgetManager(object): 40 class WidgetManager(object):
@@ -50,11 +55,11 @@ class WidgetManager(object): @@ -50,11 +55,11 @@ class WidgetManager(object):
50 WidgetManager.widget_categories[category].remove(widget) 55 WidgetManager.widget_categories[category].remove(widget)
51 56
52 @staticmethod 57 @staticmethod
53 - def get_widgets(category, **kargs): 58 + def get_widgets(category, **kwargs):
54 if category not in WidgetManager.widget_categories: 59 if category not in WidgetManager.widget_categories:
55 return [] 60 return []
56 61
57 widgets = WidgetManager.widget_categories[category][:] 62 widgets = WidgetManager.widget_categories[category][:]
58 for widget in widgets: 63 for widget in widgets:
59 - widget.generate_content(**kargs) 64 + widget.generate_content(**kwargs)
60 return widgets 65 return widgets