diff --git a/apps/auth/backend.py b/apps/auth/backend.py
new file mode 100644
index 00000000..41568b52
--- /dev/null
+++ b/apps/auth/backend.py
@@ -0,0 +1,17 @@
+from django.contrib.auth.backends import ModelBackend
+from django.contrib.auth import get_user_model
+
+User = get_user_model()
+
+
+class CaseInsensitiveModelBackend(ModelBackend):
+
+ def authenticate(self, request, username=None, password=None, **kwargs):
+ if username is None:
+ username = kwargs.get(User.USERNAME_FIELD)
+ try:
+ user = User.objects.get(**{f'{User.USERNAME_FIELD}__iexact': username})
+ if user.check_password(password) and self.user_can_authenticate(user):
+ return user
+ except User.DoesNotExist:
+ return None
diff --git a/apps/auth/forms.py b/apps/auth/forms.py
index 0baea362..e369a8f9 100644
--- a/apps/auth/forms.py
+++ b/apps/auth/forms.py
@@ -6,8 +6,3 @@ class LearnerRegistrationForm(forms.Form):
last_name = forms.CharField()
email = forms.EmailField()
password = forms.CharField()
-
-
-class LoginForm(forms.Form):
- email = forms.CharField()
- password = forms.CharField()
diff --git a/apps/auth/views.py b/apps/auth/views.py
index f6105e75..379ab0a5 100644
--- a/apps/auth/views.py
+++ b/apps/auth/views.py
@@ -33,7 +33,7 @@ class LearnerRegistrationView(FormView):
def form_valid(self, form):
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
- email = form.cleaned_data['email']
+ email = form.cleaned_data['email'].lower()
password = form.cleaned_data['password']
user, created = User.objects.get_or_create(
@@ -170,8 +170,9 @@ class FacebookLoginOrRegistration(View):
"errors": {"email": 'is field required'}
})
else:
+ email = email.lower()
try:
- user = User.objects.get(email=email)
+ user = User.objects.get(email__iexact=email)
except User.DoesNotExist:
first_name = data.get('first_name', '')
last_name = data.get('last_name', '')
diff --git a/apps/course/filters.py b/apps/course/filters.py
index 827079e6..6e4e873e 100644
--- a/apps/course/filters.py
+++ b/apps/course/filters.py
@@ -4,7 +4,7 @@ from .models import Course
class CourseFilter(django_filters.FilterSet):
- category = django_filters.CharFilter(field_name='category__title', lookup_expr='iexact')
+ category = django_filters.CharFilter(field_name='category')
class Meta:
model = Course
diff --git a/apps/course/models.py b/apps/course/models.py
index 942a0593..d4966b3c 100644
--- a/apps/course/models.py
+++ b/apps/course/models.py
@@ -1,4 +1,5 @@
import arrow
+from random import shuffle
from uuid import uuid4
from django.db import models
from django.core.exceptions import ValidationError
@@ -7,6 +8,7 @@ from django.utils.text import slugify
from django.utils.timezone import now
from django.contrib.auth import get_user_model
from django.urls import reverse_lazy
+from django.conf import settings
from polymorphic_tree.models import PolymorphicMPTTModel, PolymorphicTreeForeignKey
from project.mixins import BaseModel, DeactivatedMixin
@@ -97,7 +99,7 @@ class Course(BaseModel, DeactivatedMixin):
class Meta:
verbose_name = 'Курс'
verbose_name_plural = 'Курсы'
- ordering = ['-created_at']
+ ordering = ['-is_featured', ]
def __str__(self):
return str(self.id) + ' ' + self.title
@@ -129,11 +131,11 @@ class Course(BaseModel, DeactivatedMixin):
@property
def deferred_start_at_humanize(self):
- return arrow.get(self.deferred_start_at).humanize(locale='ru')
+ return arrow.get(self.deferred_start_at, settings.TIME_ZONE).humanize(locale='ru')
@property
def created_at_humanize(self):
- return arrow.get(self.created_at).humanize(locale='ru')
+ return arrow.get(self.created_at, settings.TIME_ZONE).humanize(locale='ru')
@property
def is_deferred_start(self):
@@ -148,6 +150,24 @@ class Course(BaseModel, DeactivatedMixin):
def count_videos_in_lessons(self):
return Video.objects.filter(lesson__in=self.lessons.all()).count()
+ @classmethod
+ def shuffle(cls, qs, order_is_featured = True):
+ if order_is_featured:
+ featured = []
+ other = []
+ for c in list(qs):
+ if c.is_featured:
+ featured.append(c)
+ else:
+ other.append(c)
+ shuffle(featured)
+ shuffle(other)
+ return featured + other
+ else:
+ all = list(qs)
+ shuffle(all)
+ return all
+
class Category(models.Model):
title = models.CharField('Название категории', max_length=100)
@@ -234,7 +254,7 @@ class Comment(PolymorphicMPTTModel, DeactivatedMixin):
@property
def created_at_humanize(self):
- return arrow.get(self.created_at).humanize(locale='ru')
+ return arrow.get(self.created_at, settings.TIME_ZONE).humanize(locale='ru')
def __str__(self):
return self.content
diff --git a/apps/course/templates/course/content/imagetext.html b/apps/course/templates/course/content/imagetext.html
index 6385391e..80c6797a 100644
--- a/apps/course/templates/course/content/imagetext.html
+++ b/apps/course/templates/course/content/imagetext.html
@@ -9,7 +9,7 @@
-
-
+