From e4a9897685b4958efb0d5bd86f57dc1584449619 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Sat, 5 Sep 2020 16:31:29 +0530 Subject: Make Post model generic. - Fix breaking links in forum after change in models. --- yaksh/views.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 73979da..e9730d9 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -10,6 +10,7 @@ from django.db import models from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required from django.contrib.auth.models import Group +from django.contrib.contenttypes.models import ContentType from django.forms.models import inlineformset_factory from django.forms import fields from django.utils import timezone @@ -3447,6 +3448,7 @@ def course_forum(request, course_id): base_template = 'manage.html' moderator = True course = get_object_or_404(Course, id=course_id) + course_ct = ContentType.objects.get_for_model(course) if (not course.is_creator(user) and not course.is_teacher(user) and not course.is_student(user)): raise Http404('You are not enrolled in {0} course'.format(course.name)) @@ -3455,9 +3457,10 @@ def course_forum(request, course_id): posts = course.post.get_queryset().filter( active=True, title__icontains=search_term) else: - posts = course.post.get_queryset().filter( - active=True).order_by('-modified_at') - paginator = Paginator(posts, 1) + posts = Post.objects.filter( + target_ct=course_ct, target_id=course.id, active=True + ).order_by('-modified_at') + paginator = Paginator(posts, 10) page = request.GET.get('page') posts = paginator.get_page(page) if request.method == "POST": @@ -3465,7 +3468,7 @@ def course_forum(request, course_id): if form.is_valid(): new_post = form.save(commit=False) new_post.creator = user - new_post.course = course + new_post.target = course new_post.save() return redirect('yaksh:post_comments', course_id=course.id, uuid=new_post.uid) @@ -3509,7 +3512,7 @@ def post_comments(request, course_id, uuid): 'comments': comments, 'base_template': base_template, 'form': form, - 'user': user + 'user': user, }) @@ -3518,7 +3521,7 @@ def post_comments(request, course_id, uuid): def hide_post(request, course_id, uuid): user = request.user course = get_object_or_404(Course, id=course_id) - if (not course.is_creator(user) and not course.is_teacher(user)): + if (not course.is_creator(user) or not course.is_teacher(user)): raise Http404('You are not enrolled in {0} course'.format(course.name)) post = get_object_or_404(Post, uid=uuid) post.comment.active = False @@ -3532,7 +3535,7 @@ def hide_post(request, course_id, uuid): def hide_comment(request, course_id, uuid): user = request.user course = get_object_or_404(Course, id=course_id) - if (not course.is_creator(user) and not course.is_teacher(user)): + if (not course.is_creator(user) or not course.is_teacher(user)): raise Http404('You are not enrolled in {0} course'.format(course.name)) comment = get_object_or_404(Comment, uid=uuid) post_uid = comment.post_field.uid -- cgit From 25cb22481469f738d6aa9ed440474f34e22600aa Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Tue, 8 Sep 2020 15:02:22 +0530 Subject: Comments feature for video lesson --- yaksh/views.py | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index e9730d9..803f1d6 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2804,11 +2804,40 @@ def show_lesson(request, lesson_id, module_id, course_id): if not learn_unit.is_prerequisite_complete(user, learn_module, course): msg = "You have not completed previous Lesson/Quiz/Exercise" return view_module(request, learn_module.id, course_id, msg=msg) + + lesson_ct = ContentType.objects.get_for_model(learn_unit.lesson) + title = learn_unit.lesson.name + try: + post = Post.objects.get( + target_ct=lesson_ct, target_id=learn_unit.lesson.id, + active=True, title=title, creator=user, + description=f'Discussion on {title} lesson', + ) + except Post.DoesNotExist: + post = Post.objects.create( + target_ct=lesson_ct, target_id=learn_unit.lesson.id, + active=True, title=title, creator=user, + description=f'Discussion on {title} lesson', + ) + if request.method == "POST": + form = CommentForm(request.POST, request.FILES) + if form.is_valid(): + new_comment = form.save(commit=False) + new_comment.creator = request.user + new_comment.post_field = post + new_comment.save() + return redirect(request.path_info) + else: + raise Http404(f'Post does not exist for lesson {title}') + else: + form = CommentForm() + comments = post.comment.filter(active=True) context = {'lesson': learn_unit.lesson, 'user': user, 'course': course, 'state': "lesson", "all_modules": all_modules, 'learning_units': learning_units, "current_unit": learn_unit, 'learning_module': learn_module, 'toc': toc, - 'contents_by_time': contents_by_time} + 'contents_by_time': contents_by_time, + 'comments': comments, 'form': form, 'post': post} return my_render_to_response(request, 'yaksh/show_video.html', context) @@ -3454,6 +3483,7 @@ def course_forum(request, course_id): raise Http404('You are not enrolled in {0} course'.format(course.name)) search_term = request.GET.get('search_post') if search_term: + # Fix this... posts = course.post.get_queryset().filter( active=True, title__icontains=search_term) else: @@ -3522,7 +3552,7 @@ def hide_post(request, course_id, uuid): user = request.user course = get_object_or_404(Course, id=course_id) if (not course.is_creator(user) or not course.is_teacher(user)): - raise Http404('You are not enrolled in {0} course'.format(course.name)) + raise Http404(f'Only a course creator or a teacher can delete the post.') post = get_object_or_404(Post, uid=uuid) post.comment.active = False post.active = False @@ -3534,9 +3564,12 @@ def hide_post(request, course_id, uuid): @email_verified def hide_comment(request, course_id, uuid): user = request.user - course = get_object_or_404(Course, id=course_id) - if (not course.is_creator(user) or not course.is_teacher(user)): - raise Http404('You are not enrolled in {0} course'.format(course.name)) + if course_id: + course = get_object_or_404(Course, id=course_id) + if (not course.is_creator(user) or not course.is_teacher(user)): + raise Http404( + f'Only a course creator or a teacher can delete the comments' + ) comment = get_object_or_404(Comment, uid=uuid) post_uid = comment.post_field.uid comment.active = False -- cgit From c00575ae4b0d1bf128b98dd6319abf87357fee88 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Thu, 10 Sep 2020 22:07:55 +0530 Subject: Fix search in forum - Also searches in post description. --- yaksh/views.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 803f1d6..ae00fc6 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -3483,9 +3483,11 @@ def course_forum(request, course_id): raise Http404('You are not enrolled in {0} course'.format(course.name)) search_term = request.GET.get('search_post') if search_term: - # Fix this... - posts = course.post.get_queryset().filter( - active=True, title__icontains=search_term) + posts = Post.objects.filter( + Q(title__icontains=search_term) | + Q(description__icontains=search_term), + target_ct=course_ct, target_id=course.id, active=True + ) else: posts = Post.objects.filter( target_ct=course_ct, target_id=course.id, active=True -- cgit From 5e49406420207123afec88a1ca7138e7a58c2acc Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Wed, 16 Sep 2020 07:23:36 +0530 Subject: Show Lesson post and comments in discussion forum - Use trash icon instead of DELETE button - Sidebar to navigate between course forum and lesson forum - Course forum displays all the questions (posts) linked with the course model, and Lesson forum displays all the questions (posts) linked with the Lesson model. --- yaksh/views.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index ae00fc6..084ec1e 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2811,7 +2811,6 @@ def show_lesson(request, lesson_id, module_id, course_id): post = Post.objects.get( target_ct=lesson_ct, target_id=learn_unit.lesson.id, active=True, title=title, creator=user, - description=f'Discussion on {title} lesson', ) except Post.DoesNotExist: post = Post.objects.create( @@ -3517,6 +3516,27 @@ def course_forum(request, course_id): }) +@login_required +@email_verified +def lessons_forum(request, course_id): + user = request.user + base_template = 'user.html' + moderator = False + if is_moderator(user): + base_template = 'manage.html' + moderator = True + course = get_object_or_404(Course, id=course_id) + course_ct = ContentType.objects.get_for_model(course) + lesson_posts = course.get_lesson_posts(user) + return render(request, 'yaksh/lessons_forum.html', { + 'user': user, + 'base_template': base_template, + 'moderator': moderator, + 'course': course, + 'posts': lesson_posts, + }) + + @login_required @email_verified def post_comments(request, course_id, uuid): @@ -3545,6 +3565,7 @@ def post_comments(request, course_id, uuid): 'base_template': base_template, 'form': form, 'user': user, + 'course': course }) @@ -3554,7 +3575,9 @@ def hide_post(request, course_id, uuid): user = request.user course = get_object_or_404(Course, id=course_id) if (not course.is_creator(user) or not course.is_teacher(user)): - raise Http404(f'Only a course creator or a teacher can delete the post.') + raise Http404( + 'Only a course creator or a teacher can delete the post.' + ) post = get_object_or_404(Post, uid=uuid) post.comment.active = False post.active = False @@ -3570,7 +3593,7 @@ def hide_comment(request, course_id, uuid): course = get_object_or_404(Course, id=course_id) if (not course.is_creator(user) or not course.is_teacher(user)): raise Http404( - f'Only a course creator or a teacher can delete the comments' + 'Only a course creator or a teacher can delete the comments' ) comment = get_object_or_404(Comment, uid=uuid) post_uid = comment.post_field.uid -- cgit From 31e258a9d2e253691fd548d47aaab3cfee756322 Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Thu, 17 Sep 2020 13:32:12 +0530 Subject: Fix tests and minor changes --- yaksh/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 084ec1e..e465369 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2810,7 +2810,7 @@ def show_lesson(request, lesson_id, module_id, course_id): try: post = Post.objects.get( target_ct=lesson_ct, target_id=learn_unit.lesson.id, - active=True, title=title, creator=user, + active=True, title=title ) except Post.DoesNotExist: post = Post.objects.create( @@ -3527,7 +3527,7 @@ def lessons_forum(request, course_id): moderator = True course = get_object_or_404(Course, id=course_id) course_ct = ContentType.objects.get_for_model(course) - lesson_posts = course.get_lesson_posts(user) + lesson_posts = course.get_lesson_posts() return render(request, 'yaksh/lessons_forum.html', { 'user': user, 'base_template': base_template, -- cgit From 74366df12bdf352b227540244ee6df35e596007a Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Wed, 23 Sep 2020 17:27:53 +0530 Subject: Show trash icon in forum only to course creator and teacher --- yaksh/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index e465369..8c9a9e4 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -3574,7 +3574,7 @@ def post_comments(request, course_id, uuid): def hide_post(request, course_id, uuid): user = request.user course = get_object_or_404(Course, id=course_id) - if (not course.is_creator(user) or not course.is_teacher(user)): + if (not course.is_creator(user) and not course.is_teacher(user)): raise Http404( 'Only a course creator or a teacher can delete the post.' ) @@ -3591,7 +3591,7 @@ def hide_comment(request, course_id, uuid): user = request.user if course_id: course = get_object_or_404(Course, id=course_id) - if (not course.is_creator(user) or not course.is_teacher(user)): + if (not course.is_creator(user) and not course.is_teacher(user)): raise Http404( 'Only a course creator or a teacher can delete the comments' ) -- cgit From edf3b4c5d9afdaeb7c6d8e45484401bdce26e23c Mon Sep 17 00:00:00 2001 From: CruiseDevice Date: Thu, 1 Oct 2020 14:17:56 +0530 Subject: User can create anonymous post and comment --- yaksh/views.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'yaksh/views.py') diff --git a/yaksh/views.py b/yaksh/views.py index 8c9a9e4..69a7414 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2824,6 +2824,7 @@ def show_lesson(request, lesson_id, module_id, course_id): new_comment = form.save(commit=False) new_comment.creator = request.user new_comment.post_field = post + new_comment.anonymous = request.POST.get('anonymous', '') == 'on' new_comment.save() return redirect(request.path_info) else: @@ -3500,6 +3501,7 @@ def course_forum(request, course_id): new_post = form.save(commit=False) new_post.creator = user new_post.target = course + new_post.anonymous = request.POST.get('anonymous', '') == 'on' new_post.save() return redirect('yaksh:post_comments', course_id=course.id, uuid=new_post.uid) @@ -3557,6 +3559,7 @@ def post_comments(request, course_id, uuid): new_comment = form.save(commit=False) new_comment.creator = request.user new_comment.post_field = post + new_comment.anonymous = request.POST.get('anonymous', '') == 'on' new_comment.save() return redirect(request.path_info) return render(request, 'yaksh/post_comments.html', { -- cgit