diff --git a/business_logic/blockly/build.py b/business_logic/blockly/build.py index 9a10334..78985a0 100644 --- a/business_logic/blockly/build.py +++ b/business_logic/blockly/build.py @@ -67,11 +67,13 @@ def visit_constant(self, node, parent_xml): NumberConstant: 'math_number', StringConstant: 'text', BooleanConstant: 'logic_boolean', + DateConstant: 'business_logic_date', } field_name = { NumberConstant: 'NUM', StringConstant: 'TEXT', BooleanConstant: 'BOOL', + DateConstant: 'DATE', } content_object = node.content_object cls = content_object.__class__ diff --git a/business_logic/blockly/parse.py b/business_logic/blockly/parse.py index 1468a34..16a8e70 100644 --- a/business_logic/blockly/parse.py +++ b/business_logic/blockly/parse.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals - +import datetime from lxml import etree, objectify from django.utils.six import StringIO @@ -213,12 +213,18 @@ def visit_field_text(self, node): def visit_field_bool(self, node): return self._visit_field(BooleanConstant, value=node.text.lower() == 'true') + def visit_field_date(self, node): + return self._visit_field(DateConstant, value=datetime.datetime.strptime(node.text, '%Y-%m-%d').date()) + def visit_value(self, node): return self._visit_single_child(node) def visit_statement(self, node): return self._visit_single_child(node) + def visit_block_business_logic_date(self, node): + return self._visit_single_child(node) + def visit_block_business_logic_reference(self, node): data = { 'data': { diff --git a/tests/blockly/test_build.py b/tests/blockly/test_build.py index 6bfd94e..084b040 100644 --- a/tests/blockly/test_build.py +++ b/tests/blockly/test_build.py @@ -159,6 +159,22 @@ def test_block_if_sequence(self): block = block[0] self.assertEqual('controls_if', block.get('type')) +class BlocklyXmlDateTest(TestCase): + def test_block_date(self): + today = datetime.date.today() + root = Node.add_root(content_object=DateConstant(value=today)) + xml_str = BlocklyXmlBuilder().build(root) + xml = etree.parse(StringIO(xml_str)) + + block = xml.xpath('/xml/block') + self.assertEqual(1, len(block)) + block = block[0] + self.assertEqual('business_logic_date', block.get('type')) + + field = block.find('field') + self.assertEqual('DATE', field.get('name')) + self.assertEqual(today.strftime('%Y-%m-%d'), field.text) + class BlocklyXmlBuilderBinaryOperatorTest(TestCase): def _test_math_binary_operator(self, operator, block_type, operator_field_value): diff --git a/tests/blockly/test_create.py b/tests/blockly/test_create.py index c3a9700..b2a3741 100644 --- a/tests/blockly/test_create.py +++ b/tests/blockly/test_create.py @@ -114,6 +114,16 @@ def test_create_reference_constant(self): self.assertIsNot(tree1, tree2) self.assertFalse(self.tree_diff(tree1, tree2)) + def test_create_date(self): + today = datetime.date.today() + tree1 = variable_assign_value(value=DateConstant(value=today)) + dict1 = self.build_dict(tree1) + + tree2 = NodeTreeCreator().create(dict1) + + self.assertIsInstance(tree2, Node) + self.assertIsNot(tree1, tree2) + self.assertFalse(self.tree_diff(tree1, tree2)) def test_create_function(self): function_definition = PythonCodeFunctionDefinition.objects.create(title='xxx') diff --git a/tests/blockly/test_parse.py b/tests/blockly/test_parse.py index 0c6ae15..187a8d1 100644 --- a/tests/blockly/test_parse.py +++ b/tests/blockly/test_parse.py @@ -93,6 +93,9 @@ def test_boolean_constant(self): for value in (True, False): self._test_constant(BooleanConstant, value) + def test_date_constantant(self): + self._test_constant(DateConstant, datetime.date.today()) + class BlocklyXmlParserReferenceConstantTest(BlocklyXmlParserTestCase): def setUp(self): diff --git a/tests/common.py b/tests/common.py index a406656..c7984ec 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import unittest +import datetime from decimal import Decimal from pprint import pprint