Merge branch 'codemy' into 'master'

Codemy

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

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

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

@ -18,7 +18,7 @@ _themes = {}
for i in CourseTheme.objects.filter(course__id=20):
_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):
if Bill.objects.filter(user=_j.student, status='F', service__course=20).exists():
_themes[i.sort] += 1

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

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

@ -11,7 +11,7 @@ django.setup()
from journals.models import CourseMap, LessonJ, TeacherJ, HomeworkTry
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_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/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup()
from access.models import User
from courses.models import Course, CourseTheme
from journals.models import CourseThemeJ
from journals.models import HomeworkTry, HomeworkJ, CourseThemeJ
print('## Почты пользователей в статусе сдано по теме')

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

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

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

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

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

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

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

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

@ -1,85 +1,85 @@
-----BEGIN CERTIFICATE-----
MIIF9jCCBN6gAwIBAgIMY/C5dNv6x+tP/WuUMA0GCSqGSIb3DQEBCwUAMGAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN
MTYwNzAxMTMyMzM0WhcNMTcwNzAyMTMyMzM0WjA5MSEwHwYDVQQLExhEb21haW4g
Q29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAMMCyouY29kZW15LnJ1MIICIjANBgkq
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeS
Ne8aJVMXRu3IbIML+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7Mv
Pbts5Y7LWBcwUomJ+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674Z
ImLLtc+bLl3NjzH6t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefK
zigr+5sU34SMbWLsczspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWq
i6OOVZMcNjqePwc41R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvO
OnK/TeOzaJoCx/yb7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8ty
WTcypBWhr6xTYhNBGTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNK
jqMo3wvrvJjcM1mzqRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtp
kzaMCdEf33ELDshGXN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p
8MDs1ZCNtjScCzgtaNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOr
sWFfpoEXjmMCAwEAAaOCAdUwggHRMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYBBQUH
AQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j
b20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzABhi1o
dHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIwVgYD
VR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu
Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQCMAAw
QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9n
c2RvbWFpbnZhbHNoYTJnMi5jcmwwIQYDVR0RBBowGIILKi5jb2RlbXkucnWCCWNv
ZGVteS5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYE
FHlv5NiaqItBFuN0vudXy9jt1bLkMB8GA1UdIwQYMBaAFOpOfNSALeUVgYYmjIJt
wJikz5cPMA0GCSqGSIb3DQEBCwUAA4IBAQBfIs7hKJlHw5Hly/vVhjAQzX8qcN9H
ISyHjmU4KeMKtiq0RdvC2Jf1IQFmxvgmycrARH1Xc9cHoMXZ8prYonnXeRX7fqrL
hsjp6x87DxwDDXqblHqpoakFXhZhY2fJCeH+YQTrY37+hOy3qOreI3CiRK5N+BYF
PO78hVAa5TdawQGM3c1TeYIG3ZzQ3x2wVGAQNCXdwcJOLF9dl6z+syySTOGPABKN
rIEKOzc4ScqIHOzuQ1qTG2QcjwyH9tarDjJd79rnZUQzf1O58DwGwaQZwh6gjksz
QXZOLz6LR55gpBP8cGpqJIwOiZKjtLTqeE6q/kJ0C9sbxnNw9sCkeAhh
-----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=
-----BEGIN CERTIFICATE-----
MIIF9jCCBN6gAwIBAgIMY/C5dNv6x+tP/WuUMA0GCSqGSIb3DQEBCwUAMGAxCzAJ
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN
MTYwNzAxMTMyMzM0WhcNMTcwNzAyMTMyMzM0WjA5MSEwHwYDVQQLExhEb21haW4g
Q29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAMMCyouY29kZW15LnJ1MIICIjANBgkq
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeS
Ne8aJVMXRu3IbIML+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7Mv
Pbts5Y7LWBcwUomJ+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674Z
ImLLtc+bLl3NjzH6t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefK
zigr+5sU34SMbWLsczspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWq
i6OOVZMcNjqePwc41R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvO
OnK/TeOzaJoCx/yb7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8ty
WTcypBWhr6xTYhNBGTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNK
jqMo3wvrvJjcM1mzqRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtp
kzaMCdEf33ELDshGXN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p
8MDs1ZCNtjScCzgtaNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOr
sWFfpoEXjmMCAwEAAaOCAdUwggHRMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYBBQUH
AQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j
b20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzABhi1o
dHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIwVgYD
VR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu
Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQCMAAw
QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9n
c2RvbWFpbnZhbHNoYTJnMi5jcmwwIQYDVR0RBBowGIILKi5jb2RlbXkucnWCCWNv
ZGVteS5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYE
FHlv5NiaqItBFuN0vudXy9jt1bLkMB8GA1UdIwQYMBaAFOpOfNSALeUVgYYmjIJt
wJikz5cPMA0GCSqGSIb3DQEBCwUAA4IBAQBfIs7hKJlHw5Hly/vVhjAQzX8qcN9H
ISyHjmU4KeMKtiq0RdvC2Jf1IQFmxvgmycrARH1Xc9cHoMXZ8prYonnXeRX7fqrL
hsjp6x87DxwDDXqblHqpoakFXhZhY2fJCeH+YQTrY37+hOy3qOreI3CiRK5N+BYF
PO78hVAa5TdawQGM3c1TeYIG3ZzQ3x2wVGAQNCXdwcJOLF9dl6z+syySTOGPABKN
rIEKOzc4ScqIHOzuQ1qTG2QcjwyH9tarDjJd79rnZUQzf1O58DwGwaQZwh6gjksz
QXZOLz6LR55gpBP8cGpqJIwOiZKjtLTqeE6q/kJ0C9sbxnNw9sCkeAhh
-----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,17 +1,17 @@
django==1.9.3
Pillow==3.3.0
psycopg2==2.6.2
simplejson==3.8.2
celery==3.1.23
django-celery==3.1.17
django-wysiwyg-redactor==0.4.9
raven==5.24.3
uwsgi==2.0.13.1
flower==0.9.1
django-import-export==0.4.5
python-dateutil==2.5.3
requests==2.11.0
ipython==5.1.0
django-precise-bbcode==1.2.6
html2bbcode==2.3.2
markdown==2.6.7
Pillow
psycopg2
simplejson
celery
django-celery
django-wysiwyg-redactor
raven
uwsgi
flower
django-import-export
python-dateutil
requests
ipython
django-precise-bbcode
html2bbcode
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-----
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
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

@ -1,28 +1,28 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIErjCCApYCAQAwaTELMAkGA1UEBhMCUlUxDzANBgNVBAgMBk1vc2NvdzEPMA0G
A1UEBwwGTW9zY293MRYwFAYDVQQDDA0qLnNraWxsYm94LnJ1MSAwHgYJKoZIhvcN
AQkBFhFhZG1pbkBza2lsbGJveC5ydTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBAMT5EZBTyOnKVrrVMW9u2cH9bhHPcEsJAfEli9ep9EhDsXCT1Tn1dyZf
/9hj/Ey0sXmNUuPjDkYbKg5u/6LrQ6yUEiZ5Gf6cGGWyRI/taAiLacmpqPpRyePI
IJ0A+h82Fpg2TK1DWIjk5i8bCnFXFzOJC3A1RukSToCDG4sGgMCB+wwT1slW2ggQ
WPVzFM+3rDg6L//TjHWboXI7pOjV57TbAEgGwwtAblQgCS7FUeoq+6/MThew7a54
YRI3BO0dVpH+AO4vw8lMv+6CUctqO6bADySSEvh8/mxzfszfv8PWKQptO/GZgsv3
yZoSEaMpgq3RxGx8vRnzbg306MNR+vpz803QO8997oTsSyTIWLWY8wzpGUE+HMI9
2hxhe2xa1rxM2riXk7RshIeX0qYCbx95APmdnFSUWJFtyWUeQdmk24T3TmnOHYad
6lEfQ1U44odiNXj/BQWr6+UW+ejSHuBxsi9kCMryo6apHx+U0Sdb0W0Adzo0/J1k
ZE5h71MSV4OU5oWVbwbePP8Y5OQztVvxgudeq/eqtUuWInkMzieEVDRSM0iJ1JHt
Di85oWvD/bw7/tqME+fSEU5e7jun0Fxkke27IQOTJargb83UNIPN+69zYcrNQFyP
o633pUdLph2PGzHKwnF3lm18hgCiM5E8/MdSNsQ8yD2VVuLwf3EvAgMBAAGgADAN
BgkqhkiG9w0BAQsFAAOCAgEAWdky38LZxVusUZ93/myKw1gb59NQEz5LwSCOH6hB
hZcQfu7gdwJeufLTQgn3xjjviP12OdU2hyCIfTgZL1K4ohcMvKQaHW1NUS78H6LB
I6DAQuD20hrJAtKA7ujxzHWba/83z/jMSPCNx8vsFWEMaIBc7lfAMYDU9pr9p7jd
pUTuGSJdnXHIpze2uBY+YCfvgP1HINHj/LNoT5XiPmLA7QNgxW3IrQ3PYHSKFS8b
4HtC1vgKZa4VUe4eL6sEL0MxnB6LSyuGL77JeFHQqfU48V0EKlDO0UztEWzyZqE4
pWfdAWowo1YubWup8bR+5A+5VZQ3UJwUmgYWc4TFUATH/vvfnr88tU6ilbSb/gNE
0tZSLoRDi48s1egaKi+WhHbfm+XhhGlhaFVG+o5uEn3AueVGExdK6bA68SH9AbDM
+tkggBWy2JzzERqmHNoiMUC4mfbaAaOn6hz1YnBEOmt/cn48AFskxqjZ3IJVjjLM
aZBO88g8P9XrQKPYpuoN1FowE+R0rccoTxr8bjsSywV/O+P25Lc0HM0wUZzB5jbI
z75jLij6uM+Qomn9Wij7q6NTuiClTqTRPi94PPi+cz30E15mun1S51RV01uVP0Ma
FY1NLoxWlmLIl1U/PI7jvIO8vqxag0FKevZ8YszxMUy1y3doNPGUcoY7Ta/6bH6S
72c=
-----END CERTIFICATE REQUEST-----
-----BEGIN CERTIFICATE REQUEST-----
MIIErjCCApYCAQAwaTELMAkGA1UEBhMCUlUxDzANBgNVBAgMBk1vc2NvdzEPMA0G
A1UEBwwGTW9zY293MRYwFAYDVQQDDA0qLnNraWxsYm94LnJ1MSAwHgYJKoZIhvcN
AQkBFhFhZG1pbkBza2lsbGJveC5ydTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBAMT5EZBTyOnKVrrVMW9u2cH9bhHPcEsJAfEli9ep9EhDsXCT1Tn1dyZf
/9hj/Ey0sXmNUuPjDkYbKg5u/6LrQ6yUEiZ5Gf6cGGWyRI/taAiLacmpqPpRyePI
IJ0A+h82Fpg2TK1DWIjk5i8bCnFXFzOJC3A1RukSToCDG4sGgMCB+wwT1slW2ggQ
WPVzFM+3rDg6L//TjHWboXI7pOjV57TbAEgGwwtAblQgCS7FUeoq+6/MThew7a54
YRI3BO0dVpH+AO4vw8lMv+6CUctqO6bADySSEvh8/mxzfszfv8PWKQptO/GZgsv3
yZoSEaMpgq3RxGx8vRnzbg306MNR+vpz803QO8997oTsSyTIWLWY8wzpGUE+HMI9
2hxhe2xa1rxM2riXk7RshIeX0qYCbx95APmdnFSUWJFtyWUeQdmk24T3TmnOHYad
6lEfQ1U44odiNXj/BQWr6+UW+ejSHuBxsi9kCMryo6apHx+U0Sdb0W0Adzo0/J1k
ZE5h71MSV4OU5oWVbwbePP8Y5OQztVvxgudeq/eqtUuWInkMzieEVDRSM0iJ1JHt
Di85oWvD/bw7/tqME+fSEU5e7jun0Fxkke27IQOTJargb83UNIPN+69zYcrNQFyP
o633pUdLph2PGzHKwnF3lm18hgCiM5E8/MdSNsQ8yD2VVuLwf3EvAgMBAAGgADAN
BgkqhkiG9w0BAQsFAAOCAgEAWdky38LZxVusUZ93/myKw1gb59NQEz5LwSCOH6hB
hZcQfu7gdwJeufLTQgn3xjjviP12OdU2hyCIfTgZL1K4ohcMvKQaHW1NUS78H6LB
I6DAQuD20hrJAtKA7ujxzHWba/83z/jMSPCNx8vsFWEMaIBc7lfAMYDU9pr9p7jd
pUTuGSJdnXHIpze2uBY+YCfvgP1HINHj/LNoT5XiPmLA7QNgxW3IrQ3PYHSKFS8b
4HtC1vgKZa4VUe4eL6sEL0MxnB6LSyuGL77JeFHQqfU48V0EKlDO0UztEWzyZqE4
pWfdAWowo1YubWup8bR+5A+5VZQ3UJwUmgYWc4TFUATH/vvfnr88tU6ilbSb/gNE
0tZSLoRDi48s1egaKi+WhHbfm+XhhGlhaFVG+o5uEn3AueVGExdK6bA68SH9AbDM
+tkggBWy2JzzERqmHNoiMUC4mfbaAaOn6hz1YnBEOmt/cn48AFskxqjZ3IJVjjLM
aZBO88g8P9XrQKPYpuoN1FowE+R0rccoTxr8bjsSywV/O+P25Lc0HM0wUZzB5jbI
z75jLij6uM+Qomn9Wij7q6NTuiClTqTRPi94PPi+cz30E15mun1S51RV01uVP0Ma
FY1NLoxWlmLIl1U/PI7jvIO8vqxag0FKevZ8YszxMUy1y3doNPGUcoY7Ta/6bH6S
72c=
-----END CERTIFICATE REQUEST-----

Binary file not shown.

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

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

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

File diff suppressed because it is too large Load Diff

@ -1,199 +1,199 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import redactor.fields
class Migration(migrations.Migration):
initial = True
dependencies = [
('management', '0001_initial'),
('storage', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Achievements',
fields=[
('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')),
('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')),
('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')),
('border', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b')),
],
options={
'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',
},
),
migrations.CreateModel(
name='Course',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'ordering': ['sort'],
'verbose_name': '\u041a\u0443\u0440\u0441',
'verbose_name_plural': '\u041a\u0443\u0440\u0441\u044b',
},
),
migrations.CreateModel(
name='CourseMap',
fields=[
('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')),
('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')),
('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
],
options={
'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',
},
),
migrations.CreateModel(
name='CourseTheme',
fields=[
('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')),
('_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')),
('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')),
('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')),
],
options={
'ordering': ['sort'],
'verbose_name': '\u0422\u0435\u043c\u0430',
'verbose_name_plural': '\u0422\u0435\u043c\u044b',
},
),
migrations.CreateModel(
name='Exam',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'ordering': ['sort'],
'verbose_name': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d',
'verbose_name_plural': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u044b',
},
),
migrations.CreateModel(
name='Homework',
fields=[
('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')),
('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')),
('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')),
('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={
'ordering': ['sort'],
'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',
},
),
migrations.CreateModel(
name='Lesson',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
('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={
'ordering': ['sort'],
'verbose_name': '\u0423\u0440\u043e\u043a',
'verbose_name_plural': '\u0423\u0440\u043e\u043a\u0438',
},
),
migrations.CreateModel(
name='SkillJ',
fields=[
('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')),
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a')),
],
options={
'ordering': ['id'],
'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',
},
),
migrations.CreateModel(
name='Skills',
fields=[
('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')),
('color', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442')),
],
options={
'verbose_name': '\u041d\u0430\u0432\u044b\u043a',
'verbose_name_plural': '\u041d\u0430\u0432\u044b\u043a\u0438',
},
),
migrations.AddField(
model_name='skillj',
name='skill',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='\u041d\u0430\u0432\u044b\u043a'),
),
migrations.AddField(
model_name='coursemap',
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'),
),
migrations.AddField(
model_name='coursemap',
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'),
),
migrations.AddField(
model_name='coursemap',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import redactor.fields
class Migration(migrations.Migration):
initial = True
dependencies = [
('management', '0001_initial'),
('storage', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Achievements',
fields=[
('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')),
('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')),
('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')),
('border', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b')),
],
options={
'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',
},
),
migrations.CreateModel(
name='Course',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'ordering': ['sort'],
'verbose_name': '\u041a\u0443\u0440\u0441',
'verbose_name_plural': '\u041a\u0443\u0440\u0441\u044b',
},
),
migrations.CreateModel(
name='CourseMap',
fields=[
('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')),
('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')),
('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
],
options={
'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',
},
),
migrations.CreateModel(
name='CourseTheme',
fields=[
('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')),
('_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')),
('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')),
('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')),
],
options={
'ordering': ['sort'],
'verbose_name': '\u0422\u0435\u043c\u0430',
'verbose_name_plural': '\u0422\u0435\u043c\u044b',
},
),
migrations.CreateModel(
name='Exam',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'ordering': ['sort'],
'verbose_name': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d',
'verbose_name_plural': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u044b',
},
),
migrations.CreateModel(
name='Homework',
fields=[
('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')),
('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')),
('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')),
('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={
'ordering': ['sort'],
'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',
},
),
migrations.CreateModel(
name='Lesson',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
('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={
'ordering': ['sort'],
'verbose_name': '\u0423\u0440\u043e\u043a',
'verbose_name_plural': '\u0423\u0440\u043e\u043a\u0438',
},
),
migrations.CreateModel(
name='SkillJ',
fields=[
('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')),
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a')),
],
options={
'ordering': ['id'],
'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',
},
),
migrations.CreateModel(
name='Skills',
fields=[
('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')),
('color', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442')),
],
options={
'verbose_name': '\u041d\u0430\u0432\u044b\u043a',
'verbose_name_plural': '\u041d\u0430\u0432\u044b\u043a\u0438',
},
),
migrations.AddField(
model_name='skillj',
name='skill',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='\u041d\u0430\u0432\u044b\u043a'),
),
migrations.AddField(
model_name='coursemap',
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'),
),
migrations.AddField(
model_name='coursemap',
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'),
),
migrations.AddField(
model_name='coursemap',
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'),
),
]

@ -1,29 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-20 20:26
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('courses', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='AchievementsMap',
fields=[
('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')),
('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')),
],
options={
'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',
},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-20 20:26
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('courses', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='AchievementsMap',
fields=[
('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')),
('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')),
],
options={
'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',
},
),
]

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-22 18:52
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('courses', '0002_achievementsmap'),
]
operations = [
migrations.AlterModelOptions(
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'},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-22 18:52
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('courses', '0002_achievementsmap'),
]
operations = [
migrations.AlterModelOptions(
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'},
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-30 22:39
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0003_auto_20160322_1852'),
]
operations = [
migrations.AddField(
model_name='lesson',
name='video_id',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u0412\u0438\u0434\u0435\u043e ID'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-30 22:39
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0003_auto_20160322_1852'),
]
operations = [
migrations.AddField(
model_name='lesson',
name='video_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 -*-
# Generated by Django 1.9.2 on 2016-03-31 20:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0004_lesson_video_id'),
]
operations = [
migrations.AlterField(
model_name='lesson',
name='video',
field=models.TextField(blank=True, default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-31 20:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0004_lesson_video_id'),
]
operations = [
migrations.AlterField(
model_name='lesson',
name='video',
field=models.TextField(blank=True, default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e'),
),
]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-07 20:06
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0005_auto_20160331_2030'),
]
operations = [
migrations.AddField(
model_name='coursetheme',
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!'),
),
migrations.AddField(
model_name='coursetheme',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-07 20:06
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0005_auto_20160331_2030'),
]
operations = [
migrations.AddField(
model_name='coursetheme',
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!'),
),
migrations.AddField(
model_name='coursetheme',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-13 15:39
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0006_auto_20160407_2006'),
]
operations = [
migrations.AddField(
model_name='lesson',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-13 15:39
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0006_auto_20160407_2006'),
]
operations = [
migrations.AddField(
model_name='lesson',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 18:19
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0007_lesson_video_date'),
]
operations = [
migrations.AddField(
model_name='coursetheme',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 18:19
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0007_lesson_video_date'),
]
operations = [
migrations.AddField(
model_name='coursetheme',
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'),
),
]

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

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

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 15:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0010_remove_coursetheme_empty_description'),
]
operations = [
migrations.AddField(
model_name='course',
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'),
),
migrations.AddField(
model_name='course',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 15:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0010_remove_coursetheme_empty_description'),
]
operations = [
migrations.AddField(
model_name='course',
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'),
),
migrations.AddField(
model_name='course',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 15:53
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0011_auto_20160425_1550'),
]
operations = [
migrations.AddField(
model_name='course',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 15:53
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0011_auto_20160425_1550'),
]
operations = [
migrations.AddField(
model_name='course',
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'),
),
]

@ -1,42 +1,42 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:20
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0012_course_diploma_key'),
]
operations = [
migrations.RemoveField(
model_name='course',
name='diploma_key',
),
migrations.RemoveField(
model_name='course',
name='in_diploma',
),
migrations.RemoveField(
model_name='course',
name='out_diploma',
),
migrations.AddField(
model_name='exam',
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'),
),
migrations.AddField(
model_name='exam',
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'),
),
migrations.AddField(
model_name='exam',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:20
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0012_course_diploma_key'),
]
operations = [
migrations.RemoveField(
model_name='course',
name='diploma_key',
),
migrations.RemoveField(
model_name='course',
name='in_diploma',
),
migrations.RemoveField(
model_name='course',
name='out_diploma',
),
migrations.AddField(
model_name='exam',
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'),
),
migrations.AddField(
model_name='exam',
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'),
),
migrations.AddField(
model_name='exam',
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'),
),
]

@ -1,35 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:37
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0013_auto_20160425_1720'),
]
operations = [
migrations.CreateModel(
name='Diploma',
fields=[
('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')),
('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')),
('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')),
('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={
'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',
},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:37
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0013_auto_20160425_1720'),
]
operations = [
migrations.CreateModel(
name='Diploma',
fields=[
('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')),
('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')),
('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')),
('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={
'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',
},
),
]

@ -1,45 +1,45 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0014_diploma'),
]
operations = [
migrations.AlterModelOptions(
name='diploma',
options={'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c', 'verbose_name_plural': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b'},
),
migrations.RemoveField(
model_name='exam',
name='diploma',
),
migrations.RemoveField(
model_name='exam',
name='diploma_key',
),
migrations.RemoveField(
model_name='exam',
name='in_diploma',
),
migrations.RemoveField(
model_name='exam',
name='out_diploma',
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:50
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0014_diploma'),
]
operations = [
migrations.AlterModelOptions(
name='diploma',
options={'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c', 'verbose_name_plural': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b'},
),
migrations.RemoveField(
model_name='exam',
name='diploma',
),
migrations.RemoveField(
model_name='exam',
name='diploma_key',
),
migrations.RemoveField(
model_name='exam',
name='in_diploma',
),
migrations.RemoveField(
model_name='exam',
name='out_diploma',
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:52
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0015_auto_20160425_1750'),
]
operations = [
migrations.AddField(
model_name='course',
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'),
),
migrations.AddField(
model_name='course',
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'),
),
migrations.AddField(
model_name='course',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-25 17:52
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0015_auto_20160425_1750'),
]
operations = [
migrations.AddField(
model_name='course',
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'),
),
migrations.AddField(
model_name='course',
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'),
),
migrations.AddField(
model_name='course',
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'),
),
]

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

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

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

@ -1,75 +1,75 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 14:47
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0020_auto_20160426_1243'),
]
operations = [
migrations.AddField(
model_name='diploma',
name='date_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='date_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
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'),
),
migrations.AddField(
model_name='diploma',
name='date_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='key_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='key_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
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'),
),
migrations.AddField(
model_name='diploma',
name='key_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='name_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='name_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
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'),
),
migrations.AddField(
model_name='diploma',
name='name_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 14:47
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0020_auto_20160426_1243'),
]
operations = [
migrations.AddField(
model_name='diploma',
name='date_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='date_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
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'),
),
migrations.AddField(
model_name='diploma',
name='date_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='key_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='key_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
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'),
),
migrations.AddField(
model_name='diploma',
name='key_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='name_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
name='name_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'),
),
migrations.AddField(
model_name='diploma',
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'),
),
migrations.AddField(
model_name='diploma',
name='name_size',
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 -*-
# Generated by Django 1.9.5 on 2016-04-26 15:26
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0021_auto_20160426_1447'),
]
operations = [
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='key',
field=models.IntegerField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'),
),
migrations.AlterField(
model_name='diploma',
name='key_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
name='key_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
name='key_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
name='name_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'),
),
migrations.AlterField(
model_name='diploma',
name='name_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0438\u043c\u0435\u043d\u0438'),
),
migrations.AlterField(
model_name='diploma',
name='name_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 15:26
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0021_auto_20160426_1447'),
]
operations = [
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='key',
field=models.IntegerField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'),
),
migrations.AlterField(
model_name='diploma',
name='key_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
name='key_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
name='key_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
name='name_color',
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'),
),
migrations.AlterField(
model_name='diploma',
name='name_font',
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0438\u043c\u0435\u043d\u0438'),
),
migrations.AlterField(
model_name='diploma',
name='name_size',
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
]

@ -1,55 +1,55 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 17:29
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0022_auto_20160426_1526'),
]
operations = [
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='date_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='key_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='name_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-26 17:29
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0022_auto_20160426_1526'),
]
operations = [
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='date_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='key_size',
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
name='name_size',
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 -*-
# Generated by Django 1.9.5 on 2016-05-05 17:48
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0023_auto_20160426_1729'),
]
operations = [
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 17:48
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0023_auto_20160426_1729'),
]
operations = [
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
migrations.AlterField(
model_name='diploma',
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'),
),
]

@ -1,31 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals
from django.db import migrations, models
import redactor.fields
class Migration(migrations.Migration):
dependencies = [
('courses', '0024_auto_20160505_1748'),
]
operations = [
migrations.AddField(
model_name='skills',
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'),
),
migrations.AddField(
model_name='skills',
name='description',
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'),
),
migrations.AddField(
model_name='skills',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals
from django.db import migrations, models
import redactor.fields
class Migration(migrations.Migration):
dependencies = [
('courses', '0024_auto_20160505_1748'),
]
operations = [
migrations.AddField(
model_name='skills',
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'),
),
migrations.AddField(
model_name='skills',
name='description',
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'),
),
migrations.AddField(
model_name='skills',
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'),
),
]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 18:38
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0025_auto_20160506_1303'),
]
operations = [
migrations.AlterField(
model_name='skills',
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'),
),
migrations.AlterField(
model_name='skills',
name='description',
field=models.TextField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'),
),
migrations.AlterField(
model_name='skills',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 18:38
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0025_auto_20160506_1303'),
]
operations = [
migrations.AlterField(
model_name='skills',
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'),
),
migrations.AlterField(
model_name='skills',
name='description',
field=models.TextField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'),
),
migrations.AlterField(
model_name='skills',
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'),
),
]

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

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

@ -1,45 +1,45 @@
from courses import views, api
from django.conf.urls import url
urlpatterns = [
url(r'^([0-9]{1,99})$', views.course),
url(r'^([0-9]{1,99})#\s+$', views.course),
url(r'lesson/([0-9]{1,99})$', views.lesson),
url(r'homework/([0-9]{1,99})$', views.homework),
url(r'exam/([0-9]{1,99})$', views.exam),
url(r'read_lesson/$', api.read_lesson),
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_exam_comments_for_teacher$', api.load_exam_comments_for_teacher),
url(r'load_homework_comments$', api.load_homework_comments),
url(r'load_exam_comments$', api.load_exam_comments),
url(r'get_achievement$', api.get_achievement),
url(r'close_achievement$', api.close_achievement),
url(r'delete_comment$', api.delete_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_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_exam_comments_length$', api.get_exam_comments_length),
url(r'sent_homework_comment$', api.sent_homework_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_context/$', api.get_lesson_context),
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_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'get_next_button/$', api.get_next_button_ajax),
url(r'by_course_data/$', api.by_course_data),
url(r'get_homework_context/$', api.get_homework_context),
url(r'load_comment/$', api.load_comment),
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_exam_up_teacher$', api.sent_exam_up_teacher),
url(r'sent_exam_down_teacher$', api.sent_exam_down_teacher),
url(r'get_process_vector$', api.get_process_vector),
url(r'get_comment_text/$', api.get_comment_text),
url(r'sent_comment_response/$', api.sent_comment_response),
url(r'achievements/$', views.achievements),
url(r'^(?P<slug>.*)$', views.course),
]
from courses import views, api
from django.conf.urls import url
urlpatterns = [
url(r'^([0-9]{1,99})$', views.course),
url(r'^([0-9]{1,99})#\s+$', views.course),
url(r'lesson/([0-9]{1,99})$', views.lesson),
url(r'homework/([0-9]{1,99})$', views.homework),
url(r'exam/([0-9]{1,99})$', views.exam),
url(r'read_lesson/$', api.read_lesson),
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_exam_comments_for_teacher$', api.load_exam_comments_for_teacher),
url(r'load_homework_comments$', api.load_homework_comments),
url(r'load_exam_comments$', api.load_exam_comments),
url(r'get_achievement$', api.get_achievement),
url(r'close_achievement$', api.close_achievement),
url(r'delete_comment$', api.delete_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_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_exam_comments_length$', api.get_exam_comments_length),
url(r'sent_homework_comment$', api.sent_homework_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_context/$', api.get_lesson_context),
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_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'get_next_button/$', api.get_next_button_ajax),
url(r'by_course_data/$', api.by_course_data),
url(r'get_homework_context/$', api.get_homework_context),
url(r'load_comment/$', api.load_comment),
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_exam_up_teacher$', api.sent_exam_up_teacher),
url(r'sent_exam_down_teacher$', api.sent_exam_down_teacher),
url(r'get_process_vector$', api.get_process_vector),
url(r'get_comment_text/$', api.get_comment_text),
url(r'sent_comment_response/$', api.sent_comment_response),
url(r'achievements/$', views.achievements),
url(r'^(?P<slug>.*)$', views.course),
]

@ -1,254 +1,250 @@
# coding=utf-8
import datetime
from django.http import Http404
from finance.models import Bill
from lms.decors import response_decor
from lms.tools import user_fabric
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 finance.tools import system_check_bill
@response_decor(template='course.html', without_auth=True)
def course(request, slug):
# Страница курса
user = user_fabric(request.user)
if not slug: return {'redirect': '/'}
try:
course = Course.objects.get(slug=slug)
except Course.DoesNotExist:
try:
course = Course.objects.get(id=slug)
except ValueError:
raise Http404
except Course.DoesNotExist:
raise Http404
else:
return {'redirect': course.get_absolute_url()}
except Course.DoesNotExist:
raise Http404
if not course.public and not (request.user.is_authenticated() and request.user.is_admin):
raise Http404
if course.hidden:
if not request.user.is_authenticated():
raise Http404
else:
if not request.user.is_admin:
try:
Bill.objects.get(service__course=course, user=request.user, status='F')
except Bill.DoesNotExist:
raise Http404
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
if created:
check_journal(journal)
_map = CourseMap.objects.filter(course=course).order_by('sort').first()
_j = _map.get_obj()
j = HomeworkJ.objects.get(material=_j, student=request.user)
j.open_material()
else:
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
if user and not journal.start_date:
journal.start_date = datetime.datetime.now()
journal.save()
waiting_materials = []
if journal.waiting.exists():
for n in journal.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
return {
'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
try:
lesson = Lesson.objects.get(id=lesson)
lj = LessonJ.objects.get(material=lesson, student=request.user)
except Lesson.DoesNotExist:
raise Http404
except LessonJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course)
check_journal(j)
lj = LessonJ.objects.get(material=lesson, student=request.user)
waiting_materials = []
if lj.parent.parent.waiting.exists():
for n in lj.parent.parent.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
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)),
'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}
if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type):
return {'redirect': '/access/by_error/'}
else:
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists():
return {'redirect': '/access/auth_error/'}
else:
result = False
if lj.get_status_flag() != 'N':
result = True
elif lj.parent.parent.waiting.filter(token=lj.material.token).exists():
result = True
lj.date = datetime.datetime.now()
lj.save()
if result:
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}
@response_decor(template='homework.html')
def homework(request, homework):
# Страница ДЗ
# TODO: Проверить везде ссылки с ID ДЗ
try:
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
except Homework.DoesNotExist:
raise Http404
except HomeworkJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course)
check_journal(j)
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
waiting_materials = []
if hj.parent.parent.waiting.exists():
for n in hj.parent.parent.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
if request.user.is_authenticated() and request.user.is_admin:
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))},
'waiting_materials': waiting_materials}
if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type):
return {'redirect': '/access/by_error/'}
else:
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists():
return {'redirect': '/access/auth_error/'}
else:
result = False
if hj.get_status_flag() != 'N':
result = True
elif hj.parent.parent.waiting.filter(token=hj.material.token).exists():
hj.date = datetime.datetime.now()
hj.save()
result = True
if result:
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))},
'waiting_materials': waiting_materials}
@response_decor(template='exam.html')
def exam(request, exam):
# Страница экзамена
# TODO: проверить, чтобы это было ID экзамена
try:
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
except Exam.DoesNotExist:
raise Http404
except ExamJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course)
check_journal(j)
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
waiting_materials = []
if exam.parent.parent.waiting.all().exists():
for n in exam.parent.parent.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
if request.user.is_authenticated() and request.user.is_admin:
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}
if not system_check_bill(exam.material.token, request.user):
return {'redirect': '/access/by_error/'}
else:
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists():
return {'redirect': '/access/auth_error/'}
else:
result = False
if exam.get_status_flag() != 'N':
result = True
elif exam.parent.parent.waiting.filter(token=exam.material.token).exists():
result = True
exam.date = datetime.datetime.now()
exam.save()
if result:
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}
@response_decor(template='all_achievements.html', without_auth=True)
def achievements(request):
# Список ачивок и статус получения
skills = {}
for course in Course.objects.all().order_by('sort'):
skills[(course.id, course.title)] = {}
for skillj in SkillJ.objects.filter(lesson__course=course):
if not skills[(course.id, course.title)].get(skillj.skill.title):
skills[(course.id, course.title)][skillj.skill.title] = {
'size': 0,
'icon': skillj.skill.mini_icon,
'color': skillj.skill.color
}
skills[(course.id, course.title)][skillj.skill.title]['size'] += skillj.size
return {'achievements': Achievements.objects.all(), 'skills': skills}
# coding=utf-8
import datetime
from django.http import Http404
from finance.models import Bill
from lms.decors import response_decor
from lms.tools import user_fabric
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 finance.tools import system_check_bill
@response_decor(template='course.html', without_auth=True)
def course(request, slug):
# Страница курса
user = user_fabric(request.user)
if not slug: return {'redirect': '/'}
try:
course = Course.objects.get(slug=slug)
except Course.DoesNotExist:
try:
course = Course.objects.get(id=slug)
except ValueError:
raise Http404
except Course.DoesNotExist:
raise Http404
else:
return {'redirect': course.get_absolute_url()}
except Course.DoesNotExist:
raise Http404
if not course.public and not (request.user.is_authenticated() and request.user.is_admin):
raise Http404
if course.hidden:
if not request.user.is_authenticated():
raise Http404
else:
if not request.user.is_admin:
try:
Bill.objects.get(service__course=course, user=request.user, status='F')
except Bill.DoesNotExist:
raise Http404
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
if created:
check_journal(journal)
_map = CourseMap.objects.filter(course=course).order_by('sort').first()
_j = _map.get_obj()
j = HomeworkJ.objects.get(material=_j, student=request.user)
j.open_material()
else:
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
if user and not journal.start_date:
journal.start_date = datetime.datetime.now()
journal.save()
waiting_materials = []
if journal.waiting.exists():
for n in journal.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
return {'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
try:
lesson = Lesson.objects.get(id=lesson)
lj = LessonJ.objects.get(material=lesson, student=request.user)
except Lesson.DoesNotExist:
raise Http404
except LessonJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course)
check_journal(j)
lj = LessonJ.objects.get(material=lesson, student=request.user)
waiting_materials = []
if lj.parent.parent.waiting.exists():
for n in lj.parent.parent.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
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)),
'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}
if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type):
return {'redirect': '/access/by_error/'}
else:
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists():
return {'redirect': '/access/auth_error/'}
else:
result = False
if lj.get_status_flag() != 'N':
result = True
elif lj.parent.parent.waiting.filter(token=lj.material.token).exists():
result = True
lj.date = datetime.datetime.now()
lj.save()
if result:
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}
@response_decor(template='homework.html')
def homework(request, homework):
# Страница ДЗ
# TODO: Проверить везде ссылки с ID ДЗ
try:
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
except Homework.DoesNotExist:
raise Http404
except HomeworkJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course)
check_journal(j)
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user)
waiting_materials = []
if hj.parent.parent.waiting.exists():
for n in hj.parent.parent.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
if request.user.is_authenticated() and request.user.is_admin:
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))},
'waiting_materials': waiting_materials}
if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type):
return {'redirect': '/access/by_error/'}
else:
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists():
return {'redirect': '/access/auth_error/'}
else:
result = False
if hj.get_status_flag() != 'N':
result = True
elif hj.parent.parent.waiting.filter(token=hj.material.token).exists():
hj.date = datetime.datetime.now()
hj.save()
result = True
if result:
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))},
'waiting_materials': waiting_materials}
@response_decor(template='exam.html')
def exam(request, exam):
# Страница экзамена
# TODO: проверить, чтобы это было ID экзамена
try:
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
except Exam.DoesNotExist:
raise Http404
except ExamJ.DoesNotExist:
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course)
check_journal(j)
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user)
waiting_materials = []
if exam.parent.parent.waiting.all().exists():
for n in exam.parent.parent.waiting.all():
_obj = n.get_obj()
__type = n.get_type()
_type = None
if __type == 'L':
_type = 'lesson'
elif __type == 'H':
_type = 'homework'
elif __type == 'E':
_type = 'exam'
waiting_materials.append({'obj': _obj, 'type': _type})
if request.user.is_authenticated() and request.user.is_admin:
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}
if not system_check_bill(exam.material.token, request.user):
return {'redirect': '/access/by_error/'}
else:
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists():
return {'redirect': '/access/auth_error/'}
else:
result = False
if exam.get_status_flag() != 'N':
result = True
elif exam.parent.parent.waiting.filter(token=exam.material.token).exists():
result = True
exam.date = datetime.datetime.now()
exam.save()
if result:
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}
@response_decor(template='all_achievements.html', without_auth=True)
def achievements(request):
# Список ачивок и статус получения
skills = {}
for course in Course.objects.all().order_by('sort'):
skills[(course.id, course.title)] = {}
for skillj in SkillJ.objects.filter(lesson__course=course):
if not skills[(course.id, course.title)].get(skillj.skill.title):
skills[(course.id, course.title)][skillj.skill.title] = {
'size': 0,
'icon': skillj.skill.mini_icon,
'color': skillj.skill.color
}
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 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Bill',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'verbose_name': '\u0421\u0447\u0435\u0442',
'verbose_name_plural': '\u0421\u0447\u0435\u0442\u0430',
},
),
migrations.CreateModel(
name='Price',
fields=[
('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')),
('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')),
('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')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
],
options={
'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430',
'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438',
},
),
migrations.CreateModel(
name='SelfBillHistory',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
('sent', models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')),
],
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_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(
name='SelfBillRequest',
fields=[
('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')),
('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')),
('url', models.URLField(blank=True, verbose_name='URL')),
],
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_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(
name='ServiceRequest',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'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',
},
),
migrations.AddField(
model_name='selfbillhistory',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('courses', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Bill',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'verbose_name': '\u0421\u0447\u0435\u0442',
'verbose_name_plural': '\u0421\u0447\u0435\u0442\u0430',
},
),
migrations.CreateModel(
name='Price',
fields=[
('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')),
('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')),
('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')),
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')),
],
options={
'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430',
'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438',
},
),
migrations.CreateModel(
name='SelfBillHistory',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
('sent', models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')),
],
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_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(
name='SelfBillRequest',
fields=[
('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')),
('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')),
('url', models.URLField(blank=True, verbose_name='URL')),
],
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_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(
name='ServiceRequest',
fields=[
('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')),
('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')),
('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')),
('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')),
('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')),
],
options={
'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',
},
),
migrations.AddField(
model_name='selfbillhistory',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-07 17:41
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='bill',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-07 17:41
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='bill',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 16:52
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0002_bill_description'),
]
operations = [
migrations.AddField(
model_name='selfbillrequest',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 16:52
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0002_bill_description'),
]
operations = [
migrations.AddField(
model_name='selfbillrequest',
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'),
),
]

@ -1,30 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 17:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0003_selfbillrequest_company'),
]
operations = [
migrations.AddField(
model_name='selfbillhistory',
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'),
),
migrations.AddField(
model_name='selfbillhistory',
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'),
),
migrations.AddField(
model_name='selfbillhistory',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 17:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0003_selfbillrequest_company'),
]
operations = [
migrations.AddField(
model_name='selfbillhistory',
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'),
),
migrations.AddField(
model_name='selfbillhistory',
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'),
),
migrations.AddField(
model_name='selfbillhistory',
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'),
),
]

@ -1,28 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:27
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0004_auto_20160414_1700'),
]
operations = [
migrations.CreateModel(
name='SelfBillDesign',
fields=[
('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')),
('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')),
],
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_plural': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430',
},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:27
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0004_auto_20160414_1700'),
]
operations = [
migrations.CreateModel(
name='SelfBillDesign',
fields=[
('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')),
('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')),
],
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_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 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:30
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('finance', '0005_selfbilldesign'),
]
operations = [
migrations.RemoveField(
model_name='selfbillrequest',
name='company',
),
migrations.AddField(
model_name='selfbillrequest',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:30
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('finance', '0005_selfbilldesign'),
]
operations = [
migrations.RemoveField(
model_name='selfbillrequest',
name='company',
),
migrations.AddField(
model_name='selfbillrequest',
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'),
),
]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:41
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('finance', '0006_auto_20160414_1930'),
]
operations = [
migrations.AlterModelOptions(
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'},
),
migrations.AlterField(
model_name='selfbillrequest',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:41
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('finance', '0006_auto_20160414_1930'),
]
operations = [
migrations.AlterModelOptions(
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'},
),
migrations.AlterField(
model_name='selfbillrequest',
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'),
),
]

@ -1,22 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:44
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('finance', '0007_auto_20160414_1941'),
]
operations = [
migrations.AddField(
model_name='selfbilldesign',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:44
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('finance', '0007_auto_20160414_1941'),
]
operations = [
migrations.AddField(
model_name='selfbilldesign',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 20:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0008_selfbilldesign_users'),
]
operations = [
migrations.AddField(
model_name='selfbillhistory',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 20:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0008_selfbilldesign_users'),
]
operations = [
migrations.AddField(
model_name='selfbillhistory',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-28 14:15
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0009_selfbillhistory_new_sent'),
]
operations = [
migrations.AddField(
model_name='selfbilldesign',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-28 14:15
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0009_selfbillhistory_new_sent'),
]
operations = [
migrations.AddField(
model_name='selfbilldesign',
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'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 17:48
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0024_auto_20160505_1748'),
('finance', '0010_selfbilldesign_pay_id'),
]
operations = [
migrations.AddField(
model_name='price',
name='included',
field=models.ManyToManyField(null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'),
),
migrations.AlterField(
model_name='selfbilldesign',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 17:48
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0024_auto_20160505_1748'),
('finance', '0010_selfbilldesign_pay_id'),
]
operations = [
migrations.AddField(
model_name='price',
name='included',
field=models.ManyToManyField(null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'),
),
migrations.AlterField(
model_name='selfbilldesign',
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'),
),
]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 20:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0011_auto_20160505_1748'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
migrations.AlterField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 20:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0011_auto_20160505_1748'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
migrations.AlterField(
model_name='price',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 20:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0012_auto_20160505_2009'),
]
operations = [
migrations.AlterField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-05 20:35
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0012_auto_20160505_2009'),
]
operations = [
migrations.AlterField(
model_name='price',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0013_auto_20160505_2035'),
]
operations = [
migrations.AlterField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0013_auto_20160505_2035'),
]
operations = [
migrations.AlterField(
model_name='price',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 17:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0014_auto_20160506_1303'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 17:10
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0014_auto_20160506_1303'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
]

@ -1,25 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-24 12:55
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0015_price_key'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
migrations.AlterField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-24 12:55
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0015_price_key'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
migrations.AlterField(
model_name='price',
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'),
),
]

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

@ -1,117 +1,117 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 12:56
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('finance', '0017_remove_price_flex'),
]
operations = [
migrations.CreateModel(
name='Installment',
fields=[
('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')),
('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')),
('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')),
('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')),
('expired', models.BooleanField(default=False, verbose_name='\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043e')),
],
options={
'verbose_name': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430',
'verbose_name_plural': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0438',
},
),
migrations.RemoveField(
model_name='selfbilldesign',
name='users',
),
migrations.RemoveField(
model_name='selfbillhistory',
name='request',
),
migrations.RemoveField(
model_name='selfbillrequest',
name='design',
),
migrations.AlterModelOptions(
name='price',
options={'ordering': ['-id'], 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438'},
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
name='gift',
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u0434\u0430\u0440\u043e\u043a'),
),
migrations.AddField(
model_name='bill',
name='price',
field=models.CharField(default=0, max_length=255, verbose_name='\u0421\u0443\u043c\u043c\u0430'),
),
migrations.AddField(
model_name='price',
name='freepay',
field=models.BooleanField(default=False, editable=False, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0447\u0435\u0442'),
),
migrations.AlterField(
model_name='price',
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'),
),
migrations.AlterField(
model_name='price',
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'),
),
migrations.DeleteModel(
name='SelfBillDesign',
),
migrations.DeleteModel(
name='SelfBillHistory',
),
migrations.DeleteModel(
name='SelfBillRequest',
),
migrations.AddField(
model_name='installment',
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'),
),
migrations.AddField(
model_name='installment',
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'),
),
migrations.AddField(
model_name='installment',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 12:56
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('finance', '0017_remove_price_flex'),
]
operations = [
migrations.CreateModel(
name='Installment',
fields=[
('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')),
('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')),
('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')),
('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')),
('expired', models.BooleanField(default=False, verbose_name='\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043e')),
],
options={
'verbose_name': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430',
'verbose_name_plural': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0438',
},
),
migrations.RemoveField(
model_name='selfbilldesign',
name='users',
),
migrations.RemoveField(
model_name='selfbillhistory',
name='request',
),
migrations.RemoveField(
model_name='selfbillrequest',
name='design',
),
migrations.AlterModelOptions(
name='price',
options={'ordering': ['-id'], 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438'},
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
name='gift',
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u0434\u0430\u0440\u043e\u043a'),
),
migrations.AddField(
model_name='bill',
name='price',
field=models.CharField(default=0, max_length=255, verbose_name='\u0421\u0443\u043c\u043c\u0430'),
),
migrations.AddField(
model_name='price',
name='freepay',
field=models.BooleanField(default=False, editable=False, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0447\u0435\u0442'),
),
migrations.AlterField(
model_name='price',
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'),
),
migrations.AlterField(
model_name='price',
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'),
),
migrations.DeleteModel(
name='SelfBillDesign',
),
migrations.DeleteModel(
name='SelfBillHistory',
),
migrations.DeleteModel(
name='SelfBillRequest',
),
migrations.AddField(
model_name='installment',
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'),
),
migrations.AddField(
model_name='installment',
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'),
),
migrations.AddField(
model_name='installment',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 13:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0018_auto_20160531_1256'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 13:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0018_auto_20160531_1256'),
]
operations = [
migrations.AddField(
model_name='price',
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'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 13:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0019_price_url'),
]
operations = [
migrations.AlterField(
model_name='price',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 13:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0019_price_url'),
]
operations = [
migrations.AlterField(
model_name='price',
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'),
),
]

@ -1,34 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-01 13:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0020_auto_20160531_1303'),
]
operations = [
migrations.RemoveField(
model_name='bill',
name='key',
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-01 13:09
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0020_auto_20160531_1303'),
]
operations = [
migrations.RemoveField(
model_name='bill',
name='key',
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
migrations.AddField(
model_name='bill',
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'),
),
]

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

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

Loading…
Cancel
Save