mirror of
https://github.com/GSA/notifications-api.git
synced 2026-09-11 02:23:32 -04:00
Remove Notification, NotificationHistory status labels:
Replace labels by adding a key kwarg in the model for status. We still need this as sqlalchemy attmempts to look for `notification_status` on the model (Notification/NotificationHistory). To achieve true ORM mapping (map status -> notification_status) we need the key kwarg. More here: http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Column#key
This commit is contained in:
+1
-1
@@ -17,7 +17,7 @@ from app.statsd_decorators import statsd
|
|||||||
def dao_get_notification_outcomes_for_job(service_id, job_id):
|
def dao_get_notification_outcomes_for_job(service_id, job_id):
|
||||||
query = db.session.query(
|
query = db.session.query(
|
||||||
func.count(NotificationHistory.status).label('count'),
|
func.count(NotificationHistory.status).label('count'),
|
||||||
NotificationHistory.status.label('status')
|
NotificationHistory.status
|
||||||
)
|
)
|
||||||
|
|
||||||
return query \
|
return query \
|
||||||
|
|||||||
+6
-12
@@ -262,8 +262,7 @@ def fetch_todays_total_message_count(service_id):
|
|||||||
def _stats_for_service_query(service_id):
|
def _stats_for_service_query(service_id):
|
||||||
return db.session.query(
|
return db.session.query(
|
||||||
Notification.notification_type,
|
Notification.notification_type,
|
||||||
# see dao_fetch_todays_stats_for_all_services for why we have this label
|
Notification.status,
|
||||||
Notification.status.label('status'),
|
|
||||||
func.count(Notification.id).label('count')
|
func.count(Notification.id).label('count')
|
||||||
).filter(
|
).filter(
|
||||||
Notification.service_id == service_id,
|
Notification.service_id == service_id,
|
||||||
@@ -281,8 +280,7 @@ def dao_fetch_monthly_historical_stats_by_template_for_service(service_id, year)
|
|||||||
start_date, end_date = get_financial_year(year)
|
start_date, end_date = get_financial_year(year)
|
||||||
sq = db.session.query(
|
sq = db.session.query(
|
||||||
NotificationHistory.template_id,
|
NotificationHistory.template_id,
|
||||||
# see dao_fetch_todays_stats_for_all_services for why we have this label
|
NotificationHistory.status,
|
||||||
NotificationHistory.status.label('status'),
|
|
||||||
month.label('month'),
|
month.label('month'),
|
||||||
func.count().label('count')
|
func.count().label('count')
|
||||||
).filter(
|
).filter(
|
||||||
@@ -298,7 +296,7 @@ def dao_fetch_monthly_historical_stats_by_template_for_service(service_id, year)
|
|||||||
Template.id.label('template_id'),
|
Template.id.label('template_id'),
|
||||||
Template.name,
|
Template.name,
|
||||||
Template.template_type,
|
Template.template_type,
|
||||||
sq.c.status.label('status'),
|
sq.c.status,
|
||||||
sq.c.count.label('count'),
|
sq.c.count.label('count'),
|
||||||
sq.c.month
|
sq.c.month
|
||||||
).join(
|
).join(
|
||||||
@@ -316,8 +314,7 @@ def dao_fetch_monthly_historical_stats_for_service(service_id, year):
|
|||||||
start_date, end_date = get_financial_year(year)
|
start_date, end_date = get_financial_year(year)
|
||||||
rows = db.session.query(
|
rows = db.session.query(
|
||||||
NotificationHistory.notification_type,
|
NotificationHistory.notification_type,
|
||||||
# see dao_fetch_todays_stats_for_all_services for why we have this label
|
NotificationHistory.status,
|
||||||
NotificationHistory.status.label('status'),
|
|
||||||
month,
|
month,
|
||||||
func.count(NotificationHistory.id).label('count')
|
func.count(NotificationHistory.id).label('count')
|
||||||
).filter(
|
).filter(
|
||||||
@@ -356,9 +353,7 @@ def dao_fetch_monthly_historical_stats_for_service(service_id, year):
|
|||||||
def dao_fetch_todays_stats_for_all_services(include_from_test_key=True):
|
def dao_fetch_todays_stats_for_all_services(include_from_test_key=True):
|
||||||
query = db.session.query(
|
query = db.session.query(
|
||||||
Notification.notification_type,
|
Notification.notification_type,
|
||||||
# this label is necessary as the column has a different name under the hood (_status_enum / _status_fkey),
|
Notification.status,
|
||||||
# if we query the Notification object there is a hybrid property to translate, but here there isn't anything.
|
|
||||||
Notification.status.label('status'),
|
|
||||||
Notification.service_id,
|
Notification.service_id,
|
||||||
func.count(Notification.id).label('count')
|
func.count(Notification.id).label('count')
|
||||||
).filter(
|
).filter(
|
||||||
@@ -388,8 +383,7 @@ def fetch_stats_by_date_range_for_all_services(start_date, end_date, include_fro
|
|||||||
|
|
||||||
query = db.session.query(
|
query = db.session.query(
|
||||||
table.notification_type,
|
table.notification_type,
|
||||||
# see dao_fetch_todays_stats_for_all_services for why we have this label
|
table.status,
|
||||||
table.status.label('status'),
|
|
||||||
table.service_id,
|
table.service_id,
|
||||||
func.count(table.id).label('count')
|
func.count(table.id).label('count')
|
||||||
).filter(
|
).filter(
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ def timeout_job_counts(notifications_type, timeout_start):
|
|||||||
results = db.session.query(
|
results = db.session.query(
|
||||||
JobStatistics.job_id.label('job_id'),
|
JobStatistics.job_id.label('job_id'),
|
||||||
func.count(Notification.status).label('count'),
|
func.count(Notification.status).label('count'),
|
||||||
Notification.status.label('status')
|
Notification.status
|
||||||
).filter(
|
).filter(
|
||||||
Notification.notification_type == notifications_type,
|
Notification.notification_type == notifications_type,
|
||||||
JobStatistics.job_id == Notification.job_id,
|
JobStatistics.job_id == Notification.job_id,
|
||||||
|
|||||||
+6
-22
@@ -788,14 +788,14 @@ class Notification(db.Model):
|
|||||||
unique=False,
|
unique=False,
|
||||||
nullable=True,
|
nullable=True,
|
||||||
onupdate=datetime.datetime.utcnow)
|
onupdate=datetime.datetime.utcnow)
|
||||||
_status_enum = db.Column('status', NOTIFICATION_STATUS_TYPES_ENUM, index=True, nullable=True, default='created')
|
status = db.Column(
|
||||||
_status_fkey = db.Column(
|
|
||||||
'notification_status',
|
'notification_status',
|
||||||
db.String,
|
db.String,
|
||||||
db.ForeignKey('notification_status_types.name'),
|
db.ForeignKey('notification_status_types.name'),
|
||||||
index=True,
|
index=True,
|
||||||
nullable=True,
|
nullable=True,
|
||||||
default='created'
|
default='created',
|
||||||
|
key='status' # http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Column
|
||||||
)
|
)
|
||||||
reference = db.Column(db.String, nullable=True, index=True)
|
reference = db.Column(db.String, nullable=True, index=True)
|
||||||
client_reference = db.Column(db.String, index=True, nullable=True)
|
client_reference = db.Column(db.String, index=True, nullable=True)
|
||||||
@@ -817,14 +817,6 @@ class Notification(db.Model):
|
|||||||
created_by = db.relationship('User')
|
created_by = db.relationship('User')
|
||||||
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=True)
|
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), nullable=True)
|
||||||
|
|
||||||
@hybrid_property
|
|
||||||
def status(self):
|
|
||||||
return self._status_fkey
|
|
||||||
|
|
||||||
@status.setter
|
|
||||||
def status(self, status):
|
|
||||||
self._status_fkey = status
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def personalisation(self):
|
def personalisation(self):
|
||||||
if self._personalisation:
|
if self._personalisation:
|
||||||
@@ -998,14 +990,14 @@ class NotificationHistory(db.Model, HistoryModel):
|
|||||||
sent_at = db.Column(db.DateTime, index=False, unique=False, nullable=True)
|
sent_at = db.Column(db.DateTime, index=False, unique=False, nullable=True)
|
||||||
sent_by = db.Column(db.String, nullable=True)
|
sent_by = db.Column(db.String, nullable=True)
|
||||||
updated_at = db.Column(db.DateTime, index=False, unique=False, nullable=True)
|
updated_at = db.Column(db.DateTime, index=False, unique=False, nullable=True)
|
||||||
_status_enum = db.Column('status', NOTIFICATION_STATUS_TYPES_ENUM, index=True, nullable=True, default='created')
|
status = db.Column(
|
||||||
_status_fkey = db.Column(
|
|
||||||
'notification_status',
|
'notification_status',
|
||||||
db.String,
|
db.String,
|
||||||
db.ForeignKey('notification_status_types.name'),
|
db.ForeignKey('notification_status_types.name'),
|
||||||
index=True,
|
index=True,
|
||||||
nullable=True,
|
nullable=True,
|
||||||
default='created'
|
default='created',
|
||||||
|
key='status' # http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Column
|
||||||
)
|
)
|
||||||
reference = db.Column(db.String, nullable=True, index=True)
|
reference = db.Column(db.String, nullable=True, index=True)
|
||||||
client_reference = db.Column(db.String, nullable=True)
|
client_reference = db.Column(db.String, nullable=True)
|
||||||
@@ -1027,14 +1019,6 @@ class NotificationHistory(db.Model, HistoryModel):
|
|||||||
super().update_from_original(original)
|
super().update_from_original(original)
|
||||||
self.status = original.status
|
self.status = original.status
|
||||||
|
|
||||||
@hybrid_property
|
|
||||||
def status(self):
|
|
||||||
return self._status_fkey
|
|
||||||
|
|
||||||
@status.setter
|
|
||||||
def status(self, status):
|
|
||||||
self._status_fkey = status
|
|
||||||
|
|
||||||
|
|
||||||
INVITED_USER_STATUS_TYPES = ['pending', 'accepted', 'cancelled']
|
INVITED_USER_STATUS_TYPES = ['pending', 'accepted', 'cancelled']
|
||||||
|
|
||||||
|
|||||||
@@ -410,7 +410,7 @@ def test_should_by_able_to_update_status_by_id(sample_template, sample_job, mmg_
|
|||||||
data = _notification_json(sample_template, job_id=sample_job.id, status='sending')
|
data = _notification_json(sample_template, job_id=sample_job.id, status='sending')
|
||||||
notification = Notification(**data)
|
notification = Notification(**data)
|
||||||
dao_create_notification(notification)
|
dao_create_notification(notification)
|
||||||
assert notification._status_fkey == 'sending'
|
assert notification.status == 'sending'
|
||||||
|
|
||||||
assert Notification.query.get(notification.id).status == 'sending'
|
assert Notification.query.get(notification.id).status == 'sending'
|
||||||
|
|
||||||
@@ -421,7 +421,7 @@ def test_should_by_able_to_update_status_by_id(sample_template, sample_job, mmg_
|
|||||||
assert updated.updated_at == datetime(2000, 1, 2, 12, 0, 0)
|
assert updated.updated_at == datetime(2000, 1, 2, 12, 0, 0)
|
||||||
assert Notification.query.get(notification.id).status == 'delivered'
|
assert Notification.query.get(notification.id).status == 'delivered'
|
||||||
assert notification.updated_at == datetime(2000, 1, 2, 12, 0, 0)
|
assert notification.updated_at == datetime(2000, 1, 2, 12, 0, 0)
|
||||||
assert notification._status_fkey == 'delivered'
|
assert notification.status == 'delivered'
|
||||||
|
|
||||||
|
|
||||||
def test_should_not_update_status_by_id_if_not_sending_and_does_not_update_job(notify_db, notify_db_session):
|
def test_should_not_update_status_by_id_if_not_sending_and_does_not_update_job(notify_db, notify_db_session):
|
||||||
|
|||||||
@@ -463,8 +463,6 @@ def test_get_all_notifications_for_job_returns_correct_format(
|
|||||||
assert len(resp['notifications']) == 1
|
assert len(resp['notifications']) == 1
|
||||||
assert resp['notifications'][0]['id'] == str(sample_notification_with_job.id)
|
assert resp['notifications'][0]['id'] == str(sample_notification_with_job.id)
|
||||||
assert resp['notifications'][0]['status'] == sample_notification_with_job.status
|
assert resp['notifications'][0]['status'] == sample_notification_with_job.status
|
||||||
assert '_status_fkey' not in resp['notifications'][0]
|
|
||||||
assert '_status_enum' not in resp['notifications'][0]
|
|
||||||
|
|
||||||
|
|
||||||
def test_get_job_by_id(notify_api, sample_job):
|
def test_get_job_by_id(notify_api, sample_job):
|
||||||
|
|||||||
Reference in New Issue
Block a user