adding a test event model to track data loaded from ivy, and hopefully cross-referenced with data loaded from Firebase.
This commit is contained in:
parent
a6ef6f3eb9
commit
87287f628f
|
@ -0,0 +1,32 @@
|
|||
class ApiError(Exception):
|
||||
"""
|
||||
Follows the RFC 7807 standard https://tools.ietf.org/html/rfc7807
|
||||
Example Usage:
|
||||
{
|
||||
"type": "https://example.com/probs/out-of-credit",
|
||||
"title": "You do not have enough credit.",
|
||||
"detail": "Your current balance is 30, but that costs 50.",
|
||||
"instance": "/account/12345/msgs/abc",
|
||||
"balance": 30,
|
||||
"accounts": ["/account/12345",
|
||||
"/account/67890"]
|
||||
}
|
||||
"""
|
||||
|
||||
def __init__(self, type, title, status, detail, instance):
|
||||
self.type = type
|
||||
self.title = title
|
||||
self.status = status
|
||||
self.detail = detail
|
||||
self.instance = instance
|
||||
|
||||
|
||||
class CommError(Exception):
|
||||
"""A standard error from which to extend, that can be easily converted to
|
||||
an API error if needed. The code should be a unique numeric value, and
|
||||
the detail is optional."""
|
||||
|
||||
def __init__(self, code: int, title, detail=""):
|
||||
self.code = code
|
||||
self.title = title
|
||||
self.detail = detail
|
|
@ -0,0 +1,26 @@
|
|||
from communicator import db
|
||||
|
||||
|
||||
class TestEvent(db.Model):
|
||||
student_id = db.Column(db.Integer, primary_key=True)
|
||||
date = db.Column(db.DateTime, primary_key=True)
|
||||
location = db.Column(db.Integer)
|
||||
phone = db.Column(db.String)
|
||||
email = db.Column(db.String)
|
||||
result_code = db.Column(db.String)
|
||||
notified = db.Column(db.Boolean, default=False)
|
||||
firebase_record = db.Column(db.Boolean, default=False) # Does this record exist in Firebase?
|
||||
ivy_record = db.Column(db.Boolean, default=False) # Has this record come in from the IVY?
|
||||
|
||||
@classmethod
|
||||
def from_ivy_dict(cls, dictionary):
|
||||
"""Creates a Test Result from a record read in from the IVY CSV File"""
|
||||
instance = cls()
|
||||
instance.student_id = dictionary["Student ID"]
|
||||
instance.phone = dictionary["Student Cellphone"]
|
||||
instance.email = dictionary["Student Email"]
|
||||
instance.date = dictionary["Test Date Time"]
|
||||
instance.location = dictionary["Test Kiosk Loc"]
|
||||
instance.result_code = dictionary["Test Result Code"]
|
||||
instance.from_ivy_dict = True
|
||||
return instance
|
|
@ -0,0 +1,23 @@
|
|||
import csv
|
||||
|
||||
from communicator.errors import CommError
|
||||
from communicator.models.test_event import TestEvent
|
||||
|
||||
|
||||
class IvyService(object):
|
||||
|
||||
@staticmethod
|
||||
def import_ivy_file(file_name):
|
||||
rows = []
|
||||
with open(file_name, 'r') as csv_file:
|
||||
reader = csv.DictReader(csv_file, delimiter='|')
|
||||
for row in reader:
|
||||
rows.append(row)
|
||||
return rows
|
||||
|
||||
@staticmethod
|
||||
def to_test_event_record(data):
|
||||
try:
|
||||
return TestEvent.from_ivy_dict(data)
|
||||
except KeyError as e:
|
||||
raise CommError("100", f"Invalid CSV Record, missing column {e}");
|
|
@ -0,0 +1,3 @@
|
|||
987654321|555/555-5555|rkc7h@virginia.edu|202009030809|4321|8726520277
|
||||
987654322|555/555-5556|testpositive@virginia.edu|202009060919|4321|8269722523
|
||||
987655321|555/555-5558|testnegetive@virginia.edu|202009070719|4321|1142270225
|
|
|
@ -0,0 +1,4 @@
|
|||
Student ID|Student Cellphone|Student Email|Test Date Time|Test Kiosk Loc|Test Result Code
|
||||
987654321|555/555-5555|rkc7h@virginia.edu|202009030809|4321|8726520277
|
||||
987654322|555/555-5556|testpositive@virginia.edu|202009060919|4321|8269722523
|
||||
987655321|555/555-5558|testnegetive@virginia.edu|202009070719|4321|1142270225
|
|
|
@ -0,0 +1,29 @@
|
|||
import unittest
|
||||
|
||||
from communicator.errors import CommError
|
||||
from communicator.services.ivy_service import IvyService
|
||||
|
||||
|
||||
class IvyServiceTest(unittest.TestCase):
|
||||
|
||||
def test_read_file_and_build_records(self):
|
||||
data = IvyService.import_ivy_file('../data/results.csv')
|
||||
self.assertEquals(3, len(data))
|
||||
# Quick spot check on values
|
||||
self.assertEquals("987654321", data[0]["Student ID"])
|
||||
self.assertEquals("testpositive@virginia.edu", data[1]["Student Email"])
|
||||
self.assertEquals("1142270225", data[2]["Test Result Code"])
|
||||
records = []
|
||||
for d in data:
|
||||
records.append(IvyService.to_test_event_record(d))
|
||||
self.assertEquals("987654321", records[0].student_id)
|
||||
self.assertEquals("testpositive@virginia.edu", records[1].email)
|
||||
self.assertEquals("1142270225", records[2].result_code)
|
||||
|
||||
def test_invalid_file(self):
|
||||
with self.assertRaises(CommError):
|
||||
data = IvyService.import_ivy_file('../data/incorrect.csv')
|
||||
records = []
|
||||
for d in data:
|
||||
records.append(IvyService.to_test_event_record(d))
|
||||
|
Loading…
Reference in New Issue