Merge branch 'new_lms_dev(critical)' into 'new_lms_dev'

New lms dev(critical)

See merge request skillbox/go.skillbox.ru!78
feature/fix_generate_pass
Andrey 8 years ago
commit d04613e005
  1. 3
      access/migrations/0001_initial.py
  2. 20
      access/migrations/0003_auto_20180115_1953.py
  3. 20
      access/migrations/0004_auto_20180117_1558.py
  4. 1
      access/models/user.py
  5. 18
      access/serializers.py
  6. 1
      access/urls.py
  7. 19
      access/views.py
  8. 4
      achievements/migrations/0001_initial.py
  9. 2
      courses/migrations/0001_initial.py
  10. 2
      courses/urls.py
  11. 2
      courses/views.py
  12. 7328
      csv/access/account.csv
  13. 20277
      csv/access/progress.csv
  14. 8672
      csv/access/users.csv
  15. 49
      csv/achievement/achievement.csv
  16. 66
      csv/achievement/diploma.csv
  17. 2230
      csv/achievement/user_achievement.csv
  18. 53
      csv/course/course.csv
  19. 78891
      csv/course/storage.csv
  20. 3158
      csv/course/vertex.csv
  21. 16176
      csv/finance/bill.csv
  22. 4
      csv/load_comments.py
  23. 581266
      csv/management/comment.csv
  24. 2
      finance/migrations/0001_initial.py
  25. 2
      library/migrations/0001_initial.py
  26. 6
      storage/api.py
  27. 4
      storage/migrations/0001_initial.py
  28. 2
      storage/models.py
  29. 22
      storage/tests.py

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-15 17:54 # Generated by Django 1.11.6 on 2018-01-22 09:27
from __future__ import unicode_literals from __future__ import unicode_literals
import access.models.user import access.models.user
@ -28,6 +28,7 @@ class Migration(migrations.Migration):
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('out_key', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='Токен')), ('out_key', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='Токен')),
('in_key', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='Токен')),
('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')), ('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')),
('first_name', models.CharField(blank=True, default='Гость', max_length=63, verbose_name='first name')), ('first_name', models.CharField(blank=True, default='Гость', max_length=63, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=63, verbose_name='last name')), ('last_name', models.CharField(blank=True, max_length=63, verbose_name='last name')),

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

@ -1,20 +0,0 @@
# -*- 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='Дата зачтения задания'),
),
]

@ -94,6 +94,7 @@ class CustomUserManager(BaseUserManager):
class User(AbstractBaseUser, PermissionsMixin): class User(AbstractBaseUser, PermissionsMixin):
out_key = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, editable=False) out_key = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, editable=False)
in_key = models.UUIDField(verbose_name="Токен", default=uuid.uuid4, editable=False)
email = models.EmailField(_('email address'), unique=True) email = models.EmailField(_('email address'), unique=True)
first_name = models.CharField(_('first name'), max_length=63, blank=True, default='Гость') first_name = models.CharField(_('first name'), max_length=63, blank=True, default='Гость')
last_name = models.CharField(_('last name'), max_length=63, blank=True) last_name = models.CharField(_('last name'), max_length=63, blank=True)

@ -52,7 +52,7 @@ class UserSelfSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = get_user_model() model = get_user_model()
fields = ('id', 'email', 'first_name', 'last_name', 'progress', 'achievements', fields = ('out_key', 'email', 'first_name', 'last_name', 'progress', 'achievements',
'account', 'groups', 'is_staff', 'is_superuser', 'diplomas', 'is_active') 'account', 'groups', 'is_staff', 'is_superuser', 'diplomas', 'is_active')
@staticmethod @staticmethod
@ -83,7 +83,7 @@ class UserProfileSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = get_user_model() model = get_user_model()
fields = ( fields = (
'id', 'email', 'first_name', 'last_name', 'out_key', 'email', 'first_name', 'last_name',
'account', 'groups', 'is_staff', 'is_superuser', 'account', 'groups', 'is_staff', 'is_superuser',
) )
@ -102,7 +102,7 @@ class UserSearchSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = get_user_model() model = get_user_model()
fields = ('id', 'email', 'first_name', 'last_name', 'phone', 'pay') fields = ('out_key', 'email', 'first_name', 'last_name', 'phone', 'pay')
@staticmethod @staticmethod
def get_phone(self): def get_phone(self):
@ -111,3 +111,15 @@ class UserSearchSerializer(serializers.ModelSerializer):
@staticmethod @staticmethod
def get_pay(self): def get_pay(self):
return sum([i.get_full_price() for i in self.bill_user.all()]) return sum([i.get_full_price() for i in self.bill_user.all()])
class UserMiniSerializer(serializers.ModelSerializer):
photo = serializers.SerializerMethodField()
class Meta:
model = get_user_model()
fields = ('photo', 'first_name', 'last_name')
@staticmethod
def get_photo(self):
return self.account.photo.url

@ -5,6 +5,7 @@ urlpatterns = [
url(r'teachers/$', views.TeacherListView.as_view()), url(r'teachers/$', views.TeacherListView.as_view()),
url(r'detail/$', views.DetailUserView.as_view()), url(r'detail/$', views.DetailUserView.as_view()),
url(r'detail/([0-9]{1,99})/$', views.DetailUserView.as_view()), url(r'detail/([0-9]{1,99})/$', views.DetailUserView.as_view()),
url(r'info/(?P<out_key>[0-9A-Fa-f-]+)/$', views.MinUserView.as_view()),
url(r'guard/(?P<pk>[0-9]{1,99})/(?P<page>.+)/$', views.UserGuardView.as_view()), url(r'guard/(?P<pk>[0-9]{1,99})/(?P<page>.+)/$', views.UserGuardView.as_view()),
url(r'find/$', views.FindUserView.as_view()), url(r'find/$', views.FindUserView.as_view()),
url(r'registration/$', views.RegistrationView.as_view()), url(r'registration/$', views.RegistrationView.as_view()),

@ -16,7 +16,7 @@ from rest_framework.views import APIView
from access.models.other import Invite, ResetPassword from access.models.other import Invite, ResetPassword
from access.models.progress import ProgressLesson from access.models.progress import ProgressLesson
from access.models import Progress from access.models import Progress
from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressLessonSerializer from access.serializers import UserSelfSerializer, UserSearchSerializer, ProgressLessonSerializer, UserMiniSerializer
class TeacherListView(APIView): class TeacherListView(APIView):
@ -132,10 +132,10 @@ class DetailUserView(APIView):
return Response('anonymous', status=200) return Response('anonymous', status=200)
if request.user.is_authenticated() and request.user.is_superuser \ if request.user.is_authenticated() and request.user.is_superuser \
or request.user.is_staff or request.user.id == int(pk): or request.user.is_staff or request.user.out_key == pk:
try: try:
user = get_user_model().objects.get(id=pk) user = get_user_model().objects.get(out_key=pk)
except get_user_model().DoesNotExist: except get_user_model().DoesNotExist:
return Response("User doesn't exist", status=404) return Response("User doesn't exist", status=404)
@ -274,7 +274,7 @@ class UserGuardView(APIView):
@staticmethod @staticmethod
def get(request, pk, page): def get(request, pk, page):
try: try:
user = get_user_model().objects.get(id=pk) user = get_user_model().objects.get(out_key=pk)
except get_user_model().DoesNotExist: except get_user_model().DoesNotExist:
return Response("User doesn't exist", status=404) return Response("User doesn't exist", status=404)
@ -316,3 +316,14 @@ class CourseProgressDynamicView(APIView):
return Response("Bad request", status=400) return Response("Bad request", status=400)
return Response(status=403) return Response(status=403)
class MinUserView(APIView):
renderer_classes = (JSONRenderer,)
@staticmethod
def get(request, out_key):
try:
return Response(UserMiniSerializer(get_user_model().objects.get(out_key=out_key)).data, status=200)
except get_user_model().DoesNotExist:
return Response("User not found", status=404)

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-15 17:54 # Generated by Django 1.11.6 on 2018-01-22 09:27
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
@ -12,8 +12,8 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('courses', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0001_initial'),
] ]
operations = [ operations = [

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-15 17:54 # Generated by Django 1.11.6 on 2018-01-22 09:27
from __future__ import unicode_literals from __future__ import unicode_literals
import django.contrib.postgres.fields import django.contrib.postgres.fields

@ -3,7 +3,7 @@ from django.conf.urls import url
from courses import views as views from courses import views as views
urlpatterns = [ urlpatterns = [
url(r'vertex/(?P<token>.+)/$', views.VertexDetail.as_view()), url(r'vertex/(?P<token>.+)/$', views.LessonDetail.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()),
] ]

@ -32,7 +32,7 @@ class CourseListView(APIView):
return Response(res, self.status_code) return Response(res, self.status_code)
class VertexDetail(APIView): class LessonDetail(APIView):
renderer_classes = (JSONRenderer,) renderer_classes = (JSONRenderer,)
@staticmethod @staticmethod

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -0,0 +1,49 @@
id,img,text
17,achives/14t_rpXjXAR.png,Java: Основы построения веб-приложений
16,achives/15t.png,"Java: Веб-приложения:формы, заголовки и сессии"
15,achives/16_JHghTAS.png,Java: Дипломная работа
18,achives/13t_8wJaFO6.png,Java: Многопоточность
19,achives/12t.png,Java: Работа с базами данных
20,achives/11t_PlIJyKE.png,Java: Работа с файлами и сетью
21,achives/10t.png,Java: Внешний вид GUI и рисование
22,achives/9t_XB04aQi.png,Java: Основы построения GUI
23,achives/8t.png,Java: Тестирование и отладка
24,achives/7t_IcXWV0J.png,Java: Наследование и полиморфизм
25,achives/6t_6GPa4Cm.png,Java: Объекты и классы
26,achives/5t_MwDFKjE.png,Java: Типы данных: Коллекции
27,achives/4t_Wicy963.png,Java: Типы данных: Строки и даты
28,achives/3t_LEiFMmW.png,Java: Типы данных: числа
29,achives/2t_4GxlPla.png,Java: Синтаксис языка
30,achives/1t_95r5sEe.png,Java: Первые шаги
31,achives/16t_ElpMZT4.png,iOS: Обзор публикации приложений
32,achives/15t_G2dHbG0.png,iOS: WatchKit
33,achives/14t_zjLTw3C.png,"iOS: iPad, Swift 2 и iOS 9"
34,achives/13t_r5AUBkb.png,iOS: Анимация в iOS
35,achives/12t_O9ziZtQ.png,iOS: CoreData и CoreGraphics
36,achives/11t_R6ZFGPo.png,iOS: Работа с Сетью
37,achives/10t_rmSFxlx.png,iOS: Структуры данных и парсинг
38,achives/9t_FNgfsfx.png,iOS: Функциональные возможности
39,achives/8t_6caS4Mz.png,iOS: Инструменты ООП
40,achives/7t_U1hXqEE.png,"iOS: Enums, Structs"
41,achives/6t_6Q4gH9C.png,iOS: Optionals и Кортежи и отображение данных
42,achives/5t_Vg8scWj.png,"iOS: Классы, UIViewController"
43,achives/4t_M29zQP7.png,iOS: Программирование на Swift и основы UIKit
44,achives/3t_EzvoNos.png,iOS: Ветвление и коллекции
45,achives/2t_yq8f6nn.png,iOS: Основы Swift как языка программирования
46,achives/1t_VRlv8Gf.png,iOS: Основы программирования под iOS
47,achives/16t_9WuvuNR.png,Excel: Введение в макросы и язык VBA (продолжение)
48,achives/15t_B3SKKLm.png,Excel: Введение в макросы и язык VBA
49,achives/14t_1w3a59I.png,Excel: Работа с внешними источниками данных
50,achives/13t_QyBcCES.png,Excel: Сложные диаграммы
51,achives/12t_W1ecROl.png,Excel: Прогнозирование
52,achives/11t_Fzu2ICH.png,Excel: Инструменты анализа и оптимизации 2
53,achives/10t_z5VaRjv.png,Excel: Инструменты анализа и оптимизации
54,achives/9t_nBtNR8G.png,Excel: Формулы массивов
55,achives/8t_rFqrijw.png,Excel: Сводные таблицы
56,achives/7t_yXjsXUR.png,Excel: Визуализация данных
57,achives/6t_JYzPjTH.png,Excel: Формулы и функции. Работа с ошибками
58,achives/5t_noq5RnK.png,Excel: Формулы и функции.Более сложные формулы
59,achives/4t_Xl2DpdL.png,Excel: Формулы и функции.Работать с формулами
60,achives/3t_afQm2YN.png,Excel: Формулы и функции.Введение
61,achives/2t_79u4GW7.png,Excel: Основной функционал (продолжение)
62,achives/1t_xLDdZ54.png,Excel: Основной функционал
unable to load file from base commit

@ -0,0 +1,66 @@
user,img
volnov_mv@mail.ru,diploms/378-005-104-3681735945.png
flintl@bk.ru,diploms/366-005-081-3414761253.png
slava-sh@yandex.ru,diploms/378-005-106-5622100597.png
rock_n_vladok@mail.ru,diploms/373-005-088-8460749285.png
mahneva-mariya@mail.ru,diploms/365-005-080-7809812978.png
krrera@mail.ru,diploms/378-005-116-0406189146.png
a.michurin1783@mail.ru,diploms/367-005-082-4390339652.png
dron84@gmail.com,diploms/378-005-100-0453317915.png
garuskin.dima@gmail.com,diploms/372-005-087-7268502359.png
artemshchurev@gmail.com,diploms/378-005-110-5734330734.png
vladislav-avdeev@mail.ru,diploms/378-005-101-0579235306.png
serge-meb@mail.ru,diploms/378-005-093-9287022829.png
walerock@mail.ru,diploms/371-005-086-2010728249.png
threed@rsgc.ru,diploms/370-005-085-1445403214.png
ebortnikov@mail.ru,diploms/363-005-078-8013223405.png
tsubasa@tut.by,diploms/378-005-105-1400814657.png
susenko_a@ukr.net,diploms/363-005-077-4635813020.png
vladimir_glight@mail.ru,diploms/378-005-107-7721009995.png
aselya.bekenova@gmail.com,diploms/378-005-097-9345817764.png
kovalev.home@mail.ru,diploms/363-005-079-4953079839.png
grapeperson@inbox.ru,diploms/sharp378-005-123-4175944962.png
irinki@mail.ru,diploms/378-005-108-3003245596.png
komplekt_17@mail.ru,diploms/378-005-098-9891625101.png
o.gricenko@yandex.ru,diploms/378-005-117-1653742224.png
softmay@inbox.ru,diploms/378-005-099-6127989680.png
orloff.eg@yandex.ru,diploms/375-005-090-0013188516.png
izumovn@gmail.com,diploms/378-005-112-1318768199.png
anton_semenchuk@rambler.ru,diploms/374-005-089-1818186998.png
misha41192@mail.ru,diploms/378-005-109-8808693661.png
nadin12233@mail.ru,diploms/377-005-092-2649819525.png
lukin68@mail.ru,diploms/378-005-119-1396775116.png
caplinos@mail.ru,diploms/sharp378-005-124-8590405231.png
artyomzolotykh@gmail.com,diploms/363-005-076-8109754653.png
joy76@mail.ru,diploms/378-005-118-7596974049.png
vitalikbog@gmail.com,diploms/378-005-113-6643879642.png
artyomzykov@gmail.com,diploms/369-005-084-6514008928.png
v.vahmintsev@gmail.com,diploms/378-005-120-1857123638.png
malkolm063@yandex.ru,diploms/378-005-102-3225259917.png
cathayraht@gmail.com,diploms/sharp378-005-127-5465822465.png
ol88@bk.ru,diploms/378-005-103-4917135722.png
tatyana.best@list.ru,diploms/378-005-114-5045779647.png
kaa-work@yandex.ru,diploms/sharp378-005-121-6828207500.png
lissy@mail.ru,diploms/sharp378-005-125-7455009303.png
host510@mail.ru,diploms/378-005-115-8424668311.png
viktorbeznosov@mail.ru,diploms/sharp378-005-122-2445336751.png
danikanisa@gmail.com,diploms/sharp378-005-126-9693925734.png
aivis@ukr.net,diploms/sharp378-005-128-0750907505.png
chiganu@gmail.com,diploms/sharp378-005-129-3202020273.png
my-post@mail.ru,diploms/sharp378-005-131-1850096338.png
mr.titarev@mail.ru,diploms/sharp378-005-130-3534666982.png
roman@proskurnin.ru,diploms/sharp378-005-132-0213523725.png
miklik@yandex.ru,diploms/sharp378-005-133-1393432393.png
vikpointer@yandex.ru,diploms/sharp378-005-134-0649133567.png
firenskiy@yandex.ru,diploms/sharp378-005-137-3289702004.png
uglukfearless@gmail.com,diploms/sharp378-005-135-0135161426.png
hazhaev@gmail.com,diploms/sharp378-005-136-2411124105.png
d6232@bigmir.net,diploms/sharp378-005-138-8182572282.png
alexplatinum@yandex.ru,diploms/sharp378-005-139-5436334541.png
oleguch@ya.ru,diploms/sharp378-005-141-3016802392.png
volkovv71@gmail.com,diploms/sharp378-005-140-1452821946.png
cyrius@yandex.ru,diploms/sharp378-005-142-9487486532.png
orlenko23@mail.ru,diploms/sharp378-005-143-3541435391.png
vilorovna@yandex.ru,diploms/sharp378-005-144-3873082140.png
bpkprog@yandex.ru,diploms/sharp378-005-145-0913411150.png
roman@kislovs.ru,diploms/sharp378-005-146-1693156186.png
unable to load file from base commit

File diff suppressed because it is too large Load Diff

@ -0,0 +1,53 @@
hidden,level,slug,direction,public,title,image,big_image,big_mobile_image,teachers
False,B,SMM-–menedzher,3,True,SMM –менеджер,course/670х270_LMS_SMM.png,course/1480х238_LMS_SMM.png,,['lubov.loginova@ingate.ru']
False,B,Draw&Go,4,True,Акварельная живопись,course/mal_1.png,course/bol_1.png,course/bol_6A56hsO.jpg,['kristinagalockina@gmail.com']
False,B,ux-analitik,2,True,ux аналитик,course/analyticsprm.jpg,course/analyticsprw.jpg,course/analyticsprm_2J0YORM.jpg,['aic.analytics@skill-box.ru']
False,B+A,Android-razrabotchik,1,True,Android-разработчик,course/android_TK1Lu3x.jpg,course/android1.jpg,,"['raynor73@gmail.com', 'gerasimenkosv@bk.ru']"
False,B,UI-animatsiya,2,True,UI анимация,course/motion.jpg,course/motionlong.jpg,course/motion_sqnScls.jpg,['aic.motion@skill-box.ru']
True,B,"diplomnyy-proekt-""professiya-internet-marketolog""",3,True,"Дипломный проект ""Профессия Интернет-маркетолог""",course/670х270_LMS_маркетолог___uTutc3u.png,course/LMS_hard_ingate_1EM8sL7.png,,['lubov.loginova@ingate.ru']
True,E,diplomnyy-proekt-«ntv-plyus»,2,True,Дипломный проект «НТВ ПЛЮС»,course/нтв_плюс_маленькая.jpg,course/нтв_плюс_большая.jpg,,['ntvplus@skill-box.ru']
False,B,Key-Visual,2,True,Key Visual,course/670х270_Ретушь.png,course/1480х238_Ретушь.png,,['pajasu@gmail.com']
False,A,Excel-prodvinutyy,1,True,Excel продвинутый,course/excel_ni9vwCu.jpg,course/excel1_CcJM6br.jpg,course/excel_EEMEX0r.jpg,['buyavets@gmail.com']
True,E,diplomnyy-proekt-«festival'-molodezhi»,2,True,Дипломный проект «Фестиваль молодежи»,course/Фестиваль_молодежи_маленькая.jpg,course/Untitled-1.jpg,,['fm@skill-box.ru']
True,B,programmist-1s-bitriks-(2018),1,True,Программист 1С-Битрикс (2018),course/670х270_Xr9I0hT.png,course/1480х238_Om0nUCO.png,,['hex2bomb@gmail.com']
True,E,diplomnyy-proekt-«gazprombank»,2,True,Дипломный проект «Газпромбанк»,course/gazprom2.jpg,course/gazprom1.jpg,course/gazprom2_ZShOr5R.jpg,['gpb@skillbox.ru']
True,E,diplomnyy-proekt-«pochta-bank»,2,True,Дипломный проект «ПОЧТА БАНК»,course/почта_банк_маленькая.jpg,course/почтабанк_большая.jpg,,['pochtabank@skill-box.ru']
True,E,diplomnyy-proekt-«smp-bank»,2,True,Дипломный проект «СМП БАНК»,course/спм_маленькая_IGl1R5y.jpg,course/спм_большая_BBAUsvw.jpg,,['cmpbank@skill-box.ru']
False,B,veb-dizayn-dlya-nachinayuschih,2,True,Веб-Дизайн для начинающих,course/design.jpg,course/design1.jpg,,['camb@ya.ru']
False,B,JavaScript,1,True,JavaScript,course/js.jpg,course/js2.jpg,course/js_bBp5dM2.jpg,"['gerasimenkosv@bk.ru', 'yegor.yakovishen@me.com']"
True,B,"diplomnyy-proekt-""upravlenie-proektami""",3,True,"Дипломный проект ""Управление проектами""",course/670х238_Sibirix.jpg,course/1480х238_Sibirix.jpg,,['sibirix@skill-box.ru']
True,E,diplomnyy-proekt-«Yota»,2,True,Дипломный проект «Yota»,course/yota2.jpg,course/yota1.jpg,course/yota2_D06GbKi.jpg,['yota@skillbox.ru']
False,B+A,veb-razrabotchik,1,True,Веб-разработчик,course/web.jpg,course/web1.jpg,,"['gerasimenkosv@bk.ru', 'html@bedev.ru', 't@skillbox.ru']"
True,B,diplomnyy-proekt-«promsvyaz'bank»,2,True,Дипломный проект «Промсвязьбанк»,course/670х270_Промсвязьбанк_1.png,course/1480х238_Промсвязьбанк_1.png,,['komanda.promsvyazbank@yandex.ru']
True,B,test,1,False,Таргетированная реклама,,,,['t@skillbox.ru']
False,A,kak-otkryt-veb-studiyu,3,True,Как открыть веб-студию,course/Studio.jpg,course/webs.jpg,,['inna.spirina@gmail.com']
True,B,Sound-design,5,True,Sound design,course/670х270_Саунд_topSg6J.png,course/1480х238_Саунд_JpMiW6C.png,,['basie.ru@gmail.com']
False,B,kak-otkryt'-salon-krasoty,3,True,Как открыть салон красоты,course/670х270.png,course/1480х238_pX5zoz0.png,,['dbeleshko@gmail.com']
False,B,videobloging,3,True,Видеоблогинг,course/vb1.jpg,course/vb2.jpg,course/vb1_6ZsdrSE.jpg,['yoola@skill-box.ru']
True,B+A,razrabotchik-1s-bitriks,1,False,Разработчик 1С-Битрикс,course/bitrix_waWRT5T.jpg,course/bitrix1.jpg,,['t@skillbox.ru']
True,E,diplomnyy-proekt-«Kaspi.kz»,2,True,Дипломный проект «Kaspi.kz»,course/kaspi2.jpg,course/kaspi1.jpg,course/kaspi2_QzZi0IX.jpg,['kaspi@skillbox.ru']
True,E,diplomnyy-proekt-«MOS.RU»,2,True,Дипломный проект «MOS.RU»,course/mosru2.jpg,course/mosru1.jpg,course/mosru2_hDuLl1H.jpg,['mosru@skillbox.ru']
False,A,veb-dizayn-PRO,2,True,Веб-Дизайн PRO,course/Pro.jpg,course/pro1.jpg,,['colloum.ux@gmail.com']
True,B,1--s-bitriks-(2017),1,False,1 -с битрикс (2017),,,,['t@skillbox.ru']
True,B,sinema-4D-dlya-veb-dizayna,2,True,Cinema 4D для веб-дизайна,course/Обложка_LMS_Cinema_4D.jpg,course/Обложка_LMS_большая_Cinema_4D_aXJ3Ocs.jpg,,['rovshen.eyubov@yahoo.com']
True,B,diplomnyy-proekt-«Mos.ru-2»,2,True,Дипломный проект «Mos.ru-2»,course/mosru2_иконка_дипломныи_проект.jpg,course/mosru1_экран_в_курсе_большое_изображение.jpg,course/mosru2_hDuLl1H_изображение_под_мобилку.jpg,['mosru@skillbox.ru']
False,A,professiya-internet-marketolog-ot-a-do-ya,3,True,Профессия интернет-маркетолог от А до Я,course/marketolog_Ykj1b1J.jpg,course/marketolog1_bOfeJXW.jpg,,['buyavets@gmail.com']
True,B,Python-razrabotchik-s-nulya-(2018),1,True,Python-разработчик с нуля (2018),course/670х238_Python_dQO3TkP.jpg,course/1480х238_Python.jpg,,['vadim.shandrinov@skillbox.ru']
True,B,diplomnyy-proekt-«Ticketland»,2,True,Дипломный проект «Ticketland»,course/670х270_Тикетлэнд_1.png,course/1480х238_Тикетлэнд_1.png,,['komanda.ticketland@yandex.ru']
False,B,Blockchain,3,True,Blockchain,course/670x270.png,course/1480x238.png,,['blockchain.skillbox@yandex.ru']
True,B,ux-design-special-AIC-,2,True,ux design special AIC,course/ux.jpg,course/aic1.jpg,,"['ux@aic.ru', 'aic@skillbox.ru', 't@skillbox.ru']"
False,B,sketching-dlya-dizaynera,2,True,Скетчинг для дизайнера,course/sketch1.jpg,course/sketch2.jpg,course/sketch1_fUHb6TG.jpg,['sketch@skill-box.ru']
False,E,ux-design,2,True,ux design,course/ux.jpg,course/aic1.jpg,,['aic@skillbox.ru']
True,B,Python,1,False,Python,,,,['t@skillbox.ru']
False,B,upravlenie-proektami,3,True,Управление проектами,course/иконки-тем-для-LMS.jpg,course/обложкА-для-страницы-курса-в-ЛМС.jpg,,['sibirix@skill-box.ru']
True,B,zadanie-k-kursu-«professiya-PR-menedzher»-dlya-komandy-«megafon-–-severo-zapad»,3,True,ЗАДАНИЕ К КУРСУ «ПРОФЕССИЯ PR-МЕНЕДЖЕР» ДЛЯ КОМАНДЫ «МЕГАФОН – СЕВЕРО-ЗАПАД»,,,,['kstrifonova@gmail.com']
False,A,professiya---internet-marketolog,3,True,Профессия — интернет-маркетолог,course/LMS_mini_ingate.png,course/LMS_hard_ingate.png,,['lubov.loginova@ingate.ru']
False,B,reklamnaya-grafika,2,True,Рекламная графика,course/670х270_Тикетлэнд_1_wE1a3an.png,course/1480х238_Тикетлэнд_1_ObFQyCr.png,,['korumart@gmail.com']
False,A,professiya-PR-menedzher,3,True,Профессия PR-менеджер,course/pr.jpg,course/pr1.jpg,,['nataliya.akimova47@gmail.com']
True,B,rasprodazha,3,True,Распродажа,,,,['t@skillbox.ru']
False,B,dizayn-mobil'nyh-prilozheniy,2,True,Дизайн мобильных приложений RMR,course/photoRB_BZ5JhPj.jpg,course/photo5467609895021946983.jpg,,['skillbox@redmadrobot.com']
True,B,diplomnyy-proekt-«vtb24»,2,True,Дипломный проект «ВТБ24»,,,,['komanda.vtb24@yandex.ru']
False,B+A,Java-razrabotchik,1,True,Java разработчик,course/java.jpg,course/java1.jpg,,"['it.is.the.g@list.ru', 'gerasimenkosv@bk.ru', 't@skillbox.ru']"
False,B+A,iOS-razrabotchik,1,True,iOS Разработчик,course/swift.jpg,course/ios1.jpg,,"['exeypanteleev@gmail.com', 't@skillbox.ru']"
False,B,Excel-bazovyy,1,True,Excel базовый,course/excel.jpg,course/excel1.jpg,,['buyavets@gmail.com']
False,B+A,Csharp-razrabotchik,1,True,C# разработчик,course/csharp.jpg,course/csharp1.jpg,,"['codemy.csharp@gmail.com', 't@skillbox.ru', 'johntorohov@mail.ru']"
unable to load file from base commit

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -55,8 +55,8 @@ if __name__ == '__main__':
if not file == ''] if not file == '']
comment = Comment.objects.create( comment = Comment.objects.create(
text=row['text'], text=row['text'] or row['bb_text'],
email=row['owner__email'], user_key=get_user_model().objects.get(email=row['owner__email']).out_key,
) )
if row['status'] == 'Одобренно': if row['status'] == 'Одобренно':

File diff suppressed because one or more lines are too long

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-15 17:54 # Generated by Django 1.11.6 on 2018-01-22 09:27
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-15 17:54 # Generated by Django 1.11.6 on 2018-01-22 09:27
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime

@ -13,10 +13,10 @@ def upload_file(original=None, name=None, base64=None) -> File:
return new_file return new_file
def add_comment(text: str, email: str, files=None) -> Comment: def add_comment(text: str, out_key: str, files=None) -> Comment:
""" """
:param text: sting :param text: sting
:param email: string :param out_key: string
:param files: {name?: string, original?: File, base64?: string}[] одно из двух последних свойств должно быть указано :param files: {name?: string, original?: File, base64?: string}[] одно из двух последних свойств должно быть указано
:return: Comment :return: Comment
""" """
@ -25,7 +25,7 @@ def add_comment(text: str, email: str, files=None) -> Comment:
comment = Comment.objects.create( comment = Comment.objects.create(
text=text, text=text,
email=email, user_key=out_key,
) )
for file in files: for file in files:

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-15 17:54 # Generated by Django 1.11.6 on 2018-01-22 09:27
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
@ -18,7 +18,7 @@ class Migration(migrations.Migration):
name='Comment', name='Comment',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', models.CharField(max_length=63, verbose_name='email автора')), ('user_key', models.UUIDField(editable=False, verbose_name='Ссылка на юзера')),
('text', models.TextField(default='', verbose_name='Текст комментария')), ('text', models.TextField(default='', verbose_name='Текст комментария')),
('token', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='Ключ')), ('token', models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='Ключ')),
('date', models.DateTimeField(auto_now_add=True, verbose_name='Дата коментария')), ('date', models.DateTimeField(auto_now_add=True, verbose_name='Дата коментария')),

@ -36,7 +36,7 @@ class File(models.Model):
class Comment(models.Model): class Comment(models.Model):
email = models.CharField(verbose_name="email автора", max_length=63) user_key = models.UUIDField(verbose_name="Ссылка на юзера", editable=False)
text = models.TextField(default="", verbose_name="Текст комментария") text = models.TextField(default="", verbose_name="Текст комментария")
files = models.ManyToManyField(to=File, blank=True, verbose_name='Файлы') files = models.ManyToManyField(to=File, blank=True, verbose_name='Файлы')
token = models.UUIDField(verbose_name="Ключ", default=uuid.uuid4, editable=False) token = models.UUIDField(verbose_name="Ключ", default=uuid.uuid4, editable=False)

@ -1,4 +1,4 @@
import tempfile import uuid
from django.test import TestCase from django.test import TestCase
from storage.api import add_comment, delete_comment, update_comment, get_comment from storage.api import add_comment, delete_comment, update_comment, get_comment
@ -10,8 +10,10 @@ from storage.models import Comment
class CommentTestCase(TestCase): class CommentTestCase(TestCase):
def setUp(self): def setUp(self):
self.first_comment = add_comment("first comment", "vasia@rambler.ru") self.f_k = uuid.uuid4()
self.second_comment = add_comment(text="Привет, отличная работа", email="artem4000@gmail.com") self.s_k = uuid.uuid4()
self.first_comment = add_comment("first comment", self.f_k)
self.second_comment = add_comment(text="Привет, отличная работа", out_key=self.s_k)
def tearDown(self): def tearDown(self):
Comment.objects.all().delete() Comment.objects.all().delete()
@ -25,9 +27,9 @@ class CommentTestCase(TestCase):
self.assertEqual(get_comment(self.first_comment.token).text, new_text) self.assertEqual(get_comment(self.first_comment.token).text, new_text)
# def test_comment_create(self): # def test_comment_create(self):
# token = 'fskjfskj' # text = 'fskjfskj'
# comment1 = add_comment(text=token, email="artem4000@gmail.com") # comment1 = add_comment(text=text, out_key=uuid.uuid4())
# self.assertEqual(comment1.text, token) # self.assertEqual(comment1.text, text)
# with tempfile.gettempdir() as dir_path: # with tempfile.gettempdir() as dir_path:
# file_for_upload = SimpleUploadedFile(dir_path + '/1.txt', 'Я файл!'.encode('utf-8')) # file_for_upload = SimpleUploadedFile(dir_path + '/1.txt', 'Я файл!'.encode('utf-8'))
# file_name = 'Клёвый файл' # file_name = 'Клёвый файл'
@ -48,8 +50,8 @@ class CommentTestCase(TestCase):
class FileTestCase(TestCase): class FileTestCase(TestCase):
def setUp(self): def setUp(self):
self.first_comment = add_comment("first comment", "vasia@rambler.ru") self.first_comment = add_comment("first comment", uuid.uuid4())
self.second_comment = add_comment(text="Привет, отличная работа", email="artem4000@gmail.com") self.second_comment = add_comment(text="Привет, отличная работа", out_key=uuid.uuid4())
def test_comment_get(self): def test_comment_get(self):
self.assertEqual(self.first_comment, get_comment(self.first_comment.token)) self.assertEqual(self.first_comment, get_comment(self.first_comment.token))
@ -61,12 +63,12 @@ class FileTestCase(TestCase):
def test_comment_create(self): def test_comment_create(self):
token = 'fskjfskj' token = 'fskjfskj'
comment1 = add_comment(text=token, email="artem4000@gmail.com") comment1 = add_comment(text=token, out_key=uuid.uuid4())
self.assertEqual(comment1.text, token) self.assertEqual(comment1.text, token)
file_for_upload = SimpleUploadedFile('1.txt', 'Я файл!'.encode('utf-8')) file_for_upload = SimpleUploadedFile('1.txt', 'Я файл!'.encode('utf-8'))
file_name = 'Клёвый файл' file_name = 'Клёвый файл'
object_for_upload = {'original': file_for_upload, 'name': 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]) comment2 = add_comment(text=token, out_key=uuid.uuid4(), files=[object_for_upload])
self.assertEqual(comment2.files.count(), 1) self.assertEqual(comment2.files.count(), 1)
self.assertEqual(comment2.files.all()[0].name, file_name) self.assertEqual(comment2.files.all()[0].name, file_name)

Loading…
Cancel
Save