def handle(self, *args, **kwargs):
        logger.info("Beginning section import routine")
        
        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']    
        
        seen_ids = set()
        
        with transaction.atomic():
            for row in results:
                fields = row['parsed_fields']
                
                course_number = fields['CourseNumber']
                csn = fields['CourseSectionNumber']
                academic_year = fields["AcademicYear"]
                teacher_id = fields["IDTeacher"]
                course_name = fields["CourseName"]
                
                if not course_number or not csn or not academic_year:
                    continue
                
                try:
                    course = Course.objects.get(number=course_number)
                    logger.info("Found course {number:}".format(number=course_number))
                    forceSave = False
                    
                except Course.DoesNotExist:
                    logger.error("Course {course:} is in sections but not courses".format(course=course_number))
                    continue
                
                try:
                    academic_year = AcademicYear.objects.get(year=academic_year)
                except AcademicYear.DoesNotExist:
                    academic_year = AcademicYear(year=academic_year)
                    academic_year.save()
                
                try:
                    section = Section.objects.get(course=course, academic_year=academic_year, csn=csn)
                    logger.info("Found section {csn:} for {academic_year:}".format(csn=csn, academic_year=academic_year))

                except Section.DoesNotExist:
                    logger.info("Creating section {csn:} for {academic_year:}".format(csn=csn, academic_year=academic_year))
                    section = Section(course=course, academic_year=academic_year, csn=csn)
                    section.save()
                
                teacher = None
                
                if teacher_id:
                    try:
                        teacher = Teacher.objects.get(teacher_id=teacher_id)
                    except Teacher.DoesNotExist:
                        logger.error("Teacher {id:} is in sections but not in teachers".format(id=teacher_id))
                    
                attrMap = {
                    'teacher': teacher,
                    'course_name': course_name,
                }
                
                for attr in attrMap:
                    dbValue = getattr(section, attr)
                    
                    if dbValue != attrMap[attr]:
                        setattr(section, attr, attrMap[attr])
                        logger.info("Updating {attr:} on {course:} from {oldValue:} to {newValue:}".format(attr=attr, course=course_number, oldValue=dbValue, newValue=attrMap[attr]))
                        forceSave = True
                    
                if forceSave:
                    section.save()
            
            #TODO: Delete extra sessions
    def handle(self, *args, **kwargs):
        logger.info("Beginning enrollment import routine")
        
        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']    
        
        with transaction.atomic():
            for row in results:
                fields = row['parsed_fields']
                
                studentID = fields['IDStudent']
                academicYear = fields['AcademicYear']
                boarderDay = fields['BoarderDay']
                dormName = fields['DormName'] or ""
                grade_code = fields['Grade']
                division = fields['Division'] or ""
                section = fields["Section Letter"] or ""
                advisorID = fields["IDAdvisor"]
                statusEnrollment = fields["StatusEnrollment"] or ""
                statusAttending = fields["StatusAttending"] or ""
                enrolledDate = fields["EnrollmentDate"]
                
                if not studentID or not academicYear:
                    continue
                
                try:
                    academicYear = AcademicYear.objects.get(year=academicYear)
                except AcademicYear.DoesNotExist:
                    academicYear = AcademicYear(year=academicYear)
                    academicYear.save()
                
                
                try:
                    student = Student.objects.get(student_id=studentID)
                except Student.DoesNotExist:
                    logger.error("Student {studentID:} is in enrollments but not in permrecs".format(studentID=studentID))
                    continue
                
                if boarderDay and boarderDay.upper() == "B":
                    boarder = True
                else:
                    boarder = False
                
                if dormName:
                    try:
                        dorm = Dorm.objects.get(dorm_name=dormName)
                    except Dorm.DoesNotExist:
                        logger.error("Dorm {dorm:} does not exist".format(dorm=dormName))
                        dorm = None
                else:
                    dorm = None
                
                
                if advisorID:
                    try:
                        advisor = Teacher.objects.get(teacher_id = advisorID)
                    except Teacher.DoesNotExist:
                        logger.error("Advisor {advisorID:} does not exist".format(advisorID=advisorID))
                        advisor = None
                else:
                    advisor = None
                
                if grade_code:
                  try:
                    grade = Grade.objects.get(grade=grade_code)
                  except Grade.DoesNotExist:
                    grade = Grade()
                    grade.grade = grade_code
                    grade.description = "Grade {grade:}".format(grade=grade_code)
                    grade.save()
                
                try:
                    enrollment = Enrollment.objects.get(student = student, academic_year = academicYear)
                    logger.info("Found enrollment {studentID:}/{academicYear:}".format(studentID=studentID, academicYear=academicYear))
                    forceSave = False
                    
                except Enrollment.DoesNotExist:
                    logger.info("Creating enrollment {studentID:}/{academicYear:}".format(studentID=studentID, academicYear=academicYear))
                    enrollment = Enrollment()
                    enrollment.student = student
                    enrollment.academic_year = academicYear
                    forceSave = True
                                        
                attrMap = {
                    'boarder': boarder,
                    'dorm': dorm,
                    'grade': grade,
                    'division': division,
                    'section': section,
                    'advisor': advisor,
                    'status_enrollment': statusEnrollment,
                    'status_attending': statusAttending,
                    'enrolled_date': enrolledDate
                }
                
                for attr in attrMap:
                    dbValue = getattr(enrollment, attr)
                    
                    if dbValue != attrMap[attr]:
                        setattr(enrollment, attr, attrMap[attr])
                        logger.info("Updating {attr:} on {studentID:}/{academicYear:} from {oldValue:} to {newValue:}".format(attr=attr, studentID=studentID, academicYear=academicYear, oldValue=dbValue, newValue=attrMap[attr]))
                        forceSave = True
                    
                if forceSave:
                    enrollment.save()
    def handle(self, *args, **kwargs):
        logger.info("Beginning detention import routine")
        
        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']    
        
        seen_ids = set()
        
        with transaction.atomic():
            detention_mailer = DetentionMailer.objects.get()
            skip_processing_before = detention_mailer.skip_processing_before
            
            for row in results:
                fields = row['parsed_fields']
                
                incident_id = fields['IDINCIDENT']
                detention_date = fields['Det Date']
                raw_code = fields['Code'] or ""
                raw_offense = fields['Offense']
                comments = fields['Comments'] or ""
                student_id = fields['IDSTUDENT']
                teacher_id = fields['KSTeachers::IDTEACHER']
                raw_academic_year = fields['AcademicYear']
                raw_term = fields['Term']
                
                if skip_processing_before and detention_date < skip_processing_before:
                    continue
                
                try:
                    code = Code.objects.get(code=raw_code)
                except Code.DoesNotExist:
                    code = Code(code=raw_code)
                    code.save()
                
                if not code.process:
                    continue
                
                try:
                    academic_year = AcademicYear.objects.get(year=raw_academic_year)
                except AcademicYear.DoesNotExist:
                    academic_year = AcademicYear(year=raw_academic_year)
                    academic_year.save()
                
                try:
                    term = Term.objects.get(academic_year=academic_year, term=raw_term)
                except Term.DoesNotExist:
                    term = Term(academic_year=academic_year, term=raw_term)
                    term.save()
                
                if raw_offense:
                    try:
                        offense = Offense.objects.get(offense__iexact=raw_offense)
                    except Offense.DoesNotExist:
                        error_recipients = [o.address for o in DetentionErrorNotification.objects.filter(mailer=detention_mailer)]
                    
                        if not error_recipients:
                            raise ValueError("No error recipients are defined")
                    
                        send_mail("Error importing detention", "Error importing detention {id:}: offense '{offense:}' does not exist".format(
                            id=incident_id, offense=raw_offense), '*****@*****.**', error_recipients)
                    
                        continue
                else:
                    offense = None
                
                if teacher_id:
                    teacher = Teacher.objects.get(teacher_id=teacher_id)
                else:
                    teacher = None
                    
                
                if student_id:
                    student = Student.objects.get(student_id=student_id)
                else:
                    student = None
                
                if not incident_id:
                    logger.error("Blank incident ID")
                    continue
                
                seen_ids.add(incident_id)
                
                try:
                    incident = Detention.objects.get(incident_id=incident_id)
                    logger.info("Found detention {id:}".format(id=incident_id))
                    force_save = False
                    
                except Detention.DoesNotExist:
                    logger.info("Creating detention {id:}".format(id=incident_id))
                    incident = Detention(
                                        incident_id=incident_id,
                                        code=code,
                                        student=student,
                                        teacher=teacher
                                        )
                    force_save = True
                    
                attr_map = {
                    'detention_date': detention_date,
                    'code': code,
                    'offense': offense,
                    'comments': comments,
                    'term': term,
                    'student': student,
                    'teacher': teacher,
                }
                
                for attr in attr_map:
                    db_value = getattr(incident, attr)
                    
                    if db_value != attr_map[attr]:
                        setattr(incident, attr, attr_map[attr])
                        logger.info("Updating {attr:} on {incident_id:} from {old_value:} to {new_value:}".format(
                            attr=attr, incident_id=incident_id, old_value=db_value, new_value=attr_map[attr]))
                        force_save = True
                    
                if force_save:
                    incident.save()
                
            
            extra_detentions = Detention.objects.exclude(incident_id__in=seen_ids)
            if extra_detentions:
                logger.warn("Deleting {} detentions".format(extra_detentions.count()))
                extra_detentions.delete()
    def handle(self, *args, **kwargs):
        logger.info("Beginning enrollment import routine")

        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']

        with transaction.atomic():
            for row in results:
                fields = row['parsed_fields']

                studentID = fields['IDStudent']
                academicYear = fields['AcademicYear']
                boarderDay = fields['BoarderDay']
                dormName = fields['DormName'] or ""
                grade_code = fields['Grade']
                division = fields['Division'] or ""
                section = fields["Section Letter"] or ""
                advisorID = fields["IDAdvisor"]
                statusEnrollment = fields["StatusEnrollment"] or ""
                statusAttending = fields["StatusAttending"] or ""
                enrolledDate = fields["EnrollmentDate"]

                if not studentID or not academicYear:
                    continue

                try:
                    academicYear = AcademicYear.objects.get(year=academicYear)
                except AcademicYear.DoesNotExist:
                    academicYear = AcademicYear(year=academicYear)
                    academicYear.save()

                try:
                    student = Student.objects.get(student_id=studentID)
                except Student.DoesNotExist:
                    logger.error(
                        "Student {studentID:} is in enrollments but not in permrecs"
                        .format(studentID=studentID))
                    continue

                if boarderDay and boarderDay.upper() == "B":
                    boarder = True
                else:
                    boarder = False

                if dormName:
                    try:
                        dorm = Dorm.objects.get(dorm_name=dormName)
                    except Dorm.DoesNotExist:
                        logger.error("Dorm {dorm:} does not exist".format(
                            dorm=dormName))
                        dorm = None
                else:
                    dorm = None

                if advisorID:
                    try:
                        advisor = Teacher.objects.get(teacher_id=advisorID)
                    except Teacher.DoesNotExist:
                        logger.error(
                            "Advisor {advisorID:} does not exist".format(
                                advisorID=advisorID))
                        advisor = None
                else:
                    advisor = None

                if grade_code:
                    try:
                        grade = Grade.objects.get(grade=grade_code)
                    except Grade.DoesNotExist:
                        grade = Grade()
                        grade.grade = grade_code
                        grade.description = "Grade {grade:}".format(
                            grade=grade_code)
                        grade.save()

                try:
                    enrollment = Enrollment.objects.get(
                        student=student, academic_year=academicYear)
                    logger.info(
                        "Found enrollment {studentID:}/{academicYear:}".format(
                            studentID=studentID, academicYear=academicYear))
                    forceSave = False

                except Enrollment.DoesNotExist:
                    logger.info(
                        "Creating enrollment {studentID:}/{academicYear:}".
                        format(studentID=studentID, academicYear=academicYear))
                    enrollment = Enrollment()
                    enrollment.student = student
                    enrollment.academic_year = academicYear
                    forceSave = True

                attrMap = {
                    'boarder': boarder,
                    'dorm': dorm,
                    'grade': grade,
                    'division': division,
                    'section': section,
                    'advisor': advisor,
                    'status_enrollment': statusEnrollment,
                    'status_attending': statusAttending,
                    'enrolled_date': enrolledDate
                }

                for attr in attrMap:
                    dbValue = getattr(enrollment, attr)

                    if dbValue != attrMap[attr]:
                        setattr(enrollment, attr, attrMap[attr])
                        logger.info(
                            "Updating {attr:} on {studentID:}/{academicYear:} from {oldValue:} to {newValue:}"
                            .format(attr=attr,
                                    studentID=studentID,
                                    academicYear=academicYear,
                                    oldValue=dbValue,
                                    newValue=attrMap[attr]))
                        forceSave = True

                if forceSave:
                    enrollment.save()
Example #5
0
    def handle(self, *args, **kwargs):
        logger.info("Beginning section import routine")

        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']

        seen_ids = set()

        with transaction.atomic():
            for row in results:
                fields = row['parsed_fields']

                course_number = fields['CourseNumber']
                csn = fields['CourseSectionNumber']
                academic_year = fields["AcademicYear"]
                teacher_id = fields["IDTeacher"]

                if not course_number or not csn or not academic_year:
                    continue

                try:
                    course = Course.objects.get(number=course_number)
                    logger.info(
                        "Found course {number:}".format(number=course_number))
                    forceSave = False

                except Course.DoesNotExist:
                    logger.error(
                        "Course {course:} is in sections but not courses".
                        format(course=course_number))
                    continue

                try:
                    academic_year = AcademicYear.objects.get(
                        year=academic_year)
                except AcademicYear.DoesNotExist:
                    academic_year = AcademicYear(year=academic_year)
                    academic_year.save()

                try:
                    section = Section.objects.get(course=course,
                                                  academic_year=academic_year,
                                                  csn=csn)
                    logger.info(
                        "Found section {csn:} for {academic_year:}".format(
                            csn=csn, academic_year=academic_year))

                except Section.DoesNotExist:
                    logger.info(
                        "Creating section {csn:} for {academic_year:}".format(
                            csn=csn, academic_year=academic_year))
                    section = Section(course=course,
                                      academic_year=academic_year,
                                      csn=csn)
                    section.save()

                teacher = None

                if teacher_id:
                    try:
                        teacher = Teacher.objects.get(teacher_id=teacher_id)
                    except Teacher.DoesNotExist:
                        logger.error(
                            "Teacher {id:} is in sections but not in teachers".
                            format(id=teacher_id))

                attrMap = {
                    'teacher': teacher,
                }

                for attr in attrMap:
                    dbValue = getattr(section, attr)

                    if dbValue != attrMap[attr]:
                        setattr(section, attr, attrMap[attr])
                        logger.info(
                            "Updating {attr:} on {course:} from {oldValue:} to {newValue:}"
                            .format(attr=attr,
                                    course=course_number,
                                    oldValue=dbValue,
                                    newValue=attrMap[attr]))
                        forceSave = True

                if forceSave:
                    section.save()
    def handle(self, *args, **kwargs):
        logger.info("Beginning student registration import routine")

        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']

        seen_ids = set()

        with transaction.atomic():
            for row in results:
                fields = row['parsed_fields']

                csn = fields['CSN']
                academic_year = fields["AcademicYear"]
                student_id = fields["IDStudent"]
                student_reg_id = fields["IDSTUDENTREG"]

                if not csn or not academic_year or not student_id or not student_reg_id:
                    continue

                try:
                    academic_year = AcademicYear.objects.get(
                        year=academic_year)
                except AcademicYear.DoesNotExist:
                    academic_year = AcademicYear(year=academic_year)
                    academic_year.save()

                try:
                    section = Section.objects.get(csn=csn,
                                                  academic_year=academic_year)
                except Section.DoesNotExist:
                    logger.error(
                        "Section {csn:}/{year:} is in studentreg but not in sections"
                        .format(csn=csn, year=academic_year))
                    continue

                try:
                    student = Student.objects.get(student_id=student_id)
                except Student.DoesNotExist:
                    logger.error(
                        "Student {id:} is in studentreg but not in students".
                        format(id=student_id))
                    continue

                try:
                    student_registration = StudentRegistration.objects.get(
                        student_reg_id=student_reg_id)
                    logger.info("Found student registration {id:}".format(
                        id=student_reg_id))
                    forceSave = False

                except StudentRegistration.DoesNotExist:
                    student_registration = StudentRegistration(
                        student_reg_id=student_reg_id,
                        section=section,
                        student=student)
                    forceSave = True

                attrMap = {'student': student, 'section': section}

                for attr in attrMap:
                    dbValue = getattr(student_registration, attr)

                    if dbValue != attrMap[attr]:
                        setattr(student_registration, attr, attrMap[attr])
                        logger.info(
                            "Updating {attr:} on {student_registration:} from {oldValue:} to {newValue:}"
                            .format(attr=attr,
                                    student_registration=student_registration.
                                    student_reg_id,
                                    oldValue=dbValue,
                                    newValue=attrMap[attr]))
                        forceSave = True

                seen_ids.add(student_reg_id)

                if forceSave:
                    student_registration.save()

            extra_student_registrations = StudentRegistration.objects.exclude(
                student_reg_id__in=seen_ids)
            for extra_student_registration in extra_student_registrations:
                logger.warn("Deleting extra student registration {}".format(
                    extra_student_registration.student_reg_id))
                extra_student_registration.delete()
    def handle(self, *args, **kwargs):
        logger.info("Beginning student registration import routine")
        
        data = fmpxmlparser.parse_from_file(kwargs['filename'])

        results = data['results']    
        
        seen_ids = set()
        
        with transaction.atomic():
            for row in results:
                fields = row['parsed_fields']
                
                csn = fields['CSN']
                academic_year = fields["AcademicYear"]
                student_id = fields["IDStudent"]
                student_reg_id = fields["IDSTUDENTREG"]
                
                if not csn or not academic_year or not student_id or not student_reg_id:
                    continue
                
                try:
                    academic_year = AcademicYear.objects.get(year=academic_year)
                except AcademicYear.DoesNotExist:
                    academic_year = AcademicYear(year=academic_year)
                    academic_year.save()
                
                try:
                    section = Section.objects.get(csn=csn, academic_year=academic_year)
                except Section.DoesNotExist:
                    logger.error("Section {csn:}/{year:} is in studentreg but not in sections".format(csn=csn, year=academic_year))
                    continue
                
                try:
                    student = Student.objects.get(student_id=student_id)
                except Student.DoesNotExist:
                    logger.error("Student {id:} is in studentreg but not in students".format(id=student_id))
                    continue
                
                try:
                    student_registration = StudentRegistration.objects.get(student_reg_id=student_reg_id)
                    logger.info("Found student registration {id:}".format(id=student_reg_id))
                    forceSave = False
                    
                except StudentRegistration.DoesNotExist:
                    student_registration = StudentRegistration(student_reg_id=student_reg_id, section=section, student=student)    
                    forceSave = True
                
                attrMap = {
                    'student': student,
                    'section': section
                }
                
                for attr in attrMap:
                    dbValue = getattr(student_registration, attr)
                    
                    if dbValue != attrMap[attr]:
                        setattr(student_registration, attr, attrMap[attr])
                        logger.info("Updating {attr:} on {student_registration:} from {oldValue:} to {newValue:}".format(attr=attr, student_registration=student_registration.student_reg_id, oldValue=dbValue, newValue=attrMap[attr]))
                        forceSave = True
                
                seen_ids.add(student_reg_id)
                    
                if forceSave:
                    student_registration.save()
            
            extra_student_registrations = StudentRegistration.objects.exclude(student_reg_id__in=seen_ids)
            for extra_student_registration in extra_student_registrations:
                logger.warn("Deleting extra student registration {}".format(extra_student_registration.student_reg_id))
                extra_student_registration.delete()