Example #1
0
def update_student_details(student_details):
   from academics.models import Student
   for batch_name in student_details:
      batch = get_batch(batch_name)
      for record in student_details[batch_name]:
         try:
            student = Student.objects.get(roll_no=record['RollNo'])
            if student.batch != batch:
               raise Exception("Student '%s' doesn't belong to batch '%s'" % (record['RollNo'],batch_name))
         except Student.DoesNotExist:
            student = Student()
            student.roll_no = record['RollNo']
            student.batch = batch
         if 'RegNo' in record: student.reg_no = str(int(record['RegNo']))
         if 'Admission' in record: student.admission = record['Admission']
         if 'Staying' in record: student.staying = record['Staying']
         if 'Gender' in record: student.gender = record['Gender']
         if 'StudentName' in record: student.name = record['StudentName']
         student.save()
    def handle(self, *args, **kwargs):
        logger.info("Beginning student 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']
                
                nameFirst = fields['NameFirst'] or ""
                nameLast = fields['NameLast'] or ""
                nameNickname = fields['NameNickname'] or ""
                email = fields['EMailSchool'] or ""
                studentID = fields['IDSTUDENT']
                password = fields["PasswordActiveDirctory"] or ""
                username = fields["Network_User_Name"] or ""
                gender = fields["Sex"] or ""
                
                if not studentID:
                    continue
                
                seen_ids.add(studentID)
                
                if username:
                    if len(username) > 20:
                        username = username[0:20]
                        logger.warn("Username {username:} was truncated to 20 characters".format(username=username))
                
                if email:
                    validEmail = validate_email(email)
                
                    if not validEmail:
                        email = ""
                        logger.warn("E-mail address {email:} for {id:} ({first:} {last:}) is invalid; address blanked".format(email=email, id=studentID, first=nameFirst, last=nameLast))
                
                try:
                    student = Student.objects.get(student_id=studentID)
                    logger.info("Found student {studentID:}".format(studentID=studentID))
                    forceSave = False
                    
                except Student.DoesNotExist:
                    student = Student(student_id=studentID)
                    logger.info("Creating student {studentID:}".format(studentID=studentID))
                    forceSave = True
                    
                attrMap = {
                    'first_name': nameFirst,
                    'last_name': nameLast,
                    'nickname': nameNickname,
                    'email': email,
                    'rectory_password': password,
                    'username': username,
                    'gender': gender,
                }
                
                for attr in attrMap:
                    dbValue = getattr(student, attr)
                    
                    if dbValue != attrMap[attr]:
                        setattr(student, attr, attrMap[attr])
                        logger.info("Updating {attr:} on {studentID:} from {oldValue:} to {newValue:}".format(attr=attr, studentID=studentID, oldValue=dbValue, newValue=attrMap[attr]))
                        forceSave = True
                    
                if forceSave:
                    student.save()
                
                self.sync_relations(student, fields)
                    
            extra_students = Student.objects.exclude(student_id__in=seen_ids)
            for extra_student in extra_students:
                logger.warn("Deleting extra student {}".format(extra_student.id))
                extra_student.delete()
    def handle(self, *args, **kwargs):
        logger.info("Beginning student 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']

                nameFirst = fields['NameFirst'] or ""
                nameLast = fields['NameLast'] or ""
                nameNickname = fields['NameNickname'] or ""
                email = fields['EMailSchool'] or ""
                studentID = fields['IDSTUDENT']
                password = fields["PasswordActiveDirctory"] or ""
                username = fields["Network_User_Name"] or ""
                gender = fields["Sex"] or ""

                if not studentID:
                    continue

                seen_ids.add(studentID)

                if username:
                    if len(username) > 20:
                        username = username[0:20]
                        logger.warn(
                            "Username {username:} was truncated to 20 characters"
                            .format(username=username))

                if email:
                    validEmail = validate_email(email)

                    if not validEmail:
                        email = ""
                        logger.warn(
                            "E-mail address {email:} for {id:} ({first:} {last:}) is invalid; address blanked"
                            .format(email=email,
                                    id=studentID,
                                    first=nameFirst,
                                    last=nameLast))

                try:
                    student = Student.objects.get(student_id=studentID)
                    logger.info("Found student {studentID:}".format(
                        studentID=studentID))
                    forceSave = False

                except Student.DoesNotExist:
                    student = Student(student_id=studentID)
                    logger.info("Creating student {studentID:}".format(
                        studentID=studentID))
                    forceSave = True

                attrMap = {
                    'first_name': nameFirst,
                    'last_name': nameLast,
                    'nickname': nameNickname,
                    'email': email,
                    'rectory_password': password,
                    'username': username,
                    'gender': gender,
                }

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

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

                if forceSave:
                    student.save()

                self.sync_relations(student, fields)

            extra_students = Student.objects.exclude(student_id__in=seen_ids)
            for extra_student in extra_students:
                logger.warn("Deleting extra student {}".format(
                    extra_student.id))
                extra_student.delete()