Merge branch 'master' into remove-nasty-query-from-dashboard

Conflicts:
	app/service/rest.py
	tests/app/service/test_rest.py
This commit is contained in:
Martyn Inglis
2017-06-01 13:11:54 +01:00
64 changed files with 2012 additions and 648 deletions

View File

@@ -30,7 +30,7 @@ from app import (
)
from app.history_meta import Versioned
from app.utils import get_utc_time_in_bst
from app.utils import convert_utc_time_in_bst, convert_bst_to_utc
SMS_TYPE = 'sms'
EMAIL_TYPE = 'email'
@@ -146,8 +146,10 @@ class DVLAOrganisation(db.Model):
INTERNATIONAL_SMS_TYPE = 'international_sms'
INBOUND_SMS_TYPE = 'inbound_sms'
SCHEDULE_NOTIFICATIONS = 'schedule_notifications'
SERVICE_PERMISSION_TYPES = [EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE]
SERVICE_PERMISSION_TYPES = [EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE,
SCHEDULE_NOTIFICATIONS]
class ServicePermissionTypes(db.Model):
@@ -215,6 +217,21 @@ class Service(db.Model, Versioned):
self.can_send_letters = LETTER_TYPE in [p.permission for p in self.permissions]
self.can_send_international_sms = INTERNATIONAL_SMS_TYPE in [p.permission for p in self.permissions]
@classmethod
def from_json(cls, data):
"""
Assumption: data has been validated appropriately.
Returns a Service object based on the provided data. Deserialises created_by to created_by_id as marshmallow
would.
"""
# validate json with marshmallow
fields = data.copy()
fields['created_by_id'] = fields.pop('created_by')
return cls(**fields)
class ServicePermission(db.Model):
__tablename__ = "service_permissions"
@@ -226,7 +243,8 @@ class ServicePermission(db.Model):
service = db.relationship("Service")
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, nullable=False)
service_permission_types = db.relationship(Service, backref=db.backref("permissions"))
service_permission_types = db.relationship(
Service, backref=db.backref("permissions", cascade="all, delete-orphan"))
def __repr__(self):
return '<{} has service permission: {}>'.format(self.service_id, self.permission)
@@ -682,6 +700,7 @@ class Notification(db.Model):
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
to = db.Column(db.String, nullable=False)
normalised_to = db.Column(db.String, nullable=True)
job_id = db.Column(UUID(as_uuid=True), db.ForeignKey('jobs.id'), index=True, unique=False)
job = db.relationship('Job', backref=db.backref('notifications', lazy='dynamic'))
job_row_number = db.Column(db.Integer, nullable=True)
@@ -730,6 +749,8 @@ class Notification(db.Model):
foreign(template_version) == remote(TemplateHistory.version)
))
scheduled_notification = db.relationship('ScheduledNotification', uselist=False)
client_reference = db.Column(db.String, index=True, nullable=True)
international = db.Column(db.Boolean, nullable=False, default=False)
@@ -851,7 +872,7 @@ class Notification(db.Model):
}[self.template.template_type].get(self.status, self.status)
def serialize_for_csv(self):
created_at_in_bst = get_utc_time_in_bst(self.created_at)
created_at_in_bst = convert_utc_time_in_bst(self.created_at)
serialized = {
"row_number": '' if self.job_row_number is None else self.job_row_number + 1,
"recipient": self.to,
@@ -890,7 +911,9 @@ class Notification(db.Model):
"subject": self.subject,
"created_at": self.created_at.strftime(DATETIME_FORMAT),
"sent_at": self.sent_at.strftime(DATETIME_FORMAT) if self.sent_at else None,
"completed_at": self.completed_at()
"completed_at": self.completed_at(),
"scheduled_for": convert_bst_to_utc(self.scheduled_notification.scheduled_for
).strftime(DATETIME_FORMAT) if self.scheduled_notification else None
}
return serialized
@@ -956,6 +979,16 @@ class NotificationHistory(db.Model, HistoryModel):
INVITED_USER_STATUS_TYPES = ['pending', 'accepted', 'cancelled']
class ScheduledNotification(db.Model):
__tablename__ = 'scheduled_notifications'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
notification_id = db.Column(UUID(as_uuid=True), db.ForeignKey('notifications.id'), index=True, nullable=False)
notification = db.relationship('Notification', uselist=False)
scheduled_for = db.Column(db.DateTime, index=False, nullable=False)
pending = db.Column(db.Boolean, nullable=False, default=True)
class InvitedUser(db.Model):
__tablename__ = 'invited_users'