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

# Conflicts:
#	apps/course/templates/course/course.html
remotes/origin/hasaccess
Vitaly Baev 8 years ago
commit 9370d512e9
  1. 8
      apps/auth/views.py
  2. 162
      apps/course/fixtures/course.json
  3. 2
      apps/course/templates/course/_items.html
  4. 345
      apps/course/templates/course/course.html
  5. 16
      apps/course/templatetags/plural.py
  6. 49
      apps/course/views.py
  7. 2
      apps/notification/templates/notification/email/_base.html
  8. 9
      apps/notification/templates/notification/email/verification_email.html
  9. 25
      apps/user/fixtures/superuser.json
  10. BIN
      media/lessons/kat-watercolor.jpg
  11. BIN
      media/lessons/kat-watercolor_QYFi9sq.jpg
  12. BIN
      media/lessons/kat-watercolor_SA9juHa.jpg
  13. BIN
      media/materials/kat-watercolor.jpg
  14. BIN
      media/materials/shutterstock_125323070-700x861.jpg
  15. BIN
      media/materials/краски.jpeg
  16. 2
      project/settings.py
  17. 2
      project/urls.py

@ -48,7 +48,8 @@ class LearnerRegistrationView(FormView):
# fixme: change email text
# fixme: async send email
token = verification_email_token.make_token(user)
send_email('Verification Email', email, "notification/email/verification_email.html", token=token)
url = self.request.scheme + '://' + self.request.get_host() + str(reverse_lazy('lilcity:verification-email', args=[token]))
send_email('Verification Email', email, "notification/email/verification_email.html", url=url)
return JsonResponse({"success": True}, status=201)
@ -80,9 +81,8 @@ class VerificationEmailView(View):
request.user, kwargs.get('token'))
if is_valid_token:
lilcity_user_settings = request.user.lilcity_user_settings
lilcity_user_settings.is_verification_email = True
lilcity_user_settings.save()
request.user.is_email_proved = True
request.user.save()
return JsonResponse({"success": True})
else:
return JsonResponse({"success": False}, status=400)

@ -6,8 +6,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "1500.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 2,
@ -16,7 +17,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:04:41.113Z",
"update_at": "2018-01-27T07:12:04.168Z"
"update_at": "2018-01-31T15:03:47.118Z",
"likes": [],
"materials": []
}
},
{
@ -26,8 +29,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "1900.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 1,
@ -36,7 +40,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.437Z",
"update_at": "2018-01-27T07:11:55.373Z"
"update_at": "2018-01-31T15:03:47.115Z",
"likes": [],
"materials": []
}
},
{
@ -46,8 +52,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "100.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 9,
@ -56,7 +63,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.442Z",
"update_at": "2018-01-27T07:11:43.838Z"
"update_at": "2018-01-31T15:03:47.112Z",
"likes": [],
"materials": []
}
},
{
@ -66,8 +75,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "400.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 8,
@ -76,7 +86,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.445Z",
"update_at": "2018-01-27T07:11:35.342Z"
"update_at": "2018-01-31T15:03:47.108Z",
"likes": [],
"materials": []
}
},
{
@ -86,8 +98,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "1800.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 7,
@ -96,7 +109,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.449Z",
"update_at": "2018-01-27T07:11:26.725Z"
"update_at": "2018-01-31T15:03:47.104Z",
"likes": [],
"materials": []
}
},
{
@ -106,8 +121,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "100.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 6,
@ -116,7 +132,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.452Z",
"update_at": "2018-01-27T07:11:15.061Z"
"update_at": "2018-01-31T15:03:47.101Z",
"likes": [],
"materials": []
}
},
{
@ -126,8 +144,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "1600.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 5,
@ -136,7 +155,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.455Z",
"update_at": "2018-01-27T07:11:03.583Z"
"update_at": "2018-01-31T15:03:47.097Z",
"likes": [],
"materials": []
}
},
{
@ -146,8 +167,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "1900.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 4,
@ -156,7 +178,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.458Z",
"update_at": "2018-01-27T07:10:52.322Z"
"update_at": "2018-01-31T15:03:47.093Z",
"likes": [],
"materials": []
}
},
{
@ -166,8 +190,9 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "200.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 3,
@ -176,7 +201,9 @@
"url": "https://gitlab.com/",
"status": 0,
"created_at": "2018-01-27T07:09:03.461Z",
"update_at": "2018-01-27T07:10:42.721Z"
"update_at": "2018-01-31T15:03:47.089Z",
"likes": [],
"materials": []
}
},
{
@ -186,17 +213,24 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "800.00",
"is_infinite": false,
"deferred_start_at": null,
"category": 2,
"duration": 1,
"is_featured": false,
"is_featured": true,
"url": "https://gitlab.com/",
"status": 0,
"status": 1,
"created_at": "2018-01-27T07:09:03.464Z",
"update_at": "2018-01-27T07:10:33.374Z"
"update_at": "2018-01-31T15:03:47.086Z",
"likes": [],
"materials": [
1,
2,
3
]
}
},
{
@ -206,17 +240,24 @@
"author": 1,
"title": "\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0439 \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043c \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438",
"short_description": "\u042d\u0442\u043e\u0442 \u043a\u0443\u0440\u0441 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u0442\u044f\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u043e\u0440\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u0435\u043b\u044b\u0439 \u0438 \u0445\u0430\u0440\u0438\u0437\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0445 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439.",
"from_author": "",
"cover": "courses/pic-1_sTaZawQ.jpg",
"price": "50.00",
"price": "100.00",
"is_infinite": false,
"deferred_start_at": null,
"deferred_start_at": "2018-02-28T12:00:00Z",
"category": 1,
"duration": 1,
"is_featured": false,
"url": "https://gitlab.com/",
"status": 0,
"status": 1,
"created_at": "2018-01-27T07:09:03.467Z",
"update_at": "2018-01-27T07:09:03.467Z"
"update_at": "2018-01-31T15:03:47.080Z",
"likes": [],
"materials": [
1,
2,
3
]
}
},
{
@ -281,5 +322,74 @@
"fields": {
"title": "\u0436\u0438\u0432\u043e\u043f\u0438\u0441\u044c"
}
},
{
"model": "course.lesson",
"pk": 1,
"fields": {
"title": "1 \u0423\u0420\u041e\u041a",
"short_description": "\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u044e\u0436\u0435\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043a\u0443\u0440\u0441\u0435 \u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0433\u0435\u0440\u043e\u044f \u0432\u0430\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u0421 \u044d\u0442\u0438\u043c \u0433\u0435\u0440\u043e\u0435\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043a\u0443\u0440\u0441\u0430.",
"course": 11,
"cover": "lessons/kat-watercolor.jpg",
"created_at": "2018-01-31T15:06:14.830Z",
"update_at": "2018-01-31T15:06:14.830Z"
}
},
{
"model": "course.lesson",
"pk": 2,
"fields": {
"title": "2 \u0423\u0420\u041e\u041a",
"short_description": "\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0433\u0435\u0440\u043e\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u041f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u00ab\u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u044b\u00bb. \u0420\u0438\u0441\u0443\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u0431\u0440\u0430\u0437\u0430 \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u0442\u0438\u043b\u0435.\r\n\r\n\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0430\u043c\u044b\u0435 \u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u043d\u0430\u0431\u0440\u043e\u0441\u043a\u0435.",
"course": 11,
"cover": "lessons/kat-watercolor_SA9juHa.jpg",
"created_at": "2018-01-31T15:06:46.772Z",
"update_at": "2018-01-31T15:06:46.772Z"
}
},
{
"model": "course.lesson",
"pk": 3,
"fields": {
"title": "3 \u0423\u0420\u041e\u041a",
"short_description": "\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0436\u0438\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c 5 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0433\u0435\u0440\u043e\u044f \u0438 \u0442\u043e\u0433\u043e \u0441\u044e\u0436\u0435\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u0438\u0435, \u0440\u0438\u0441\u0443\u0435\u043c \u044d\u0441\u043a\u0438\u0437\u044b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u043e\u0437\u0430\u0445 \u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438.\r\n\r\n\u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c 5 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u044d\u043c\u043e\u0446\u0438\u0439 \u0434\u043b\u044f \u0433\u0435\u0440\u043e\u044f, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c. \u041f\u043e \u044d\u043c\u043e\u0446\u0438\u044f\u043c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u044b \u0438 \u0441\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u0445 \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u0442\u0438\u043b\u0435.",
"course": 11,
"cover": "lessons/kat-watercolor_QYFi9sq.jpg",
"created_at": "2018-01-31T15:07:08.979Z",
"update_at": "2018-01-31T15:07:08.979Z"
}
},
{
"model": "course.material",
"pk": 1,
"fields": {
"title": "\u0411\u0443\u043c\u0430\u0433\u0430 \u0430\u043a\u0432\u0430\u0440\u0435\u043b\u044c\u043d\u0430\u044f",
"cover": "materials/kat-watercolor.jpg",
"short_description": "\u0411\u0443\u043c\u0430\u0433\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043a\u0432\u0430\u0440\u0435\u043b\u044c\u044e \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0430\u043a\u0432\u0430\u0440\u0435\u043b\u044c \u2014 \u043a\u0440\u0430\u0441\u043a\u0430 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0444\u0430\u043a\u0442\u0443\u0440\u0430 \u0431\u0443\u043c\u0430\u0433\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043a\u0440\u0430\u0441\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f.",
"created_at": "2018-01-31T14:55:48.394Z",
"update_at": "2018-01-31T14:55:48.394Z"
}
},
{
"model": "course.material",
"pk": 2,
"fields": {
"title": "\u041a\u0438\u0441\u0442\u043e\u0447\u043a\u0438 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f",
"cover": "materials/shutterstock_125323070-700x861.jpg",
"short_description": "\u041a\u0438\u0441\u0442\u044c \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043a\u0440\u0430\u0441\u043a\u0438 \u0438 \u0436\u0438\u0432\u043e\u043f\u0438\u0441\u0438. \u041a\u0438\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0449\u0435\u0442\u0438\u043d\u044b \u0438 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u0445 \u0432\u043e\u043b\u043e\u0441\u043a\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0436\u0438\u0432\u043e\u0442\u043d\u044b\u0445.",
"created_at": "2018-01-31T14:57:37.751Z",
"update_at": "2018-01-31T14:57:37.751Z"
}
},
{
"model": "course.material",
"pk": 3,
"fields": {
"title": "\u041a\u0440\u0430\u0441\u043a\u0438 \u0430\u043a\u0432\u0430\u0440\u0435\u043b\u044c\u043d\u044b\u0435",
"cover": "materials/\u043a\u0440\u0430\u0441\u043a\u0438.jpeg",
"short_description": "\u0417\u0430\u0432\u043e\u0434 \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043a\u0440\u0430\u0441\u043e\u043a \u00ab\u041d\u0435\u0432\u0441\u043a\u0430\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\u00bb \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0430\u043a\u0432\u0430\u0440\u0435\u043b\u044c 80 \u043b\u0435\u0442, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0434\u0443\u043a\u0446\u0438\u0438 \u0432\u044b\u0441\u043e\u0447\u0430\u0439\u0448\u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0435\u0446\u0435\u043f\u0442\u0443\u0440\u044b, \u043e\u0442\u043b\u0430\u0436\u0435\u043d\u043d\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0438\u0437\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0430\u043a\u0432\u0430\u0440\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u0440\u0430\u0441\u043a\u0438 \u0432\u0438\u0437\u0438\u0442\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0432 \u0420\u043e\u0441\u0441\u0438\u0438",
"created_at": "2018-01-31T14:58:46.209Z",
"update_at": "2018-01-31T14:58:46.209Z"
}
}
]

@ -23,7 +23,7 @@
<a class="courses__theme theme {{ theme_color }}"
href="{% url 'courses' %}?category={{ course.category.title }}">{{ course.category | upper }}</a>
{% if not course.is_free %}
<div class="courses__price">{{ course.price|floatformat:"-2" }}$</div>
<div class="courses__price">{{ course.price|floatformat:"-2" }}</div>
{% endif %}
</div>
<a class="courses__title" href="{% url 'course' course.id %}">{{ course.title }}</a>

@ -1,42 +1,62 @@
{% extends "templates/lilcity/index.html" %}
{% load static %}
{% load data_liked from data_liked %}
{% load rupluralize from plural %}
{% block title %}{{ course.title }} - {{ block.super }}{% endblock title %}
{% block content %}
<div class="section section_border">
<div class="section__center center center_sm">
<div class="go">
<a class="go__item" href="#">
<div class="go__arrow"><svg class="icon icon-arrow-left"><use xlink:href="{% static '/img/sprite.svg' %}#icon-arrow-left"></use></svg></div>
<a class="go__item" href="{% url 'courses' %}">
<div class="go__arrow">
<svg class="icon icon-arrow-left">
<use xlink:href="{% static '/img/sprite.svg' %}#icon-arrow-left"></use>
</svg>
</div>
<div class="go__title">Вернуться</div>
</a><button class="go__btn btn btn_md" data-popup=".js-popup-buy">КУПИТЬ КУРС</button></div>
<div class="course" data-course data-course-id={{ course.id }} data-likes-count={{ course.likes.count }} {% if course.is_deferred_start %}data-future-course data-future-course-time={{ course.deferred_start_at.timestamp }}{% endif %}>
</a>
<button class="go__btn btn btn_md" data-popup=".js-popup-buy">КУПИТЬ КУРС</button>
</div>
<div
class="course"
data-course data-course-id={{ course.id }}
data-likes-count={{ course.likes.count }}
{% if course.is_deferred_start %}data-future-course data-future-course-time={{ course.deferred_start_at.timestamp }}{% endif %}
>
<div class="course__head">
<div class="course__theme theme theme_green">{{ course.category.title | upper }}</div>
{% data_liked user course as liked %}
<a class="course__likes likes{% if liked %} active{% endif %}"
{% if user.is_authenticated != true %}data-popup=".js-popup-auth"{% endif %}
data-course-likes
{% if liked %}
data-liked=1
{% else %}
data-liked=0
{% endif %}
data-course-likes-count="{{ course.likes.count }}"
data-course-id="{{ course.id }}"
href="#">
<a
class="course__likes likes{% if liked %} active{% endif %}"
{% if user.is_authenticated != true %}data-popup=".js-popup-auth"{% endif %}
data-course-likes
{% if liked %} data-liked=1 {% else %} data-liked=0 {% endif %}
data-course-likes-count="{{ course.likes.count }}"
data-course-id="{{ course.id }}"
href="#"
>
<div class="likes__counter">{{ course.likes.count }}</div>
<div class="likes__icon"><svg class="icon icon-like-bold"><use xlink:href="{% static 'img/sprite.svg' %}#icon-like-bold"></use></svg><svg class="icon icon-like-fill-bold"><use xlink:href="{% static '/img/sprite.svg' %}#icon-like-fill-bold"></use></svg></div>
<div class="likes__icon">
<svg class="icon icon-like-bold">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-like-bold"></use>
</svg>
<svg class="icon icon-like-fill-bold">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-like-fill-bold"></use>
</svg>
</div>
</a>
</div>
<div class="course__title title">{{ course.title }}</div>
<div class="course__content">{{ course.short_description }}</div>
<div class="course__user user">
{% if course.author.photo %}
<div class="user__ava ava"><img class="ava__pic" src="{{ course.author.photo.url }}"></div>
<div class="user__ava ava">
<img class="ava__pic" src="{{ course.author.photo.url }}">
</div>
{% else %}
<div class="user__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="user__ava ava">
<img class="ava__pic" src="{% static 'img/user.jpg' %}">
</div>
{% endif %}
<div class="user__info">
<div class="user__name">{{ course.author.get_full_name }}</div>
@ -48,79 +68,149 @@
<div class="course__metas">
<div class="course__meta meta">
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-time"><use xlink:href="{% static 'img/sprite.svg' %}#icon-time"></use></svg></div>
<div class="meta__title">{{ course.duration }}</div>
<div class="meta__icon">
<svg class="icon icon-time">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-time"></use>
</svg>
</div>
<div class="meta__title">{{ course.duration | rupluralize:"день,дня,дней" }}</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-date"><use xlink:href="{% static 'img/sprite.svg' %}#icon-date"></use></svg></div>
<div class="meta__icon">
<svg class="icon icon-date">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-date"></use>
</svg>
</div>
<div class="meta__title">15 ноября</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-money"><use xlink:href="{% static 'img/sprite.svg' %}#icon-money"></use></svg></div>
<div class="meta__title">{{ course.price|floatformat:"-2" }}$</div>
<div class="meta__icon">
<svg class="icon icon-money">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-money"></use>
</svg>
</div>
<div class="meta__title">{{ course.price|floatformat:"-2" }}₽</div>
</div>
</div>
<div class="course__meta meta">
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-showcase"><use xlink:href="{% static 'img/sprite.svg' %}#icon-showcase"></use></svg></div>
<div class="meta__title">{{ course.lessons.count }}</div>
<div class="meta__icon">
<svg class="icon icon-showcase">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-showcase"></use>
</svg>
</div>
<div class="meta__title">{{ course.lessons.count | rupluralize:"урок,урока,уроков" }}</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-video"><use xlink:href="{% static 'img/sprite.svg' %}#icon-video"></use></svg></div>
<div class="meta__icon">
<svg class="icon icon-video">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-video"></use>
</svg>
</div>
<div class="meta__title">12 видео</div>
</div>
</div>
</div>
<div class="course__actions"><button class="course__action btn btn_lg btn_stroke">Описание курса</button><button class="course__action btn btn_lg btn_gray">УРОКИ<svg class="icon icon-lock"><use xlink:href="{% static 'img/sprite.svg' %}#icon-lock"></use></svg></button></div><a class="course__video video"
href="#"><img class="video__pic" src="{% static 'img/video-1.jpg' %}"><svg class="icon icon-play"><use xlink:href="{% static 'img/sprite.svg' %}#icon-play"></use></svg></a>
<div class="course__actions">
<button class="course__action btn btn_lg btn_stroke">Описание курса</button>
<button class="course__action btn btn_lg btn_gray">УРОКИ
<svg class="icon icon-lock">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-lock"></use>
</svg>
</button>
</div>
<a class="course__video video" href="#">
<img class="video__pic" src="{% static 'img/video-1.jpg' %}">
{% if course.is_deferred_start %}
<div class="video__soon">
<div class="video__title">Курс начнется:</div>
<div class="video__time">{{ course.deferred_start_at_humanize }}</div>
</div>
{% else %}
<svg class="icon icon-play">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-play"></use>
</svg>
{% endif %}
</a>
<div class="course__share share share_sm">
<div class="share__title">Поделиться курсом</div>
<div class="share__list"><a class="share__item" href="#"><svg class="icon icon-share-facebook"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-facebook"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-twitter"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-twitter"></use></svg></a>
<a
class="share__item" href="#"><svg class="icon icon-share-google"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-google"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-pinterest"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-pinterest"></use></svg></a></div>
<div class="share__list">
<a class="share__item" href="#">
<svg class="icon icon-share-facebook">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-facebook"></use>
</svg>
</a>
<a class="share__item" href="#">
<svg class="icon icon-share-twitter">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-twitter"></use>
</svg>
</a>
<a class="share__item" href="#">
<svg class="icon icon-share-google">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-google"></use>
</svg>
</a>
<a class="share__item" href="#">
<svg class="icon icon-share-pinterest">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-pinterest"></use>
</svg>
</a>
</div>
</div>
</div>
{% if course.from_author %}
{% if course.from_author %}
<div class="author">
<div class="author__title title">От автора</div>
<div class="author__row">
{% if course.author.photo %}
<div class="author__ava ava"><img class="ava__pic" src="{{ course.author.photo.url }}"></div>
<div class="author__ava ava">
<img class="ava__pic" src="{{ course.author.photo.url }}">
</div>
{% else %}
<div class="author__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="author__ava ava">
<img class="ava__pic" src="{% static 'img/user.jpg' %}">
</div>
{% endif %}
<div class="author__wrap">
<div class="author__hi">Привет всем!</div>
<div class="author__content">
{{ course.from_author }}
</div><a class="author__name" href="#">{{ course.author.get_full_name }}</a></div>
</div>
<a class="author__name" href="#">{{ course.author.get_full_name }}</a>
</div>
</div>
</div>
{% endif %}
</div>
{% endif %}
</div>
<div class="section">
<div class="section__center center center_sm">
<div class="lessons">
<div class="lessons__title title">Содержание курса</div>
<div class="lessons__list">
{% for lesson in course.lessons.all %}
<a href="{% url 'lesson' pk=lesson.id %}">
<div class="lessons__item">
<div class="lessons__subtitle subtitle">{{ lesson.title }}</div>
<div class="lessons__row">
{% if lesson.cover %}
<div class="lessons__preview"><img class="lessons__pic" src="{{ lesson.cover.url }}"></div>
{% else %}
<div class="lessons__preview"><img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}"></div>
{% endif %}
<div class="lessons__content">{{ lesson.short_description | safe }}</div>
{% for lesson in course.lessons.all %}
<a href="{% url 'lesson' pk=lesson.id %}">
<div class="lessons__item">
<div class="lessons__subtitle subtitle">{{ lesson.title }}</div>
<div class="lessons__row">
{% if lesson.cover %}
<div class="lessons__preview">
<img class="lessons__pic" src="{{ lesson.cover.url }}">
</div>
{% else %}
<div class="lessons__preview">
<img class="lessons__pic" src="{% static 'img/pic-3.jpg' %}">
</div>
{% endif %}
<div class="lessons__content">{{ lesson.short_description | safe }}</div>
</div>
</a>
</div>
</a>
{% endfor %}
</div>
<div class="lessons__load load"><button class="load__btn btn">еще</button></div>
{% comment %} <div class="lessons__load load">
<button class="load__btn btn">еще</button>
</div> {% endcomment %}
</div>
</div>
</div>
@ -128,13 +218,17 @@
<div class="section__center center center_sm">
<div class="title">Материалы, которые понадобятся</div>
<div class="materials">
{% for material in course.materials.all %}
{% for material in course.materials.all %}
<div class="materials__item">
{% if material.cover %}
<div class="materials__preview"><img class="materials__pic" src="{{ material.cover.url }}"></div>
<div class="materials__preview">
<img class="materials__pic" src="{{ material.cover.url }}">
</div>
{% else %}
<div class="materials__preview"><img class="materials__pic" src="{% static 'img/pic-3.jpg' %}"></div>
{% endif %}
<div class="materials__preview">
<img class="materials__pic" src="{% static 'img/pic-3.jpg' %}">
</div>
{% endif %}
<div class="materials__wrap">
<div class="materials__title">{{ material.title }}</div>
<div class="materials__content">{{ material.short_description }}</div>
@ -148,18 +242,42 @@
<div class="section__center center center_sm">
<div class="title">Галерея итогов обучения</div>
<div class="examples">
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item"><img class="examples__pic" src="{% static 'img/box.jpg' %}"></div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
<div class="examples__item">
<img class="examples__pic" src="{% static 'img/box.jpg' %}">
</div>
</div>
</div>
</div>
@ -168,7 +286,7 @@
<div class="course__head">
<div class="course__theme theme theme_green">ПЕРСОНАЖИ</div>
<a class="course__likes likes{% if liked %} active{% endif %}"
{% if user.is_authenticated != true %}data-popup=".js-popup-auth"{% endif %}
{% if user.is_authenticated != true %}data-popup=".js-popup-auth"{% endif %}
data-course-likes
{% if liked %}
data-liked=1
@ -179,6 +297,14 @@
data-course-id="{{ course.id }}"
href="#">
<div class="likes__counter">{{ course.likes.count }}</div>
<div class="likes__icon">
<svg class="icon icon-like-bold">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-like-bold"></use>
</svg>
<svg class="icon icon-like-fill-bold">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-like-fill-bold"></use>
</svg>
</div>
<div class="likes__icon"><svg class="icon icon-like-bold"><use xlink:href="{% static 'img/sprite.svg' %}#icon-like-bold"></use></svg><svg class="icon icon-like-fill-bold"><use xlink:href="{% static 'img/sprite.svg' %}#icon-like-fill-bold"></use></svg></div>
</a>
</div>
@ -186,9 +312,13 @@
<div class="course__content">Этот курс поможет детям узнать о том как из простых форм создавать веселый и харизматичных персонажей.</div>
<div class="course__user user user_white">
{% if course.author.photo %}
<div class="user__ava ava"><img class="ava__pic" src="{{ course.author.photo.url }}"></div>
<div class="user__ava ava">
<img class="ava__pic" src="{{ course.author.photo.url }}">
</div>
{% else %}
<div class="user__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="user__ava ava">
<img class="ava__pic" src="{% static 'img/user.jpg' %}">
</div>
{% endif %}
<div class="user__info">
<div class="user__name">{{ course.author.get_full_name }}</div>
@ -200,18 +330,32 @@
<div class="course__info">
<div class="course__meta meta meta_white">
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-time"><use xlink:href="{% static 'img/sprite.svg' %}#icon-time"></use></svg></div>
<div class="meta__title">{{ course.duration }}</div>
<div class="meta__icon">
<svg class="icon icon-time">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-time"></use>
</svg>
</div>
<div class="meta__title">{{ course.duration | rupluralize:"день,дня,дней" }}</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-date"><use xlink:href="{% static 'img/sprite.svg' %}#icon-date"></use></svg></div>
<div class="meta__icon">
<svg class="icon icon-date">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-date"></use>
</svg>
</div>
<div class="meta__title">15 ноября</div>
</div>
<div class="meta__item">
<div class="meta__icon"><svg class="icon icon-money"><use xlink:href="{% static 'img/sprite.svg' %}#icon-money"></use></svg></div>
<div class="meta__title">{{ course.price|floatformat:"-2" }}$</div>
<div class="meta__icon">
<svg class="icon icon-money">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-money"></use>
</svg>
</div>
<div class="meta__title">{{ course.price|floatformat:"-2" }}₽</div>
</div>
</div><button class="course__buy btn btn_md" data-popup=".js-popup-buy">КУПИТЬ КУРС</button></div>
</div>
<button class="course__buy btn btn_md" data-popup=".js-popup-buy">КУПИТЬ КУРС</button>
</div>
</div>
</div>
<div class="section section_gray">
@ -221,24 +365,26 @@
<div class="questions">
<form class="questions__form" method="post" action="{% url 'coursecomment' course_id=course.id %}">
<input type="hidden" name="reply_id">
<div class="questions__ava ava"><img class="ava__pic" src="{% static 'img/user.jpg' %}"></div>
<div class="questions__ava ava">
<img class="ava__pic" src="{% static 'img/user.jpg' %}">
</div>
<div class="questions__wrap">
{% if user.is_authenticated %}
<div class="questions__reply-info">В ответ на <a
href="" class="questions__reply-anchor">этот комментарий</a>. <a href="#"
class="questions__reply-cancel grey-link">Отменить</a>
</div>
<div class="questions__field"><textarea class="questions__textarea"
placeholder="Спросите автора курса интересующие вас вопросы"></textarea>
</div>
<button class="questions__btn btn btn_light">ОТПРАВИТЬ</button>
<div class="questions__reply-info">В ответ на
<a href="" class="questions__reply-anchor">этот комментарий</a>.
<a href="#" class="questions__reply-cancel grey-link">Отменить</a>
</div>
<div class="questions__field">
<textarea class="questions__textarea" placeholder="Спросите автора курса интересующие вас вопросы"></textarea>
</div>
<button class="questions__btn btn btn_light">ОТПРАВИТЬ</button>
{% else %}
<div>Только зарегистрированные пользователи могут оставлять комментарии.</div>
<div>Только зарегистрированные пользователи могут оставлять комментарии.</div>
{% endif %}
</div>
</form>
<div class="questions__list">
{% include "./blocks/comments.html" with object=course %}
{% include "./blocks/comments.html" with object=course %}
</div>
</div>
</div>
@ -247,10 +393,29 @@
<div class="section__center center center_sm">
<div class="share">
<div class="share__title">Поделиться курсом</div>
<div class="share__list"><a class="share__item" href="#"><svg class="icon icon-share-facebook"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-facebook"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-twitter"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-twitter"></use></svg></a>
<a
class="share__item" href="#"><svg class="icon icon-share-google"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-google"></use></svg></a><a class="share__item" href="#"><svg class="icon icon-share-pinterest"><use xlink:href="{% static 'img/sprite.svg' %}#icon-share-pinterest"></use></svg></a></div>
<div class="share__list">
<a class="share__item" href="#">
<svg class="icon icon-share-facebook">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-facebook"></use>
</svg>
</a>
<a class="share__item" href="#">
<svg class="icon icon-share-twitter">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-twitter"></use>
</svg>
</a>
<a class="share__item" href="#">
<svg class="icon icon-share-google">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-google"></use>
</svg>
</a>
<a class="share__item" href="#">
<svg class="icon icon-share-pinterest">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-share-pinterest"></use>
</svg>
</a>
</div>
</div>
</div>
</div>
{% endblock content %}
{% endblock content %}

@ -0,0 +1,16 @@
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter(is_safe=False)
@stringfilter
def rupluralize(value, arg):
args = arg.split(',')
try:
value = str(0 if not value or int(value) <= 0 else value)[-1:]
return value + ' ' + args[0 if value == '1' else (1 if value in '234' else 2)]
except:
raise template.TemplateSyntaxError
return ''

@ -87,6 +87,55 @@ def coursecomment(request, course_id):
})
@login_required
@csrf_exempt
@require_http_methods(['POST'])
def lessoncomment(request, Lesson):
try:
lesson = Lesson.objects.get(id=lesson_id)
except Lesson.DoesNotExist:
return JsonResponse({
'success': False,
'errors': ['Lesson with id f{lesson_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):
lessoncomment = LessonComment.objects.create(
author=request.user,
content=comment,
course=course,
)
else:
try:
_lessoncomment = LessonComment.objects.get(id=reply_to)
except LessonComment.DoesNotExist:
return JsonResponse({
'success': False,
'errors': ['CourseComment with id f{reply_to} not found']
}, status=400)
else:
lessoncomment = LessonComment.objects.create(
author=request.user,
content=comment,
course=course,
parent=_lessoncomment,
)
ctx = {'node': lessoncomment, 'user': request.user}
html = loader.render_to_string('course/blocks/comment.html', ctx)
return JsonResponse({
'success': True,
'comment': html,
})
class CourseView(DetailView):
model = Course
context_object_name = 'course'

@ -61,7 +61,7 @@
</a>
</td>
<td style="width:33.33%;padding:35px 0;vertical-align:middle;text-align:right">
<a href="#" style="font-size:12px;color:#888888">Отписаться от рассылки</a>
{% comment %} <a href="#" style="font-size:12px;color:#888888">Отписаться от рассылки</a> {% endcomment %}
</td>
</tr>
</tbody>

@ -1,5 +1,10 @@
{% extends "notification/email/_base.html" %}
{% block content %}
{{ token }}
{% endblock content %}
<p style="margin: 0 0 20px">Спасибо за регистрацию! Для продолжения работы, подтвердите, пожалуйста, электронную почту.</p>
<div style="margin-bottom: 10px;">
<a href="{{url}}" style="text-decoration: none; position: relative; padding: 13px 24px 12px; background-image: linear-gradient(-225deg, #D1FF7F 0%, #56FFFD 100%); border-radius: 3px; font-size: 12px; color: #191919; text-transform: uppercase; letter-spacing: 2px; text-align: center; transition: all .2s; z-index: 2;">Нажмите для подтверждения</a>
<p>Или скопируйте ссылку ниже, и вставьте её в адресную строку браузера.</p>
<p>{{ url }}</p>
</div>
{% endblock content %}

@ -4,29 +4,30 @@
"pk": 1,
"fields": {
"password": "pbkdf2_sha256$100000$HoGxjmAQy4yo$3u+CrUiFtooddpg16OEUaSSjqUlwgFUBP1gt75hEoJs=",
"last_login": "2018-01-28T08:41:44.702Z",
"last_login": "2018-01-31T14:51:34Z",
"is_superuser": true,
"username": "admin@lil.city",
"first_name": "",
"last_name": "",
"first_name": "Lil",
"last_name": "City",
"is_staff": true,
"is_active": true,
"date_joined": "2018-01-28T08:41:19.690Z",
"date_joined": "2018-01-28T08:41:19Z",
"email": "admin@lil.city",
"role": 0,
"gender": "",
"gender": "n",
"country": "",
"city": "",
"about": "",
"instagram": "",
"facebook": "",
"twitter": "",
"pinterest": "",
"youtube": "",
"vkontakte": "",
"about": "\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430 \u041f\u0425\u0423 \u0438\u043c \u041a.\u0410.\u0421\u0430\u0432\u0438\u0446\u043a\u043e\u0433\u043e \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a \u0442\u0435\u0430\u0442\u0440\u0430 \u0438 \u043a\u0438\u043d\u043e. \u0420\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u043c\u0438 \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u043c\u0438 \u0438 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u044b\u043c\u0438 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u043c\u0438. \u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0438 \u043f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u044b\u0445 \u0432\u044b\u0441\u0442\u0430\u0432\u043e\u043a. \u041e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \"Lil City\".",
"instagram": null,
"facebook": null,
"twitter": null,
"pinterest": null,
"youtube": null,
"vkontakte": null,
"fb_id": null,
"fb_data": {},
"is_email_proved": false,
"photo": "",
"groups": [],
"user_permissions": []
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

@ -127,7 +127,7 @@ AUTH_USER_MODEL = 'user.User'
# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ru-RU'
TIME_ZONE = 'UTC'

@ -21,6 +21,7 @@ from django.conf import settings
from apps.course.views import (
CoursesView, likes, coursecomment,
CourseView, LessonView, SearchView,
lessoncomment,
)
from apps.user.views import UserView
@ -32,6 +33,7 @@ urlpatterns = [
path('course/<int:course_id>/like', likes, name='likes'),
path('course/<int:course_id>/comment', coursecomment, name='coursecomment'),
path('lesson/<int:pk>/', LessonView.as_view(), name='lesson'),
path('lesson/<int:lesson_id>/comment', lessoncomment, name='lessoncomment'),
path('search/', SearchView.as_view(), name='search'),
path('user/<int:pk>/', UserView.as_view(), name='user'),
path('', TemplateView.as_view(template_name="templates/lilcity/main.html"), name='index'),

Loading…
Cancel
Save