Merge branch 'master' into return-service_sms_sender_value

This commit is contained in:
Rebecca Law
2017-10-04 13:29:05 +01:00
14 changed files with 122 additions and 42 deletions

View File

@@ -370,7 +370,7 @@ def create_dvla_file_contents_for_notifications(notifications):
notification.template.__dict__,
notification.personalisation,
notification_reference=notification.reference,
contact_block=notification.service.letter_contact_block,
contact_block=notification.service.get_default_letter_contact(),
org_id=notification.service.dvla_organisation.id,
))
for notification in notifications

View File

@@ -285,3 +285,23 @@ class PopulateServiceSmsSender(Command):
print("Populated sms sender {} services from services".format(second_result.rowcount))
print("{} services in table".format(services_count_query))
print("{} service_sms_senders".format(service_sms_sender_count_query))
class PopulateServiceLetterContact(Command):
def run(self):
services_to_update = """
INSERT INTO service_letter_contacts(id, service_id, contact_block, is_default, created_at)
SELECT uuid_in(md5(random()::text || now()::text)::cstring), id, letter_contact_block, true, '{}'
FROM services
WHERE letter_contact_block IS NOT NULL
AND id NOT IN(
SELECT service_id
FROM service_letter_contacts
)
""".format(datetime.utcnow())
result = db.session.execute(services_to_update)
db.session.commit()
print("Populated letter contacts for {} services".format(result.rowcount))

View File

@@ -358,15 +358,13 @@ def dao_fetch_monthly_historical_stats_for_service(service_id, year):
@statsd(namespace='dao')
def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mode_services=None):
def dao_fetch_todays_stats_for_all_services(include_from_test_key=True):
query = db.session.query(
Notification.notification_type,
Notification.status,
Notification.service_id,
func.count(Notification.id).label('count')
).join(
Service
).filter(
func.date(Notification.created_at) == date.today(),
).group_by(
@@ -380,9 +378,6 @@ def dao_fetch_todays_stats_for_all_services(include_from_test_key=True, trial_mo
if not include_from_test_key:
query = query.filter(Notification.key_type != KEY_TYPE_TEST)
if trial_mode_services is not None:
query = query.filter(Service.restricted == trial_mode_services)
return query.all()

View File

@@ -208,8 +208,7 @@ class Service(db.Model, Versioned):
created_by = db.relationship('User')
created_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
_reply_to_email_address = db.Column("reply_to_email_address", db.Text, index=False, unique=False, nullable=True)
letter_contact_block = db.Column(db.Text, index=False, unique=False, nullable=True)
# This column is now deprecated
_letter_contact_block = db.Column('letter_contact_block', db.Text, index=False, unique=False, nullable=True)
sms_sender = db.Column(db.String(11), nullable=False, default=lambda: current_app.config['FROM_NUMBER'])
organisation_id = db.Column(UUID(as_uuid=True), db.ForeignKey('organisation.id'), index=True, nullable=True)
organisation = db.relationship('Organisation')
@@ -274,8 +273,7 @@ class Service(db.Model, Versioned):
if len(default_letter_contact) > 1:
raise Exception("There should only ever be one default")
else:
return default_letter_contact[0].contact_block if default_letter_contact else \
self.letter_contact_block # need to update this to None after dropping the letter_contact_block column
return default_letter_contact[0].contact_block if default_letter_contact else None
class InboundNumber(db.Model):
@@ -549,7 +547,7 @@ class Template(db.Model):
return LetterDVLATemplate(
{'content': self.content, 'subject': self.subject},
notification_reference=1,
contact_block=self.service.letter_contact_block,
contact_block=self.service.get_default_letter_contact(),
)
def serialize(self):
@@ -1450,3 +1448,24 @@ class ServiceLetterContact(db.Model):
'created_at': self.created_at.strftime(DATETIME_FORMAT),
'updated_at': self.updated_at.strftime(DATETIME_FORMAT) if self.updated_at else None
}
class NotificationEmailReplyTo(db.Model):
__tablename__ = "notification_to_email_reply_to"
notification_id = db.Column(
UUID(as_uuid=True),
db.ForeignKey('notifications.id'),
unique=True,
index=True,
nullable=False,
primary_key=True
)
service_email_reply_to_id = db.Column(
UUID(as_uuid=True),
db.ForeignKey('service_email_reply_to.id'),
unique=False,
index=True,
nullable=False,
primary_key=True
)

View File

@@ -184,6 +184,7 @@ class ServiceSchema(BaseSchema):
override_flag = False
reply_to_email_address = fields.Method(method_name="get_reply_to_email_address")
sms_sender = fields.Method(method_name="get_sms_sender")
letter_contact_block = fields.Method(method_name="get_letter_contact")
def get_free_sms_fragment_limit(selfs, service):
return service.free_sms_fragment_limit()
@@ -197,9 +198,12 @@ class ServiceSchema(BaseSchema):
def get_sms_sender(self, service):
return service.get_default_sms_sender()
def get_letter_contact(self, service):
return service.get_default_letter_contact()
class Meta:
model = models.Service
dump_only = ['free_sms_fragment_limit', 'reply_to_email_address']
dump_only = ['free_sms_fragment_limit', 'reply_to_email_address', 'letter_contact_block']
exclude = (
'updated_at',
'created_at',

View File

@@ -90,7 +90,6 @@ def get_services():
detailed = request.args.get('detailed') == 'True'
user_id = request.args.get('user_id', None)
include_from_test_key = request.args.get('include_from_test_key', 'True') != 'False'
trial_mode_services = request.args.get('trial_mode_services')
# If start and end date are not set, we are expecting today's stats.
today = str(datetime.utcnow().date())
@@ -103,8 +102,7 @@ def get_services():
elif detailed:
result = jsonify(data=get_detailed_services(start_date=start_date, end_date=end_date,
only_active=only_active,
include_from_test_key=include_from_test_key,
trial_mode_services=trial_mode_services
include_from_test_key=include_from_test_key
))
return result
else:
@@ -149,7 +147,6 @@ def update_service(service_id):
fetched_service = dao_fetch_service_by_id(service_id)
# Capture the status change here as Marshmallow changes this later
service_going_live = fetched_service.restricted and not req_json.get('restricted', True)
current_data = dict(service_schema.dump(fetched_service).data.items())
current_data.update(request.get_json())
update_dict = service_schema.load(current_data).data
@@ -369,12 +366,10 @@ def get_detailed_service(service_id, today_only=False):
return detailed_service_schema.dump(service).data
def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True,
trial_mode_services=None):
def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True):
services = {service.id: service for service in dao_fetch_all_services(only_active)}
if start_date == datetime.utcnow().date():
stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key,
trial_mode_services=trial_mode_services)
stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=include_from_test_key)
else:
stats = fetch_stats_by_date_range_for_all_services(start_date=start_date,