Commit 3f83904c by ichuang

if AUTH_REQUIRE_STAFF_FOR_COURSE then course list = those accessible

parent c20ebd13
...@@ -8,7 +8,6 @@ import uuid ...@@ -8,7 +8,6 @@ import uuid
import feedparser import feedparser
import urllib import urllib
import itertools import itertools
from collections import defaultdict
from django.conf import settings from django.conf import settings
from django.contrib.auth import logout, authenticate, login from django.contrib.auth import logout, authenticate, login
...@@ -37,7 +36,7 @@ from xmodule.modulestore.exceptions import ItemNotFoundError ...@@ -37,7 +36,7 @@ from xmodule.modulestore.exceptions import ItemNotFoundError
from models import Registration, UserProfile, PendingNameChange, PendingEmailChange, CourseEnrollment from models import Registration, UserProfile, PendingNameChange, PendingEmailChange, CourseEnrollment
from datetime import date from datetime import date
from collections import namedtuple from collections import namedtuple
from courseware.courses import course_staff_group_name, has_staff_access_to_course from courseware.courses import course_staff_group_name, has_staff_access_to_course, get_courses_by_university
log = logging.getLogger("mitx.student") log = logging.getLogger("mitx.student")
Article = namedtuple('Article', 'title url author image deck publication publish_date') Article = namedtuple('Article', 'title url author image deck publication publish_date')
...@@ -65,9 +64,9 @@ def index(request): ...@@ -65,9 +64,9 @@ def index(request):
from external_auth.views import edXauth_ssl_login from external_auth.views import edXauth_ssl_login
return edXauth_ssl_login(request) return edXauth_ssl_login(request)
return main_index() return main_index(user=request.user)
def main_index(extra_context = {}): def main_index(extra_context = {}, user=None):
''' '''
Render the edX main page. Render the edX main page.
...@@ -89,11 +88,8 @@ def main_index(extra_context = {}): ...@@ -89,11 +88,8 @@ def main_index(extra_context = {}):
entry.image = soup.img['src'] if soup.img else None entry.image = soup.img['src'] if soup.img else None
entry.summary = soup.getText() entry.summary = soup.getText()
universities = defaultdict(list) # The course selection work is done in courseware.courses.
courses = sorted(modulestore().get_courses(), key=lambda course: course.number) universities = get_courses_by_university(None)
for course in courses:
universities[course.org].append(course)
context = {'universities': universities, 'entries': entries} context = {'universities': universities, 'entries': entries}
context.update(extra_context) context.update(extra_context)
return render_to_response('index.html', context) return render_to_response('index.html', context)
......
from collections import defaultdict
from fs.errors import ResourceNotFoundError from fs.errors import ResourceNotFoundError
from functools import wraps from functools import wraps
import logging import logging
...@@ -123,6 +124,8 @@ def has_staff_access_to_course(user,course): ...@@ -123,6 +124,8 @@ def has_staff_access_to_course(user,course):
Returns True if the given user has staff access to the course. Returns True if the given user has staff access to the course.
This means that user is in the staff_* group, or is an overall admin. This means that user is in the staff_* group, or is an overall admin.
''' '''
if user is None or (not user.is_authenticated()) or course is None:
return False
if user.is_staff: if user.is_staff:
return True return True
user_groups = [x[1] for x in user.groups.values_list()] # note this is the Auth group, not UserTestGroup user_groups = [x[1] for x in user.groups.values_list()] # note this is the Auth group, not UserTestGroup
...@@ -132,5 +135,23 @@ def has_staff_access_to_course(user,course): ...@@ -132,5 +135,23 @@ def has_staff_access_to_course(user,course):
return True return True
return False return False
def get_courses_by_university(user):
'''
Returns dict of lists of courses available, keyed by course.org (ie university).
Courses are sorted by course.number.
if ACCESS_REQUIRE_STAFF_FOR_COURSE then list only includes those accessible to user.
'''
# TODO: Clean up how 'error' is done.
# filter out any courses that errored.
courses = [c for c in modulestore().get_courses()
if isinstance(c, CourseDescriptor)]
courses = sorted(courses, key=lambda course: course.number)
universities = defaultdict(list)
for course in courses:
if settings.MITX_FEATURES.get('ENABLE_LMS_MIGRATION'):
if not has_staff_access_to_course(user,course):
continue
universities[course.org].append(course)
return universities
from collections import defaultdict
import json import json
import logging import logging
import urllib import urllib
...@@ -28,7 +27,7 @@ from xmodule.course_module import CourseDescriptor ...@@ -28,7 +27,7 @@ from xmodule.course_module import CourseDescriptor
from util.cache import cache, cache_if_anonymous from util.cache import cache, cache_if_anonymous
from student.models import UserTestGroup, CourseEnrollment from student.models import UserTestGroup, CourseEnrollment
from courseware import grades from courseware import grades
from courseware.courses import check_course from courseware.courses import check_course, get_courses_by_university
log = logging.getLogger("mitx.courseware") log = logging.getLogger("mitx.courseware")
...@@ -58,19 +57,12 @@ def user_groups(user): ...@@ -58,19 +57,12 @@ def user_groups(user):
@ensure_csrf_cookie @ensure_csrf_cookie
@cache_if_anonymous @cache_if_anonymous
def courses(request): def courses(request):
# TODO: Clean up how 'error' is done. '''
Render "find courses" page. The course selection work is done in courseware.courses.
# filter out any courses that errored. '''
courses = [c for c in modulestore().get_courses() universities = get_courses_by_university(request.user)
if isinstance(c, CourseDescriptor)]
courses = sorted(courses, key=lambda course: course.number)
universities = defaultdict(list)
for course in courses:
universities[course.org].append(course)
return render_to_response("courses.html", {'universities': universities}) return render_to_response("courses.html", {'universities': universities})
@cache_control(no_cache=True, no_store=True, must_revalidate=True) @cache_control(no_cache=True, no_store=True, must_revalidate=True)
def gradebook(request, course_id): def gradebook(request, course_id):
if 'course_admin' not in user_groups(request.user): if 'course_admin' not in user_groups(request.user):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment