From 6630ec34eeb3a4dd9854fcb5d8594759d56ed2ed Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 14 Aug 2018 06:05:25 +0500 Subject: [PATCH] LIL-582 --- api/v1/serializers/contest.py | 14 ++++ api/v1/urls.py | 2 +- api/v1/views.py | 13 +++- apps/content/models.py | 8 ++ .../content/blocks/contest_work.html | 3 - apps/content/templates/content/contest.html | 10 +-- .../templates/content/contest_work.html | 64 ++++++++++++++++ apps/content/views.py | 8 +- project/urls.py | 3 +- web/src/components/ContestWorks.vue | 34 ++++++--- web/src/components/UploadContestWork.vue | 8 +- web/src/components/blocks/ContestWork.vue | 75 ++++++++++++------- web/src/js/app.js | 4 +- web/src/sass/_common.sass | 28 +++++++ 14 files changed, 215 insertions(+), 59 deletions(-) delete mode 100644 apps/content/templates/content/blocks/contest_work.html create mode 100644 apps/content/templates/content/contest_work.html diff --git a/api/v1/serializers/contest.py b/api/v1/serializers/contest.py index 3d76244d..6288c5fc 100644 --- a/api/v1/serializers/contest.py +++ b/api/v1/serializers/contest.py @@ -9,6 +9,7 @@ from apps.content.models import (Contest, ContestWork) class ContestSerializer(serializers.ModelSerializer): cover = ImageObjectSerializer() content = ContentSerializer(many=True) + class Meta: model = Contest fields = '__all__' @@ -19,6 +20,7 @@ class ContestCreateSerializer(DispatchContentMixin, serializers.ModelSerializer) child=ContentCreateSerializer(), required=False, ) + class Meta: model = Contest fields = '__all__' @@ -40,6 +42,18 @@ class ContestCreateSerializer(DispatchContentMixin, serializers.ModelSerializer) class ContestWorkSerializer(serializers.ModelSerializer): + image = ImageObjectSerializer() + + class Meta: + model = ContestWork + fields = ['id', 'user', 'contest', 'image', 'child_full_name', 'age', + 'created_at', 'likes', 'img_width', 'img_height'] + + +class ContestWorkCreateSerializer(serializers.ModelSerializer): class Meta: model = ContestWork fields = '__all__' + + def to_representation(self, instance): + return ContestWorkSerializer(instance=instance, context=self.context).to_representation(instance) diff --git a/api/v1/urls.py b/api/v1/urls.py index 0e8cab3d..51610cb6 100644 --- a/api/v1/urls.py +++ b/api/v1/urls.py @@ -45,7 +45,7 @@ router.register(r'school-schedules', SchoolScheduleViewSet, base_name='school-sc router.register(r'users', UserViewSet, base_name='users') router.register(r'contests', ContestViewSet, base_name='contests') -router.register(r'contest_works', ContestWorkViewSet, base_name='contest_works') +router.register(r'contest-works', ContestWorkViewSet, base_name='contest_works') # router.register(r'configs', ConfigViewSet, base_name='configs') diff --git a/api/v1/views.py b/api/v1/views.py index ac9d70fe..95fea15b 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -39,7 +39,9 @@ from .serializers.user import ( AuthorRequestSerializer, UserSerializer, UserPhotoSerializer, ) -from .serializers.contest import ContestCreateSerializer, ContestSerializer, ContestWorkSerializer +from .serializers.contest import ( + ContestCreateSerializer, ContestSerializer, ContestWorkSerializer, ContestWorkCreateSerializer +) from .permissions import ( IsAdmin, IsAdminOrIsSelf, @@ -446,5 +448,10 @@ class ContestViewSet(ExtendedModelViewSet): class ContestWorkViewSet(ExtendedModelViewSet): - queryset = ContestWork.objects.all() - serializer_class = ContestWorkSerializer + queryset = ContestWork.objects.order_by('-created_at') + serializer_class = ContestWorkCreateSerializer + serializer_class_map = { + 'list': ContestWorkSerializer, + 'retrieve': ContestWorkSerializer, + } + filter_fields = ('contest',) diff --git a/apps/content/models.py b/apps/content/models.py index 3f4992ea..378c9995 100644 --- a/apps/content/models.py +++ b/apps/content/models.py @@ -179,3 +179,11 @@ class ContestWork(models.Model): age = models.SmallIntegerField() created_at = models.DateTimeField(auto_now_add=True) likes = models.ManyToManyField('course.Like', blank=True) + + @property + def img_width(self): + return self.image.image.width if self.image and self.image.image else None + + @property + def img_height(self): + return self.image.image.height if self.image and self.image.image else None diff --git a/apps/content/templates/content/blocks/contest_work.html b/apps/content/templates/content/blocks/contest_work.html deleted file mode 100644 index b80e6e06..00000000 --- a/apps/content/templates/content/blocks/contest_work.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/apps/content/templates/content/contest.html b/apps/content/templates/content/contest.html index 3fe3b7b5..0c3c89a6 100644 --- a/apps/content/templates/content/contest.html +++ b/apps/content/templates/content/contest.html @@ -12,7 +12,7 @@ {{ contest.description }}
- Загрузить свою работу + Загрузить свою работу
@@ -31,13 +31,7 @@
- + diff --git a/apps/content/templates/content/contest_work.html b/apps/content/templates/content/contest_work.html new file mode 100644 index 00000000..32114301 --- /dev/null +++ b/apps/content/templates/content/contest_work.html @@ -0,0 +1,64 @@ +{% extends "templates/lilcity/index.html" %} +{% load static %} +{% block title %}{{ contest_work.child_full_name }}, {{ contest_work.age }} лет{% endblock title %} + +{% block ogimage %}http://{{request.META.HTTP_HOST}}{{ contest_work.image.url }}{% endblock ogimage %} + +{% block content %} +
+ +
+
+ +
+
+
+
{{ contest_work.child_full_name }}
+
{{ contest_work.age }} лет
+
+ +
+
+
+ +
+ +
+ +
+
+{% endblock content %} diff --git a/apps/content/views.py b/apps/content/views.py index 52c3d966..dd25a51e 100644 --- a/apps/content/views.py +++ b/apps/content/views.py @@ -3,7 +3,7 @@ from django.shortcuts import get_object_or_404 from django.utils.decorators import method_decorator from django.views.generic import TemplateView, DetailView -from apps.content.models import Contest +from apps.content.models import Contest, ContestWork @method_decorator(login_required, name='dispatch') @@ -28,3 +28,9 @@ class ContestView(DetailView): model = Contest context_object_name = 'contest' template_name = 'content/contest.html' + + +class ContestWorkView(DetailView): + model = ContestWork + context_object_name = 'contest_work' + template_name = 'content/contest_work.html' diff --git a/project/urls.py b/project/urls.py index b7cb648c..09b355f9 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 +from apps.content.views import ContestEditView, ContestView, ContestWorkView from apps.course.views import ( CoursesView, likes, coursecomment, CourseView, LessonView, SearchView, @@ -86,6 +86,7 @@ urlpatterns = [ path('contest/create', ContestEditView.as_view(), name='contest_create'), 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'), ] diff --git a/web/src/components/ContestWorks.vue b/web/src/components/ContestWorks.vue index 40f35f21..af193876 100644 --- a/web/src/components/ContestWorks.vue +++ b/web/src/components/ContestWorks.vue @@ -1,30 +1,40 @@ diff --git a/web/src/components/UploadContestWork.vue b/web/src/components/UploadContestWork.vue index 4c35296f..346c734b 100644 --- a/web/src/components/UploadContestWork.vue +++ b/web/src/components/UploadContestWork.vue @@ -1,6 +1,6 @@