diff --git a/apps/content/templates/content/contest_work.html b/apps/content/templates/content/contest_work.html
index 04fdc3c4..1fe09942 100644
--- a/apps/content/templates/content/contest_work.html
+++ b/apps/content/templates/content/contest_work.html
@@ -71,4 +71,42 @@
{% include 'templates/blocks/share.html' with share_object_name='работой' %}
+
+
+
+
Задавайте вопросы:
+
+ {% if request.user.is_authenticated %}
+
+ {% else %}
+
Только зарегистрированные пользователи могут оставлять комментарии.
+ {% endif %}
+
+ {% include "templates/blocks/comments.html" with object=contest_work %}
+
+
+
+
{% endblock content %}
diff --git a/apps/content/views.py b/apps/content/views.py
index dd22d463..ff3a4deb 100644
--- a/apps/content/views.py
+++ b/apps/content/views.py
@@ -1,9 +1,14 @@
from django.contrib.auth.decorators import login_required
+from django.http import JsonResponse
from django.shortcuts import get_object_or_404
+from django.template import loader
from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.decorators.http import require_http_methods
from django.views.generic import TemplateView, DetailView
from apps.content.models import Contest, ContestWork
+from apps.course.models import ContestWorkComment
@method_decorator(login_required, name='dispatch')
@@ -54,3 +59,52 @@ class ContestWorkView(DetailView):
context['user_liked'] = self.object.likes.filter(user=self.request.user).exists() \
if self.request.user.is_authenticated else False
return context
+
+
+@login_required
+@csrf_exempt
+@require_http_methods(['POST'])
+def contest_work_comment(request, contest_work_id):
+ try:
+ contest_work = ContestWork.objects.get(id=contest_work_id)
+ except ContestWork.DoesNotExist:
+ return JsonResponse({
+ 'success': False,
+ 'errors': ['Contest_work with id f{contest_work_id} not found']
+ }, status=400)
+ else:
+ reply_to = request.POST.get('reply_id', 0)
+ comment = request.POST.get('comment', '')
+ if not comment:
+ return JsonResponse({
+ 'success': False,
+ 'errors': ['Comment can not be empty']
+ }, status=400)
+
+ if not int(reply_to):
+ contest_work_comment = ContestWorkComment.objects.create(
+ author=request.user,
+ content=comment,
+ contest_work=contest_work,
+ )
+ else:
+ try:
+ _contest_work_comment = ContestWorkComment.objects.get(id=reply_to)
+ except ContestWorkComment.DoesNotExist:
+ return JsonResponse({
+ 'success': False,
+ 'errors': ['LessonComment with id f{reply_to} not found']
+ }, status=400)
+ else:
+ contest_work_comment = ContestWorkComment.objects.create(
+ author=request.user,
+ content=comment,
+ contest_work=contest_work,
+ parent=_contest_work_comment,
+ )
+ ctx = {'node': contest_work_comment, 'user': request.user}
+ html = loader.render_to_string('templates/blocks/comment.html', ctx)
+ return JsonResponse({
+ 'success': True,
+ 'comment': html,
+ })
diff --git a/project/urls.py b/project/urls.py
index 21527b50..9e6f5992 100644
--- a/project/urls.py
+++ b/project/urls.py
@@ -18,7 +18,7 @@ from django.contrib import admin
from django.views.generic import TemplateView
from django.urls import path, include
-from apps.content.views import ContestEditView, ContestView, ContestWorkView
+from apps.content.views import ContestEditView, ContestView, ContestWorkView, contest_work_comment
from apps.course.views import (
CoursesView, likes, coursecomment,
CourseView, LessonView, SearchView,
@@ -87,6 +87,7 @@ urlpatterns = [
path('contest//edit', ContestEditView.as_view(), name='contest_edit'),
path('contest//', ContestView.as_view(), name='contest'),
path('contest-work//', ContestWorkView.as_view(), name='contest_work'),
+ path('contest-work//comment', contest_work_comment, name='contest_work_comment'),
]