Ограничение на журналы (тем, уроков, курсов)

feature/fix_generate_pass
Andrey 8 years ago
parent 7bf00bdc0e
commit b0a22fc55e
  1. 21
      access/migrations/0007_progress_course.py
  2. 20
      access/migrations/0008_auto_20171220_1325.py
  3. 1
      access/models/other.py
  4. 39
      access/serializers.py
  5. 1
      api_v1/urls.py
  6. 10
      course_service/courses/serializers.py
  7. 2
      course_service/courses/urls.py
  8. 11
      course_service/courses/views.py
  9. 5
      csv/load_perm.py
  10. 17
      storage/serializers.py
  11. 4
      storage/urls.py
  12. 45
      storage/views.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-12-20 13:21
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0006_auto_20171220_1228'),
]
operations = [
migrations.AddField(
model_name='progress',
name='course',
field=models.CharField(default='', max_length=15, verbose_name='Токен курса'),
preserve_default=False,
),
]

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-12-20 13:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0007_progress_course'),
]
operations = [
migrations.AlterField(
model_name='progress',
name='course',
field=models.CharField(max_length=127, verbose_name='Слаг курса'),
),
]

@ -48,6 +48,7 @@ class Progress(models.Model):
related_name='teacher_progress') related_name='teacher_progress')
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент')
route = models.CharField(max_length=15, verbose_name='Токен прохождения', blank=True, null=True) route = models.CharField(max_length=15, verbose_name='Токен прохождения', blank=True, null=True)
course = models.CharField(max_length=127, verbose_name='Слаг курса')
def __str__(self): def __str__(self):
return '%s' % (self.user.email,) return '%s' % (self.user.email,)

@ -1,41 +1,32 @@
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from rest_framework import serializers from rest_framework import serializers
from access.models.other import Account, Progress from access.models.other import Account, Progress, PivotProgressVertex
from achievements.serialers import DiplomaSerializer, AchievementsSerializer from achievements.serialers import DiplomaSerializer, AchievementsSerializer
from course_service.courses.serializers import MiniVertexSerializer, CourseInitSerializer
class ProgressSerializer(serializers.ModelSerializer): class PivotProgressSerializer(serializers.ModelSerializer):
max = serializers.SerializerMethodField() status = serializers.SerializerMethodField()
number = serializers.SerializerMethodField()
in_progress = serializers.SerializerMethodField()
course = serializers.SerializerMethodField()
class Meta: class Meta:
model = Progress model = PivotProgressVertex
fields = ('in_progress', 'number', 'max', 'progress_list', 'course') exclude = ('id',)
@staticmethod @staticmethod
def get_max(self): def get_status(self):
return self.course.get_vertexes('topic').count() return self.get_status_display()
@staticmethod
def get_course(self):
return CourseInitSerializer(self.course).data
@staticmethod class ProgressSerializer(serializers.ModelSerializer):
def get_in_progress(self): vertexes = serializers.SerializerMethodField()
if self.is_finish():
return [] class Meta:
else: model = Progress
return [MiniVertexSerializer(i).data for i in self.get_objects_in_progress()] fields = ('route', 'vertexes', 'course')
@staticmethod @staticmethod
def get_number(self): def get_vertexes(self):
if self.is_finish(): return [PivotProgressSerializer(i).data for i in self.pivotprogressvertex_set.all()]
return self.course.get_vertexes('topic').count()
return self.progress_list.filter(content_type__model="topic").count()
class AccountSerializer(serializers.ModelSerializer): class AccountSerializer(serializers.ModelSerializer):

@ -5,4 +5,5 @@ urlpatterns = [
url(r'users/', include('access.urls')), url(r'users/', include('access.urls')),
url(r'library/', include('library.urls')), url(r'library/', include('library.urls')),
url(r'finance/', include('finance.urls')), url(r'finance/', include('finance.urls')),
url(r'storage/', include('storage.urls')),
] ]

@ -20,13 +20,19 @@ class MiniVertexSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Vertex model = Vertex
fields = ('id', 'title', 'free') fields = ('title', 'free', 'token')
class VertexSerializer(MiniVertexSerializer): class VertexSerializer(MiniVertexSerializer):
valid_type = serializers.SerializerMethodField()
class Meta: class Meta:
model = Vertex model = Vertex
fields = '__all__' exclude = ('id', 'topic', 'free')
@staticmethod
def get_valid_type(self):
return self.get_valid_type_display()
class CourseInitSerializer(serializers.ModelSerializer): class CourseInitSerializer(serializers.ModelSerializer):

@ -3,7 +3,7 @@ from django.conf.urls import url
from course_service.courses import views as views from course_service.courses import views as views
urlpatterns = [ urlpatterns = [
url(r'vertex/([0-9]{1,99})/$', views.VertexDetail.as_view()), url(r'vertex/(?P<token>.+)/$', views.VertexDetail.as_view()),
url(r'tree/(?P<slug>.+)/$', views.TreeView.as_view()), url(r'tree/(?P<slug>.+)/$', views.TreeView.as_view()),
url(r'^$', views.CourseListView.as_view()), url(r'^$', views.CourseListView.as_view()),
] ]

@ -36,19 +36,20 @@ class VertexDetail(APIView):
renderer_classes = (JSONRenderer,) renderer_classes = (JSONRenderer,)
@staticmethod @staticmethod
def get(request, pk): def get(request, token):
status = int(request.GET.get('status', '200')) status = int(request.GET.get('status', '200'))
try: try:
vertex = Vertex.objects.get(id=pk) vertex = Vertex.objects.get(token=token)
except Vertex.DoesNotExist: except Vertex.DoesNotExist:
return Response("Vertex doesn't exist", status=404) return Response("Vertex doesn't exist", status=404)
if not vertex.check_vertex(request.user): # if not vertex.check_vertex(request.user):
return Response("permission denied", status=403) # return Response("permission denied", status=403)
# TODO: Доделать систему прав на курс
res = VertexSerializer(vertex).data res = VertexSerializer(vertex).data
progress = vertex.course.progress_set.filter(user=request.user) # progress = vertex.course.progress_set.filter(user=request.user)
# try: # try:
# if progress.exists(): # if progress.exists():
# next_vertex = vertex.get_next(progress[0].get_template()) # next_vertex = vertex.get_next(progress[0].get_template())

@ -21,7 +21,8 @@ if __name__ == '__main__':
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:
route = Course.objects.get(id=row['course']).route.out_key course = Course.objects.get(id=row['course'])
route = course.route.out_key
api = OutApiRoute api = OutApiRoute
list_vertex = OutApiRoute.get_route_matrix(route)[0] list_vertex = OutApiRoute.get_route_matrix(route)[0]
@ -33,11 +34,13 @@ if __name__ == '__main__':
try: try:
p = Progress.objects.get( p = Progress.objects.get(
course=course.slug,
user=user, user=user,
teacher=get_user_model().objects.get(id=row['teacher']), teacher=get_user_model().objects.get(id=row['teacher']),
) )
except Progress.DoesNotExist: except Progress.DoesNotExist:
p = Progress.objects.create( p = Progress.objects.create(
course=course.slug,
user=user, user=user,
teacher=get_user_model().objects.get(id=row['teacher']), teacher=get_user_model().objects.get(id=row['teacher']),
) )

@ -4,14 +4,29 @@ from storage.models import File, Comment
class FileSerializer(serializers.ModelSerializer): class FileSerializer(serializers.ModelSerializer):
upload = serializers.SerializerMethodField()
class Meta: class Meta:
model = File model = File
fields = ('original', 'name',) fields = ('original', 'name', 'upload')
@staticmethod
def get_upload(self):
return 'ok'
class CommentSerializer(serializers.ModelSerializer): class CommentSerializer(serializers.ModelSerializer):
files = serializers.SerializerMethodField()
upload = serializers.SerializerMethodField()
class Meta: class Meta:
model = Comment model = Comment
exclude = ('id', 'key',) exclude = ('id', 'key',)
@staticmethod
def get_files(self):
return [FileSerializer(i).data for i in self.files.all()]
@staticmethod
def get_upload(self):
return 'ok'

@ -2,6 +2,6 @@ from django.conf.urls import url
from storage import views from storage import views
urlpatterns = [ urlpatterns = [
url(r'bills/(?P<pk>.+)/$', views.FileDetailView.as_view()), url(r'files/$', views.FileView.as_view()),
url(r'bills/(?P<pk>.+)/$', views.CommentDetailView.as_view()), url(r'comments/$', views.CommentView.as_view()),
] ]

@ -6,25 +6,42 @@ from storage.models import File, Comment
from storage.serializers import FileSerializer, CommentSerializer from storage.serializers import FileSerializer, CommentSerializer
class FileDetailView(APIView): class FileView(APIView):
renderer_classes = (JSONRenderer,) renderer_classes = (JSONRenderer,)
status_code = 200
@staticmethod @staticmethod
def get(request, pk): def get(request):
try: tokens = request.GET.getlist('tokens', None)
return Response(FileSerializer(File.objects.get(key=pk)).data, status=200) if not tokens:
except File.DoesNotExist: return Response("Attribute tokens not set", status=400)
return Response("File not found", status=404)
file_list = []
class CommentDetailView(APIView): for token in tokens:
try:
file_list.append(FileSerializer(File.objects.get(key=token)).data)
except File.DoesNotExist:
file_list.append({'upload': 'error'})
return Response(file_list, status=200)
class CommentView(APIView):
renderer_classes = (JSONRenderer,) renderer_classes = (JSONRenderer,)
status_code = 200
@staticmethod @staticmethod
def get(request, pk): def get(request):
try: tokens = request.GET.getlist('tokens', None)
return Response(CommentSerializer(Comment.objects.get(key=pk)).data, status=200)
except Comment.DoesNotExist: if not tokens:
return Response("Comment not found", status=404) return Response("Attribute tokens not set", status=400)
comment_list = []
for token in tokens:
try:
comment_list.append(CommentSerializer(Comment.objects.get(key=token)).data)
except Comment.DoesNotExist:
comment_list.append({'upload': 'error'})
return Response(comment_list, status=200)
Loading…
Cancel
Save