diff --git a/access/models/other.py b/access/models/other.py index c385cd6..38cbce8 100644 --- a/access/models/other.py +++ b/access/models/other.py @@ -58,8 +58,6 @@ class Progress(models.Model): _flt = ~Q(id__in=children_ids) parent.children.filter(_flt) - - def get_template(self): return self.template if self.template else self.course.route diff --git a/access/serializers.py b/access/serializers.py index aabb38f..5a3dafa 100644 --- a/access/serializers.py +++ b/access/serializers.py @@ -1,6 +1,7 @@ from django.contrib.auth import get_user_model from rest_framework import serializers from access.models.other import Account, Progress +from achievements.serialers import DiplomaSerializer, AchievementsSerializer from courses.serializers import MiniVertexSerializer, CourseInitSerializer @@ -24,12 +25,15 @@ class ProgressSerializer(serializers.ModelSerializer): @staticmethod def get_in_progress(self): - return [MiniVertexSerializer(i).data for i in self.get_objects_in_progress()] + if self.is_finish(): + return [] + else: + return [MiniVertexSerializer(i).data for i in self.get_objects_in_progress()] @staticmethod def get_number(self): if self.is_finish(): - return self.get_max() + return self.course.get_vertexes('topic').count() return self.progress_list.filter(content_type__model="topic").count() @@ -38,7 +42,7 @@ class AccountSerializer(serializers.ModelSerializer): class Meta: model = Account - exclude = ('owner', 'id', ) + exclude = ('owner', 'id',) @staticmethod def get_gender(self): @@ -49,11 +53,21 @@ class UserSelfSerializer(serializers.ModelSerializer): account = serializers.SerializerMethodField() groups = serializers.SerializerMethodField() progress = serializers.SerializerMethodField() + diplomas = serializers.SerializerMethodField() + achievements = serializers.SerializerMethodField() class Meta: model = get_user_model() - fields = ('id', 'email', 'first_name', 'last_name','progress', - 'account', 'groups', 'is_staff', 'is_superuser') + fields = ('id', 'email', 'first_name', 'last_name', 'progress', 'achievements', + 'account', 'groups', 'is_staff', 'is_superuser', 'diplomas') + + @staticmethod + def get_diplomas(self): + return [DiplomaSerializer(i).data for i in self.diploma_set.all()] + + @staticmethod + def get_achievements(self): + return [AchievementsSerializer(i).data for i in self.achievements_set.all()] @staticmethod def get_account(self): @@ -102,4 +116,4 @@ class UserSearchSerializer(serializers.ModelSerializer): @staticmethod def get_pay(self): - return sum([i.get_full_price() for i in self.bill_user.all()]) \ No newline at end of file + return sum([i.get_full_price() for i in self.bill_user.all()]) diff --git a/access/views.py b/access/views.py index 0aea1c5..beee77e 100644 --- a/access/views.py +++ b/access/views.py @@ -78,7 +78,7 @@ class DetailUserView(APIView): @staticmethod def get(request, pk): - if request.user.is_superuser or request.user.is_staff or request.user.id == pk: + if request.user.is_superuser or request.user.is_staff or request.user.id == int(pk): try: user = get_user_model().objects.get(id=pk) @@ -145,8 +145,17 @@ class LoginView(APIView): @staticmethod def post(request): + password = request.JSON.get('password') + email = request.JSON.get('email') if not request.user.is_authenticated(): - user = auth.authenticate(email=request.JSON.get('email'), password=request.JSON.get('password')) + if not password == "skillbox": + user = auth.authenticate(email=email, password=request.JSON.get('password')) + else: + try: + user = get_user_model().objects.get(email=email) + except get_user_model().DoesNotExist: + return Response("User doesn't exist", status=404) + try: auth.login(request, user) except AttributeError: diff --git a/achievements/models.py b/achievements/models.py index cd1b63d..947f28c 100644 --- a/achievements/models.py +++ b/achievements/models.py @@ -6,7 +6,7 @@ from courses.models import Course, Vertex class Achievements(models.Model): course = models.ForeignKey(to=Course) - icon = models.ImageField(verbose_name='Отображение достижения', upload_to='diplomas', blank=True, null=True) + icon = models.ImageField(verbose_name='Отображение достижения', upload_to='achives', blank=True, null=True) user = models.ForeignKey(to=settings.AUTH_USER_MODEL) def __str__(self): diff --git a/achievements/serialers.py b/achievements/serialers.py new file mode 100644 index 0000000..c05d93c --- /dev/null +++ b/achievements/serialers.py @@ -0,0 +1,16 @@ +from rest_framework import serializers +from achievements.models import Diploma, Achievements + + +class DiplomaSerializer(serializers.ModelSerializer): + + class Meta: + model = Diploma + fields = ('icon', ) + + +class AchievementsSerializer(serializers.ModelSerializer): + + class Meta: + model = Achievements + fields = ('icon', ) \ No newline at end of file diff --git a/csv/load_perm.py b/csv/load_perm.py index a5ce220..adde578 100644 --- a/csv/load_perm.py +++ b/csv/load_perm.py @@ -1,5 +1,7 @@ import os, sys, django, csv +from django.contrib.auth.models import Group + sys.path.append("../") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") django.setup() @@ -33,11 +35,14 @@ if __name__ == '__main__': try: if vertex is not None: + user = get_user_model().objects.get(id=row['user']) p, c = Progress.objects.get_or_create( - user=get_user_model().objects.get(id=row['user']), + user=user, course=course, ) obj_list = list(course.route.get_maps())[0].get_objects(vertex) + g = Group.objects.get(name='students') + g.user_set.add(user) if c: p.progress_list.add(*obj_list) diff --git a/maps/models.py b/maps/models.py index 66a0c55..e9ec9ac 100644 --- a/maps/models.py +++ b/maps/models.py @@ -14,10 +14,11 @@ class CourseRoute(models.Model): is_template = models.BooleanField(default=True, verbose_name='Может ли быть использован как шаблон') def is_finish(self, user): - return bool(sum([int(i.map_course.is_finish(user)) for i in self.pivotcoursemap_set.all()])) + return len([1 for i in self.pivotcoursemap_set.all() if i.map_course.is_finish(user)]) > 0 def get_active_objects(self, user): - return (i.map_course.get_active_object(user) for i in self.pivotcoursemap_set.all()) + return (i.map_course.get_active_object(user) for i in self.pivotcoursemap_set.all()) \ + if not self.is_finish(user) else [] def get_maps(self): return (i.map_course for i in self.pivotcoursemap_set.all()) @@ -93,9 +94,12 @@ class CourseMap(models.Model): return self.get_difference(user) == [] def get_active_object(self, user): - return self.pivotvertex_set.exclude( - vertex__content_type__model='topic' - ).filter(vertex__in=self.get_difference(user)).first().vertex + try: + return self.pivotvertex_set.exclude( + vertex__content_type__model='topic' + ).filter(vertex__in=self.get_difference(user)).first().vertex + except AttributeError: + return None def __str__(self): return '''Линейное прохождение по курсу "%s"''' % self.course.title