diff --git a/api/v1/serializers/course.py b/api/v1/serializers/course.py
index 718dad8c..c8be42e9 100644
--- a/api/v1/serializers/course.py
+++ b/api/v1/serializers/course.py
@@ -9,7 +9,7 @@ from apps.course.models import (
Comment, CourseComment, LessonComment,
Material, Lesson,
Like,
- LiveLessonComment)
+ LiveLessonComment, Tag)
from .content import (
ImageObjectSerializer, ContentSerializer, ContentCreateSerializer,
GallerySerializer, )
@@ -19,6 +19,12 @@ from .user import UserSerializer
User = get_user_model()
+class TagSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Tag
+ fields = ('tag',)
+
+
class MaterialCreateSerializer(serializers.ModelSerializer):
class Meta:
@@ -116,6 +122,7 @@ class CourseCreateSerializer(DispatchContentMixin,
)
materials = MaterialSerializer(many=True, required=False)
gallery = GallerySerializer()
+ tags = TagSerializer(many=True, required=False)
class Meta:
model = Course
@@ -145,6 +152,7 @@ class CourseCreateSerializer(DispatchContentMixin,
'content',
'gallery',
'lessons',
+ 'tags',
)
read_only_fields = (
@@ -269,6 +277,7 @@ class CourseSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
gallery = GallerySerializer()
content = ContentSerializer(many=True)
lessons = LessonSerializer(many=True)
+ tags = TagSerializer(many=True, required=False)
class Meta:
model = Course
@@ -298,6 +307,7 @@ class CourseSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
'content',
'gallery',
'lessons',
+ 'tags',
)
read_only_fields = (
diff --git a/api/v1/urls.py b/api/v1/urls.py
index 08434dfc..99921937 100644
--- a/api/v1/urls.py
+++ b/api/v1/urls.py
@@ -19,7 +19,7 @@ from .views import (
SchoolScheduleViewSet, LiveLessonViewSet,
PaymentViewSet, ObjectCommentsViewSet,
ContestViewSet, ContestWorkViewSet, NotifiedAboutBonuses,
- AuthorBalanceUsersViewSet, CaptureEmail, FAQViewSet, UserGalleryViewSet, BonusesViewSet)
+ AuthorBalanceUsersViewSet, CaptureEmail, FAQViewSet, UserGalleryViewSet, BonusesViewSet, TagViewSet)
router = DefaultRouter()
router.register(r'author-requests', AuthorRequestViewSet, base_name='author-requests')
@@ -48,6 +48,7 @@ router.register(r'users', UserViewSet, base_name='users')
router.register(r'user-gallery', UserGalleryViewSet, base_name='user-gallery')
router.register(r'contests', ContestViewSet, base_name='contests')
router.register(r'contest-works', ContestWorkViewSet, base_name='contest_works')
+router.register(r'tags', TagViewSet, base_name='tags')
# router.register(r'configs', ConfigViewSet, base_name='configs')
diff --git a/api/v1/views.py b/api/v1/views.py
index 4bde8660..6123f9e2 100644
--- a/api/v1/views.py
+++ b/api/v1/views.py
@@ -21,7 +21,7 @@ from .serializers.course import (
MaterialSerializer, MaterialCreateSerializer,
LessonSerializer, LessonCreateSerializer,
LikeCreateSerializer, CourseCommentSerializer, LessonCommentSerializer,
- LiveLessonCommentSerializer,)
+ LiveLessonCommentSerializer, TagSerializer)
from .serializers.content import (
BannerSerializer,
ImageSerializer, ImageCreateSerializer,
@@ -60,7 +60,7 @@ from apps.course.models import (
Comment, CourseComment, LessonComment,
Material, Lesson,
Like,
- LiveLessonComment)
+ LiveLessonComment, Tag)
from apps.config.models import Config
from apps.content.models import (
Banner, Image, Text, ImageText, Video,
@@ -774,3 +774,8 @@ class NotifiedAboutBonuses(views.APIView):
b.save()
return Response({'status': 'ok'})
+
+class TagViewSet(ExtendedModelViewSet):
+ queryset = Tag.objects.all()
+ serializer_class = TagSerializer
+ search_fields = ('tag',)
diff --git a/apps/course/migrations/0050_auto_20190815_1537.py b/apps/course/migrations/0050_auto_20190815_1537.py
new file mode 100644
index 00000000..9cab27c1
--- /dev/null
+++ b/apps/course/migrations/0050_auto_20190815_1537.py
@@ -0,0 +1,38 @@
+# Generated by Django 2.0.7 on 2019-08-15 15:37
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('course', '0049_auto_20190207_1551'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='CourseTags',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('course_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Course')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Tag',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('tag', models.CharField(max_length=20)),
+ ],
+ ),
+ migrations.AddField(
+ model_name='coursetags',
+ name='tag_id',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='course.Tag'),
+ ),
+ migrations.AddField(
+ model_name='course',
+ name='tags',
+ field=models.ManyToManyField(blank=True, through='course.CourseTags', to='course.Tag'),
+ ),
+ ]
diff --git a/apps/course/models.py b/apps/course/models.py
index f7ef5f20..bf1383be 100644
--- a/apps/course/models.py
+++ b/apps/course/models.py
@@ -21,6 +21,17 @@ from apps.content.models import ImageObject, Gallery, Video, ContestWork
User = get_user_model()
+def default_slug():
+ return str(uuid4())
+
+
+def deferred_start_at_validator(value):
+ if value < now():
+ raise ValidationError(
+ 'Дата и время начала курса не может быть меньше текущих.',
+ )
+
+
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
ip = models.GenericIPAddressField(blank=True, null=True)
@@ -29,15 +40,13 @@ class Like(models.Model):
update_at = models.DateTimeField(auto_now=True)
-def default_slug():
- return str(uuid4())
+class Tag(models.Model):
+ tag = models.CharField(max_length=20,)
-def deferred_start_at_validator(value):
- if value < now():
- raise ValidationError(
- 'Дата и время начала курса не может быть меньше текущих.',
- )
+class CourseTags(models.Model):
+ tag_id = models.ForeignKey(Tag, on_delete=models.CASCADE)
+ course_id = models.ForeignKey('Course', on_delete=models.CASCADE)
class Course(BaseModel, DeactivatedMixin):
@@ -110,6 +119,7 @@ class Course(BaseModel, DeactivatedMixin):
on_delete=models.CASCADE, null=True, blank=True,
related_name='results_gallery',
)
+ tags = models.ManyToManyField('Tag', through=CourseTags, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
diff --git a/apps/course/templates/course/_items.html b/apps/course/templates/course/_items.html
index 070f5dbc..7730e543 100644
--- a/apps/course/templates/course/_items.html
+++ b/apps/course/templates/course/_items.html
@@ -13,7 +13,6 @@
{% empty %}
{% endthumbnail %}
-
Учите и развивайте креативное мышление когда и где угодно. Если вам не совсем удобно заниматься с нами в прямом эфире каждый день, как в - нашей онлайн-школе, специально для вас мы делаем отдельные уроки в записи, которые вы можете проходить, - когда вам будет удобно.