diff --git a/uw_iasystem/evaluation.py b/uw_iasystem/evaluation.py index 3971400..0088efa 100644 --- a/uw_iasystem/evaluation.py +++ b/uw_iasystem/evaluation.py @@ -20,9 +20,9 @@ def search_evaluations(campus, **kwargs): course_number section_id student_id (student number) + instructor_id (employee identification number) """ url = url_with_query(IAS_PREFIX, kwargs) - data = get_resource_by_campus(url, campus) evaluations = _json_to_evaluation(data) @@ -52,20 +52,27 @@ def _json_to_evaluation(data): type = _get_item_type(item_meta) if type == "evaluation": delivery_data = item.get('data') - if get_is_online(delivery_data): - evaluation = Evaluation() - evaluation.eval_status = \ - get_value_by_name(delivery_data, 'status') - evaluation.eval_open_date = get_open_date(delivery_data) - evaluation.eval_close_date = get_close_date(delivery_data) - evaluation.eval_url = get_eval_url(item.get('links')) - section, instructors, completion =\ - _get_child_items(_get_child_ids(item_meta), - collection_items) - evaluation.section_sln = get_section_sln(section) - evaluation.instructor_ids = instructors - evaluation.is_completed = get_is_complete(completion) - evaluations.append(evaluation) + + evaluation = Evaluation() + evaluation.eval_status = \ + get_value_by_name(delivery_data, 'status') + evaluation.eval_open_date = get_open_date(delivery_data) + evaluation.eval_close_date = get_close_date(delivery_data) + evaluation.report_available_date = get_report_available_date( + delivery_data) + evaluation.eval_url = get_eval_url(item.get('links')) + evaluation.report_url = get_report_url(item.get('links')) + section, instructors, completion =\ + _get_child_items(_get_child_ids(item_meta), + collection_items) + evaluation.section_sln = get_section_sln(section) + evaluation.instructor_ids = instructors + evaluation.is_completed = get_is_complete(completion) + evaluation.response_rate = get_response_rate(delivery_data) + evaluation.delivery_method = get_value_by_name( + delivery_data, 'deliveryMethod') + evaluations.append(evaluation) + return evaluations @@ -116,6 +123,12 @@ def get_eval_url(data): return item.get('href') +def get_report_url(data): + for item in data: + if item.get('rel') == "report": + return item.get('href') + + def get_value_by_name(list, name): for item in list: if item.get('name') == name: @@ -138,6 +151,16 @@ def get_close_date(data): return _datetime_from_string(open_date) +def get_report_available_date(data): + available_date = get_value_by_name(data, 'reportAvailableDate') + return _datetime_from_string(available_date) + + +def get_response_rate(data): + response_rate = get_value_by_name(data, 'responseRate') + return float(str(response_rate) if response_rate else '0') + + def get_is_online(data): if get_value_by_name(data, 'deliveryMethod') == "Online": return True @@ -145,7 +168,10 @@ def get_is_online(data): def _datetime_from_string(date_string): - date_format = "%Y-%m-%dT%H:%M:%S" - date_string = date_string.replace("Z", "") - date = datetime.strptime(date_string, date_format) - return pytz.utc.localize(date) + if date_string: + date_format = "%Y-%m-%dT%H:%M:%S" + date_string = date_string.replace("Z", "") + date = datetime.strptime(date_string, date_format) + return pytz.utc.localize(date) + + return "" diff --git a/uw_iasystem/models.py b/uw_iasystem/models.py index abaaaa5..f6357ee 100644 --- a/uw_iasystem/models.py +++ b/uw_iasystem/models.py @@ -8,15 +8,45 @@ class Evaluation(models.Model): is_completed = models.NullBooleanField() eval_status = models.CharField(max_length=7) eval_url = models.URLField() + report_url = models.URLField() + report_available_date = models.DateTimeField() + response_rate = models.FloatField() + delivery_method = models.CharField(max_length=32) def __init__(self, *args, **kwargs): super(Evaluation, self).__init__(*args, **kwargs) self.instructor_ids = [] def __str__(self): - return "{%s: %d, %s: %s, %s: %s, %s: %s, %s: %s}" % ( + return "{%s: %d, %s: %s, %s: %s, %s: %s, %s: %s, %s: %s, %s: %s, %s: %0.6f, %s: %s}" % ( "sln", self.section_sln, "eval_open_date", self.eval_open_date, "eval_close_date", self.eval_close_date, "eval_url", self.eval_url, - "is_completed", self.is_completed) + "is_completed", self.is_completed, + "report_url", self.eval_url, + "report_available_date", self.report_available_date, + "response_rate", self.response_rate, + "delivery_method", self.delivery_method) + + def is_online(self): + return (self.delivery_method == "Online") + + def is_open(self): + return (self.eval_status != "Closed") + + def json_data(self): + return { + "section_sln": self.section_sln, + "eval_open_date": str(self.eval_open_date), + "eval_close_date": str(self.eval_close_date), + "eval_status": self.eval_status, + "eval_url": self.eval_url, + "report_url": self.report_url, + "report_available_date": str(self.report_available_date), + "response_rate": self.response_rate, + "delivery_method": self.delivery_method, + "is_completed": self.is_completed, + "is_open": self.is_open(), + "is_online": self.is_online() + } diff --git a/uw_iasystem/resources/iasystem_uw/file/api/v1/evaluation_instructor_id_123456789_term_name_Autumn_year_2014 b/uw_iasystem/resources/iasystem_uw/file/api/v1/evaluation_instructor_id_123456789_term_name_Autumn_year_2014 new file mode 100644 index 0000000..63a17fa --- /dev/null +++ b/uw_iasystem/resources/iasystem_uw/file/api/v1/evaluation_instructor_id_123456789_term_name_Autumn_year_2014 @@ -0,0 +1,759 @@ +{ + "collection": { + "queries": [ + { + "href": "https://uw.iasysdev.org/api/v1/evaluation", + "data": [ + { + "required": true, + "name": "year", + "prompt": "Year" + }, + { + "required": true, + "name": "term_name", + "prompt": "Term Name" + }, + { + "prompt": "Curriculum Abbreviation", + "name": "curriculum_abbreviation" + }, + { + "name": "course_number", + "prompt": "Course Number" + }, + { + "prompt": "Section ID", + "name": "section_id" + }, + { + "prompt": "Student ID", + "name": "student_id" + } + ], + "rel": "collection filter", + "prompt": "Evaluation Search Resource" + } + ], + "items": [ + { + "meta": [ + { + "name": "type", + "value": "evaluation" + }, + { + "value": "1", + "name": "id" + }, + { + "value": "2", + "name": "childId" + }, + { + "value": "3", + "name": "childId" + } + ], + "data": [ + { + "value": "132068", + "name": "id", + "prompt": "Id" + }, + { + "name": "year", + "prompt": "Year", + "value": "2014" + }, + { + "value": "Autumn", + "name": "termName", + "prompt": "Term" + }, + { + "name": "deliveryMethod", + "prompt": "Delivery Method", + "value": "Online" + }, + { + "value": "Open", + "prompt": "Status", + "name": "status" + }, + { + "prompt": "Response Rate", + "name": "responseRate", + "value": "0.2490453" + }, + { + "value": "2014-11-24T15:00:00Z", + "prompt": "Open Date", + "name": "openDate" + }, + { + "value": "2051-12-03T07:59:59Z", + "name": "closeDate", + "prompt": "Close Date" + }, + { + "prompt": "Report Available Date", + "name": "reportAvailableDate", + "value": "2051-03-01T07:59:59Z" + } + ], + "links": [ + { + "rel": "publishedto", + "href": "https://uw.iasysdev.org/survey/132068", + "prompt": "Evaluation URL" + }, + { + "prompt": "Evaluation URL", + "href": "https://uw.iasysdev.org/report/132068", + "rel": "report" + } + ], + "href": "https://uw.iasysdev.org/api/v1/evaluation/132068" + }, + { + "meta": [ + { + "name": "type", + "value": "section" + }, + { + "name": "id", + "value": "2" + } + ], + "data": [ + { + "value": "15314", + "name": "instCourseId" + }, + { + "name": "year", + "value": "2014" + }, + { + "value": "Autumn", + "name": "termName" + }, + { + "name": "curriculumAbbreviation", + "value": "GERMAN" + }, + { + "value": "201", + "name": "courseNumber" + }, + { + "name": "sectionId", + "value": "B" + }, + { + "value": "Second-year German", + "name": "courseTitle" + } + ] + }, + { + "meta": [ + { + "value": "instructor", + "name": "type" + }, + { + "value": "3", + "name": "id" + } + ], + "data": [ + { + "name": "instInstructorId", + "value": "123456789" + }, + { + "value": "Bill", + "name": "firstName" + }, + { + "name": "lastName", + "value": "Teacher" + } + ] + }, + { + "meta": [ + { + "value": "evaluation", + "name": "type" + }, + { + "value": "4", + "name": "id" + }, + { + "value": "5", + "name": "childId" + }, + { + "name": "childId", + "value": "6" + }, + { + "name": "childId", + "value": "7" + }, + { + "name": "childId", + "value": "8" + } + ], + "data": [ + { + "name": "id", + "prompt": "Id", + "value": "132136" + }, + { + "value": "2014", + "name": "year", + "prompt": "Year" + }, + { + "prompt": "Term", + "name": "termName", + "value": "Autumn" + }, + { + "prompt": "Delivery Method", + "name": "deliveryMethod", + "value": "Online" + }, + { + "name": "status", + "prompt": "Status", + "value": "Closed" + }, + { + "prompt": "Response Rate", + "name": "responseRate", + "value": "0.370453" + }, + { + "value": "2014-11-24T15:00:00Z", + "prompt": "Open Date", + "name": "openDate" + }, + { + "prompt": "Close Date", + "name": "closeDate", + "value": "2014-12-03T07:59:59Z" + }, + { + "prompt": "Report Available Date", + "name": "reportAvailableDate", + "value": "2015-02-01T07:59:59Z" + } + ], + "href": "https://uw.iasysdev.org/api/v1/evaluation/132136", + "links": [ + { + "rel": "publishedto", + "href": "https://uw.iasysdev.org/survey/132136", + "prompt": "Evaluation URL" + }, + { + "prompt": "Evaluation URL", + "href": "https://uw.iasysdev.org/report/132136", + "rel": "report" + } + ] + }, + { + "data": [ + { + "name": "instCourseId", + "value": "11840" + }, + { + "value": "2014", + "name": "year" + }, + { + "value": "Autumn", + "name": "termName" + }, + { + "value": "C LIT", + "name": "curriculumAbbreviation" + }, + { + "value": "270", + "name": "courseNumber" + }, + { + "value": "AG", + "name": "sectionId" + }, + { + "name": "courseTitle", + "value": "Perspectives On Film: Introduction" + } + ], + "meta": [ + { + "value": "section", + "name": "type" + }, + { + "name": "id", + "value": "5" + } + ] + }, + { + "meta": [ + { + "value": "section", + "name": "type" + }, + { + "value": "6", + "name": "id" + } + ], + "data": [ + { + "value": "15327", + "name": "instCourseId" + }, + { + "name": "year", + "value": "2014" + }, + { + "value": "Autumn", + "name": "termName" + }, + { + "value": "GERMAN", + "name": "curriculumAbbreviation" + }, + { + "name": "courseNumber", + "value": "275" + }, + { + "value": "AG", + "name": "sectionId" + }, + { + "value": "Crime Scenes: Investigating The Cinema And Its Cultures", + "name": "courseTitle" + } + ] + }, + { + "meta": [ + { + "name": "type", + "value": "section" + }, + { + "value": "7", + "name": "id" + } + ], + "data": [ + { + "value": "20334", + "name": "instCourseId" + }, + { + "name": "year", + "value": "2014" + }, + { + "value": "Autumn", + "name": "termName" + }, + { + "value": "SCAND", + "name": "curriculumAbbreviation" + }, + { + "value": "275", + "name": "courseNumber" + }, + { + "value": "AG", + "name": "sectionId" + }, + { + "name": "courseTitle", + "value": "Crime Scenes: Investigating The Cinema And Its Cultures" + } + ] + }, + { + "data": [ + { + "name": "instInstructorId", + "value": "123456789" + }, + { + "value": "Bill", + "name": "firstName" + }, + { + "name": "lastName", + "value": "Teacher" + } + ], + "meta": [ + { + "name": "type", + "value": "instructor" + }, + { + "name": "id", + "value": "8" + } + ] + }, + { + "meta": [ + { + "name": "type", + "value": "evaluation" + }, + { + "value": "9", + "name": "id" + }, + { + "value": "10", + "name": "childId" + }, + { + "name": "childId", + "value": "11" + }, + { + "name": "childId", + "value": "12" + }, + { + "name": "childId", + "value": "13" + }, + { + "value": "14", + "name": "childId" + }, + { + "name": "childId", + "value": "15" + } + ], + "data": [ + { + "prompt": "Id", + "name": "id", + "value": "132167" + }, + { + "value": "2014", + "name": "year", + "prompt": "Year" + }, + { + "value": "Autumn", + "name": "termName", + "prompt": "Term" + }, + { + "value": "Paper", + "name": "deliveryMethod", + "prompt": "Delivery Method" + }, + { + "prompt": "Status", + "name": "status", + "value": "Closed" + }, + { + "prompt": "Response Rate", + "name": "responseRate", + "value": "0.4190453" + }, + { + "value": "2014-11-24T15:00:00Z", + "prompt": "Open Date", + "name": "openDate" + }, + { + "value": "2014-12-03T07:59:59Z", + "prompt": "Close Date", + "name": "closeDate" + }, + { + "prompt": "Report Available Date", + "name": "reportAvailableDate", + "value": "2014-03-01T07:59:59Z" + } + ], + "links": [ + { + "prompt": "Evaluation URL", + "href": "https://uw.iasysdev.org/survey/132167", + "rel": "publishedto" + }, + { + "prompt": "Evaluation URL", + "href": "https://uw.iasysdev.org/report/132167", + "rel": "report" + } + ], + "href": "https://uw.iasysdev.org/api/v1/evaluation/132167" + }, + { + "meta": [ + { + "value": "section", + "name": "type" + }, + { + "name": "id", + "value": "10" + } + ], + "data": [ + { + "value": "11833", + "name": "instCourseId" + }, + { + "value": "2014", + "name": "year" + }, + { + "name": "termName", + "value": "Autumn" + }, + { + "name": "curriculumAbbreviation", + "value": "C LIT" + }, + { + "value": "270", + "name": "courseNumber" + }, + { + "name": "sectionId", + "value": "A" + }, + { + "name": "courseTitle", + "value": "Perspectives On Film: Introduction" + } + ] + }, + { + "data": [ + { + "value": "15320", + "name": "instCourseId" + }, + { + "name": "year", + "value": "2014" + }, + { + "value": "Autumn", + "name": "termName" + }, + { + "value": "GERMAN", + "name": "curriculumAbbreviation" + }, + { + "value": "275", + "name": "courseNumber" + }, + { + "value": "A", + "name": "sectionId" + }, + { + "value": "Crime Scenes: Investigating The Cinema And Its Cultures", + "name": "courseTitle" + } + ], + "meta": [ + { + "name": "type", + "value": "section" + }, + { + "name": "id", + "value": "11" + } + ] + }, + { + "data": [ + { + "value": "15328", + "name": "instCourseId" + }, + { + "name": "year", + "value": "2014" + }, + { + "name": "termName", + "value": "Autumn" + }, + { + "value": "GERMAN", + "name": "curriculumAbbreviation" + }, + { + "value": "275", + "name": "courseNumber" + }, + { + "name": "sectionId", + "value": "B" + }, + { + "name": "courseTitle", + "value": "Crime Scenes: Investigating The Cinema And Its Cultures" + } + ], + "meta": [ + { + "value": "section", + "name": "type" + }, + { + "name": "id", + "value": "12" + } + ] + }, + { + "meta": [ + { + "value": "section", + "name": "type" + }, + { + "value": "13", + "name": "id" + } + ], + "data": [ + { + "name": "instCourseId", + "value": "20327" + }, + { + "name": "year", + "value": "2014" + }, + { + "value": "Autumn", + "name": "termName" + }, + { + "name": "curriculumAbbreviation", + "value": "SCAND" + }, + { + "value": "275", + "name": "courseNumber" + }, + { + "value": "A", + "name": "sectionId" + }, + { + "name": "courseTitle", + "value": "Crime Scenes: Investigating The Cinema And Its Cultures" + } + ] + }, + { + "data": [ + { + "name": "instInstructorId", + "value": "123456789" + }, + { + "name": "firstName", + "value": "Bill" + }, + { + "value": "Teacher", + "name": "lastName" + } + ], + "meta": [ + { + "value": "instructor", + "name": "type" + }, + { + "name": "id", + "value": "14" + } + ] + }, + { + "data": [ + { + "name": "instInstructorId", + "value": "123456789" + }, + { + "name": "firstName", + "value": "Bill" + }, + { + "value": "Teacher", + "name": "lastName" + } + ], + "meta": [ + { + "value": "instructor", + "name": "type" + }, + { + "name": "id", + "value": "15" + } + ] + } + ], + "links": [ + { + "rel": "home", + "href": "https://uw.iasysdev.org/api/v1", + "prompt": "IASystem v1 Web API" + }, + { + "rel": "self", + "href": "https://uw.iasysdev.org/api/v1/evaluation?student_id=1230430&term_name=Autumn&year=2014", + "prompt": "IASystem Evaluation Listing" + } + ], + "href": "https://uw.iasysdev.org/api/v1/evaluation", + "version": "1.0" + } +} \ No newline at end of file diff --git a/uw_iasystem/tests/test_evaluation.py b/uw_iasystem/tests/test_evaluation.py index 9c10b1e..a66e94e 100644 --- a/uw_iasystem/tests/test_evaluation.py +++ b/uw_iasystem/tests/test_evaluation.py @@ -35,6 +35,25 @@ def test_search_eval(self): self.assertEqual(evals[1].eval_status, "Closed") self.assertIsNone(evals[1].is_completed) + def test_search_report(self): + evals = search_evaluations("seattle", + year=2014, + term_name='Autumn', + instructor_id='123456789') + self.assertEqual(evals[0].section_sln, 15314) + self.assertIsNotNone(evals[0].instructor_ids) + self.assertEqual(len(evals[0].instructor_ids), 1) + self.assertEqual(evals[0].instructor_ids[0], 123456789) + self.assertEqual(evals[0].report_available_date, + datetime.datetime(2051, 3, 1, + 7, 59, 59, + tzinfo=pytz.utc)) + self.assertEqual(evals[0].eval_status, "Open") + self.assertEqual(evals[0].report_url, + "https://uw.iasysdev.org/report/132068") + self.assertIsNone(evals[0].is_completed) + self.assertEqual(evals[1].eval_status, "Closed") + def test_all_campuses(self): evals = search_evaluations("seattle", year=2014, term_name='Autumn', student_id=1033334)