Merge pull request #1945 from alphagov/flexible-data-retention

Flexible data retention
This commit is contained in:
Rebecca Law
2018-07-17 16:03:18 +01:00
committed by GitHub
7 changed files with 436 additions and 1 deletions

View File

@@ -0,0 +1,44 @@
from datetime import datetime
from app import db
from app.dao.dao_utils import transactional
from app.models import ServiceDataRetention
def fetch_service_data_retention_by_id(service_id, data_retention_id):
data_retention = ServiceDataRetention.query.filter_by(service_id=service_id, id=data_retention_id).first()
return data_retention
def fetch_service_data_retention(service_id):
data_retention_list = ServiceDataRetention.query.filter_by(
service_id=service_id
).order_by(
# in the order that models.notification_types are created (email, sms, letter)
ServiceDataRetention.notification_type
).all()
return data_retention_list
@transactional
def insert_service_data_retention(service_id, notification_type, days_of_retention):
new_data_retention = ServiceDataRetention(service_id=service_id,
notification_type=notification_type,
days_of_retention=days_of_retention)
db.session.add(new_data_retention)
return new_data_retention
@transactional
def update_service_data_retention(service_data_retention_id, service_id, days_of_retention):
updated_count = ServiceDataRetention.query.filter(
ServiceDataRetention.id == service_data_retention_id,
ServiceDataRetention.service_id == service_id
).update(
{
"days_of_retention": days_of_retention,
"updated_at": datetime.utcnow()
}
)
return updated_count

View File

@@ -1859,3 +1859,14 @@ class ServiceDataRetention(db.Model):
__table_args__ = (
UniqueConstraint('service_id', 'notification_type', name='uix_service_data_retention'),
)
def serialize(self):
return {
"id": str(self.id),
"service_id": str(self.service_id),
"service_name": self.service.name,
"notification_type": self.notification_type,
"days_of_retention": self.days_of_retention,
"created_at": self.created_at.strftime(DATETIME_FORMAT),
"updated_at": self.updated_at.strftime(DATETIME_FORMAT) if self.updated_at else None,
}

View File

@@ -24,6 +24,12 @@ from app.dao.fact_notification_status_dao import (
)
from app.dao.inbound_numbers_dao import dao_allocate_number_for_service
from app.dao.organisation_dao import dao_get_organisation_by_service_id
from app.dao.service_data_retention_dao import (
fetch_service_data_retention,
fetch_service_data_retention_by_id,
insert_service_data_retention,
update_service_data_retention,
)
from app.dao.service_sms_sender_dao import (
archive_sms_sender,
dao_add_sms_sender_for_service,
@@ -76,6 +82,10 @@ from app.errors import (
from app.models import Service, EmailBranding
from app.schema_validation import validate
from app.service import statistics
from app.service.service_data_retention_schema import (
add_service_data_retention_request,
update_service_data_retention_request
)
from app.service.service_senders_schema import (
add_service_email_reply_to_request,
add_service_letter_contact_block_request,
@@ -734,6 +744,54 @@ def is_service_name_unique():
return jsonify(result=result), 200
@service_blueprint.route('/<uuid:service_id>/data-retention', methods=['GET'])
def get_data_retention_for_service(service_id):
data_retention_list = fetch_service_data_retention(service_id)
return jsonify([data_retention.serialize() for data_retention in data_retention_list]), 200
@service_blueprint.route('/<uuid:service_id>/data-retention/<uuid:data_retention_id>', methods=['GET'])
def get_data_retention_for_service_by_id(service_id, data_retention_id):
data_retention = fetch_service_data_retention_by_id(service_id, data_retention_id)
return jsonify(data_retention.serialize() if data_retention else {}), 200
@service_blueprint.route('/<uuid:service_id>/data-retention', methods=['POST'])
def create_service_data_retention(service_id):
form = validate(request.get_json(), add_service_data_retention_request)
try:
new_data_retention = insert_service_data_retention(
service_id=service_id,
notification_type=form.get("notification_type"),
days_of_retention=form.get("days_of_retention")
)
except IntegrityError:
raise InvalidRequest(
message="Service already has data retention for {} notification type".format(form.get("notification_type")),
status_code=400
)
return jsonify(result=new_data_retention.serialize()), 201
@service_blueprint.route('/<uuid:service_id>/data-retention/<uuid:data_retention_id>', methods=['POST'])
def modify_service_data_retention(service_id, data_retention_id):
form = validate(request.get_json(), update_service_data_retention_request)
update_count = update_service_data_retention(
service_data_retention_id=data_retention_id,
service_id=service_id,
days_of_retention=form.get("days_of_retention")
)
if update_count == 0:
raise InvalidRequest(
message="The service data retention for id: {} was not found for service: {}".format(data_retention_id,
service_id),
status_code=404)
return '', 204
def check_request_args(request):
service_id = request.args.get('service_id')
name = request.args.get('name', None)

View File

@@ -0,0 +1,23 @@
add_service_data_retention_request = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "POST service data retention schema",
"title": "Add service data retention for notification type api",
"type": "object",
"properties": {
"days_of_retention": {"type": "integer"},
"notification_type": {"enum": ["sms", "letter", "email"]},
},
"required": ["days_of_retention", "notification_type"]
}
update_service_data_retention_request = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "POST service data retention schema",
"title": "Update service data retention for notification type api",
"type": "object",
"properties": {
"days_of_retention": {"type": "integer"},
},
"required": ["days_of_retention"]
}