def create_content( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) if request.method == "POST": form = ContentForm(request.POST) if form.is_valid(): user = request.user.get_profile() user_uri = u"/uri/user/{0}".format(user.username) content_data = { 'title': form.cleaned_data.get('title'), 'content': form.cleaned_data.get('content'), 'author_uri': user_uri, } content = content_model.create_content(**content_data) course_model.add_course_content(course['uri'], content['uri']) redirect_url = request.POST.get('next_url', None) if not redirect_url: redirect_url = reverse('courses_show', kwargs={'course_id': course['id'], 'slug': course['slug']} ) return http.HttpResponseRedirect(redirect_url) else: form = ContentForm() context = { 'form': form } context = _populate_course_context(request, course_id, context) if request.GET.get('next_url', None): context['next_url'] = request.GET.get('next_url', None) return render_to_response('courses/create_content.html', context, context_instance=RequestContext(request) )
def course_settings( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) context = { } context = _populate_course_context(request, course_id, context) context['update_form'] = CourseUpdateForm(course) context['image_form'] = CourseImageForm() context['status_form'] = CourseStatusForm(course) tags = ", ".join(course_model.get_course_tags(course_uri)) context['tags_form'] = CourseTagsForm({'tags': tags}) if context['cohort']['term'] == 'FIXED': context['term_form'] = CourseTermForm(context['cohort']) else: context['term_form'] = CourseTermForm() context['signup_form'] = CohortSignupForm( initial={'signup': context['cohort']['signup']} ) context['metadata_form'] = LrmiForm(context['meta_data']) if 'educational_alignment' in context: context['educational_alignment_form'] = EducationalAlignmentForm( context['educational_alignment'] ) else: context['educational_alignment_form'] = EducationalAlignmentForm() context['settings_active'] = True return render_to_response( 'courses/course_settings.html', context, context_instance=RequestContext(request) )
def _populate_course_context( request, course_id, context ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) context['course'] = course context['course_url'] = request.get_full_path() if 'image_uri' in course: context['course']['image'] = media_model.get_image(course['image_uri']) #NOTE if performance becomes a problem dont fetch cohort cohort = course_model.get_course_cohort(course_uri) context['cohort'] = cohort user_uri = "/uri/user/{0}".format(request.user.username) context['organizer'] = course_model.is_cohort_organizer( user_uri, cohort['uri'] ) context['organizer'] |= request.user.is_superuser context['can_edit'] = context['organizer'] and not course['status'] == 'archived' if course_model.user_in_cohort(user_uri, cohort['uri']): if not context['organizer']: context['show_leave_course'] = True context['learner'] = True elif cohort['signup'] == "OPEN": context['show_signup'] = True return context
def course_learn_api_data( request, course_id ): """ return data required by the learn API """ course_uri = course_model.course_id2uri(course_id) try: course_data = course_model.get_course_learn_api_data(course_uri) except: raise http.Http404 return http.HttpResponse(json.dumps(course_data), mimetype="application/json")
def course_update_attribute( request, course_id, attribute): course_uri = course_model.course_id2uri(course_id) form = CourseUpdateForm(request.POST) if form.is_valid(): kwargs = { attribute: form.cleaned_data[attribute] } course_model.update_course( course_uri, **kwargs ) else: messages.error(request, _("Could not update {0}.".format(attribute))) redirect_url = reverse('courses_settings', kwargs={'course_id': course_id}) return http.HttpResponseRedirect(redirect_url)
def check_organizer(*args, **kwargs): request = args[0] course_id = kwargs.get("course_id") course_uri = course_model.course_id2uri(course_id) user_uri = "/uri/user/{0}".format(request.user.username) cohort = course_model.get_course_cohort(course_uri) organizer = course_model.is_cohort_organizer(user_uri, cohort["uri"]) organizer |= request.user.is_superuser if not organizer: return http.HttpResponseForbidden(_("You need to be a course organizer.")) return function(*args, **kwargs)
def delete_spam(request, course_id): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) if request.method == "POST": course_model.delete_spam_course(course_uri) return http.HttpResponseRedirect(reverse('home')) context = { } context = _populate_course_context(request, course_id, context) return render_to_response('courses/course_delete_confirmation.html', context, context_instance=RequestContext(request) )
def check_organizer(*args, **kwargs): request = args[0] course_id = kwargs.get('course_id') course_uri = course_model.course_id2uri(course_id) user_uri = "/uri/user/{0}".format(request.user.username) cohort = course_model.get_course_cohort(course_uri) organizer = course_model.is_cohort_organizer(user_uri, cohort['uri']) organizer |= request.user.is_superuser if not organizer: return http.HttpResponseForbidden( _("You need to be a course organizer.")) return function(*args, **kwargs)
def course_update_tags( request, course_id ): course_uri = course_model.course_id2uri(course_id) form = CourseTagsForm(request.POST) if form.is_valid(): tags = [tag.strip() for tag in form.cleaned_data['tags'].split(',')] course_model.remove_course_tags( course_uri, course_model.get_course_tags(course_uri) ) course_model.add_course_tags(course_uri, tags) messages.success( request, _("Course tags successfully updated") ) redirect_url = reverse('courses_settings', kwargs={'course_id': course_id}) return http.HttpResponseRedirect(redirect_url)
def course_discussion( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) context = { } context = _populate_course_context(request, course_id, context) context['discussion_active'] = True return render_to_response( 'courses/course_discussion.html', context, context_instance=RequestContext(request) )
def delete_spam(request, course_id): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) if request.method == "POST": course_model.delete_spam_course(course_uri) #TODO display splash message to indicate success return http.HttpResponseRedirect(reverse('home')) context = { } context = _populate_course_context(request, course_id, context) return render_to_response('courses/course_delete_confirmation.html', context, context_instance=RequestContext(request) )
def course_admin_content( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) context = { } context = _populate_course_context(request, course_id, context) context['content_active'] = True return render_to_response( 'courses/course_admin_content.html', context, context_instance=RequestContext(request) )
def course_image( request, course_id ): course_uri = course_model.course_id2uri(course_id) user_uri = u"/uri/user/{0}".format(request.user.username) image_form = CourseImageForm(request.POST, request.FILES) if image_form.is_valid(): image_file = request.FILES['image'] image = media_model.upload_image(image_file, course_uri) course_model.update_course( course_uri=course_uri, image_uri=image['uri'], ) else: messages.error(request, _("Could not upload image")) redirect_url = reverse('courses_settings', kwargs={'course_id': course_id}) return http.HttpResponseRedirect(redirect_url)
def _populate_course_context( request, course_id, context ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) course['author'] = course['author_uri'].strip('/').split('/')[-1] context['course'] = course context['course_url'] = reverse('courses_show', kwargs={'course_id': course['id'], 'slug': course['slug']} ) if 'image_uri' in course: context['course']['image'] = media_model.get_image(course['image_uri']) #NOTE if performance becomes a problem dont fetch cohort cohort = course_model.get_course_cohort(course_uri) context['cohort'] = cohort user_uri = u"/uri/user/{0}".format(request.user.username) context['organizer'] = course_model.is_cohort_organizer( user_uri, cohort['uri'] ) context['organizer'] |= request.user.is_superuser context['admin'] = request.user.is_superuser context['can_edit'] = context['organizer'] and not course['status'] == 'archived' context['trusted_user'] = request.user.has_perm('users.trusted_user') if course_model.user_in_cohort(user_uri, cohort['uri']): if not context['organizer']: context['show_leave_course'] = True context['learner'] = True elif cohort['signup'] == "OPEN": context['show_signup'] = True try: course_lists = learn_model.get_lists_for_course(reverse( 'courses_slug_redirect', kwargs={'course_id': course_id} )) f = lambda l: l['name'] not in ['drafts', 'listed', 'archived'] context['lists'] = filter(f, course_lists) except: log.error("Could not get lists for course!") if 'based_on_uri' in course: course['based_on'] = course_model.get_course(course['based_on_uri']) context['meta_data'] = lrmi_model.get_tags(course_uri) if 'educational_alignment' in context['meta_data']: context['educational_alignment'] = json.loads(context['meta_data']['educational_alignment']) del context['meta_data']['educational_alignment'] return context
def course_discussion( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) context = { } context = _populate_course_context(request, course_id, context) context['discussion_active'] = True context['disqus_public_key'] = settings.DISQUS_PUBLIC_KEY if request.user.is_authenticated(): context['disqus_sso'] = get_disqus_sso(request.user) return render_to_response( 'courses/course_discussion.html', context, context_instance=RequestContext(request) )
def course_change_status( request, course_id ): user_uri = u"/uri/user/{0}".format(request.user.username) course_uri = course_model.course_id2uri(course_id) form = CourseStatusForm(request.POST) if form.is_valid(): status = form.cleaned_data['status'] if status == 'draft': course = course_model.unpublish_course(course_uri) elif status == 'published': course = course_model.publish_course(course_uri) elif status == 'archived': course = course_model.archive_course(course_uri) messages.success(request, _('Course status updated.')) redirect_url = reverse('courses_settings', kwargs={'course_id': course_id}) return http.HttpResponseRedirect(redirect_url)
def course_people( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) context = { } context = _populate_course_context(request, course_id, context) from users.models import get_user_profile_image_url for user in context['cohort']['users'].values(): user['profile_image_url'] = get_user_profile_image_url(user['uri']) context['people_active'] = True return render_to_response( 'courses/course_people.html', context, context_instance=RequestContext(request) )
def course_update_metadata( request, course_id ): course_uri = course_model.course_id2uri(course_id) form = LrmiForm(request.POST) if form.is_valid(): for key, value in form.cleaned_data.items(): lrmi_model.save_tag(course_uri, key, value) ea_form = EducationalAlignmentForm(request.POST) if ea_form.is_valid(): lrmi_model.save_tag( course_uri, 'educational_alignment', json.dumps(ea_form.cleaned_data) ) else: lrmi_model.save_tag(course_uri, 'educational_alignment', '') redirect_url = reverse('courses_settings', kwargs={'course_id': course_id}) return http.HttpResponseRedirect(redirect_url)
def course_export_emails( request, course_id ): if not request.user.has_perm('users.trusted_user'): msg = _('You do not have permission to view this page') return http.HttpResponseForbidden(msg) course_uri = course_model.course_id2uri(course_id) cohort = course_model.get_course_cohort(course_uri) response = http.HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; ' response['Content-Disposition'] += 'filename=detailed_report.csv' writer = unicodecsv.writer(response) writer.writerow(["username", "email address", "signup date"]) for user in cohort['users'].values(): username = user['uri'].strip('/').split('/')[-1] user['email'] = UserProfile.objects.get(username=username).email writer.writerow([username, user['email'], user['signup_date']]) return response
def show_course( request, course_id, slug=None ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) if slug != course['slug']: return course_slug_redirect( request, course_id) context = { } context = _populate_course_context(request, course_id, context) context['about_active'] = True if context['organizer']: context['update_form'] = CourseUpdateForm(course) context['about'] = content_model.get_content(course['about_uri']) return render_to_response( 'courses/course.html', context, context_instance=RequestContext(request) )
def post_content_comment( request, course_id, content_id): #TODO use form with field that sanitizes the input! comment_content = request.POST.get('comment') user = request.user.get_profile() user_uri = u"/uri/user/{0}".format(user.username) comment = comment_model.create_comment(comment_content, user_uri) reference_uri = "/uri/content/{0}".format(content_id) course_uri = course_model.course_id2uri(course_id) cohort = course_model.get_course_cohort(course_uri) course_model.add_comment_to_cohort( comment['uri'], cohort['uri'], reference_uri ) if request.POST.get('next_url'): redirect_url = request.POST.get('next_url') else: redirect_url = reverse('courses_content_show', kwargs={'course_id': course_id, 'content_id': content_id} ) return http.HttpResponseRedirect(redirect_url)
def edit_content( request, course_id, content_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) content = content_model.get_content("/uri/content/{0}".format(content_id)) if request.method == "POST": form = ContentForm(request.POST) if form.is_valid(): content_data = { 'title': form.cleaned_data.get('title'), 'content': form.cleaned_data.get('content'), } user = request.user.get_profile() user_uri = u"/uri/user/{0}".format(user.username) content = content_model.update_content( content['uri'], content_data['title'], content_data['content'], user_uri ) redirect_url = request.POST.get('next_url', None) if not redirect_url: redirect_url = reverse('courses_content_show', kwargs={'course_id': course_id, 'content_id': content_id} ) return http.HttpResponseRedirect(redirect_url) else: form = ContentForm(initial=content) context = { 'form': form, 'content': content, } context = _populate_course_context(request, course_id, context) if request.GET.get('next_url', None): context['next_url'] = request.GET.get('next_url', None) return render_to_response('courses/edit_content.html', context, context_instance=RequestContext(request) )
def remove_content( request, course_id, content_id ): course_uri = course_model.course_id2uri(course_id) content_uri = "/uri/content/{0}".format(content_id) course_model.remove_course_content(course_uri, content_uri) redirect_url = reverse('courses_admin_content', kwargs={'course_id': course_id}) return http.HttpResponseRedirect(redirect_url)
def clone_course( request, course_id ): course_uri = course_model.course_id2uri(course_id) user_uri = u"/uri/user/{0}".format(request.user.username) course = course_model.clone_course(course_uri, user_uri) return course_slug_redirect(request, course['id'])
def course_slug_redirect( request, course_id ): course_uri = course_model.course_id2uri(course_id) course = _get_course_or_404(course_uri) redirect_url = reverse('courses_show', kwargs={'course_id': course_id, 'slug': course['slug']}) return http.HttpResponseRedirect(redirect_url)