parent
e97c343995
commit
f41af94e52
21 changed files with 326 additions and 164 deletions
@ -0,0 +1,76 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2017-12-12 23:07 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.conf import settings |
||||||
|
from django.db import migrations, models |
||||||
|
import django.db.models.deletion |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('courses', '0002_auto_20171212_2307'), |
||||||
|
('auth', '0008_alter_user_username_max_length'), |
||||||
|
('maps', '0001_initial'), |
||||||
|
('access', '0001_initial'), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.AddField( |
||||||
|
model_name='progress', |
||||||
|
name='course', |
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='Курс'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='progress', |
||||||
|
name='teacher', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teacher_progress', to=settings.AUTH_USER_MODEL, verbose_name='Преподователь по умолчанию'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='progress', |
||||||
|
name='template', |
||||||
|
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='maps.CourseRoute', verbose_name='Шаблон для прохождения если не указан явно смотри функцию get_template()'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='progress', |
||||||
|
name='user', |
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Студент'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='pivotprogressvertex', |
||||||
|
name='progress', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.Progress'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='pivotprogressvertex', |
||||||
|
name='vertex', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Vertex'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='invite', |
||||||
|
name='owner', |
||||||
|
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Кому приглошение'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='account', |
||||||
|
name='owner', |
||||||
|
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='user', |
||||||
|
name='groups', |
||||||
|
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='user', |
||||||
|
name='user_permissions', |
||||||
|
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), |
||||||
|
), |
||||||
|
migrations.AlterUniqueTogether( |
||||||
|
name='progress', |
||||||
|
unique_together=set([('user', 'course')]), |
||||||
|
), |
||||||
|
] |
||||||
@ -0,0 +1,51 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2017-12-12 23:07 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.conf import settings |
||||||
|
from django.db import migrations, models |
||||||
|
import django.db.models.deletion |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('courses', '0001_initial'), |
||||||
|
('achievements', '0001_initial'), |
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.AddField( |
||||||
|
model_name='skillj', |
||||||
|
name='lesson', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Vertex', verbose_name='Урок'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='skillj', |
||||||
|
name='skill', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='achievements.Skills', verbose_name='Навык'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='diplomagen', |
||||||
|
name='course', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='diploma', |
||||||
|
name='template', |
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='achievements.DiplomaGen', verbose_name='Использовать шаблон'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='diploma', |
||||||
|
name='user', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='achievements', |
||||||
|
name='users', |
||||||
|
field=models.ManyToManyField(to=settings.AUTH_USER_MODEL), |
||||||
|
), |
||||||
|
] |
||||||
@ -1,9 +1,7 @@ |
|||||||
from django.contrib import admin |
from django.contrib import admin |
||||||
|
|
||||||
from courses.models import Course, Tutorial, Topic, Task, Vertex |
from courses.models import Course, Topic, Vertex |
||||||
|
|
||||||
admin.site.register(Topic) |
admin.site.register(Topic) |
||||||
admin.site.register(Task) |
|
||||||
admin.site.register(Vertex) |
admin.site.register(Vertex) |
||||||
admin.site.register(Tutorial) |
|
||||||
admin.site.register(Course) |
admin.site.register(Course) |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.11.6 on 2017-12-12 23:07 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.conf import settings |
||||||
|
from django.db import migrations, models |
||||||
|
import django.db.models.deletion |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
initial = True |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
('courses', '0001_initial'), |
||||||
|
('maps', '0001_initial'), |
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.AddField( |
||||||
|
model_name='course', |
||||||
|
name='route', |
||||||
|
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='maps.CourseRoute', verbose_name='Порядок прохождения по умолчанию'), |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='course', |
||||||
|
name='teachers', |
||||||
|
field=models.ManyToManyField(related_name='course_teachers', to=settings.AUTH_USER_MODEL, verbose_name='Преподаватели'), |
||||||
|
), |
||||||
|
] |
||||||
@ -1,4 +1,5 @@ |
|||||||
from django.contrib import admin |
from django.contrib import admin |
||||||
from storage.models import Storage |
from storage.models import File, Comment |
||||||
|
|
||||||
admin.site.register(Storage) |
admin.site.register(File) |
||||||
|
admin.site.register(Comment) |
||||||
@ -1,10 +1,10 @@ |
|||||||
from rest_framework import serializers |
from rest_framework import serializers |
||||||
|
|
||||||
from storage.models import Storage |
from storage.models import File |
||||||
|
|
||||||
|
|
||||||
class StorageSerializer(serializers.ModelSerializer): |
class StorageSerializer(serializers.ModelSerializer): |
||||||
|
|
||||||
class Meta: |
class Meta: |
||||||
model = Storage |
model = File |
||||||
exclude = ('id',) |
exclude = ('id',) |
||||||
|
|||||||
@ -0,0 +1,28 @@ |
|||||||
|
from django.test import TestCase |
||||||
|
from storage.views import add_comment, delete_comment, update_comment, get_comment |
||||||
|
from django.core.files.uploadedfile import SimpleUploadedFile |
||||||
|
|
||||||
|
|
||||||
|
class CommentTestCase(TestCase): |
||||||
|
def setUp(self): |
||||||
|
self.first_comment = add_comment("first comment", "vasia@rambler.ru") |
||||||
|
self.second_comment = add_comment(text="Привет, отличная работа", email="artem4000@gmail.com") |
||||||
|
|
||||||
|
def test_comment_get(self): |
||||||
|
self.assertEqual(self.first_comment, get_comment(self.first_comment.key)) |
||||||
|
|
||||||
|
def test_comment_update(self): |
||||||
|
new_text = "Новый текст для коммента" |
||||||
|
update_comment(key=self.first_comment.key, text=new_text) |
||||||
|
self.assertEqual(get_comment(self.first_comment.key).text, new_text) |
||||||
|
|
||||||
|
def test_comment_create(self): |
||||||
|
token = 'fskjfskj' |
||||||
|
comment1 = add_comment(text=token, email="artem4000@gmail.com") |
||||||
|
self.assertEqual(comment1.text, token) |
||||||
|
file_for_upload = SimpleUploadedFile('1.txt', 'Я файл!'.encode('utf-8')) |
||||||
|
file_name = 'Клёвый файл' |
||||||
|
object_for_upload = {'original': file_for_upload, 'name': file_name} |
||||||
|
comment2 = add_comment(text=token, email="artem4000@gmail.com", files=[object_for_upload]) |
||||||
|
self.assertEqual(comment2.files.count(), 1) |
||||||
|
self.assertEqual(comment2.files.all()[0].name, file_name) |
||||||
@ -0,0 +1,47 @@ |
|||||||
|
import random |
||||||
|
import string |
||||||
|
|
||||||
|
from storage.models import Comment, File |
||||||
|
|
||||||
|
|
||||||
|
def add_comment(text: str, email: str, files=None) -> Comment: |
||||||
|
""" |
||||||
|
:param text: sting |
||||||
|
:param email: string |
||||||
|
:param files: {name?: string, file?: File, base64?: string}[] одно из двух последних свойств должно быть указано |
||||||
|
:return: Comment |
||||||
|
""" |
||||||
|
key = ''.join(random.choice(string.ascii_letters) for _x in range(15)) |
||||||
|
comment = Comment.objects.create( |
||||||
|
text=text, |
||||||
|
email=email, |
||||||
|
key=key, |
||||||
|
) |
||||||
|
|
||||||
|
if files: |
||||||
|
for file in files: |
||||||
|
new_file = File.objects.create(original=file['original']) |
||||||
|
if 'name' in file.keys(): |
||||||
|
new_file.name = file['name'] |
||||||
|
new_file.save() |
||||||
|
|
||||||
|
comment.files.add(new_file) |
||||||
|
|
||||||
|
return comment |
||||||
|
|
||||||
|
|
||||||
|
def get_comment(key): |
||||||
|
comment = Comment.objects.get(key=key) |
||||||
|
return comment |
||||||
|
|
||||||
|
|
||||||
|
def update_comment(key, **kwargs): |
||||||
|
comment = Comment.objects.get(key=key) |
||||||
|
comment.__dict__.update(kwargs) |
||||||
|
comment.save() |
||||||
|
return comment |
||||||
|
|
||||||
|
|
||||||
|
def delete_comment(key): |
||||||
|
comment = Comment.objects.get(key=key).delete() |
||||||
|
return comment |
||||||
Loading…
Reference in new issue