From 92f320c69c7fa68aff2ed2d94bd49519a3253899 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Thu, 20 Apr 2017 17:32:04 -0700 Subject: [PATCH 1/7] support enrollment search by regid --- uw_sws/enrollment.py | 23 + ...nscriptable_course_all_changed_since_date_ | 1291 +++++++++++++++++ uw_sws/tests/test_enrollment.py | 16 +- 3 files changed, 1329 insertions(+), 1 deletion(-) create mode 100644 uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ diff --git a/uw_sws/enrollment.py b/uw_sws/enrollment.py index 14c2ecb..4402ec8 100644 --- a/uw_sws/enrollment.py +++ b/uw_sws/enrollment.py @@ -13,6 +13,9 @@ logger = logging.getLogger(__name__) enrollment_res_url_prefix = "/student/v5/enrollment" +enrollment_search_url_prefix = "/student/v5/enrollment.json?reg_id=" +enrollment_search_url_default_suffix =\ + "&verbose=true&transcriptable_course=all&changed_since_date=" def get_grades_by_regid_and_term(regid, term): @@ -46,6 +49,26 @@ def _json_to_grades(data, regid, term): return grades +def enrollment_search_by_regid(regid): + url = "%s%s%s" % (enrollment_search_url_prefix, + regid, + enrollment_search_url_default_suffix) + return _json_to_term_enrollment_dict(get_resource(url)) + + +def _json_to_term_enrollment_dict(json_data): + term_enrollment_dict = {} + if not json_data.get("Enrollments"): + return term_enrollment_dict + for term_enro in json_data["Enrollments"]: + if "Term" in term_enro: + term = Term(year=term_enro["Term"]["Year"], + quarter=term_enro["Term"]["Quarter"]) + enrollment = _json_to_enrollment(term_enro, term) + term_enrollment_dict[term] = enrollment + return term_enrollment_dict + + def get_enrollment_by_regid_and_term(regid, term): url = "%s/%s,%s,%s.json" % (enrollment_res_url_prefix, term.year, diff --git a/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ b/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ new file mode 100644 index 0000000..7f19a8e --- /dev/null +++ b/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ @@ -0,0 +1,1291 @@ +{ + "Current": + { + "Href": "/student/v5/enrollment.json?reg_id=9136CCB8F66711D5BE060004AC494FFE&verbose=true&changed_since_date=&transcriptable_course=all", + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Verbose": true + }, + "Enrollments": [ + { + "ClassLevel": "FRESHMAN", + "CurrentRegisteredCredits": null, + "EnrollmentStatus": "Registered", + "EnrollmentStatusDate": "", + "FullName": "John Joseph Average", + "HonorsProgram": false, + "LeaveEndQuarter": 0, + "LeaveEndYear": 0, + "Majors": [ + { + "Abbreviation": "PREMAJ", + "Campus": "Seattle", + "CollegeAbbreviation": "A & S", + "CollegeFullName": "COLLEGE OF ARTS & SCIENCES", + "DegreeLevel": 0, + "DegreeName": null, + "DegreeType": 0, + "FullName": "Pre Major (Arts & Sciences)", + "MajorName": "PRE MAJOR (A&S)", + "Pathway": 0, + "ShortName": "PRE MJR(A&S)" + } + ], + "Metadata": "EnrollmentSourceLocation=SDB;", + "Minors": [], + "PendingClassChange": false, + "PendingHonorsChange": false, + "PendingMajorChange": false, + "PendingResidentChange": false, + "PendingSpecialProgramChange": false, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "QtrGradePoints": 36.00, + "QtrGradedAttmp": 14.0, + "QtrNonGrdEarned": 2.0, + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Registrations": [ + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "4.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1996,autumn,CSE,142,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:58:36 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "142", + "CurriculumAbbreviation": "CSE", + "Href": "/student/v5/course/1996,autumn,CSE,142/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1996 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "5.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "0.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1996,autumn,MATH,126,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:59:03 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "126", + "CurriculumAbbreviation": "MATH", + "Href": "/student/v5/course/1996,autumn,MATH,126/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1996 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "4.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1996,autumn,PHYS,121,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:59:16 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Href": "/student/v5/course/1996,autumn,PHYS,121/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1996 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "1.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1996,autumn,PHYS,131,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:59:17 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "131", + "CurriculumAbbreviation": "PHYS", + "Href": "/student/v5/course/1996,autumn,PHYS,131/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1996 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + } + ], + "RepositoryTimeStamp": "3/28/2017 2:35:26 PM", + "Term": { + "Href": "/student/v5/term/1996,autumn.json", + "Quarter": "autumn", + "Year": 1996 + } + }, + { + "ClassLevel": "SOPHOMORE", + "CurrentRegisteredCredits": null, + "EnrollmentStatus": "Registered", + "EnrollmentStatusDate": "", + "FullName": "James McMiddle Average", + "HonorsProgram": false, + "LeaveEndQuarter": 0, + "LeaveEndYear": 0, + "Majors": [ + { + "Abbreviation": "PREMAJ", + "Campus": "Seattle", + "CollegeAbbreviation": "A & S", + "CollegeFullName": "COLLEGE OF ARTS & SCIENCES", + "DegreeLevel": 0, + "DegreeName": null, + "DegreeType": 0, + "FullName": "Pre Major (Arts & Sciences)", + "MajorName": "PRE MAJOR (A&S)", + "Pathway": 0, + "ShortName": "PRE MJR(A&S)" + } + ], + "Metadata": "EnrollmentSourceLocation=SDB;", + "Minors": [], + "PendingClassChange": false, + "PendingHonorsChange": false, + "PendingMajorChange": false, + "PendingResidentChange": false, + "PendingSpecialProgramChange": false, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "QtrGradePoints": 44.00, + "QtrGradedAttmp": 11.0, + "QtrNonGrdEarned": 4.0, + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Registrations": [ + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "3.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1997,spring,MATH,307,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:57:16 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "307", + "CurriculumAbbreviation": "MATH", + "Href": "/student/v5/course/1997,spring,MATH,307/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 1997 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "3.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1997,spring,MATH,308,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:57:16 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "308", + "CurriculumAbbreviation": "MATH", + "Href": "/student/v5/course/1997,spring,MATH,308/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 1997 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "4.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1997,spring,PHYS,122,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:57:27 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "122", + "CurriculumAbbreviation": "PHYS", + "Href": "/student/v5/course/1997,spring,PHYS,122/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 1997 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "1.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1997,spring,PHYS,132,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:57:27 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "132", + "CurriculumAbbreviation": "PHYS", + "Href": "/student/v5/course/1997,spring,PHYS,132/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 1997 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "4.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "S", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1997,spring,QMETH,201,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:57:32 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "201", + "CurriculumAbbreviation": "QMETH", + "Href": "/student/v5/course/1997,spring,QMETH,201/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 1997 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + } + ], + "RepositoryTimeStamp": "3/28/2017 2:34:51 PM", + "Term": { + "Href": "/student/v5/term/1997,spring.json", + "Quarter": "spring", + "Year": 1997 + } + }, + { + "ClassLevel": "JUNIOR", + "CurrentRegisteredCredits": null, + "EnrollmentStatus": "Registered", + "EnrollmentStatusDate": "", + "FullName": "James McMiddle Average", + "HonorsProgram": false, + "LeaveEndQuarter": 0, + "LeaveEndYear": 0, + "Majors": [ + { + "Abbreviation": "B A", + "Campus": "Seattle", + "CollegeAbbreviation": "B A", + "CollegeFullName": "FOSTER SCHOOL OF BUSINESS", + "DegreeLevel": 1, + "DegreeName": "BACHELOR OF ARTS IN BUSINESS ADMINISTRATION", + "DegreeType": 2, + "FullName": "Business Administration", + "MajorName": "BUSINESS ADMINISTRATION", + "Pathway": 0, + "ShortName": "BUSINESS ADM" + } + ], + "Metadata": "EnrollmentSourceLocation=SDB;", + "Minors": [], + "PendingClassChange": false, + "PendingHonorsChange": false, + "PendingMajorChange": false, + "PendingResidentChange": false, + "PendingSpecialProgramChange": false, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "QtrGradePoints": 46.60, + "QtrGradedAttmp": 12.0, + "QtrNonGrdEarned": 0.0, + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Registrations": [ + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "3.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "3.7", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1998,autumn,CSE,322,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": true, + "RepositoryTimeStamp": "3/28/2017 1:55:11 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "322", + "CurriculumAbbreviation": "CSE", + "Href": "/student/v5/course/1998,autumn,CSE,322/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1998 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "4.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1998,autumn,CSE,451,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:55:12 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "451", + "CurriculumAbbreviation": "CSE", + "Href": "/student/v5/course/1998,autumn,CSE,451/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1998 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "5.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "3.9", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1998,autumn,LING,100,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:55:35 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "100", + "CurriculumAbbreviation": "LING", + "Href": "/student/v5/course/1998,autumn,LING,100/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1998 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "2.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "4.0", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/1998,autumn,MUSIC,116,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": true, + "RepositoryTimeStamp": "3/28/2017 1:55:43 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "116", + "CurriculumAbbreviation": "MUSIC", + "Href": "/student/v5/course/1998,autumn,MUSIC,116/.json", + "Quarter": "autumn", + "SectionID": "", + "Year": 1998 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + } + ], + "RepositoryTimeStamp": "3/28/2017 2:34:21 PM", + "Term": { + "Href": "/student/v5/term/1998,autumn.json", + "Quarter": "autumn", + "Year": 1998 + } + }, + { + "ClassLevel": "SENIOR", + "CurrentRegisteredCredits": null, + "EnrollmentStatus": "Registered", + "EnrollmentStatusDate": "2000-03-15", + "FullName": "James McMiddle Average", + "HonorsProgram": false, + "LeaveEndQuarter": 0, + "LeaveEndYear": 0, + "Majors": [ + { + "Abbreviation": "C SCI", + "Campus": "Seattle", + "CollegeAbbreviation": "A & S", + "CollegeFullName": "COLLEGE OF ARTS & SCIENCES", + "DegreeLevel": 1, + "DegreeName": "BACHELOR OF SCIENCE (COMPUTER SCIENCE)", + "DegreeType": 5, + "FullName": "Computer Science", + "MajorName": "COMPUTER SCIENCE", + "Pathway": 0, + "ShortName": "COMPUTER SCI" + } + ], + "Metadata": "EnrollmentSourceLocation=SDB;", + "Minors": [ + { + "Abbreviation": "MATH", + "CampusName": "Seattle", + "FullName": "Mathematics", + "Name": "MATHEMATICS", + "Pathway": 0, + "ShortName": "MATH" + } + ], + "PendingClassChange": false, + "PendingHonorsChange": false, + "PendingMajorChange": false, + "PendingResidentChange": false, + "PendingSpecialProgramChange": false, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "QtrGradePoints": 11.40, + "QtrGradedAttmp": 3.0, + "QtrNonGrdEarned": 5.0, + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Registrations": [ + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "3.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "3.8", + "GradeDate": "", + "GradeDocumentID": "4190099999", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/2000,spring,CSE,498,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:51:39 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "498", + "CurriculumAbbreviation": "CSE", + "Href": "/student/v5/course/2000,spring,CSE,498/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 2000 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "3.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "W", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/2000,spring,MATH,301,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:52:03 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "301", + "CurriculumAbbreviation": "MATH", + "Href": "/student/v5/course/2000,spring,MATH,301/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 2000 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + }, + { + "AccessDateRangeEnd": "", + "AccessDateRangeStart": "", + "Auditor": false, + "Credits": "5.0", + "DuplicateCode": "0", + "EducationUnitType": null, + "EndDate": "", + "FeeBaseType": "", + "Grade": "S", + "GradeDate": "", + "GradeDocumentID": "", + "GradingSystem": null, + "HonorsCourse": false, + "Href": "/student/v5/registration/2000,spring,STAT,311,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Instructor": null, + "IsActive": true, + "IsCredit": true, + "IsIndependentStart": false, + "Metadata": "RegistrationSourceLocation=SDB;", + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RepositoryTimeStamp": "3/28/2017 1:52:26 PM", + "RequestDate": "", + "RequestStatus": "", + "Section": { + "CourseNumber": "311", + "CurriculumAbbreviation": "STAT", + "Href": "/student/v5/course/2000,spring,STAT,311/.json", + "Quarter": "spring", + "SectionID": "", + "Year": 2000 + }, + "StartDate": "", + "VariableCredit": false, + "WritingCourse": false + } + ], + "RepositoryTimeStamp": "3/28/2017 2:33:14 PM", + "Term": { + "Href": "/student/v5/term/2000,spring.json", + "Quarter": "spring", + "Year": 2000 + } + }, + { + "ClassLevel": "SENIOR", + "CurrentRegisteredCredits": null, + "EnrollmentStatus": "Registered", + "EnrollmentStatusDate": "2013-06-08", + "FullName": "James McMiddle Average", + "HonorsProgram": false, + "LeaveEndQuarter": 0, + "LeaveEndYear": 0, + "Majors": [ + {"Abbreviation": "ACMS", + "Campus": "Seattle", + "DegreeLevel": 1, + "DegreeName": "BACHELOR OF SCIENCE (APPLIED & COMPUTATIONAL MATH SCIENCES)", + "DegreeType": 5, + "FullName": "App & Comp Math Sci (Social & Behav Sci)", + "MajorName": "ACMS (SOC & BEH SCI)", + "Pathway": 80, + "ShortName": "ACMS (SBS)" + } + ], + "Metadata": "EnrollmentSourceLocation=SDB;", + "Minors": [ + {"Abbreviation":"ASL", + "CampusName":"Seattle", + "FullName":"American Sign Language", + "Name":"AMERICAN SIGN LANGUAGE", + "Pathway":0, + "ShortName":"ASL"} + ], + "PendingClassChange": false, + "PendingHonorsChange": false, + "PendingMajorChange": false, + "PendingResidentChange": false, + "PendingSpecialProgramChange": false, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "James McMiddle Average", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "QtrGradePoints": 30, + "QtrGradedAttmp": 10, + "QtrNonGrdEarned": 2, + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Registrations": [ + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 2.0", + "DropAccessCode": "", + "DuplicateCode": "1", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "CR", + "GradeDate": "", + "GradeDocumentID": "061102100", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,spring,TRAIN,101/A.json", + "CourseNumber": "101", + "CurriculumAbbreviation": "TRAIN", + "Quarter": "spring", + "SectionID": "A", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": false + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 5.0", + "DropAccessCode": "", + "DuplicateCode": "1", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "2.9", + "GradeDate": "", + "GradeDocumentID": "061702503", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,spring,TRAIN,100/A.json", + "CourseNumber": "100", + "CurriculumAbbreviation": "TRAIN", + "Quarter": "spring", + "SectionID": "A", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": false + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 3.0", + "DropAccessCode": "", + "DuplicateCode": "1", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "3.1", + "GradeDate": "", + "GradeDocumentID": "061702510", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,spring,PHYS,121/A.json", + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Quarter": "spring", + "SectionID": "A", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": true + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 1.0", + "DropAccessCode": "", + "DuplicateCode": "1", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "3.1", + "GradeDate": "", + "GradeDocumentID": "061702510", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,spring,PHYS,121/AC.json", + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Quarter": "spring", + "SectionID": "AC", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": true + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 1.0", + "DropAccessCode": "", + "DuplicateCode": "1", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "3.1", + "GradeDate": "", + "GradeDocumentID": "061702510", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,spring,PHYS,121/AQ.json", + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Quarter": "spring", + "SectionID": "AQ", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": true + } + ], + "RepositoryTimeStamp": "3/28/2017 2:21:36 PM", + "Term": { + "Href": "/student/v5/term/2013,spring.json", + "Quarter": "spring", + "Year": 2013 + } + }, + { + "ClassLevel": "SENIOR", + "FullName": "AVERAGE,JAMES", + "HonorsProgram": false, + "LeaveEndQuarter": 0, + "LeaveEndYear": 0, + "Majors": [ + { + "Abbreviation": "ACMS", + "Campus": "Seattle", + "DegreeLevel": 1, + "DegreeName": "BACHELOR OF SCIENCE (APPLIED & COMPUTATIONAL MATH SCIENCES)", + "DegreeType": 5, + "FullName": "App & Comp Math Sci (Social & Behav Sci)", + "MajorName": "ACMS (SOC & BEH SCI)", + "Pathway": 80, + "ShortName": "ACMS (SBS)" + } + ], + "PendingClassChange": false, + "PendingHonorsChange": false, + "PendingMajorChange": false, + "PendingResidentChange": false, + "PendingSpecialProgramChange": false, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "QtrGradePoints": 30, + "QtrGradedAttmp": 10, + "QtrNonGrdEarned": 2, + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "Registrations": [ + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 2.0", + "DropAccessCode": "", + "DuplicateCode": "0", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "CR", + "GradeDate": "", + "GradeDocumentID": "061102100", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,summer,TRAIN,101/A.json", + "CourseNumber": "101", + "CurriculumAbbreviation": "TRAIN", + "Quarter": "summer", + "SectionID": "A", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": false + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 5.0", + "DropAccessCode": "", + "DuplicateCode": "0", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "2.9", + "GradeDate": "", + "GradeDocumentID": "061702503", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,summer,TRAIN,100/A.json", + "CourseNumber": "100", + "CurriculumAbbreviation": "TRAIN", + "Quarter": "summer", + "SectionID": "A", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": false + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 3.0", + "DropAccessCode": "", + "DuplicateCode": "0", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "3.1", + "GradeDate": "", + "GradeDocumentID": "061702510", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,summer,PHYS,121/A.json", + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Quarter": "summer", + "SectionID": "A", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": true + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 1.0", + "DropAccessCode": "", + "DuplicateCode": "0", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "3.1", + "GradeDate": "", + "GradeDocumentID": "061702510", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,summer,PHYS,121/AC.json", + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Quarter": "summer", + "SectionID": "AC", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": true + }, + { + "AddAccessCode": "", + "Auditor": false, + "Credits": " 1.0", + "DropAccessCode": "", + "DuplicateCode": "0", + "FacultySequenceNumber": "", + "FeeBaseType": "", + "Grade": "3.1", + "GradeDate": "", + "GradeDocumentID": "061702510", + "HonorsCourse": false, + "IsActive": true, + "Person": { + "Href": "/student/v5/person/9136CCB8F66711D5BE060004AC494FFE.json", + "Name": "AVERAGE,JAMES", + "RegID": "9136CCB8F66711D5BE060004AC494FFE" + }, + "RepeatCourse": false, + "RequestDate": "", + "RequestStatus": "", + "Section": { + "Href": "/student/v5/course/2013,summer,PHYS,121/AQ.json", + "CourseNumber": "121", + "CurriculumAbbreviation": "PHYS", + "Quarter": "summer", + "SectionID": "AQ", + "Year": "2013" + }, + "VariableCredit": false, + "WritingCourse": true + } + ], + "RepositoryTimeStamp": "3/28/2017 2:35:26 PM", + "Term": { + "Href": "/student/v5/term/2013,summer.json", + "Quarter": "summer", + "Year": "2013" + } + } + ], + "Next": null, + "PageSize": "10", + "PageStart": "1", + "Previous": null, + "TotalCount": 6 +} diff --git a/uw_sws/tests/test_enrollment.py b/uw_sws/tests/test_enrollment.py index a674ed5..dad8b66 100644 --- a/uw_sws/tests/test_enrollment.py +++ b/uw_sws/tests/test_enrollment.py @@ -3,7 +3,7 @@ from uw_pws.util import fdao_pws_override from uw_sws.term import get_current_term, get_term_by_year_and_quarter from uw_sws.enrollment import get_grades_by_regid_and_term,\ - get_enrollment_by_regid_and_term + get_enrollment_by_regid_and_term, enrollment_search_by_regid from restclients_core.exceptions import DataFailureException @@ -88,3 +88,17 @@ def test_offterm_enrolled_courses(self): 'section_label': u'2013,winter,PSYCH,203/A', 'url': u'/student/v5/course/2013,winter,PSYCH,203/A.json', 'year': 2013}) + + def test_enrollment_search(self): + result_dict = enrollment_search_by_regid('9136CCB8F66711D5BE060004AC494FFE') + self.assertEqual(len(result_dict), 6) + term = get_current_term() + self.assertTrue(term in result_dict.keys()) + self.assertIsNotNone(result_dict[term]) + enrollement = result_dict.get(term) + self.assertEquals(enrollement.class_level, "SENIOR") + self.assertEquals(len(enrollement.majors), 1) + self.assertEquals(len(enrollement.minors), 1) + self.assertFalse(enrollement.is_non_matric()) + self.assertFalse(enrollement.has_independent_start_course()) + self.assertFalse(enrollement.is_enroll_src_pce) From 2b0ebe5975e8643c68ffc4c469e1c2345c9cbefe Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Thu, 20 Apr 2017 17:36:46 -0700 Subject: [PATCH 2/7] missed including models.py --- uw_sws/models.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/uw_sws/models.py b/uw_sws/models.py index d0822db..5b30af9 100644 --- a/uw_sws/models.py +++ b/uw_sws/models.py @@ -230,7 +230,14 @@ class Term(models.Model): registration_period3_end = models.DateTimeField(blank=True) def __eq__(self, other): - return self.year == other.year and self.quarter == other.quarter + return (type(self) == type(other) and + self.__key() == other.__key()) + + def __hash__(self): + return (hash(self.year) ^ hash(self.quarter) ^ hash(self.__key())) + + def __key(self): + return (self.year, self.quarter) def is_grading_period_open(self): if self.quarter == self.SUMMER: From d5ca182270ce6b8afbfaabeafb673af9e7d6294e Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 21 Apr 2017 07:48:59 -0700 Subject: [PATCH 3/7] Term __key: integer year caused inconsistent hash value --- uw_sws/enrollment.py | 32 +++++++++++++------ uw_sws/models.py | 7 ++-- ...nscriptable_course_all_changed_since_date_ | 24 +++++++------- uw_sws/tests/test_enrollment.py | 29 +++++++++++++---- uw_sws/tests/test_term.py | 14 ++++++++ 5 files changed, 74 insertions(+), 32 deletions(-) diff --git a/uw_sws/enrollment.py b/uw_sws/enrollment.py index 4402ec8..20e12cc 100644 --- a/uw_sws/enrollment.py +++ b/uw_sws/enrollment.py @@ -4,18 +4,17 @@ import logging import re from uw_pws import PWS -from uw_sws.models import (Term, StudentGrades, StudentCourseGrade, Enrollment, - Major, Minor, SectionReference, +from uw_sws.models import (StudentGrades, StudentCourseGrade, Enrollment, + Major, Minor, SectionReference, Term, IndependentStartSectionReference) from uw_sws import get_resource, parse_sws_date from uw_sws.section import get_section_by_url +from uw_sws.term import get_term_by_year_and_quarter logger = logging.getLogger(__name__) enrollment_res_url_prefix = "/student/v5/enrollment" enrollment_search_url_prefix = "/student/v5/enrollment.json?reg_id=" -enrollment_search_url_default_suffix =\ - "&verbose=true&transcriptable_course=all&changed_since_date=" def get_grades_by_regid_and_term(regid, term): @@ -49,10 +48,21 @@ def _json_to_grades(data, regid, term): return grades -def enrollment_search_by_regid(regid): - url = "%s%s%s" % (enrollment_search_url_prefix, - regid, - enrollment_search_url_default_suffix) +def enrollment_search_by_regid(regid, + verbose='true', + transcriptable_course='all', + changed_since_date=''): + """ + See SWS Enrollment search resource spec at: + https://wiki.cac.washington.edu/x/_qjeAw + :return: a dictionary {"year,quarter": Enrollment object} + """ + url = "%s%s&verbose=%s&transcriptable_course=%s&changed_since_date=%s" %\ + (enrollment_search_url_prefix, + regid, + verbose, + transcriptable_course, + changed_since_date) return _json_to_term_enrollment_dict(get_resource(url)) @@ -61,9 +71,11 @@ def _json_to_term_enrollment_dict(json_data): if not json_data.get("Enrollments"): return term_enrollment_dict for term_enro in json_data["Enrollments"]: - if "Term" in term_enro: + if "Term" in term_enro and\ + "Year" in term_enro["Term"] and\ + "Quarter" in term_enro["Term"]: term = Term(year=term_enro["Term"]["Year"], - quarter=term_enro["Term"]["Quarter"]) + quarter=term_enro["Term"]["Quarter"].lower()) enrollment = _json_to_enrollment(term_enro, term) term_enrollment_dict[term] = enrollment return term_enrollment_dict diff --git a/uw_sws/models.py b/uw_sws/models.py index 5b30af9..489cf0b 100644 --- a/uw_sws/models.py +++ b/uw_sws/models.py @@ -230,14 +230,15 @@ class Term(models.Model): registration_period3_end = models.DateTimeField(blank=True) def __eq__(self, other): - return (type(self) == type(other) and + return (other is not None and + type(self) == type(other) and self.__key() == other.__key()) def __hash__(self): - return (hash(self.year) ^ hash(self.quarter) ^ hash(self.__key())) + return hash(self.__key()) def __key(self): - return (self.year, self.quarter) + return (str(self.year), self.quarter) def is_grading_period_open(self): if self.quarter == self.SUMMER: diff --git a/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ b/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ index 7f19a8e..e571a68 100644 --- a/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ +++ b/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_9136CCB8F66711D5BE060004AC494FFE_verbose_true_transcriptable_course_all_changed_since_date_ @@ -690,7 +690,7 @@ "ClassLevel": "SENIOR", "CurrentRegisteredCredits": null, "EnrollmentStatus": "Registered", - "EnrollmentStatusDate": "2000-03-15", + "EnrollmentStatusDate": "2012-03-15", "FullName": "James McMiddle Average", "HonorsProgram": false, "LeaveEndQuarter": 0, @@ -750,7 +750,7 @@ "GradeDocumentID": "4190099999", "GradingSystem": null, "HonorsCourse": false, - "Href": "/student/v5/registration/2000,spring,CSE,498,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Href": "/student/v5/registration/2012,spring,CSE,498,,9136CCB8F66711D5BE060004AC494FFE,0.json", "Instructor": null, "IsActive": true, "IsCredit": true, @@ -768,10 +768,10 @@ "Section": { "CourseNumber": "498", "CurriculumAbbreviation": "CSE", - "Href": "/student/v5/course/2000,spring,CSE,498/.json", + "Href": "/student/v5/course/2012,spring,CSE,498/.json", "Quarter": "spring", "SectionID": "", - "Year": 2000 + "Year": 2012 }, "StartDate": "", "VariableCredit": false, @@ -791,7 +791,7 @@ "GradeDocumentID": "", "GradingSystem": null, "HonorsCourse": false, - "Href": "/student/v5/registration/2000,spring,MATH,301,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Href": "/student/v5/registration/2012,spring,MATH,301,,9136CCB8F66711D5BE060004AC494FFE,0.json", "Instructor": null, "IsActive": true, "IsCredit": true, @@ -809,10 +809,10 @@ "Section": { "CourseNumber": "301", "CurriculumAbbreviation": "MATH", - "Href": "/student/v5/course/2000,spring,MATH,301/.json", + "Href": "/student/v5/course/2012,spring,MATH,301/.json", "Quarter": "spring", "SectionID": "", - "Year": 2000 + "Year": 2012 }, "StartDate": "", "VariableCredit": false, @@ -832,7 +832,7 @@ "GradeDocumentID": "", "GradingSystem": null, "HonorsCourse": false, - "Href": "/student/v5/registration/2000,spring,STAT,311,,9136CCB8F66711D5BE060004AC494FFE,0.json", + "Href": "/student/v5/registration/2012,spring,STAT,311,,9136CCB8F66711D5BE060004AC494FFE,0.json", "Instructor": null, "IsActive": true, "IsCredit": true, @@ -850,10 +850,10 @@ "Section": { "CourseNumber": "311", "CurriculumAbbreviation": "STAT", - "Href": "/student/v5/course/2000,spring,STAT,311/.json", + "Href": "/student/v5/course/2012,spring,STAT,311/.json", "Quarter": "spring", "SectionID": "", - "Year": 2000 + "Year": 2012 }, "StartDate": "", "VariableCredit": false, @@ -862,9 +862,9 @@ ], "RepositoryTimeStamp": "3/28/2017 2:33:14 PM", "Term": { - "Href": "/student/v5/term/2000,spring.json", + "Href": "/student/v5/term/2012,spring.json", "Quarter": "spring", - "Year": 2000 + "Year": 2012 } }, { diff --git a/uw_sws/tests/test_enrollment.py b/uw_sws/tests/test_enrollment.py index dad8b66..975a3fb 100644 --- a/uw_sws/tests/test_enrollment.py +++ b/uw_sws/tests/test_enrollment.py @@ -1,7 +1,9 @@ from unittest import TestCase from uw_sws.util import fdao_sws_override from uw_pws.util import fdao_pws_override -from uw_sws.term import get_current_term, get_term_by_year_and_quarter +from uw_sws.models import Term +from uw_sws.term import get_current_term, get_next_term,\ + get_term_by_year_and_quarter, get_term_after from uw_sws.enrollment import get_grades_by_regid_and_term,\ get_enrollment_by_regid_and_term, enrollment_search_by_regid from restclients_core.exceptions import DataFailureException @@ -90,15 +92,28 @@ def test_offterm_enrolled_courses(self): 'year': 2013}) def test_enrollment_search(self): - result_dict = enrollment_search_by_regid('9136CCB8F66711D5BE060004AC494FFE') + result_dict = enrollment_search_by_regid( + '9136CCB8F66711D5BE060004AC494FFE') self.assertEqual(len(result_dict), 6) term = get_current_term() - self.assertTrue(term in result_dict.keys()) - self.assertIsNotNone(result_dict[term]) + self.assertTrue(term in result_dict) + self.assertIsNotNone(result_dict.get(term)) enrollement = result_dict.get(term) self.assertEquals(enrollement.class_level, "SENIOR") self.assertEquals(len(enrollement.majors), 1) self.assertEquals(len(enrollement.minors), 1) - self.assertFalse(enrollement.is_non_matric()) - self.assertFalse(enrollement.has_independent_start_course()) - self.assertFalse(enrollement.is_enroll_src_pce) + + term2 = get_term_by_year_and_quarter(2013, 'autumn') + self.assertIsNone(result_dict.get(term2)) + + term3 = get_term_by_year_and_quarter(2012, 'spring') + self.assertTrue(term3 in result_dict) + self.assertIsNotNone(result_dict.get(term3)) + + term1 = get_term_by_year_and_quarter(2013, 'summer') + self.assertTrue(term1 in result_dict) + self.assertIsNotNone(result_dict.get(term1)) + + term4 = Term(year=1996, quarter='autumn') + self.assertTrue(term4 in result_dict) + self.assertIsNotNone(result_dict.get(term4)) diff --git a/uw_sws/tests/test_term.py b/uw_sws/tests/test_term.py index 2207d36..75cd5f0 100644 --- a/uw_sws/tests/test_term.py +++ b/uw_sws/tests/test_term.py @@ -3,6 +3,7 @@ from uw_pws.util import fdao_pws_override from datetime import datetime, timedelta from restclients_core.exceptions import DataFailureException +from uw_sws.models import Term from uw_sws.term import get_term_by_year_and_quarter,\ get_term_before, get_term_after, get_current_term, get_next_term,\ get_previous_term, get_term_by_date, get_specific_term,\ @@ -503,3 +504,16 @@ def test_by_date(self): self.assertEquals(term.year, 2013) self.assertEquals(term.quarter, 'autumn') + def test_key(self): + term = Term() + term.year = 2013 + term.quarter = 'spring' + self.assertEqual(type(term), Term) + + term1 = get_current_term() + self.assertEqual(term, term1) + self.assertEqual(hash(term), hash(term1)) + + term2 = Term(year=2013, quarter='autumn') + self.assertFalse(term == term2) + self.assertFalse(hash(term) == hash(term2)) From f6dc6772f74824e39e5daa56be1be84493e30a25 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 21 Apr 2017 07:51:32 -0700 Subject: [PATCH 4/7] revised wording in python docs --- uw_sws/enrollment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uw_sws/enrollment.py b/uw_sws/enrollment.py index 20e12cc..6873f71 100644 --- a/uw_sws/enrollment.py +++ b/uw_sws/enrollment.py @@ -55,7 +55,7 @@ def enrollment_search_by_regid(regid, """ See SWS Enrollment search resource spec at: https://wiki.cac.washington.edu/x/_qjeAw - :return: a dictionary {"year,quarter": Enrollment object} + :return: a dictionary of {Term: Enrollment} """ url = "%s%s&verbose=%s&transcriptable_course=%s&changed_since_date=%s" %\ (enrollment_search_url_prefix, From 16d8fdaf5d0589ba83099e1308d442259c8450a0 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 21 Apr 2017 07:53:46 -0700 Subject: [PATCH 5/7] minor refactor --- uw_sws/enrollment.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uw_sws/enrollment.py b/uw_sws/enrollment.py index 6873f71..532c550 100644 --- a/uw_sws/enrollment.py +++ b/uw_sws/enrollment.py @@ -68,7 +68,7 @@ def enrollment_search_by_regid(regid, def _json_to_term_enrollment_dict(json_data): term_enrollment_dict = {} - if not json_data.get("Enrollments"): + if "Enrollments" not in json_data: return term_enrollment_dict for term_enro in json_data["Enrollments"]: if "Term" in term_enro and\ From 5e489866854a8f03fb05ae33fd378898c2d2cc91 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 21 Apr 2017 08:02:13 -0700 Subject: [PATCH 6/7] add a test for no enrollment found case --- ...bose_true_transcriptable_course_all_changed_since_date_ | 7 +++++++ uw_sws/tests/test_enrollment.py | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_00000000000000000000000000000001_verbose_true_transcriptable_course_all_changed_since_date_ diff --git a/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_00000000000000000000000000000001_verbose_true_transcriptable_course_all_changed_since_date_ b/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_00000000000000000000000000000001_verbose_true_transcriptable_course_all_changed_since_date_ new file mode 100644 index 0000000..e51e953 --- /dev/null +++ b/uw_sws/resources/sws/file/student/v5/enrollment.json_reg_id_00000000000000000000000000000001_verbose_true_transcriptable_course_all_changed_since_date_ @@ -0,0 +1,7 @@ +{ +"Current":{ +"Href":"\/student\/v5\/enrollment.json?reg_id=00000000000000000000000000000001&verbose=true&changed_since_date=&transcriptable_course=all", +"RegID":"00000000000000000000000000000001", +"Verbose":true}, +"Enrollments":[],"Next":null,"PageSize":"10","PageStart":"1","Previous":null,"TotalCount":0 +} diff --git a/uw_sws/tests/test_enrollment.py b/uw_sws/tests/test_enrollment.py index 975a3fb..c14b701 100644 --- a/uw_sws/tests/test_enrollment.py +++ b/uw_sws/tests/test_enrollment.py @@ -117,3 +117,7 @@ def test_enrollment_search(self): term4 = Term(year=1996, quarter='autumn') self.assertTrue(term4 in result_dict) self.assertIsNotNone(result_dict.get(term4)) + + result_dict = enrollment_search_by_regid( + '00000000000000000000000000000001') + self.assertEqual(len(result_dict), 0) From 6290a1006ad9b3f9ad4daa6abea3df9daea5911b Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 21 Apr 2017 08:36:27 -0700 Subject: [PATCH 7/7] add a comment --- uw_sws/tests/test_enrollment.py | 1 + 1 file changed, 1 insertion(+) diff --git a/uw_sws/tests/test_enrollment.py b/uw_sws/tests/test_enrollment.py index c14b701..a67132e 100644 --- a/uw_sws/tests/test_enrollment.py +++ b/uw_sws/tests/test_enrollment.py @@ -118,6 +118,7 @@ def test_enrollment_search(self): self.assertTrue(term4 in result_dict) self.assertIsNotNone(result_dict.get(term4)) + # regid of none result_dict = enrollment_search_by_regid( '00000000000000000000000000000001') self.assertEqual(len(result_dict), 0)