Exemplo n.º 1
0
 def __call__(self, context):
     return utils.dict_list_2_vocabulary([
         {
             'absolute': _(u'Absolute')
         },
         {
             'working_days': _(u'Working days')
         },
     ])
Exemplo n.º 2
0
 def __call__(self, context):
     return dict_list_2_vocabulary([
         {
             'AND': _(u'and')
         },
         {
             'OR': _(u'or')
         },
     ])
Exemplo n.º 3
0
class ISettings(model.Schema):

    working_days = schema.List(
        title=_(u'List of working days'),
        value_type=schema.Choice(
            title=_(u'Day'),
            vocabulary='imio.schedule.working_days',
        ),
        required=True,
    )
Exemplo n.º 4
0
    def __call__(self, context):
        """
        Call the adapter vocabulary for the 'default_assigned_group' field
        Return available groups for a task config.
        """
        gsm = getGlobalSiteManager()
        scheduled_interfaces = context.get_scheduled_interfaces()

        voc_terms = []
        for scheduled_interface in scheduled_interfaces:
            for adapter in gsm.registeredAdapters():
                implements_IGroup = adapter.provided is IDefaultTaskGroup
                specific_enough = adapter.required[0].implementedBy(scheduled_interface) or \
                    issubclass(scheduled_interface, adapter.required[0])
                if implements_IGroup and specific_enough:
                    voc_terms.append(
                        SimpleTerm(adapter.name, adapter.name,
                                   _(adapter.name)))

        # enrich the vocabulary with available groups
        for group in api.group.get_groups():
            voc_terms.append(
                SimpleTerm(group.id, group.id, group.getGroupTitleOrName()))

        vocabulary = SimpleVocabulary(voc_terms)
        return vocabulary
Exemplo n.º 5
0
class ITaskChangeOwner(Interface):

    new_owner = schema.Choice(
        title=_(u'New owner'),
        vocabulary='schedule.task_owner',
        required=True,
    )
Exemplo n.º 6
0
    def __call__(self, context):
        """
        Call the adapter vocabulary for the 'default_assigned_group' field
        Return available groups for a task config.
        """
        gsm = getGlobalSiteManager()
        scheduled_interface = context.get_scheduled_interface()

        voc_terms = []
        for adapter in gsm.registeredAdapters():
            implements_IGroup = adapter.provided is IDefaultTaskGroup
            specific_enough = adapter.required[0].implementedBy(scheduled_interface) or \
                issubclass(scheduled_interface, adapter.required[0])
            if implements_IGroup and specific_enough:
                voc_terms.append(
                    SimpleTerm(adapter.name, adapter.name, _(adapter.name))
                )

        # enrich the vocabulary with available groups
        for group in api.group.get_groups():
            voc_terms.append(
                SimpleTerm(group.id, group.id, group.getGroupTitleOrName())
            )

        vocabulary = SimpleVocabulary(voc_terms)
        return vocabulary
Exemplo n.º 7
0
    def __call__(self, context):
        """
        Call the adapter vocabulary for the 'default_assigned_user' field
        Return available users for a task config.
        """
        gsm = getGlobalSiteManager()
        scheduled_interface = context.get_scheduled_interface()

        voc_terms = []
        for adapter in gsm.registeredAdapters():
            implements_IUser = adapter.provided is IDefaultTaskUser
            specific_enough = adapter.required[0].implementedBy(scheduled_interface) or \
                issubclass(scheduled_interface, adapter.required[0])
            if implements_IUser and specific_enough:
                voc_terms.append(
                    SimpleTerm(adapter.name, adapter.name, _(adapter.name))
                )

        # enrich the vocabulary with available users
        for user in api.user.get_users():
            voc_terms.append(
                SimpleTerm(user.id, user.id, user.getProperty('fullname') or user.getUserName())
            )

        vocabulary = SimpleVocabulary(voc_terms)
        return vocabulary
Exemplo n.º 8
0
    def __call__(self, context):
        """
        Call the adapter vocabulary for the 'default_assigned_user' field
        Return available users for a task config.
        """
        gsm = getGlobalSiteManager()
        scheduled_interfaces = context.get_scheduled_interfaces()

        voc_terms = []
        for scheduled_interface in scheduled_interfaces:
            for adapter in gsm.registeredAdapters():
                implements_IUser = adapter.provided is IDefaultTaskUser
                specific_enough = adapter.required[0].implementedBy(scheduled_interface) or \
                    issubclass(scheduled_interface, adapter.required[0])
                if implements_IUser and specific_enough:
                    voc_terms.append(
                        SimpleTerm(adapter.name, adapter.name,
                                   _(adapter.name)))

        # enrich the vocabulary with available users
        for user in api.user.get_users():
            voc_terms.append(
                SimpleTerm(user.id, user.id,
                           user.getProperty('fullname') or user.getUserName()))

        vocabulary = SimpleVocabulary(
            sorted(voc_terms, key=lambda term: term.title.decode('utf-8')))
        return vocabulary
Exemplo n.º 9
0
class IScheduleConfig(model.Schema):
    """
    ScheduleConfig dexterity schema.
    """

    enabled = schema.Bool(
        title=_(u'Enabled'),
        default=True,
        required=False,
    )

    scheduled_contenttype = schema.Choice(
        title=_(u'Scheduled content type'),
        description=_(u'Select the content type to apply schedule.'),
        vocabulary='schedule.scheduled_contenttype',
        required=True,
    )
Exemplo n.º 10
0
def update_title(schedule_container, event):
    """
    Dashboard Collection title should always be the title of the parent task.
    """
    collection = getattr(schedule_container, 'dashboard_collection', None)
    if collection:
        title = IScheduleConfig.providedBy(schedule_container) and _('All') or schedule_container.Title()
        collection.title = title
        collection.reindexObject(idxs=('Title', 'sortable_title'))
Exemplo n.º 11
0
class IEndConditionSchema(Interface):

    condition = SubFormContextChoice(
        title=_(u'Condition'),
        vocabulary='schedule.end_conditions',
        required=True,
    )

    operator = schema.Choice(
        title=_(u'Operator'),
        vocabulary='schedule.logical_operator',
        default='AND',
    )

    display_status = schema.Bool(
        title=_(u'display_status'),
        default=True,
    )
Exemplo n.º 12
0
 def handleApply(self, action):
     messages = IStatusMessage(self.request)
     data, errors = self.extractData()
     if errors:
         self.status = self.formErrorsMessage
         messages.addStatusMessage(self.status, type="error")
         return
     self.context._end()
     self.context.reindex_parent_tasks(idxs=['is_solvable_task'])
     self.status = _(u'Task Closed')
Exemplo n.º 13
0
 def handleApply(self, action):
     messages = IStatusMessage(self.request)
     data, errors = self.extractData()
     if errors:
         self.status = self.formErrorsMessage
         messages.addStatusMessage(self.status, type="error")
         return
     self.context.assigned_user = data.get("new_owner")
     self.context.reindexObject()
     self.status = _(u"Owner changed")
Exemplo n.º 14
0
 def handleApply(self, action):
     messages = IStatusMessage(self.request)
     data, errors = self.extractData()
     if errors:
         self.status = self.formErrorsMessage
         messages.addStatusMessage(self.status, type="error")
         return
     self.context.assigned_user = data.get('new_owner')
     self.context.reindexObject()
     self.context.reindex_parent_tasks(idxs=['is_solvable_task'])
     self.status = _(u'Owner changed')
Exemplo n.º 15
0
def create(schedule_container, event):
    """
    """
    collection_id = 'dashboard_collection'
    title = IScheduleConfig.providedBy(schedule_container) and _('All') or schedule_container.Title()

    if collection_id not in schedule_container.objectIds():
        factory_args = {
            'id': 'dashboard_collection',
            'title': title,
            'query': [
                {
                    'i': 'CompoundCriterion',
                    'o': 'plone.app.querystring.operation.compound.is',
                    'v': schedule_container.UID()
                },
                {
                    'i': 'review_state',
                    'o': 'plone.app.querystring.operation.selection.is',
                    'v': ['to_do']
                }
            ],
            'customViewFields': (
                u'assigned_user_column',
                u'status',
                u'due_date'
            ),
            'sort_on': u'due_date',
            'sort_reversed': True,
            'b_size': 30
        }

        if IScheduleConfig.providedBy(schedule_container):
            factory_args['customViewFields'] = (
                u'pretty_link',
                u'sortable_title',
                u'assigned_user_column',
                u'status',
                u'due_date'
            )

        kwargs = {}
        additional_queries = kwargs.pop('query', [])
        for query in additional_queries:
            factory_args['query'].append(query)
        factory_args.update(kwargs)

        portal_types = api.portal.get_tool('portal_types')
        type_info = portal_types.getTypeInfo('DashboardCollection')
        collection = type_info._constructInstance(schedule_container, **factory_args)
        # mark the collection with an interface to to customize the render
        # term view of collection widget
        alsoProvides(collection, IScheduleCollection)
Exemplo n.º 16
0
    def render(self):
        """
        """
        all_subtasks = self.task.get_last_subtasks()
        subtasks_to_do = [
            task for task in all_subtasks if task.get_status() != DONE
        ]
        if not subtasks_to_do:
            return self.display_task_status(self.task)

        rows = [
            u'<tr><th class="subtask_status_icon">{icon}</th>\
            <th i18n:translate="">{subtask}</th>\
            <th i18n:translate="">{due_date}</th></tr>'.format(
                icon=self.display_task_status(
                    self.task, with_subtasks=bool(subtasks_to_do)),
                subtask=_('Subtask'),
                due_date=_('Due date'),
            ),
        ]
        for task in subtasks_to_do:
            title = task.Title()
            display_subtasks = IAutomatedMacroTask.providedBy(task)
            status_icon = u'<td class="subtask_status_icon">{status}</td>'.format(
                status=self.display_task_status(
                    task, with_subtasks=display_subtasks), )
            status_title = u'<td class="subtask_status_title">{title}</td>'.format(
                title=title.decode('utf-8'), )
            date = task.due_date
            due_date = date.year == 9999 and u'\u221E' or date.strftime(
                '%d/%m/%Y')
            due_date = u'<td class="subtask_status_date">{}</td>'.format(
                due_date)
            row = u'<tr>{icon}{title}{due_date}</tr>'.format(
                icon=status_icon, title=status_title, due_date=due_date)
            rows.append(row)

        status_display = u'<table class=subtask_status_table>{}</table>'.format(
            ''.join(rows))
        return status_display
Exemplo n.º 17
0
    def render(self):
        """
        """
        all_subtasks = self.task.get_last_subtasks()
        subtasks_to_do = [task for task in all_subtasks if task.get_status() != DONE]
        if not subtasks_to_do:
            return self.display_task_status(self.task)

        rows = [
            u'<tr><th class="subtask_status_icon">{icon}</th>\
            <th i18n:translate="">{subtask}</th>\
            <th i18n:translate="">{due_date}</th></tr>'.format(
            icon=self.display_task_status(self.task, with_subtasks=bool(subtasks_to_do)),
            subtask=_('Subtask'),
            due_date=_('Due date'),
        ),
        ]
        for task in subtasks_to_do:
            title = task.Title()
            display_subtasks = IAutomatedMacroTask.providedBy(task)
            status_icon = u'<td class="subtask_status_icon">{status}</td>'.format(
                status=self.display_task_status(task, with_subtasks=display_subtasks),
            )
            status_title = u'<td class="subtask_status_title">{title}</td>'.format(
                title=title.decode('utf-8'),
            )
            date = task.due_date
            due_date = date.year == 9999 and u'\u221E' or date.strftime('%d/%m/%Y')
            due_date = u'<td class="subtask_status_date">{}</td>'.format(due_date)
            row = u'<tr>{icon}{title}{due_date}</tr>'.format(
                icon=status_icon,
                title=status_title,
                due_date=due_date
            )
            rows.append(row)

        status_display = u'<table class=subtask_status_table>{}</table>'.format(''.join(rows))
        return status_display
Exemplo n.º 18
0
class CloseTaskForm(Form):
    fields = field.Fields(ICloseTask)
    ignoreContext = True

    @button.buttonAndHandler(_(u'Confirm'))
    def handleApply(self, action):
        messages = IStatusMessage(self.request)
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            messages.addStatusMessage(self.status, type="error")
            return
        self.context._end()
        self.context.reindex_parent_tasks(idxs=['is_solvable_task'])
        self.status = _(u'Task Closed')
Exemplo n.º 19
0
class TaskChangeOwnerForm(Form):
    fields = field.Fields(ITaskChangeOwner)
    ignoreContext = True

    @button.buttonAndHandler(_(u'Confirm'))
    def handleApply(self, action):
        messages = IStatusMessage(self.request)
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            messages.addStatusMessage(self.status, type="error")
            return
        self.context.assigned_user = data.get('new_owner')
        self.context.reindexObject()
        self.context.reindex_parent_tasks(idxs=['is_solvable_task'])
        self.status = _(u'Owner changed')
Exemplo n.º 20
0
def create(schedule_container, event):
    """
    """
    collection_id = 'dashboard_collection'
    title = IScheduleConfig.providedBy(schedule_container) and _('All') or schedule_container.Title()

    if collection_id not in schedule_container.objectIds():
        factory_args = {
            'id': 'dashboard_collection',
            'title': title,
            'query': [
                {
                    'i': 'CompoundCriterion',
                    'o': 'plone.app.querystring.operation.compound.is',
                    'v': schedule_container.UID()
                },
                {
                    'i': 'review_state',
                    'o': 'plone.app.querystring.operation.selection.is',
                    'v': ['to_do']
                }
            ],
            'customViewFields': (
                u'assigned_user_column',
                u'status',
                u'due_date'
            ),
            'sort_on': u'due_date',
            'sort_reversed': True,
            'b_size': 30
        }

        kwargs = {}
        additional_queries = kwargs.pop('query', [])
        for query in additional_queries:
            factory_args['query'].append(query)
        factory_args.update(kwargs)

        portal_types = api.portal.get_tool('portal_types')
        type_info = portal_types.getTypeInfo('DashboardCollection')
        collection = type_info._constructInstance(schedule_container, **factory_args)
        # mark the collection with an interface to to customize the render
        # term view of collection widget
        alsoProvides(collection, IScheduleCollection)
Exemplo n.º 21
0
    def __call__(self, context):
        """
        Look for all the conditions registered for scheduled_contenttype,
        implementing some ITaskLogic (sub)interface and return them as
        a vocabulary.
        """
        gsm = getGlobalSiteManager()
        scheduled_interface = context.get_scheduled_interface()

        terms = []
        for adapter in gsm.registeredAdapters():
            implements_interface = issubclass(adapter.provided, ITaskLogic) and \
                issubclass(self.provides_interface, adapter.provided)
            specific_enough = adapter.required[0].implementedBy(scheduled_interface) or \
                issubclass(scheduled_interface, adapter.required[0])
            if implements_interface and specific_enough:
                terms.append(
                    SimpleTerm(adapter.name, adapter.name, _(adapter.name))
                )

        vocabulary = SimpleVocabulary(terms)
        return vocabulary
Exemplo n.º 22
0
    def __call__(self, context):
        """
        Look for all the conditions registered for scheduled_contenttype,
        implementing some ITaskLogic (sub)interface and return them as
        a vocabulary.
        """
        gsm = getGlobalSiteManager()
        scheduled_interfaces = context.get_scheduled_interfaces()

        terms = []
        for scheduled_interface in scheduled_interfaces:
            for adapter in gsm.registeredAdapters():
                implements_interface = issubclass(adapter.provided, ITaskLogic) and \
                    issubclass(self.provides_interface, adapter.provided)
                specific_enough = adapter.required[0].implementedBy(scheduled_interface) or \
                    issubclass(scheduled_interface, adapter.required[0])
                if implements_interface and specific_enough:
                    terms.append(
                        SimpleTerm(adapter.name, adapter.name,
                                   _(adapter.name)))

        vocabulary = SimpleVocabulary(terms)
        return vocabulary
Exemplo n.º 23
0
 def __call__(self, context):
     return utils.dict_list_2_vocabulary([
         {
             'monday': _(u'Monday')
         },
         {
             'tuesday': _(u'Tuesday')
         },
         {
             'wednesday': _(u'Wednesday')
         },
         {
             'thursday': _(u'Thursday')
         },
         {
             'friday': _(u'Friday')
         },
         {
             'saturday': _(u'Saturday')
         },
         {
             'sunday': _(u'Sunday')
         },
     ])
Exemplo n.º 24
0
    def __call__(self, context):
        raw_terms = [
            ('0', '0', _('None')),
            ('1', '1', _('Next Monday')),
            ('2', '2', _('Next Tuesday')),
            ('3', '3', _('Next Wednesday')),
            ('4', '4', _('Next Thursday')),
            ('5', '5', _('Next Friday')),
            ('6', '6', _('Next Saturday')),
            ('7', '7', _('Next Sunday')),
            ('-1', '-1', _('Previous Monday')),
            ('-2', '-2', _('Previous Tuesday')),
            ('-3', '-3', _('Previous Wednesday')),
            ('-4', '-4', _('Previous Thursday')),
            ('-5', '-5', _('Previous Friday')),
            ('-6', '-6', _('Previous Saturday')),
            ('-7', '-7', _('Previous Sunday')),
        ]
        voc_terms = [SimpleTerm(*term) for term in raw_terms]
        vocabulary = SimpleVocabulary(voc_terms)

        return vocabulary
Exemplo n.º 25
0
 def __call__(self, context):
     return dict_list_2_vocabulary([
         {'AND': _(u'and')},
         {'OR': _(u'or')},
     ])
Exemplo n.º 26
0
    def __call__(self, context):
        raw_terms = [
            ('0', '0', _('None')),
            ('1', '1', _('Next Monday')),
            ('2', '2', _('Next Tuesday')),
            ('3', '3', _('Next Wednesday')),
            ('4', '4', _('Next Thursday')),
            ('5', '5', _('Next Friday')),
            ('6', '6', _('Next Saturday')),
            ('7', '7', _('Next Sunday')),
            ('-1', '-1', _('Previous Monday')),
            ('-2', '-2', _('Previous Tuesday')),
            ('-3', '-3', _('Previous Wednesday')),
            ('-4', '-4', _('Previous Thursday')),
            ('-5', '-5', _('Previous Friday')),
            ('-6', '-6', _('Previous Saturday')),
            ('-7', '-7', _('Previous Sunday')),
        ]
        voc_terms = [SimpleTerm(*term) for term in raw_terms]
        vocabulary = SimpleVocabulary(voc_terms)

        return vocabulary
Exemplo n.º 27
0
class IMacroTaskConfig(ITaskConfig):
    """
    TaskConfig dexterity schema.
    """

    start_date = schema.Choice(
        title=_(u'Start date'),
        description=_(u'Select the start date used to compute the due date.'),
        vocabulary='schedule.macrotask_start_date',
        required=True,
    )

    creation_conditions = schema.List(
        title=_(u'Creation conditions'),
        description=_(u'Select creation conditions of the task'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IMacroCreationConditionSchema,
        ),
        required=False,
    )

    start_conditions = schema.List(
        title=_(u'Start conditions'),
        description=_(u'Select start conditions of the task'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IMacroStartConditionSchema,
        ),
        required=False,
    )

    end_conditions = schema.List(
        title=_(u'End conditions'),
        description=_(u'Select end conditions of the task.'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IMacroEndConditionSchema,
        ),
        required=False,
    )

    freeze_conditions = schema.List(
        title=_(u'Freeze conditions'),
        description=_(u'Select freeze conditions of the task.'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IMacroFreezeConditionSchema,
        ),
        required=False,
    )

    thaw_conditions = schema.List(
        title=_(u'Thaw conditions'),
        description=_(u'Select thaw conditions of the task.'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IMacroThawConditionSchema,
        ),
        required=False,
    )

    recurrence_conditions = schema.List(
        title=_(u'Recurrence condition'),
        description=_(u'Select recurrence conditions of the task.'),
        value_type=schema.Object(
            title=_('Conditions'),
            schema=IMacroRecurrenceConditionSchema,
        ),
        required=False,
    )
Exemplo n.º 28
0
class ITaskConfig(model.Schema):
    """
    TaskConfig dexterity schema.
    """

    model.fieldset('general',
                   label=_(u"General informations"),
                   fields=[
                       'enabled', 'default_assigned_group',
                       'default_assigned_user', 'marker_interfaces'
                   ])

    enabled = schema.Bool(
        title=_(u'Enabled'),
        default=True,
        required=False,
    )

    default_assigned_group = schema.Choice(
        title=_(u'Assigned group'),
        description=_(u'Select default group assigned to this task.'),
        vocabulary='schedule.assigned_group',
        required=False,
    )

    default_assigned_user = schema.Choice(
        title=_(u'Assigned user'),
        description=_(u'Select default user assigned to this task.'),
        vocabulary='schedule.assigned_user',
        required=True,
    )

    marker_interfaces = schema.Set(
        title=_(u'Marker interfaces'),
        description=_(u'Custom marker interfaces for this task.'),
        value_type=schema.Choice(source='schedule.task_marker_interfaces'),
        required=False,
    )

    model.fieldset('creation',
                   label=_(u"Creation"),
                   fields=['creation_state', 'creation_conditions'])

    creation_state = schema.Set(
        title=_(u'Task container creation state'),
        description=
        _(u'Select the state of the container where the task is automatically created.'
          ),
        value_type=schema.Choice(source='schedule.container_state'),
        required=False,
    )

    creation_conditions = schema.List(
        title=_(u'Creation conditions'),
        description=_(u'Select creation conditions of the task'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=ICreationConditionSchema,
        ),
        required=False,
    )

    model.fieldset('start',
                   label=_(u"Start"),
                   fields=['starting_states', 'start_conditions'])

    starting_states = schema.Set(
        title=_(u'Task container start states'),
        description=
        _(u'Select the state of the container where the task is automatically started.'
          ),
        value_type=schema.Choice(source='schedule.container_state'),
        required=False,
    )

    start_conditions = schema.List(
        title=_(u'Start conditions'),
        description=_(u'Select start conditions of the task'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IStartConditionSchema,
        ),
        required=False,
    )

    model.fieldset('ending',
                   label=_(u"Ending"),
                   fields=['ending_states', 'end_conditions'])

    ending_states = schema.Set(
        title=_(u'Task container end states'),
        description=
        _(u'Select the states of the container where the task is automatically closed.'
          ),
        value_type=schema.Choice(source='schedule.container_state'),
        required=False,
    )

    end_conditions = schema.List(
        title=_(u'End conditions'),
        description=_(u'Select end conditions of the task.'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IEndConditionSchema,
        ),
        required=False,
    )

    model.fieldset(
        'delay',
        label=_(u'Calculation delay'),
        fields=[
            'start_date', 'warning_delay', 'calculation_delay',
            'additional_delay', 'additional_delay_type', 'round_to_day'
        ],
    )

    start_date = schema.Choice(
        title=_(u'Start date'),
        description=_(u'Select the start date used to compute the due date.'),
        vocabulary='schedule.start_date',
        required=True,
    )

    warning_delay = schema.Int(
        title=_(u'Warning delay'),
        required=False,
    )

    calculation_delay = schema.List(
        title=_(u'Calculation delay method'),
        value_type=schema.Choice(
            title=_(u'Calculation delay'),
            vocabulary='schedule.calculation_delay',
            default='schedule.calculation_default_delay',
        ),
        required=True,
    )

    additional_delay = schema.Int(
        title=_(u'Additional delay'),
        description=_(u'This delay is added to the due date of the task.'),
        required=False,
        default=0,
    )

    additional_delay_type = schema.Choice(
        title=_(u'Additional delay type'),
        description=_(
            u'Define the calculation method for the additional delay'),
        vocabulary='imio.schedule.additional_delay_type',
        required=True,
    )

    round_to_day = schema.Choice(
        title=_(u'Round to week day'),
        vocabulary='schedule.vocabulary.week_days_rounding',
        default='0',
        required=True,
    )

    model.fieldset(
        'freeze',
        label=_(u'Freeze'),
        fields=[
            'freeze_states',
            'freeze_conditions',
        ],
    )

    freeze_states = schema.Set(
        title=_(u'Task container freeze states'),
        description=
        _(u'Select the states of the container where the task is automatically closed.'
          ),
        value_type=schema.Choice(source='schedule.container_state'),
        required=False,
    )

    freeze_conditions = schema.List(
        title=_(u'Freeze conditions'),
        description=_(u'Select freeze conditions of the task.'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IFreezeConditionSchema,
        ),
        required=False,
    )

    model.fieldset(
        'thaw',
        label=_(u'Thaw'),
        fields=[
            'thaw_states',
            'thaw_conditions',
        ],
    )

    thaw_states = schema.Set(
        title=_(u'Task container thaw states'),
        description=
        _(u'Select the states of the container where the task is automatically closed.'
          ),
        value_type=schema.Choice(source='schedule.container_state'),
        required=False,
    )

    thaw_conditions = schema.List(
        title=_(u'Thaw conditions'),
        description=_(u'Select thaw conditions of the task.'),
        value_type=schema.Object(
            title=_(u'Conditions'),
            schema=IThawConditionSchema,
        ),
        required=False,
    )

    model.fieldset(
        'recurrence',
        label=_(u'Recurrence'),
        fields=[
            'activate_recurrency',
            'recurrence_states',
            'recurrence_conditions',
        ],
    )

    activate_recurrency = schema.Bool(
        title=_(u'Activate recurrency'),
        required=False,
        default=False,
    )

    recurrence_states = schema.Set(
        title=_(u'Task container recurrence states'),
        description=
        _(u'Select the state of the container where the task should be recurred'
          ),
        value_type=schema.Choice(source='schedule.container_state'),
        required=False,
    )

    recurrence_conditions = schema.List(
        title=_(u'Recurrence condition'),
        description=_(u'Select recurrence conditions of the task.'),
        value_type=schema.Object(
            title=_('Conditions'),
            schema=IRecurrenceConditionSchema,
        ),
        required=False,
    )