Скинул все версии кода в 1 - в самом низу версия от bramabrama

remotes/origin/pm_task_31703
Baryshnikov Nikolay 9 years ago
parent c10cf257ef
commit 58750c88b5
  1. 18
      README.md
  2. 140
      _utils/1.txt
  3. 232
      _utils/2.txt
  4. 10
      _utils/check_journals.py
  5. 30
      _utils/check_lesson_open_near_homework.py
  6. 72
      _utils/lessons_comments_hc.xml
  7. 2
      _utils/open_lesson.py
  8. 0
      access/__init__.py
  9. 6
      access/admin.py
  10. 988
      access/api.py
  11. 74
      access/forms.py
  12. 180
      access/migrations/0001_initial.py
  13. 40
      access/migrations/0002_auto_20160405_2045.py
  14. 40
      access/migrations/0003_user_delay.py
  15. 52
      access/migrations/0004_auto_20160412_2152.py
  16. 40
      access/migrations/0005_auto_20160414_1527.py
  17. 42
      access/migrations/0006_user_delay_date.py
  18. 42
      access/migrations/0007_auto_20160414_1543.py
  19. 42
      access/migrations/0008_auto_20160414_1547.py
  20. 42
      access/migrations/0009_auto_20160414_1941.py
  21. 42
      access/migrations/0010_auto_20160414_1944.py
  22. 42
      access/migrations/0011_auto_20160420_1749.py
  23. 42
      access/migrations/0012_auto_20160420_1819.py
  24. 52
      access/migrations/0013_auto_20160421_1808.py
  25. 42
      access/migrations/0014_auto_20160421_1824.py
  26. 42
      access/migrations/0015_auto_20160421_1829.py
  27. 52
      access/migrations/0016_auto_20160421_2009.py
  28. 52
      access/migrations/0017_auto_20160421_2135.py
  29. 52
      access/migrations/0018_auto_20160422_1555.py
  30. 52
      access/migrations/0019_auto_20160424_1646.py
  31. 42
      access/migrations/0020_auto_20160506_1303.py
  32. 62
      access/migrations/0021_auto_20160509_1331.py
  33. 82
      access/migrations/0022_auto_20160509_1401.py
  34. 76
      access/migrations/0023_auto_20160509_1408.py
  35. 122
      access/migrations/0024_auto_20160509_1537.py
  36. 52
      access/migrations/0025_auto_20160509_1539.py
  37. 52
      access/migrations/0026_auto_20160509_1803.py
  38. 92
      access/migrations/0027_auto_20160510_1823.py
  39. 122
      access/migrations/0028_auto_20160526_1427.py
  40. 76
      access/migrations/0029_auto_20160526_1435.py
  41. 52
      access/migrations/0030_auto_20160526_1727.py
  42. 52
      access/migrations/0031_auto_20160531_1240.py
  43. 42
      access/migrations/0032_auto_20160601_1256.py
  44. 42
      access/migrations/0033_auto_20160607_1614.py
  45. 42
      access/migrations/0034_auto_20160607_2002.py
  46. 42
      access/migrations/0035_auto_20160607_2034.py
  47. 42
      access/migrations/0036_auto_20160607_2051.py
  48. 42
      access/migrations/0037_auto_20160608_1700.py
  49. 42
      access/migrations/0038_auto_20160608_1705.py
  50. 42
      access/migrations/0039_auto_20160608_1804.py
  51. 42
      access/migrations/0040_auto_20160608_1841.py
  52. 42
      access/migrations/0041_auto_20160609_1429.py
  53. 42
      access/migrations/0042_auto_20160609_1442.py
  54. 42
      access/migrations/0043_auto_20160609_1534.py
  55. 42
      access/migrations/0044_auto_20160609_1536.py
  56. 42
      access/migrations/0045_auto_20160609_1536.py
  57. 42
      access/migrations/0046_auto_20160609_1546.py
  58. 42
      access/migrations/0047_auto_20160609_1627.py
  59. 42
      access/migrations/0048_auto_20160609_2224.py
  60. 42
      access/migrations/0049_auto_20160628_1731.py
  61. 42
      access/migrations/0050_auto_20160711_1518.py
  62. 42
      access/migrations/0051_auto_20160713_2038.py
  63. 42
      access/migrations/0052_auto_20160718_1714.py
  64. 42
      access/migrations/0053_auto_20160718_1714.py
  65. 62
      access/migrations/0054_auto_20160725_1551.py
  66. 72
      access/migrations/0055_auto_20160809_1653.py
  67. 52
      access/migrations/0056_auto_20160809_1659.py
  68. 42
      access/migrations/0057_auto_20160810_1234.py
  69. 42
      access/migrations/0058_auto_20160814_1736.py
  70. 396
      access/migrations/0059_auto_20160815_1853.py
  71. 52
      access/migrations/0060_auto_20160815_1855.py
  72. 0
      access/migrations/__init__.py
  73. 4
      access/models.py
  74. 896
      access/out_api.py
  75. 80
      access/tasks.py
  76. 22
      access/teach_urls.py
  77. 280
      access/teach_views.py
  78. 86
      access/urls.py
  79. 468
      access/views.py
  80. 80
      configs/celery.conf
  81. 102
      configs/codemy_ssl/privat.key
  82. 168
      configs/codemy_ssl/public.pem
  83. 32
      configs/packs
  84. 102
      configs/skillbox_ssl/private.key
  85. 56
      configs/skillbox_ssl/request.csr
  86. 14
      configs/supervisor.conf
  87. 30
      configs/uwsgi.ini
  88. 0
      courses/__init__.py
  89. 240
      courses/admin.py
  90. 1818
      courses/api.py
  91. 398
      courses/migrations/0001_initial.py
  92. 58
      courses/migrations/0002_achievementsmap.py
  93. 38
      courses/migrations/0003_auto_20160322_1852.py
  94. 40
      courses/migrations/0004_lesson_video_id.py
  95. 40
      courses/migrations/0005_auto_20160331_2030.py
  96. 50
      courses/migrations/0006_auto_20160407_2006.py
  97. 40
      courses/migrations/0007_lesson_video_date.py
  98. 40
      courses/migrations/0008_coursetheme_block.py
  99. 38
      courses/migrations/0009_remove_coursetheme_block.py
  100. 38
      courses/migrations/0010_remove_coursetheme_empty_description.py
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,16 +1,8 @@
## Правила для разработчика
#**INDIGO**
RLMS ( Real Learning Management System )
- Разрабока ведется в отдельном брэнче
- После комита изменений можно проверить свою работу по следующему адресу: <branch_name>.lms.test.spicycms.com
- После проверки тестового сайта по имени брэнча, брэнч помечается к мерж реквесту
- Ответсвенный инженер производит код ревью и запускает/отклоняет мерж
- Если сайт запустился на демо сайте, код в ручом режиме можно обновить на продакшен сервере
[http://go.skillbox.ru](http://go.skillbox.ru)
### Замечания
Барышников Н.Р.
- Мерж реквест лучше производить в ветку develop(чтобы исключить случайного обновления кода на демо сайте)
- Внимание! Разработчик обязан проверить работоспособность тестового сайта по имени созданного брэнча <branch_name>.lms.test.spicycms.com
- Если необходимы тестовые данные разработчик их подготавливает дополнительно
- Если нет возможности добавить тестовые данные в авто режиме, разработчик добавляет инструкцию в README файл по запуску необходимых команд
(Под тестовыми данными подразумеваются фикстуры)
**Наша задача** - построить гибкую систему обучения, предоставляющую возможность эффективно подстраиваться под нужны конкретного проекта обучения. Хранить и обрабатывать информацию об аудитории. Давать конструктивную и максимально приближенную к реальности оценку процессов проводимых в системе. Предоставлять возможность проведения экспериментов в обучении без ущерба для самого процесса. Необходимо реализовать в полной мере принцип модульности частей системы. Все процессы, проходимые через систему должны подчиняться общей политике безопасности. Административный интерфейс должен быть максимально упрощен, для быстрого и эффективного доступа к данным. Максимально интегрироваться с готовыми решениями имеющими косвенную выгоду для обучения непосредственно. Четко соблюдать прицип MVC при любых объемах. Контролировать полноценно работу на всех 3х уровнях. Собирать и хранить всю поступающую, уникальную информацию.

@ -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,16 +3,20 @@ import os
import django
import sys
import datetime
import os
start = datetime.datetime.now()
sys.path.append("/var/www/projects/codemy/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup()
os.system('python check_course_map.py')
os.system('python check_prices.py')
from lms.settings import BASE_DIR
from journals.models import TeacherJ, check_journal
from lms.tools import show_progress
os.system('python clean_twice_journals.py')
all = TeacherJ.objects.filter(progress__gt=0).count()
print('Количество журналов на проверку: %s' % all)
@ -29,6 +33,6 @@ for i in TeacherJ.objects.filter(progress__gt=0).order_by('-id'):
f = open(os.path.join(BASE_DIR, 'journals/check_switch'), 'w')
f.write('0\n')
f.close()
os.system('python open_lesson.py')
finish = datetime.datetime.now()
print('\nTIME: %s seconds' % (finish-start).seconds)

@ -3,45 +3,33 @@ 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
# Получить все журналы, где начато обучение
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')
# Получить все журналы, где начато обучение
for journal in TeacherJ.objects.filter(status='W').order_by('-id'):
if HomeworkTry.objects.filter(parent__parent__parent=journal).exists():
hw = int(CourseMap.objects.get(
homework=HomeworkTry.objects.filter(parent__parent__parent=journal).order_by('id').last().material).sort)
print(hw)
before = []
for i in LessonJ.objects.filter(parent__parent=journal):
if int(CourseMap.objects.get(lesson=i.material).sort) > hw:
if int(CourseMap.objects.get(lesson=i.material).sort):
i.date = None
i.f_date = None
i.success = False
i.save()
else:
try:
i.saw_this()
except Exception as e:
print(e)
print(i)
i.saw_this()
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()
print(5)
#for i in HomeworkJ.objects.filter(f_date=None).exclude(date=None):
# i.open_next()
for i in HomeworkJ.objects.filter(f_date=None).exclude(date=None):
i.open_next()

@ -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 = None#LessonJ.objects.get(material__id='684', student__email='alexandersvinin@gmail.com')
_NEED_OPEN = LessonJ.objects.get(material__id='79', student__email='agar10@yandex.ru')
_TEACHERJ_FILTER = {'progress__gte': 0}
_TEACHERJ_EXCLUDE = {'teacher': None}

@ -49,17 +49,13 @@ class DocumentAdmin(admin.ModelAdmin):
class UserRequestAdmin(admin.ModelAdmin):
list_display = ('ip', 'user', 'count', 'date', )
list_filter = ['date']
search_fields = ('ip', 'user__email', 'user__fname', 'user__name', 'user__oname',)
search_fields = ('ip', 'user__email', 'user__fname', 'user__name', 'user__oname', 'user__id',)
class UserRequestDataAdmin(admin.ModelAdmin):
search_fields = ('row__ip', )
#class UserSyncAdmin(admin.ModelAdmin):
# list_display = ('user', 'source', 'dist', 'date', 'f_date', 'result',)
#admin.site.register(UserSync, UserSyncAdmin)
admin.site.register(UserRequest, UserRequestAdmin)
admin.site.register(UserRequestData, UserRequestDataAdmin)
admin.site.register(Document, DocumentAdmin)

@ -1,491 +1,497 @@
# coding=utf-8
import datetime
from django.contrib import auth
from django.http import Http404
from access.models import User, Subscription, sent_registration
from lms.decors import api_decor
from lms.regex import check_email
from lms.tools import condition_factory, check_set_password
from management.letters import sent_active_new_email, sent_good_activation, sent_accept_forgot
@api_decor(without_auth=True)
def search_user(request, context):
context['code'] = '0'
if request.user.is_authenticated():
if request.GET.get('user'):
context['code'] = '1' if User.objects.filter(email=request.GET.get('user')).exists() else '0'
return context
@api_decor(without_auth=False)
def find_user(request, context):
if request.user.is_authenticated() and request.user.in_role in ['T', 'S2', 'A']:
if request.GET.get('user'):
context['code'] = '1'
context['data'] = [{'str': str(user), 'ava': user.get_image_url(), 'email': user.email, 'id': user.id} for user in User.objects.filter(email__icontains=request.GET['user'])]
else:
context['response'] = u'Параметры не переданы'
context['code'] = '0'
return context
else:
raise Http404
@api_decor(without_auth=False)
def change_private(request, context):
if 'type' in request.POST:
request.user.private = request.POST['type']
request.user.save()
return context
@api_decor(without_auth=False)
def resent_active_email(request, context):
sent_registration(request.user, title=u'Повторное письмо активации')
context['code'] = '1'
return context
@api_decor(without_auth=True)
def check_auth(request, context):
if request.user.is_authenticated():
context['code'] = '0'
else:
context['code'] = '1'
return context
@api_decor(without_auth=True)
def logout(request, context):
if request.user.is_authenticated():
context['code'] = '0'
else:
context['code'] = '1'
return context
@api_decor(without_auth=False)
def send_settings_data(request, context):
# Изменение данных пользователя
context['code'] = '0'
request.user.oname = request.POST['user_settings_oname']
request.user.avatar = request.POST['avatar_code']
request.user.city = request.POST['user_settings_city']
if request.POST.get('user_settings_bday'):
try:
request.user.b_day = datetime.datetime.strptime(request.POST['user_settings_bday'], '%d.%m.%Y').date()
except ValueError:
context['response'] = u'Дата рождения указана в неверном формате. Пример: 18.11.1990'
return context
if request.POST.get('user_settings_fname'):
request.user.fname = request.POST['user_settings_fname']
else:
context['response'] = u'Укажите вашу фамилию'
return context
if request.POST.get('user_settings_name'):
request.user.name = request.POST['user_settings_name']
else:
context['response'] = u'Укажите ваше имя'
return context
if request.POST.get('user_settings_phone'):
if request.user.phone != request.POST['user_settings_phone']:
request.user.back_phone = request.user.phone
request.user.phone = request.POST['user_settings_phone']
else:
context['response'] = u'Укажите ваш телефон'
return context
if request.POST.get('user_settings_email') and check_email(request.POST['user_settings_email']):
if request.POST['user_settings_email'].lower() != request.user.email:
email = request.POST['user_settings_email'].lower()
if not User.objects.filter(email=email).exists():
request.user.changed_email = request.POST['user_settings_email'].lower()
request.user.change_token()
sent_active_new_email(request.user)
context['response'] = u'Данные изменены. Для изменения поля email, необходимо подтвердить владение ' \
u'им. На указанный почтовый ящик выслано письмо активации.'
else:
context['response'] = u'Пользователь с таким email уже существует'
return context
else:
context['response'] = u'Укажите ваш email'
return context
context['code'] = '1'
request.user.save()
return context
@api_decor(without_auth=False)
def get_settings_data(request, context):
# Отправка данных пользователя
context['code'] = '1'
context['data'] = {
'short_name': request.user.get_short_name(),
'avatar_code': request.user.avatar,
'avatar': request.user.get_image_url(type_in='big'),
'fname': request.user.fname,
'name': request.user.name,
'oname': request.user.oname,
'phone': request.user.get_phone(),
'email': request.user.email,
'city': request.user.city,
'bday': ''
}
if request.user.b_day:
context['data']['bday'] = '{0}.{1}.{2}'.format(request.user.b_day.day, request.user.b_day.month, request.user.b_day.year)
return context
@api_decor(without_auth=False)
def send_subscription_data(request, context):
# Сохранение выбора подписок
context['code'] = '1'
subscription = Subscription.objects.get(owner=request.user)
right_map = subscription.right_map(None)
context['data'] = []
for i, x in right_map.items():
if 'subscription_{0}'.format(i) in request.POST:
if not x:
subscription.set_right(i, True)
else:
if x:
subscription.set_right(i, False)
return context
@api_decor(without_auth=False)
def get_subscription_data(request, context):
# Получение подписок пользователя
context['code'] = '1'
context['data'] = {}
subscription, c = Subscription.objects.get_or_create(owner=request.user)
for i, n in subscription.right_map(None).items():
context['data'][i] = n
return context
@api_decor(without_auth=False)
def change_password(request, context):
# Изменение данных о профиле
context['data'] = []
if request.POST.get('old_password'):
old_password = request.POST['old_password']
if request.user.check_password(old_password):
if request.POST.get('password1'):
password1 = request.POST['password1']
ps, ms = check_set_password(request.POST['password1'])
if not ps:
context['response'] = ms
context['code'] = '0'
else:
if request.POST.get('password2'):
password2 = request.POST['password2']
if password1 == password2:
user = User.objects.get(id=request.user.id)
user.set_password(password1)
user.save()
user._set_to_sync()
context['response'] = u'Пароль изменен. Авторизуйтесь используя новый пароль.'
context['code'] = '1'
else:
context['response'] = u'Новые пароли не совпадают'
context['code'] = '0'
else:
context['response'] = u'Повторите введеный пароль'
context['code'] = '0'
else:
context['response'] = u'Поле нового пароля не заполнено'
context['code'] = '0'
else:
context['response'] = u'Старый пароль введен не верно'
context['code'] = '0'
else:
context['response'] = u'Поле старого пароля не заполнено'
context['code'] = '0'
return context
@api_decor(without_auth=False, need_keys=['id'], method='GET', check_request=True)
def get_user_role(request, context):
# Получение роли пользователя для руководителя в его профиле
# TODO: Убрать изменение ролей из профиля пользователя
if request.user.in_role == 'S' or request.user.in_role == 'A':
try:
user = User.objects.get(id=request.GET['id'])
except User.DoesNotExist:
context['code'] = '0'
else:
context['code'] = '1'
context['data'] = user.in_role
else:
raise Http404
return context
@api_decor(without_auth=False, need_keys=['new_role_user_id', 'new_role_name'], method='GET', check_request=True)
def new_role(request, context):
# Присвоение роли в профиле руководителя
# TODO: Убрать присвоение
if request.user.in_role == 'S' or request.user.in_role == 'A':
try:
user = User.objects.get(id=request.GET['new_role_user_id'])
except User.DoesNotExist:
raise Http404
else:
user.in_role = request.GET['new_role_name']
user.save()
context['code'] = '1'
else:
raise Http404
return context
@api_decor(without_auth=True)
def check_active(request, context):
# Проверка статуса активации пользователя
# Используется для доступов
if request.user.is_active and request.user.reg_status == '4':
context['code'] = '1'
else:
context['code'] = '0'
return context
@api_decor(without_auth=True)
def reg_step(request, context):
# Процедура активации пользователя
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Не верно передан email'},
{'condition': request.POST.get('token'), 'error': u'Не верно передан токен'},
{'condition': request.POST.get('step'), 'error': u'Не верно передн этап'}, ])
context['data'] = {}
if condition['code'] == '1':
try:
email = request.POST['email'].lower()
user = User.objects.get(email=email, token=request.POST['token'])
except User.DoesNotExist:
context['code'] = '0'
context['data']['message'] = u'Запрашиваемый пользователь не найден'
else:
context['code'] = '0'
if request.POST['step'] == '1':
# Проверка пароля
if request.POST.get('password1'):
if request.POST.get('password2'):
if request.POST['password1'] == request.POST['password2']:
ps, ms = check_set_password(request.POST['password1'])
if not ps:
context['data']['message'] = ms
context['data']['inputs'] = ['password1', 'password2']
context['code'] = '0'
else:
user.set_password(request.POST['password1'])
user.reg_status = '2'
user.save()
context['code'] = '1'
else:
context['data']['message'] = u'Введеные пароли не совпадают'
context['data']['inputs'] = ['password1', 'password2']
else:
context['data']['message'] = u'Повторите введеный пароль'
context['data']['inputs'] = ['password2']
else:
context['data']['message'] = u'Введите пароль'
context['data']['inputs'] = ['password1']
return context
elif request.POST['step'] == '2':
# Проверка Телефона
if request.POST.get('fname'):
if request.POST.get('name'):
if request.POST.get('phone'):
user.phone = request.POST['phone']
user.name = request.POST['name']
user.fname = request.POST['fname']
user.city = request.POST['city']
if request.POST.get('bday'):
try:
user.b_day = datetime.datetime.strptime(request.POST['bday'], '%d.%m.%Y').date()
except ValueError:
user.b_day = datetime.datetime.strptime(request.POST['bday'], '%d.%m.%y').date()
user.reg_status = '3'
user.save()
context['code'] = '1'
else:
context['data']['message'] = u'Введите Телефон'
context['data']['inputs'] = ['phone']
else:
context['data']['message'] = u'Введите Имя'
context['data']['inputs'] = ['name']
else:
context['data']['message'] = u'Введите Фамилию'
context['data']['inputs'] = ['fname']
elif request.POST['step'] == '3':
# Проверка фотографии
if request.POST.get('avatar_code'):
user.avatar = request.POST['avatar_code']
user.reg_status = '4'
user.is_active = True
user.save()
user._set_to_sync()
sent_good_activation(user)
context['code'] = '1'
else:
context['code'] = '0'
context['data']['message'] = u'Этап активации указан не верно'
else:
context['data']['message'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def registration(request, context):
# Форма стандартногоз аведения пользователя
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Вы не ввели email'}])
if condition['code'] == '1':
try:
email = request.POST['email'].lower()
user = User.objects.get(email=email)
except User.DoesNotExist:
if request.POST.get('password1'):
if request.POST.get('password2'):
if request.POST['password1'] == request.POST['password2']:
ps, ms = check_set_password(request.POST['password1'])
if not ps:
context['response'] = ms
context['code'] = '0'
else:
email = request.POST['email'].lower()
user = User.objects.create_user(email=email)
user.set_password(request.POST['password1'])
user.reg_status = '2'
user.save()
context['code'] = '1'
else:
context['response'] = u'Введеные пароли не совпадают'
context['code'] = '0'
else:
context['response'] = u'Повторите введеный пароль'
context['code'] = '0'
else:
context['response'] = u'Введите пароль'
context['code'] = '0'
else:
if user.is_active and user.reg_status == '4':
context['code'] = '0'
context[
'response'] = u'Пользователь с таким email уже существует и активен. ' \
u'Авторизуйтесь или попробуйте восстановить пароль.'
else:
context['code'] = '0'
sent_registration(user, title=u'Повторное письмо активации')
context[
'response'] = u'Пользователь с таким email уже существует, но не был активирован. ' \
u'Вам было выслано повторное письмо активации.'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def auth_in(request, context):
# Авторизация
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Вы не ввели email'},
{'condition': request.POST.get('password'), 'error': u'Вы не ввели пароль'}
])
if condition['code'] == '1':
email = request.POST['email'].lower()
user = auth.authenticate(email=email, password=request.POST.get('password'))
if user is not None:
context['code'] = '1'
auth.login(request, user)
user.set_request_data(request)
elif user is None:
context['response'] = u'По введенным данным пользователь не найден'
context['code'] = '0'
else:
context['response'] = u"Не верные данные. Повторите попытку"
context['code'] = '0'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def auth_from_admin(request, context):
# Авторизация
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Вы не ввели email'},
{'condition': request.POST.get('password'), 'error': u'Вы не ввели пароль'},
{'condition': request.POST.get('token'), 'error': u'Вы не ввели свой токен'},
{'condition': request.user.is_staff and request.user.is_admin, 'error': u'У вас нет прав'}
])
if condition['code'] == '1':
email = request.POST['email'].lower()
user = auth.authenticate(email=email,
password=request.POST.get('password'),
token=request.POST.get('token'))
if user is not None:
context['code'] = '1'
auth.login(request, user)
request.user.change_token()
elif user is None:
context['response'] = u'По введенным данным пользователь не найден'
context['code'] = '0'
else:
context['response'] = u"Не верные данные. Повторите попытку"
context['code'] = '0'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def forgot(request, context):
# Форма восстановления пароля
condition = condition_factory([
{'condition': request.GET.get('email'), 'error': u'Email не указан'},
{'condition': check_email(request.GET['email']), 'error': u'Email введен не верно'}
])
if condition['code'] == '1':
try:
email = request.GET['email'].lower()
user = User.objects.get(email=email)
except User.DoesNotExist:
context['response'] = u'Пользователя с таким email не существует.'
context['code'] = '0'
else:
user.change_token()
sent_accept_forgot(user)
context['code'] = '1'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
# coding=utf-8
import datetime
from django.contrib import auth
from django.http import Http404
from access.models import User, Subscription, sent_registration, UserRequest
from lms.decors import api_decor
from lms.regex import check_email
from lms.tools import condition_factory, check_set_password
from management.letters import sent_active_new_email, sent_good_activation, sent_accept_forgot
@api_decor(without_auth=True)
def search_user(request, context):
context['code'] = '0'
if request.user.is_authenticated():
if request.GET.get('user'):
context['code'] = '1' if User.objects.filter(email=request.GET.get('user')).exists() else '0'
return context
@api_decor(without_auth=False)
def find_user(request, context):
if request.user.is_authenticated() and request.user.in_role in ['T', 'S2', 'A']:
if request.GET.get('user'):
context['code'] = '1'
context['data'] = [{'str': str(user), 'ava': user.get_image_url(), 'email': user.email, 'id': user.id} for user in User.objects.filter(email__icontains=request.GET['user'])]
else:
context['response'] = u'Параметры не переданы'
context['code'] = '0'
return context
else:
raise Http404
@api_decor(without_auth=False)
def change_private(request, context):
if 'type' in request.POST:
request.user.private = request.POST['type']
request.user.save()
return context
@api_decor(without_auth=False)
def resent_active_email(request, context):
sent_registration(request.user, title=u'Повторное письмо активации')
context['code'] = '1'
return context
@api_decor(without_auth=True)
def check_auth(request, context):
if request.user.is_authenticated():
context['code'] = '0'
else:
context['code'] = '1'
return context
@api_decor(without_auth=True)
def logout(request, context):
if request.user.is_authenticated():
context['code'] = '0'
else:
context['code'] = '1'
return context
@api_decor(without_auth=False)
def send_settings_data(request, context):
# Изменение данных пользователя
context['code'] = '0'
request.user.oname = request.POST['user_settings_oname']
request.user.avatar = request.POST['avatar_code']
request.user.city = request.POST['user_settings_city']
if request.POST.get('user_settings_bday'):
try:
request.user.b_day = datetime.datetime.strptime(request.POST['user_settings_bday'], '%d.%m.%Y').date()
except ValueError:
context['response'] = u'Дата рождения указана в неверном формате. Пример: 18.11.1990'
return context
if request.POST.get('user_settings_fname'):
request.user.fname = request.POST['user_settings_fname']
else:
context['response'] = u'Укажите вашу фамилию'
return context
if request.POST.get('user_settings_name'):
request.user.name = request.POST['user_settings_name']
else:
context['response'] = u'Укажите ваше имя'
return context
if request.POST.get('user_settings_phone'):
if request.user.phone != request.POST['user_settings_phone']:
request.user.back_phone = request.user.phone
request.user.phone = request.POST['user_settings_phone']
else:
context['response'] = u'Укажите ваш телефон'
return context
if request.POST.get('user_settings_email') and check_email(request.POST['user_settings_email']):
if request.POST['user_settings_email'].lower() != request.user.email:
email = request.POST['user_settings_email'].lower()
if not User.objects.filter(email=email).exists():
request.user.changed_email = request.POST['user_settings_email'].lower()
request.user.change_token()
sent_active_new_email(request.user)
context['response'] = u'Данные изменены. Для изменения поля email, необходимо подтвердить владение ' \
u'им. На указанный почтовый ящик выслано письмо активации.'
else:
context['response'] = u'Пользователь с таким email уже существует'
return context
else:
context['response'] = u'Укажите ваш email'
return context
context['code'] = '1'
request.user.save()
return context
@api_decor(without_auth=False)
def get_settings_data(request, context):
# Отправка данных пользователя
context['code'] = '1'
context['data'] = {
'short_name': request.user.get_short_name(),
'avatar_code': request.user.avatar,
'avatar': request.user.get_image_url(type_in='big'),
'fname': request.user.fname,
'name': request.user.name,
'oname': request.user.oname,
'phone': request.user.get_phone(),
'email': request.user.email,
'city': request.user.city,
'bday': ''
}
if request.user.b_day:
context['data']['bday'] = '{0}.{1}.{2}'.format(request.user.b_day.day, request.user.b_day.month, request.user.b_day.year)
return context
@api_decor(without_auth=False)
def send_subscription_data(request, context):
# Сохранение выбора подписок
context['code'] = '1'
subscription = Subscription.objects.get(owner=request.user)
right_map = subscription.right_map(None)
context['data'] = []
for i, x in right_map.items():
if 'subscription_{0}'.format(i) in request.POST:
if not x:
subscription.set_right(i, True)
else:
if x:
subscription.set_right(i, False)
return context
@api_decor(without_auth=False)
def get_subscription_data(request, context):
# Получение подписок пользователя
context['code'] = '1'
context['data'] = {}
subscription, c = Subscription.objects.get_or_create(owner=request.user)
for i, n in subscription.right_map(None).items():
context['data'][i] = n
return context
@api_decor(without_auth=False)
def change_password(request, context):
# Изменение данных о профиле
context['data'] = []
if request.POST.get('old_password'):
old_password = request.POST['old_password']
if request.user.check_password(old_password):
if request.POST.get('password1'):
password1 = request.POST['password1']
ps, ms = check_set_password(request.POST['password1'])
if not ps:
context['response'] = ms
context['code'] = '0'
else:
if request.POST.get('password2'):
password2 = request.POST['password2']
if password1 == password2:
user = User.objects.get(id=request.user.id)
user.set_password(password1)
user.save()
context['response'] = u'Пароль изменен. Авторизуйтесь используя новый пароль.'
context['code'] = '1'
else:
context['response'] = u'Новые пароли не совпадают'
context['code'] = '0'
else:
context['response'] = u'Повторите введеный пароль'
context['code'] = '0'
else:
context['response'] = u'Поле нового пароля не заполнено'
context['code'] = '0'
else:
context['response'] = u'Старый пароль введен не верно'
context['code'] = '0'
else:
context['response'] = u'Поле старого пароля не заполнено'
context['code'] = '0'
return context
@api_decor(without_auth=False, need_keys=['id'], method='GET', check_request=True)
def get_user_role(request, context):
# Получение роли пользователя для руководителя в его профиле
# TODO: Убрать изменение ролей из профиля пользователя
if request.user.in_role == 'S' or request.user.in_role == 'A':
try:
user = User.objects.get(id=request.GET['id'])
except User.DoesNotExist:
context['code'] = '0'
else:
context['code'] = '1'
context['data'] = user.in_role
else:
raise Http404
return context
@api_decor(without_auth=False, need_keys=['new_role_user_id', 'new_role_name'], method='GET', check_request=True)
def new_role(request, context):
# Присвоение роли в профиле руководителя
# TODO: Убрать присвоение
if request.user.in_role == 'S' or request.user.in_role == 'A':
try:
user = User.objects.get(id=request.GET['new_role_user_id'])
except User.DoesNotExist:
raise Http404
else:
user.in_role = request.GET['new_role_name']
user.save()
context['code'] = '1'
else:
raise Http404
return context
@api_decor(without_auth=True)
def check_active(request, context):
# Проверка статуса активации пользователя
# Используется для доступов
if request.user.is_active and request.user.reg_status == '4':
context['code'] = '1'
else:
context['code'] = '0'
return context
@api_decor(without_auth=True)
def reg_step(request, context):
# Процедура активации пользователя
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Не верно передан email'},
{'condition': request.POST.get('token'), 'error': u'Не верно передан токен'},
{'condition': request.POST.get('step'), 'error': u'Не верно передн этап'}, ])
context['data'] = {}
if condition['code'] == '1':
try:
email = request.POST['email'].lower()
user = User.objects.get(email=email, token=request.POST['token'])
except User.DoesNotExist:
context['code'] = '0'
context['data']['message'] = u'Запрашиваемый пользователь не найден'
else:
context['code'] = '0'
if request.POST['step'] == '1':
# Проверка пароля
if request.POST.get('password1'):
if request.POST.get('password2'):
if request.POST['password1'] == request.POST['password2']:
ps, ms = check_set_password(request.POST['password1'])
if not ps:
context['data']['message'] = ms
context['data']['inputs'] = ['password1', 'password2']
context['code'] = '0'
else:
user.set_password(request.POST['password1'])
user.reg_status = '2'
user.save()
context['code'] = '1'
else:
context['data']['message'] = u'Введеные пароли не совпадают'
context['data']['inputs'] = ['password1', 'password2']
else:
context['data']['message'] = u'Повторите введеный пароль'
context['data']['inputs'] = ['password2']
else:
context['data']['message'] = u'Введите пароль'
context['data']['inputs'] = ['password1']
return context
elif request.POST['step'] == '2':
# Проверка Телефона
if request.POST.get('fname'):
if request.POST.get('name'):
if request.POST.get('phone'):
user.phone = request.POST['phone']
user.name = request.POST['name']
user.fname = request.POST['fname']
user.city = request.POST['city']
if request.POST.get('bday'):
try:
user.b_day = datetime.datetime.strptime(request.POST['bday'], '%d.%m.%Y').date()
except ValueError:
user.b_day = datetime.datetime.strptime(request.POST['bday'], '%d.%m.%y').date()
user.reg_status = '3'
user.save()
context['code'] = '1'
else:
context['data']['message'] = u'Введите Телефон'
context['data']['inputs'] = ['phone']
else:
context['data']['message'] = u'Введите Имя'
context['data']['inputs'] = ['name']
else:
context['data']['message'] = u'Введите Фамилию'
context['data']['inputs'] = ['fname']
elif request.POST['step'] == '3':
# Проверка фотографии
if request.POST.get('avatar_code'):
user.avatar = request.POST['avatar_code']
user.reg_status = '4'
user.is_active = True
user.save()
user._set_to_sync()
sent_good_activation(user)
context['code'] = '1'
else:
context['code'] = '0'
context['data']['message'] = u'Этап активации указан не верно'
else:
context['data']['message'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def registration(request, context):
# Форма стандартногоз аведения пользователя
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Вы не ввели email'}])
if condition['code'] == '1':
try:
email = request.POST['email'].lower()
user = User.objects.get(email=email)
except User.DoesNotExist:
if request.POST.get('password1'):
if request.POST.get('password2'):
if request.POST['password1'] == request.POST['password2']:
ps, ms = check_set_password(request.POST['password1'])
if not ps:
context['response'] = ms
context['code'] = '0'
else:
email = request.POST['email'].lower()
user = User.objects.create_user(email=email)
user.set_password(request.POST['password1'])
user.reg_status = '2'
user.save()
context['code'] = '1'
else:
context['response'] = u'Введеные пароли не совпадают'
context['code'] = '0'
else:
context['response'] = u'Повторите введеный пароль'
context['code'] = '0'
else:
context['response'] = u'Введите пароль'
context['code'] = '0'
else:
if user.is_active and user.reg_status == '4':
context['code'] = '0'
context[
'response'] = u'Пользователь с таким email уже существует и активен. ' \
u'Авторизуйтесь или попробуйте восстановить пароль.'
else:
context['code'] = '0'
sent_registration(user, title=u'Повторное письмо активации')
context[
'response'] = u'Пользователь с таким email уже существует, но не был активирован. ' \
u'Вам было выслано повторное письмо активации.'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def auth_in(request, context):
# Авторизация
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Вы не ввели email'},
{'condition': request.POST.get('password'), 'error': u'Вы не ввели пароль'}
])
if condition['code'] == '1':
email = request.POST['email'].lower()
user = auth.authenticate(email=email, password=request.POST.get('password'))
if user is not None:
if user.block:
context['code'] = '0'
context['data'] = []
context['data']['ERROR'] = 'BLOCK'
context['data']['data'] = UserRequest.objects.filter(user__email=email).count()
else:
context['code'] = '1'
auth.login(request, user)
user.set_request_data(request)
elif user is None:
context['response'] = u'По введенным данным пользователь не найден'
context['code'] = '0'
else:
context['response'] = u"Не верные данные. Повторите попытку"
context['code'] = '0'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def auth_from_admin(request, context):
# Авторизация
condition = condition_factory([
{'condition': request.POST.get('email'), 'error': u'Вы не ввели email'},
{'condition': request.POST.get('password'), 'error': u'Вы не ввели пароль'},
{'condition': request.POST.get('token'), 'error': u'Вы не ввели свой токен'},
{'condition': request.user.is_staff and request.user.is_admin, 'error': u'У вас нет прав'}
])
if condition['code'] == '1':
email = request.POST['email'].lower()
user = auth.authenticate(email=email,
password=request.POST.get('password'),
token=request.POST.get('token'))
if user is not None:
context['code'] = '1'
auth.login(request, user)
request.user.change_token()
elif user is None:
context['response'] = u'По введенным данным пользователь не найден'
context['code'] = '0'
else:
context['response'] = u"Не верные данные. Повторите попытку"
context['code'] = '0'
else:
context['response'] = condition['response']
context['code'] = '0'
return context
@api_decor(without_auth=True)
def forgot(request, context):
# Форма восстановления пароля
condition = condition_factory([
{'condition': request.GET.get('email'), 'error': u'Email не указан'},
{'condition': check_email(request.GET['email']), 'error': u'Email введен не верно'}
])
if condition['code'] == '1':
try:
email = request.GET['email'].lower()
user = User.objects.get(email=email)
except User.DoesNotExist:
context['response'] = u'Пользователя с таким email не существует.'
context['code'] = '0'
else:
user.change_token()
sent_accept_forgot(user)
context['code'] = '1'
else:
context['response'] = condition['response']
context['code'] = '0'
return context

@ -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,90 +1,90 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals
import access.models
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 = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('deactivate', models.BooleanField(default=False, verbose_name='\u0423\u0432\u043e\u043b\u0438\u0442\u044c')),
('email', models.EmailField(blank=True, db_index=True, editable=False, max_length=255, unique=True, verbose_name=b'email')),
('changed_email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='\u042f\u0449\u0438\u043a \u043d\u0430 \u0437\u0430\u043c\u0435\u043d\u0443')),
('phone', models.CharField(default=b'', max_length=255, verbose_name='\u0422\u0435\u043b\u0435\u0444\u043e\u043d')),
('back_phone', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041f\u0440\u0435\u0434\u0438\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d')),
('status', models.CharField(choices=[(b'ON', b'on-line'), (b'OFF', b'off-line')], default=b'ON', max_length=9)),
('in_role', models.CharField(choices=[(b'U', '\u0421\u0442\u0443\u0434\u0435\u043d\u0442 \u0448\u043a\u043e\u043b\u044b'), (b'T', '\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c'), (b'M', '\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440'), (b'S', '\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'), (b'S2', '\u041e\u043a\u043e \u0441\u0430\u0443\u0440\u043e\u043d\u0430'), (b'A', '\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440')], default=b'U', max_length=2, verbose_name='\u0420\u043e\u043b\u044c')),
('city', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0413\u043e\u0440\u043e\u0434')),
('b_day', models.DateField(blank=True, null=True, verbose_name='\u0414\u0435\u043d\u044c \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f')),
('token', models.CharField(blank=True, default=b'', max_length=255)),
('activate_time', models.DateTimeField(default=access.models.get_activate_time, verbose_name='\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e')),
('reg_status', models.CharField(choices=[(b'1', b'\xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c'), (b'2', b'\xd0\x9e \xd1\x81\xd0\xb5\xd0\xb1\xd0\xb5'), (b'3', b'\xd0\xa4\xd0\xbe\xd1\x82\xd0\xbe'), (b'4', b'\xd0\x97\xd0\xb0\xd0\xba\xd0\xbe\xd0\xbd\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb0')], default=b'1', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438')),
('is_active', models.BooleanField(default=False)),
('is_admin', models.BooleanField(default=False)),
('is_staff', models.BooleanField(default=False)),
('avatar', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0430\u0432\u0430\u0442\u0430\u0440\u0430')),
('in_avatar', models.ImageField(blank=True, editable=False, null=True, upload_to=b'', verbose_name='\u041d\u0430\u0448 \u0430\u0432\u0430\u0442\u0430\u0440')),
('fname', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0424\u0430\u043c\u0438\u043b\u0438\u044f')),
('name', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0418\u043c\u044f')),
('oname', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e')),
('skype', models.CharField(blank=True, default=b'', max_length=300)),
('facebook', models.CharField(blank=True, default=b'', max_length=255)),
('vk', models.CharField(blank=True, default=b'', max_length=255)),
('linkedin', models.CharField(blank=True, default=b'', max_length=255)),
('odnoklassniki', models.CharField(blank=True, default=b'', max_length=255)),
('date_joined', models.DateTimeField(default=datetime.datetime.now)),
],
options={
'verbose_name': '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',
'verbose_name_plural': '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438',
},
),
migrations.CreateModel(
name='ActionJ',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('a_type', models.CharField(choices=[(b'B', b'b-default'), (b'P', b'b-primary'), (b'S', b'b-success'), (b'I', b'b-info'), (b'W', b'b-warning'), (b'D', b'b-danger')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f')),
('place', models.CharField(max_length=100, verbose_name='\u041c\u0435\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f')),
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f')),
('text', models.TextField(verbose_name='\u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f')),
('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': '\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438',
'verbose_name_plural': '\u0416\u0443\u0440\u043d\u0430\u043b\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0435\u0439',
},
),
migrations.CreateModel(
name='Subscription',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('news', models.BooleanField(default=True, verbose_name='\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438')),
('teacher', models.BooleanField(default=True, verbose_name='\u041e\u0442\u0432\u0435\u0442\u044b \u043f\u0440\u0435\u043f\u043e\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f')),
('new_comments', models.BooleanField(default=True, verbose_name='\u041e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438')),
('send_sms', models.BooleanField(default=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c sms')),
('courses', models.BooleanField(default=True, verbose_name='\u041d\u043e\u0432\u044b\u0435 \u043a\u0443\u0440\u0441\u044b')),
('owner', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rights_owner', to=settings.AUTH_USER_MODEL, verbose_name='\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446')),
],
options={
'verbose_name': '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430',
'verbose_name_plural': '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0438',
},
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-03-18 16:46
from __future__ import unicode_literals
import access.models
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 = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('deactivate', models.BooleanField(default=False, verbose_name='\u0423\u0432\u043e\u043b\u0438\u0442\u044c')),
('email', models.EmailField(blank=True, db_index=True, editable=False, max_length=255, unique=True, verbose_name=b'email')),
('changed_email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='\u042f\u0449\u0438\u043a \u043d\u0430 \u0437\u0430\u043c\u0435\u043d\u0443')),
('phone', models.CharField(default=b'', max_length=255, verbose_name='\u0422\u0435\u043b\u0435\u0444\u043e\u043d')),
('back_phone', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041f\u0440\u0435\u0434\u0438\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u043b\u0435\u0444\u043e\u043d')),
('status', models.CharField(choices=[(b'ON', b'on-line'), (b'OFF', b'off-line')], default=b'ON', max_length=9)),
('in_role', models.CharField(choices=[(b'U', '\u0421\u0442\u0443\u0434\u0435\u043d\u0442 \u0448\u043a\u043e\u043b\u044b'), (b'T', '\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c'), (b'M', '\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440'), (b'S', '\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'), (b'S2', '\u041e\u043a\u043e \u0441\u0430\u0443\u0440\u043e\u043d\u0430'), (b'A', '\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440')], default=b'U', max_length=2, verbose_name='\u0420\u043e\u043b\u044c')),
('city', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0413\u043e\u0440\u043e\u0434')),
('b_day', models.DateField(blank=True, null=True, verbose_name='\u0414\u0435\u043d\u044c \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f')),
('token', models.CharField(blank=True, default=b'', max_length=255)),
('activate_time', models.DateTimeField(default=access.models.get_activate_time, verbose_name='\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e')),
('reg_status', models.CharField(choices=[(b'1', b'\xd0\x9f\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbb\xd1\x8c'), (b'2', b'\xd0\x9e \xd1\x81\xd0\xb5\xd0\xb1\xd0\xb5'), (b'3', b'\xd0\xa4\xd0\xbe\xd1\x82\xd0\xbe'), (b'4', b'\xd0\x97\xd0\xb0\xd0\xba\xd0\xbe\xd0\xbd\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb0')], default=b'1', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438')),
('is_active', models.BooleanField(default=False)),
('is_admin', models.BooleanField(default=False)),
('is_staff', models.BooleanField(default=False)),
('avatar', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0430\u0432\u0430\u0442\u0430\u0440\u0430')),
('in_avatar', models.ImageField(blank=True, editable=False, null=True, upload_to=b'', verbose_name='\u041d\u0430\u0448 \u0430\u0432\u0430\u0442\u0430\u0440')),
('fname', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0424\u0430\u043c\u0438\u043b\u0438\u044f')),
('name', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0418\u043c\u044f')),
('oname', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041e\u0442\u0447\u0435\u0441\u0442\u0432\u043e')),
('skype', models.CharField(blank=True, default=b'', max_length=300)),
('facebook', models.CharField(blank=True, default=b'', max_length=255)),
('vk', models.CharField(blank=True, default=b'', max_length=255)),
('linkedin', models.CharField(blank=True, default=b'', max_length=255)),
('odnoklassniki', models.CharField(blank=True, default=b'', max_length=255)),
('date_joined', models.DateTimeField(default=datetime.datetime.now)),
],
options={
'verbose_name': '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',
'verbose_name_plural': '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438',
},
),
migrations.CreateModel(
name='ActionJ',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('a_type', models.CharField(choices=[(b'B', b'b-default'), (b'P', b'b-primary'), (b'S', b'b-success'), (b'I', b'b-info'), (b'W', b'b-warning'), (b'D', b'b-danger')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f')),
('place', models.CharField(max_length=100, verbose_name='\u041c\u0435\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f')),
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f')),
('text', models.TextField(verbose_name='\u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f')),
('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': '\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438',
'verbose_name_plural': '\u0416\u0443\u0440\u043d\u0430\u043b\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0435\u0439',
},
),
migrations.CreateModel(
name='Subscription',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('news', models.BooleanField(default=True, verbose_name='\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u043d\u043e\u0432\u043e\u0441\u0442\u0438')),
('teacher', models.BooleanField(default=True, verbose_name='\u041e\u0442\u0432\u0435\u0442\u044b \u043f\u0440\u0435\u043f\u043e\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f')),
('new_comments', models.BooleanField(default=True, verbose_name='\u041e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438')),
('send_sms', models.BooleanField(default=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c sms')),
('courses', models.BooleanField(default=True, verbose_name='\u041d\u043e\u0432\u044b\u0435 \u043a\u0443\u0440\u0441\u044b')),
('owner', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rights_owner', to=settings.AUTH_USER_MODEL, verbose_name='\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446')),
],
options={
'verbose_name': '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430',
'verbose_name_plural': '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0438',
},
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-05 20:45
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='user',
name='in_role',
field=models.CharField(choices=[(b'U', '\u0421\u0442\u0443\u0434\u0435\u043d\u0442 \u0448\u043a\u043e\u043b\u044b'), (b'T', '\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c'), (b'M', '\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440'), (b'S', '\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'), (b'S2', '\u041e\u043a\u043e \u0441\u0430\u0443\u0440\u043e\u043d\u0430'), (b'A', '\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'), (b'Ts', '\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c')], default=b'U', max_length=2, verbose_name='\u0420\u043e\u043b\u044c'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-05 20:45
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='user',
name='in_role',
field=models.CharField(choices=[(b'U', '\u0421\u0442\u0443\u0434\u0435\u043d\u0442 \u0448\u043a\u043e\u043b\u044b'), (b'T', '\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c'), (b'M', '\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440'), (b'S', '\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'), (b'S2', '\u041e\u043a\u043e \u0441\u0430\u0443\u0440\u043e\u043d\u0430'), (b'A', '\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'), (b'Ts', '\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c')], default=b'U', max_length=2, verbose_name='\u0420\u043e\u043b\u044c'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-12 21:45
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0002_auto_20160405_2045'),
]
operations = [
migrations.AddField(
model_name='user',
name='delay',
field=models.BooleanField(default=False, verbose_name='\u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-12 21:45
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0002_auto_20160405_2045'),
]
operations = [
migrations.AddField(
model_name='user',
name='delay',
field=models.BooleanField(default=False, verbose_name='\u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-12 21:52
from __future__ import unicode_literals
from django.db import migrations, models
import redactor.fields
class Migration(migrations.Migration):
dependencies = [
('access', '0003_user_delay'),
]
operations = [
migrations.AddField(
model_name='user',
name='delay_description',
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041f\u043e\u0432\u043e\u0434 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438'),
),
migrations.AlterField(
model_name='user',
name='delay',
field=models.BooleanField(default=False, help_text='\u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438', verbose_name='\u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-12 21:52
from __future__ import unicode_literals
from django.db import migrations, models
import redactor.fields
class Migration(migrations.Migration):
dependencies = [
('access', '0003_user_delay'),
]
operations = [
migrations.AddField(
model_name='user',
name='delay_description',
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041f\u043e\u0432\u043e\u0434 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438'),
),
migrations.AlterField(
model_name='user',
name='delay',
field=models.BooleanField(default=False, help_text='\u0415\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438', verbose_name='\u041c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438'),
),
]

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:27
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0004_auto_20160412_2152'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_description',
field=models.TextField(blank=True, verbose_name='\u041f\u043e\u0432\u043e\u0434 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:27
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0004_auto_20160412_2152'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_description',
field=models.TextField(blank=True, verbose_name='\u041f\u043e\u0432\u043e\u0434 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:42
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0005_auto_20160414_1527'),
]
operations = [
migrations.AddField(
model_name='user',
name='delay_date',
field=models.TextField(blank=True, default=datetime.datetime(2016, 4, 14, 15, 42, 6, 457603), verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:42
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0005_auto_20160414_1527'),
]
operations = [
migrations.AddField(
model_name='user',
name='delay_date',
field=models.TextField(blank=True, default=datetime.datetime(2016, 4, 14, 15, 42, 6, 457603), verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:43
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0006_user_delay_date'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.TextField(blank=True, default=datetime.datetime(2016, 4, 14, 15, 43, 33, 80232), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:43
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0006_user_delay_date'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.TextField(blank=True, default=datetime.datetime(2016, 4, 14, 15, 43, 33, 80232), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:47
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0007_auto_20160414_1543'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 14, 15, 47, 18, 142514), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 15:47
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0007_auto_20160414_1543'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 14, 15, 47, 18, 142514), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:41
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0008_auto_20160414_1547'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 14, 19, 41, 21, 863845), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:41
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0008_auto_20160414_1547'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 14, 19, 41, 21, 863845), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:44
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0009_auto_20160414_1941'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 14, 19, 44, 42, 129160), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-14 19:44
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0009_auto_20160414_1941'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 14, 19, 44, 42, 129160), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 17:49
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0010_auto_20160414_1944'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 20, 17, 49, 55, 401859), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 17:49
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0010_auto_20160414_1944'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 20, 17, 49, 55, 401859), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 18:19
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0011_auto_20160420_1749'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 20, 18, 19, 6, 238659), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-20 18:19
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0011_auto_20160420_1749'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 20, 18, 19, 6, 238659), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 18:08
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0012_auto_20160420_1819'),
]
operations = [
migrations.AddField(
model_name='user',
name='interactive_key',
field=models.CharField(blank=True, max_length=255, verbose_name='\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u044b\u0439 \u043a\u043b\u044e\u0447'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 18, 8, 50, 535390), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 18:08
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0012_auto_20160420_1819'),
]
operations = [
migrations.AddField(
model_name='user',
name='interactive_key',
field=models.CharField(blank=True, max_length=255, verbose_name='\u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u044b\u0439 \u043a\u043b\u044e\u0447'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 18, 8, 50, 535390), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 18:24
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0013_auto_20160421_1808'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 18, 24, 46, 904871), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 18:24
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0013_auto_20160421_1808'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 18, 24, 46, 904871), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 18:29
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0014_auto_20160421_1824'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 18, 29, 23, 185173), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 18:29
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0014_auto_20160421_1824'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 18, 29, 23, 185173), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 20:09
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0015_auto_20160421_1829'),
]
operations = [
migrations.AddField(
model_name='user',
name='private',
field=models.CharField(choices=[(b'A', b'\xd0\x92\xd1\x81\xd0\xb5\xd0\xbc\xd1\x83 \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80\xd0\xbd\xd0\xb5\xd1\x82\xd1\x83'), (b'U', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f\xd0\xbc lms'), (b'L', b'\xd0\x9f\xd0\xbe \xd0\xbf\xd1\x80\xd1\x8f\xd0\xbc\xd0\xbe\xd0\xb9 \xd1\x81\xd1\x81\xd1\x8b\xd0\xbb\xd0\xba\xd0\xb5'), (b'B', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbc\xd0\xbd\xd0\xb5')], default=b'A', max_length=1, verbose_name='\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044f'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 20, 9, 41, 221779), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 20:09
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0015_auto_20160421_1829'),
]
operations = [
migrations.AddField(
model_name='user',
name='private',
field=models.CharField(choices=[(b'A', b'\xd0\x92\xd1\x81\xd0\xb5\xd0\xbc\xd1\x83 \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80\xd0\xbd\xd0\xb5\xd1\x82\xd1\x83'), (b'U', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f\xd0\xbc lms'), (b'L', b'\xd0\x9f\xd0\xbe \xd0\xbf\xd1\x80\xd1\x8f\xd0\xbc\xd0\xbe\xd0\xb9 \xd1\x81\xd1\x81\xd1\x8b\xd0\xbb\xd0\xba\xd0\xb5'), (b'B', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbc\xd0\xbd\xd0\xb5')], default=b'A', max_length=1, verbose_name='\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044f'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 20, 9, 41, 221779), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 21:35
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0016_auto_20160421_2009'),
]
operations = [
migrations.AddField(
model_name='user',
name='last_time',
field=models.DateTimeField(default=datetime.datetime.now, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 21, 35, 2, 761309), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-21 21:35
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0016_auto_20160421_2009'),
]
operations = [
migrations.AddField(
model_name='user',
name='last_time',
field=models.DateTimeField(default=datetime.datetime.now, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 21, 21, 35, 2, 761309), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-22 15:55
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0017_auto_20160421_2135'),
]
operations = [
migrations.AddField(
model_name='user',
name='unique_role',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u043e\u043b\u044c'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 22, 15, 55, 55, 944230), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-04-22 15:55
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0017_auto_20160421_2135'),
]
operations = [
migrations.AddField(
model_name='user',
name='unique_role',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u043e\u043b\u044c'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 22, 15, 55, 55, 944230), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-24 16:46
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0018_auto_20160422_1555'),
]
operations = [
migrations.AddField(
model_name='user',
name='customer',
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044c'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 24, 16, 46, 31, 25686), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-04-24 16:46
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0018_auto_20160422_1555'),
]
operations = [
migrations.AddField(
model_name='user',
name='customer',
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044c'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 4, 24, 16, 46, 31, 25686), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0019_auto_20160424_1646'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 6, 13, 3, 19, 582728), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-06 13:03
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0019_auto_20160424_1646'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 6, 13, 3, 19, 582728), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,31 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 13:31
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0020_auto_20160506_1303'),
]
operations = [
migrations.AddField(
model_name='user',
name='refer',
field=models.CharField(choices=[(b'S', b'\xd0\xa1\xd0\xb0\xd0\xbc \xd0\xb7\xd0\xb0\xd1\x80\xd0\xb5\xd0\xb3\xd0\xb8\xd1\x81\xd1\x82\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbb\xd1\x81\xd1\x8f'), (b'B', b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xbb\xd0\xb5\xd1\x87\xd0\xb5\xd0\xbd')], default=b'S', max_length=1, null=True, verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a'),
),
migrations.AddField(
model_name='user',
name='refer_source',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 13, 31, 31, 19346), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 13:31
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0020_auto_20160506_1303'),
]
operations = [
migrations.AddField(
model_name='user',
name='refer',
field=models.CharField(choices=[(b'S', b'\xd0\xa1\xd0\xb0\xd0\xbc \xd0\xb7\xd0\xb0\xd1\x80\xd0\xb5\xd0\xb3\xd0\xb8\xd1\x81\xd1\x82\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbb\xd1\x81\xd1\x8f'), (b'B', b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xbb\xd0\xb5\xd1\x87\xd0\xb5\xd0\xbd')], default=b'S', max_length=1, null=True, verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a'),
),
migrations.AddField(
model_name='user',
name='refer_source',
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 13, 31, 31, 19346), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,41 +1,41 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 14:01
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0021_auto_20160509_1331'),
]
operations = [
migrations.CreateModel(
name='TrafSource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('on', models.BooleanField(default=True, verbose_name='\u0410\u0442\u0438\u0432\u0435\u043d')),
('url', models.URLField(verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0440\u0430\u0444\u0438\u043a\u0430')),
('token', models.CharField(max_length=255, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')),
('live_time', models.IntegerField(blank=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430')),
('date_start', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430')),
],
options={
'verbose_name': '\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0440\u0430\u0444\u0438\u043a\u0430',
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 14, 1, 37, 826573), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='refer',
field=models.CharField(choices=[(b'S', b'\xd0\x9e\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x87\xd0\xbd\xd0\xbe'), (b'B', b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xbb\xd0\xb5\xd1\x87\xd0\xb5\xd0\xbd')], default=b'S', max_length=1, null=True, verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 14:01
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0021_auto_20160509_1331'),
]
operations = [
migrations.CreateModel(
name='TrafSource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('on', models.BooleanField(default=True, verbose_name='\u0410\u0442\u0438\u0432\u0435\u043d')),
('url', models.URLField(verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0440\u0430\u0444\u0438\u043a\u0430')),
('token', models.CharField(max_length=255, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')),
('live_time', models.IntegerField(blank=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430')),
('date_start', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430')),
],
options={
'verbose_name': '\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0440\u0430\u0444\u0438\u043a\u0430',
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 14, 1, 37, 826573), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='refer',
field=models.CharField(choices=[(b'S', b'\xd0\x9e\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x87\xd0\xbd\xd0\xbe'), (b'B', b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xbb\xd0\xb5\xd1\x87\xd0\xb5\xd0\xbd')], default=b'S', max_length=1, null=True, verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a'),
),
]

@ -1,38 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 14:08
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('access', '0022_auto_20160509_1401'),
]
operations = [
migrations.CreateModel(
name='TrafHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('action', models.CharField(choices=[(b'G', b'\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd1\x85'), (b'C', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f'), (b'O', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x81\xd1\x87\xd0\xb5\xd1\x82\xd0\xb0')], max_length=1, verbose_name='\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435')),
('data', models.TextField(verbose_name='\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435')),
('result', models.BooleanField(default=False, verbose_name='\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430')),
('result_description', models.CharField(blank=True, max_length=255, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430')),
('date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f')),
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.TrafSource', verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430')),
],
options={
'verbose_name': '\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430',
'verbose_name_plural': '\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 14, 8, 4, 599702), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 14:08
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('access', '0022_auto_20160509_1401'),
]
operations = [
migrations.CreateModel(
name='TrafHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('action', models.CharField(choices=[(b'G', b'\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd1\x85'), (b'C', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f'), (b'O', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x81\xd1\x87\xd0\xb5\xd1\x82\xd0\xb0')], max_length=1, verbose_name='\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435')),
('data', models.TextField(verbose_name='\u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435')),
('result', models.BooleanField(default=False, verbose_name='\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430')),
('result_description', models.CharField(blank=True, max_length=255, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430')),
('date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f')),
('source', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='access.TrafSource', verbose_name='\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430')),
],
options={
'verbose_name': '\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430',
'verbose_name_plural': '\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 14, 8, 4, 599702), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,61 +1,61 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 15:37
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('access', '0023_auto_20160509_1408'),
]
operations = [
migrations.CreateModel(
name='TrafTokenHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('token', models.CharField(editable=False, max_length=255, verbose_name='\u0422\u043e\u043a\u0435\u043d')),
('live_time', models.IntegerField(editable=False, help_text='\u0412 \u0447\u0430\u0441\u0430\u0445', verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438')),
('date_start', models.DateTimeField(editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430')),
('date_end', models.DateTimeField(editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f')),
],
options={
'verbose_name': '\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043c\u0435\u043d\u044b \u0442\u043e\u043a\u0435\u043d\u0430',
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043c\u0435\u043d\u044b \u0442\u043e\u043a\u0435\u043d\u043e\u0432',
},
),
migrations.AddField(
model_name='trafhistory',
name='token',
field=models.CharField(max_length=255, null=True, verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0442\u043e\u043a\u0435\u043d'),
),
migrations.AddField(
model_name='trafsource',
name='token_start',
field=models.DateTimeField(editable=False, null=True, verbose_name='\u0422\u043e\u0447\u043a\u0430 \u043e\u0442\u0441\u0447\u0435\u0442\u0430 \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430'),
),
migrations.AlterField(
model_name='trafsource',
name='live_time',
field=models.IntegerField(blank=True, help_text='\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0441\u0430\u0445. \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 - \u043f\u043e\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e', verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430'),
),
migrations.AlterField(
model_name='trafsource',
name='token',
field=models.CharField(editable=False, max_length=255, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 15, 37, 34, 495507), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AddField(
model_name='traftokenhistory',
name='sources',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='access.TrafSource', verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 15:37
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('access', '0023_auto_20160509_1408'),
]
operations = [
migrations.CreateModel(
name='TrafTokenHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('token', models.CharField(editable=False, max_length=255, verbose_name='\u0422\u043e\u043a\u0435\u043d')),
('live_time', models.IntegerField(editable=False, help_text='\u0412 \u0447\u0430\u0441\u0430\u0445', verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438')),
('date_start', models.DateTimeField(editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430')),
('date_end', models.DateTimeField(editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f')),
],
options={
'verbose_name': '\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043c\u0435\u043d\u044b \u0442\u043e\u043a\u0435\u043d\u0430',
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043c\u0435\u043d\u044b \u0442\u043e\u043a\u0435\u043d\u043e\u0432',
},
),
migrations.AddField(
model_name='trafhistory',
name='token',
field=models.CharField(max_length=255, null=True, verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0442\u043e\u043a\u0435\u043d'),
),
migrations.AddField(
model_name='trafsource',
name='token_start',
field=models.DateTimeField(editable=False, null=True, verbose_name='\u0422\u043e\u0447\u043a\u0430 \u043e\u0442\u0441\u0447\u0435\u0442\u0430 \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430'),
),
migrations.AlterField(
model_name='trafsource',
name='live_time',
field=models.IntegerField(blank=True, help_text='\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0441\u0430\u0445. \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 - \u043f\u043e\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e', verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430'),
),
migrations.AlterField(
model_name='trafsource',
name='token',
field=models.CharField(editable=False, max_length=255, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 15, 37, 34, 495507), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AddField(
model_name='traftokenhistory',
name='sources',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='access.TrafSource', verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 15:39
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0024_auto_20160509_1537'),
]
operations = [
migrations.RenameField(
model_name='traftokenhistory',
old_name='sources',
new_name='source',
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 15, 39, 30, 69095), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 15:39
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0024_auto_20160509_1537'),
]
operations = [
migrations.RenameField(
model_name='traftokenhistory',
old_name='sources',
new_name='source',
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 15, 39, 30, 69095), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 18:03
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0025_auto_20160509_1539'),
]
operations = [
migrations.AlterField(
model_name='trafsource',
name='live_time',
field=models.IntegerField(blank=True, help_text='\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0441\u0430\u0445. \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 - \u043f\u043e\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e', null=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 18, 3, 57, 586863), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-09 18:03
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0025_auto_20160509_1539'),
]
operations = [
migrations.AlterField(
model_name='trafsource',
name='live_time',
field=models.IntegerField(blank=True, help_text='\u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0447\u0430\u0441\u0430\u0445. \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 - \u043f\u043e\u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e', null=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0442\u043e\u043a\u0435\u043d\u0430'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 9, 18, 3, 57, 586863), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,46 +1,46 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 18:23
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 = [
('access', '0026_auto_20160509_1803'),
]
operations = [
migrations.CreateModel(
name='Questionnaire',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fully', models.CharField(choices=[(b'1', b'\xd0\xa4\xd0\xbb\xd0\xb0\xd0\xb3\xd0\xb8'), (b'2', b'\xd0\xa1\xd0\xb2\xd0\xbe\xd0\xb1\xd0\xbe\xd0\xb4\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbe\xd1\x82\xd0\xb2\xd0\xb5\xd1\x82'), (b'3', b'\xd0\x97\xd0\xb0\xd0\xb2\xd0\xb5\xd1\x80\xd1\x88\xd0\xb5\xd0\xbd\xd0\xbe')], default=1, max_length=1, verbose_name='\u0421\u0442\u0430\u0434\u0438\u044f')),
('steps', models.IntegerField(default=0, help_text='\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f', verbose_name='\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u043e\u0432')),
('male', models.CharField(blank=True, choices=[(b'M', b'\xd0\x9c\xd1\x83\xd0\xb6\xd1\x87\xd0\xb8\xd0\xbd\xd0\xb0'), (b'W', b'\xd0\x96\xd0\xb5\xd0\xbd\xd1\x89\xd0\xb8\xd0\xbd\xd0\xb0')], max_length=1, null=True, verbose_name='\u041f\u043e\u043b')),
('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u0413\u043e\u0440\u043e\u0434')),
('experience', models.CharField(blank=True, choices=[(b'1', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbd\xd0\xb0\xd1\x87\xd0\xb8\xd0\xbd\xd0\xb0\xd1\x8e'), (b'2', b'\xd0\x94\xd0\xb0, \xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xb5 \xd0\xb3\xd0\xbe\xd0\xb4\xd0\xb0'), (b'3', b'\xd0\x94\xd0\xb0, 1-2 \xd0\xb3\xd0\xbe\xd0\xb4\xd0\xb0'), (b'4', b'\xd0\x94\xd0\xb0, \xd0\xb1\xd0\xbe\xd0\xbb\xd0\xb5\xd0\xb5 2 \xd0\xbb\xd0\xb5\xd1\x82')], max_length=1, null=True, verbose_name='\u041e\u043f\u044b\u0442')),
('aim', models.CharField(blank=True, choices=[(b'1', b'\xd0\x94\xd0\xb0, \xd0\xb2 \xd0\xbe\xd1\x84\xd0\xb8\xd1\x81\xd0\xb5'), (b'2', b'\xd0\x94\xd0\xb0, \xd1\x81\xd0\xb2\xd0\xbe\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb5\xd0\xba\xd1\x82'), (b'3', b'\xd0\x94\xd0\xb0, \xd0\xbd\xd0\xb0 \xd1\x84\xd1\x80\xd0\xb8\xd0\xbb\xd0\xb0\xd0\xbd\xd1\x81\xd0\xb5'), (b'4', b'\xd0\x9d\xd0\xb5\xd1\x82, \xd0\xb8\xd0\xb7\xd1\x83\xd1\x87\xd0\xb0\xd1\x8e \xd0\xb4\xd0\xbb\xd1\x8f \xd1\x81\xd0\xb5\xd0\xb1\xd1\x8f')], max_length=1, null=True, verbose_name='\u0426\u0435\u043b\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f')),
('age', models.CharField(blank=True, choices=[(b'1', b'\xd0\xb4\xd0\xbe 18'), (b'2', b'18-25'), (b'3', b'25-30'), (b'4', b'30-40'), (b'5', b'\xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5 40')], max_length=1, null=True, verbose_name='\u0412\u043e\u0437\u0440\u0430\u0441\u0442')),
('description', models.TextField(blank=True, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b \u043e\u0442\u0432\u0435\u0442')),
],
options={
'verbose_name': '\u0410\u043a\u0435\u0442\u0430',
'verbose_name_plural': '\u0410\u043d\u043a\u0435\u0442\u044b',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 10, 18, 23, 39, 577802), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AddField(
model_name='questionnaire',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2016-05-10 18:23
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 = [
('access', '0026_auto_20160509_1803'),
]
operations = [
migrations.CreateModel(
name='Questionnaire',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fully', models.CharField(choices=[(b'1', b'\xd0\xa4\xd0\xbb\xd0\xb0\xd0\xb3\xd0\xb8'), (b'2', b'\xd0\xa1\xd0\xb2\xd0\xbe\xd0\xb1\xd0\xbe\xd0\xb4\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbe\xd1\x82\xd0\xb2\xd0\xb5\xd1\x82'), (b'3', b'\xd0\x97\xd0\xb0\xd0\xb2\xd0\xb5\xd1\x80\xd1\x88\xd0\xb5\xd0\xbd\xd0\xbe')], default=1, max_length=1, verbose_name='\u0421\u0442\u0430\u0434\u0438\u044f')),
('steps', models.IntegerField(default=0, help_text='\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f', verbose_name='\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u0430\u0437\u043e\u0432')),
('male', models.CharField(blank=True, choices=[(b'M', b'\xd0\x9c\xd1\x83\xd0\xb6\xd1\x87\xd0\xb8\xd0\xbd\xd0\xb0'), (b'W', b'\xd0\x96\xd0\xb5\xd0\xbd\xd1\x89\xd0\xb8\xd0\xbd\xd0\xb0')], max_length=1, null=True, verbose_name='\u041f\u043e\u043b')),
('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='\u0413\u043e\u0440\u043e\u0434')),
('experience', models.CharField(blank=True, choices=[(b'1', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbd\xd0\xb0\xd1\x87\xd0\xb8\xd0\xbd\xd0\xb0\xd1\x8e'), (b'2', b'\xd0\x94\xd0\xb0, \xd0\xbc\xd0\xb5\xd0\xbd\xd0\xb5\xd0\xb5 \xd0\xb3\xd0\xbe\xd0\xb4\xd0\xb0'), (b'3', b'\xd0\x94\xd0\xb0, 1-2 \xd0\xb3\xd0\xbe\xd0\xb4\xd0\xb0'), (b'4', b'\xd0\x94\xd0\xb0, \xd0\xb1\xd0\xbe\xd0\xbb\xd0\xb5\xd0\xb5 2 \xd0\xbb\xd0\xb5\xd1\x82')], max_length=1, null=True, verbose_name='\u041e\u043f\u044b\u0442')),
('aim', models.CharField(blank=True, choices=[(b'1', b'\xd0\x94\xd0\xb0, \xd0\xb2 \xd0\xbe\xd1\x84\xd0\xb8\xd1\x81\xd0\xb5'), (b'2', b'\xd0\x94\xd0\xb0, \xd1\x81\xd0\xb2\xd0\xbe\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb5\xd0\xba\xd1\x82'), (b'3', b'\xd0\x94\xd0\xb0, \xd0\xbd\xd0\xb0 \xd1\x84\xd1\x80\xd0\xb8\xd0\xbb\xd0\xb0\xd0\xbd\xd1\x81\xd0\xb5'), (b'4', b'\xd0\x9d\xd0\xb5\xd1\x82, \xd0\xb8\xd0\xb7\xd1\x83\xd1\x87\xd0\xb0\xd1\x8e \xd0\xb4\xd0\xbb\xd1\x8f \xd1\x81\xd0\xb5\xd0\xb1\xd1\x8f')], max_length=1, null=True, verbose_name='\u0426\u0435\u043b\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f')),
('age', models.CharField(blank=True, choices=[(b'1', b'\xd0\xb4\xd0\xbe 18'), (b'2', b'18-25'), (b'3', b'25-30'), (b'4', b'30-40'), (b'5', b'\xd0\xb1\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x88\xd0\xb5 40')], max_length=1, null=True, verbose_name='\u0412\u043e\u0437\u0440\u0430\u0441\u0442')),
('description', models.TextField(blank=True, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b \u043e\u0442\u0432\u0435\u0442')),
],
options={
'verbose_name': '\u0410\u043a\u0435\u0442\u0430',
'verbose_name_plural': '\u0410\u043d\u043a\u0435\u0442\u044b',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 10, 18, 23, 39, 577802), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AddField(
model_name='questionnaire',
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'),
),
]

@ -1,61 +1,61 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-26 14:27
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 = [
('access', '0027_auto_20160510_1823'),
]
operations = [
migrations.CreateModel(
name='Document',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')),
('status', models.CharField(choices=[(b'W', '\u041d\u0430 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0438'), (b'F', '\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d')], default=b'W', editable=False, max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')),
('date', models.DateField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f')),
('in_date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f')),
],
options={
'verbose_name': '\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442',
'verbose_name_plural': '\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b',
},
),
migrations.CreateModel(
name='DocumentScan',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('page', models.CharField(max_length=255, verbose_name='\u2116 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b')),
('file', models.ImageField(upload_to=b'documents', verbose_name='\u0421\u043a\u0430\u043d')),
('date', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f')),
],
options={
'ordering': ['page'],
'verbose_name': '\u0421\u043a\u0430\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430',
'verbose_name_plural': '\u0421\u043a\u0430\u043d\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 26, 14, 27, 8, 278824), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AddField(
model_name='document',
name='scans',
field=models.ManyToManyField(blank=True, to='access.DocumentScan', verbose_name='\u0421\u043a\u0430\u043d\u044b'),
),
migrations.AddField(
model_name='document',
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'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-26 14:27
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 = [
('access', '0027_auto_20160510_1823'),
]
operations = [
migrations.CreateModel(
name='Document',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')),
('status', models.CharField(choices=[(b'W', '\u041d\u0430 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0438'), (b'F', '\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d')], default=b'W', editable=False, max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')),
('date', models.DateField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f')),
('in_date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f')),
],
options={
'verbose_name': '\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442',
'verbose_name_plural': '\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b',
},
),
migrations.CreateModel(
name='DocumentScan',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('page', models.CharField(max_length=255, verbose_name='\u2116 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b')),
('file', models.ImageField(upload_to=b'documents', verbose_name='\u0421\u043a\u0430\u043d')),
('date', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f')),
],
options={
'ordering': ['page'],
'verbose_name': '\u0421\u043a\u0430\u043d \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430',
'verbose_name_plural': '\u0421\u043a\u0430\u043d\u044b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432',
},
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 26, 14, 27, 8, 278824), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AddField(
model_name='document',
name='scans',
field=models.ManyToManyField(blank=True, to='access.DocumentScan', verbose_name='\u0421\u043a\u0430\u043d\u044b'),
),
migrations.AddField(
model_name='document',
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'),
),
]

@ -1,38 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-26 14:35
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0028_auto_20160526_1427'),
]
operations = [
migrations.RemoveField(
model_name='document',
name='scans',
),
migrations.AddField(
model_name='document',
name='file',
field=models.ImageField(null=True, upload_to=b'documents', verbose_name='\u0421\u043a\u0430\u043d'),
),
migrations.AlterField(
model_name='document',
name='in_date',
field=models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 26, 14, 35, 38, 532166), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.DeleteModel(
name='DocumentScan',
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-26 14:35
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0028_auto_20160526_1427'),
]
operations = [
migrations.RemoveField(
model_name='document',
name='scans',
),
migrations.AddField(
model_name='document',
name='file',
field=models.ImageField(null=True, upload_to=b'documents', verbose_name='\u0421\u043a\u0430\u043d'),
),
migrations.AlterField(
model_name='document',
name='in_date',
field=models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 26, 14, 35, 38, 532166), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.DeleteModel(
name='DocumentScan',
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-26 17:27
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0029_auto_20160526_1435'),
]
operations = [
migrations.AlterField(
model_name='document',
name='file',
field=models.FileField(blank=True, null=True, upload_to=b'documents', verbose_name='\u0421\u043a\u0430\u043d'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 26, 17, 27, 27, 217966), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-26 17:27
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0029_auto_20160526_1435'),
]
operations = [
migrations.AlterField(
model_name='document',
name='file',
field=models.FileField(blank=True, null=True, upload_to=b'documents', verbose_name='\u0421\u043a\u0430\u043d'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 26, 17, 27, 27, 217966), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 12:40
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0030_auto_20160526_1727'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 31, 12, 40, 17, 702246), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='in_role',
field=models.CharField(choices=[(b'U', '\u0421\u0442\u0443\u0434\u0435\u043d\u0442 \u0448\u043a\u043e\u043b\u044b'), (b'T', '\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c'), (b'M', '\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440'), (b'S', '\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'), (b'S2', '\u041e\u043a\u043e \u0441\u0430\u0443\u0440\u043e\u043d\u0430'), (b'A', '\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'), (b'Ts', '\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c'), (b'F', '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430')], default=b'U', max_length=2, verbose_name='\u0420\u043e\u043b\u044c'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-05-31 12:40
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0030_auto_20160526_1727'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 5, 31, 12, 40, 17, 702246), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='in_role',
field=models.CharField(choices=[(b'U', '\u0421\u0442\u0443\u0434\u0435\u043d\u0442 \u0448\u043a\u043e\u043b\u044b'), (b'T', '\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c'), (b'M', '\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440'), (b'S', '\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'), (b'S2', '\u041e\u043a\u043e \u0441\u0430\u0443\u0440\u043e\u043d\u0430'), (b'A', '\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440'), (b'Ts', '\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c'), (b'F', '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430')], default=b'U', max_length=2, verbose_name='\u0420\u043e\u043b\u044c'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-01 12:56
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0031_auto_20160531_1240'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 1, 12, 56, 55, 630156), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-01 12:56
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0031_auto_20160531_1240'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 1, 12, 56, 55, 630156), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 16:14
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0032_auto_20160601_1256'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 16, 14, 9, 853317), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 16:14
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0032_auto_20160601_1256'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 16, 14, 9, 853317), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 20:02
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0033_auto_20160607_1614'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 20, 2, 41, 564255), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 20:02
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0033_auto_20160607_1614'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 20, 2, 41, 564255), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 20:34
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0034_auto_20160607_2002'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 20, 34, 43, 673956), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 20:34
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0034_auto_20160607_2002'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 20, 34, 43, 673956), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 20:51
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0035_auto_20160607_2034'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 20, 51, 37, 90991), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-07 20:51
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0035_auto_20160607_2034'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 7, 20, 51, 37, 90991), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 17:00
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0036_auto_20160607_2051'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 16, 59, 59, 621057), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 17:00
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0036_auto_20160607_2051'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 16, 59, 59, 621057), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 17:05
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0037_auto_20160608_1700'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 17, 5, 4, 809207), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 17:05
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0037_auto_20160608_1700'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 17, 5, 4, 809207), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 18:04
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0038_auto_20160608_1705'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 18, 4, 57, 435515), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 18:04
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0038_auto_20160608_1705'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 18, 4, 57, 435515), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 18:41
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0039_auto_20160608_1804'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 18, 41, 17, 775100), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-08 18:41
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0039_auto_20160608_1804'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 8, 18, 41, 17, 775100), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 14:29
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0040_auto_20160608_1841'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 14, 29, 17, 471762), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 14:29
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0040_auto_20160608_1841'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 14, 29, 17, 471762), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 14:42
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0041_auto_20160609_1429'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 14, 42, 25, 538404), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 14:42
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0041_auto_20160609_1429'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 14, 42, 25, 538404), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:34
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0042_auto_20160609_1442'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 34, 28, 437751), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:34
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0042_auto_20160609_1442'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 34, 28, 437751), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:36
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0043_auto_20160609_1534'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 36, 24, 57777), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:36
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0043_auto_20160609_1534'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 36, 24, 57777), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:36
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0044_auto_20160609_1536'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 36, 29, 820351), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:36
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0044_auto_20160609_1536'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 36, 29, 820351), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:46
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0045_auto_20160609_1536'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 46, 17, 181201), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 15:46
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0045_auto_20160609_1536'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 15, 46, 17, 181201), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 16:27
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0046_auto_20160609_1546'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 16, 27, 14, 187304), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 16:27
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0046_auto_20160609_1546'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 16, 27, 14, 187304), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 22:24
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0047_auto_20160609_1627'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 22, 24, 43, 724608), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-09 22:24
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0047_auto_20160609_1627'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 9, 22, 24, 43, 724608), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-28 17:31
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0048_auto_20160609_2224'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 28, 17, 31, 12, 186349), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-06-28 17:31
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0048_auto_20160609_2224'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 6, 28, 17, 31, 12, 186349), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-11 15:18
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0049_auto_20160628_1731'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 11, 15, 18, 42, 159532), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-11 15:18
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0049_auto_20160628_1731'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 11, 15, 18, 42, 159532), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-13 20:38
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0050_auto_20160711_1518'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 13, 20, 38, 33, 272929), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-13 20:38
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0050_auto_20160711_1518'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 13, 20, 38, 33, 272929), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-18 17:14
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0051_auto_20160713_2038'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 18, 17, 14, 45, 907017), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-18 17:14
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0051_auto_20160713_2038'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 18, 17, 14, 45, 907017), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-18 17:14
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0052_auto_20160718_1714'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 18, 17, 14, 57, 300386), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-18 17:14
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0052_auto_20160718_1714'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 18, 17, 14, 57, 300386), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,31 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-25 15:51
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0053_auto_20160718_1714'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 25, 15, 51, 36, 404906), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='is_admin',
field=models.BooleanField(default=False, editable=False),
),
migrations.AlterField(
model_name='user',
name='is_staff',
field=models.BooleanField(default=False, editable=False),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-07-25 15:51
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0053_auto_20160718_1714'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 7, 25, 15, 51, 36, 404906), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='is_admin',
field=models.BooleanField(default=False, editable=False),
),
migrations.AlterField(
model_name='user',
name='is_staff',
field=models.BooleanField(default=False, editable=False),
),
]

@ -1,36 +1,36 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-09 16:53
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0054_auto_20160725_1551'),
]
operations = [
migrations.AddField(
model_name='user',
name='sync',
field=models.BooleanField(default=False, verbose_name='\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d'),
),
migrations.AlterField(
model_name='trafhistory',
name='action',
field=models.CharField(choices=[(b'G', b'\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd1\x85'), (b'D', b'\xd0\x97\xd0\xb0\xd0\xbf\xd0\xb8\xd1\x81\xd1\x8c \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd1\x85'), (b'C', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f'), (b'O', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x81\xd1\x87\xd0\xb5\xd1\x82\xd0\xb0')], max_length=1, verbose_name='\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 9, 16, 53, 12, 35311), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='private',
field=models.CharField(choices=[(b'A', b'\xd0\x92\xd1\x81\xd0\xb5\xd0\xbc\xd1\x83 \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80\xd0\xbd\xd0\xb5\xd1\x82\xd1\x83'), (b'U', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f\xd0\xbc \xd1\x81\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd1\x8b'), (b'L', b'\xd0\x9f\xd0\xbe \xd0\xbf\xd1\x80\xd1\x8f\xd0\xbc\xd0\xbe\xd0\xb9 \xd1\x81\xd1\x81\xd1\x8b\xd0\xbb\xd0\xba\xd0\xb5'), (b'B', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbc\xd0\xbd\xd0\xb5')], default=b'A', max_length=1, verbose_name='\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044f'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-09 16:53
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0054_auto_20160725_1551'),
]
operations = [
migrations.AddField(
model_name='user',
name='sync',
field=models.BooleanField(default=False, verbose_name='\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d'),
),
migrations.AlterField(
model_name='trafhistory',
name='action',
field=models.CharField(choices=[(b'G', b'\xd0\x9f\xd0\xbe\xd0\xbb\xd1\x83\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd1\x85'), (b'D', b'\xd0\x97\xd0\xb0\xd0\xbf\xd0\xb8\xd1\x81\xd1\x8c \xd0\xb4\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8b\xd1\x85'), (b'C', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f'), (b'O', b'\xd0\xa1\xd0\xbe\xd0\xb7\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x81\xd1\x87\xd0\xb5\xd1\x82\xd0\xb0')], max_length=1, verbose_name='\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 9, 16, 53, 12, 35311), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
migrations.AlterField(
model_name='user',
name='private',
field=models.CharField(choices=[(b'A', b'\xd0\x92\xd1\x81\xd0\xb5\xd0\xbc\xd1\x83 \xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80\xd0\xbd\xd0\xb5\xd1\x82\xd1\x83'), (b'U', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xbb\xd1\x8f\xd0\xbc \xd1\x81\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xbc\xd1\x8b'), (b'L', b'\xd0\x9f\xd0\xbe \xd0\xbf\xd1\x80\xd1\x8f\xd0\xbc\xd0\xbe\xd0\xb9 \xd1\x81\xd1\x81\xd1\x8b\xd0\xbb\xd0\xba\xd0\xb5'), (b'B', b'\xd0\xa2\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe \xd0\xbc\xd0\xbd\xd0\xb5')], default=b'A', max_length=1, verbose_name='\u041f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044f'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-09 16:59
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0055_auto_20160809_1653'),
]
operations = [
migrations.AddField(
model_name='user',
name='sync_date',
field=models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 9, 16, 59, 0, 490315), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-09 16:59
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0055_auto_20160809_1653'),
]
operations = [
migrations.AddField(
model_name='user',
name='sync_date',
field=models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 9, 16, 59, 0, 490315), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-10 12:34
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0056_auto_20160809_1659'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 10, 12, 34, 1, 608983), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-10 12:34
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0056_auto_20160809_1659'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 10, 12, 34, 1, 608983), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,21 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-14 17:36
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0057_auto_20160810_1234'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 14, 17, 36, 41, 669896), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.2 on 2016-08-14 17:36
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0057_auto_20160810_1234'),
]
operations = [
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 14, 17, 36, 41, 669896), null=True, verbose_name='\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u043e. \u041d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c.'),
),
]

@ -1,198 +1,198 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2016-08-15 18:53
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 = [
('access', '0058_auto_20160814_1736'),
]
operations = [
migrations.CreateModel(
name='UserSync',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateTimeField(default=datetime.datetime.now, verbose_name='Дата начала')),
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='Дата завершения процеса')),
('source', models.CharField(max_length=255, verbose_name='Источник синхронизации')),
('dist', models.CharField(max_length=255, verbose_name='Получатель синхронизации')),
('result', models.BooleanField(default=False, verbose_name='Результат синхронизации')),
],
options={
'verbose_name': 'Задача синхронизации',
'verbose_name_plural': 'Задачи синхронизации',
},
),
migrations.AlterField(
model_name='actionj',
name='a_type',
field=models.CharField(choices=[('B', 'b-default'), ('P', 'b-primary'), ('S', 'b-success'), ('I', 'b-info'), ('W', 'b-warning'), ('D', 'b-danger')], default='B', max_length=1, verbose_name='Тип события'),
),
migrations.AlterField(
model_name='document',
name='file',
field=models.FileField(blank=True, null=True, upload_to='documents', verbose_name='Скан'),
),
migrations.AlterField(
model_name='document',
name='status',
field=models.CharField(choices=[('W', 'На оформлении'), ('F', 'Оформлен')], default='W', editable=False, max_length=1, verbose_name='Статус'),
),
migrations.AlterField(
model_name='questionnaire',
name='age',
field=models.CharField(blank=True, choices=[('1', 'до 18'), ('2', '18-25'), ('3', '25-30'), ('4', '30-40'), ('5', 'больше 40')], max_length=1, null=True, verbose_name='Возраст'),
),
migrations.AlterField(
model_name='questionnaire',
name='aim',
field=models.CharField(blank=True, choices=[('1', 'Да, в офисе'), ('2', 'Да, свой проект'), ('3', 'Да, на фрилансе'), ('4', 'Нет, изучаю для себя')], max_length=1, null=True, verbose_name='Цель обучения'),
),
migrations.AlterField(
model_name='questionnaire',
name='experience',
field=models.CharField(blank=True, choices=[('1', 'Только начинаю'), ('2', 'Да, менее года'), ('3', 'Да, 1-2 года'), ('4', 'Да, более 2 лет')], max_length=1, null=True, verbose_name='Опыт'),
),
migrations.AlterField(
model_name='questionnaire',
name='fully',
field=models.CharField(choices=[('1', 'Флаги'), ('2', 'Свободный ответ'), ('3', 'Завершено')], default=1, max_length=1, verbose_name='Стадия'),
),
migrations.AlterField(
model_name='questionnaire',
name='male',
field=models.CharField(blank=True, choices=[('M', 'Мужчина'), ('W', 'Женщина')], max_length=1, null=True, verbose_name='Пол'),
),
migrations.AlterField(
model_name='trafhistory',
name='action',
field=models.CharField(choices=[('G', 'Получение данных'), ('D', 'Запись данных'), ('C', 'Создание пользователя'), ('O', 'Создание счета')], max_length=1, verbose_name='Действие'),
),
migrations.AlterField(
model_name='user',
name='avatar',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Ключ аватара'),
),
migrations.AlterField(
model_name='user',
name='back_phone',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Предидущий телефон'),
),
migrations.AlterField(
model_name='user',
name='city',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Город'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 15, 18, 53, 53, 111817), null=True, verbose_name='Задержка до. Не включая этот день.'),
),
migrations.AlterField(
model_name='user',
name='email',
field=models.EmailField(blank=True, db_index=True, editable=False, max_length=255, unique=True, verbose_name='email'),
),
migrations.AlterField(
model_name='user',
name='facebook',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='fname',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Фамилия'),
),
migrations.AlterField(
model_name='user',
name='in_avatar',
field=models.ImageField(blank=True, editable=False, null=True, upload_to='', verbose_name='Наш аватар'),
),
migrations.AlterField(
model_name='user',
name='in_role',
field=models.CharField(choices=[('U', 'Студент школы'), ('T', 'Преподаватель'), ('M', 'Менеджер'), ('S', 'Руководитель'), ('S2', 'Око саурона'), ('A', 'Администратор'), ('Ts', 'Тестовый пользователь'), ('F', 'Пользователь свободного счета')], default='U', max_length=2, verbose_name='Роль'),
),
migrations.AlterField(
model_name='user',
name='linkedin',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='name',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Имя'),
),
migrations.AlterField(
model_name='user',
name='odnoklassniki',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='oname',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Отчество'),
),
migrations.AlterField(
model_name='user',
name='phone',
field=models.CharField(default='', max_length=255, verbose_name='Телефон'),
),
migrations.AlterField(
model_name='user',
name='private',
field=models.CharField(choices=[('A', 'Всему интернету'), ('U', 'Только пользователям системы'), ('L', 'По прямой ссылке'), ('B', 'Только мне')], default='A', max_length=1, verbose_name='Приватность профиля'),
),
migrations.AlterField(
model_name='user',
name='refer',
field=models.CharField(choices=[('S', 'Органично'), ('B', 'Привлечен')], default='S', max_length=1, null=True, verbose_name='Источник'),
),
migrations.AlterField(
model_name='user',
name='refer_source',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Источник пользователя'),
),
migrations.AlterField(
model_name='user',
name='reg_status',
field=models.CharField(choices=[('1', 'Пароль'), ('2', 'О себе'), ('3', 'Фото'), ('4', 'Закончена')], default='1', max_length=1, verbose_name='Статус регистрации'),
),
migrations.AlterField(
model_name='user',
name='skype',
field=models.CharField(blank=True, default='', max_length=300),
),
migrations.AlterField(
model_name='user',
name='status',
field=models.CharField(choices=[('ON', 'on-line'), ('OFF', 'off-line')], default='ON', max_length=9),
),
migrations.AlterField(
model_name='user',
name='token',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='unique_role',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Уникальная роль'),
),
migrations.AlterField(
model_name='user',
name='vk',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AddField(
model_name='usersync',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Синхронизируемый'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2016-08-15 18:53
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 = [
('access', '0058_auto_20160814_1736'),
]
operations = [
migrations.CreateModel(
name='UserSync',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateTimeField(default=datetime.datetime.now, verbose_name='Дата начала')),
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='Дата завершения процеса')),
('source', models.CharField(max_length=255, verbose_name='Источник синхронизации')),
('dist', models.CharField(max_length=255, verbose_name='Получатель синхронизации')),
('result', models.BooleanField(default=False, verbose_name='Результат синхронизации')),
],
options={
'verbose_name': 'Задача синхронизации',
'verbose_name_plural': 'Задачи синхронизации',
},
),
migrations.AlterField(
model_name='actionj',
name='a_type',
field=models.CharField(choices=[('B', 'b-default'), ('P', 'b-primary'), ('S', 'b-success'), ('I', 'b-info'), ('W', 'b-warning'), ('D', 'b-danger')], default='B', max_length=1, verbose_name='Тип события'),
),
migrations.AlterField(
model_name='document',
name='file',
field=models.FileField(blank=True, null=True, upload_to='documents', verbose_name='Скан'),
),
migrations.AlterField(
model_name='document',
name='status',
field=models.CharField(choices=[('W', 'На оформлении'), ('F', 'Оформлен')], default='W', editable=False, max_length=1, verbose_name='Статус'),
),
migrations.AlterField(
model_name='questionnaire',
name='age',
field=models.CharField(blank=True, choices=[('1', 'до 18'), ('2', '18-25'), ('3', '25-30'), ('4', '30-40'), ('5', 'больше 40')], max_length=1, null=True, verbose_name='Возраст'),
),
migrations.AlterField(
model_name='questionnaire',
name='aim',
field=models.CharField(blank=True, choices=[('1', 'Да, в офисе'), ('2', 'Да, свой проект'), ('3', 'Да, на фрилансе'), ('4', 'Нет, изучаю для себя')], max_length=1, null=True, verbose_name='Цель обучения'),
),
migrations.AlterField(
model_name='questionnaire',
name='experience',
field=models.CharField(blank=True, choices=[('1', 'Только начинаю'), ('2', 'Да, менее года'), ('3', 'Да, 1-2 года'), ('4', 'Да, более 2 лет')], max_length=1, null=True, verbose_name='Опыт'),
),
migrations.AlterField(
model_name='questionnaire',
name='fully',
field=models.CharField(choices=[('1', 'Флаги'), ('2', 'Свободный ответ'), ('3', 'Завершено')], default=1, max_length=1, verbose_name='Стадия'),
),
migrations.AlterField(
model_name='questionnaire',
name='male',
field=models.CharField(blank=True, choices=[('M', 'Мужчина'), ('W', 'Женщина')], max_length=1, null=True, verbose_name='Пол'),
),
migrations.AlterField(
model_name='trafhistory',
name='action',
field=models.CharField(choices=[('G', 'Получение данных'), ('D', 'Запись данных'), ('C', 'Создание пользователя'), ('O', 'Создание счета')], max_length=1, verbose_name='Действие'),
),
migrations.AlterField(
model_name='user',
name='avatar',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Ключ аватара'),
),
migrations.AlterField(
model_name='user',
name='back_phone',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Предидущий телефон'),
),
migrations.AlterField(
model_name='user',
name='city',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Город'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 15, 18, 53, 53, 111817), null=True, verbose_name='Задержка до. Не включая этот день.'),
),
migrations.AlterField(
model_name='user',
name='email',
field=models.EmailField(blank=True, db_index=True, editable=False, max_length=255, unique=True, verbose_name='email'),
),
migrations.AlterField(
model_name='user',
name='facebook',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='fname',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Фамилия'),
),
migrations.AlterField(
model_name='user',
name='in_avatar',
field=models.ImageField(blank=True, editable=False, null=True, upload_to='', verbose_name='Наш аватар'),
),
migrations.AlterField(
model_name='user',
name='in_role',
field=models.CharField(choices=[('U', 'Студент школы'), ('T', 'Преподаватель'), ('M', 'Менеджер'), ('S', 'Руководитель'), ('S2', 'Око саурона'), ('A', 'Администратор'), ('Ts', 'Тестовый пользователь'), ('F', 'Пользователь свободного счета')], default='U', max_length=2, verbose_name='Роль'),
),
migrations.AlterField(
model_name='user',
name='linkedin',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='name',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Имя'),
),
migrations.AlterField(
model_name='user',
name='odnoklassniki',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='oname',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Отчество'),
),
migrations.AlterField(
model_name='user',
name='phone',
field=models.CharField(default='', max_length=255, verbose_name='Телефон'),
),
migrations.AlterField(
model_name='user',
name='private',
field=models.CharField(choices=[('A', 'Всему интернету'), ('U', 'Только пользователям системы'), ('L', 'По прямой ссылке'), ('B', 'Только мне')], default='A', max_length=1, verbose_name='Приватность профиля'),
),
migrations.AlterField(
model_name='user',
name='refer',
field=models.CharField(choices=[('S', 'Органично'), ('B', 'Привлечен')], default='S', max_length=1, null=True, verbose_name='Источник'),
),
migrations.AlterField(
model_name='user',
name='refer_source',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Источник пользователя'),
),
migrations.AlterField(
model_name='user',
name='reg_status',
field=models.CharField(choices=[('1', 'Пароль'), ('2', 'О себе'), ('3', 'Фото'), ('4', 'Закончена')], default='1', max_length=1, verbose_name='Статус регистрации'),
),
migrations.AlterField(
model_name='user',
name='skype',
field=models.CharField(blank=True, default='', max_length=300),
),
migrations.AlterField(
model_name='user',
name='status',
field=models.CharField(choices=[('ON', 'on-line'), ('OFF', 'off-line')], default='ON', max_length=9),
),
migrations.AlterField(
model_name='user',
name='token',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AlterField(
model_name='user',
name='unique_role',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='Уникальная роль'),
),
migrations.AlterField(
model_name='user',
name='vk',
field=models.CharField(blank=True, default='', max_length=255),
),
migrations.AddField(
model_name='usersync',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Синхронизируемый'),
),
]

@ -1,26 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2016-08-15 18:55
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0059_auto_20160815_1853'),
]
operations = [
migrations.AddField(
model_name='usersync',
name='data',
field=models.TextField(blank=True, default='', verbose_name='Сырые данные'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 15, 18, 55, 46, 279309), null=True, verbose_name='Задержка до. Не включая этот день.'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2016-08-15 18:55
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('access', '0059_auto_20160815_1853'),
]
operations = [
migrations.AddField(
model_name='usersync',
name='data',
field=models.TextField(blank=True, default='', verbose_name='Сырые данные'),
),
migrations.AlterField(
model_name='user',
name='delay_date',
field=models.DateTimeField(blank=True, default=datetime.datetime(2016, 8, 15, 18, 55, 46, 279309), null=True, verbose_name='Задержка до. Не включая этот день.'),
),
]

@ -122,6 +122,7 @@ class User(AbstractBaseUser):
)
#sync = models.BooleanField(verbose_name=u'Синхронизирован', default=False)
#sync_date = models.DateTimeField(verbose_name=u'Дата постановки на синхронизацию', blank=True, null=True)
block = models.BooleanField(verbose_name=u'Заблокировать', default=False)
refer = models.CharField(verbose_name=u'Источник', max_length=1, choices=SOURCE, default='S', null=True)
refer_source = models.CharField(verbose_name=u'Источник пользователя', blank=True, max_length=255, default='')
traf_source = models.ForeignKey('TrafHistory', verbose_name=u'Обращение', blank=True, null=True)
@ -180,6 +181,9 @@ class User(AbstractBaseUser):
super(User, self).save(*args, **kwargs)
def get_ip_len(self):
UserRequest.objects.filter(user=self).count()
def set_request_data(self, request):
ip = get_client_ip(request)
try:

@ -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,12 +1,12 @@
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)
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)
]

@ -1,140 +1,140 @@
# 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
# 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

@ -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,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-----
MIIJKQIBAAKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeSNe8aJVMXRu3IbIML
+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7MvPbts5Y7LWBcwUomJ
+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674ZImLLtc+bLl3NjzH6
t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefKzigr+5sU34SMbWLs
czspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWqi6OOVZMcNjqePwc4
1R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvOOnK/TeOzaJoCx/yb
7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8tyWTcypBWhr6xTYhNB
GTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNKjqMo3wvrvJjcM1mz
qRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtpkzaMCdEf33ELDshG
XN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p8MDs1ZCNtjScCzgt
aNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOrsWFfpoEXjmMCAwEA
AQKCAgAKVxMVNM+JZSyuWr6hHi/VndcPl8xxjShKRVxM9FDiS6wtqO7Bh+L5ETia
v6vP8ooIJ0ZaxtCBpuQpCrsATRlu3P3tG0ZWJnedONYWIxU+vMKHZt/rDdK3suDd
CHcq5dPxeyfLTt5tcRFeFpR0PorIuhuacA8Y9EsSnMZ6n0wgyjw9VUASQlsQG9kg
7gkq7LZddlEW3zg1fPLztgsNlxkQOhAq4MUwJscO1Z0ob+YiFwU0TTq88LxUkiV0
HMFVBRMAvzcDwqnWwmhc9IJYZx8CXLEKPCTwNvobLTR/Ky32nC5mmctsA0uLiQm6
cBQhEREOWOwU26VxLxnKIGX94tzpqL+k3sWzbfyW2PwCwm7tH18RQSQuwvzWavt0
CKkQmPIvbJGGDxoNs4FC/NX+N0MXiDvPmN4FQeyPCsXsDW4NUsZy2iYmZO0DISsO
oDQGSVM2/dwP9ktKo781XliY91lPEQHTvbqPr89iiVIwPbV4RN+HFOblLn2vrR/2
WloMyMKZEZgrEXLLHiwPveK6n8N1v8YxZwFMhJeBMZ2SNXrqcqrycp+/joKf0Lgg
MvrHu8DYMtlQyfVhAiFJvyL6YS3bVjfi1FEYX6FJn1vvSDQOQxPOLhkAnEoItwCY
R/D1QlyGA4GeDYQTEmz70J007V0koKZZFWUpv4InoUjumygaQQKCAQEA2hhXY3Xz
Wo4QtEBZkkG8NVXGY/k1IpCeER2MysgMAAFdO//bXQbaU7DeOi0AeSrkWz/rlfHR
nxtwgtfjt+0uyDLJlvKXscTDh2qZI9t9Z5ZnimAsawH6hrvfzJX1op/RqgG+edXi
2WrefpoAh8swMWljVO/wwai0b2ahFxsIZUU5XFu+ic4Cb/WTORftwY2yh61Qvsxk
jGNym8VywYJuT9a1HTFljNbEKgqlxBmZczMxgFs2zd+2hu3cITuHnM0YKwQN+sth
yDgemHIoFuI8mO3hKRYrOv+/iQslxt1Km0kFsiFetEr3oT5UizaTZ1Elu6mhKITm
U+fcrnQXWnDcGQKCAQEAy/VttR9pRuT/oW0d58hZRa5HKXoHbpG9IS0+MjlicOWq
ZWvfDag/CCRs6SEQfYWQfOs6AH8bMsjMZDWLXuE4obas7SS4/P7pA88Ix3BpFyGu
afpAwDA/sREe6D4DF9yGM02q66Bw5g/YiAW1TOBaXPWSjOfRNWI7zE+N/znaR/Pi
nfm9XEVuQcnCRlYojvosQ+k7+CU/7w4mTraVz3m86CLyo9k4jDtR3OZh8rjlfrMb
Mk272i+7xiSZkL35/7w3DwhSLm+GLuwHJ1OlEGzSrJx9be4aXDS0V/xWTTw5PzaC
lrNhMobgfWckrbVVHouqyzgSMd9NVdOkKUy3Dg4N2wKCAQEAojv/LbZ9Czyowl0o
BDsv9QDUbmPgGdE4NAUmSWYcPxjEsTA3jvDdEep8tQvq0TeN3S8kYUscIt43iK1t
8NDXvwbAnK/jFdMHnEE4n8rTc24XoYC/Ke6z3Ov+o+JdcdavEWbwuRLZB+COl+CZ
SmpkdC0wPeuqzXRgnInchSKP0T14WPLKPxpnB7/G/26EZzmvt2u+p9/FYAVOKP/s
yHPs+Sj/WzL2lpjgHWIEQ2bDlkVbql6v2t9ymNZxrKrqy0Jpmv4OJCSMnXLZl487
sSIj76LsnjKmf+HlKd2IAXF14SOlwAdAup8Vq/WA0HoNlopvpjSd9FVAPOQ6be9f
u+A+aQKCAQEAtIJIUC62q+nsXGAIQaTNbaAqlwjLHw6ZBo3WJ/klqKl6vzxTMvEe
qAQk58c9ovncwNImiV31ImMYke/Zo2VNC8JzFYaUukSY0aggKvLP74r9pAm52N5a
4Ek4w25uqmWf2DP6+4MJqHOJvgjfRmShVPh6dX6NZ+PC7LXUBHidOWUdwZbQAqPo
Sw1XhYynZLMBDjGTw7Cj/tzVBoEN4YvqpsCXYm/TXjj54Ll9IqaFZjb58PFfOmFY
nKqzxqh8Y9ueFw3UPgiyB0EZq7KZugm2AtKVJ/+9ELIMknpfnweX2txRgzLK6T75
28K3cY21Ac22oRjE8aKh/T3MYkjlEelaVQKCAQAQGuFJcOu0+E5A91+k+GbgFXmK
cmCEO8iNhEByvfZAMv23+ba8WeEcYJnTFUbyaoESXPPAkPSVeFvOy39Zbq1WAZ7c
BdZUEUONWE0n54ZnvArEKIsvF4YRz//KQ8SaXbhj1OMvhS5fRo3hBxCS3xWyF9sq
qM/AWdz3iGvP/ELpCOQrii//U3WaQvaY17QpqiJ7B9DvsWhDabRVlp6eKTKgAMLq
BlJpLz1tRfpVU+sLI+yvZAbwj6Izex80TXEhD9EMPLBgyIzM67+zdf6awB3mXGRA
zSvlO+eVQYQODNR52sD1+4ythePMC4SJiZyLzy7VnCfmoOPNyPldTxQGJLjE
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeSNe8aJVMXRu3IbIML
+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7MvPbts5Y7LWBcwUomJ
+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674ZImLLtc+bLl3NjzH6
t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefKzigr+5sU34SMbWLs
czspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWqi6OOVZMcNjqePwc4
1R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvOOnK/TeOzaJoCx/yb
7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8tyWTcypBWhr6xTYhNB
GTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNKjqMo3wvrvJjcM1mz
qRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtpkzaMCdEf33ELDshG
XN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p8MDs1ZCNtjScCzgt
aNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOrsWFfpoEXjmMCAwEA
AQKCAgAKVxMVNM+JZSyuWr6hHi/VndcPl8xxjShKRVxM9FDiS6wtqO7Bh+L5ETia
v6vP8ooIJ0ZaxtCBpuQpCrsATRlu3P3tG0ZWJnedONYWIxU+vMKHZt/rDdK3suDd
CHcq5dPxeyfLTt5tcRFeFpR0PorIuhuacA8Y9EsSnMZ6n0wgyjw9VUASQlsQG9kg
7gkq7LZddlEW3zg1fPLztgsNlxkQOhAq4MUwJscO1Z0ob+YiFwU0TTq88LxUkiV0
HMFVBRMAvzcDwqnWwmhc9IJYZx8CXLEKPCTwNvobLTR/Ky32nC5mmctsA0uLiQm6
cBQhEREOWOwU26VxLxnKIGX94tzpqL+k3sWzbfyW2PwCwm7tH18RQSQuwvzWavt0
CKkQmPIvbJGGDxoNs4FC/NX+N0MXiDvPmN4FQeyPCsXsDW4NUsZy2iYmZO0DISsO
oDQGSVM2/dwP9ktKo781XliY91lPEQHTvbqPr89iiVIwPbV4RN+HFOblLn2vrR/2
WloMyMKZEZgrEXLLHiwPveK6n8N1v8YxZwFMhJeBMZ2SNXrqcqrycp+/joKf0Lgg
MvrHu8DYMtlQyfVhAiFJvyL6YS3bVjfi1FEYX6FJn1vvSDQOQxPOLhkAnEoItwCY
R/D1QlyGA4GeDYQTEmz70J007V0koKZZFWUpv4InoUjumygaQQKCAQEA2hhXY3Xz
Wo4QtEBZkkG8NVXGY/k1IpCeER2MysgMAAFdO//bXQbaU7DeOi0AeSrkWz/rlfHR
nxtwgtfjt+0uyDLJlvKXscTDh2qZI9t9Z5ZnimAsawH6hrvfzJX1op/RqgG+edXi
2WrefpoAh8swMWljVO/wwai0b2ahFxsIZUU5XFu+ic4Cb/WTORftwY2yh61Qvsxk
jGNym8VywYJuT9a1HTFljNbEKgqlxBmZczMxgFs2zd+2hu3cITuHnM0YKwQN+sth
yDgemHIoFuI8mO3hKRYrOv+/iQslxt1Km0kFsiFetEr3oT5UizaTZ1Elu6mhKITm
U+fcrnQXWnDcGQKCAQEAy/VttR9pRuT/oW0d58hZRa5HKXoHbpG9IS0+MjlicOWq
ZWvfDag/CCRs6SEQfYWQfOs6AH8bMsjMZDWLXuE4obas7SS4/P7pA88Ix3BpFyGu
afpAwDA/sREe6D4DF9yGM02q66Bw5g/YiAW1TOBaXPWSjOfRNWI7zE+N/znaR/Pi
nfm9XEVuQcnCRlYojvosQ+k7+CU/7w4mTraVz3m86CLyo9k4jDtR3OZh8rjlfrMb
Mk272i+7xiSZkL35/7w3DwhSLm+GLuwHJ1OlEGzSrJx9be4aXDS0V/xWTTw5PzaC
lrNhMobgfWckrbVVHouqyzgSMd9NVdOkKUy3Dg4N2wKCAQEAojv/LbZ9Czyowl0o
BDsv9QDUbmPgGdE4NAUmSWYcPxjEsTA3jvDdEep8tQvq0TeN3S8kYUscIt43iK1t
8NDXvwbAnK/jFdMHnEE4n8rTc24XoYC/Ke6z3Ov+o+JdcdavEWbwuRLZB+COl+CZ
SmpkdC0wPeuqzXRgnInchSKP0T14WPLKPxpnB7/G/26EZzmvt2u+p9/FYAVOKP/s
yHPs+Sj/WzL2lpjgHWIEQ2bDlkVbql6v2t9ymNZxrKrqy0Jpmv4OJCSMnXLZl487
sSIj76LsnjKmf+HlKd2IAXF14SOlwAdAup8Vq/WA0HoNlopvpjSd9FVAPOQ6be9f
u+A+aQKCAQEAtIJIUC62q+nsXGAIQaTNbaAqlwjLHw6ZBo3WJ/klqKl6vzxTMvEe
qAQk58c9ovncwNImiV31ImMYke/Zo2VNC8JzFYaUukSY0aggKvLP74r9pAm52N5a
4Ek4w25uqmWf2DP6+4MJqHOJvgjfRmShVPh6dX6NZ+PC7LXUBHidOWUdwZbQAqPo
Sw1XhYynZLMBDjGTw7Cj/tzVBoEN4YvqpsCXYm/TXjj54Ll9IqaFZjb58PFfOmFY
nKqzxqh8Y9ueFw3UPgiyB0EZq7KZugm2AtKVJ/+9ELIMknpfnweX2txRgzLK6T75
28K3cY21Ac22oRjE8aKh/T3MYkjlEelaVQKCAQAQGuFJcOu0+E5A91+k+GbgFXmK
cmCEO8iNhEByvfZAMv23+ba8WeEcYJnTFUbyaoESXPPAkPSVeFvOy39Zbq1WAZ7c
BdZUEUONWE0n54ZnvArEKIsvF4YRz//KQ8SaXbhj1OMvhS5fRo3hBxCS3xWyF9sq
qM/AWdz3iGvP/ELpCOQrii//U3WaQvaY17QpqiJ7B9DvsWhDabRVlp6eKTKgAMLq
BlJpLz1tRfpVU+sLI+yvZAbwj6Izex80TXEhD9EMPLBgyIzM67+zdf6awB3mXGRA
zSvlO+eVQYQODNR52sD1+4ythePMC4SJiZyLzy7VnCfmoOPNyPldTxQGJLjE
-----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
psycopg2
simplejson
celery
django-celery
django-wysiwyg-redactor
raven
uwsgi
flower
django-import-export
python-dateutil
requests
ipython
django-precise-bbcode
html2bbcode
markdown
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

@ -1,51 +1,51 @@
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAxPkRkFPI6cpWutUxb27Zwf1uEc9wSwkB8SWL16n0SEOxcJPV
OfV3Jl//2GP8TLSxeY1S4+MORhsqDm7/outDrJQSJnkZ/pwYZbJEj+1oCItpyamo
+lHJ48ggnQD6HzYWmDZMrUNYiOTmLxsKcVcXM4kLcDVG6RJOgIMbiwaAwIH7DBPW
yVbaCBBY9XMUz7esODov/9OMdZuhcjuk6NXntNsASAbDC0BuVCAJLsVR6ir7r8xO
F7DtrnhhEjcE7R1Wkf4A7i/DyUy/7oJRy2o7psAPJJIS+Hz+bHN+zN+/w9YpCm07
8ZmCy/fJmhIRoymCrdHEbHy9GfNuDfTow1H6+nPzTdA7z33uhOxLJMhYtZjzDOkZ
QT4cwj3aHGF7bFrWvEzauJeTtGyEh5fSpgJvH3kA+Z2cVJRYkW3JZR5B2aTbhPdO
ac4dhp3qUR9DVTjih2I1eP8FBavr5Rb56NIe4HGyL2QIyvKjpqkfH5TRJ1vRbQB3
OjT8nWRkTmHvUxJXg5TmhZVvBt48/xjk5DO1W/GC516r96q1S5YieQzOJ4RUNFIz
SInUke0OLzmha8P9vDv+2owT59IRTl7uO6fQXGSR7bshA5MlquBvzdQ0g837r3Nh
ys1AXI+jrfelR0umHY8bMcrCcXeWbXyGAKIzkTz8x1I2xDzIPZVW4vB/cS8CAwEA
AQKCAgEAwiOC7i/GbLejeA485UnqkssIu8ErOqmsIlQRWwUF4lvl/cGXfcK0Jzyj
XFJgD/Jgoh9qvXXDUdHgR82bZKZhUy22HflqZ4rOeR2Veg5SZWmTYNI53E7UoA9W
Jaka3bxf1LJgLL2d+38waOlMB54BHihK/9NjCsGiYgPXF9XW/Oaf262KG3Pg/eWu
6Gz+7CRqOBkRyiJl5Fz6aS7kQSDjeVwJEPSpNOPSWlQg+No+/IBVBVZm+e7GtRmt
A1j7IAG0m7wwipLFdBiTa69Cky0nkhjmU/Mtg4Ee+yFyrtcxmQHx/XbgiCX3xrV5
HMQGYjy9sjh4Uz023OcTZ+olqK2aoZjY/avsPKOtx9ybbO/YFER7f4PBts+IvCVS
SgAdli6tdoAO/GCHnXKjjLT2WaL8ZXOQcpNFFpLsaRxmq21AKMFCT74fl4euX5cA
qCflO6LxxtclXJdiaJJSuop0xp5KSJ4svRVScq9pHqJCjFoLEkvhYEpfI0nqeodP
jWqlNPiARFK0nnGk5+Uxfjo1WfsnRUvj7bPUbMp/xyG9dFQ0fg40XCIIHV1fTk38
iL+Da0ijtORrIG8kwzL0q4tBU8/89ePvbsk1gOVDr+3nwoB84UmA+zmniHzFGjf4
btF8v840epHaPjMSjWOnTMmsqycZ7imjBGhuqY5vwf1hmMZ3bhECggEBAOfgq1y7
3uvAPzk9gUsDNSPSfmcszw4haHGIaOSmwUwm0klYxqa73T/6AnmjqjRfGErkqqpl
+O0L6oA1+KCS/pCSgN6/uWbtlcS8drniD9rHh9C5twBOOU2e77aDLdQx4SnHkHQZ
GnNpIi4m0PWUaa7qsBBGKpZMDqZCLXZw/6olCGoymrAxW+Tq79/lOf8Ngbz2jzpV
Ou+TAEb06Vy9fBniGb02+8cOPgECPo1a5cdij/1eU11CU66G5Re5il+34jZbVBo9
Zmzanlc/hBSrZ4f9IMJVJLD8/ccc9exCXm+FHBWNpEE/gzxQWPb2ye7CoBep+glD
vfNg+lmUJLfxcuUCggEBANl20pe7WqKME1NOBt/EsX8DKlwoP6zdVasQ57ywDgif
9iKW1Fp0d4hbYEwvMfwXXb6uYlLIXRB6slKxuiuZOXo5DFZzGTmgY1kgachyau4l
nNdGXctCdlT7XklQOj0WgyKkGjFrHKVS5B+Go7/jdtM+JmqR8nhfzSPysaXZbwor
P7sGB+Wx/XbCPpupIZl7nPgOh5ctLS38WAh60++JZ2uLvJCkELA9dJj9ero5r/T8
I4RjNK759mVgzay1UYRlmBFK23JwZxqnpA0gFbfVYyyAfA3VTlLu8ydpNq93Gd1/
w2C5YL9iah7xI4XIlPiOLXWxWyuX7x0IrshejWTSroMCggEBAK8Bg3Q3GzWFYHJc
OFQcNKQ3v00xpYh9sG1XzgsczHEkL7xJ84xt57vcfre9zb0/NH95/FElK24Fe1SO
53qR1u3YlMkJnO3RTSMyNs1ukBbIV3oyYKsrXtZ1qWhvs0we5Vj6FM17ENqgM7rv
cvCWtfjdikqOGqBbAQd8lQF6oYuR7brxPIzUhA3PP4IVaONWF2A+GrWlFBkzMpdb
SzHClYKXgmOrtvVyi1uJjRp0y03j1tcctQCDCdOEXi28zHIXv/TUkzJGuyJXEgC5
oH9VKouZgXsKdena19LKydUp9kpnBV5DDABu5ibEYZDrjFbWr6uMj3kklp20yN6J
D/mAkv0CggEAcWLGHT0f3d8BeI8XgHczQRFqddC6mqxxLZfL7JMzTgXxtUlFgcB2
Ts+uHysAefvI8lJEi/tSovQGpJ1sf60Nzg+OwkiTH3vkMSV4Yn5eCLvt0kUrRH7r
6hWCrOE67H0fdOFxktDRh9X3ggSWvsegPjaKm0hrz53L/XFedSYxAnFYcnCLj5VF
njVbpZgDH97XEnOo+QciJncLg6hfducC2I1sjVIuLWZttBN+eTj46NjKwA1l+9Hz
Shq2QtXrogfCyUlpsHqxF7HPFNTk3gxSAHMhu6i7hPx4JdVzIPwNrXMfcQBXVJLA
2E9NAUV7fznKtDH8Ynd+wnmzgF/kg2xidwKCAQAg4h/BV1tPoJBuX2utlvvw+TjS
yuN6GcR7aZu4tvkctktvxcRihyyiZ1Rycftzqij1haA4xxcCzGFDbpAdjUwfO43+
0RIV3oLnpvxATxOHGNhvUa7GGYgdJLs9hrX9cTqZRR2Bqt5isTWytaI+b8ViEP7w
rvZQVBkmeg9FUXC4rcTSkbaPrzi3RRMkdtu+EdszLJAEEgt6umqNPd3AIDcwAgK/
2rclPBpncTWYWRRoaay+BMHyJPNmgFZdTkem36WiM1xQ3b1I0fzjcqdX+aDn6Cm9
PUxB/vFK9xffL0geEAKptfZJ/kbcZlzecO9GosMvYTEty1ikLTxdYx39/kSm
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAxPkRkFPI6cpWutUxb27Zwf1uEc9wSwkB8SWL16n0SEOxcJPV
OfV3Jl//2GP8TLSxeY1S4+MORhsqDm7/outDrJQSJnkZ/pwYZbJEj+1oCItpyamo
+lHJ48ggnQD6HzYWmDZMrUNYiOTmLxsKcVcXM4kLcDVG6RJOgIMbiwaAwIH7DBPW
yVbaCBBY9XMUz7esODov/9OMdZuhcjuk6NXntNsASAbDC0BuVCAJLsVR6ir7r8xO
F7DtrnhhEjcE7R1Wkf4A7i/DyUy/7oJRy2o7psAPJJIS+Hz+bHN+zN+/w9YpCm07
8ZmCy/fJmhIRoymCrdHEbHy9GfNuDfTow1H6+nPzTdA7z33uhOxLJMhYtZjzDOkZ
QT4cwj3aHGF7bFrWvEzauJeTtGyEh5fSpgJvH3kA+Z2cVJRYkW3JZR5B2aTbhPdO
ac4dhp3qUR9DVTjih2I1eP8FBavr5Rb56NIe4HGyL2QIyvKjpqkfH5TRJ1vRbQB3
OjT8nWRkTmHvUxJXg5TmhZVvBt48/xjk5DO1W/GC516r96q1S5YieQzOJ4RUNFIz
SInUke0OLzmha8P9vDv+2owT59IRTl7uO6fQXGSR7bshA5MlquBvzdQ0g837r3Nh
ys1AXI+jrfelR0umHY8bMcrCcXeWbXyGAKIzkTz8x1I2xDzIPZVW4vB/cS8CAwEA
AQKCAgEAwiOC7i/GbLejeA485UnqkssIu8ErOqmsIlQRWwUF4lvl/cGXfcK0Jzyj
XFJgD/Jgoh9qvXXDUdHgR82bZKZhUy22HflqZ4rOeR2Veg5SZWmTYNI53E7UoA9W
Jaka3bxf1LJgLL2d+38waOlMB54BHihK/9NjCsGiYgPXF9XW/Oaf262KG3Pg/eWu
6Gz+7CRqOBkRyiJl5Fz6aS7kQSDjeVwJEPSpNOPSWlQg+No+/IBVBVZm+e7GtRmt
A1j7IAG0m7wwipLFdBiTa69Cky0nkhjmU/Mtg4Ee+yFyrtcxmQHx/XbgiCX3xrV5
HMQGYjy9sjh4Uz023OcTZ+olqK2aoZjY/avsPKOtx9ybbO/YFER7f4PBts+IvCVS
SgAdli6tdoAO/GCHnXKjjLT2WaL8ZXOQcpNFFpLsaRxmq21AKMFCT74fl4euX5cA
qCflO6LxxtclXJdiaJJSuop0xp5KSJ4svRVScq9pHqJCjFoLEkvhYEpfI0nqeodP
jWqlNPiARFK0nnGk5+Uxfjo1WfsnRUvj7bPUbMp/xyG9dFQ0fg40XCIIHV1fTk38
iL+Da0ijtORrIG8kwzL0q4tBU8/89ePvbsk1gOVDr+3nwoB84UmA+zmniHzFGjf4
btF8v840epHaPjMSjWOnTMmsqycZ7imjBGhuqY5vwf1hmMZ3bhECggEBAOfgq1y7
3uvAPzk9gUsDNSPSfmcszw4haHGIaOSmwUwm0klYxqa73T/6AnmjqjRfGErkqqpl
+O0L6oA1+KCS/pCSgN6/uWbtlcS8drniD9rHh9C5twBOOU2e77aDLdQx4SnHkHQZ
GnNpIi4m0PWUaa7qsBBGKpZMDqZCLXZw/6olCGoymrAxW+Tq79/lOf8Ngbz2jzpV
Ou+TAEb06Vy9fBniGb02+8cOPgECPo1a5cdij/1eU11CU66G5Re5il+34jZbVBo9
Zmzanlc/hBSrZ4f9IMJVJLD8/ccc9exCXm+FHBWNpEE/gzxQWPb2ye7CoBep+glD
vfNg+lmUJLfxcuUCggEBANl20pe7WqKME1NOBt/EsX8DKlwoP6zdVasQ57ywDgif
9iKW1Fp0d4hbYEwvMfwXXb6uYlLIXRB6slKxuiuZOXo5DFZzGTmgY1kgachyau4l
nNdGXctCdlT7XklQOj0WgyKkGjFrHKVS5B+Go7/jdtM+JmqR8nhfzSPysaXZbwor
P7sGB+Wx/XbCPpupIZl7nPgOh5ctLS38WAh60++JZ2uLvJCkELA9dJj9ero5r/T8
I4RjNK759mVgzay1UYRlmBFK23JwZxqnpA0gFbfVYyyAfA3VTlLu8ydpNq93Gd1/
w2C5YL9iah7xI4XIlPiOLXWxWyuX7x0IrshejWTSroMCggEBAK8Bg3Q3GzWFYHJc
OFQcNKQ3v00xpYh9sG1XzgsczHEkL7xJ84xt57vcfre9zb0/NH95/FElK24Fe1SO
53qR1u3YlMkJnO3RTSMyNs1ukBbIV3oyYKsrXtZ1qWhvs0we5Vj6FM17ENqgM7rv
cvCWtfjdikqOGqBbAQd8lQF6oYuR7brxPIzUhA3PP4IVaONWF2A+GrWlFBkzMpdb
SzHClYKXgmOrtvVyi1uJjRp0y03j1tcctQCDCdOEXi28zHIXv/TUkzJGuyJXEgC5
oH9VKouZgXsKdena19LKydUp9kpnBV5DDABu5ibEYZDrjFbWr6uMj3kklp20yN6J
D/mAkv0CggEAcWLGHT0f3d8BeI8XgHczQRFqddC6mqxxLZfL7JMzTgXxtUlFgcB2
Ts+uHysAefvI8lJEi/tSovQGpJ1sf60Nzg+OwkiTH3vkMSV4Yn5eCLvt0kUrRH7r
6hWCrOE67H0fdOFxktDRh9X3ggSWvsegPjaKm0hrz53L/XFedSYxAnFYcnCLj5VF
njVbpZgDH97XEnOo+QciJncLg6hfducC2I1sjVIuLWZttBN+eTj46NjKwA1l+9Hz
Shq2QtXrogfCyUlpsHqxF7HPFNTk3gxSAHMhu6i7hPx4JdVzIPwNrXMfcQBXVJLA
2E9NAUV7fznKtDH8Ynd+wnmzgF/kg2xidwKCAQAg4h/BV1tPoJBuX2utlvvw+TjS
yuN6GcR7aZu4tvkctktvxcRihyyiZ1Rycftzqij1haA4xxcCzGFDbpAdjUwfO43+
0RIV3oLnpvxATxOHGNhvUa7GGYgdJLs9hrX9cTqZRR2Bqt5isTWytaI+b8ViEP7w
rvZQVBkmeg9FUXC4rcTSkbaPrzi3RRMkdtu+EdszLJAEEgt6umqNPd3AIDcwAgK/
2rclPBpncTWYWRRoaay+BMHyJPNmgFZdTkem36WiM1xQ3b1I0fzjcqdX+aDn6Cm9
PUxB/vFK9xffL0geEAKptfZJ/kbcZlzecO9GosMvYTEty1ikLTxdYx39/kSm
-----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-----

@ -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',
),
]

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

Loading…
Cancel
Save