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}')
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}')
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}')
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}')