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:
Alexey Bezhan
2017-11-21 14:43:07 +00:00
parent 559639eb63
commit 4c253bf3b9

View File

@@ -4,6 +4,7 @@ import uuid
import datetime import datetime
from flask import url_for, current_app from flask import url_for, current_app
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.dialects.postgresql import ( from sqlalchemy.dialects.postgresql import (
UUID, UUID,
@@ -522,51 +523,42 @@ class TemplateProcessTypes(db.Model):
name = db.Column(db.String(255), primary_key=True) name = db.Column(db.String(255), primary_key=True)
class Template(db.Model): class TemplateBase(db.Model):
__tablename__ = 'templates' __abstract__ = True
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
name = db.Column(db.String(255), nullable=False) name = db.Column(db.String(255), nullable=False)
template_type = db.Column(template_types, nullable=False) template_type = db.Column(template_types, nullable=False)
created_at = db.Column( created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
db.DateTime, updated_at = db.Column(db.DateTime, onupdate=datetime.datetime.utcnow)
index=False, content = db.Column(db.Text, nullable=False)
unique=False, archived = db.Column(db.Boolean, nullable=False, default=False)
nullable=False, subject = db.Column(db.Text)
default=datetime.datetime.utcnow)
updated_at = db.Column( @declared_attr
db.DateTime, def service_id(cls):
index=False, return db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, nullable=False)
unique=False,
nullable=True, @declared_attr
onupdate=datetime.datetime.utcnow) def created_by_id(cls):
content = db.Column(db.Text, index=False, unique=False, nullable=False) return db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, 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) @declared_attr
service = db.relationship('Service', backref='templates') def created_by(cls):
subject = db.Column(db.Text, index=False, unique=False, nullable=True) return db.relationship('User')
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
created_by = db.relationship('User') @declared_attr
version = db.Column(db.Integer, default=0, nullable=False) def process_type(cls):
process_type = db.Column( return db.Column(
db.String(255), db.String(255),
db.ForeignKey('template_process_type.name'), db.ForeignKey('template_process_type.name'),
index=True, index=True,
nullable=False, nullable=False,
default=NORMAL default=NORMAL
) )
redact_personalisation = association_proxy('template_redacted', 'redact_personalisation') 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): def _as_utils_template(self):
if self.template_type == EMAIL_TYPE: if self.template_type == EMAIL_TYPE:
return PlainTextEmailTemplate( return PlainTextEmailTemplate(
@@ -605,6 +597,22 @@ class Template(db.Model):
return serialized 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): class TemplateRedacted(db.Model):
__tablename__ = 'template_redacted' __tablename__ = 'template_redacted'
@@ -618,32 +626,16 @@ class TemplateRedacted(db.Model):
template = db.relationship('Template', uselist=False, backref=db.backref('template_redacted', uselist=False)) template = db.relationship('Template', uselist=False, backref=db.backref('template_redacted', uselist=False))
class TemplateHistory(db.Model): class TemplateHistory(TemplateBase):
__tablename__ = 'templates_history' __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') 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) 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], @declared_attr
primaryjoin='TemplateRedacted.template_id == TemplateHistory.id') def template_redacted(cls):
return db.relationship('TemplateRedacted', foreign_keys=[cls.id],
redact_personalisation = association_proxy('template_redacted', 'redact_personalisation') primaryjoin='TemplateRedacted.template_id == TemplateHistory.id')
def get_link(self): def get_link(self):
return url_for( return url_for(
@@ -653,12 +645,6 @@ class TemplateHistory(db.Model):
_external=True _external=True
) )
def _as_utils_template(self):
return Template._as_utils_template(self)
def serialize(self):
return Template.serialize(self)
MMG_PROVIDER = "mmg" MMG_PROVIDER = "mmg"
FIRETEXT_PROVIDER = "firetext" FIRETEXT_PROVIDER = "firetext"