Ejemplo n.º 1
0
def create_unknown_user(request, ms, data):
    '''Create the sso user who\'s not exists in pepper'''

    try:
        attribute_setting = ms.get('attributes')
        
        # Parse to mapped attribute
        parsed_data = {}
        for attr in attribute_setting:
            mapped_name = attr['map'] if 'map' in attr else attr['name']
            if attr['name']:
                parsed_data[mapped_name] = data.get(attr['name'])

        print attribute_setting
        print data
        print parsed_data

        # Generate username if not provided
        if not parsed_data.get('username'):
            username = random_mark(20)
        else:
            username = parsed_data['username']

        # Email must be profided
        email = parsed_data['email']

        user = User(username=username, email=email, is_active=False)
        user.set_password(username)  # Set password the same with username
        user.save()

        registration = Registration()
        registration.register(user)

        profile = UserProfile(user=user)
        profile.subscription_status = "Imported"
        profile.sso_type = ms.get('sso_type')
        profile.sso_idp = ms.get('sso_name')

        # Save mapped attributes
        for k, v in parsed_data.items():
            if k == 'first_name':
                user.first_name = parsed_data['first_name']
            elif k == 'last_name':
                user.last_name = parsed_data['last_name']
            elif k == 'sso_user_id':
                profile.sso_user_id = parsed_data['sso_user_id']
            elif k == 'district':
                profile.district = District.object.get(name=parsed_data['district'])
            elif k == 'school':
                profile.school = School.object.get(name=parsed_data['school'])
            elif k == 'grade_level':
                ids = GradeLevel.object.filter(name__in=parsed_data['grade_level'].split(',')).values_list('id', flat=True)
                profile.grade_level = ','.join(ids)
            elif k == 'major_subject_area':
                ids = SubjectArea.object.filter(name__in=parsed_data['major_subject_area'].split(',')).values_list('id', flat=True)
                profile.major_subject_area = ','.join(ids)
            elif k == 'years_in_education':
                profile.years_in_education = YearsInEducation.object.get(name=parsed_data['years_in_education'])
            elif k == 'percent_lunch':
                profile.percent_lunch = Enum.object.get(name='percent_lunch', content=parsed_data['percent_lunch'])
            elif k == 'percent_iep':
                profile.percent_iep = Enum.object.get(name='percent_iep', content=parsed_data['percent_iep'])
            elif k == 'percent_eng_learner':
                profile.percent_eng_learner = Enum.object.get(name='percent_eng_learner', content=parsed_data['percent_eng_learner'])

        user.save()
        profile.save()

        cea, _ = CourseEnrollmentAllowed.objects.get_or_create(course_id='PCG_Education/PEP101.1/S2016', email=email)
        cea.is_active = True
        cea.auto_enroll = True
        cea.save()
        return https_redirect(request, reverse('register_sso_user', args=[registration.activation_key]))

    except Exception as e:
        raise e
        db.transaction.rollback()
        log.error("error: failed to create SSO user: %s" % e)