"""
Namespace defining common fields used by Studio for all blocks
"""

import datetime

from xblock.core import Namespace, Boolean, Scope, ModelType, String


class StringyBoolean(Boolean):
    """
    Reads strings from JSON as booleans.

    If the string is 'true' (case insensitive), then return True,
    otherwise False.

    JSON values that aren't strings are returned as is
    """
    def from_json(self, value):
        if isinstance(value, basestring):
            return value.lower() == 'true'
        return value


class DateTuple(ModelType):
    """
    ModelType that stores datetime objects as time tuples
    """
    def from_json(self, value):
        return datetime.datetime(*value[0:6])

    def to_json(self, value):
        if value is None:
            return None

        return list(value.timetuple())


class CmsNamespace(Namespace):
    """
    Namespace with fields common to all blocks in Studio
    """
    is_draft = Boolean(help="Whether this module is a draft", default=False, scope=Scope.settings)
    published_date = DateTuple(help="Date when the module was published", scope=Scope.settings)
    published_by = String(help="Id of the user who published this module", scope=Scope.settings)
    empty = StringyBoolean(help="Whether this is an empty template", scope=Scope.settings, default=False)
