Commit 25f15734 by Eugeny Kolpakov

Merge pull request #22 from open-craft/date_selection

Date selection support
parents 213a97a5 2f83a1e2
import datetime
import pytz
from xblock.core import XBlock from xblock.core import XBlock
from xblock.fields import Boolean, Dict, Float, Integer, List, String from xblock.fields import Boolean, Dict, Float, Integer, List, String, DateTime
from xblock.validation import ValidationMessage from xblock.validation import ValidationMessage
from xblockutils.studio_editable import StudioEditableXBlockMixin from xblockutils.studio_editable import StudioEditableXBlockMixin
from xblockutils.studio_editable_test import StudioEditableBaseTest from xblockutils.studio_editable_test import StudioEditableBaseTest
...@@ -12,7 +14,8 @@ class EditableXBlock(StudioEditableXBlockMixin, XBlock): ...@@ -12,7 +14,8 @@ class EditableXBlock(StudioEditableXBlockMixin, XBlock):
color = String(default="red") color = String(default="red")
count = Integer(default=42) count = Integer(default=42)
comment = String(default="") comment = String(default="")
editable_fields = ('color', 'count', 'comment') date = DateTime(default=datetime.datetime(2014, 5, 14, tzinfo=pytz.UTC))
editable_fields = ('color', 'count', 'comment', 'date')
def validate_field_data(self, validation, data): def validate_field_data(self, validation, data):
""" """
...@@ -68,6 +71,7 @@ class TestEditableXBlock_StudioView(StudioEditableBaseTest): ...@@ -68,6 +71,7 @@ class TestEditableXBlock_StudioView(StudioEditableBaseTest):
block.color = "green" block.color = "green"
block.count = 5 block.count = 5
block.comment = "Hello" block.comment = "Hello"
block.date = datetime.datetime(2014, 6, 17, tzinfo=pytz.UTC)
block.save() block.save()
orig_values = {field_name: getattr(block, field_name) for field_name in EditableXBlock.editable_fields} orig_values = {field_name: getattr(block, field_name) for field_name in EditableXBlock.editable_fields}
# Reload the page: # Reload the page:
...@@ -111,10 +115,16 @@ class TestEditableXBlock_StudioView(StudioEditableBaseTest): ...@@ -111,10 +115,16 @@ class TestEditableXBlock_StudioView(StudioEditableBaseTest):
self.assert_unchanged(block) self.assert_unchanged(block)
for field_name in EditableXBlock.editable_fields: for field_name in EditableXBlock.editable_fields:
if field_name == 'date':
continue
color_control = self.get_element_for_field(field_name) color_control = self.get_element_for_field(field_name)
color_control.clear() color_control.clear()
color_control.send_keys('1000') color_control.send_keys('1000')
date_control = self.get_element_for_field('date')
date_control.clear()
date_control.send_keys("7/5/2015")
self.click_save() self.click_save()
block = self.load_root_xblock() # Need to reload the block to bypass its cache block = self.load_root_xblock() # Need to reload the block to bypass its cache
...@@ -122,6 +132,7 @@ class TestEditableXBlock_StudioView(StudioEditableBaseTest): ...@@ -122,6 +132,7 @@ class TestEditableXBlock_StudioView(StudioEditableBaseTest):
self.assertEqual(block.color, '1000') self.assertEqual(block.color, '1000')
self.assertEqual(block.count, 1000) self.assertEqual(block.count, 1000)
self.assertEqual(block.comment, '1000') self.assertEqual(block.comment, '1000')
self.assertEqual(block.date, datetime.datetime(2015, 7, 5, 0, 0, 0, tzinfo=pytz.UTC))
for field_name in EditableXBlock.editable_fields: for field_name in EditableXBlock.editable_fields:
self.click_reset_for_field(field_name) self.click_reset_for_field(field_name)
......
...@@ -4,6 +4,7 @@ function StudioEditableXBlockMixin(runtime, element) { ...@@ -4,6 +4,7 @@ function StudioEditableXBlockMixin(runtime, element) {
var fields = []; var fields = [];
var tinyMceAvailable = (typeof $.fn.tinymce !== 'undefined'); // Studio includes a copy of tinyMCE and its jQuery plugin var tinyMceAvailable = (typeof $.fn.tinymce !== 'undefined'); // Studio includes a copy of tinyMCE and its jQuery plugin
var datepickerAvailable = (typeof $.fn.datepicker !== 'undefined'); // Studio includes datepicker jQuery plugin
$(element).find('.field-data-control').each(function() { $(element).find('.field-data-control').each(function() {
var $field = $(this); var $field = $(this);
...@@ -65,6 +66,11 @@ function StudioEditableXBlockMixin(runtime, element) { ...@@ -65,6 +66,11 @@ function StudioEditableXBlockMixin(runtime, element) {
} }
}); });
} }
if (type == 'datepicker' && datepickerAvailable) {
$field.datepicker('destroy');
$field.datepicker({dateFormat: "m/d/yy"});
}
}); });
$(element).find('.wrapper-list-settings .list-set').each(function() { $(element).find('.wrapper-list-settings .list-set').each(function() {
......
...@@ -15,7 +15,7 @@ import logging ...@@ -15,7 +15,7 @@ import logging
from django.utils.translation import ugettext from django.utils.translation import ugettext
from xblock.core import XBlock from xblock.core import XBlock
from xblock.fields import Scope, JSONField, List, Integer, Float, Boolean, String from xblock.fields import Scope, JSONField, List, Integer, Float, Boolean, String, DateTime
from xblock.exceptions import JsonHandlerError from xblock.exceptions import JsonHandlerError
from xblock.fragment import Fragment from xblock.fragment import Fragment
from xblock.validation import Validation from xblock.validation import Validation
...@@ -104,6 +104,7 @@ class StudioEditableXBlockMixin(object): ...@@ -104,6 +104,7 @@ class StudioEditableXBlockMixin(object):
(Boolean, 'boolean'), (Boolean, 'boolean'),
(String, 'string'), (String, 'string'),
(List, 'list'), (List, 'list'),
(DateTime, 'datepicker'),
(JSONField, 'generic'), # This is last so as a last resort we display a text field w/ the JSON string (JSONField, 'generic'), # This is last so as a last resort we display a text field w/ the JSON string
) )
info = { info = {
...@@ -143,6 +144,11 @@ class StudioEditableXBlockMixin(object): ...@@ -143,6 +144,11 @@ class StudioEditableXBlockMixin(object):
# Convert value to JSON string if we're treating this field generically: # Convert value to JSON string if we're treating this field generically:
info["value"] = json.dumps(info["value"]) info["value"] = json.dumps(info["value"])
info["default"] = json.dumps(info["default"]) info["default"] = json.dumps(info["default"])
elif info["type"] == "datepicker":
if info["value"]:
info["value"] = info["value"].strftime("%m/%d/%Y")
if info["default"]:
info["default"] = info["default"].strftime("%m/%d/%Y")
if 'values_provider' in field.runtime_options: if 'values_provider' in field.runtime_options:
values = field.runtime_options["values_provider"](self) values = field.runtime_options["values_provider"](self)
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
</option> </option>
{% endfor %} {% endfor %}
</select> </select>
{% elif field.type == "string" %} {% elif field.type == "string" or field.type == "datepicker" %}
<input <input
type="text" type="text"
class="field-data-control" class="field-data-control"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment