Merge remote-tracking branch 'origin/dev' into dev

remotes/origin/hasaccess
Vitaly Baev 8 years ago
commit 8e8dea3c55
  1. 34
      apps/course/migrations/0004_auto_20180128_1311.py
  2. 8
      apps/course/models.py
  3. 4
      apps/course/templates/course/_items.html
  4. 37
      apps/course/views.py
  5. 5
      project/urls.py

@ -0,0 +1,34 @@
# Generated by Django 2.0.1 on 2018-01-28 13:11
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('course', '0003_auto_20180126_1347'),
]
operations = [
migrations.CreateModel(
name='Like',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('update_at', models.DateTimeField(auto_now=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.AlterModelOptions(
name='course',
options={'ordering': ['-created_at'], 'verbose_name': 'Курс', 'verbose_name_plural': 'Курсы'},
),
migrations.AddField(
model_name='course',
name='likes',
field=models.ManyToManyField(to='course.Like'),
),
]

@ -8,6 +8,13 @@ from .manager import CategoryQuerySet
User = get_user_model() User = get_user_model()
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
class Course(models.Model): class Course(models.Model):
STATUS_CHOICES = ( STATUS_CHOICES = (
(0, 'Pending'), (0, 'Pending'),
@ -26,6 +33,7 @@ class Course(models.Model):
is_featured = models.BooleanField(default=False) is_featured = models.BooleanField(default=False)
url = models.URLField('Ссылка', default='') url = models.URLField('Ссылка', default='')
status = models.PositiveSmallIntegerField('Статус', default=0, choices=STATUS_CHOICES) status = models.PositiveSmallIntegerField('Статус', default=0, choices=STATUS_CHOICES)
likes = models.ManyToManyField(Like)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True) update_at = models.DateTimeField(auto_now=True)

@ -1,6 +1,6 @@
{% load static %} {% load static %}
<div class="courses__item"><a class="courses__preview" href="#"><img class="courses__pic" src="{{ course.cover.url }}"/> <div class="courses__item" data-course data-course-id={{ course.id }} data-likes-count={{ course.likes.count }}><a class="courses__preview" href="#"><img class="courses__pic" src="{{ course.cover.url }}"/>
<div class="courses__view">Подробнее</div> <div class="courses__view">Подробнее</div>
{% if course.is_featured %} {% if course.is_featured %}
<div class="courses__label courses__label_fav"></div> <div class="courses__label courses__label_fav"></div>
@ -26,7 +26,7 @@
<div class="user__meta"> <div class="user__meta">
<div class="user__date">{{ course.created_at_humanize }}</div> <div class="user__date">{{ course.created_at_humanize }}</div>
<a class="user__likes likes" href="#"> <a class="user__likes likes" href="#">
<div class="likes__counter">253</div> <div class="likes__counter">{{ course.likes.count }}</div>
<div class="likes__icon"> <div class="likes__icon">
<svg class="icon icon-like"> <svg class="icon icon-like">
<use xlink:href="{% get_static_prefix %}img/sprite.svg#icon-like"></use> <use xlink:href="{% get_static_prefix %}img/sprite.svg#icon-like"></use>

@ -1,11 +1,42 @@
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse from django.http import JsonResponse
from django.views.generic import ListView
from django.template import loader from django.template import loader
from django.views.generic import View, ListView
from .models import Course from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from .models import Course, Like
from .filters import CourseFilter from .filters import CourseFilter
@login_required
@csrf_exempt
@require_http_methods(['POST'])
def likes(request, course_id):
try:
course = Course.objects.prefetch_related('likes').get(id=course_id)
except Course.DoesNotExist:
return JsonResponse({
'success': False,
'errors': ['Course with id f{cource_id} not found']
})
else:
course_user_likes = course.likes.filter(user=request.user)
if course_user_likes.exists():
is_liked = False
for _course in course_user_likes.all():
course.likes.remove(_course)
course_user_likes.delete()
else:
is_liked = True
course.likes.add(Like.objects.create(user=request.user))
count = course.likes.count()
return JsonResponse({
"success": True,
"likes_count": count,
"is_liked": is_liked,
})
class CoursesView(ListView): class CoursesView(ListView):
model = Course model = Course
context_object_name = 'course_items' context_object_name = 'course_items'

@ -18,16 +18,17 @@ from django.urls import path, include
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.conf import settings from django.conf import settings
from apps.course.views import CoursesView from apps.course.views import CoursesView, likes
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('auth/', include(('apps.auth.urls', 'lilcity'))), path('auth/', include(('apps.auth.urls', 'lilcity'))),
path('courses/', CoursesView.as_view(), name='courses'), path('courses/', CoursesView.as_view(), name='courses'),
path('courses/<int:course_id>/like/', likes, name='likes'),
path('', TemplateView.as_view(template_name="templates/lilcity/main.html"), name='index'), path('', TemplateView.as_view(template_name="templates/lilcity/main.html"), name='index'),
] ]
if settings.DEBUG: if settings.DEBUG:
from django.conf.urls.static import static from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Loading…
Cancel
Save