mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-24 01:11:38 -05:00
Move common Template/TemplateHistory attributes to a base class
This allows us to avoid duplication between Template and TemplateHistory classes and makes it easier to ensure that all columns are copied to the TemplateHistory objects.
This commit is contained in:
116
app/models.py
116
app/models.py
@@ -4,6 +4,7 @@ import uuid
|
||||
import datetime
|
||||
from flask import url_for, current_app
|
||||
|
||||
from sqlalchemy.ext.declarative import declared_attr
|
||||
from sqlalchemy.ext.associationproxy import association_proxy
|
||||
from sqlalchemy.dialects.postgresql import (
|
||||
UUID,
|
||||
@@ -522,51 +523,42 @@ class TemplateProcessTypes(db.Model):
|
||||
name = db.Column(db.String(255), primary_key=True)
|
||||
|
||||
|
||||
class Template(db.Model):
|
||||
__tablename__ = 'templates'
|
||||
class TemplateBase(db.Model):
|
||||
__abstract__ = True
|
||||
|
||||
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
name = db.Column(db.String(255), nullable=False)
|
||||
template_type = db.Column(template_types, nullable=False)
|
||||
created_at = db.Column(
|
||||
db.DateTime,
|
||||
index=False,
|
||||
unique=False,
|
||||
nullable=False,
|
||||
default=datetime.datetime.utcnow)
|
||||
updated_at = db.Column(
|
||||
db.DateTime,
|
||||
index=False,
|
||||
unique=False,
|
||||
nullable=True,
|
||||
onupdate=datetime.datetime.utcnow)
|
||||
content = db.Column(db.Text, index=False, unique=False, nullable=False)
|
||||
archived = db.Column(db.Boolean, index=False, nullable=False, default=False)
|
||||
service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, unique=False, nullable=False)
|
||||
service = db.relationship('Service', backref='templates')
|
||||
subject = db.Column(db.Text, index=False, unique=False, nullable=True)
|
||||
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
|
||||
created_by = db.relationship('User')
|
||||
version = db.Column(db.Integer, default=0, nullable=False)
|
||||
process_type = db.Column(
|
||||
db.String(255),
|
||||
db.ForeignKey('template_process_type.name'),
|
||||
index=True,
|
||||
nullable=False,
|
||||
default=NORMAL
|
||||
)
|
||||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
||||
updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.utcnow)
|
||||
content = db.Column(db.Text, nullable=False)
|
||||
archived = db.Column(db.Boolean, nullable=False, default=False)
|
||||
subject = db.Column(db.Text)
|
||||
|
||||
@declared_attr
|
||||
def service_id(cls):
|
||||
return db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, nullable=False)
|
||||
|
||||
@declared_attr
|
||||
def created_by_id(cls):
|
||||
return db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
|
||||
|
||||
@declared_attr
|
||||
def created_by(cls):
|
||||
return db.relationship('User')
|
||||
|
||||
@declared_attr
|
||||
def process_type(cls):
|
||||
return db.Column(
|
||||
db.String(255),
|
||||
db.ForeignKey('template_process_type.name'),
|
||||
index=True,
|
||||
nullable=False,
|
||||
default=NORMAL
|
||||
)
|
||||
|
||||
redact_personalisation = association_proxy('template_redacted', 'redact_personalisation')
|
||||
|
||||
def get_link(self):
|
||||
# TODO: use "/v2/" route once available
|
||||
return url_for(
|
||||
"template.get_template_by_id_and_service_id",
|
||||
service_id=self.service_id,
|
||||
template_id=self.id,
|
||||
_external=True
|
||||
)
|
||||
|
||||
def _as_utils_template(self):
|
||||
if self.template_type == EMAIL_TYPE:
|
||||
return PlainTextEmailTemplate(
|
||||
@@ -605,6 +597,22 @@ class Template(db.Model):
|
||||
return serialized
|
||||
|
||||
|
||||
class Template(TemplateBase):
|
||||
__tablename__ = 'templates'
|
||||
|
||||
service = db.relationship('Service', backref='templates')
|
||||
version = db.Column(db.Integer, default=0, nullable=False)
|
||||
|
||||
def get_link(self):
|
||||
# TODO: use "/v2/" route once available
|
||||
return url_for(
|
||||
"template.get_template_by_id_and_service_id",
|
||||
service_id=self.service_id,
|
||||
template_id=self.id,
|
||||
_external=True
|
||||
)
|
||||
|
||||
|
||||
class TemplateRedacted(db.Model):
|
||||
__tablename__ = 'template_redacted'
|
||||
|
||||
@@ -618,32 +626,16 @@ class TemplateRedacted(db.Model):
|
||||
template = db.relationship('Template', uselist=False, backref=db.backref('template_redacted', uselist=False))
|
||||
|
||||
|
||||
class TemplateHistory(db.Model):
|
||||
class TemplateHistory(TemplateBase):
|
||||
__tablename__ = 'templates_history'
|
||||
|
||||
id = db.Column(UUID(as_uuid=True), primary_key=True)
|
||||
name = db.Column(db.String(255), nullable=False)
|
||||
template_type = db.Column(template_types, nullable=False)
|
||||
created_at = db.Column(db.DateTime, nullable=False)
|
||||
updated_at = db.Column(db.DateTime)
|
||||
content = db.Column(db.Text, nullable=False)
|
||||
archived = db.Column(db.Boolean, nullable=False, default=False)
|
||||
service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, nullable=False)
|
||||
service = db.relationship('Service')
|
||||
subject = db.Column(db.Text)
|
||||
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
|
||||
created_by = db.relationship('User')
|
||||
version = db.Column(db.Integer, primary_key=True, nullable=False)
|
||||
process_type = db.Column(db.String(255),
|
||||
db.ForeignKey('template_process_type.name'),
|
||||
index=True,
|
||||
nullable=False,
|
||||
default=NORMAL)
|
||||
|
||||
template_redacted = db.relationship('TemplateRedacted', foreign_keys=[id],
|
||||
primaryjoin='TemplateRedacted.template_id == TemplateHistory.id')
|
||||
|
||||
redact_personalisation = association_proxy('template_redacted', 'redact_personalisation')
|
||||
@declared_attr
|
||||
def template_redacted(cls):
|
||||
return db.relationship('TemplateRedacted', foreign_keys=[cls.id],
|
||||
primaryjoin='TemplateRedacted.template_id == TemplateHistory.id')
|
||||
|
||||
def get_link(self):
|
||||
return url_for(
|
||||
@@ -653,12 +645,6 @@ class TemplateHistory(db.Model):
|
||||
_external=True
|
||||
)
|
||||
|
||||
def _as_utils_template(self):
|
||||
return Template._as_utils_template(self)
|
||||
|
||||
def serialize(self):
|
||||
return Template.serialize(self)
|
||||
|
||||
|
||||
MMG_PROVIDER = "mmg"
|
||||
FIRETEXT_PROVIDER = "firetext"
|
||||
|
||||
Reference in New Issue
Block a user