Esempio n. 1
0
    def create_task_through_ui(self):
        task_create_type: Type[Task] = Menu(
            [
                MenuItem('Transient Task', lambda: TransientTask),
                MenuItem('Recurring Task', lambda: RecurringTask),
                MenuItem('Cancellation', lambda: AntiTask)
            ],
            'What type of task would you like to create?',
        ).process()

        if Task not in type.mro(task_create_type):
            raise RuntimeError(
                'Invalid task type resulting from CreateTaskMenuItem.create_task_through_ui()'
            )

        fields = task_create_type.get_input_fields()
        CliController.populate_fields(fields)
        field_values = CliController.fields_as_dict(fields)

        task = task_create_type(field_values)
        try:
            self.model.add_task(task)
        except PSSValidationError as err:
            raise PSSInvalidOperationError(
                f'Could not complete operation: {err}')

        CliView.display_notification(f'Successfully added {task}')
    def view_schedule_through_ui(self):
        get_schedule_task_instances = Menu(
            [
                MenuItem(
                    'Daily Schedule', lambda: lambda start_date: self.model.
                    get_task_instances_for_date(start_date)),
                MenuItem(
                    'Weekly Schedule', lambda: lambda start_date: self.model.
                    get_task_instances_for_week_starting(start_date)),
                MenuItem(
                    'Monthly Schedule', lambda: lambda start_date: self.model.
                    get_task_instances_for_month(start_date))
            ],
            'What type of schedule would you like to view?',
        ).process()
        start_date_field = Field(
            'StartDate', 'Start Date', validate_date_string,
            "Must be a date in form YYYYMMDD",
            lambda start_date_string: datetime.strptime(
                start_date_string, '%Y%m%d').date())
        CliController.populate_field(start_date_field)

        task_instances = get_schedule_task_instances(start_date_field.value)
        view = ScheduleView(task_instances)
        view.display()
    def find_and_display_task_through_ui(self):
        task_name_field = filter(lambda field: field.name == 'Name', Task.get_input_fields()).__next__()
        CliController.populate_field(task_name_field)

        try:
            task = self.model.get_task_by_name(task_name_field.value)
            self.model.remove_task(task)
        except PSSInvalidOperationError as err:
            raise PSSInvalidOperationError(f'Could not delete task: {err}')
Esempio n. 4
0
    def find_and_display_task_through_ui(self):
        task_name_field = filter(lambda field: field.name == 'Name',
                                 Task.get_input_fields()).__next__()
        CliController.populate_field(task_name_field)

        try:
            task = self.model.get_task_by_name(task_name_field.value)
            CliView.display_task(task)
        except PSSNoExistingTaskMatchError as err:
            raise PSSInvalidOperationError(
                f'Cannot find task with name "{task_name_field.value}": {err}')
Esempio n. 5
0
    def save_schedule(self):
        filename_field = Field(
            'filename',
            'filename',
        )
        CliController.populate_field(filename_field)

        try:
            self.model.write_task_data_to_file(filename=filename_field.value)
            CliView.display_notification(
                f'Successfully saved task data to {filename_field.value}')
        except Exception as err:
            raise PSSInvalidOperationError(
                f'Cannot write to file "{filename_field.value}": {err}')
    def import_data(self):
        filename_field = Field(
            'filename',
            'filename',
        )
        CliController.populate_field(filename_field)

        try:
            self.model.import_task_data_from_file(
                filename=filename_field.value)
            CliView.display_notification(
                f'Successfully imported task data from {filename_field.value}')
        except Exception as err:
            raise PSSInvalidOperationError(
                f'Cannot read valid data from "{filename_field.value}": {err}')
Esempio n. 7
0
    def edit_task_through_ui(self):
        def anti_tasks_invalidated(task_before_changes: RecurringTask,
                                   task_after_changes: RecurringTask):
            return task_before_changes.start != task_after_changes.start \
                   or task_before_changes.frequency != task_after_changes.frequency

        CliView.display_notification('Please choose a task.')
        task_name_field = filter(lambda field: field.name == 'Name',
                                 Task.get_input_fields()).__next__()
        CliController.populate_field(task_name_field)

        try:
            existing_task = self.model.get_task_by_name(task_name_field.value)
            CliView.display_task(existing_task, 'Current details:')

            TaskType = type(existing_task)
            fields = TaskType.get_input_fields()
            CliController.populate_fields(fields, allow_blank=True)

            field_values = existing_task.as_dict()
            field_values.update(CliController.fields_as_dict(fields))

            updated_task = TaskType(field_values)
            if TaskType == RecurringTask:
                if anti_tasks_invalidated(existing_task, updated_task):
                    CliView.display_notification(
                        'Cancellations could not be retained and will need to be re-entered.'
                    )
                else:
                    updated_task.cancellations = existing_task.cancellations

            self.model.remove_task(existing_task)
            try:
                self.model.add_task(updated_task)
            except PSSValidationError as err:
                # Restore existing_task
                self.model.add_task(existing_task)
                raise PSSInvalidOperationError(
                    f'Could not edit details for task  "{existing_task.name}": {err}'
                )

            CliView.display_notification(
                f'Successfully updated {existing_task}')

        except PSSNoExistingTaskMatchError as err:
            raise PSSInvalidOperationError(
                f'Cannot find task with name "{task_name_field.value}": {err}')
    def write_schedule_through_ui(self):
        get_schedule_task_instances = Menu(
            [
                MenuItem(
                    'Daily Schedule', lambda: lambda start_date: self.model.
                    get_task_instances_for_date(start_date)),
                MenuItem(
                    'Weekly Schedule', lambda: lambda start_date: self.model.
                    get_task_instances_for_week_starting(start_date)),
                MenuItem(
                    'Monthly Schedule', lambda: lambda start_date: self.model.
                    get_task_instances_for_month(start_date))
            ],
            'What type of schedule would you like to write?',
        ).process()

        start_date_field = Field(
            'StartDate', 'Start Date', validate_date_string,
            "Must be a date in form YYYYMMDD",
            lambda start_date_string: datetime.strptime(
                start_date_string, '%Y%m%d').date())

        filename_field = Field(
            'Filename',
            'filename',
            validate_data_filename,
        )

        try:
            CliController.populate_fields([start_date_field, filename_field])
            task_instances = get_schedule_task_instances(
                start_date_field.value)
            self.model.write_task_instances_to_file(
                filename=filename_field.value, task_instances=task_instances)
            CliView.display_notification(
                f'Exported schedule to "{filename_field.value}"')
        except Exception as err:
            raise PSSInvalidOperationError(f'Failed to export schedule: {err}')