зависимости

feature/fix_generate_pass
Andrey 8 years ago
parent 89150bb294
commit c860e2efd0
  1. 20
      access/migrations/0004_auto_20180117_1558.py
  2. 2
      access/models/progress.py
  3. 1
      access/urls.py
  4. 34
      access/views.py
  5. 61
      csv/load_comments.py
  6. 3
      csv/load_perm.py
  7. 2
      storage/serializers.py
  8. 4
      storage/views.py

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-17 15:58
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0003_auto_20180115_1953'),
]
operations = [
migrations.AlterField(
model_name='progresslesson',
name='date',
field=models.DateTimeField(blank=True, null=True, verbose_name='Дата зачтения задания'),
),
]

@ -28,7 +28,7 @@ class ProgressLesson(models.Model):
progress = models.ForeignKey(to=Progress) progress = models.ForeignKey(to=Progress)
lesson_token = models.UUIDField(verbose_name="Токен урока", editable=False) lesson_token = models.UUIDField(verbose_name="Токен урока", editable=False)
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь",) teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь",)
date = models.DateTimeField(verbose_name='Дата зачтения задания', auto_now_add=True) date = models.DateTimeField(verbose_name='Дата зачтения задания', blank=True, null=True)
STATUSES = Choices('done', 'wait', 'fail') STATUSES = Choices('done', 'wait', 'fail')
status = models.CharField(choices=STATUSES, default=STATUSES.wait, max_length=20) status = models.CharField(choices=STATUSES, default=STATUSES.wait, max_length=20)
comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=[]) comment_tokens = ArrayField(models.UUIDField(verbose_name="Токен комента", editable=False), default=[])

@ -13,4 +13,5 @@ urlpatterns = [
url(r'logout/$', views.LogoutView.as_view()), url(r'logout/$', views.LogoutView.as_view()),
url(r'reset/$', views.ResetPasswordView.as_view()), url(r'reset/$', views.ResetPasswordView.as_view()),
url(r'progress/$', views.UpdateProgress.as_view()), url(r'progress/$', views.UpdateProgress.as_view()),
url(r'progress_dynamic/(?P<token>[0-9A-Fa-f-]+)/$', views.CourseProgressDynamicView.as_view()),
] ]

@ -4,6 +4,7 @@ import string
from django.contrib import auth from django.contrib import auth
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.core.mail import send_mail from django.core.mail import send_mail
from django.db.models import Q from django.db.models import Q
from django.shortcuts import redirect from django.shortcuts import redirect
@ -239,16 +240,16 @@ class UpdateProgress(APIView):
""" """
На вход обязательно передаётся параметр id (id узла). На вход обязательно передаётся параметр id (id узла).
""" """
token = request.JSON.get('token', None) lesson_token = request.JSON.get('lesson_token', None)
course = request.JSON.get('slug', None) course_token = request.JSON.get('course_token', None)
if token is None or course is None: if lesson_token is None or course_token is None:
return Response('Не передан слаг курса или токен урока', status=400) return Response('Не передан слаг курса или токен урока', status=400)
try: try:
p = Progress.objects.get(user=request.user, course=course) p = Progress.objects.get(user=request.user, course=course_token)
try: try:
pv = ProgressLesson.objects.get( pv = ProgressLesson.objects.get(
progress=p, progress=p,
vertex=token, lesson_token=lesson_token,
) )
except ProgressLesson.DoesNotExist: except ProgressLesson.DoesNotExist:
@ -256,9 +257,9 @@ class UpdateProgress(APIView):
date=datetime.datetime.now(), date=datetime.datetime.now(),
teacher=p.teacher, teacher=p.teacher,
progress=p, progress=p,
vertex=token, lesson_token=lesson_token,
) )
pv.status = 2 pv.status = ProgressLesson.STATUSES.done
pv.save() pv.save()
return Response(ProgressLessonSerializer(pv).data, status=200) return Response(ProgressLessonSerializer(pv).data, status=200)
@ -296,3 +297,22 @@ class UserGuardView(APIView):
return res_204 return res_204
return res_403 return res_403
class CourseProgressDynamicView(APIView):
renderer_classes = (JSONRenderer,)
@staticmethod
def get(request, token):
if request.user.is_authenticated() and request.user.is_staff:
try:
progresses = Progress.objects.filter(course_token=token)
res = {}
for i in progresses:
key = i.progresslesson_set.filter(status="done").count()
res[key] = 1 if not key in res.keys() else res[key] + 1
return Response(res, status=200)
except ValidationError:
return Response("Bad request", status=400)
return Response(status=403)

@ -15,7 +15,7 @@ django.setup()
from storage.models import Comment, File from storage.models import Comment, File
from courses.models import Lesson from courses.models import Lesson
from access.models.progress import ProgressLesson from access.models.progress import ProgressLesson, Progress
if __name__ == '__main__': if __name__ == '__main__':
csv.field_size_limit(500 * 1024 * 1024) csv.field_size_limit(500 * 1024 * 1024)
@ -31,28 +31,49 @@ if __name__ == '__main__':
lesson_token=l.token, lesson_token=l.token,
progress__user__email=row['student'], progress__user__email=row['student'],
) )
files = [File.objects.get(id=file) for file in row['files'].split("[")[1].split("]")[0].split(',')
if not file == '']
comment = Comment.objects.create( except ProgressLesson.DoesNotExist:
text=row['text'], try:
email=row['owner__email'], pr = Progress.objects.create(
course_token=l.topic.course.token,
user=get_user_model().objects.get(email=row['student']),
teacher=get_user_model().objects.get(email=row['teacher']),
)
except IntegrityError:
pr = Progress.objects.get(
course_token=l.topic.course.token,
user=get_user_model().objects.get(email=row['student']),
)
p = ProgressLesson.objects.create(
lesson_token=l.token,
teacher=get_user_model().objects.get(email=row['teacher']),
progress=pr,
) )
if row['status'] == 'Одобренно': files = [File.objects.get(id=file) for file in row['files'].split("[")[1].split("]")[0].split(',')
p.status = ProgressLesson.STATUSES.done if not file == '']
p.date = row['date']
elif row['status'] == 'Отклонено':
p.status = ProgressLesson.STATUSES.fail
else:
p.status = ProgressLesson.STATUSES.wait
p.save() comment = Comment.objects.create(
text=row['text'],
email=row['owner__email'],
)
[comment.files.add(file) for file in files] if row['status'] == 'Одобренно':
comment.date = row['date'] p.status = ProgressLesson.STATUSES.done
comment.save() p.date = row['date']
p.comment_tokens.append(comment.token) elif row['status'] == 'Отклонено':
except ProgressLesson.DoesNotExist: p.status = ProgressLesson.STATUSES.fail
pass
p.comment_tokens.append(comment.token)
p.save()
[comment.files.add(file) for file in files]
comment.date = row['date']
comment.save()
for i in ProgressLesson.objects.filter(comment_tokens__isnull=False):
if len(i.comment_tokens) % 2 == 1:
i.status = ProgressLesson.STATUSES.wait
i.save()

@ -21,6 +21,7 @@ from courses.models import Lesson, Course
if __name__ == '__main__': if __name__ == '__main__':
Progress.objects.all().delete() Progress.objects.all().delete()
ProgressLesson.objects.all().delete()
with open('./access/progress.csv') as progress_csv: with open('./access/progress.csv') as progress_csv:
progress_reader = csv.DictReader(progress_csv) progress_reader = csv.DictReader(progress_csv)
for row in progress_reader: for row in progress_reader:
@ -54,5 +55,5 @@ if __name__ == '__main__':
if pivot['date'] and not pivot['date'] == 'None': if pivot['date'] and not pivot['date'] == 'None':
pv.date = datetime.strptime(pivot['date'].split('.')[0], '%Y-%m-%d %H:%M:%S') pv.date = datetime.strptime(pivot['date'].split('.')[0], '%Y-%m-%d %H:%M:%S')
pv.status = 2 pv.status = ProgressLesson.STATUSES.done
pv.save() pv.save()

@ -21,7 +21,7 @@ class CommentSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Comment model = Comment
exclude = ('id', 'key',) exclude = ('id', 'token',)
@staticmethod @staticmethod
def get_files(self): def get_files(self):

@ -19,7 +19,7 @@ class FileView(APIView):
for token in tokens: for token in tokens:
try: try:
file_list.append(FileSerializer(File.objects.get(key=token)).data) file_list.append(FileSerializer(File.objects.get(token=token)).data)
except File.DoesNotExist: except File.DoesNotExist:
file_list.append({'upload': 'error'}) file_list.append({'upload': 'error'})
@ -40,7 +40,7 @@ class CommentView(APIView):
for token in tokens: for token in tokens:
try: try:
comment_list.append(CommentSerializer(Comment.objects.get(key=token)).data) comment_list.append(CommentSerializer(Comment.objects.get(token=token)).data)
except Comment.DoesNotExist: except Comment.DoesNotExist:
comment_list.append({'upload': 'error'}) comment_list.append({'upload': 'error'})

Loading…
Cancel
Save