copy codemy

remotes/origin/pm_task_31703
Baryshnikov Nikolay 9 years ago
parent 33f12bca3e
commit d3f018ace1
  1. 18
      1.txt
  2. 11
      _practice/queue.py
  3. 0
      _tools/__init__.py
  4. 140
      _utils/1.txt
  5. 232
      _utils/2.txt
  6. 30
      _utils/check_lesson_open_near_homework.py
  7. 2
      _utils/clean_twice_journals.py
  8. 2
      _utils/get_big_fake_module.py
  9. 1
      _utils/get_reports.py
  10. 72
      _utils/lessons_comments_hc.xml
  11. 2
      _utils/open_lesson.py
  12. 4
      _utils/reports/get_success_for_theme.py
  13. 0
      access/__init__.py
  14. 0
      access/admin.py
  15. 0
      access/api.py
  16. 74
      access/forms.py
  17. 0
      access/models.py
  18. 896
      access/out_api.py
  19. 80
      access/tasks.py
  20. 24
      access/teach_urls.py
  21. 300
      access/teach_views.py
  22. 86
      access/urls.py
  23. 468
      access/views.py
  24. 2
      celerybeat.pid
  25. 28
      check_comment_auth
  26. 80
      configs/celery.conf
  27. 102
      configs/codemy_ssl/privat.key
  28. 168
      configs/codemy_ssl/public.pem
  29. 32
      configs/packs
  30. 50
      configs/prov.sh
  31. 51
      configs/skill-box_ssl/private.key
  32. 100
      configs/skill-box_ssl/public.pem
  33. 28
      configs/skill-box_ssl/request.csr
  34. BIN
      configs/skill-box_ssl/skill-box.pfx
  35. 102
      configs/skillbox_ssl/private.key
  36. 56
      configs/skillbox_ssl/request.csr
  37. BIN
      configs/skillbox_ssl/skillbox.pfx
  38. 14
      configs/supervisor.conf
  39. 30
      configs/uwsgi.ini
  40. 0
      courses/__init__.py
  41. 240
      courses/admin.py
  42. 1818
      courses/api.py
  43. 398
      courses/migrations/0001_initial.py
  44. 58
      courses/migrations/0002_achievementsmap.py
  45. 38
      courses/migrations/0003_auto_20160322_1852.py
  46. 40
      courses/migrations/0004_lesson_video_id.py
  47. 40
      courses/migrations/0005_auto_20160331_2030.py
  48. 50
      courses/migrations/0006_auto_20160407_2006.py
  49. 40
      courses/migrations/0007_lesson_video_date.py
  50. 40
      courses/migrations/0008_coursetheme_block.py
  51. 38
      courses/migrations/0009_remove_coursetheme_block.py
  52. 38
      courses/migrations/0010_remove_coursetheme_empty_description.py
  53. 50
      courses/migrations/0011_auto_20160425_1550.py
  54. 40
      courses/migrations/0012_course_diploma_key.py
  55. 84
      courses/migrations/0013_auto_20160425_1720.py
  56. 70
      courses/migrations/0014_diploma.py
  57. 90
      courses/migrations/0015_auto_20160425_1750.py
  58. 60
      courses/migrations/0016_auto_20160425_1752.py
  59. 78
      courses/migrations/0017_auto_20160426_1240.py
  60. 38
      courses/migrations/0018_remove_exam_icon.py
  61. 38
      courses/migrations/0019_remove_exam_title.py
  62. 54
      courses/migrations/0020_auto_20160426_1243.py
  63. 150
      courses/migrations/0021_auto_20160426_1447.py
  64. 120
      courses/migrations/0022_auto_20160426_1526.py
  65. 110
      courses/migrations/0023_auto_20160426_1729.py
  66. 60
      courses/migrations/0024_auto_20160505_1748.py
  67. 62
      courses/migrations/0025_auto_20160506_1303.py
  68. 60
      courses/migrations/0026_auto_20160506_1838.py
  69. 0
      courses/migrations/__init__.py
  70. 0
      courses/models.py
  71. 606
      courses/templates.py
  72. 886
      courses/tools.py
  73. 90
      courses/urls.py
  74. 504
      courses/views.py
  75. 1
      courses_dump.json
  76. 0
      finance/__init__.py
  77. 0
      finance/admin.py
  78. 0
      finance/api.py
  79. 250
      finance/migrations/0001_initial.py
  80. 40
      finance/migrations/0002_bill_description.py
  81. 40
      finance/migrations/0003_selfbillrequest_company.py
  82. 60
      finance/migrations/0004_auto_20160414_1700.py
  83. 56
      finance/migrations/0005_selfbilldesign.py
  84. 50
      finance/migrations/0006_auto_20160414_1930.py
  85. 50
      finance/migrations/0007_auto_20160414_1941.py
  86. 44
      finance/migrations/0008_selfbilldesign_users.py
  87. 40
      finance/migrations/0009_selfbillhistory_new_sent.py
  88. 40
      finance/migrations/0010_selfbilldesign_pay_id.py
  89. 52
      finance/migrations/0011_auto_20160505_1748.py
  90. 50
      finance/migrations/0012_auto_20160505_2009.py
  91. 40
      finance/migrations/0013_auto_20160505_2035.py
  92. 40
      finance/migrations/0014_auto_20160506_1303.py
  93. 40
      finance/migrations/0015_price_key.py
  94. 50
      finance/migrations/0016_auto_20160524_1255.py
  95. 38
      finance/migrations/0017_remove_price_flex.py
  96. 234
      finance/migrations/0018_auto_20160531_1256.py
  97. 40
      finance/migrations/0019_price_url.py
  98. 40
      finance/migrations/0020_auto_20160531_1303.py
  99. 68
      finance/migrations/0021_auto_20160601_1309.py
  100. 56
      finance/migrations/0022_auto_20160601_1320.py
  101. Some files were not shown because too many files have changed in this diff Show More

18
1.txt

@ -1,18 +0,0 @@
orlova@mokselle.ru
arhipov@mokselle.com
robert@mokselle.ru
nemtsev@mokselle.ru
grebennikova@mokselle.com
a.rybalov@mokselle.ru
isaev@mokselle.ru
kravchenko@mokselle.ru
volosnikov@mokselle.com
korneva@mokselle.com
ivanova@mokselle.ru
shilin@mokselle.com
grishchenko@mokselle.ru
iskusnov@mokselle.ru
dolya@mokselle.com
dolia@mokselle.ru
vorobjova@mokselle.com
plavko@mokselle.ru

@ -1,11 +0,0 @@
queue = tuple(i for i in range(0, 99999))
point = 0
def handler():
print()
def switch():
for count in queue:
handler()

@ -1,71 +1,71 @@
einzheev@itl.com.kz einzheev@itl.com.kz
dmitry.sedov@inbox.ru dmitry.sedov@inbox.ru
ivanpokalyuk@gmail.com ivanpokalyuk@gmail.com
baho9208@mail.ru baho9208@mail.ru
feyorz@gmail.com feyorz@gmail.com
waximov@gmail.com waximov@gmail.com
alvo_05@mail.ru alvo_05@mail.ru
redkuk@gmail.com redkuk@gmail.com
petrichv@gmail.com petrichv@gmail.com
tagfelix500@gmail.com tagfelix500@gmail.com
ikey0172@mail.ru ikey0172@mail.ru
gb.gayane@gmail.com gb.gayane@gmail.com
eco.pun@gmail.com eco.pun@gmail.com
sanzharsurshanov@gmail.com sanzharsurshanov@gmail.com
dennis.loboda@gmail.com dennis.loboda@gmail.com
webar4i@gmail.com webar4i@gmail.com
zvetaan@gmail.com zvetaan@gmail.com
svelavs@gmail.com svelavs@gmail.com
art@magicdesign.ru art@magicdesign.ru
mbf23tb@gmail.com mbf23tb@gmail.com
andrievskiydmitriy@gmail.com andrievskiydmitriy@gmail.com
pulya7@gmail.com pulya7@gmail.com
mikhail.a.gusev@gmail.com mikhail.a.gusev@gmail.com
elena@citrus-soft.ru elena@citrus-soft.ru
kropev@rarus.ru kropev@rarus.ru
nikonorov@labizum.ru nikonorov@labizum.ru
gulin@labizum.ru gulin@labizum.ru
vladfedorovich@gmail.com vladfedorovich@gmail.com
Gfgaliya@gmail.com Gfgaliya@gmail.com
romqa.guard@gmail.com romqa.guard@gmail.com
srfedotov@gmail.com srfedotov@gmail.com
vinjuli4ka2008@rambler.ru vinjuli4ka2008@rambler.ru
kuzzzal@gmail.com kuzzzal@gmail.com
zvetaan@gmail.com zvetaan@gmail.com
lepon@bk.ru lepon@bk.ru
y.robocopov@gmail.com y.robocopov@gmail.com
enchervinskaya@gmail.com enchervinskaya@gmail.com
volokos@gmail.com volokos@gmail.com
mtsalka@scnsoft.com mtsalka@scnsoft.com
dubnyak404@gmail.com dubnyak404@gmail.com
o.tibirkova@yandex.ru o.tibirkova@yandex.ru
a.nikiforov@uplab.ru a.nikiforov@uplab.ru
dmytriy.suslov@gmail.com dmytriy.suslov@gmail.com
s.shtukaturka@gmail.com s.shtukaturka@gmail.com
alex.dntv@gmail.com alex.dntv@gmail.com
m.chelyadenkov@gmail.com m.chelyadenkov@gmail.com
timur.shulgin@infocraft.ru timur.shulgin@infocraft.ru
sp.rusanov@gmail.com sp.rusanov@gmail.com
zyabra@gmail.com zyabra@gmail.com
timakova@fistashki.org timakova@fistashki.org
aknoraz@deloitte.ru aknoraz@deloitte.ru
sesyunin@realweb.ru sesyunin@realweb.ru
bravo.johnny@yandex.ru bravo.johnny@yandex.ru
didenko@braind.agency didenko@braind.agency
whysecondjuly@gmail.com whysecondjuly@gmail.com
yuzik.74@gmail.com yuzik.74@gmail.com
art@amado-id.ru art@amado-id.ru
9330733@mail.ru 9330733@mail.ru
ek.design11@gmail.com ek.design11@gmail.com
danila.zarechnev@gmail.com danila.zarechnev@gmail.com
kira.yakuhina@gmail.com kira.yakuhina@gmail.com
geiz@yandex.ru geiz@yandex.ru
tuning_a@mail.ru tuning_a@mail.ru
suonarama@gmail.com suonarama@gmail.com
abrakadavr@gmail.com abrakadavr@gmail.com
irina_z_z@mail.ru irina.huchak@gmail.com irina_z_z@mail.ru irina.huchak@gmail.com
ha@brightstudio.ru ha@brightstudio.ru
smorozov@qsoft.ru smorozov@qsoft.ru
a.reva@qsoft.ru a.reva@qsoft.ru
d.pogodin@itech-group.ru d.pogodin@itech-group.ru
lemma.ka@gmail.com lemma.ka@gmail.com

@ -1,117 +1,117 @@
makspirogov@gmail.com makspirogov@gmail.com
velesart@gmail.com velesart@gmail.com
dmitrij.pastushenko@gmail.com dmitrij.pastushenko@gmail.com
pavlov@complexsys.ru pavlov@complexsys.ru
ceo@pride-m.ru ceo@pride-m.ru
spinngewebex@gmail.com spinngewebex@gmail.com
an_b@inbox.ru an_b@inbox.ru
ilyuha86@gmail.com ilyuha86@gmail.com
juniperland@gmail.com juniperland@gmail.com
egor@yugs.ru egor@yugs.ru
kashlatch@gmail.com kashlatch@gmail.com
niozuki@mail.ru niozuki@mail.ru
Gnatovych@gmail.com Gnatovych@gmail.com
sahem@mail.ru sahem@mail.ru
zfalevich@gmail.com zfalevich@gmail.com
lalaviva@yandex.ru lalaviva@yandex.ru
z.ilnurri@gmail.com z.ilnurri@gmail.com
mmaslennikov@mail.ru mmaslennikov@mail.ru
info@wbest.ru info@wbest.ru
arthur.subbota@gmail.com arthur.subbota@gmail.com
goha@kiosov.com goha@kiosov.com
Igorfedorenko@mail.ru Igorfedorenko@mail.ru
annazayidova@gmail.com annazayidova@gmail.com
anton.reznichenko@gmail.com anton.reznichenko@gmail.com
me@flexure.ru me@flexure.ru
es@vipro.ru es@vipro.ru
km@colary.ru km@colary.ru
kiselev_s_l@mail.ru kiselev_s_l@mail.ru
a.reznichenko@clientlab.ru a.reznichenko@clientlab.ru
soldakov.p@yandex.ru soldakov.p@yandex.ru
ap@ds-p.ru ap@ds-p.ru
702752@gmail.com 702752@gmail.com
shpakova@sebbia.com shpakova@sebbia.com
skugarov@sebbia.com skugarov@sebbia.com
taranov@sebbia.com taranov@sebbia.com
rusakovevgen@gmail.com rusakovevgen@gmail.com
frostoffman@gmail.com frostoffman@gmail.com
a.khadeko@gmail.com a.khadeko@gmail.com
trogatyuk@gmail.com trogatyuk@gmail.com
hello@aokunev.com hello@aokunev.com
dengenich@gmail.com dengenich@gmail.com
Alexpozdnyakof@gmail.com Alexpozdnyakof@gmail.com
korobajr@ya.ru korobajr@ya.ru
pavlov@complexsys.ru pavlov@complexsys.ru
elizaveta.bandalet@gmail.com elizaveta.bandalet@gmail.com
deniskondrashov@yahoo.com deniskondrashov@yahoo.com
prokosha10@gmail.com prokosha10@gmail.com
i.flinn@yandex.ru i.flinn@yandex.ru
s.darbaidze@inostudio.com s.darbaidze@inostudio.com
zhurakoff@gmail.com zhurakoff@gmail.com
krylya@inbox.ru krylya@inbox.ru
146133@gmail.com 146133@gmail.com
i.flinn@yandex.ru i.flinn@yandex.ru
sasha.melbourne@gmail.com sasha.melbourne@gmail.com
tiano_taurus747@mail.ru tiano_taurus747@mail.ru
hip-hop-org@yandex.ru hip-hop-org@yandex.ru
j.tolkova@yandex.ru j.tolkova@yandex.ru
jaglin@itsoft.ru jaglin@itsoft.ru
den.volchkevich@gmail.com den.volchkevich@gmail.com
yakimov.dmitriy@gmail.com yakimov.dmitriy@gmail.com
994677@mail.ru 994677@mail.ru
rumbeshta@userstory.ru rumbeshta@userstory.ru
ylkin_list@mail.ru ylkin_list@mail.ru
salofoot@fermastudio.ru salofoot@fermastudio.ru
smiley1776@gmail.com smiley1776@gmail.com
info@darneo.ru info@darneo.ru
egor@studiofact.ru egor@studiofact.ru
alevtina.i.danilova@gmail.com alevtina.i.danilova@gmail.com
puponina.irina@gmail.com puponina.irina@gmail.com
yevseev@mail.ru yevseev@mail.ru
ekde@wide-web.spb.ru ekde@wide-web.spb.ru
corpas@gmail.com corpas@gmail.com
nitrohlorid@gmail.com nitrohlorid@gmail.com
kayl24brof@gmail.com kayl24brof@gmail.com
skovalska@mail.ru skovalska@mail.ru
Dmitry.eremin7@gmail.com Dmitry.eremin7@gmail.com
Nikolebedev@mail.ru Nikolebedev@mail.ru
ishulga86@gmail.com ishulga86@gmail.com
bobafas@gmail.com bobafas@gmail.com
kalina531345@gmail.com kalina531345@gmail.com
dsgn.shots@gmail.com dsgn.shots@gmail.com
dsukhanova@gmail.com dsukhanova@gmail.com
kizilov.s@gmail.com kizilov.s@gmail.com
zlk.marjana@gmail.com zlk.marjana@gmail.com
nava011235@gmail.com nava011235@gmail.com
i.shymanskyi@gmail.com i.shymanskyi@gmail.com
anastasy.petrenko87@gmail.com anastasy.petrenko87@gmail.com
dinozavrix@gmail.com dinozavrix@gmail.com
yana.berezhnaya999@gmail.com yana.berezhnaya999@gmail.com
person.ira@gmail.com person.ira@gmail.com
bershonok@gmail.com bershonok@gmail.com
vivi_bvo@mail.ru vivi_bvo@mail.ru
lens2002@gmail.com lens2002@gmail.com
ohmeinkot@gmail.com ohmeinkot@gmail.com
d22s@ya.ru d22s@ya.ru
masha49@yandex.ru masha49@yandex.ru
biz.trp@gmail.com biz.trp@gmail.com
leo55506@gmail.com leo55506@gmail.com
ksenia.vitkova@gmail.com ksenia.vitkova@gmail.com
e.poberezhnik@artw.ru e.poberezhnik@artw.ru
alexzarkov@gmail.com alexzarkov@gmail.com
ekde@wide-web.spb.ru ekde@wide-web.spb.ru
vemelin@gmail.com vemelin@gmail.com
gausf2@gmail.com gausf2@gmail.com
vd@wearewowagency.com vd@wearewowagency.com
va@wearewowagency.com va@wearewowagency.com
domrachv@gmail.com domrachv@gmail.com
ad@wearewowagency.com ad@wearewowagency.com
jalalovna@yandex.ru jalalovna@yandex.ru
mohov-g@yandex.ru mohov-g@yandex.ru
st.wasp@yandex.ru st.wasp@yandex.ru
Irina.lisofa@gmail.com Irina.lisofa@gmail.com
Kornblumchen@yandex.ru Kornblumchen@yandex.ru
albytime@gmail.com albytime@gmail.com
as.plyaskin@gmail.com as.plyaskin@gmail.com
trunovaon@gmail.com trunovaon@gmail.com
yuri.a.k.design@gmail.com yuri.a.k.design@gmail.com

@ -3,33 +3,45 @@ import os
import django import django
import sys import sys
import datetime import datetime
print(1)
start = datetime.datetime.now() start = datetime.datetime.now()
sys.path.append("/var/www/projects/codemy/") sys.path.append("/var/www/projects/codemy/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup() django.setup()
print(2)
from courses.models import CourseMap from courses.models import CourseMap
from journals.models import TeacherJ, LessonJ, HomeworkJ, HomeworkTry, CourseThemeJ from journals.models import TeacherJ, LessonJ, HomeworkJ, HomeworkTry, CourseThemeJ
# Получить все журналы, где начато обучение # Получить все журналы, где начато обучение
for journal in TeacherJ.objects.filter(status='W').order_by('-id'): print(3)
if HomeworkTry.objects.filter(parent__parent__parent=journal).exists(): last = TeacherJ.objects.filter(status='W').order_by('-id').last().id
print(4)
for journal in TeacherJ.objects.filter(id=26933).order_by('-id'):
print(journal.id)
if HomeworkTry.objects.filter(material__course__id=journal.course.id, student__id=journal.student.id).exists():
print('4a')
hw = int(CourseMap.objects.get( hw = int(CourseMap.objects.get(
homework=HomeworkTry.objects.filter(parent__parent__parent=journal).order_by('id').last().material).sort) homework=HomeworkTry.objects.filter(parent__parent__parent=journal).order_by('id').last().material).sort)
before = [] print(hw)
for i in LessonJ.objects.filter(parent__parent=journal): for i in LessonJ.objects.filter(parent__parent=journal):
if int(CourseMap.objects.get(lesson=i.material).sort): if int(CourseMap.objects.get(lesson=i.material).sort) > hw:
i.date = None i.date = None
i.f_date = None i.f_date = None
i.success = False i.success = False
i.save() i.save()
else: else:
i.saw_this() try:
i.saw_this()
except Exception as e:
print(e)
print(i)
for ct in CourseThemeJ.objects.filter(parent=journal): for ct in CourseThemeJ.objects.filter(parent=journal):
if LessonJ.objects.filter(parent=ct).count() == LessonJ.objects.filter(parent=ct, date=None).count(): if LessonJ.objects.filter(parent=ct).count() == LessonJ.objects.filter(parent=ct, date=None).count():
ct.date = None ct.date = None
ct.save() ct.save()
for i in HomeworkJ.objects.filter(f_date=None).exclude(date=None): print(5)
i.open_next() #for i in HomeworkJ.objects.filter(f_date=None).exclude(date=None):
# i.open_next()

@ -66,7 +66,7 @@ for _user in User.objects.all():
_ft = datetime.datetime.now() _ft = datetime.datetime.now()
_about_time.append((_ft - _st).microseconds) _about_time.append((_ft - _st).microseconds)
_average = (((_all - _n) * (sum(_about_time) / len(_about_time)))/1000000)/60 _average = (((_all - _n) * (sum(_about_time) / len(_about_time)))/1000000)/60
show_progress(_all, _n, post=' // {0:6.4} мин '.format(_average)) show_progress(_all, _n, post=' // "Удаление дуближей журналов" // Расчетное оставщееся время Этапа: {0:6.4} мин '.format(_average))
_n += 1 _n += 1
finish = datetime.datetime.now() finish = datetime.datetime.now()

@ -18,7 +18,7 @@ _themes = {}
for i in CourseTheme.objects.filter(course__id=20): for i in CourseTheme.objects.filter(course__id=20):
_themes[i.sort] = 0 _themes[i.sort] = 0
for _j in CourseThemeJ.objects.filter(material=i, parent__progress__gt=1, f_date=None, for _j in CourseThemeJ.objects.filter(material=i, parent__progress__gt=1, f_date=None,
success=False).exclude(date=None): success=False).exclude(date=None):
if Bill.objects.filter(user=_j.student, status='F', service__course=20).exists(): if Bill.objects.filter(user=_j.student, status='F', service__course=20).exists():
_themes[i.sort] += 1 _themes[i.sort] += 1

@ -1,4 +1,3 @@
# coding=utf-8
# Получить список файлов папки reports # Получить список файлов папки reports
# Выдать выбор отчета # Выдать выбор отчета
# Запустить файл # Запустить файл

@ -86,16 +86,16 @@
<id>3602</id> <id>3602</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Я уже писал об этом и после четвёртого урока, и после пятого,&nbsp; но рассинхронизация становится всё хуже и хуже. Что-то понять, когда ты видишь одно, а слышишь совсем другое - это просто взрыв мозга.</p> <text><p>Я уже писал об этом и после четвёртого урока, и после пятого,&nbsp; но рассинхронизация становится всё хуже и хуже. Что-то понять, когда ты видишь одно, а слышишь совсем другое - это просто взрыв мозга.</p>
<p>Кроме того, не было ни слова сказано о</p> <p>Кроме того, не было ни слова сказано о</p>
<ul> <ul>
<li>Вопросы кроссбраузерности &ndash; логика введения новых компонентнов Javascript ведущими браузерами</li> <li>Вопросы кроссбраузерности &ndash; логика введения новых компонентнов Javascript ведущими браузерами</li>
<li>Практическая сторона процесса стандартизации,</li> <li>Практическая сторона процесса стандартизации,</li>
</ul> </ul>
<p>хотя это было анонсировано в описании урока. Или только я этого не услышал?</p> <p>хотя это было анонсировано в описании урока. Или только я этого не услышал?</p>
</text> </text>
<nick>Михаил</nick> <nick>Михаил</nick>
<time></time> <time></time>
@ -109,7 +109,7 @@
<id>3841</id> <id>3841</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>К сожалению, на 30 минуте просто взял и закрыл. и стал смотреть подобные видео уроки на ютубе. Просто невозможно смотреть из-за этого рассинхрона. Очень жаль. Писали выше &quot;Да логики как-то нет!!!! Получается что тупо читают лекцию... ((((( Ожидал большего. В начале была в лекциях жизнь, интерес... желание... А сейчас как-то это напоминает вебинар, на котором рассказывают обо всем, но не о чем. Хотя где-то и затрагиваться моменты и логика работы скрипта. Я понимаю что нельзя все рассказать за 1,5 часа, но можно было бы тогда хоть материал дать, шпаргалку в которой бы написано было все что надо знать.&quot; - полностью с этим согласен :(</p> <text><p>К сожалению, на 30 минуте просто взял и закрыл. и стал смотреть подобные видео уроки на ютубе. Просто невозможно смотреть из-за этого рассинхрона. Очень жаль. Писали выше &quot;Да логики как-то нет!!!! Получается что тупо читают лекцию... ((((( Ожидал большего. В начале была в лекциях жизнь, интерес... желание... А сейчас как-то это напоминает вебинар, на котором рассказывают обо всем, но не о чем. Хотя где-то и затрагиваться моменты и логика работы скрипта. Я понимаю что нельзя все рассказать за 1,5 часа, но можно было бы тогда хоть материал дать, шпаргалку в которой бы написано было все что надо знать.&quot; - полностью с этим согласен :(</p>
</text> </text>
<nick>Кирилл</nick> <nick>Кирилл</nick>
<time></time> <time></time>
@ -123,7 +123,7 @@
<id>3948</id> <id>3948</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>- полностью с этим согласен :( s vami siwu В начале была в лекциях жизнь, интерес... желание... А сейчас как-то это напоминает вебинар, на котором рассказывают обо всем, но не о чем.</p> <text><p>- полностью с этим согласен :( s vami siwu В начале была в лекциях жизнь, интерес... желание... А сейчас как-то это напоминает вебинар, на котором рассказывают обо всем, но не о чем.</p>
</text> </text>
<nick>Без имени</nick> <nick>Без имени</nick>
<time></time> <time></time>
@ -137,7 +137,7 @@
<id>4439</id> <id>4439</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>На многих бесплатных курсах на ютубе и то доходчивее обьясняют и видео от звука не отстаёт:((&nbsp;</p> <text><p>На многих бесплатных курсах на ютубе и то доходчивее обьясняют и видео от звука не отстаёт:((&nbsp;</p>
</text> </text>
<nick>Роман</nick> <nick>Роман</nick>
<time></time> <time></time>
@ -151,13 +151,13 @@
<id>4593</id> <id>4593</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Всем привет!</p> <text><p>Всем привет!</p>
<p>Мне то-же не понравилась рассинхронизация звука и видео, просто монтаж видео делался не программистом :)</p> <p>Мне то-же не понравилась рассинхронизация звука и видео, просто монтаж видео делался не программистом :)</p>
<p>Преподаватель дает материал компактно и доходчиво. Мне нравится.</p> <p>Преподаватель дает материал компактно и доходчиво. Мне нравится.</p>
<p>Предлагаю перередактировать видео всего курса с нормальной синхронизацией, убрать <a href="http://ssmaker.ru/af6cd7d1.png" target="_blank">косяки</a> и добавить оптимизацию пространства картинки&nbsp;как на <a href="http://ssmaker.ru/884e4a79.png" target="_blank">рисунке (ссылка)</a>. Готов выполнить.</p> <p>Предлагаю перередактировать видео всего курса с нормальной синхронизацией, убрать <a href="http://ssmaker.ru/af6cd7d1.png" target="_blank">косяки</a> и добавить оптимизацию пространства картинки&nbsp;как на <a href="http://ssmaker.ru/884e4a79.png" target="_blank">рисунке (ссылка)</a>. Готов выполнить.</p>
</text> </text>
<nick>Сергей</nick> <nick>Сергей</nick>
<time></time> <time></time>
@ -171,7 +171,7 @@
<id>5494</id> <id>5494</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Я просто возмущена тем, что в таком режиме (рассинхронизации) невозможно учиться и что-то вообще понять... А главное, рассказывает преподаватель доходчиво... и очень обидно, что просто кто-то слепил все тяп-ляп, испортив хорошую вещь... А еще - переделать всё это элементарно, имея исходники... Почему ничего не меняется как минимум месяц, судя по первым комментариям?&nbsp; Кто-нибудь кроме недовольных учеников вообще их читает?</p> <text><p>Я просто возмущена тем, что в таком режиме (рассинхронизации) невозможно учиться и что-то вообще понять... А главное, рассказывает преподаватель доходчиво... и очень обидно, что просто кто-то слепил все тяп-ляп, испортив хорошую вещь... А еще - переделать всё это элементарно, имея исходники... Почему ничего не меняется как минимум месяц, судя по первым комментариям?&nbsp; Кто-нибудь кроме недовольных учеников вообще их читает?</p>
</text> </text>
<nick>Анастасия</nick> <nick>Анастасия</nick>
<time></time> <time></time>
@ -185,7 +185,7 @@
<id>5495</id> <id>5495</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Интересно, а у всех получается повторить, что демонстрируется на лекции, у меня уже на предыдущей и этой лекции некоторые элементы не работают как у лектора. Делал все как и лектор, на прошлом занятии даже сравнивал с &quot;рыбой&quot; присланной к заданию - визуально всё правильно, но у меня, в отличие от &quot;рыбы&quot; не все работает!</p> <text><p>Интересно, а у всех получается повторить, что демонстрируется на лекции, у меня уже на предыдущей и этой лекции некоторые элементы не работают как у лектора. Делал все как и лектор, на прошлом занятии даже сравнивал с &quot;рыбой&quot; присланной к заданию - визуально всё правильно, но у меня, в отличие от &quot;рыбы&quot; не все работает!</p>
</text> </text>
<nick>Сергей</nick> <nick>Сергей</nick>
<time></time> <time></time>
@ -199,7 +199,7 @@
<id>5653</id> <id>5653</id>
<parent_id>8096</parent_id> <parent_id>8096</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Пару раз за прошлую лекцию он делал опечатки и у него тоже не работало.&nbsp;Потом их поправлял &quot;незаметно&quot;, по ходу рассказа о других вещах. А еще попробуйте пропустить Ваш код через HTML-валидатор, вот этот:&nbsp;<a href="https://validator.w3.org/#validate_by_upload">https://validator.w3.org/#validate_by_upload</a>&nbsp;. Возможно выдаваемые им ошибки подскажут, где Вы ошиблись. А так обычное для программирования дело: опечатки в одной букве, пропущенная точка с запятой и т.п.</p> <text><p>Пару раз за прошлую лекцию он делал опечатки и у него тоже не работало.&nbsp;Потом их поправлял &quot;незаметно&quot;, по ходу рассказа о других вещах. А еще попробуйте пропустить Ваш код через HTML-валидатор, вот этот:&nbsp;<a href="https://validator.w3.org/#validate_by_upload">https://validator.w3.org/#validate_by_upload</a>&nbsp;. Возможно выдаваемые им ошибки подскажут, где Вы ошиблись. А так обычное для программирования дело: опечатки в одной букве, пропущенная точка с запятой и т.п.</p>
</text> </text>
<nick>Вячеслав</nick> <nick>Вячеслав</nick>
<time></time> <time></time>
@ -213,7 +213,7 @@
<id>5654</id> <id>5654</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>P.S. Если Вы так и не сможете найти почему не работает, попробуйте еще открыть текст в &quot;умном&quot; текстовом редакторе, например Notepad++. Он подсвечивает синтаксис, возможно заметите опечатку или незакрытый тег. Еще есть средства разработчика во &nbsp;всех популярных&nbsp;браузерах, тоже полезны для поиска ошибок.</p> <text><p>P.S. Если Вы так и не сможете найти почему не работает, попробуйте еще открыть текст в &quot;умном&quot; текстовом редакторе, например Notepad++. Он подсвечивает синтаксис, возможно заметите опечатку или незакрытый тег. Еще есть средства разработчика во &nbsp;всех популярных&nbsp;браузерах, тоже полезны для поиска ошибок.</p>
</text> </text>
<nick>Вячеслав</nick> <nick>Вячеслав</nick>
<time></time> <time></time>
@ -227,7 +227,7 @@
<id>5940</id> <id>5940</id>
<parent_id>8256</parent_id> <parent_id>8256</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>&quot; Потом их поправлял &quot;незаметно&quot;, по ходу рассказа о других вещах. &quot; - тоже подметил. Правильнее,&nbsp;грамотнее и полезнее для новичков было бы, если б лектор указывал на ошибки, опечатки и их исправление, а не делал бы это&nbsp;молча, как бы тайком.&nbsp;</p> <text><p>&quot; Потом их поправлял &quot;незаметно&quot;, по ходу рассказа о других вещах. &quot; - тоже подметил. Правильнее,&nbsp;грамотнее и полезнее для новичков было бы, если б лектор указывал на ошибки, опечатки и их исправление, а не делал бы это&nbsp;молча, как бы тайком.&nbsp;</p>
</text> </text>
<nick>Константин</nick> <nick>Константин</nick>
<time></time> <time></time>
@ -241,7 +241,7 @@
<id>6181</id> <id>6181</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Запись уже невозможно открыть. Может быть на ремонте?</p> <text><p>Запись уже невозможно открыть. Может быть на ремонте?</p>
</text> </text>
<nick>ANATOLY</nick> <nick>ANATOLY</nick>
<time></time> <time></time>
@ -255,12 +255,12 @@
<id>7719</id> <id>7719</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Вторая часть лекции - очень сумбурная и непонятная. Похоже, что чем сложнее тема - тем хуже объяснение!</p> <text><p>Вторая часть лекции - очень сумбурная и непонятная. Похоже, что чем сложнее тема - тем хуже объяснение!</p>
<p>Кто-нибудь, кроме студентов, видит, что изображение&nbsp;и&nbsp;речь рассинхронизированы!</p> <p>Кто-нибудь, кроме студентов, видит, что изображение&nbsp;и&nbsp;речь рассинхронизированы!</p>
<p>С уважением,<br /> <p>С уважением,<br />
D</p> D</p>
</text> </text>
<nick>Без имени</nick> <nick>Без имени</nick>
<time></time> <time></time>
@ -274,7 +274,7 @@ D</p>
<id>8843</id> <id>8843</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Когда с рассинхроном разберётесь?? Вообще теряется нить повествования. Невозможно так обучаться.</p> <text><p>Когда с рассинхроном разберётесь?? Вообще теряется нить повествования. Невозможно так обучаться.</p>
</text> </text>
<nick>Вячеслав</nick> <nick>Вячеслав</nick>
<time></time> <time></time>
@ -288,7 +288,7 @@ D</p>
<id>9236</id> <id>9236</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Сильно раздражает не соответствие лекции&nbsp;и &quot;рыбы&quot;, а так же отставание экрана. Куда теперь отправлять ДЗ тоже не понятно.Подскажите!</p> <text><p>Сильно раздражает не соответствие лекции&nbsp;и &quot;рыбы&quot;, а так же отставание экрана. Куда теперь отправлять ДЗ тоже не понятно.Подскажите!</p>
</text> </text>
<nick>Ольга</nick> <nick>Ольга</nick>
<time></time> <time></time>
@ -302,7 +302,7 @@ D</p>
<id>9345</id> <id>9345</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Мое предложение - подать совместную жалобу и запросить возврат средств. Никакой обратной связи, обучаться невозможно изза недостатка информации, услуга оказывается не должным образом. Кто за - пишите whatsapp 79251879198 будем придумывать что делать)</p> <text><p>Мое предложение - подать совместную жалобу и запросить возврат средств. Никакой обратной связи, обучаться невозможно изза недостатка информации, услуга оказывается не должным образом. Кто за - пишите whatsapp 79251879198 будем придумывать что делать)</p>
</text> </text>
<nick>Леонид</nick> <nick>Леонид</nick>
<time></time> <time></time>
@ -316,6 +316,6 @@ D</p>
<id>9483</id> <id>9483</id>
<parent_id>0</parent_id> <parent_id>0</parent_id>
<root_id></root_id> <root_id></root_id>
<text><p>Вот люди пишут:&quot;Я понимаю что нельзя все рассказать за 1,5 часа&quot;, а за 50 минут? Лекции становятся все короче и сумбурнее, полностью согласна, что качество услуги никак не соответствует цене.</p> <text><p>Вот люди пишут:&quot;Я понимаю что нельзя все рассказать за 1,5 часа&quot;, а за 50 минут? Лекции становятся все короче и сумбурнее, полностью согласна, что качество услуги никак не соответствует цене.</p>
</text> </text>
<nick>Елизавета</nick> <nick>Елизавета</nick>

@ -11,7 +11,7 @@ django.setup()
from journals.models import CourseMap, LessonJ, TeacherJ, HomeworkTry from journals.models import CourseMap, LessonJ, TeacherJ, HomeworkTry
from lms.tools import show_progress from lms.tools import show_progress
_NEED_OPEN = LessonJ.objects.get(material__id='1154', student__email='rnet2005@gmail.com') _NEED_OPEN = LessonJ.objects.get(material__id='1154', student__email='parabellum07@gmail.com')
_TEACHERJ_FILTER = {'progress__gte': 0} _TEACHERJ_FILTER = {'progress__gte': 0}
_TEACHERJ_EXCLUDE = {'teacher': None} _TEACHERJ_EXCLUDE = {'teacher': None}

@ -8,9 +8,9 @@ BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append("/var/www/projects/codemy/") sys.path.append("/var/www/projects/codemy/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup() django.setup()
from access.models import User
from courses.models import Course, CourseTheme from courses.models import Course, CourseTheme
from journals.models import CourseThemeJ from journals.models import HomeworkTry, HomeworkJ, CourseThemeJ
print('## Почты пользователей в статусе сдано по теме') print('## Почты пользователей в статусе сдано по теме')

@ -1,38 +1,38 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from access.models import User from access.models import User
from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django import forms from django import forms
class UserCreationForm(forms.ModelForm): class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput) password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta: class Meta:
model = User model = User
fields = '__all__' fields = '__all__'
def clean_password2(self): def clean_password2(self):
password1 = self.cleaned_data.get("password1") password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2") password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2: if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords don't match") raise forms.ValidationError("Passwords don't match")
return password2 return password2
def save(self, commit=True): def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False) user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"]) user.set_password(self.cleaned_data["password1"])
if commit: if commit:
user.save() user.save()
return user return user
class UserChangeForm(forms.ModelForm): class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField() password = ReadOnlyPasswordHashField()
class Meta: class Meta:
model = User model = User
fields = '__all__' fields = '__all__'
def clean_password(self): def clean_password(self):
return self.initial["password"] return self.initial["password"]

@ -1,448 +1,448 @@
# coding=utf-8 # coding=utf-8
import datetime import datetime
from lms.decors import out_api_decor, api_decor from lms.decors import out_api_decor, api_decor
from access.models import TrafSource, User, TrafHistory # , UserSync from access.models import TrafSource, User, TrafHistory # , UserSync
from lms.regex import check_email from lms.regex import check_email
from management.letters import sent_registration from management.letters import sent_registration
from finance.models import Price, Bill from finance.models import Price, Bill
from lms.tools import out_date_format from lms.tools import out_date_format
import hashlib import hashlib
from django.contrib import auth from django.contrib import auth
from lms.settings import SECRET_KEY, SUPERVISOR, MANAGER from lms.settings import SECRET_KEY, SUPERVISOR, MANAGER
from django.http import Http404 from django.http import Http404
@api_decor(without_auth=False) @api_decor(without_auth=False)
def set_in_user(request, context): def set_in_user(request, context):
# Наша установка # Наша установка
data = None data = None
context['code'] = '0' context['code'] = '0'
context['response'] = '' context['response'] = ''
if request.user and request.user.is_authenticated() and request.user.is_admin: if request.user and request.user.is_authenticated() and request.user.is_admin:
if request.method: if request.method:
if request.method == 'POST': if request.method == 'POST':
data = request.POST data = request.POST
elif request.method == 'GET': elif request.method == 'GET':
data = request.GET data = request.GET
else: else:
raise Http404 raise Http404
if not data or not (data.get('SERVICE') or data.get('USER')) or (data.get('SERVICE') and not data.get('USER')): if not data or not (data.get('SERVICE') or data.get('USER')) or (data.get('SERVICE') and not data.get('USER')):
context['response'] = u'REQUEST IS NOT VALID. ' \ context['response'] = u'REQUEST IS NOT VALID. ' \
u'USER - user email (required) / ' \ u'USER - user email (required) / ' \
u'SERVICE - service token / ' \ u'SERVICE - service token / ' \
u'GIFT - will set bill in a payed status / ' \ u'GIFT - will set bill in a payed status / ' \
u'PRICE - set self price to the service' u'PRICE - set self price to the service'
return context return context
service = None service = None
if data.get('SERVICE'): if data.get('SERVICE'):
try: try:
service = Price.objects.get(key=data.get('SERVICE')) service = Price.objects.get(key=data.get('SERVICE'))
except Price.DoesNotExist: except Price.DoesNotExist:
context['response'] = u'SERVICE NOT FOUND' context['response'] = u'SERVICE NOT FOUND'
return context return context
if data.get('USER') and check_email(data.get('USER')): if data.get('USER') and check_email(data.get('USER')):
result, user = self_create_user(data.get('USER'), sent_letter=True) result, user = self_create_user(data.get('USER'), sent_letter=True)
context['response'] = 'USER CREATED.' if result else 'USER ALREADY EXISTS.' context['response'] = 'USER CREATED.' if result else 'USER ALREADY EXISTS.'
elif not check_email(data.get('USER')): elif not check_email(data.get('USER')):
context['response'] = 'USER EMAIL IS NOT VALID' context['response'] = 'USER EMAIL IS NOT VALID'
if service and user: if service and user:
bill, created = Bill.objects.get_or_create(service=service, bill, created = Bill.objects.get_or_create(service=service,
gift=bool(data.get('GIFT')), gift=bool(data.get('GIFT')),
user=user, user=user,
status='F' if data.get('GIFT') else 'W', status='F' if data.get('GIFT') else 'W',
manager=User.objects.get(email=MANAGER), manager=User.objects.get(email=MANAGER),
price=data['PRICE'] if data.get('PRICE') else service.cost) price=data['PRICE'] if data.get('PRICE') else service.cost)
if created: if created:
if data.get('GIFT'): if data.get('GIFT'):
context['response'] += ' ACCESS OPENED. IT IS A GIFT.' context['response'] += ' ACCESS OPENED. IT IS A GIFT.'
else: else:
context['response'] += ' THIS OFFER SENT TO THE USER. THE SERVICE PRICE: %s' % str(bill.price) context['response'] += ' THIS OFFER SENT TO THE USER. THE SERVICE PRICE: %s' % str(bill.price)
else: else:
context['response'] += ' BILL ALREADY EXISTS id:%s' % str(bill.id) context['response'] += ' BILL ALREADY EXISTS id:%s' % str(bill.id)
return context return context
def self_check_token(token): def self_check_token(token):
try: try:
source = TrafSource.objects.get(on=True, token=token) source = TrafSource.objects.get(on=True, token=token)
except TrafSource.DoesNotExist: except TrafSource.DoesNotExist:
return [False, None] return [False, None]
else: else:
return [True, source] return [True, source]
def self_check_user_exists(email): def self_check_user_exists(email):
email = email.lower() email = email.lower()
try: try:
user = User.objects.get(email=email) user = User.objects.get(email=email)
except User.DoesNotExist: except User.DoesNotExist:
return [False, None] return [False, None]
else: else:
return [True, user] return [True, user]
def self_create_user(email, phone=None, sent_letter=True): def self_create_user(email, phone=None, sent_letter=True):
email = email.lower() email = email.lower()
try: try:
user = User.objects.get(email=email) user = User.objects.get(email=email)
except User.DoesNotExist: except User.DoesNotExist:
user = User.objects.create_user(email=email, sent_letter=sent_letter) user = User.objects.create_user(email=email, sent_letter=sent_letter)
user.reg_status = '1' user.reg_status = '1'
user.refer = 'B' user.refer = 'B'
user.is_active = False user.is_active = False
if phone: if phone:
user.phone = phone user.phone = phone
user.save() user.save()
return [True, user] return [True, user]
else: else:
return [False, user] return [False, user]
def self_create_bill(user, service_key, uid=None): def self_create_bill(user, service_key, uid=None):
# Создание счета для пользователя по ключу услуги # Создание счета для пользователя по ключу услуги
description = u'' description = u''
bill = None bill = None
result = False result = False
try: try:
price = Price.objects.get(key=service_key) price = Price.objects.get(key=service_key)
except Price.DoesNotExist: except Price.DoesNotExist:
description = u'Счет по ключу не найден' description = u'Счет по ключу не найден'
else: else:
bill, c = Bill.objects.get_or_create(user=user, manager=User.objects.get(email=SUPERVISOR), service=price) bill, c = Bill.objects.get_or_create(user=user, manager=User.objects.get(email=SUPERVISOR), service=price)
if bill.status == 'F': if bill.status == 'F':
description = u'Счет для данного пользователя уже был создан {0}'.format( description = u'Счет для данного пользователя уже был создан {0}'.format(
out_date_format(bill.finish_date, no_time=True)) out_date_format(bill.finish_date, no_time=True))
result = False result = False
else: else:
result = True result = True
description = u'Счет успешно создан. Приятного обучения' description = u'Счет успешно создан. Приятного обучения'
if bill.status in ['C', 'H']: if bill.status in ['C', 'H']:
bill.status = 'P' bill.status = 'P'
bill.status_changed = datetime.datetime.now() bill.status_changed = datetime.datetime.now()
bill.save() bill.save()
if uid: if uid:
bill.admitad_uid = uid bill.admitad_uid = uid
bill.save() bill.save()
return [result, description, bill] return [result, description, bill]
def code_dict(d): def code_dict(d):
# Преобразование словаря для передачи по HTTP # Преобразование словаря для передачи по HTTP
return u'||'.join(list([u'{0}|{1}'.format(key, value) for key, value in d.items()])) return u'||'.join(list([u'{0}|{1}'.format(key, value) for key, value in d.items()]))
def decode_dict(s): def decode_dict(s):
# Расшифровка словаря из строки, переданого по HTTP # Расшифровка словаря из строки, переданого по HTTP
result = {} result = {}
for one in s.split(u'||'): for one in s.split(u'||'):
__tmp = one.split(u'|') __tmp = one.split(u'|')
result[__tmp[0]] = __tmp[1] result[__tmp[0]] = __tmp[1]
return result return result
def get_sync_data(user): def get_sync_data(user):
# Синхронизировать пользователя с остальными LMS # Синхронизировать пользователя с остальными LMS
# Отправить в LMS измнениея по пользователю или нового пользователя # Отправить в LMS измнениея по пользователю или нового пользователя
# POST['user'] = {} # Поля с полной информацией пользователя # POST['user'] = {} # Поля с полной информацией пользователя
_data = {} _data = {}
_keys = [] _keys = []
exclude = ['id', 'customer', 'deactivate', 'delay', 'delay_description', 'delay_date', 'changed_email', 'status', exclude = ['id', 'customer', 'deactivate', 'delay', 'delay_description', 'delay_date', 'changed_email', 'status',
'last_time', 'date_joined', 'avatar', 'last_login', 'activate_time', 'in_avatar'] 'last_time', 'date_joined', 'avatar', 'last_login', 'activate_time', 'in_avatar']
for key in user._meta.local_concrete_fields: for key in user._meta.local_concrete_fields:
if key.name not in exclude: if key.name not in exclude:
_tmp = key.value_to_string(user) _tmp = key.value_to_string(user)
if _tmp: if _tmp:
_keys.append(key.name) _keys.append(key.name)
_data[key.name] = _tmp _data[key.name] = _tmp
_tmp = code_dict(_data) _tmp = code_dict(_data)
return {'data': _tmp, return {'data': _tmp,
'hash': hashlib.md5(_tmp.encode('utf-8')).hexdigest()} 'hash': hashlib.md5(_tmp.encode('utf-8')).hexdigest()}
''' '''
def sent_sync_user(user): def sent_sync_user(user):
data = get_sync_data(user) data = get_sync_data(user)
data['secret_key'] = SECRET_KEY data['secret_key'] = SECRET_KEY
data['source'] = DOMAIN data['source'] = DOMAIN
## Если провал на одном из этапов - пропустить синхронизацию этого пользователя ## Если провал на одном из этапов - пропустить синхронизацию этого пользователя
# Авторизация на сервисе под системным пользователем # Авторизация на сервисе под системным пользователем
result = 0 result = 0
for HOST in REL_LMS: for HOST in REL_LMS:
__tmp = HOST['protocol'] + HOST['url'] __tmp = HOST['protocol'] + HOST['url']
if __tmp != DOMAIN: if __tmp != DOMAIN:
log = UserSync.objects.create(user=user, source=DOMAIN, dist=__tmp, data=str(data)) log = UserSync.objects.create(user=user, source=DOMAIN, dist=__tmp, data=str(data))
_request = requests.post(__tmp + 'access/sync_user/', data=data) _request = requests.post(__tmp + 'access/sync_user/', data=data)
if _request.status_code == 200: if _request.status_code == 200:
_tmp = ast.literal_eval(_request.text) _tmp = ast.literal_eval(_request.text)
if _tmp['code'] == '1': if _tmp['code'] == '1':
result += 1 result += 1
log.good_sync() log.good_sync()
else: else:
log.fail_sync() log.fail_sync()
else: else:
log.fail_sync() log.fail_sync()
return result == len(REL_LMS)-1 return result == len(REL_LMS)-1
''' '''
@out_api_decor(without_auth=True, method='POST', need_keys=['email', 'password', 'secret_key'], check_request=True) @out_api_decor(without_auth=True, method='POST', need_keys=['email', 'password', 'secret_key'], check_request=True)
def service_auth(request, context): def service_auth(request, context):
# Удаленная авторизация для внутренних процессов # Удаленная авторизация для внутренних процессов
# Авторизация # Авторизация
if request.POST['secret_key'] == SECRET_KEY: if request.POST['secret_key'] == SECRET_KEY:
email = request.POST['email'].lower() email = request.POST['email'].lower()
user = auth.authenticate(email=email, password=request.POST.get('password')) user = auth.authenticate(email=email, password=request.POST.get('password'))
if user is not None: if user is not None:
context['code'] = '1' context['code'] = '1'
context['response'] = u'AUTH_SUCCESS' context['response'] = u'AUTH_SUCCESS'
auth.login(request, user) auth.login(request, user)
elif user is None: elif user is None:
context['response'] = u'По введенным данным пользователь не найден' context['response'] = u'По введенным данным пользователь не найден'
context['code'] = '0' context['code'] = '0'
else: else:
context['response'] = u"Не верные данные. Повторите попытку" context['response'] = u"Не верные данные. Повторите попытку"
context['code'] = '0' context['code'] = '0'
else: else:
context['response'] = u'AUTH SUCCESS' context['response'] = u'AUTH SUCCESS'
context['code'] = '0' context['code'] = '0'
return context return context
''' '''
@out_api_decor(without_auth=True, method='POST', need_keys=['secret_key', 'data', 'hash', 'source'], check_request=True) @out_api_decor(without_auth=True, method='POST', need_keys=['secret_key', 'data', 'hash', 'source'], check_request=True)
def sync_user(request, context): def sync_user(request, context):
if request.POST['secret_key'] == SECRET_KEY: if request.POST['secret_key'] == SECRET_KEY:
if hashlib.md5(request.POST['data'].encode('utf-8')).hexdigest() != request.POST['hash']: if hashlib.md5(request.POST['data'].encode('utf-8')).hexdigest() != request.POST['hash']:
context['code'] = '0' context['code'] = '0'
context['data'] = '' context['data'] = ''
context['response'] = u'Не сходится хеш данных' context['response'] = u'Не сходится хеш данных'
return context return context
data = decode_dict(request.POST['data']) data = decode_dict(request.POST['data'])
# Получение пользователя для вставки # Получение пользователя для вставки
try: try:
user = User.objects.get(email=data['email']) user = User.objects.get(email=data['email'])
except User.DoesNotExist: except User.DoesNotExist:
# Создать пользователя # Создать пользователя
user = User.objects.create(email=data['email']) user = User.objects.create(email=data['email'])
log = UserSync.objects.create(user=user, source=request.POST['source'], dist=DOMAIN, data=str(request.POST['data'])) log = UserSync.objects.create(user=user, source=request.POST['source'], dist=DOMAIN, data=str(request.POST['data']))
save = False save = False
if 'refer' in data and user.refer != data['refer']: if 'refer' in data and user.refer != data['refer']:
user.refer = data['refer'] user.refer = data['refer']
save = True save = True
if 'refer_source' in data and user.refer_source != data['refer_source']: if 'refer_source' in data and user.refer_source != data['refer_source']:
user.refer_source = data['refer_source'] user.refer_source = data['refer_source']
save = True save = True
if 'private' in data and user.private != data['private']: if 'private' in data and user.private != data['private']:
user.private = data['private'] user.private = data['private']
save = True save = True
if 'interactive_key' in data and user.interactive_key != data['interactive_key']: if 'interactive_key' in data and user.interactive_key != data['interactive_key']:
user.interactive_key = data['interactive_key'] user.interactive_key = data['interactive_key']
save = True save = True
if 'email' in data and user.email != data['email']: if 'email' in data and user.email != data['email']:
user.email = data['email'] user.email = data['email']
save = True save = True
if 'phone' in data and user.phone != data['phone']: if 'phone' in data and user.phone != data['phone']:
user.phone = data['phone'] user.phone = data['phone']
save = True save = True
if 'back_phone' in data and user.back_phone != data['back_phone']: if 'back_phone' in data and user.back_phone != data['back_phone']:
user.back_phone = data['back_phone'] user.back_phone = data['back_phone']
save = True save = True
if 'in_role' in data and user.in_role != data['in_role']: if 'in_role' in data and user.in_role != data['in_role']:
user.in_role = data['in_role'] user.in_role = data['in_role']
save = True save = True
if 'unique_role' in data and user.unique_role != data['unique_role']: if 'unique_role' in data and user.unique_role != data['unique_role']:
user.unique_role = data['unique_role'] user.unique_role = data['unique_role']
save = True save = True
if 'city' in data and user.city != data['city']: if 'city' in data and user.city != data['city']:
user.city = data['city'] user.city = data['city']
save = True save = True
if 'b_day' in data and user.b_day != data['b_day']: if 'b_day' in data and user.b_day != data['b_day']:
user.b_day = data['b_day'] user.b_day = data['b_day']
save = True save = True
if 'token' in data and user.token != data['token']: if 'token' in data and user.token != data['token']:
user.token = data['token'] user.token = data['token']
save = True save = True
if 'reg_status' in data and user.reg_status != data['reg_status']: if 'reg_status' in data and user.reg_status != data['reg_status']:
user.reg_status = data['reg_status'] user.reg_status = data['reg_status']
save = True save = True
if 'is_active' in data and user.is_active != data['is_active']: if 'is_active' in data and user.is_active != data['is_active']:
user.is_active = data['is_active'] user.is_active = data['is_active']
save = True save = True
if 'is_admin' in data and user.is_admin != data['is_admin']: if 'is_admin' in data and user.is_admin != data['is_admin']:
user.is_admin = data['is_admin'] user.is_admin = data['is_admin']
save = True save = True
if 'is_staff' in data and user.is_staff != data['is_staff']: if 'is_staff' in data and user.is_staff != data['is_staff']:
user.is_staff = data['is_staff'] user.is_staff = data['is_staff']
save = True save = True
if 'fname' in data and user.fname != data['fname']: if 'fname' in data and user.fname != data['fname']:
user.fname = data['fname'] user.fname = data['fname']
save = True save = True
if 'name' in data and user.name != data['name']: if 'name' in data and user.name != data['name']:
user.name = data['name'] user.name = data['name']
save = True save = True
if 'oname' in data and user.oname != data['oname']: if 'oname' in data and user.oname != data['oname']:
user.oname = data['oname'] user.oname = data['oname']
save = True save = True
if 'skype' in data and user.skype != data['skype']: if 'skype' in data and user.skype != data['skype']:
user.skype = data['skype'] user.skype = data['skype']
save = True save = True
if 'facebook' in data and user.facebook != data['facebook']: if 'facebook' in data and user.facebook != data['facebook']:
user.facebook = data['facebook'] user.facebook = data['facebook']
save = True save = True
if 'vk' in data and user.vk != data['vk']: if 'vk' in data and user.vk != data['vk']:
user.vk = data['vk'] user.vk = data['vk']
save = True save = True
if 'linkedin' in data and user.linkedin != data['linkedin']: if 'linkedin' in data and user.linkedin != data['linkedin']:
user.linkedin = data['linkedin'] user.linkedin = data['linkedin']
save = True save = True
if 'odnoklassniki' in data and user.odnoklassniki != data['odnoklassniki']: if 'odnoklassniki' in data and user.odnoklassniki != data['odnoklassniki']:
user.odnoklassniki = data['odnoklassniki'] user.odnoklassniki = data['odnoklassniki']
save = True save = True
if 'password' in data and user.password != data['password']: if 'password' in data and user.password != data['password']:
user.password = data['password'] user.password = data['password']
save = True save = True
if save: if save:
user.save() user.save()
log.good_sync() log.good_sync()
context['code'] = '1' context['code'] = '1'
else: else:
log.fail_sync() log.fail_sync()
else: else:
raise Http404 raise Http404
return context return context
''' '''
@out_api_decor(without_auth=True, need_keys=['token', 'email'], method='POST', check_request=True) @out_api_decor(without_auth=True, need_keys=['token', 'email'], method='POST', check_request=True)
def create_user(request, context): def create_user(request, context):
# Создание пользователя # Создание пользователя
# TODO: Политика использования токена # TODO: Политика использования токена
res = False res = False
result, source = self_check_token(request.POST['token']) result, source = self_check_token(request.POST['token'])
if not result: if not result:
context['code'] = '0' context['code'] = '0'
description = u'Не найден активный источник' description = u'Не найден активный источник'
context['response'] = description context['response'] = description
return context return context
result, user = self_check_user_exists(request.POST['email']) result, user = self_check_user_exists(request.POST['email'])
if result: if result:
if user.is_active and user.reg_status == '4': if user.is_active and user.reg_status == '4':
context['code'] = '0' context['code'] = '0'
description = u'Пользователь уже существует и активен' description = u'Пользователь уже существует и активен'
context['response'] = description context['response'] = description
else: else:
context['code'] = '1' context['code'] = '1'
res = True res = True
description = u'Пользователь уже существует. Отправлено повторное письмо активации' description = u'Пользователь уже существует. Отправлено повторное письмо активации'
context['response'] = description context['response'] = description
sent_registration(user, title=u'Повторное письмо активации') sent_registration(user, title=u'Повторное письмо активации')
return context return context
else: else:
result, user = self_create_user(request.POST['email'], result, user = self_create_user(request.POST['email'],
phone=request.POST['phone'] if request.POST.get('phone') else None) phone=request.POST['phone'] if request.POST.get('phone') else None)
context['code'] = '1' context['code'] = '1'
res = True res = True
description = u'Пользователь создан. На указанный email отправлено письмо активации' description = u'Пользователь создан. На указанный email отправлено письмо активации'
context['response'] = description context['response'] = description
ref_history = TrafHistory.objects.create(action='C', source=source, token=request.POST['token'], data=request.POST, ref_history = TrafHistory.objects.create(action='C', source=source, token=request.POST['token'], data=request.POST,
result_description=description, result=res) result_description=description, result=res)
user.traf_source = ref_history user.traf_source = ref_history
user.save() user.save()
return context return context
@out_api_decor(without_auth=True, check_request=True, need_keys=['token', 'service', 'email'], method='POST') @out_api_decor(without_auth=True, check_request=True, need_keys=['token', 'service', 'email'], method='POST')
def create_bill(request, context): def create_bill(request, context):
# TODO: Политика использования токена # TODO: Политика использования токена
result, source = self_check_token(request.POST['token']) result, source = self_check_token(request.POST['token'])
if not result: if not result:
context['code'] = '0' context['code'] = '0'
context['response'] = u'Не найден активный источник' context['response'] = u'Не найден активный источник'
return context return context
result, user = self_check_user_exists(request.POST['email']) result, user = self_check_user_exists(request.POST['email'])
if result: if result:
if not user.is_active or user.reg_status != '4': if not user.is_active or user.reg_status != '4':
sent_registration(user, title=u'Повторное письмо активации') sent_registration(user, title=u'Повторное письмо активации')
if request.POST.get('phone') and user.phone != request.POST.get('phone'): if request.POST.get('phone') and user.phone != request.POST.get('phone'):
user.phone = request.POST['phone'] user.phone = request.POST['phone']
user.save() user.save()
else: else:
result, user = self_create_user(request.POST['email'], result, user = self_create_user(request.POST['email'],
phone=request.POST['phone'] if request.POST.get('phone') else None) phone=request.POST['phone'] if request.POST.get('phone') else None)
result, description, bill = self_create_bill(user, request.POST['service'], result, description, bill = self_create_bill(user, request.POST['service'],
request.POST['uid'] if request.POST.get('uid') else None) request.POST['uid'] if request.POST.get('uid') else None)
context['code'] = '1' if result else '0' context['code'] = '1' if result else '0'
context['response'] = description context['response'] = description
context['data'] = bill.get_face() context['data'] = bill.get_face()
rel_source = TrafHistory.objects.create(action='O', source=source, token=request.POST['token'], data=request.POST, rel_source = TrafHistory.objects.create(action='O', source=source, token=request.POST['token'], data=request.POST,
result_description=description, result=True if result else False) result_description=description, result=True if result else False)
bill.traf_source = rel_source bill.traf_source = rel_source
bill.save() bill.save()
return context return context
@out_api_decor(without_auth=True, need_keys=['token', 'data'], method='POST', check_request=True) @out_api_decor(without_auth=True, need_keys=['token', 'data'], method='POST', check_request=True)
def set_lendos_data(request, context): def set_lendos_data(request, context):
# Создание пользователя # Создание пользователя
res = False res = False
result, source = self_check_token(request.POST['token']) result, source = self_check_token(request.POST['token'])
if not result: if not result:
context['code'] = '0' context['code'] = '0'
description = u'Не найден активный источник' description = u'Не найден активный источник'
context['response'] = description context['response'] = description
return context return context
TrafHistory.objects.create(action='D', source=source, token=request.POST['token'], data=request.POST['data'], TrafHistory.objects.create(action='D', source=source, token=request.POST['token'], data=request.POST['data'],
result_description='Данные из форм', result=res) result_description='Данные из форм', result=res)
return context return context

@ -1,40 +1,40 @@
# coding=utf-8 # coding=utf-8
from celery.task import periodic_task from celery.task import periodic_task
from datetime import timedelta, datetime from datetime import timedelta, datetime
from access.models import User, TrafSource, TrafTokenHistory from access.models import User, TrafSource, TrafTokenHistory
@periodic_task(run_every=timedelta(minutes=20)) @periodic_task(run_every=timedelta(minutes=20))
def check_prepo_delay(): def check_prepo_delay():
# Проверка просроченых задач преподавателя # Проверка просроченых задач преподавателя
for res in User.objects.filter(delay_date__lte=datetime.now(), in_role='T'): for res in User.objects.filter(delay_date__lte=datetime.now(), in_role='T'):
res.delay = False res.delay = False
res.delay_description = '' res.delay_description = ''
res.delay_date = None res.delay_date = None
res.save() res.save()
@periodic_task(run_every=timedelta(minutes=1)) @periodic_task(run_every=timedelta(minutes=1))
def check_online(): def check_online():
for user in User.objects.filter(status='ON', last_time__lte=datetime.now()-timedelta(minutes=10)): for user in User.objects.filter(status='ON', last_time__lte=datetime.now()-timedelta(minutes=10)):
user.status = 'OFF' user.status = 'OFF'
user.save() user.save()
@periodic_task(run_every=timedelta(hours=1)) @periodic_task(run_every=timedelta(hours=1))
def check_traf_source(): def check_traf_source():
for source in TrafSource.objects.filter(on=True).exclude(live_time=None): for source in TrafSource.objects.filter(on=True).exclude(live_time=None):
if source.token and source.token_start + timedelta(hours=source.live_time) < datetime.now(): if source.token and source.token_start + timedelta(hours=source.live_time) < datetime.now():
source.on = False source.on = False
TrafTokenHistory.objects.create(token=source.token, source=source, live_time=source.live_time, date_start=source.token_start, date_end=datetime.now()) TrafTokenHistory.objects.create(token=source.token, source=source, live_time=source.live_time, date_start=source.token_start, date_end=datetime.now())
source.token = None source.token = None
source.token_start = None source.token_start = None
source.save() source.save()
#@periodic_task(run_every=timedelta(minutes=1)) #@periodic_task(run_every=timedelta(minutes=1))
#def sync_users(): #def sync_users():
# for user in User.objects.filter(sync=False): # for user in User.objects.filter(sync=False):
# result = sent_sync_user(user) # result = sent_sync_user(user)
# if result: # if result:
# user._set_synced() # user._set_synced()

@ -1,13 +1,13 @@
from access import teach_views as views from access import teach_views as views
from django.conf.urls import url from django.conf.urls import url
urlpatterns = [ urlpatterns = [
url(r'profile/$', views.profile), url(r'profile/$', views.profile),
url(r'homeworks/([0-9]{1,99})$', views.homeworks), url(r'homeworks/([0-9]{1,99})$', views.homeworks),
url(r'comments/([0-9]{1,99})$', views.comments), url(r'comments/([0-9]{1,99})$', views.comments),
url(r'exams/([0-9]{1,99})$', views.exams), url(r'exams/([0-9]{1,99})$', views.exams),
url(r'materials/([0-9]{1,99})$', views.materials), url(r'materials/([0-9]{1,99})$', views.materials),
url(r'workshop/homework/([0-9]{1,99})$', views.homework_workshop), url(r'workshop/homework/([0-9]{1,99})$', views.homework_workshop),
url(r'workshop/exam/([0-9]{1,99})$', views.exam_workshop), url(r'workshop/exam/([0-9]{1,99})$', views.exam_workshop),
url(r'history/', views.history) url(r'history/', views.history)
] ]

@ -1,150 +1,150 @@
# coding=utf-8 # coding=utf-8
from django.http import Http404 from django.http import Http404
from lms.decors import response_decor from lms.decors import response_decor
from lms.tools import check_role from lms.tools import check_role
from courses.models import Course from courses.models import Course
from journals.models import HomeworkJ, ExamJ, HomeworkTry, ExamTry from journals.models import HomeworkJ, ExamJ, HomeworkTry, ExamTry
@response_decor(template='teach_profile.html') @response_decor(template='teach_profile.html')
def profile(request): def profile(request):
checker = check_role(request.user, 'T') checker = check_role(request.user, 'T')
if checker['result']: if checker['result']:
# Быстрый список активных студентов # Быстрый список активных студентов
all_homeworks = [] all_homeworks = []
homeworks = {} homeworks = {}
exams = {} exams = {}
for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None
).order_by('date'): ).order_by('date'):
if journal.parent.get_status_flag() not in ['N', 'F']: if journal.parent.get_status_flag() not in ['N', 'F']:
title = (journal.material.course.get_title(), title = (journal.material.course.get_title(),
journal.material.get_title(), journal.material.get_title(),
journal.material.id, journal.material.id,
journal.material.theme.sort, journal.material.theme.sort,
journal.material.get_icon()) journal.material.get_icon())
if not title in homeworks: homeworks[title] = [] if not title in homeworks: homeworks[title] = []
homeworks[title].append(journal) homeworks[title].append(journal)
for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None
).order_by('date'): ).order_by('date'):
if journal.parent.get_status_flag() not in ['N', 'F']: if journal.parent.get_status_flag() not in ['N', 'F']:
all_homeworks.append(journal) all_homeworks.append(journal)
for journal in ExamTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None for journal in ExamTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None
).order_by('date'): ).order_by('date'):
if journal.parent.get_status_flag() not in ['N', 'F']: if journal.parent.get_status_flag() not in ['N', 'F']:
title = (journal.material.course.get_title(), title = (journal.material.course.get_title(),
journal.material.get_title(), journal.material.get_title(),
journal.material.id) journal.material.id)
if not title in exams: exams[title] = [] if not title in exams: exams[title] = []
exams[title].append(journal) exams[title].append(journal)
return { return {
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), 'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'),
'active_themes': homeworks, 'active_themes': homeworks,
'active_exams': exams, 'active_exams': exams,
'all_homeworks': all_homeworks, 'all_homeworks': all_homeworks,
} }
else: else:
return checker return checker
@response_decor(template='teacher_homeworks.html') @response_decor(template='teacher_homeworks.html')
def homeworks(request, course): def homeworks(request, course):
# Список домашних заданий по курсу на проверку # Список домашних заданий по курсу на проверку
checker = check_role(request.user, 'T') checker = check_role(request.user, 'T')
if checker['result']: if checker['result']:
return {'T': 'H', return {'T': 'H',
'course': Course.objects.get(id=course), 'course': Course.objects.get(id=course),
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), 'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'),
'homeworks': HomeworkTry.objects.filter(teacher=request.user).order_by( 'homeworks': HomeworkTry.objects.filter(teacher=request.user).order_by(
'-date') '-date')
} }
else: else:
return checker return checker
@response_decor(template='teacher_comments.html') @response_decor(template='teacher_comments.html')
def comments(request, course): def comments(request, course):
# Комментари для преподавателя # Комментари для преподавателя
checker = check_role(request.user, 'T') checker = check_role(request.user, 'T')
if checker['result']: if checker['result']:
return {'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id')} return {'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id')}
else: else:
return checker return checker
@response_decor(template='teacher_materials.html') @response_decor(template='teacher_materials.html')
def materials(request, course): def materials(request, course):
# Материалы курсов # Материалы курсов
checker = check_role(request.user, 'T') checker = check_role(request.user, 'T')
if checker['result']: if checker['result']:
return {'T': 'M', return {'T': 'M',
'courses': Course.objects.filter(teachers__in=[request.user]), 'courses': Course.objects.filter(teachers__in=[request.user]),
'course': Course.objects.get(id=course)} 'course': Course.objects.get(id=course)}
else: else:
return checker return checker
@response_decor(template='teacher_exams.html') @response_decor(template='teacher_exams.html')
def exams(request, exam): def exams(request, exam):
checker = check_role(request.user, 'T') checker = check_role(request.user, 'T')
if checker['result']: if checker['result']:
return {'T': 'E', return {'T': 'E',
'course': Course.objects.get(id=exam), 'course': Course.objects.get(id=exam),
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), 'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'),
'exams': ExamTry.objects.filter(teacher=request.user).order_by('-date')} 'exams': ExamTry.objects.filter(teacher=request.user).order_by('-date')}
else: else:
return checker return checker
@response_decor(template='workshop_homework.html') @response_decor(template='workshop_homework.html')
def homework_workshop(request, homework): def homework_workshop(request, homework):
if request.user.in_role in ['T', 'S2', 'A']: if request.user.in_role in ['T', 'S2', 'A']:
try: try:
journal = HomeworkJ.objects.get(id=homework) journal = HomeworkJ.objects.get(id=homework)
except HomeworkJ.DoesNotExist: except HomeworkJ.DoesNotExist:
raise Http404 raise Http404
else: else:
if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']: if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']:
return { return {
'homework': journal.get_face(request.user), 'homework': journal.get_face(request.user),
'student': journal.student, 'student': journal.student,
'theme': journal.material.theme 'theme': journal.material.theme
} }
else: else:
raise Http404 raise Http404
else: else:
raise Http404 raise Http404
@response_decor(template='workshop_exam.html') @response_decor(template='workshop_exam.html')
def exam_workshop(request, exam): def exam_workshop(request, exam):
if request.user.in_role in ['T', 'S2', 'A']: if request.user.in_role in ['T', 'S2', 'A']:
try: try:
journal = ExamJ.objects.get(id=exam) journal = ExamJ.objects.get(id=exam)
except ExamJ.DoesNotExist: except ExamJ.DoesNotExist:
raise Http404 raise Http404
else: else:
if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']: if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']:
return { return {
'exam': journal.get_face(request.user), 'exam': journal.get_face(request.user),
'student': journal.student, 'student': journal.student,
'theme': journal.material.theme 'theme': journal.material.theme
} }
else: else:
raise Http404 raise Http404
else: else:
raise Http404 raise Http404
@response_decor(template='teacher_history.html') @response_decor(template='teacher_history.html')
def history(request): def history(request):
if request.user.in_role in ['T', 'S2', 'A']: if request.user.in_role in ['T', 'S2', 'A']:
return {'hw': HomeworkJ.objects.filter(teacher=request.user, success=True).exclude(f_date=None), return {'hw': HomeworkJ.objects.filter(teacher=request.user, success=True).exclude(f_date=None),
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id') 'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id')
} }
else: else:
raise Http404 raise Http404

@ -1,43 +1,43 @@
from access import views from access import views
from access import api from access import api
from access import out_api from access import out_api
from django.conf.urls import url from django.conf.urls import url
urlpatterns = [ urlpatterns = [
url(r'accept_forgot/$', views.accept_forgot), url(r'accept_forgot/$', views.accept_forgot),
url(r'activate_email/$', views.activate_email), url(r'activate_email/$', views.activate_email),
url(r'all_actions/$', views.all_actions), url(r'all_actions/$', views.all_actions),
url(r'get_subscription_data/$', api.get_subscription_data), url(r'get_subscription_data/$', api.get_subscription_data),
url(r'send_subscription_data/$', api.send_subscription_data), url(r'send_subscription_data/$', api.send_subscription_data),
url(r'forgot/$', api.forgot), url(r'forgot/$', api.forgot),
url(r'fast_auth/$', views.fast_auth), url(r'fast_auth/$', views.fast_auth),
url(r'auth/', api.auth_in), url(r'auth/', api.auth_in),
url(r'auth_from_admin/', api.auth_from_admin), url(r'auth_from_admin/', api.auth_from_admin),
url(r'activate/$', views.activate), url(r'activate/$', views.activate),
url(r'profile/$', views.profile), url(r'profile/$', views.profile),
url(r'profile/(?P<view_id>.*)/$', views.profile_view), url(r'profile/(?P<view_id>.*)/$', views.profile_view),
url(r'registration/$', api.registration), url(r'registration/$', api.registration),
url(r'reg_step/$', api.reg_step), url(r'reg_step/$', api.reg_step),
url(r'logout/$', views.logout_in), url(r'logout/$', views.logout_in),
url(r'come_off/$', views.come_off), url(r'come_off/$', views.come_off),
url(r'check_auth/$', api.check_auth), url(r'check_auth/$', api.check_auth),
url(r'get_settings_data/$', api.get_settings_data), url(r'get_settings_data/$', api.get_settings_data),
url(r'send_settings_data/$', api.send_settings_data), url(r'send_settings_data/$', api.send_settings_data),
url(r'get_user_role/$', api.get_user_role), url(r'get_user_role/$', api.get_user_role),
url(r'new_role/$', api.new_role), url(r'new_role/$', api.new_role),
url(r'change_password/$', api.change_password), url(r'change_password/$', api.change_password),
url(r'by_error/$', views.by_error), url(r'by_error/$', views.by_error),
url(r'auth_error/$', views.auth_error), url(r'auth_error/$', views.auth_error),
url(r'access_error/$', views.access_error), url(r'access_error/$', views.access_error),
url(r'check_active/$', api.check_active), url(r'check_active/$', api.check_active),
url(r'resent_active_email$', api.resent_active_email), url(r'resent_active_email$', api.resent_active_email),
url(r'change_private/$', api.change_private), url(r'change_private/$', api.change_private),
url(r'create_user/$', out_api.create_user), url(r'create_user/$', out_api.create_user),
url(r'create_bill/$', out_api.create_bill), url(r'create_bill/$', out_api.create_bill),
url(r'set_lendos_data/$', out_api.set_lendos_data), url(r'set_lendos_data/$', out_api.set_lendos_data),
#url(r'sync_user/$', out_api.sync_user), #url(r'sync_user/$', out_api.sync_user),
url(r'search_user/$', api.search_user), url(r'search_user/$', api.search_user),
url(r'find_user/$', api.find_user), url(r'find_user/$', api.find_user),
url(r'service_auth/$', out_api.service_auth), url(r'service_auth/$', out_api.service_auth),
url(r'set_in_user/$', out_api.set_in_user) url(r'set_in_user/$', out_api.set_in_user)
] ]

@ -1,234 +1,234 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import auth from django.contrib import auth
from django.contrib.auth import logout from django.contrib.auth import logout
from django.http import Http404 from django.http import Http404
from django.shortcuts import redirect from django.shortcuts import redirect
from access.models import User, ActionJ, Document from access.models import User, ActionJ, Document
from lms.tools import random_string, condition_factory, check_role from lms.tools import random_string, condition_factory, check_role
from lms.decors import response_decor from lms.decors import response_decor
from courses.tools import get_user_achievements, get_user_diploms, get_user_completed_courses_count, \ from courses.tools import get_user_achievements, get_user_diploms, get_user_completed_courses_count, \
get_user_skills_size_count, get_user_achievements_count get_user_skills_size_count, get_user_achievements_count
from courses.tools import get_user_skills from courses.tools import get_user_skills
from journals.models import TeacherJ from journals.models import TeacherJ
from management.letters import sent_forgot_password from management.letters import sent_forgot_password
from finance.models import Bill from finance.models import Bill
from management.models import Comment from management.models import Comment
from library.models import Article from library.models import Article
@response_decor(template='index.html', without_auth=True) @response_decor(template='index.html', without_auth=True)
def activate_email(request): def activate_email(request):
# Активация пользователя через почту # Активация пользователя через почту
if request.GET.get('token') and request.GET.get('email'): if request.GET.get('token') and request.GET.get('email'):
try: try:
email = request.GET['email'].lower() email = request.GET['email'].lower()
user = User.objects.get(email=email, token=request.GET['token']) user = User.objects.get(email=email, token=request.GET['token'])
except User.DoesNotExist: except User.DoesNotExist:
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'}
else: else:
user.email = user.changed_email user.email = user.changed_email
user.save() user.save()
user.change_token() user.change_token()
return {'DIALOG': 'activate_email'} return {'DIALOG': 'activate_email'}
else: else:
# TODO: Отправлять пользователя в тупиковую страницу, а не на 404 # TODO: Отправлять пользователя в тупиковую страницу, а не на 404
raise Http404 raise Http404
@response_decor(template='index.html', without_auth=True) @response_decor(template='index.html', without_auth=True)
def accept_forgot(request): def accept_forgot(request):
# Подтверждение почты при восстановлении # Подтверждение почты при восстановлении
if request.GET.get('token') and request.GET.get('email'): if request.GET.get('token') and request.GET.get('email'):
try: try:
email = request.GET['email'].lower() email = request.GET['email'].lower()
user = User.objects.get(email=email, token=request.GET['token']) user = User.objects.get(email=email, token=request.GET['token'])
except User.DoesNotExist: except User.DoesNotExist:
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'}
else: else:
pas = random_string(length=6).upper() pas = random_string(length=6).upper()
user.set_password(pas) user.set_password(pas)
user.change_token() user.change_token()
sent_forgot_password(user, pas) sent_forgot_password(user, pas)
return {'DIALOG': 'accept_forgot'} return {'DIALOG': 'accept_forgot'}
else: else:
# TODO: Отправлять пользователя в тупиковую страницу, а не на 404 # TODO: Отправлять пользователя в тупиковую страницу, а не на 404
raise Http404 raise Http404
@response_decor(template='activation.html', without_auth=True) @response_decor(template='activation.html', without_auth=True)
def activate(request): def activate(request):
# Страница активации пользователя # Страница активации пользователя
condition = condition_factory([ condition = condition_factory([
{'condition': request.GET.get('email'), 'error': u'Поле пользователя передано не корректно'}, {'condition': request.GET.get('email'), 'error': u'Поле пользователя передано не корректно'},
{'condition': request.GET.get('token'), 'error': u'Поле токена передано не корректно'}, {'condition': request.GET.get('token'), 'error': u'Поле токена передано не корректно'},
{'condition': request.GET.get('step'), 'error': u'Не верно передан этап'} {'condition': request.GET.get('step'), 'error': u'Не верно передан этап'}
]) ])
if condition['code'] == '1': if condition['code'] == '1':
try: try:
email = request.GET['email'].lower() email = request.GET['email'].lower()
user = User.objects.get(email=email, token=request.GET['token']) user = User.objects.get(email=email, token=request.GET['token'])
except User.DoesNotExist: except User.DoesNotExist:
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'}
else: else:
if not user.is_active or user.reg_status != '4': if not user.is_active or user.reg_status != '4':
user.save() user.save()
return {'step': user.reg_status, 'token': request.GET['token'], 'email': email, return {'step': user.reg_status, 'token': request.GET['token'], 'email': email,
'phone': user.phone if user.phone else None} 'phone': user.phone if user.phone else None}
else: else:
raise Http404 raise Http404
else: else:
raise Http404 raise Http404
@response_decor(template='profile.html', without_auth=True) @response_decor(template='profile.html', without_auth=True)
def profile(request): def profile(request):
if request.user.is_authenticated(): if request.user.is_authenticated():
checker = check_role(request.user, 'U') checker = check_role(request.user, 'U')
if checker['result']: if checker['result']:
courses = [i.get_head_face() for i in courses = [i.get_head_face() for i in
TeacherJ.objects.filter(student=request.user, course__public=True).exclude(progress=0)] TeacherJ.objects.filter(student=request.user, course__public=True).exclude(progress=0)]
return {'in_user': None, return {'in_user': None,
'courses': courses, 'courses': courses,
'achievements': get_user_achievements(request.user), 'achievements': get_user_achievements(request.user),
'skills': get_user_skills(request.user), 'skills': get_user_skills(request.user),
'diploms': get_user_diploms(request.user), 'diploms': get_user_diploms(request.user),
'completed_courses': get_user_completed_courses_count(request.user), 'completed_courses': get_user_completed_courses_count(request.user),
'got_achievements': get_user_achievements_count(request.user), 'got_achievements': get_user_achievements_count(request.user),
'skills_size': get_user_skills_size_count(request.user), 'skills_size': get_user_skills_size_count(request.user),
'documents': Document.objects.filter(user=request.user), 'documents': Document.objects.filter(user=request.user),
'b_bills': Bill.objects.filter(user=request.user), 'b_bills': Bill.objects.filter(user=request.user),
'articles': [i.get_face(request.user) for i in Article.objects.filter(views__id=request.user.id)], 'articles': [i.get_face(request.user) for i in Article.objects.filter(views__id=request.user.id)],
'forum_ask': Comment.objects.filter(owner=request.user, status='Q'), 'forum_ask': Comment.objects.filter(owner=request.user, status='Q'),
'forum_ans': { 'forum_ans': {
'all': 'all':
Comment.objects.filter(owner=request.user, status='Q2'), Comment.objects.filter(owner=request.user, status='Q2'),
'best': 'best':
Comment.objects.filter(owner=request.user, status='Q2', best=True).count() Comment.objects.filter(owner=request.user, status='Q2', best=True).count()
} }
} }
else: else:
return checker return checker
else: else:
return {'redirect': '/access/auth_error/'} return {'redirect': '/access/auth_error/'}
@response_decor(template='profile.html', without_auth=True) @response_decor(template='profile.html', without_auth=True)
def profile_view(request, view_id): def profile_view(request, view_id):
if view_id: if view_id:
try: try:
user = User.objects.get(interactive_key=view_id) user = User.objects.get(interactive_key=view_id)
except User.DoesNotExist: except User.DoesNotExist:
raise Http404 raise Http404
else: else:
if request.user.is_authenticated() and request.user.is_admin: if request.user.is_authenticated() and request.user.is_admin:
go = True go = True
else: else:
go = False go = False
if user.private == 'A' or user.private == 'L': if user.private == 'A' or user.private == 'L':
go = True go = True
elif user.private == 'U': elif user.private == 'U':
if request.user.is_authenticated() and request.user.is_active: if request.user.is_authenticated() and request.user.is_active:
go = True go = True
elif user.private == 'B': elif user.private == 'B':
if request.user == user: if request.user == user:
go = True go = True
if go: if go:
courses = [i.get_head_face() for i in TeacherJ.objects.filter(student=user, course__public=True).exclude(progress=0)] courses = [i.get_head_face() for i in TeacherJ.objects.filter(student=user, course__public=True).exclude(progress=0)]
return {'in_user': user, return {'in_user': user,
'courses': courses, 'courses': courses,
'achievements': get_user_achievements(user), 'achievements': get_user_achievements(user),
'skills': get_user_skills(user), 'skills': get_user_skills(user),
'diploms': get_user_diploms(user), 'diploms': get_user_diploms(user),
'articles': [i.get_face(user) for i in Article.objects.filter(views__id=user.id)], 'articles': [i.get_face(user) for i in Article.objects.filter(views__id=user.id)],
'completed_courses': get_user_completed_courses_count(user), 'completed_courses': get_user_completed_courses_count(user),
'got_achievements': get_user_achievements_count(user), 'got_achievements': get_user_achievements_count(user),
'skills_size': get_user_skills_size_count(user), 'skills_size': get_user_skills_size_count(user),
'forum_ask': Comment.objects.filter(owner=user, status='Q'), 'forum_ask': Comment.objects.filter(owner=user, status='Q'),
'forum_ans': { 'forum_ans': {
'all': 'all':
Comment.objects.filter(owner=user, status='Q2'), Comment.objects.filter(owner=user, status='Q2'),
'best': 'best':
Comment.objects.filter(owner=user, status='Q2', best=True).count() Comment.objects.filter(owner=user, status='Q2', best=True).count()
}} }}
else: else:
raise Http404 raise Http404
def logout_in(request): def logout_in(request):
logout(request) logout(request)
return redirect('/') return redirect('/')
@response_decor(template='index.html') @response_decor(template='index.html')
def come_off(request): def come_off(request):
# Деактивация подписок # Деактивация подписок
context = {'code': 'error'} context = {'code': 'error'}
condition = condition_factory([ condition = condition_factory([
{'condition': request.GET.get('token'), 'error': u'В запросе не обнаружен токен'}, {'condition': request.GET.get('token'), 'error': u'В запросе не обнаружен токен'},
{'condition': request.GET.get('right'), 'error': u'В запросе не обнаружено изменяемое право'} {'condition': request.GET.get('right'), 'error': u'В запросе не обнаружено изменяемое право'}
]) ])
if condition['code'] == '1': if condition['code'] == '1':
try: try:
user = User.objects.get(token=request.GET['token']) user = User.objects.get(token=request.GET['token'])
except User.DoesNotExist: except User.DoesNotExist:
context['response'] = u'Запрос не обработан' context['response'] = u'Запрос не обработан'
else: else:
if user.rights.check_right(user, request.GET['right']): if user.rights.check_right(user, request.GET['right']):
if request.GET['right'] == 'feedback_follow': if request.GET['right'] == 'feedback_follow':
user.rights.set_right('feedback_follow', False) user.rights.set_right('feedback_follow', False)
context['response'] = u'Подписка деактивирована' context['response'] = u'Подписка деактивирована'
context['code'] = u'info' context['code'] = u'info'
elif request.GET['right'] == 'news_follow': elif request.GET['right'] == 'news_follow':
user.rights.set_right('news_follow', False) user.rights.set_right('news_follow', False)
context['response'] = u'Подписка деактивирована' context['response'] = u'Подписка деактивирована'
context['code'] = u'info' context['code'] = u'info'
else: else:
context[ context[
'response'] = u'Вы указали право, на которое не распространяется функция быстрого отключения' 'response'] = u'Вы указали право, на которое не распространяется функция быстрого отключения'
else: else:
context['response'] = u'Вы уже описаны от данной рассылки' context['response'] = u'Вы уже описаны от данной рассылки'
else: else:
context['response'] = condition['response'] context['response'] = condition['response']
context['code'] = '0' context['code'] = '0'
return {'response': context['response'], 'code': context['code']} return {'response': context['response'], 'code': context['code']}
@response_decor(template='auth_error.html', without_auth=True) @response_decor(template='auth_error.html', without_auth=True)
def auth_error(request): def auth_error(request):
# Запрешен доступ - кабинет менеджера, пепода и.т.д. # Запрешен доступ - кабинет менеджера, пепода и.т.д.
return {} return {}
@response_decor(template='access_error.html', without_auth=True) @response_decor(template='access_error.html', without_auth=True)
def access_error(request): def access_error(request):
# Закрытая страница - не открытый урок, дз и.т.д. # Закрытая страница - не открытый урок, дз и.т.д.
return {} return {}
@response_decor(template='by_error.html', without_auth=True) @response_decor(template='by_error.html', without_auth=True)
def by_error(request): def by_error(request):
# Запрещен доступ по подпискеs # Запрещен доступ по подпискеs
return {} return {}
@response_decor(template='all_actions.html', without_auth=False) @response_decor(template='all_actions.html', without_auth=False)
def all_actions(request): def all_actions(request):
# Страница событий # Страница событий
return {'b_actions': ActionJ.objects.filter(student=request.user).order_by('-id')} return {'b_actions': ActionJ.objects.filter(student=request.user).order_by('-id')}
@response_decor(template='index.html', without_auth=True) @response_decor(template='index.html', without_auth=True)
def fast_auth(request): def fast_auth(request):
# Авторизация по кнопке # Авторизация по кнопке
# FIXME: Усилить проверку # FIXME: Усилить проверку
if request.POST.get('email') and request.POST.get('password'): if request.POST.get('email') and request.POST.get('password'):
email = request.POST['email'].lower() email = request.POST['email'].lower()
user = auth.authenticate(email=email, password=request.POST['password']) user = auth.authenticate(email=email, password=request.POST['password'])
if user is not None: if user is not None:
auth.login(request, user) auth.login(request, user)
return {'redirect': '/'} return {'redirect': '/'}

@ -1 +1 @@
8311 28159

@ -1,28 +0,0 @@
# coding=utf-8
import os
import django
import sys
import datetime
start = datetime.datetime.now()
sys.path.append("/var/www/projects/codemy/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup()
from lms.tools import comment_auth_data
from access.models import User as U
u = U.objects.get(id=2)
result = comment_auth_data(u)
#print(result)
def_json = '''json_encode: {"nick":"\u041d\u0438\u043a\u043e\u043b\u0430\u0439","avatar":"","id":"2","email":"bez.b.unix@gmail.com","profile_url":""}'''
def_sign = '''Sign: 9b185a7fa42ecfe88cebb36cd400a1b4'''
print('====================')
print(def_json)
print(def_sign)
print('-------------------')
for key, value in result.items():
if key == '== sign': print('%s %s' % ('---', bool(def_sign==value)))
print('%s: %s' % (key, value))
print('=====================')

@ -1,40 +1,40 @@
; ================================== ; ==================================
; celery worker supervisor example ; celery worker supervisor example
; ================================== ; ==================================
[program:celery_codemy] [program:celery_codemy]
command=/var/www/.envs/codemy/bin/celery worker -A lms --loglevel=INFO command=/var/www/.envs/codemy/bin/celery worker -A lms --loglevel=INFO
directory=/var/www/projects/codemy/ directory=/var/www/projects/codemy/
user=www-data user=www-data
numprocs=1 numprocs=1
stdout_logfile=/var/www/logs/codemy/celery-worker.log stdout_logfile=/var/www/logs/codemy/celery-worker.log
stderr_logfile=/var/www/logs/codemy/celery-worker.log stderr_logfile=/var/www/logs/codemy/celery-worker.log
autostart=true autostart=true
autorestart=true autorestart=true
startsecs=10 startsecs=10
stopwaitsecs = 600 stopwaitsecs = 600
killasgroup=true killasgroup=true
[program:celery_beat_codemy] [program:celery_beat_codemy]
command=/var/www/.envs/codemy/bin/celery beat -A lms --schedule /var/lib/celery/beat.db --loglevel=INFO command=/var/www/.envs/codemy/bin/celery beat -A lms --schedule /var/lib/celery/beat.db --loglevel=INFO
directory=/var/www/projects/codemy directory=/var/www/projects/codemy
user=www-data user=www-data
numprocs=1 numprocs=1
stdout_logfile=/var/www/logs/codemy/celery-beat.log stdout_logfile=/var/www/logs/codemy/celery-beat.log
stderr_logfile=/var/www/logs/codemy/celery-beat.log stderr_logfile=/var/www/logs/codemy/celery-beat.log
autostart=true autostart=true
autorestart=true autorestart=true
startsecs=10 startsecs=10
priority=999 priority=999
[program:celery_flower_codemy] [program:celery_flower_codemy]
command=/var/www/.envs/codemy/bin/celery -A lms flower command=/var/www/.envs/codemy/bin/celery -A lms flower
directory=/var/www/projects/codemy directory=/var/www/projects/codemy
user=www-data user=www-data
numprocs=1 numprocs=1
stdout_logfile=/var/www/logs/codemy/celery-flower.log stdout_logfile=/var/www/logs/codemy/celery-flower.log
stderr_logfile=/var/www/logs/codemy/celery-flower.log stderr_logfile=/var/www/logs/codemy/celery-flower.log
autostart=true autostart=true
autorestart=true autorestart=true
startsecs=10 startsecs=10
priority=600 priority=600

@ -1,51 +1,51 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

@ -1,85 +1,85 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIF9jCCBN6gAwIBAgIMY/C5dNv6x+tP/WuUMA0GCSqGSIb3DQEBCwUAMGAxCzAJ MIIF9jCCBN6gAwIBAgIMY/C5dNv6x+tP/WuUMA0GCSqGSIb3DQEBCwUAMGAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN
MTYwNzAxMTMyMzM0WhcNMTcwNzAyMTMyMzM0WjA5MSEwHwYDVQQLExhEb21haW4g MTYwNzAxMTMyMzM0WhcNMTcwNzAyMTMyMzM0WjA5MSEwHwYDVQQLExhEb21haW4g
Q29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAMMCyouY29kZW15LnJ1MIICIjANBgkq Q29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAMMCyouY29kZW15LnJ1MIICIjANBgkq
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeS hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeS
Ne8aJVMXRu3IbIML+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7Mv Ne8aJVMXRu3IbIML+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7Mv
Pbts5Y7LWBcwUomJ+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674Z Pbts5Y7LWBcwUomJ+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674Z
ImLLtc+bLl3NjzH6t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefK ImLLtc+bLl3NjzH6t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefK
zigr+5sU34SMbWLsczspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWq zigr+5sU34SMbWLsczspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWq
i6OOVZMcNjqePwc41R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvO i6OOVZMcNjqePwc41R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvO
OnK/TeOzaJoCx/yb7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8ty OnK/TeOzaJoCx/yb7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8ty
WTcypBWhr6xTYhNBGTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNK WTcypBWhr6xTYhNBGTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNK
jqMo3wvrvJjcM1mzqRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtp jqMo3wvrvJjcM1mzqRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtp
kzaMCdEf33ELDshGXN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p kzaMCdEf33ELDshGXN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p
8MDs1ZCNtjScCzgtaNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOr 8MDs1ZCNtjScCzgtaNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOr
sWFfpoEXjmMCAwEAAaOCAdUwggHRMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYBBQUH sWFfpoEXjmMCAwEAAaOCAdUwggHRMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYBBQUH
AQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j AQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j
b20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzABhi1o b20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzABhi1o
dHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIwVgYD dHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIwVgYD
VR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu VR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu
Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQCMAAw Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQCMAAw
QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9n QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9n
c2RvbWFpbnZhbHNoYTJnMi5jcmwwIQYDVR0RBBowGIILKi5jb2RlbXkucnWCCWNv c2RvbWFpbnZhbHNoYTJnMi5jcmwwIQYDVR0RBBowGIILKi5jb2RlbXkucnWCCWNv
ZGVteS5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYE ZGVteS5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYE
FHlv5NiaqItBFuN0vudXy9jt1bLkMB8GA1UdIwQYMBaAFOpOfNSALeUVgYYmjIJt FHlv5NiaqItBFuN0vudXy9jt1bLkMB8GA1UdIwQYMBaAFOpOfNSALeUVgYYmjIJt
wJikz5cPMA0GCSqGSIb3DQEBCwUAA4IBAQBfIs7hKJlHw5Hly/vVhjAQzX8qcN9H wJikz5cPMA0GCSqGSIb3DQEBCwUAA4IBAQBfIs7hKJlHw5Hly/vVhjAQzX8qcN9H
ISyHjmU4KeMKtiq0RdvC2Jf1IQFmxvgmycrARH1Xc9cHoMXZ8prYonnXeRX7fqrL ISyHjmU4KeMKtiq0RdvC2Jf1IQFmxvgmycrARH1Xc9cHoMXZ8prYonnXeRX7fqrL
hsjp6x87DxwDDXqblHqpoakFXhZhY2fJCeH+YQTrY37+hOy3qOreI3CiRK5N+BYF hsjp6x87DxwDDXqblHqpoakFXhZhY2fJCeH+YQTrY37+hOy3qOreI3CiRK5N+BYF
PO78hVAa5TdawQGM3c1TeYIG3ZzQ3x2wVGAQNCXdwcJOLF9dl6z+syySTOGPABKN PO78hVAa5TdawQGM3c1TeYIG3ZzQ3x2wVGAQNCXdwcJOLF9dl6z+syySTOGPABKN
rIEKOzc4ScqIHOzuQ1qTG2QcjwyH9tarDjJd79rnZUQzf1O58DwGwaQZwh6gjksz rIEKOzc4ScqIHOzuQ1qTG2QcjwyH9tarDjJd79rnZUQzf1O58DwGwaQZwh6gjksz
QXZOLz6LR55gpBP8cGpqJIwOiZKjtLTqeE6q/kJ0C9sbxnNw9sCkeAhh QXZOLz6LR55gpBP8cGpqJIwOiZKjtLTqeE6q/kJ0C9sbxnNw9sCkeAhh
-----END CERTIFICATE----- -----END CERTIFICATE-----
Корневой сертификат Корневой сертификат
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
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
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE----- -----END CERTIFICATE-----
Промежуточный сертификат Промежуточный сертификат
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0 YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0
aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC
jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG
ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX
qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It
INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4 INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4
tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC
AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A
mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v
d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG
Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE
MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290 MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290
cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL
BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex
4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE 4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE
GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj
H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj
tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6 tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6
EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= EjxS1QSCVS1npd+3lXzuP8MIugS+wEY=
-----END CERTIFICATE----- -----END CERTIFICATE-----

@ -1,17 +1,17 @@
django==1.9.3 django==1.9.3
Pillow==3.3.0 Pillow
psycopg2==2.6.2 psycopg2
simplejson==3.8.2 simplejson
celery==3.1.23 celery
django-celery==3.1.17 django-celery
django-wysiwyg-redactor==0.4.9 django-wysiwyg-redactor
raven==5.24.3 raven
uwsgi==2.0.13.1 uwsgi
flower==0.9.1 flower
django-import-export==0.4.5 django-import-export
python-dateutil==2.5.3 python-dateutil
requests==2.11.0 requests
ipython==5.1.0 ipython
django-precise-bbcode==1.2.6 django-precise-bbcode
html2bbcode==2.3.2 html2bbcode
markdown==2.6.7 markdown

@ -1,50 +0,0 @@
sudo apt-get update
sudo apt-get upgrade
sudo su
# Установка программ
apt-get install -y python-dev python-virtualenv python-pip postgresql postgresql-server-dev-9.3 libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk git
pip install --upgrade pip
# Создание иерархии
cd /var/
mkdir www
cd www
mkdir projects
mkdir .envs
virtualenv .envs/codemy
source .envs/codemy/bin/activate
mkdir logs
mkdir run
cd projects
mkdir codemy
cd codemy/configs
# Установка пакетов
pip install -r packs
# Создание базы и пользователя
echo 'psql -c "create user team with password 'nu5Xefise';"' > start.sh
echo 'psql -c "CREATE DATAbase codemy owner team;"' >> start.sh
echo 'psql -c "alter role team login createdb;"' >> start.sh
sudo -u postgres './start.sh'
rm -rf start.sh
# Подправить postgres
# Изменить метод авторизации в pg_hba
echo 'local all postgres trust' > /etc/postgresql/9.3/main/pg_hba.conf
echo 'local all all md5' >> /etc/postgresql/9.3/main/pg_hba.conf
echo 'host all all 127.0.0.1/32 md5' >> /etc/postgresql/9.3/main/pg_hba.conf
echo 'host all all ::1/128 md5' >> /etc/postgresql/9.3/main/pg_hba.conf
service postgresql restart
# Миграция базы
cd /var/www/projects/codemy/
# Импорь рабочего backup.sql
# echo 'psql -f backup.sql' > make_backup.sh
# sudo -u postgres './make_backup.sh'
rm -rf make_backup.sh
# Пути nginx
#ln -s /var/www/projects/codemy/configs/dev_nginx /etc/nginx/conf.d/codemy.conf
#service nginx restart
# Пути supervisor
#ln -s /var/www/projects/codemy/configs/supervisor.conf /etc/supervisor/conf.d/codemy.conf
#supervisorctl reread
#supervisorctl update
cd /var/
chown www-data:www-data -R www
#supervisorctl restart all

@ -1,51 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

@ -1,100 +0,0 @@
Ваш SSL-сертификат предоставлен ниже
-----BEGIN CERTIFICATE-----
MIIIdDCCB1ygAwIBAgIMPkc95DAdllwTruefMA0GCSqGSIb3DQEBCwUAMGAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN
MTYxMjI2MTMxNzM0WhcNMTcxMjI3MTMxNzM0WjA8MSEwHwYDVQQLExhEb21haW4g
Q29udHJvbCBWYWxpZGF0ZWQxFzAVBgNVBAMMDiouc2tpbGwtYm94LnJ1MIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzBKLQbxjOT4tn618AMkbUjcuATjA
TJNRJ/vcZWtoNER+y8Xh64WyZlXkB3vaRAedmoe5pxYF7gtoATpTgwxhM7ah2RDb
ui/ZLgK8MHtjhwhcDVu1iCSeXnlYUuqysnbPDHymYZRVtiBVPkRK7sshkIB0CIpA
XpjoYyHiVoEqFk/xSrsLveXXgQtzPipzuweVHwwq7KufRJkHPWbAEZBpwc3QoLga
o5khVHTvZuLUMFB9vFGp34AaGkGNbTWDepIn2QviqnWvGqyIshhNv8uuf++irKZM
BLxuh0MnkSkbXYLf5CCcjw04nzPRDsd5ZZFXQyyIOLL2NIYYiIp22q082idSjbSX
kobwfagH8nc5ljv8Gryqeo22QERI3Fp3bZ/t+gTVzpFjbCYP8c/nusNKk2vyA/yo
/aqou9+EjoIFSrqgdiv/FDYyK0MwWik3VrykqCbgy6MuaSdex4iAKBOlAzjRmrSi
2AF5q3SEaLLhPV1e8HS8z8Z6Xo0EbeEFvLuVeHdukEsPk6167aToNmk0pC5Ic0hq
eeNtgLZfCLUhLzh/AhYW6sTjT620O6mQP/3IiEpEFYk4iGe+TJ81d7P11/W7+7Va
gFL611WBnDafYdxT4OZFKhqpnXW0lWvGK4ROtxNmaaZmsfFwAZVDFvavsy0G4FLx
Miw1CKJNiC4cQjkCAwEAAaOCBFAwggRMMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYB
BQUHAQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2ln
bi5jb20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzAB
hi1odHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIw
VgYDVR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93
d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQC
MAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9n
cy9nc2RvbWFpbnZhbHNoYTJnMi5jcmwwJwYDVR0RBCAwHoIOKi5za2lsbC1ib3gu
cnWCDHNraWxsLWJveC5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
HQYDVR0OBBYEFO9PIphPbOr4Bnhcxb2sF7dgOwEsMB8GA1UdIwQYMBaAFOpOfNSA
LeUVgYYmjIJtwJikz5cPMIICcQYKKwYBBAHWeQIEAgSCAmEEggJdAlsAdgDd6x0r
eg1PpiCLga2BaHB+Lo6dAdVciI09EcTNtuy+zAAAAVk7R3L9AAAEAwBHMEUCIA2s
RoFsKZS5geHSL6Gm6nixJWSRjOIDdHiFJU0CuinHAiEAy+5pWxoLEhADou6GVjCS
j4X3Sq/x2TJhPU4J3IuweBUAdwBWFAaaL9fC7NP14b1Esj7HRna5vJkRXMDvlJhV
1onQ3QAAAVk7R3XgAAAEAwBIMEYCIQDxshxHNK9czqomcjPMfit/R8WpdYXit/Ke
ZALI23oZ9wIhAIvmBuv4BssQ1oV/PxxVdNYF7PCC0ZFnTDRdBTDY6A6zAHcAu9nf
vB+KcbWTlCOXqpJ7RzhXlQqrUugakJZkNo4e0YUAAAFZO0d23QAABAMASDBGAiEA
zcvKaoSjhTHBDkwiDUtdlcrbWtWF7nzVOXu9lr6A39QCIQCvdi7G5Lf2V5Rp6hyy
EsAK+2Mq9x/GQukjtfrM90CUdwB3AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3
zQ7IDdwQAAABWTtHdioAAAQDAEgwRgIhAInPwgCa+2PDWQo+lJFu2UWHxwyCe2lg
w9wFjVM6gXJ3AiEAufHeiiQz/yVC//v5l4SMxvvNyvKYQPDf6/Zao2g3wfYAdgDu
S723dc5guuFCaR+r4Z5mow9+X7By2IMAxHuJeqj9ywAAAVk7R3kcAAAEAwBHMEUC
IQCv1xvEaL4wxup86rGUTdATh8Ui07/vjBvI8uc+Fvbc1wIgRe5kpxDNZQNwBFZC
eR8Wbc2X2yV9zI2uDel2HDGNnvcwDQYJKoZIhvcNAQELBQADggEBAH8d8vr922T5
vuMYKy/l9id0K8W4HWn3OpHVfIJc91Hm21XWrDDV6AJFDrusQswNCGD4TsFl68U7
L+RlnBQZ0piDcrNoveMOeW0nMMP96HLS91G2BbwOxQoJWsWpmbeLryMk0lWhBlAN
C3LmCASXjMqbgt4IpAKghz6HjGlMgDLM9B7+BsXV3te4kVdLW7SanSpOz5PCDSLB
Urb4hIbMtMJiiam5eLRLFDByMZoT29hKdgapUbbxBpCOtu0SvSOdp7ArAOLdMNDQ
RLaI7BJP39stYkp6nS0Ayc2Dsq6NEaFumdFt8gTlmhb4WxmTybRsMfSK2ZxQgB4z
OJV1e2ozq2g=
-----END CERTIFICATE-----
Корневой сертификат
-----BEGIN CERTIFICATE-----
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
-----END CERTIFICATE-----
Промежуточный сертификат
-----BEGIN CERTIFICATE-----
MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0
aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC
jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG
ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX
qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It
INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4
tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC
AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A
mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v
d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG
Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE
MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290
cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL
BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex
4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE
GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj
H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj
tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6
EjxS1QSCVS1npd+3lXzuP8MIugS+wEY=
-----END CERTIFICATE-----

@ -1,28 +0,0 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIEyDCCArACAQAwgYIxCzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZNb3Njb3cxDzAN
BgNVBAcMBk1vc2NvdzEVMBMGA1UECwwMSVREZXBhcnRtZW50MRcwFQYDVQQDDA4q
LnNraWxsLWJveC5ydTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac2tpbGwtYm94LnJ1
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzBKLQbxjOT4tn618AMkb
UjcuATjATJNRJ/vcZWtoNER+y8Xh64WyZlXkB3vaRAedmoe5pxYF7gtoATpTgwxh
M7ah2RDbui/ZLgK8MHtjhwhcDVu1iCSeXnlYUuqysnbPDHymYZRVtiBVPkRK7ssh
kIB0CIpAXpjoYyHiVoEqFk/xSrsLveXXgQtzPipzuweVHwwq7KufRJkHPWbAEZBp
wc3QoLgao5khVHTvZuLUMFB9vFGp34AaGkGNbTWDepIn2QviqnWvGqyIshhNv8uu
f++irKZMBLxuh0MnkSkbXYLf5CCcjw04nzPRDsd5ZZFXQyyIOLL2NIYYiIp22q08
2idSjbSXkobwfagH8nc5ljv8Gryqeo22QERI3Fp3bZ/t+gTVzpFjbCYP8c/nusNK
k2vyA/yo/aqou9+EjoIFSrqgdiv/FDYyK0MwWik3VrykqCbgy6MuaSdex4iAKBOl
AzjRmrSi2AF5q3SEaLLhPV1e8HS8z8Z6Xo0EbeEFvLuVeHdukEsPk6167aToNmk0
pC5Ic0hqeeNtgLZfCLUhLzh/AhYW6sTjT620O6mQP/3IiEpEFYk4iGe+TJ81d7P1
1/W7+7VagFL611WBnDafYdxT4OZFKhqpnXW0lWvGK4ROtxNmaaZmsfFwAZVDFvav
sy0G4FLxMiw1CKJNiC4cQjkCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBVuWBe
QHNuT6998V8kBFlWOAhoBr2+bxR6mdL+qiCQTsbAjPemkZiZXp/2uji6Wmf11qMB
dxmPMGiFvXgPsfCcctbxfLqwtJvAo4s0yjCv3N8DISuO56C3WwnAsfF5xoxSDiAa
SvkpQ0TnuSl2cU4x6HsiKWNgILOLs1f+Lf6NlImC6Yz/bkRwn+1RXyjEDqJJz/wN
3Eekb9fPWXnloyOgqF+ESZzZbgZ653+nBUg0OMkeKhA82pC8r83CduQMy08YCwXu
FuHhGWs4AF2xHjwTwKfGjE1E7Ni+Ak5znriCu7o27Kq9UiGMujhKMxOroWxE1wYZ
Z0x2MuhnI3O1+dSnv7+ffDt75C8i4WiYQcgC2d6QD4Rt9SAxvgedkAbn2Xtadn8i
Qg+lGouPLhPjT9wCCTYNI/17MJaBpmrz/q+oEXXjSnFFDEXgbv534ltaVujvbLbV
gMF0beoI0FA6dlLyzHOgiiiyDEyS0znU8Qxfc92S9yD40v8mf0sJBH/mpZmEBO6c
Wlv9sBBrPWtiLUmbOzsv1eD6g4u992yqpJB317HOECjXXhKJCpw1MXr921tvMnyN
v5SCf6jIQXHm6k/Srau1upgOkm1GfJT9NIAzbomUSCiWs+0Iucw7FuH0S5RDIfD2
3/8LVBh9A/6ddAlsndZ4J0bKysjGW9M1LCU2Gg==
-----END CERTIFICATE REQUEST-----

@ -1,51 +1,51 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN RSA PRIVATE KEY-----
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 9iKW1Fp0d4hbYEwvMfwXXb6uYlLIXRB6slKxuiuZOXo5DFZzGTmgY1kgachyau4l
nNdGXctCdlT7XklQOj0WgyKkGjFrHKVS5B+Go7/jdtM+JmqR8nhfzSPysaXZbwor nNdGXctCdlT7XklQOj0WgyKkGjFrHKVS5B+Go7/jdtM+JmqR8nhfzSPysaXZbwor
P7sGB+Wx/XbCPpupIZl7nPgOh5ctLS38WAh60++JZ2uLvJCkELA9dJj9ero5r/T8 P7sGB+Wx/XbCPpupIZl7nPgOh5ctLS38WAh60++JZ2uLvJCkELA9dJj9ero5r/T8
I4RjNK759mVgzay1UYRlmBFK23JwZxqnpA0gFbfVYyyAfA3VTlLu8ydpNq93Gd1/ I4RjNK759mVgzay1UYRlmBFK23JwZxqnpA0gFbfVYyyAfA3VTlLu8ydpNq93Gd1/
w2C5YL9iah7xI4XIlPiOLXWxWyuX7x0IrshejWTSroMCggEBAK8Bg3Q3GzWFYHJc w2C5YL9iah7xI4XIlPiOLXWxWyuX7x0IrshejWTSroMCggEBAK8Bg3Q3GzWFYHJc
OFQcNKQ3v00xpYh9sG1XzgsczHEkL7xJ84xt57vcfre9zb0/NH95/FElK24Fe1SO OFQcNKQ3v00xpYh9sG1XzgsczHEkL7xJ84xt57vcfre9zb0/NH95/FElK24Fe1SO
53qR1u3YlMkJnO3RTSMyNs1ukBbIV3oyYKsrXtZ1qWhvs0we5Vj6FM17ENqgM7rv 53qR1u3YlMkJnO3RTSMyNs1ukBbIV3oyYKsrXtZ1qWhvs0we5Vj6FM17ENqgM7rv
cvCWtfjdikqOGqBbAQd8lQF6oYuR7brxPIzUhA3PP4IVaONWF2A+GrWlFBkzMpdb cvCWtfjdikqOGqBbAQd8lQF6oYuR7brxPIzUhA3PP4IVaONWF2A+GrWlFBkzMpdb
SzHClYKXgmOrtvVyi1uJjRp0y03j1tcctQCDCdOEXi28zHIXv/TUkzJGuyJXEgC5 SzHClYKXgmOrtvVyi1uJjRp0y03j1tcctQCDCdOEXi28zHIXv/TUkzJGuyJXEgC5
oH9VKouZgXsKdena19LKydUp9kpnBV5DDABu5ibEYZDrjFbWr6uMj3kklp20yN6J oH9VKouZgXsKdena19LKydUp9kpnBV5DDABu5ibEYZDrjFbWr6uMj3kklp20yN6J
D/mAkv0CggEAcWLGHT0f3d8BeI8XgHczQRFqddC6mqxxLZfL7JMzTgXxtUlFgcB2 D/mAkv0CggEAcWLGHT0f3d8BeI8XgHczQRFqddC6mqxxLZfL7JMzTgXxtUlFgcB2
Ts+uHysAefvI8lJEi/tSovQGpJ1sf60Nzg+OwkiTH3vkMSV4Yn5eCLvt0kUrRH7r Ts+uHysAefvI8lJEi/tSovQGpJ1sf60Nzg+OwkiTH3vkMSV4Yn5eCLvt0kUrRH7r
6hWCrOE67H0fdOFxktDRh9X3ggSWvsegPjaKm0hrz53L/XFedSYxAnFYcnCLj5VF 6hWCrOE67H0fdOFxktDRh9X3ggSWvsegPjaKm0hrz53L/XFedSYxAnFYcnCLj5VF
njVbpZgDH97XEnOo+QciJncLg6hfducC2I1sjVIuLWZttBN+eTj46NjKwA1l+9Hz njVbpZgDH97XEnOo+QciJncLg6hfducC2I1sjVIuLWZttBN+eTj46NjKwA1l+9Hz
Shq2QtXrogfCyUlpsHqxF7HPFNTk3gxSAHMhu6i7hPx4JdVzIPwNrXMfcQBXVJLA Shq2QtXrogfCyUlpsHqxF7HPFNTk3gxSAHMhu6i7hPx4JdVzIPwNrXMfcQBXVJLA
2E9NAUV7fznKtDH8Ynd+wnmzgF/kg2xidwKCAQAg4h/BV1tPoJBuX2utlvvw+TjS 2E9NAUV7fznKtDH8Ynd+wnmzgF/kg2xidwKCAQAg4h/BV1tPoJBuX2utlvvw+TjS
yuN6GcR7aZu4tvkctktvxcRihyyiZ1Rycftzqij1haA4xxcCzGFDbpAdjUwfO43+ yuN6GcR7aZu4tvkctktvxcRihyyiZ1Rycftzqij1haA4xxcCzGFDbpAdjUwfO43+
0RIV3oLnpvxATxOHGNhvUa7GGYgdJLs9hrX9cTqZRR2Bqt5isTWytaI+b8ViEP7w 0RIV3oLnpvxATxOHGNhvUa7GGYgdJLs9hrX9cTqZRR2Bqt5isTWytaI+b8ViEP7w
rvZQVBkmeg9FUXC4rcTSkbaPrzi3RRMkdtu+EdszLJAEEgt6umqNPd3AIDcwAgK/ rvZQVBkmeg9FUXC4rcTSkbaPrzi3RRMkdtu+EdszLJAEEgt6umqNPd3AIDcwAgK/
2rclPBpncTWYWRRoaay+BMHyJPNmgFZdTkem36WiM1xQ3b1I0fzjcqdX+aDn6Cm9 2rclPBpncTWYWRRoaay+BMHyJPNmgFZdTkem36WiM1xQ3b1I0fzjcqdX+aDn6Cm9
PUxB/vFK9xffL0geEAKptfZJ/kbcZlzecO9GosMvYTEty1ikLTxdYx39/kSm PUxB/vFK9xffL0geEAKptfZJ/kbcZlzecO9GosMvYTEty1ikLTxdYx39/kSm
-----END RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----

@ -1,28 +1,28 @@
-----BEGIN CERTIFICATE REQUEST----- -----BEGIN CERTIFICATE REQUEST-----
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
72c= 72c=
-----END CERTIFICATE REQUEST----- -----END CERTIFICATE REQUEST-----

Binary file not shown.

@ -1,8 +1,8 @@
[program:codemy] [program:codemy]
command=/usr/bin/uwsgi --ini /var/www/configs/codemy/uwsgi.ini command=/usr/bin/uwsgi --ini /var/www/configs/codemy/uwsgi.ini
directory=/var/www/projects/codemy directory=/var/www/projects/codemy
user=www-data user=www-data
group=www-data group=www-data
autostart=true autostart=true
autorestart=true autorestart=true
stderr_logfile=/var/www/logs/codemy/supervisor-errors.log stderr_logfile=/var/www/logs/codemy/supervisor-errors.log

@ -1,15 +1,15 @@
[uwsgi] [uwsgi]
chdir = /var/www/projects/codemy/ chdir = /var/www/projects/codemy/
env = DJANGO_SETTINGS_MODULE=lms.settings env = DJANGO_SETTINGS_MODULE=lms.settings
module = lms.wsgi:application module = lms.wsgi:application
home = /var/www/.envs/codemy/ home = /var/www/.envs/codemy/
master = true master = true
threads = 3 threads = 3
processes = 2 processes = 2
socket = /var/www/run/codemy.sock socket = /var/www/run/codemy.sock
chmod-socket = 777 chmod-socket = 777
vacuum = true vacuum = true
harakiri = 20 harakiri = 20
plugins=python34 plugins=python34
uid = www-data uid = www-data
gid = www-data gid = www-data

@ -1,120 +1,120 @@
from django.contrib import admin from django.contrib import admin
from access.models import User from access.models import User
from courses.models import Lesson, Course, CourseTheme, Homework, Exam, Skills, Achievements, SkillJ, CourseMap, \ from courses.models import Lesson, Course, CourseTheme, Homework, Exam, Skills, Achievements, SkillJ, CourseMap, \
AchievementsMap, Diploma, MaterialDirection AchievementsMap, Diploma, MaterialDirection
class LessonAdmin(admin.ModelAdmin): class LessonAdmin(admin.ModelAdmin):
list_display = ('id', 'get_title', 'sort', 'theme', 'token', 'on_comment') list_display = ('id', 'get_title', 'sort', 'theme', 'token', 'on_comment')
raw_id_fields = ['materials'] raw_id_fields = ['materials']
search_fields = ['title', 'sort', 'id', 'token'] search_fields = ['title', 'sort', 'id', 'token']
list_filter = ['course', 'on_comment', 'theme'] list_filter = ['course', 'on_comment', 'theme']
def get_title(self, obj): def get_title(self, obj):
return obj.title[:100] return obj.title[:100]
admin.site.register(Lesson, LessonAdmin) admin.site.register(Lesson, LessonAdmin)
class MaterialDirectionAdmin(admin.ModelAdmin): class MaterialDirectionAdmin(admin.ModelAdmin):
list_display = ('title', 'color',) list_display = ('title', 'color',)
raw_id_fields = ['mentors'] raw_id_fields = ['mentors']
def formfield_for_manytomany(self, db_field, request, **kwargs): def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "mentors": if db_field.name == "mentors":
kwargs["queryset"] = User.objects.filter(in_role='S2') kwargs["queryset"] = User.objects.filter(in_role='S2')
return super(MaterialDirectionAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) return super(MaterialDirectionAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
admin.site.register(MaterialDirection, MaterialDirectionAdmin) admin.site.register(MaterialDirection, MaterialDirectionAdmin)
class CourseAdmin(admin.ModelAdmin): class CourseAdmin(admin.ModelAdmin):
list_display = ('title', 'id', 'direction', 'must_build', 'public', ) list_display = ('title', 'id', 'direction', 'must_build', 'public', )
list_filter = ('direction', ) list_filter = ('direction', )
raw_id_fields = ['teachers'] raw_id_fields = ['teachers']
search_fields = ['title', 'id'] search_fields = ['title', 'id']
filter_horizontal = ['recommend', 'keywords'] filter_horizontal = ['recommend', 'keywords']
def formfield_for_manytomany(self, db_field, request, **kwargs): def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "teachers": if db_field.name == "teachers":
kwargs["queryset"] = User.objects.filter(in_role='T') kwargs["queryset"] = User.objects.filter(in_role='T')
if db_field.name == "mentors": if db_field.name == "mentors":
kwargs["queryset"] = User.objects.filter(in_role='S2') kwargs["queryset"] = User.objects.filter(in_role='S2')
return super(CourseAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) return super(CourseAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
admin.site.register(Course, CourseAdmin) admin.site.register(Course, CourseAdmin)
class CourseThemeAdmin(admin.ModelAdmin): class CourseThemeAdmin(admin.ModelAdmin):
list_display = ('id', 'sort', 'title', 'course', '_type', 'price_type', 'on_comment', ) list_display = ('id', 'sort', 'title', 'course', '_type', 'price_type', 'on_comment', )
list_filter = ['course', '_type', 'on_comment'] list_filter = ['course', '_type', 'on_comment']
search_fields = ['title', 'sort'] search_fields = ['title', 'sort']
admin.site.register(CourseTheme, CourseThemeAdmin) admin.site.register(CourseTheme, CourseThemeAdmin)
class HomeworkAdmin(admin.ModelAdmin): class HomeworkAdmin(admin.ModelAdmin):
list_display = ('id', 'course', 'theme', 'token') list_display = ('id', 'course', 'theme', 'token')
search_fields = ['id', 'theme', 'course', 'token'] search_fields = ['id', 'theme', 'course', 'token']
list_filter = ('course',) list_filter = ('course',)
raw_id_fields = ('theme', 'course', 'materials', ) raw_id_fields = ('theme', 'course', 'materials', )
admin.site.register(Homework, HomeworkAdmin) admin.site.register(Homework, HomeworkAdmin)
class ExamAdmin(admin.ModelAdmin): class ExamAdmin(admin.ModelAdmin):
list_display = ('course', 'token', ) list_display = ('course', 'token', )
raw_id_fields = ['materials'] raw_id_fields = ['materials']
search_fields = ['id', 'course__title'] search_fields = ['id', 'course__title']
admin.site.register(Exam, ExamAdmin) admin.site.register(Exam, ExamAdmin)
class SkillsAdmin(admin.ModelAdmin): class SkillsAdmin(admin.ModelAdmin):
list_display = ('title', 'color', 'mini_icon', 'big_icon') list_display = ('title', 'color', 'mini_icon', 'big_icon')
search_fields = ['title'] search_fields = ['title']
admin.site.register(Skills, SkillsAdmin) admin.site.register(Skills, SkillsAdmin)
class AchievementsAdmin(admin.ModelAdmin): class AchievementsAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'icon', 'image', 'background', 'border',) list_display = ('id', 'title', 'icon', 'image', 'background', 'border',)
admin.site.register(Achievements, AchievementsAdmin) admin.site.register(Achievements, AchievementsAdmin)
class SkillJAdmin(admin.ModelAdmin): class SkillJAdmin(admin.ModelAdmin):
list_display = ('skill', 'lesson', 'size',) list_display = ('skill', 'lesson', 'size',)
raw_id_fields = ['lesson'] raw_id_fields = ['lesson']
list_filter = ['lesson__course'] list_filter = ['lesson__course']
admin.site.register(SkillJ, SkillJAdmin) admin.site.register(SkillJ, SkillJAdmin)
class CourseMapAdmin(admin.ModelAdmin): class CourseMapAdmin(admin.ModelAdmin):
list_display = ('id', 'course', 'lesson', 'homework', 'exam', 'sort', 'token', ) list_display = ('id', 'course', 'lesson', 'homework', 'exam', 'sort', 'token', )
raw_id_fields = ['course', 'lesson', 'homework', 'exam'] raw_id_fields = ['course', 'lesson', 'homework', 'exam']
list_filter = ('course',) list_filter = ('course',)
search_fields = ['lesson_id'] search_fields = ['lesson_id']
admin.site.register(CourseMap, CourseMapAdmin) admin.site.register(CourseMap, CourseMapAdmin)
class AchievementsMapAdmin(admin.ModelAdmin): class AchievementsMapAdmin(admin.ModelAdmin):
list_display = ('id', 'point', 'achiv', 'after', ) list_display = ('id', 'point', 'achiv', 'after', )
raw_id_fields = ['point'] raw_id_fields = ['point']
admin.site.register(AchievementsMap, AchievementsMapAdmin) admin.site.register(AchievementsMap, AchievementsMapAdmin)
class DiplomaAdmin(admin.ModelAdmin): class DiplomaAdmin(admin.ModelAdmin):
list_filter = ('course__title', 'key', ) list_filter = ('course__title', 'key', )
search_fields = ['course__title'] search_fields = ['course__title']
admin.site.register(Diploma, DiplomaAdmin) admin.site.register(Diploma, DiplomaAdmin)

File diff suppressed because it is too large Load Diff

@ -1,199 +1,199 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46 # Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import redactor.fields import redactor.fields
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('management', '0001_initial'), ('management', '0001_initial'),
('storage', '0001_initial'), ('storage', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Achievements', name='Achievements',
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')),
('tech_name', models.CharField(blank=True, default=b'', editable=False, help_text='\u0414\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f', max_length=20, unique=True, verbose_name='\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435')), ('tech_name', models.CharField(blank=True, default=b'', editable=False, help_text='\u0414\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f', max_length=20, unique=True, verbose_name='\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435')),
('icon', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430')), ('icon', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430')),
('title', models.CharField(help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f', max_length=50, verbose_name='\u0418\u043c\u044f')), ('title', models.CharField(help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f', max_length=50, verbose_name='\u0418\u043c\u044f')),
('image', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), ('image', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')),
('background', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')), ('background', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')),
('border', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b')), ('border', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b')),
], ],
options={ options={
'verbose_name': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435', 'verbose_name': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435',
'verbose_name_plural': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f', 'verbose_name_plural': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Course', name='Course',
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')),
('level', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439'), (b'A', '\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 '), (b'E', '\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u043d\u044b\u0439'), (b'B+A', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 + \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439')], default=b'B', max_length=3, verbose_name='\u0423\u0440\u043e\u0432\u0435\u043d\u044c')), ('level', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439'), (b'A', '\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 '), (b'E', '\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u043d\u044b\u0439'), (b'B+A', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 + \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439')], default=b'B', max_length=3, verbose_name='\u0423\u0440\u043e\u0432\u0435\u043d\u044c')),
('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')), ('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')),
('title', models.CharField(max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), ('title', models.CharField(max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')),
('description', redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), ('description', redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')),
('image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), ('image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')),
('big_image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), ('big_image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')),
('page', models.URLField(blank=True, default=b'', verbose_name='\u0421\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f')), ('page', models.URLField(blank=True, default=b'', verbose_name='\u0421\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f')),
('preview', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0422\u0440\u044d\u0439\u043b')), ('preview', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0422\u0440\u044d\u0439\u043b')),
('sort', models.IntegerField(default=0, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438')), ('sort', models.IntegerField(default=0, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438')),
('use_fail', models.BooleanField(default=False, verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0435\u0439\u043a\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e')), ('use_fail', models.BooleanField(default=False, verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0435\u0439\u043a\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e')),
('basic_len', models.IntegerField(default=0, verbose_name='\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')), ('basic_len', models.IntegerField(default=0, verbose_name='\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')),
('addition_len', models.IntegerField(default=0, verbose_name='\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')), ('addition_len', models.IntegerField(default=0, verbose_name='\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')),
('min_price', models.IntegerField(default=0, verbose_name='\u0426\u0435\u043d\u0430 \u043e\u0442')), ('min_price', models.IntegerField(default=0, verbose_name='\u0426\u0435\u043d\u0430 \u043e\u0442')),
('buy_icon', models.ImageField(blank=True, null=True, upload_to=b'course', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438')), ('buy_icon', models.ImageField(blank=True, null=True, upload_to=b'course', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438')),
('teachers', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u0438')), ('teachers', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u0438')),
], ],
options={ options={
'ordering': ['sort'], 'ordering': ['sort'],
'verbose_name': '\u041a\u0443\u0440\u0441', 'verbose_name': '\u041a\u0443\u0440\u0441',
'verbose_name_plural': '\u041a\u0443\u0440\u0441\u044b', 'verbose_name_plural': '\u041a\u0443\u0440\u0441\u044b',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='CourseMap', name='CourseMap',
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')),
('_type', models.CharField(choices=[(b'L', '\u0423\u0440\u043e\u043a'), (b'H', '\u0414\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435'), (b'E', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d')], default=b'L', max_length=1, verbose_name='\u0422\u0438\u043f\u044b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432')), ('_type', models.CharField(choices=[(b'L', '\u0423\u0440\u043e\u043a'), (b'H', '\u0414\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435'), (b'E', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d')], default=b'L', max_length=1, verbose_name='\u0422\u0438\u043f\u044b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432')),
('sort', models.IntegerField(default=0, verbose_name='\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a')), ('sort', models.IntegerField(default=0, verbose_name='\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a')),
('token', models.CharField(editable=False, max_length=20, null=True, unique=True, verbose_name='\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043b\u044e\u0447')), ('token', models.CharField(editable=False, max_length=20, null=True, unique=True, verbose_name='\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043b\u044e\u0447')),
('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
], ],
options={ options={
'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', 'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430',
'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432', 'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='CourseTheme', name='CourseTheme',
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')),
('price_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')), ('price_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')),
('_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'M', '\u041f\u0440\u0435\u0434\u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b'), (b'Ex', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u043c\u0430')], default=b'B', max_length=2, verbose_name='\u0422\u0438\u043f \u0442\u0435\u043c\u044b')), ('_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'M', '\u041f\u0440\u0435\u0434\u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b'), (b'Ex', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u043c\u0430')], default=b'B', max_length=2, verbose_name='\u0422\u0438\u043f \u0442\u0435\u043c\u044b')),
('icon', models.ImageField(blank=True, null=True, upload_to=b'CourseTheme', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430 \u0442\u0435\u043c\u044b')), ('icon', models.ImageField(blank=True, null=True, upload_to=b'CourseTheme', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430 \u0442\u0435\u043c\u044b')),
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), ('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')),
('title', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), ('title', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')),
('description', models.TextField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b')), ('description', models.TextField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
], ],
options={ options={
'ordering': ['sort'], 'ordering': ['sort'],
'verbose_name': '\u0422\u0435\u043c\u0430', 'verbose_name': '\u0422\u0435\u043c\u0430',
'verbose_name_plural': '\u0422\u0435\u043c\u044b', 'verbose_name_plural': '\u0422\u0435\u043c\u044b',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Exam', name='Exam',
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')),
('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), ('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')),
('sort', models.IntegerField(default=1, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), ('sort', models.IntegerField(default=1, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')),
('title', models.CharField(default=b'', help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0430', max_length=255, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), ('title', models.CharField(default=b'', help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0430', max_length=255, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')),
('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432')), ('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
('diploma', models.ForeignKey(help_text='\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435', on_delete=django.db.models.deletion.CASCADE, related_name='exam_diploma', to='storage.Storage', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430')), ('diploma', models.ForeignKey(help_text='\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435', on_delete=django.db.models.deletion.CASCADE, related_name='exam_diploma', to='storage.Storage', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430')),
('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='storage.Storage', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0434\u0438\u043f\u043b\u043e\u043c\u0430')), ('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='storage.Storage', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0434\u0438\u043f\u043b\u043e\u043c\u0430')),
('materials', models.ManyToManyField(blank=True, related_name='exam_materials', to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), ('materials', models.ManyToManyField(blank=True, related_name='exam_materials', to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')),
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), ('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')),
], ],
options={ options={
'ordering': ['sort'], 'ordering': ['sort'],
'verbose_name': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d', 'verbose_name': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d',
'verbose_name_plural': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u044b', 'verbose_name_plural': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u044b',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Homework', name='Homework',
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')),
('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), ('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')),
('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), ('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')),
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), ('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b')), ('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b')),
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), ('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')),
], ],
options={ options={
'ordering': ['sort'], 'ordering': ['sort'],
'verbose_name': '\u0414\u043e\u0431\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435', 'verbose_name': '\u0414\u043e\u0431\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435',
'verbose_name_plural': '\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f', 'verbose_name_plural': '\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Lesson', name='Lesson',
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')),
('free', models.BooleanField(default=False, verbose_name='\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e')), ('free', models.BooleanField(default=False, verbose_name='\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e')),
('token', models.CharField(blank=True, default=b'', editable=False, max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), ('token', models.CharField(blank=True, default=b'', editable=False, max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')),
('title', models.TextField(blank=True, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), ('title', models.TextField(blank=True, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')),
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), ('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')),
('description', redactor.fields.RedactorField(blank=True, default=b'', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), ('description', redactor.fields.RedactorField(blank=True, default=b'', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')),
('video', models.TextField(default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e')), ('video', models.TextField(default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e')),
('comments', models.ManyToManyField(blank=True, editable=False, to='management.Comment', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438')), ('comments', models.ManyToManyField(blank=True, editable=False, to='management.Comment', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0443\u0440\u043e\u043a\u0430')), ('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0443\u0440\u043e\u043a\u0430')),
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), ('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')),
], ],
options={ options={
'ordering': ['sort'], 'ordering': ['sort'],
'verbose_name': '\u0423\u0440\u043e\u043a', 'verbose_name': '\u0423\u0440\u043e\u043a',
'verbose_name_plural': '\u0423\u0440\u043e\u043a\u0438', 'verbose_name_plural': '\u0423\u0440\u043e\u043a\u0438',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='SkillJ', name='SkillJ',
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')),
('size', models.IntegerField(default=0, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440')), ('size', models.IntegerField(default=0, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440')),
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a')), ('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a')),
], ],
options={ options={
'ordering': ['id'], 'ordering': ['id'],
'verbose_name': '\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0432\u044b\u043a\u0430', 'verbose_name': '\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0432\u044b\u043a\u0430',
'verbose_name_plural': '\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u0430\u0432\u044b\u043a\u043e\u0432', 'verbose_name_plural': '\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u0430\u0432\u044b\u043a\u043e\u0432',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Skills', name='Skills',
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')),
('title', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435')), ('title', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435')),
('color', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442')), ('color', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442')),
], ],
options={ options={
'verbose_name': '\u041d\u0430\u0432\u044b\u043a', 'verbose_name': '\u041d\u0430\u0432\u044b\u043a',
'verbose_name_plural': '\u041d\u0430\u0432\u044b\u043a\u0438', 'verbose_name_plural': '\u041d\u0430\u0432\u044b\u043a\u0438',
}, },
), ),
migrations.AddField( migrations.AddField(
model_name='skillj', model_name='skillj',
name='skill', name='skill',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='\u041d\u0430\u0432\u044b\u043a'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='\u041d\u0430\u0432\u044b\u043a'),
), ),
migrations.AddField( migrations.AddField(
model_name='coursemap', model_name='coursemap',
name='exam', name='exam',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Exam', verbose_name='\u042d\u043a\u0437\u0430\u043c\u0435\u043d'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Exam', verbose_name='\u042d\u043a\u0437\u0430\u043c\u0435\u043d'),
), ),
migrations.AddField( migrations.AddField(
model_name='coursemap', model_name='coursemap',
name='homework', name='homework',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Homework', verbose_name='\u0417\u0430\u0434\u0430\u043d\u0438\u0435'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Homework', verbose_name='\u0417\u0430\u0434\u0430\u043d\u0438\u0435'),
), ),
migrations.AddField( migrations.AddField(
model_name='coursemap', model_name='coursemap',
name='lesson', name='lesson',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a'),
), ),
] ]

@ -1,29 +1,29 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-20 20:26 # Generated by Django 1.9.2 on 2016-03-20 20:26
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0001_initial'), ('courses', '0001_initial'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='AchievementsMap', name='AchievementsMap',
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')),
('after', models.BooleanField(default=True, verbose_name='\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f')), ('after', models.BooleanField(default=True, verbose_name='\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f')),
('achiv', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Achievements', verbose_name='\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435')), ('achiv', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Achievements', verbose_name='\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435')),
('point', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.CourseMap', verbose_name='\u041f\u043e\u0437\u0438\u0446\u0438\u044f')), ('point', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.CourseMap', verbose_name='\u041f\u043e\u0437\u0438\u0446\u0438\u044f')),
], ],
options={ options={
'verbose_name': '\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u044f\u044f \u0430\u0447\u0438\u0432\u043a\u0430', 'verbose_name': '\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u044f\u044f \u0430\u0447\u0438\u0432\u043a\u0430',
'verbose_name_plural': '\u0412\u043d\u0435\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0430\u0447\u0438\u0432\u043a\u0438', 'verbose_name_plural': '\u0412\u043d\u0435\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0430\u0447\u0438\u0432\u043a\u0438',
}, },
), ),
] ]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-22 18:52 # Generated by Django 1.9.2 on 2016-03-22 18:52
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0002_achievementsmap'), ('courses', '0002_achievementsmap'),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='coursemap', name='coursemap',
options={'ordering': ['sort'], 'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', 'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432'}, options={'ordering': ['sort'], 'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', 'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432'},
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-30 22:39 # Generated by Django 1.9.2 on 2016-03-30 22:39
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0003_auto_20160322_1852'), ('courses', '0003_auto_20160322_1852'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='lesson', model_name='lesson',
name='video_id', name='video_id',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u0412\u0438\u0434\u0435\u043e ID'), field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u0412\u0438\u0434\u0435\u043e ID'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-31 20:30 # Generated by Django 1.9.2 on 2016-03-31 20:30
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0004_lesson_video_id'), ('courses', '0004_lesson_video_id'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='lesson', model_name='lesson',
name='video', name='video',
field=models.TextField(blank=True, default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e'), field=models.TextField(blank=True, default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e'),
), ),
] ]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-07 20:06 # Generated by Django 1.9.2 on 2016-04-07 20:06
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0005_auto_20160331_2030'), ('courses', '0005_auto_20160331_2030'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='coursetheme', model_name='coursetheme',
name='empty', name='empty',
field=models.BooleanField(default=False, help_text='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u0430. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0443\u0440\u0441 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e.', verbose_name='\u0422\u044b \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0448\u044c!'), field=models.BooleanField(default=False, help_text='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u0430. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0443\u0440\u0441 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e.', verbose_name='\u0422\u044b \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0448\u044c!'),
), ),
migrations.AddField( migrations.AddField(
model_name='coursetheme', model_name='coursetheme',
name='empty_description', name='empty_description',
field=models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f'), field=models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-13 15:39 # Generated by Django 1.9.5 on 2016-04-13 15:39
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0006_auto_20160407_2006'), ('courses', '0006_auto_20160407_2006'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='lesson', model_name='lesson',
name='video_date', name='video_date',
field=models.DateTimeField(blank=True, null=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u0435\u043e'), field=models.DateTimeField(blank=True, null=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u0435\u043e'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 18:19 # Generated by Django 1.9.5 on 2016-04-20 18:19
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0007_lesson_video_date'), ('courses', '0007_lesson_video_date'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='coursetheme', model_name='coursetheme',
name='block', name='block',
field=models.BooleanField(default=False, verbose_name='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435'), field=models.BooleanField(default=False, verbose_name='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435'),
), ),
] ]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 18:21 # Generated by Django 1.9.5 on 2016-04-20 18:21
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0008_coursetheme_block'), ('courses', '0008_coursetheme_block'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='coursetheme', model_name='coursetheme',
name='block', name='block',
), ),
] ]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 19:09 # Generated by Django 1.9.5 on 2016-04-20 19:09
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0009_remove_coursetheme_block'), ('courses', '0009_remove_coursetheme_block'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='coursetheme', model_name='coursetheme',
name='empty_description', name='empty_description',
), ),
] ]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 15:50 # Generated by Django 1.9.5 on 2016-04-25 15:50
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0010_remove_coursetheme_empty_description'), ('courses', '0010_remove_coursetheme_empty_description'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='course', model_name='course',
name='in_diploma', name='in_diploma',
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='course', model_name='course',
name='out_diploma', name='out_diploma',
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 15:53 # Generated by Django 1.9.5 on 2016-04-25 15:53
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0011_auto_20160425_1550'), ('courses', '0011_auto_20160425_1550'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='course', model_name='course',
name='diploma_key', name='diploma_key',
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'),
), ),
] ]

@ -1,42 +1,42 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:20 # Generated by Django 1.9.5 on 2016-04-25 17:20
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0012_course_diploma_key'), ('courses', '0012_course_diploma_key'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='course', model_name='course',
name='diploma_key', name='diploma_key',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='course', model_name='course',
name='in_diploma', name='in_diploma',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='course', model_name='course',
name='out_diploma', name='out_diploma',
), ),
migrations.AddField( migrations.AddField(
model_name='exam', model_name='exam',
name='diploma_key', name='diploma_key',
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'),
), ),
migrations.AddField( migrations.AddField(
model_name='exam', model_name='exam',
name='in_diploma', name='in_diploma',
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='exam', model_name='exam',
name='out_diploma', name='out_diploma',
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'),
), ),
] ]

@ -1,35 +1,35 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:37 # Generated by Django 1.9.5 on 2016-04-25 17:37
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0013_auto_20160425_1720'), ('courses', '0013_auto_20160425_1720'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Diploma', name='Diploma',
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')),
('key', models.CharField(max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), ('key', models.CharField(max_length=255, verbose_name='\u041a\u043b\u044e\u0447')),
('date', models.DateField(default=datetime.date.today, verbose_name='\u0414\u0430\u0442\u0430 \u0432\u044b\u0434\u0430\u0447\u0438')), ('date', models.DateField(default=datetime.date.today, verbose_name='\u0414\u0430\u0442\u0430 \u0432\u044b\u0434\u0430\u0447\u0438')),
('out_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')), ('out_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')),
('in_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')), ('in_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u043a\u0443\u0440\u0441')), ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u043a\u0443\u0440\u0441')),
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')), ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')),
], ],
options={ options={
'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b', 'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b',
'verbose_name_plural': '\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0430\u0447\u0438 \u042d\u043a\u0437\u0430\u043c\u0435\u043d\u043e\u0432', 'verbose_name_plural': '\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0430\u0447\u0438 \u042d\u043a\u0437\u0430\u043c\u0435\u043d\u043e\u0432',
}, },
), ),
] ]

@ -1,45 +1,45 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:50 # Generated by Django 1.9.5 on 2016-04-25 17:50
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0014_diploma'), ('courses', '0014_diploma'),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='diploma', name='diploma',
options={'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c', 'verbose_name_plural': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b'}, options={'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c', 'verbose_name_plural': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b'},
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='exam', model_name='exam',
name='diploma', name='diploma',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='exam', model_name='exam',
name='diploma_key', name='diploma_key',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='exam', model_name='exam',
name='in_diploma', name='in_diploma',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='exam', model_name='exam',
name='out_diploma', name='out_diploma',
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='in_image', name='in_image',
field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'), field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='out_image', name='out_image',
field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'), field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'),
), ),
] ]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:52 # Generated by Django 1.9.5 on 2016-04-25 17:52
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0015_auto_20160425_1750'), ('courses', '0015_auto_20160425_1750'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='course', model_name='course',
name='diploma_key', name='diploma_key',
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'),
), ),
migrations.AddField( migrations.AddField(
model_name='course', model_name='course',
name='in_diploma', name='in_diploma',
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='course', model_name='course',
name='out_diploma', name='out_diploma',
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'),
), ),
] ]

@ -1,39 +1,39 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 12:40 # Generated by Django 1.9.5 on 2016-04-26 12:40
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0016_auto_20160425_1752'), ('courses', '0016_auto_20160425_1752'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='diploma', model_name='diploma',
name='date', name='date',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='diploma', model_name='diploma',
name='student', name='student',
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='icon', name='icon',
field=models.ImageField(null=True, upload_to=b'diploms', verbose_name='\u041c\u0438\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), field=models.ImageField(null=True, upload_to=b'diploms', verbose_name='\u041c\u0438\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='course', name='course',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key', name='key',
field=models.CharField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'), field=models.CharField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'),
), ),
] ]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 12:41 # Generated by Django 1.9.5 on 2016-04-26 12:41
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0017_auto_20160426_1240'), ('courses', '0017_auto_20160426_1240'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='exam', model_name='exam',
name='icon', name='icon',
), ),
] ]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 12:42 # Generated by Django 1.9.5 on 2016-04-26 12:42
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0018_remove_exam_icon'), ('courses', '0018_remove_exam_icon'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='exam', model_name='exam',
name='title', name='title',
), ),
] ]

@ -1,27 +1,27 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 12:43 # Generated by Django 1.9.5 on 2016-04-26 12:43
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0019_remove_exam_title'), ('courses', '0019_remove_exam_title'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='course', model_name='course',
name='diploma_key', name='diploma_key',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='course', model_name='course',
name='in_diploma', name='in_diploma',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='course', model_name='course',
name='out_diploma', name='out_diploma',
), ),
] ]

@ -1,75 +1,75 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 14:47 # Generated by Django 1.9.5 on 2016-04-26 14:47
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0020_auto_20160426_1243'), ('courses', '0020_auto_20160426_1243'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='date_color', name='date_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='date_font', name='date_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='date_place', name='date_place',
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b'), field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='date_size', name='date_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='key_color', name='key_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='key_font', name='key_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='key_place', name='key_place',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='key_size', name='key_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='name_color', name='name_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='name_font', name='name_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='name_place', name='name_place',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'),
), ),
migrations.AddField( migrations.AddField(
model_name='diploma', model_name='diploma',
name='name_size', name='name_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
), ),
] ]

@ -1,60 +1,60 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 15:26 # Generated by Django 1.9.5 on 2016-04-26 15:26
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0021_auto_20160426_1447'), ('courses', '0021_auto_20160426_1447'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='in_image', name='in_image',
field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'), field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key', name='key',
field=models.IntegerField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'), field=models.IntegerField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_color', name='key_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_font', name='key_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u043a\u043b\u044e\u0447\u0430'), field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_size', name='key_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_color', name='name_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_font', name='name_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0438\u043c\u0435\u043d\u0438'), field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0438\u043c\u0435\u043d\u0438'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_size', name='name_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'), field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='out_image', name='out_image',
field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'), field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'),
), ),
] ]

@ -1,55 +1,55 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 17:29 # Generated by Django 1.9.5 on 2016-04-26 17:29
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0022_auto_20160426_1526'), ('courses', '0022_auto_20160426_1526'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='date_color', name='date_color',
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='date_size', name='date_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_color', name='key_color',
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_place', name='key_place',
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'), field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_size', name='key_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'), field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_color', name='name_color',
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_place', name='name_place',
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'), field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_size', name='name_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'), field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'),
), ),
] ]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 17:48 # Generated by Django 1.9.5 on 2016-05-05 17:48
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0023_auto_20160426_1729'), ('courses', '0023_auto_20160426_1729'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='date_color', name='date_color',
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='key_color', name='key_color',
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='diploma', model_name='diploma',
name='name_color', name='name_color',
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'),
), ),
] ]

@ -1,31 +1,31 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03 # Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import redactor.fields import redactor.fields
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0024_auto_20160505_1748'), ('courses', '0024_auto_20160505_1748'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='skills', model_name='skills',
name='big_icon', name='big_icon',
field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='skills', model_name='skills',
name='description', name='description',
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'), field=redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'),
), ),
migrations.AddField( migrations.AddField(
model_name='skills', model_name='skills',
name='mini_icon', name='mini_icon',
field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'),
), ),
] ]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 18:38 # Generated by Django 1.9.5 on 2016-05-06 18:38
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0025_auto_20160506_1303'), ('courses', '0025_auto_20160506_1303'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='skills', model_name='skills',
name='big_icon', name='big_icon',
field=models.ImageField(help_text=b'65x65', null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), field=models.ImageField(help_text=b'65x65', null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='skills', model_name='skills',
name='description', name='description',
field=models.TextField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'), field=models.TextField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='skills', model_name='skills',
name='mini_icon', name='mini_icon',
field=models.ImageField(help_text=b'15x15', null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), field=models.ImageField(help_text=b'15x15', null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'),
), ),
] ]

@ -1,303 +1,303 @@
# coding=utf-8 # coding=utf-8
import copy import copy
from lms.tools import out_date_format from lms.tools import out_date_format
STATUS_LABEL_CLASS = 'btn btn-{0} pull-right btn-lg m-b-xs m-r-xs m-t-lg' STATUS_LABEL_CLASS = 'btn btn-{0} pull-right btn-lg m-b-xs m-r-xs m-t-lg'
# Ключи материалов # Ключи материалов
# L - Урок # L - Урок
# H - ДЗ # H - ДЗ
# E - Экзамен # E - Экзамен
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! # ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' !
STATUS_COLLECTION = ({ STATUS_COLLECTION = ({
'title': {'default': u'Доступно для выполнения', 'L': u'Доступно'}, 'title': {'default': u'Доступно для выполнения', 'L': u'Доступно'},
'flag': 'A', 'flag': 'A',
'color': 'info', 'color': 'info',
'styles': 'text-shadow: 0 0 0;', 'styles': 'text-shadow: 0 0 0;',
'icon': 'glyphicon glyphicon-time' 'icon': 'glyphicon glyphicon-time'
}, { }, {
'title': {'default': u'Проверяется преподавателем'}, 'title': {'default': u'Проверяется преподавателем'},
'flag': 'T', 'flag': 'T',
'color': 'info', 'color': 'info',
'styles': 'text-shadow: 0 0 0;', 'styles': 'text-shadow: 0 0 0;',
'icon': 'glyphicon glyphicon-time' 'icon': 'glyphicon glyphicon-time'
}, { }, {
'title': {'default': u'Требуется доработка'}, 'title': {'default': u'Требуется доработка'},
'flag': 'E', 'flag': 'E',
'color': 'danger', 'color': 'danger',
'styles': 'text-shadow: 0 0 0;', 'styles': 'text-shadow: 0 0 0;',
'icon': 'glyphicon glyphicon-time' 'icon': 'glyphicon glyphicon-time'
}, { }, {
'title': {'default': u'Сдано', 'L': u'Пройдено'}, 'title': {'default': u'Сдано', 'L': u'Пройдено'},
'flag': 'F', 'flag': 'F',
'color': 'success', 'color': 'success',
'styles': 'text-shadow: 0 0 0;', 'styles': 'text-shadow: 0 0 0;',
'icon': 'glyphicon glyphicon-ok' 'icon': 'glyphicon glyphicon-ok'
}, { }, {
'title': {'default': u'Не доступно'}, 'title': {'default': u'Не доступно'},
'flag': 'N', 'flag': 'N',
'color': 'default', 'color': 'default',
'styles': 'color: #ccc;text-shadow: 0 0 0;', 'styles': 'color: #ccc;text-shadow: 0 0 0;',
'icon': 'glyphicon glyphicon-remove' 'icon': 'glyphicon glyphicon-remove'
}) })
COMMENTS_STATUS_COLLECTION = ({ COMMENTS_STATUS_COLLECTION = ({
'title': 'Одобрено', 'title': 'Одобрено',
'flag': 'G', 'flag': 'G',
'label': '', 'label': '',
'background': '', 'background': '',
'color': '', 'color': '',
'style': '', 'style': '',
'icon': '' 'icon': ''
}, { }, {
'title': 'Отклонено', 'title': 'Отклонено',
'flag': 'F', 'flag': 'F',
'label': '', 'label': '',
'background': '', 'background': '',
'color': '', 'color': '',
'style': '', 'style': '',
'icon': '' 'icon': ''
}, { }, {
'title': 'Сообщение от администрации', 'title': 'Сообщение от администрации',
'flag': 'A', 'flag': 'A',
'label': '', 'label': '',
'background': '', 'background': '',
'color': '', 'color': '',
'style': '', 'style': '',
'icon': '' 'icon': ''
}, { }, {
'title': 'Технический вопрос', 'title': 'Технический вопрос',
'flag': 'T', 'flag': 'T',
'label': '', 'label': '',
'background': '', 'background': '',
'color': '', 'color': '',
'style': '', 'style': '',
'icon': '' 'icon': ''
}, { }, {
'title': '', 'title': '',
'flag': 'S', 'flag': 'S',
'label': '', 'label': '',
'background': '', 'background': '',
'color': '', 'color': '',
'style': '', 'style': '',
'icon': '' 'icon': ''
}) })
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! # ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' !
LEVELS_COLLECTION = ({ LEVELS_COLLECTION = ({
'title': u'Базовый', 'title': u'Базовый',
'flag': 'B', 'flag': 'B',
'color': '#fff', 'color': '#fff',
'background': '#5cb85c', 'background': '#5cb85c',
'icon': 'glyphicon glyphicon-signal' 'icon': 'glyphicon glyphicon-signal'
}, { }, {
'title': u'Продвинутый', 'title': u'Продвинутый',
'flag': 'A', 'flag': 'A',
'color': '#fff', 'color': '#fff',
'background': '#5bc0de', 'background': '#5bc0de',
'icon': 'glyphicon glyphicon-signal' 'icon': 'glyphicon glyphicon-signal'
}, { }, {
'title': u'Экспертный', 'title': u'Экспертный',
'flag': 'E', 'flag': 'E',
'color': '#fff', 'color': '#fff',
'background': '#d9534f', 'background': '#d9534f',
'icon': 'glyphicon glyphicon-signal' 'icon': 'glyphicon glyphicon-signal'
}, { }, {
'title': u'Базовый + Продвинутый', 'title': u'Базовый + Продвинутый',
'flag': 'B+A', 'flag': 'B+A',
'color': '#fff', 'color': '#fff',
'background': '#e68917', 'background': '#e68917',
'icon': 'glyphicon glyphicon-signal' 'icon': 'glyphicon glyphicon-signal'
}) })
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! # ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' !
MATERIAL_TYPE_COLLECTION = ({ MATERIAL_TYPE_COLLECTION = ({
'title': u'Базовый материал', # Выводимое имя типа 'title': u'Базовый материал', # Выводимое имя типа
'flag': 'B', # Флаг, по которому идет поиск 'flag': 'B', # Флаг, по которому идет поиск
'color': '#dee5e7', # Стандартный цвет отображения типа материала 'color': '#dee5e7', # Стандартный цвет отображения типа материала
'icon': '/static/img/1441672724_new_seo-37.png' # Стандартная иконка темы 'icon': '/static/img/1441672724_new_seo-37.png' # Стандартная иконка темы
}, { }, {
'title': u'Расширеный материал', 'title': u'Расширеный материал',
'flag': 'E', 'flag': 'E',
'color': '#66cc99', 'color': '#66cc99',
'icon': '/static/img/1441673370_8.png' 'icon': '/static/img/1441673370_8.png'
}, { }, {
'title': u'Премиум материал', 'title': u'Премиум материал',
'flag': 'P', 'flag': 'P',
'color': '#ffffcc', 'color': '#ffffcc',
'icon': '/static/img/1441671767_new_seo-36.png' 'icon': '/static/img/1441671767_new_seo-36.png'
}, { }, {
'title': u'Предэкзаменационные материалы', 'title': u'Предэкзаменационные материалы',
'flag': 'M', 'flag': 'M',
'color': '#dee5e7', 'color': '#dee5e7',
'icon': '/static/img/1447237167_BeOS_app_serv.png' 'icon': '/static/img/1447237167_BeOS_app_serv.png'
}, { }, {
'title': u'Экзаменационная тема', 'title': u'Экзаменационная тема',
'flag': 'Ex', 'flag': 'Ex',
'color': '#ff1', 'color': '#ff1',
'icon': '/static/img/1441672223_new_seo2-17.png' 'icon': '/static/img/1441672223_new_seo2-17.png'
}) })
USER_TYPES = ({ USER_TYPES = ({
'flag': 'U', 'flag': 'U',
'title': u'Студент', 'title': u'Студент',
'background': 'bg-primary', 'background': 'bg-primary',
'style': '', 'style': '',
'label': '' 'label': ''
}, { }, {
'flag': 'T', 'flag': 'T',
'title': u'Преподаватель', 'title': u'Преподаватель',
'background': 'bg-primary', 'background': 'bg-primary',
'style': '', 'style': '',
'label': '' 'label': ''
}, { }, {
'flag': 'M', 'flag': 'M',
'title': u'Менеджер', 'title': u'Менеджер',
'background': 'bg-primary', 'background': 'bg-primary',
'style': '', 'style': '',
'label': '' 'label': ''
}, { }, {
'flag': 'S', 'flag': 'S',
'title': 'Руководитель', 'title': 'Руководитель',
'background': 'bg-primary', 'background': 'bg-primary',
'style': '', 'style': '',
'label': '' 'label': ''
}, { }, {
'flag': 'A', 'flag': 'A',
'title': u'Команда «SkillBox»', 'title': u'Команда «SkillBox»',
'background': 'bg-warning', 'background': 'bg-warning',
'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;', 'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;',
'label': '' 'label': ''
}, { }, {
'flag': 'S2', 'flag': 'S2',
'title': u'Куратор', 'title': u'Куратор',
'background': 'bg-warning', 'background': 'bg-warning',
'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;', 'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;',
'label': '' 'label': ''
}) })
BUTTON_TYPES = { BUTTON_TYPES = {
'N': '', 'N': '',
'B': u'Получить полный доступ к курсу', 'B': u'Получить полный доступ к курсу',
'H': u'Перейти к заданию', 'H': u'Перейти к заданию',
'L': u'Перейти к изучению', 'L': u'Перейти к изучению',
'O': u'Открыть лекцию', 'O': u'Открыть лекцию',
'E': u'Страница экзамена', 'E': u'Страница экзамена',
'T': u'Не доступно по подписке', 'T': u'Не доступно по подписке',
'F': u'Перейти к экзамену' 'F': u'Перейти к экзамену'
} }
BUTTON_TYPE = ({ BUTTON_TYPE = ({
'flag': 'A', 'flag': 'A',
'title': {'default': u'Открыть материал', 'title': {'default': u'Открыть материал',
'L': u'Перейти к уроку', 'L': u'Перейти к уроку',
'H': u'Перейти к заданию', 'H': u'Перейти к заданию',
'E': u'Перейти к экзамену'}, 'E': u'Перейти к экзамену'},
'color': {'default': '#fff'}, 'color': {'default': '#fff'},
'background': { 'background': {
'default': '#23ad44', 'default': '#23ad44',
'H': '#23b7e5' 'H': '#23b7e5'
}, },
'link': {'L': '/courses/lesson/', 'link': {'L': '/courses/lesson/',
'H': '/courses/homework/', 'H': '/courses/homework/',
'E': '/courses/exam/'}, 'E': '/courses/exam/'},
'by_type': { 'by_type': {
'L': 'lesson', 'L': 'lesson',
'H': 'homework', 'H': 'homework',
'E': 'exam' 'E': 'exam'
} }
}, { }, {
'flag': 'F', 'flag': 'F',
'title': {'default': u'Открыть материал', 'title': {'default': u'Открыть материал',
'L': u'Открыть лекцию', 'L': u'Открыть лекцию',
'H': u'Открыть задание', 'H': u'Открыть задание',
'E': u'Открыть экзамен'}, 'E': u'Открыть экзамен'},
'color': {'default': '#fff'}, 'color': {'default': '#fff'},
'background': { 'background': {
'default': '#23ad44', 'default': '#23ad44',
'H': '#23b7e5' 'H': '#23b7e5'
}, },
'link': {'L': '/courses/lesson/', # ID урока 'link': {'L': '/courses/lesson/', # ID урока
'H': '/courses/homework/', # ID ДЗ 'H': '/courses/homework/', # ID ДЗ
'E': '/courses/exam/'}, # ID экзамена 'E': '/courses/exam/'}, # ID экзамена
'by_type': { 'by_type': {
'L': 'lesson', 'L': 'lesson',
'H': 'homework', 'H': 'homework',
'E': 'exam' 'E': 'exam'
} }
}) })
def comment_fabric(_comment, __type=None, __user=None): def comment_fabric(_comment, __type=None, __user=None):
result = { result = {
'id': _comment.id, 'id': _comment.id,
'status': search_in_collection(COMMENTS_STATUS_COLLECTION, 'flag', _comment.status), 'status': search_in_collection(COMMENTS_STATUS_COLLECTION, 'flag', _comment.status),
'closed': _comment.closed, 'closed': _comment.closed,
'owner': _comment.owner.name if _comment.owner.name else _comment.owner.get_short_name(), 'owner': _comment.owner.name if _comment.owner.name else _comment.owner.get_short_name(),
'owner_name': _comment.owner.get_full_name(), 'owner_name': _comment.owner.get_full_name(),
'owner_id': _comment.owner.id, 'owner_id': _comment.owner.id,
'owner_email': _comment.owner.email, 'owner_email': _comment.owner.email,
'owner_type': search_in_collection(USER_TYPES, 'flag', _comment.owner.in_role), 'owner_type': search_in_collection(USER_TYPES, 'flag', _comment.owner.in_role),
'owner_avatar': _comment.owner.get_image_url(type_in='small'), 'owner_avatar': _comment.owner.get_image_url(type_in='small'),
'owner_status': _comment.owner.get_status_display(), 'owner_status': _comment.owner.get_status_display(),
'owner_interactive_key': _comment.owner.interactive_key, 'owner_interactive_key': _comment.owner.interactive_key,
'owner_model': '', 'owner_model': '',
'text': _comment.get_text(), 'text': _comment.get_text(),
'date': out_date_format(_comment.date, no_time=False), 'date': out_date_format(_comment.date, no_time=False),
'replies': _comment.get_replies(__type, __user), 'replies': _comment.get_replies(__type, __user),
'files': material_fabric(_comment.files.all()), 'files': material_fabric(_comment.files.all()),
'response': _comment.response, 'response': _comment.response,
'response_comment': _comment.response_comment.get_face(_type=__type, _user=__user) if _comment.response else None 'response_comment': _comment.response_comment.get_face(_type=__type, _user=__user) if _comment.response else None
} }
if __user: if __user:
result['saw'] = _comment.saw.filter(id=__user.id).exists() result['saw'] = _comment.saw.filter(id=__user.id).exists()
#comment.set_saw(__user) #comment.set_saw(__user)
return result return result
def material_fabric(stores): def material_fabric(stores):
result = [] result = []
for store in stores: for store in stores:
result.append({ result.append({
'id': store.id, 'id': store.id,
'format': store.f_format.f_type, 'format': store.f_format.f_type,
'icon_type': 'class' if store.f_format.icon_class else 'icon', 'icon_type': 'class' if store.f_format.icon_class else 'icon',
'icon': store.f_format.icon.url if store.f_format.icon else store.f_format.icon_class, 'icon': store.f_format.icon.url if store.f_format.icon else store.f_format.icon_class,
'url': store.original.url, 'url': store.original.url,
'title': store.get_name_for_user(), 'title': store.get_name_for_user(),
'name': store.get_file_name() 'name': store.get_file_name()
}) })
return result return result
def search_in_collection(collection, field, word, artifact=None, in_type='default'): def search_in_collection(collection, field, word, artifact=None, in_type='default'):
# Поиск по полю в коллекции словарей # Поиск по полю в коллекции словарей
# == Коллекции статичны. Найдя словарь отображения по флагу к примеру, можно просто вывести результат в веб # == Коллекции статичны. Найдя словарь отображения по флагу к примеру, можно просто вывести результат в веб
# == artifact - получить значение конкретно поля из словаря # == artifact - получить значение конкретно поля из словаря
# Получает кортеж, берет словари по очереди и сравнивает в них поле field # Получает кортеж, берет словари по очереди и сравнивает в них поле field
# Если значение в поле template[field] == work - возвращает полную копию словаря или возвращает пустое значение # Если значение в поле template[field] == work - возвращает полную копию словаря или возвращает пустое значение
render = '' render = ''
for template in collection: for template in collection:
if template[field] == word: if template[field] == word:
if artifact: if artifact:
render = copy.deepcopy(template[artifact]) render = copy.deepcopy(template[artifact])
else: else:
render = copy.deepcopy(template) render = copy.deepcopy(template)
break break
if render: if render:
# Получить шаблон специально для запрашиваемого объекта по ключу объекта # Получить шаблон специально для запрашиваемого объекта по ключу объекта
# У урока к примеру сейчас это 'L' # У урока к примеру сейчас это 'L'
try: try:
for key, value in render.items(): for key, value in render.items():
if type(value) == dict: if type(value) == dict:
if in_type in value: if in_type in value:
render[key] = value[in_type] render[key] = value[in_type]
else: else:
render[key] = value['default'] render[key] = value['default']
except AttributeError: except AttributeError:
return render return render
return render return render

@ -1,443 +1,443 @@
# coding=utf-8 # coding=utf-8
from django.db.models import Q from django.db.models import Q
from courses.models import CourseTheme, Exam, Achievements, Lesson, Homework, SkillJ from courses.models import CourseTheme, Exam, Achievements, Lesson, Homework, SkillJ
from journals.models import LessonJ, HomeworkJ, ExamJ, AchievementJ, TeacherJ, DiplomaJ from journals.models import LessonJ, HomeworkJ, ExamJ, AchievementJ, TeacherJ, DiplomaJ
def get_empty_face(course): def get_empty_face(course):
return TeacherJ.objects.filter(course__id=course).first().get_empty_face() return TeacherJ.objects.filter(course__id=course).first().get_empty_face()
def set_read_flag(student, course): def set_read_flag(student, course):
pass pass
def get_next_button(student, start_place_type, start_place_id): def get_next_button(student, start_place_type, start_place_id):
pass pass
def get_read_flag(student, course): def get_read_flag(student, course):
pass pass
def check_read_flag(student, course): def check_read_flag(student, course):
pass pass
def check_bought(token, user): def check_bought(token, user):
# Проверка доступа материала по подписке # Проверка доступа материала по подписке
pass pass
def make_journal(journal): def make_journal(journal):
course = journal.course course = journal.course
student = journal.student student = journal.student
def get_user_courses(user): def get_user_courses(user):
# Получить рабочие курсы студента # Получить рабочие курсы студента
return TeacherJ.objects.filter(student=user) return TeacherJ.objects.filter(student=user)
def get_user_diploms(user): def get_user_diploms(user):
# Получить дипломы пользователя # Получить дипломы пользователя
return DiplomaJ.objects.filter(student=user).exclude(Q(in_image=None)|Q(key=None)).only('material', 'date') return DiplomaJ.objects.filter(student=user).exclude(Q(in_image=None)|Q(key=None)).only('material', 'date')
def get_user_achievements(user): def get_user_achievements(user):
# Получить все ачивки пользователя # Получить все ачивки пользователя
themes = {} themes = {}
for i in AchievementJ.objects.filter(student=user): for i in AchievementJ.objects.filter(student=user):
themes[i.group] = [] themes[i.group] = []
for i in AchievementJ.objects.filter(student=user): for i in AchievementJ.objects.filter(student=user):
themes[i.group].append(i) themes[i.group].append(i)
return themes return themes
def get_user_achievements_count(user): def get_user_achievements_count(user):
# Получение количества ачивок пользователя # Получение количества ачивок пользователя
return AchievementJ.objects.filter(student=user).count() return AchievementJ.objects.filter(student=user).count()
def get_user_skills(user): def get_user_skills(user):
# Получить скилы пользователя # Получить скилы пользователя
lessons = [i.material for i in LessonJ.objects.filter(student=user, success=True)] lessons = [i.material for i in LessonJ.objects.filter(student=user, success=True)]
skills = SkillJ.objects.filter(lesson__in=lessons).only('size', 'skill') skills = SkillJ.objects.filter(lesson__in=lessons).only('size', 'skill')
result = {} result = {}
for i in skills: for i in skills:
if i.skill.title in result: if i.skill.title in result:
result[i.skill.title]['size'] += i.size result[i.skill.title]['size'] += i.size
else: else:
result[i.skill.title] = { result[i.skill.title] = {
'color': i.skill.color, 'color': i.skill.color,
'size': i.size, 'size': i.size,
'icon': i.skill.mini_icon 'icon': i.skill.mini_icon
} }
return result return result
def get_user_completed_courses_count(user): def get_user_completed_courses_count(user):
return ExamJ.objects.filter(student=user, success=True).count() return ExamJ.objects.filter(student=user, success=True).count()
def get_user_skills_size_count(user): def get_user_skills_size_count(user):
# Посчитать размер навыка # Посчитать размер навыка
result = 0 result = 0
for key, value in get_user_skills(user).items(): for key, value in get_user_skills(user).items():
result += value['size'] result += value['size']
return result return result
def set_achievement(user, title, text, group, achievement_name): def set_achievement(user, title, text, group, achievement_name):
# Просвоить ачивку # Просвоить ачивку
achievement = Achievements.objects.get(tech_name=achievement_name) achievement = Achievements.objects.get(tech_name=achievement_name)
AchievementJ.objects.create(student=user, title=title, text=text, group=group, achievement=achievement) AchievementJ.objects.create(student=user, title=title, text=text, group=group, achievement=achievement)
### Методы над курсом ### Методы над курсом
def get_students_on_homework_length(course): def get_students_on_homework_length(course):
l = 0 l = 0
for i in CourseTheme.objects.filter(course=course): for i in CourseTheme.objects.filter(course=course):
l += i.get_active_homework_students_length() l += i.get_active_homework_students_length()
return l return l
def get_active_exam_students(course): def get_active_exam_students(course):
result = [i.student for i in ExamJ.objects.filter(exam__course=course, status='T').exclude(success=True)] result = [i.student for i in ExamJ.objects.filter(exam__course=course, status='T').exclude(success=True)]
return result return result
def get_active_exam_students_length(course): def get_active_exam_students_length(course):
result = ExamJ.objects.filter(exam__course=course, status='T').count() result = ExamJ.objects.filter(exam__course=course, status='T').count()
return result return result
def exam_status_html(course, student): def exam_status_html(course, student):
status = course.get_exam_status(student) status = course.get_exam_status(student)
data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>' data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>'
if status == 'B': if status == 'B':
return data.format(u'primary', u'Пока недоступно') return data.format(u'primary', u'Пока недоступно')
elif status == 'P': elif status == 'P':
return data.format(u'warning', u'Достуно для выполнения') return data.format(u'warning', u'Достуно для выполнения')
elif status == 'T': elif status == 'T':
return data.format(u'info', u'Проверяется преподавателем') return data.format(u'info', u'Проверяется преподавателем')
elif status == 'E': elif status == 'E':
return data.format(u'danger', u'Требуется доработка') return data.format(u'danger', u'Требуется доработка')
elif status == 'F': elif status == 'F':
return data.format(u'success', u'Сдано') return data.format(u'success', u'Сдано')
def get_exam_status(course, student): def get_exam_status(course, student):
try: try:
exam = Exam.objects.get(course=course) exam = Exam.objects.get(course=course)
except Exam.DoesNotExist: except Exam.DoesNotExist:
return 'B' return 'B'
else: else:
return exam.get_status(student) return exam.get_status(student)
def check_course_finish(course, student): def check_course_finish(course, student):
if LessonJ.objects.filter(lesson__course=course, student=student, status='F').count() == Lesson.objects.filter( if LessonJ.objects.filter(lesson__course=course, student=student, status='F').count() == Lesson.objects.filter(
course=course).count() \ course=course).count() \
and HomeworkJ.objects.filter(homework__course=course, student=student, and HomeworkJ.objects.filter(homework__course=course, student=student,
status='F').count() == Homework.objects.filter(course=course).count() \ status='F').count() == Homework.objects.filter(course=course).count() \
and ExamJ.objects.filter(exam__course=course, student=student, status='F').count() == Exam.objects.filter( and ExamJ.objects.filter(exam__course=course, student=student, status='F').count() == Exam.objects.filter(
course=course).count(): course=course).count():
return True return True
else: else:
return False return False
### Методы над темой ### Методы над темой
def get_theme_no_saw_lessons_length(__theme): def get_theme_no_saw_lessons_length(__theme):
result = 0 result = 0
for n in __theme.get_lessons(): for n in __theme.get_lessons():
result += n.get_no_saw_lessons_length() result += n.get_no_saw_lessons_length()
return result return result
def get_theme_description(theme, student): def get_theme_description(theme, student):
result = '' result = ''
if theme.description: if theme.description:
result += '<p style="padding:10px;">%s</p>' % theme.description result += '<p style="padding:10px;">%s</p>' % theme.description
if theme.lessons_length() > 1: if theme.lessons_length() > 1:
result += u'<ul style="padding: 0 0 0 15px;">' result += u'<ul style="padding: 0 0 0 15px;">'
for i in Lesson.objects.filter(course=theme.course, theme=theme).order_by('sort'): for i in Lesson.objects.filter(course=theme.course, theme=theme).order_by('sort'):
result += i.get_description(student) result += i.get_description(student)
result += u'</ul>' result += u'</ul>'
return result return result
if not theme.description and theme.lessons_length() == 1: if not theme.description and theme.lessons_length() == 1:
return Lesson.objects.get(theme=theme).description return Lesson.objects.get(theme=theme).description
def get_active_homework_students(theme): def get_active_homework_students(theme):
result = [] result = []
if theme.homework_exist(): if theme.homework_exist():
for i in HomeworkJ.objects.filter(homework=theme.get_homework(), status='T'): for i in HomeworkJ.objects.filter(homework=theme.get_homework(), status='T'):
result.append(i.student) result.append(i.student)
return result return result
def get_active_homework_students_length(theme): def get_active_homework_students_length(theme):
if theme.homework_exist(): if theme.homework_exist():
return HomeworkJ.objects.filter(homework=self.get_homework(), status='T').count() return HomeworkJ.objects.filter(homework=self.get_homework(), status='T').count()
else: else:
return 0 return 0
def get_actual_theme_lesson_id(theme, student): def get_actual_theme_lesson_id(theme, student):
# Получение читаемого урока # Получение читаемого урока
if student: if student:
try: try:
if student.is_authenticated() and student.is_admin: if student.is_authenticated() and student.is_admin:
return Lesson.objects.get(theme=theme, sort='1').id return Lesson.objects.get(theme=theme, sort='1').id
except: except:
pass pass
status = theme.get_status(student) status = theme.get_status(student)
if status == 'R': if status == 'R':
if LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).exists(): if LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).exists():
return LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).first().lesson.id return LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).first().lesson.id
else: else:
if theme.homework_status(student) in ['R', 'E', 'T', 'A']: if theme.homework_status(student) in ['R', 'E', 'T', 'A']:
return Lesson.objects.filter(theme=theme).order_by('sort').last().id return Lesson.objects.filter(theme=theme).order_by('sort').last().id
else: else:
return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id
elif status == 'F': elif status == 'F':
return Lesson.objects.filter(theme=theme).order_by('sort').first().id return Lesson.objects.filter(theme=theme).order_by('sort').first().id
else: else:
if Lesson.objects.filter(theme=theme, free=True).exists(): if Lesson.objects.filter(theme=theme, free=True).exists():
return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id
else: else:
return False return False
def get_one_lesson_id(theme): def get_one_lesson_id(theme):
if theme.lessons_length() == 1: if theme.lessons_length() == 1:
return Lesson.objects.filter(course=theme.course, theme=theme).first().id return Lesson.objects.filter(course=theme.course, theme=theme).first().id
else: else:
return '0' return '0'
def homework_status_html(theme, student): def homework_status_html(theme, student):
status = theme.homework_status(student) status = theme.homework_status(student)
data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>' data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>'
if status == 'B': if status == 'B':
return data.format(u'primary', u'Пока недоступно') return data.format(u'primary', u'Пока недоступно')
elif status == 'A': elif status == 'A':
return data.format(u'warning', u'Достуно для выполнения') return data.format(u'warning', u'Достуно для выполнения')
elif status == 'T': elif status == 'T':
return data.format(u'info', u'Проверяется преподавателем') return data.format(u'info', u'Проверяется преподавателем')
elif status == 'E': elif status == 'E':
return data.format(u'danger', u'Требуется доработка') return data.format(u'danger', u'Требуется доработка')
elif status == 'F': elif status == 'F':
return data.format(u'success', u'Сдано') return data.format(u'success', u'Сдано')
def homework_status(theme, student): def homework_status(theme, student):
if Homework.objects.filter(theme=theme).exists(): if Homework.objects.filter(theme=theme).exists():
try: try:
homework = HomeworkJ.objects.get(student=student, homework=Homework.objects.get(theme=theme)) homework = HomeworkJ.objects.get(student=student, homework=Homework.objects.get(theme=theme))
except HomeworkJ.DoesNotExist: except HomeworkJ.DoesNotExist:
return 'B' return 'B'
else: else:
return homework.status return homework.status
else: else:
return 'B' return 'B'
def check_theme_finish(theme, student): def check_theme_finish(theme, student):
# Проверка, прошел ли пользователь тему по урокам # Проверка, прошел ли пользователь тему по урокам
if LessonJ.objects.filter(student=student, status='F', lesson__theme=theme).count() == theme.lessons_length(): if LessonJ.objects.filter(student=student, status='F', lesson__theme=theme).count() == theme.lessons_length():
return True return True
else: else:
return False return False
def check_study_access(theme, student): def check_study_access(theme, student):
if LessonJ.objects.filter(Q(student=student, status='R', lesson__theme=theme) | Q(student=student, status='F', if LessonJ.objects.filter(Q(student=student, status='R', lesson__theme=theme) | Q(student=student, status='F',
lesson__theme=theme)).exists(): lesson__theme=theme)).exists():
return True return True
else: else:
return False return False
def get_status(theme, student): def get_status(theme, student):
# 1) Читаемая тема # 1) Читаемая тема
# 2) ДЗ на прохождении # 2) ДЗ на прохождении
# 3) Укомплектовано # 3) Укомплектовано
if student: if student:
if LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme), if LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme),
status='R').exists(): status='R').exists():
return 'R' return 'R'
elif Lesson.objects.filter(free=True, theme=theme).exists() \ elif Lesson.objects.filter(free=True, theme=theme).exists() \
and not LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme, and not LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme,
free=True)): free=True)):
return 'R' return 'R'
elif theme.homework_status(student) != 'B': elif theme.homework_status(student) != 'B':
h_status = theme.homework_status(student) h_status = theme.homework_status(student)
if h_status == 'F': if h_status == 'F':
return 'F' return 'F'
else: else:
return 'R' return 'R'
elif LessonJ.objects.filter(student=student, lesson__theme=theme, elif LessonJ.objects.filter(student=student, lesson__theme=theme,
status='F').count() == Lesson.objects.filter(theme=theme).count(): status='F').count() == Lesson.objects.filter(theme=theme).count():
return 'F' return 'F'
else: else:
return 'N' return 'N'
else: else:
if theme.sort == 1 and Lesson.objects.filter(free=True, theme=theme).exists(): if theme.sort == 1 and Lesson.objects.filter(free=True, theme=theme).exists():
return 'R' return 'R'
else: else:
return 'N' return 'N'
def get_theme_color(theme, student): def get_theme_color(theme, student):
# Получить тип # Получить тип
# Если тип премиум или пополнение # Если тип премиум или пополнение
status = theme.get_status(student) status = theme.get_status(student)
if status == 'F': if status == 'F':
return 'b-success' return 'b-success'
elif status == 'N': elif status == 'N':
return 'b-default' return 'b-default'
else: else:
return 'b-info' return 'b-info'
def get_theme_skills(__theme): def get_theme_skills(__theme):
result = [] result = []
for i in SkillJ.objects.filter(lesson__in=__theme.get_lessons()): for i in SkillJ.objects.filter(lesson__in=__theme.get_lessons()):
if i.skill not in result: if i.skill not in result:
result.append(i.skill) result.append(i.skill)
return result return result
def have_skills(self): def have_skills(self):
return SkillJ.objects.filter(lesson__in=self.get_lessons()).exists() return SkillJ.objects.filter(lesson__in=self.get_lessons()).exists()
### Методы над уроком ### Методы над уроком
def get_lesson_description(lesson, student): def get_lesson_description(lesson, student):
# 1 - id # 1 - id
# 2 - course_id # 2 - course_id
# 3 - title # 3 - title
# 4 - status # 4 - status
# 5 - free # 5 - free
button = u'<li style="margin-bottom:5px;">' \ button = u'<li style="margin-bottom:5px;">' \
u'<a href="/courses/lesson/{0}" by_type="lesson" self_id="{0}" course_id="{1}" ' \ u'<a href="/courses/lesson/{0}" by_type="lesson" self_id="{0}" course_id="{1}" ' \
u'style="color:#333; border-bottom:1px dotted #333; color: #333;">{2}</a> ' \ u'style="color:#333; border-bottom:1px dotted #333; color: #333;">{2}</a> ' \
u'{3} ' \ u'{3} ' \
u'<span class="label label-success" style="margin-left: 10px;">{4}</span>' \ u'<span class="label label-success" style="margin-left: 10px;">{4}</span>' \
u'</li>' u'</li>'
# 0 - title # 0 - title
# 1 - status # 1 - status
# 2 - free # 2 - free
button2 = u'<li style="margin-bottom:5px;">' \ button2 = u'<li style="margin-bottom:5px;">' \
u'{0} ' \ u'{0} ' \
u'{1} ' \ u'{1} ' \
u'<span class="label label-success" style="margin-left: 10px;">{2}</span>' \ u'<span class="label label-success" style="margin-left: 10px;">{2}</span>' \
u'</li>' u'</li>'
if student and student.is_authenticated() and student.is_admin: if student and student.is_authenticated() and student.is_admin:
return button.format(lesson.id, lesson.course.id, return button.format(lesson.id, lesson.course.id,
u'<b>ID: %s</b> %s' % (lesson.id, lesson.title) if student.is_admin else lesson.title, u'<b>ID: %s</b> %s' % (lesson.id, lesson.title) if student.is_admin else lesson.title,
'<i class="glyphicon glyphicon-time"></i>', '') '<i class="glyphicon glyphicon-time"></i>', '')
elif lesson.get_status(student) != 'N': elif lesson.get_status(student) != 'N':
return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), '') return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), '')
else: else:
if lesson.sort == 1 and lesson.free: if lesson.sort == 1 and lesson.free:
return button.format(lesson.id, lesson.course.id, lesson.title, '<i class="glyphicon glyphicon-time"></i>', return button.format(lesson.id, lesson.course.id, lesson.title, '<i class="glyphicon glyphicon-time"></i>',
'') '')
else: else:
return button2.format(lesson.title, lesson.get_status_html(student), '') return button2.format(lesson.title, lesson.get_status_html(student), '')
# if lesson.get_status(student) != 'N': # if lesson.get_status(student) != 'N':
# return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), # return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student),
# u'Бесплатный урок' if lesson.free else '') # u'Бесплатный урок' if lesson.free else '')
# else: # else:
# if lesson.sort == 1 and lesson.free: # if lesson.sort == 1 and lesson.free:
# return button.format(lesson.id, lesson.course.id, lesson.title, # return button.format(lesson.id, lesson.course.id, lesson.title,
# '<i class="glyphicon glyphicon-time"></i>', # '<i class="glyphicon glyphicon-time"></i>',
# u'Бесплатный урок' if lesson.free else '') # u'Бесплатный урок' if lesson.free else '')
# else: # else:
# return button2.format(lesson.title, lesson.get_status_html(student), # return button2.format(lesson.title, lesson.get_status_html(student),
# u'Бесплатный урок' if lesson.free else '') # u'Бесплатный урок' if lesson.free else '')
def get_no_saw_lessons_length(lesson): def get_no_saw_lessons_length(lesson):
return lesson.comments.filter(saw=False).count() return lesson.comments.filter(saw=False).count()
def get_status_html(lesson, student): def get_status_html(lesson, student):
status = lesson.get_status(student) status = lesson.get_status(student)
if status == 'N': if status == 'N':
return u'<i class="glyphicon glyphicon-remove"></i>' return u'<i class="glyphicon glyphicon-remove"></i>'
elif status == 'F': elif status == 'F':
return u'<i class="glyphicon glyphicon-ok"></i>' return u'<i class="glyphicon glyphicon-ok"></i>'
elif status == 'R': elif status == 'R':
return u'<i class="glyphicon glyphicon-time"></i>' return u'<i class="glyphicon glyphicon-time"></i>'
def get_lesson_skills(lesson): def get_lesson_skills(lesson):
return SkillJ.objects.filter(lesson=lesson) return SkillJ.objects.filter(lesson=lesson)
def get_comments_length(lesson): def get_comments_length(lesson):
return lesson.comments.filter(public=True).count() return lesson.comments.filter(public=True).count()
def get_lesson_status(lesson, student): def get_lesson_status(lesson, student):
try: try:
return LessonJ.objects.get(student=student, lesson=lesson).status return LessonJ.objects.get(student=student, lesson=lesson).status
except LessonJ.DoesNotExist: except LessonJ.DoesNotExist:
return 'N' return 'N'
def get_status_name(lesson, student): def get_status_name(lesson, student):
try: try:
return LessonJ.objects.get(student=student, lesson=lesson).get_status_display() return LessonJ.objects.get(student=student, lesson=lesson).get_status_display()
except LessonJ.DoesNotExist: except LessonJ.DoesNotExist:
return u'Не доступно' return u'Не доступно'
### Методы над ДЗ ### Методы над ДЗ
def get_homework_status(__homework, student): def get_homework_status(__homework, student):
try: try:
homework = HomeworkJ.objects.get(student=student, homework=__homework) homework = HomeworkJ.objects.get(student=student, homework=__homework)
except HomeworkJ.DoesNotExist: except HomeworkJ.DoesNotExist:
return 'B' return 'B'
else: else:
return homework.status return homework.status
### Методы экзамена ### Методы экзамена
def get_exam_color(exam, student): def get_exam_color(exam, student):
# Получить тип # Получить тип
# Если тип премиум или пополнение # Если тип премиум или пополнение
status = exam.get_status(student) status = exam.get_status(student)
if status == 'P': if status == 'P':
return 'b-info' return 'b-info'
elif status == 'T': elif status == 'T':
return 'b-primary' return 'b-primary'
elif status == 'F': elif status == 'F':
return 'b-success' return 'b-success'
elif status == 'E': elif status == 'E':
return 'b-danger' return 'b-danger'
else: else:
return 'b-default' return 'b-default'

@ -1,45 +1,45 @@
from courses import views, api from courses import views, api
from django.conf.urls import url from django.conf.urls import url
urlpatterns = [ urlpatterns = [
url(r'^([0-9]{1,99})$', views.course), url(r'^([0-9]{1,99})$', views.course),
url(r'^([0-9]{1,99})#\s+$', views.course), url(r'^([0-9]{1,99})#\s+$', views.course),
url(r'lesson/([0-9]{1,99})$', views.lesson), url(r'lesson/([0-9]{1,99})$', views.lesson),
url(r'homework/([0-9]{1,99})$', views.homework), url(r'homework/([0-9]{1,99})$', views.homework),
url(r'exam/([0-9]{1,99})$', views.exam), url(r'exam/([0-9]{1,99})$', views.exam),
url(r'read_lesson/$', api.read_lesson), url(r'read_lesson/$', api.read_lesson),
url(r'load_lesson_comments$', api.load_lesson_comments), url(r'load_lesson_comments$', api.load_lesson_comments),
url(r'load_homework_comments_for_teacher$', api.load_homework_comments_for_teacher), url(r'load_homework_comments_for_teacher$', api.load_homework_comments_for_teacher),
url(r'load_exam_comments_for_teacher$', api.load_exam_comments_for_teacher), url(r'load_exam_comments_for_teacher$', api.load_exam_comments_for_teacher),
url(r'load_homework_comments$', api.load_homework_comments), url(r'load_homework_comments$', api.load_homework_comments),
url(r'load_exam_comments$', api.load_exam_comments), url(r'load_exam_comments$', api.load_exam_comments),
url(r'get_achievement$', api.get_achievement), url(r'get_achievement$', api.get_achievement),
url(r'close_achievement$', api.close_achievement), url(r'close_achievement$', api.close_achievement),
url(r'delete_comment$', api.delete_comment), url(r'delete_comment$', api.delete_comment),
url(r'sent_lesson_comment$', api.sent_lesson_comment), url(r'sent_lesson_comment$', api.sent_lesson_comment),
url(r'get_homework_comments_length_for_teacher$', api.get_homework_comments_length_for_teacher), url(r'get_homework_comments_length_for_teacher$', api.get_homework_comments_length_for_teacher),
url(r'get_exam_comments_length_for_teacher$', api.get_exam_comments_length_for_teacher), url(r'get_exam_comments_length_for_teacher$', api.get_exam_comments_length_for_teacher),
url(r'get_homework_comments_length$', api.get_homework_comments_length), url(r'get_homework_comments_length$', api.get_homework_comments_length),
url(r'get_exam_comments_length$', api.get_exam_comments_length), url(r'get_exam_comments_length$', api.get_exam_comments_length),
url(r'sent_homework_comment$', api.sent_homework_comment), url(r'sent_homework_comment$', api.sent_homework_comment),
url(r'sent_exam_comment$', api.sent_exam_comment), url(r'sent_exam_comment$', api.sent_exam_comment),
url(r'get_lesson_comments_length$', api.get_lesson_comments_length), url(r'get_lesson_comments_length$', api.get_lesson_comments_length),
url(r'get_lesson_context/$', api.get_lesson_context), url(r'get_lesson_context/$', api.get_lesson_context),
url(r'send_accept_teach_comment$', api.send_accept_teach_comment), url(r'send_accept_teach_comment$', api.send_accept_teach_comment),
url(r'send_cancel_teach_comment', api.send_cancel_teach_comment), url(r'send_cancel_teach_comment', api.send_cancel_teach_comment),
url(r'send_exam_accept_teach_comment$', api.send_exam_accept_teach_comment), url(r'send_exam_accept_teach_comment$', api.send_exam_accept_teach_comment),
url(r'send_exam_cancel_teach_comment', api.send_exam_cancel_teach_comment), url(r'send_exam_cancel_teach_comment', api.send_exam_cancel_teach_comment),
url(r'get_next_button/$', api.get_next_button_ajax), url(r'get_next_button/$', api.get_next_button_ajax),
url(r'by_course_data/$', api.by_course_data), url(r'by_course_data/$', api.by_course_data),
url(r'get_homework_context/$', api.get_homework_context), url(r'get_homework_context/$', api.get_homework_context),
url(r'load_comment/$', api.load_comment), url(r'load_comment/$', api.load_comment),
url(r'sent_homework_up_teacher$', api.sent_homework_up_teacher), url(r'sent_homework_up_teacher$', api.sent_homework_up_teacher),
url(r'sent_homework_down_teacher$', api.sent_homework_down_teacher), url(r'sent_homework_down_teacher$', api.sent_homework_down_teacher),
url(r'sent_exam_up_teacher$', api.sent_exam_up_teacher), url(r'sent_exam_up_teacher$', api.sent_exam_up_teacher),
url(r'sent_exam_down_teacher$', api.sent_exam_down_teacher), url(r'sent_exam_down_teacher$', api.sent_exam_down_teacher),
url(r'get_process_vector$', api.get_process_vector), url(r'get_process_vector$', api.get_process_vector),
url(r'get_comment_text/$', api.get_comment_text), url(r'get_comment_text/$', api.get_comment_text),
url(r'sent_comment_response/$', api.sent_comment_response), url(r'sent_comment_response/$', api.sent_comment_response),
url(r'achievements/$', views.achievements), url(r'achievements/$', views.achievements),
url(r'^(?P<slug>.*)$', views.course), url(r'^(?P<slug>.*)$', views.course),
] ]

@ -1,254 +1,250 @@
# coding=utf-8 # coding=utf-8
import datetime import datetime
from django.http import Http404 from django.http import Http404
from finance.models import Bill from finance.models import Bill
from lms.decors import response_decor from lms.decors import response_decor
from lms.tools import user_fabric from lms.tools import user_fabric
from courses.models import Course, Lesson, Homework, Exam, MaterialDirection, Achievements, Skills, SkillJ, CourseMap from courses.models import Course, Lesson, Homework, Exam, MaterialDirection, Achievements, Skills, SkillJ, CourseMap
from journals.models import LessonJ, TeacherJ, HomeworkJ, check_journal, ExamJ, AchievementJ from journals.models import LessonJ, TeacherJ, HomeworkJ, check_journal, ExamJ, AchievementJ
from finance.tools import system_check_bill from finance.tools import system_check_bill
@response_decor(template='course.html', without_auth=True) @response_decor(template='course.html', without_auth=True)
def course(request, slug): def course(request, slug):
# Страница курса # Страница курса
user = user_fabric(request.user) user = user_fabric(request.user)
if not slug: return {'redirect': '/'} if not slug: return {'redirect': '/'}
try: try:
course = Course.objects.get(slug=slug) course = Course.objects.get(slug=slug)
except Course.DoesNotExist: except Course.DoesNotExist:
try: try:
course = Course.objects.get(id=slug) course = Course.objects.get(id=slug)
except ValueError: except ValueError:
raise Http404 raise Http404
except Course.DoesNotExist: except Course.DoesNotExist:
raise Http404 raise Http404
else: else:
return {'redirect': course.get_absolute_url()} return {'redirect': course.get_absolute_url()}
except Course.DoesNotExist: except Course.DoesNotExist:
raise Http404 raise Http404
if not course.public and not (request.user.is_authenticated() and request.user.is_admin): if not course.public and not (request.user.is_authenticated() and request.user.is_admin):
raise Http404 raise Http404
if course.hidden: if course.hidden:
if not request.user.is_authenticated(): if not request.user.is_authenticated():
raise Http404 raise Http404
else: else:
if not request.user.is_admin: if not request.user.is_admin:
try: try:
Bill.objects.get(service__course=course, user=request.user, status='F') Bill.objects.get(service__course=course, user=request.user, status='F')
except Bill.DoesNotExist: except Bill.DoesNotExist:
raise Http404 raise Http404
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
if created: if created:
check_journal(journal) check_journal(journal)
_map = CourseMap.objects.filter(course=course).order_by('sort').first() _map = CourseMap.objects.filter(course=course).order_by('sort').first()
_j = _map.get_obj() _j = _map.get_obj()
j = HomeworkJ.objects.get(material=_j, student=request.user) j = HomeworkJ.objects.get(material=_j, student=request.user)
j.open_material() j.open_material()
else: else:
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
if user and not journal.start_date: if user and not journal.start_date:
journal.start_date = datetime.datetime.now() journal.start_date = datetime.datetime.now()
journal.save() journal.save()
waiting_materials = [] waiting_materials = []
if journal.waiting.exists(): if journal.waiting.exists():
for n in journal.waiting.all(): for n in journal.waiting.all():
_obj = n.get_obj() _obj = n.get_obj()
__type = n.get_type() __type = n.get_type()
_type = None _type = None
if __type == 'L': if __type == 'L':
_type = 'lesson' _type = 'lesson'
elif __type == 'H': elif __type == 'H':
_type = 'homework' _type = 'homework'
elif __type == 'E': elif __type == 'E':
_type = 'exam' _type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type}) waiting_materials.append({'obj': _obj, 'type': _type})
return { return {'course': journal.get_face(user_fabric(request.user)), 'user': user_fabric(request.user), 'waiting_materials': waiting_materials}
'course': journal.get_face(user_fabric(request.user)),
'user': user_fabric(request.user),
'waiting_materials': waiting_materials @response_decor(template='lesson.html')
} def lesson(request, lesson):
# Открытие окна урока
# TODO: Проверить все ссылки на ID Lesson
@response_decor(template='lesson.html') try:
def lesson(request, lesson): lesson = Lesson.objects.get(id=lesson)
# Открытие окна урока lj = LessonJ.objects.get(material=lesson, student=request.user)
# TODO: Проверить все ссылки на ID Lesson except Lesson.DoesNotExist:
try: raise Http404
lesson = Lesson.objects.get(id=lesson) except LessonJ.DoesNotExist:
lj = LessonJ.objects.get(material=lesson, student=request.user) j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course)
except Lesson.DoesNotExist: check_journal(j)
raise Http404 lj = LessonJ.objects.get(material=lesson, student=request.user)
except LessonJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course) waiting_materials = []
check_journal(j) if lj.parent.parent.waiting.exists():
lj = LessonJ.objects.get(material=lesson, student=request.user) for n in lj.parent.parent.waiting.all():
_obj = n.get_obj()
waiting_materials = [] __type = n.get_type()
if lj.parent.parent.waiting.exists(): _type = None
for n in lj.parent.parent.waiting.all(): if __type == 'L':
_obj = n.get_obj() _type = 'lesson'
__type = n.get_type() elif __type == 'H':
_type = None _type = 'homework'
if __type == 'L': elif __type == 'E':
_type = 'lesson' _type = 'exam'
elif __type == 'H':
_type = 'homework' waiting_materials.append({'obj': _obj, 'type': _type})
elif __type == 'E':
_type = 'exam' if request.user.is_authenticated() and request.user.is_admin or request.user in lesson.course.teachers.all():
return {'lesson': lj.get_face(user_fabric(request.user)),
waiting_materials.append({'obj': _obj, 'type': _type}) 'course': {'head': lj.parent.parent.get_head_face(),
'level': lj.parent.parent.course.get_level(),
if request.user.is_authenticated() and request.user.is_admin or request.user in lesson.course.teachers.all(): 'journal': lj.parent.parent.get_face(user_fabric(request.user))},
return {'lesson': lj.get_face(user_fabric(request.user)), 'bought': True, 'accept': True, 'waiting_materials': waiting_materials}
'course': {'head': lj.parent.parent.get_head_face(),
'level': lj.parent.parent.course.get_level(), if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type):
'journal': lj.parent.parent.get_face(user_fabric(request.user))}, return {'redirect': '/access/by_error/'}
'bought': True, 'accept': True, 'waiting_materials': waiting_materials} else:
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists():
if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type): return {'redirect': '/access/auth_error/'}
return {'redirect': '/access/by_error/'} else:
else: result = False
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists(): if lj.get_status_flag() != 'N':
return {'redirect': '/access/auth_error/'} result = True
else: elif lj.parent.parent.waiting.filter(token=lj.material.token).exists():
result = False result = True
if lj.get_status_flag() != 'N': lj.date = datetime.datetime.now()
result = True lj.save()
elif lj.parent.parent.waiting.filter(token=lj.material.token).exists(): if result:
result = True return {'lesson': lj.get_face(user_fabric(request.user)), 'course': {'head': lj.parent.parent.get_head_face(), 'level': lj.parent.parent.course.get_level(), 'journal': lj.parent.parent.get_face(user_fabric(request.user))}, 'bought': True, 'accept': True, 'waiting_materials': waiting_materials}
lj.date = datetime.datetime.now()
lj.save()
if result: @response_decor(template='homework.html')
return {'lesson': lj.get_face(user_fabric(request.user)), 'course': {'head': lj.parent.parent.get_head_face(), 'level': lj.parent.parent.course.get_level(), 'journal': lj.parent.parent.get_face(user_fabric(request.user))}, 'bought': True, 'accept': True, 'waiting_materials': waiting_materials} def homework(request, homework):
# Страница ДЗ
# TODO: Проверить везде ссылки с ID ДЗ
@response_decor(template='homework.html') try:
def homework(request, homework): hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
# Страница ДЗ except Homework.DoesNotExist:
# TODO: Проверить везде ссылки с ID ДЗ raise Http404
try: except HomeworkJ.DoesNotExist:
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user) j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course)
except Homework.DoesNotExist: check_journal(j)
raise Http404 hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
except HomeworkJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course) waiting_materials = []
check_journal(j) if hj.parent.parent.waiting.exists():
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user) for n in hj.parent.parent.waiting.all():
_obj = n.get_obj()
waiting_materials = [] __type = n.get_type()
if hj.parent.parent.waiting.exists(): _type = None
for n in hj.parent.parent.waiting.all(): if __type == 'L':
_obj = n.get_obj() _type = 'lesson'
__type = n.get_type() elif __type == 'H':
_type = None _type = 'homework'
if __type == 'L': elif __type == 'E':
_type = 'lesson' _type = 'exam'
elif __type == 'H':
_type = 'homework' waiting_materials.append({'obj': _obj, 'type': _type})
elif __type == 'E':
_type = 'exam' if request.user.is_authenticated() and request.user.is_admin:
return {'homework': hj.get_face(user_fabric(request.user)),
waiting_materials.append({'obj': _obj, 'type': _type}) 'course': {'head': hj.parent.parent.get_head_face(),
'level': hj.parent.parent.course.get_level(),
if request.user.is_authenticated() and request.user.is_admin: 'journal': hj.parent.parent.get_face(user_fabric(request.user))},
return {'homework': hj.get_face(user_fabric(request.user)), 'waiting_materials': waiting_materials}
'course': {'head': hj.parent.parent.get_head_face(),
'level': hj.parent.parent.course.get_level(), if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type):
'journal': hj.parent.parent.get_face(user_fabric(request.user))}, return {'redirect': '/access/by_error/'}
'waiting_materials': waiting_materials} else:
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists():
if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type): return {'redirect': '/access/auth_error/'}
return {'redirect': '/access/by_error/'} else:
else: result = False
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists(): if hj.get_status_flag() != 'N':
return {'redirect': '/access/auth_error/'} result = True
else: elif hj.parent.parent.waiting.filter(token=hj.material.token).exists():
result = False hj.date = datetime.datetime.now()
if hj.get_status_flag() != 'N': hj.save()
result = True result = True
elif hj.parent.parent.waiting.filter(token=hj.material.token).exists():
hj.date = datetime.datetime.now() if result:
hj.save() return {'homework': hj.get_face(user_fabric(request.user)),
result = True 'course': {'head': hj.parent.parent.get_head_face(),
'level': hj.parent.parent.course.get_level(), 'journal': hj.parent.parent.get_face(user_fabric(request.user))},
if result: 'waiting_materials': waiting_materials}
return {'homework': hj.get_face(user_fabric(request.user)),
'course': {'head': hj.parent.parent.get_head_face(),
'level': hj.parent.parent.course.get_level(), 'journal': hj.parent.parent.get_face(user_fabric(request.user))}, @response_decor(template='exam.html')
'waiting_materials': waiting_materials} def exam(request, exam):
# Страница экзамена
# TODO: проверить, чтобы это было ID экзамена
@response_decor(template='exam.html') try:
def exam(request, exam): exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
# Страница экзамена except Exam.DoesNotExist:
# TODO: проверить, чтобы это было ID экзамена raise Http404
try: except ExamJ.DoesNotExist:
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user) j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course)
except Exam.DoesNotExist: check_journal(j)
raise Http404 exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
except ExamJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course) waiting_materials = []
check_journal(j) if exam.parent.parent.waiting.all().exists():
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user) for n in exam.parent.parent.waiting.all():
_obj = n.get_obj()
waiting_materials = [] __type = n.get_type()
if exam.parent.parent.waiting.all().exists(): _type = None
for n in exam.parent.parent.waiting.all(): if __type == 'L':
_obj = n.get_obj() _type = 'lesson'
__type = n.get_type() elif __type == 'H':
_type = None _type = 'homework'
if __type == 'L': elif __type == 'E':
_type = 'lesson' _type = 'exam'
elif __type == 'H':
_type = 'homework' waiting_materials.append({'obj': _obj, 'type': _type})
elif __type == 'E':
_type = 'exam' if request.user.is_authenticated() and request.user.is_admin:
return {'exam': exam.get_face(user_fabric(request.user)),
waiting_materials.append({'obj': _obj, 'type': _type}) 'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()},
'waiting_materials': waiting_materials}
if request.user.is_authenticated() and request.user.is_admin:
return {'exam': exam.get_face(user_fabric(request.user)), if not system_check_bill(exam.material.token, request.user):
'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, return {'redirect': '/access/by_error/'}
'waiting_materials': waiting_materials} else:
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists():
if not system_check_bill(exam.material.token, request.user): return {'redirect': '/access/auth_error/'}
return {'redirect': '/access/by_error/'} else:
else: result = False
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists(): if exam.get_status_flag() != 'N':
return {'redirect': '/access/auth_error/'} result = True
else: elif exam.parent.parent.waiting.filter(token=exam.material.token).exists():
result = False result = True
if exam.get_status_flag() != 'N': exam.date = datetime.datetime.now()
result = True exam.save()
elif exam.parent.parent.waiting.filter(token=exam.material.token).exists():
result = True if result:
exam.date = datetime.datetime.now() return {'exam': exam.get_face(user_fabric(request.user)), 'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, 'waiting_materials': waiting_materials}
exam.save()
if result: @response_decor(template='all_achievements.html', without_auth=True)
return {'exam': exam.get_face(user_fabric(request.user)), 'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, 'waiting_materials': waiting_materials} def achievements(request):
# Список ачивок и статус получения
skills = {}
@response_decor(template='all_achievements.html', without_auth=True) for course in Course.objects.all().order_by('sort'):
def achievements(request): skills[(course.id, course.title)] = {}
# Список ачивок и статус получения for skillj in SkillJ.objects.filter(lesson__course=course):
skills = {} if not skills[(course.id, course.title)].get(skillj.skill.title):
for course in Course.objects.all().order_by('sort'): skills[(course.id, course.title)][skillj.skill.title] = {
skills[(course.id, course.title)] = {} 'size': 0,
for skillj in SkillJ.objects.filter(lesson__course=course): 'icon': skillj.skill.mini_icon,
if not skills[(course.id, course.title)].get(skillj.skill.title): 'color': skillj.skill.color
skills[(course.id, course.title)][skillj.skill.title] = { }
'size': 0, skills[(course.id, course.title)][skillj.skill.title]['size'] += skillj.size
'icon': skillj.skill.mini_icon,
'color': skillj.skill.color return {'achievements': Achievements.objects.all(), 'skills': skills}
}
skills[(course.id, course.title)][skillj.skill.title]['size'] += skillj.size
return {'achievements': Achievements.objects.all(), 'skills': skills}

File diff suppressed because one or more lines are too long

@ -1,125 +1,125 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46 # Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import django.utils.timezone import django.utils.timezone
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0001_initial'), ('courses', '0001_initial'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Bill', name='Bill',
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')),
('status', models.CharField(choices=[(b'W', '\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f'), (b'P', '\u041d\u0430 \u043e\u043f\u043b\u0430\u0442\u0435'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'W', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), ('status', models.CharField(choices=[(b'W', '\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f'), (b'P', '\u041d\u0430 \u043e\u043f\u043b\u0430\u0442\u0435'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'W', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')),
('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), ('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')),
('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')), ('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')),
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0430')), ('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0430')),
('status_changed', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u0430')), ('status_changed', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u0430')),
('comment', models.TextField(blank=True, help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430')), ('comment', models.TextField(blank=True, help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430')),
('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f')), ('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f')),
('salt', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0421\u043e\u043b\u044c')), ('salt', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0421\u043e\u043b\u044c')),
('manager', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_manager', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')), ('manager', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_manager', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')),
], ],
options={ options={
'verbose_name': '\u0421\u0447\u0435\u0442', 'verbose_name': '\u0421\u0447\u0435\u0442',
'verbose_name_plural': '\u0421\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0421\u0447\u0435\u0442\u0430',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Price', name='Price',
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')),
('m_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')), ('m_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')),
('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')), ('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')),
('title', models.CharField(default=b'', help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430')), ('title', models.CharField(default=b'', help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430')),
('cost', models.IntegerField(verbose_name='\u0426\u0435\u043d\u0430')), ('cost', models.IntegerField(verbose_name='\u0426\u0435\u043d\u0430')),
('description', models.TextField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), ('description', models.TextField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
], ],
options={ options={
'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430',
'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='SelfBillHistory', name='SelfBillHistory',
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')),
('status', models.CharField(choices=[(b'O', '\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043f\u043b\u0430\u0442\u044b'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'O', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), ('status', models.CharField(choices=[(b'O', '\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043f\u043b\u0430\u0442\u044b'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'O', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')),
('fio', models.CharField(max_length=255, verbose_name='\u0424\u0418\u041e')), ('fio', models.CharField(max_length=255, verbose_name='\u0424\u0418\u041e')),
('phone', models.CharField(blank=True, max_length=255, verbose_name='\u0422\u0435\u043b\u0435\u0444\u043e\u043d')), ('phone', models.CharField(blank=True, max_length=255, verbose_name='\u0422\u0435\u043b\u0435\u0444\u043e\u043d')),
('email', models.CharField(blank=True, max_length=255, verbose_name='Email')), ('email', models.CharField(blank=True, max_length=255, verbose_name='Email')),
('s_date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f')), ('s_date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f')),
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u043f\u043b\u0430\u0442\u044b')), ('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u043f\u043b\u0430\u0442\u044b')),
('salt', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0421\u043e\u043b\u044c')), ('salt', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0421\u043e\u043b\u044c')),
('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')), ('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')),
('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), ('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')),
('sent', models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')), ('sent', models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')),
], ],
options={ options={
'verbose_name': '\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name': '\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430',
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432', 'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='SelfBillRequest', name='SelfBillRequest',
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')),
('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438')), ('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438')),
('sum', models.IntegerField(verbose_name='\u0421\u0443\u043c\u043c\u0430')), ('sum', models.IntegerField(verbose_name='\u0421\u0443\u043c\u043c\u0430')),
('key', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u041a\u043b\u044e\u0447')), ('key', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u041a\u043b\u044e\u0447')),
('url', models.URLField(blank=True, verbose_name='URL')), ('url', models.URLField(blank=True, verbose_name='URL')),
], ],
options={ options={
'verbose_name': '\u0428\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name': '\u0428\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430',
'verbose_name_plural': '\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430',
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='ServiceRequest', name='ServiceRequest',
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')),
('status', models.CharField(choices=[(b'S', '\u041d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d'), (b'W', '\u0412 \u0440\u0430\u0431\u043e\u0442\u0435'), (b'F', '\u041f\u0440\u043e\u0434\u0430\u043d'), (b'B', '\u041d\u0435 \u043f\u0440\u043e\u0434\u0430\u043b')], default=b'S', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), ('status', models.CharField(choices=[(b'S', '\u041d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d'), (b'W', '\u0412 \u0440\u0430\u0431\u043e\u0442\u0435'), (b'F', '\u041f\u0440\u043e\u0434\u0430\u043d'), (b'B', '\u041d\u0435 \u043f\u0440\u043e\u0434\u0430\u043b')], default=b'S', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')),
('cancel_description', models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430')), ('cancel_description', models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430')),
('charge', models.TextField(blank=True, default=b'', verbose_name='\u041f\u043e\u0440\u0443\u0447\u0435\u043d\u0438\u0435')), ('charge', models.TextField(blank=True, default=b'', verbose_name='\u041f\u043e\u0440\u0443\u0447\u0435\u043d\u0438\u0435')),
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0430\u0437\u0430')), ('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0430\u0437\u0430')),
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0431\u0430\u0431\u043e\u0442\u043a\u0438')), ('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0431\u0430\u0431\u043e\u0442\u043a\u0438')),
('send', models.BooleanField(default=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')), ('send', models.BooleanField(default=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), ('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='manager_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')), ('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='manager_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')),
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_user', to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')), ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_user', to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')),
], ],
options={ options={
'verbose_name': '\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443', 'verbose_name': '\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443',
'verbose_name_plural': '\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u043a\u0443\u043f\u043a\u0438', 'verbose_name_plural': '\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u043a\u0443\u043f\u043a\u0438',
}, },
), ),
migrations.AddField( migrations.AddField(
model_name='selfbillhistory', model_name='selfbillhistory',
name='request', name='request',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillRequest', verbose_name='\u0424\u043e\u0440\u043c\u0430 \u0441\u0447\u0435\u0442\u0430'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillRequest', verbose_name='\u0424\u043e\u0440\u043c\u0430 \u0441\u0447\u0435\u0442\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='service', name='service',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u041e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0443\u0441\u043b\u0443\u0433\u0430'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u041e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0443\u0441\u043b\u0443\u0433\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='user', name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043b\u0430\u0442\u0435\u043b\u044c\u0449\u0438\u043a'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043b\u0430\u0442\u0435\u043b\u044c\u0449\u0438\u043a'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-07 17:41 # Generated by Django 1.9.2 on 2016-04-07 17:41
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0001_initial'), ('finance', '0001_initial'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='description', name='description',
field=models.TextField(blank=True, default=b'', help_text='\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438', verbose_name='\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430'), field=models.TextField(blank=True, default=b'', help_text='\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438', verbose_name='\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 16:52 # Generated by Django 1.9.5 on 2016-04-14 16:52
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0002_bill_description'), ('finance', '0002_bill_description'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='selfbillrequest', model_name='selfbillrequest',
name='company', name='company',
field=models.CharField(choices=[(b'lms', b'http://lms.ru/'), (b'skillbox', b'http://skill-box.ru/')], default=b'lms', max_length=255, verbose_name='\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f'), field=models.CharField(choices=[(b'lms', b'http://lms.ru/'), (b'skillbox', b'http://skill-box.ru/')], default=b'lms', max_length=255, verbose_name='\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f'),
), ),
] ]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 17:00 # Generated by Django 1.9.5 on 2016-04-14 17:00
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0003_selfbillrequest_company'), ('finance', '0003_selfbillrequest_company'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='selfbillhistory', model_name='selfbillhistory',
name='day_sent', name='day_sent',
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'),
), ),
migrations.AddField( migrations.AddField(
model_name='selfbillhistory', model_name='selfbillhistory',
name='month_sent', name='month_sent',
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043c\u0435\u0441\u044f\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043c\u0435\u0441\u044f\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'),
), ),
migrations.AddField( migrations.AddField(
model_name='selfbillhistory', model_name='selfbillhistory',
name='week_sent', name='week_sent',
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'),
), ),
] ]

@ -1,28 +1,28 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:27 # Generated by Django 1.9.5 on 2016-04-14 19:27
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0004_auto_20160414_1700'), ('finance', '0004_auto_20160414_1700'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='SelfBillDesign', name='SelfBillDesign',
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')),
('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')), ('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')),
('logo', models.ImageField(upload_to=b'self', verbose_name='\u041b\u043e\u0433\u043e\u0442\u0438\u043f')), ('logo', models.ImageField(upload_to=b'self', verbose_name='\u041b\u043e\u0433\u043e\u0442\u0438\u043f')),
('background', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')), ('background', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')),
], ],
options={ options={
'verbose_name': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430',
'verbose_name_plural': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430',
}, },
), ),
] ]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:30 # Generated by Django 1.9.5 on 2016-04-14 19:30
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0005_selfbilldesign'), ('finance', '0005_selfbilldesign'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='selfbillrequest', model_name='selfbillrequest',
name='company', name='company',
), ),
migrations.AddField( migrations.AddField(
model_name='selfbillrequest', model_name='selfbillrequest',
name='design', name='design',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435'), field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435'),
), ),
] ]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:41 # Generated by Django 1.9.5 on 2016-04-14 19:41
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0006_auto_20160414_1930'), ('finance', '0006_auto_20160414_1930'),
] ]
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='selfbilldesign', name='selfbilldesign',
options={'verbose_name': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430'}, options={'verbose_name': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430'},
), ),
migrations.AlterField( migrations.AlterField(
model_name='selfbillrequest', model_name='selfbillrequest',
name='design', name='design',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440'), field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440'),
), ),
] ]

@ -1,22 +1,22 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:44 # Generated by Django 1.9.5 on 2016-04-14 19:44
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('finance', '0007_auto_20160414_1941'), ('finance', '0007_auto_20160414_1941'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='selfbilldesign', model_name='selfbilldesign',
name='users', name='users',
field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u043f\u043b\u0430\u0442\u0435\u0436\u0430\u0445'), field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u043f\u043b\u0430\u0442\u0435\u0436\u0430\u0445'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 20:30 # Generated by Django 1.9.5 on 2016-04-14 20:30
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0008_selfbilldesign_users'), ('finance', '0008_selfbilldesign_users'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='selfbillhistory', model_name='selfbillhistory',
name='new_sent', name='new_sent',
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430'), field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-28 14:15 # Generated by Django 1.9.5 on 2016-04-28 14:15
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0009_selfbillhistory_new_sent'), ('finance', '0009_selfbillhistory_new_sent'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='selfbilldesign', model_name='selfbilldesign',
name='pay_id', name='pay_id',
field=models.IntegerField(default=0, max_length=255, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'), field=models.IntegerField(default=0, max_length=255, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'),
), ),
] ]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 17:48 # Generated by Django 1.9.5 on 2016-05-05 17:48
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('courses', '0024_auto_20160505_1748'), ('courses', '0024_auto_20160505_1748'),
('finance', '0010_selfbilldesign_pay_id'), ('finance', '0010_selfbilldesign_pay_id'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='price', model_name='price',
name='included', name='included',
field=models.ManyToManyField(null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'), field=models.ManyToManyField(null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='selfbilldesign', model_name='selfbilldesign',
name='pay_id', name='pay_id',
field=models.IntegerField(blank=True, default=0, help_text='ID \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 - \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f "1501".\u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e, \u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'), field=models.IntegerField(blank=True, default=0, help_text='ID \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 - \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f "1501".\u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e, \u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'),
), ),
] ]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 20:09 # Generated by Django 1.9.5 on 2016-05-05 20:09
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0011_auto_20160505_1748'), ('finance', '0011_auto_20160505_1748'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='price', model_name='price',
name='by_time', name='by_time',
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='included', name='included',
field=models.ManyToManyField(blank=True, help_text='\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430', null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'), field=models.ManyToManyField(blank=True, help_text='\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430', null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 20:35 # Generated by Django 1.9.5 on 2016-05-05 20:35
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0012_auto_20160505_2009'), ('finance', '0012_auto_20160505_2009'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='by_time', name='by_time',
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03 # Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0013_auto_20160505_2035'), ('finance', '0013_auto_20160505_2035'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='by_time', name='by_time',
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 17:10 # Generated by Django 1.9.5 on 2016-05-09 17:10
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0014_auto_20160506_1303'), ('finance', '0014_auto_20160506_1303'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='price', model_name='price',
name='key', name='key',
field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
), ),
] ]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-24 12:55 # Generated by Django 1.9.2 on 2016-05-24 12:55
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0015_price_key'), ('finance', '0015_price_key'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='price', model_name='price',
name='flex', name='flex',
field=models.BooleanField(default=False, verbose_name='\u041e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f'), field=models.BooleanField(default=False, verbose_name='\u041e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='key', name='key',
field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
), ),
] ]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-24 12:58 # Generated by Django 1.9.2 on 2016-05-24 12:58
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0016_auto_20160524_1255'), ('finance', '0016_auto_20160524_1255'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='price', model_name='price',
name='flex', name='flex',
), ),
] ]

@ -1,117 +1,117 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 12:56 # Generated by Django 1.9.2 on 2016-05-31 12:56
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('finance', '0017_remove_price_flex'), ('finance', '0017_remove_price_flex'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Installment', name='Installment',
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')),
('price', models.IntegerField(verbose_name='\u041e\u0431\u0449\u0430\u044f \u0446\u0435\u043d\u0430')), ('price', models.IntegerField(verbose_name='\u041e\u0431\u0449\u0430\u044f \u0446\u0435\u043d\u0430')),
('first_price', models.IntegerField(default=0, verbose_name='\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436')), ('first_price', models.IntegerField(default=0, verbose_name='\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436')),
('period', models.IntegerField(default=5, verbose_name='\u041c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443')), ('period', models.IntegerField(default=5, verbose_name='\u041c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443')),
('date', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f')), ('date', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f')),
('f_date', models.DateField(blank=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f')), ('f_date', models.DateField(blank=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f')),
('rest', models.IntegerField(default=0, verbose_name='\u041e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u043e \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')), ('rest', models.IntegerField(default=0, verbose_name='\u041e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u043e \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')),
('wait', models.IntegerField(default=0, help_text='\u0427\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438', verbose_name='\u0414\u043d\u0435\u0439 \u0432 \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')), ('wait', models.IntegerField(default=0, help_text='\u0427\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438', verbose_name='\u0414\u043d\u0435\u0439 \u0432 \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')),
('expired', models.BooleanField(default=False, verbose_name='\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043e')), ('expired', models.BooleanField(default=False, verbose_name='\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043e')),
], ],
options={ options={
'verbose_name': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430', 'verbose_name': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430',
'verbose_name_plural': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0438', 'verbose_name_plural': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0438',
}, },
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='selfbilldesign', model_name='selfbilldesign',
name='users', name='users',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='selfbillhistory', model_name='selfbillhistory',
name='request', name='request',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='selfbillrequest', model_name='selfbillrequest',
name='design', name='design',
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='price', name='price',
options={'ordering': ['-id'], 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438'}, options={'ordering': ['-id'], 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438'},
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='_method', name='_method',
field=models.CharField(choices=[(b'H', '\u0412 \u0420\u0443\u0447\u043d\u0443\u044e'), (b'S', 'SimplePay'), (b'A1', '\u0410\u043b\u044c\u0444\u0430\u0411\u0430\u043d\u043a'), (b'A2', '\u0410\u043b\u044c\u0431\u0430\u0411\u0430\u043d\u043a c \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u043e\u0439')], default=b'H', max_length=2, verbose_name='\u0421\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b'), field=models.CharField(choices=[(b'H', '\u0412 \u0420\u0443\u0447\u043d\u0443\u044e'), (b'S', 'SimplePay'), (b'A1', '\u0410\u043b\u044c\u0444\u0430\u0411\u0430\u043d\u043a'), (b'A2', '\u0410\u043b\u044c\u0431\u0430\u0411\u0430\u043d\u043a c \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u043e\u0439')], default=b'H', max_length=2, verbose_name='\u0421\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='_type', name='_type',
field=models.CharField(choices=[(b'I', '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), (b'F', '\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436'), (b'S', '\u0423\u0441\u043b\u0443\u0433\u0430')], default=b'S', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043b\u0430\u0442\u0435\u0436\u0430'), field=models.CharField(choices=[(b'I', '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), (b'F', '\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436'), (b'S', '\u0423\u0441\u043b\u0443\u0433\u0430')], default=b'S', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043b\u0430\u0442\u0435\u0436\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='gift', name='gift',
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u0434\u0430\u0440\u043e\u043a'), field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u0434\u0430\u0440\u043e\u043a'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='price', name='price',
field=models.CharField(default=0, max_length=255, verbose_name='\u0421\u0443\u043c\u043c\u0430'), field=models.CharField(default=0, max_length=255, verbose_name='\u0421\u0443\u043c\u043c\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='price', model_name='price',
name='freepay', name='freepay',
field=models.BooleanField(default=False, editable=False, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0447\u0435\u0442'), field=models.BooleanField(default=False, editable=False, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0447\u0435\u0442'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='course', name='course',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='title', name='title',
field=models.CharField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430'), field=models.CharField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430'),
), ),
migrations.DeleteModel( migrations.DeleteModel(
name='SelfBillDesign', name='SelfBillDesign',
), ),
migrations.DeleteModel( migrations.DeleteModel(
name='SelfBillHistory', name='SelfBillHistory',
), ),
migrations.DeleteModel( migrations.DeleteModel(
name='SelfBillRequest', name='SelfBillRequest',
), ),
migrations.AddField( migrations.AddField(
model_name='installment', model_name='installment',
name='initiative', name='initiative',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u0418\u043d\u0438\u0430\u0446\u0438\u0430\u0442\u0438\u0432\u0430'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u0418\u043d\u0438\u0430\u0446\u0438\u0430\u0442\u0438\u0432\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='installment', model_name='installment',
name='payments', name='payments',
field=models.ManyToManyField(blank=True, null=True, related_name='bill_point', to='finance.Bill', verbose_name='\u041f\u043b\u0430\u0442\u0435\u0436\u0438'), field=models.ManyToManyField(blank=True, null=True, related_name='bill_point', to='finance.Bill', verbose_name='\u041f\u043b\u0430\u0442\u0435\u0436\u0438'),
), ),
migrations.AddField( migrations.AddField(
model_name='installment', model_name='installment',
name='user', name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='installment', name='installment',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='installment_point', to='finance.Installment', verbose_name='\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='installment_point', to='finance.Installment', verbose_name='\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 13:00 # Generated by Django 1.9.2 on 2016-05-31 13:00
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0018_auto_20160531_1256'), ('finance', '0018_auto_20160531_1256'),
] ]
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='price', model_name='price',
name='url', name='url',
field=models.URLField(blank=True, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'), field=models.URLField(blank=True, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'),
), ),
] ]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 13:03 # Generated by Django 1.9.2 on 2016-05-31 13:03
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0019_price_url'), ('finance', '0019_price_url'),
] ]
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='price', model_name='price',
name='url', name='url',
field=models.URLField(blank=True, editable=False, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'), field=models.URLField(blank=True, editable=False, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'),
), ),
] ]

@ -1,34 +1,34 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-01 13:09 # Generated by Django 1.9.2 on 2016-06-01 13:09
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0020_auto_20160531_1303'), ('finance', '0020_auto_20160531_1303'),
] ]
operations = [ operations = [
migrations.RemoveField( migrations.RemoveField(
model_name='bill', model_name='bill',
name='key', name='key',
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='pay_key', name='pay_key',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043b\u0430\u0442\u0435\u0436\u0430'), field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043b\u0430\u0442\u0435\u0436\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='result_key', name='result_key',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430'), field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430'),
), ),
migrations.AddField( migrations.AddField(
model_name='bill', model_name='bill',
name='success_key', name='success_key',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f'), field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f'),
), ),
] ]

@ -1,28 +1,28 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-01 13:20 # Generated by Django 1.9.2 on 2016-06-01 13:20
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('finance', '0021_auto_20160601_1309'), ('finance', '0021_auto_20160601_1309'),
] ]
operations = [ operations = [
migrations.RenameField( migrations.RenameField(
model_name='bill', model_name='bill',
old_name='pay_key', old_name='pay_key',
new_name='key', new_name='key',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='bill', model_name='bill',
name='result_key', name='result_key',
), ),
migrations.RemoveField( migrations.RemoveField(
model_name='bill', model_name='bill',
name='success_key', name='success_key',
), ),
] ]

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save