def post(self, course_uuid, user_uuid): """ Enrol or update a user enrolment in the course The payload for the request has to contain course_role. e.g. {"couse_role":"Student"} :param course_uuid: :param user_uuid: :return: """ course = Course.get_active_by_uuid_or_404(course_uuid) user = User.get_by_uuid_or_404(user_uuid) user_course = UserCourse.query \ .filter_by( user_id=user.id, course_id=course.id ) \ .first() if not user_course: user_course = UserCourse( user_id=user.id, course_id=course.id ) require(EDIT, user_course) params = new_course_user_parser.parse_args() role_name = params.get('course_role') course_roles = [ CourseRole.dropped.value, CourseRole.student.value, CourseRole.teaching_assistant.value, CourseRole.instructor.value ] if role_name not in course_roles: abort(404) course_role = CourseRole(role_name) if user_course.course_role != course_role: user_course.course_role = course_role db.session.add(user_course) db.session.commit() result = { 'user_id': user.uuid, 'fullname': user.fullname, 'course_role': course_role.value } on_classlist_enrol.send( self, event_name=on_classlist_enrol.name, user=current_user, course_id=course.id, data={'user_id': user.id}) return result
def _update_enrollment_for_course(cls, course_id, lti_members): from compair.models import UserCourse user_courses = UserCourse.query \ .filter_by(course_id=course_id) \ .all() new_user_courses = [] for lti_member in lti_members: if lti_member.compair_user_id != None: user_course = next( (user_course for user_course in user_courses if user_course.user_id == lti_member.compair_user_id), None ) # add new user_course if doesn't exist if user_course == None: user_course = UserCourse( course_id=course_id, user_id=lti_member.compair_user_id, course_role=lti_member.course_role ) new_user_courses.append(user_course) # update user_course role else: user_course.course_role=lti_member.course_role # update user profile if needed lti_member.lti_user.update_user_profile() db.session.add_all(new_user_courses) db.session.commit() # set user_course to dropped role if missing from membership results and not current user for user_course in user_courses: # never unenrol current_user if current_user and current_user.is_authenticated and user_course.user_id == current_user.id: continue lti_member = next( (lti_member for lti_member in lti_members if user_course.user_id == lti_member.compair_user_id), None ) if lti_member == None: user_course.course_role = CourseRole.dropped db.session.commit()
def _update_enrollment_for_course(cls, course_id, lti_members): from compair.models import UserCourse user_courses = UserCourse.query \ .filter_by(course_id=course_id) \ .all() new_user_courses = [] for lti_member in lti_members: if lti_member.compair_user_id != None: user_course = next( (user_course for user_course in user_courses if user_course.user_id == lti_member.compair_user_id), None) # add new user_course if doesn't exist if user_course == None: user_course = UserCourse( course_id=course_id, user_id=lti_member.compair_user_id, course_role=lti_member.course_role) new_user_courses.append(user_course) # update user_course role else: user_course.course_role = lti_member.course_role # update user profile if needed lti_member.lti_user.update_user_profile() db.session.add_all(new_user_courses) db.session.commit() # set user_course to dropped role if missing from membership results and not current user for user_course in user_courses: # never unenrol current_user if current_user and current_user.is_authenticated and user_course.user_id == current_user.id: continue lti_member = next( (lti_member for lti_member in lti_members if user_course.user_id == lti_member.compair_user_id), None) if lti_member == None: user_course.course_role = CourseRole.dropped db.session.commit()
def post(self, course_uuid, user_uuid): """ Enrol or update a user enrolment in the course The payload for the request has to contain course_role. e.g. {"couse_role":"Student"} :param course_uuid: :param user_uuid: :return: """ course = Course.get_active_by_uuid_or_404(course_uuid) user = User.get_by_uuid_or_404(user_uuid) if current_app.config.get('DEMO_INSTALLATION', False): from data.fixtures import DemoDataFixture if course.id == DemoDataFixture.DEFAULT_COURSE_ID and user.id in DemoDataFixture.DEFAULT_COURSE_USERS: abort( 400, title="Enrollment Not Updated", message= "Sorry, you cannot update course role for the default users in the default demo course." ) user_course = UserCourse.query \ .filter_by( user_id=user.id, course_id=course.id ) \ .first() if not user_course: user_course = UserCourse(user_id=user.id, course_id=course.id) require( EDIT, user_course, title="Enrollment Not Updated", message= "Sorry, your role in this course does not allow you to update enrollment." ) params = new_course_user_parser.parse_args() role_name = params.get('course_role') course_roles = [ CourseRole.dropped.value, CourseRole.student.value, CourseRole.teaching_assistant.value, CourseRole.instructor.value ] if role_name not in course_roles: abort( 400, title="Enrollment Not Updated", message= "Please try again with a course role from the list of roles provided." ) course_role = CourseRole(role_name) if user_course.course_role != course_role: user_course.course_role = course_role db.session.add(user_course) db.session.commit() on_classlist_enrol.send(self, event_name=on_classlist_enrol.name, user=current_user, course_id=course.id, data={'user_id': user.id}) return { 'user_id': user.uuid, 'fullname': user.fullname, 'fullname_sortable': user.fullname_sortable, 'course_role': course_role.value }
def post(self, course_uuid, user_uuid): """ Enrol or update a user enrolment in the course The payload for the request has to contain course_role. e.g. {"couse_role":"Student"} :param course_uuid: :param user_uuid: :return: """ course = Course.get_active_by_uuid_or_404(course_uuid) user = User.get_by_uuid_or_404(user_uuid) if current_app.config.get('DEMO_INSTALLATION', False): from data.fixtures import DemoDataFixture if course.id == DemoDataFixture.DEFAULT_COURSE_ID and user.id in DemoDataFixture.DEFAULT_COURSE_USERS: abort(400, title="Enrollment Not Updated", message="Sorry, you cannot update course role for the default users in the default demo course.") user_course = UserCourse.query \ .filter_by( user_id=user.id, course_id=course.id ) \ .first() if not user_course: user_course = UserCourse( user_id=user.id, course_id=course.id ) require(EDIT, user_course, title="Enrollment Not Updated", message="Sorry, your role in this course does not allow you to update enrollment.") params = new_course_user_parser.parse_args() role_name = params.get('course_role') course_roles = [ CourseRole.dropped.value, CourseRole.student.value, CourseRole.teaching_assistant.value, CourseRole.instructor.value ] if role_name not in course_roles: abort(400, title="Enrollment Not Updated", message="Please try again with a course role from the list of roles provided.") course_role = CourseRole(role_name) if user_course.course_role != course_role: user_course.course_role = course_role db.session.add(user_course) db.session.commit() on_classlist_enrol.send( self, event_name=on_classlist_enrol.name, user=current_user, course_id=course.id, data={'user_id': user.id}) return { 'user_id': user.uuid, 'fullname': user.fullname, 'fullname_sortable': user.fullname_sortable, 'course_role': course_role.value }