backend/bms_app/scheduled_tasks/views.py (63 lines of code) (raw):
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from flask import request
from marshmallow import ValidationError
from bms_app.models import ScheduledTask, db
from bms_app.scheduled_tasks import bp
from bms_app.scheduled_tasks.schema import (
ScheduledTaskOutputSchema, ScheduledTaskSchema, SourceDbIdSchema
)
from bms_app.scheduled_tasks.services import (
add_record_to_db, create_google_task, validate_source_db
)
from bms_app.services.gcloud_tasks import delete_task
from bms_app.services.operations.restore import RestoreOperation
from bms_app.services.scheduled_tasks import (
delete_planned_task, get_planned_task
)
@bp.route('<int:task_id>/run', methods=['POST'])
def run(task_id):
task = ScheduledTask.query.get_or_404(task_id)
if not task.completed:
task.completed = True
db.session.add(task)
db.session.commit()
RestoreOperation().run(db_id=task.source_db.id)
return {}, 201
@bp.route('', methods=['POST'])
def add_scheduled_task():
"""Add schedule task."""
validated_data = ScheduledTaskSchema().load(request.json)
validate_source_db(validated_data['db_id'])
scheduled_task = add_record_to_db(
db_id=validated_data['db_id'],
schedule_time=validated_data['schedule_time']
)
google_task = create_google_task(scheduled_task)
scheduled_task.g_task_name = google_task.name
db.session.commit()
return {}, 201
@bp.route('/<int:task_id>', methods=['DELETE'])
def delete_scheduled_task(task_id):
"""Delete scheduled task from GoogleTask and ScheduledTask db"""
scheduled_task = ScheduledTask.query.get_or_404(task_id)
if scheduled_task.completed:
raise ValidationError(
{'_schema': ['completed task can not be deleted']}
)
delete_planned_task(scheduled_task)
return {}, 204
@bp.route('', methods=['GET'])
def get_task():
validated_data = SourceDbIdSchema().load(request.args)
task = get_planned_task(validated_data['db_id'])
return {'data': [ScheduledTaskOutputSchema().dump(task)]}
@bp.route('<int:task_id>', methods=['PUT'])
def edit_scheduled_task(task_id):
"""Edit schedule task.
GoogleTask does not support task edit.
It is needed to remove old GoogleTask and create new one.
"""
validated_data = ScheduledTaskSchema().load(request.json)
task = ScheduledTask.query.get_or_404(task_id)
# only incomplete task can be edited
if task.completed:
raise ValidationError({'_schema': 'Completed task can not be edited'})
# delete GoogleTask
delete_task(task.g_task_name)
# update time
task.schedule_time = validated_data['schedule_time']
# create new google task
google_task = create_google_task(task)
# update google task name
task.g_task_name = google_task.name
db.session.add(task)
db.session.commit()
return ScheduledTaskOutputSchema().dump(task)