parent
33f12bca3e
commit
d3f018ace1
619 changed files with 74828 additions and 88386 deletions
@ -1,18 +0,0 @@ |
||||
orlova@mokselle.ru |
||||
arhipov@mokselle.com |
||||
robert@mokselle.ru |
||||
nemtsev@mokselle.ru |
||||
grebennikova@mokselle.com |
||||
a.rybalov@mokselle.ru |
||||
isaev@mokselle.ru |
||||
kravchenko@mokselle.ru |
||||
volosnikov@mokselle.com |
||||
korneva@mokselle.com |
||||
ivanova@mokselle.ru |
||||
shilin@mokselle.com |
||||
grishchenko@mokselle.ru |
||||
iskusnov@mokselle.ru |
||||
dolya@mokselle.com |
||||
dolia@mokselle.ru |
||||
vorobjova@mokselle.com |
||||
plavko@mokselle.ru |
||||
@ -1,11 +0,0 @@ |
||||
queue = tuple(i for i in range(0, 99999)) |
||||
point = 0 |
||||
|
||||
|
||||
def handler(): |
||||
print() |
||||
|
||||
|
||||
def switch(): |
||||
for count in queue: |
||||
handler() |
||||
@ -1,71 +1,71 @@ |
||||
einzheev@itl.com.kz |
||||
dmitry.sedov@inbox.ru |
||||
ivanpokalyuk@gmail.com |
||||
baho9208@mail.ru |
||||
feyorz@gmail.com |
||||
waximov@gmail.com |
||||
alvo_05@mail.ru |
||||
redkuk@gmail.com |
||||
petrichv@gmail.com |
||||
tagfelix500@gmail.com |
||||
ikey0172@mail.ru |
||||
gb.gayane@gmail.com |
||||
eco.pun@gmail.com |
||||
sanzharsurshanov@gmail.com |
||||
dennis.loboda@gmail.com |
||||
webar4i@gmail.com |
||||
zvetaan@gmail.com |
||||
svelavs@gmail.com |
||||
art@magicdesign.ru |
||||
mbf23tb@gmail.com |
||||
andrievskiydmitriy@gmail.com |
||||
pulya7@gmail.com |
||||
mikhail.a.gusev@gmail.com |
||||
elena@citrus-soft.ru |
||||
kropev@rarus.ru |
||||
nikonorov@labizum.ru |
||||
gulin@labizum.ru |
||||
vladfedorovich@gmail.com |
||||
Gfgaliya@gmail.com |
||||
romqa.guard@gmail.com |
||||
srfedotov@gmail.com |
||||
vinjuli4ka2008@rambler.ru |
||||
kuzzzal@gmail.com |
||||
zvetaan@gmail.com |
||||
lepon@bk.ru |
||||
y.robocopov@gmail.com |
||||
enchervinskaya@gmail.com |
||||
volokos@gmail.com |
||||
mtsalka@scnsoft.com |
||||
dubnyak404@gmail.com |
||||
o.tibirkova@yandex.ru |
||||
a.nikiforov@uplab.ru |
||||
dmytriy.suslov@gmail.com |
||||
s.shtukaturka@gmail.com |
||||
alex.dntv@gmail.com |
||||
m.chelyadenkov@gmail.com |
||||
timur.shulgin@infocraft.ru |
||||
sp.rusanov@gmail.com |
||||
zyabra@gmail.com |
||||
timakova@fistashki.org |
||||
aknoraz@deloitte.ru |
||||
sesyunin@realweb.ru |
||||
bravo.johnny@yandex.ru |
||||
didenko@braind.agency |
||||
whysecondjuly@gmail.com |
||||
yuzik.74@gmail.com |
||||
art@amado-id.ru |
||||
9330733@mail.ru |
||||
ek.design11@gmail.com |
||||
danila.zarechnev@gmail.com |
||||
kira.yakuhina@gmail.com |
||||
geiz@yandex.ru |
||||
tuning_a@mail.ru |
||||
suonarama@gmail.com |
||||
abrakadavr@gmail.com |
||||
irina_z_z@mail.ru irina.huchak@gmail.com |
||||
ha@brightstudio.ru |
||||
smorozov@qsoft.ru |
||||
a.reva@qsoft.ru |
||||
d.pogodin@itech-group.ru |
||||
einzheev@itl.com.kz |
||||
dmitry.sedov@inbox.ru |
||||
ivanpokalyuk@gmail.com |
||||
baho9208@mail.ru |
||||
feyorz@gmail.com |
||||
waximov@gmail.com |
||||
alvo_05@mail.ru |
||||
redkuk@gmail.com |
||||
petrichv@gmail.com |
||||
tagfelix500@gmail.com |
||||
ikey0172@mail.ru |
||||
gb.gayane@gmail.com |
||||
eco.pun@gmail.com |
||||
sanzharsurshanov@gmail.com |
||||
dennis.loboda@gmail.com |
||||
webar4i@gmail.com |
||||
zvetaan@gmail.com |
||||
svelavs@gmail.com |
||||
art@magicdesign.ru |
||||
mbf23tb@gmail.com |
||||
andrievskiydmitriy@gmail.com |
||||
pulya7@gmail.com |
||||
mikhail.a.gusev@gmail.com |
||||
elena@citrus-soft.ru |
||||
kropev@rarus.ru |
||||
nikonorov@labizum.ru |
||||
gulin@labizum.ru |
||||
vladfedorovich@gmail.com |
||||
Gfgaliya@gmail.com |
||||
romqa.guard@gmail.com |
||||
srfedotov@gmail.com |
||||
vinjuli4ka2008@rambler.ru |
||||
kuzzzal@gmail.com |
||||
zvetaan@gmail.com |
||||
lepon@bk.ru |
||||
y.robocopov@gmail.com |
||||
enchervinskaya@gmail.com |
||||
volokos@gmail.com |
||||
mtsalka@scnsoft.com |
||||
dubnyak404@gmail.com |
||||
o.tibirkova@yandex.ru |
||||
a.nikiforov@uplab.ru |
||||
dmytriy.suslov@gmail.com |
||||
s.shtukaturka@gmail.com |
||||
alex.dntv@gmail.com |
||||
m.chelyadenkov@gmail.com |
||||
timur.shulgin@infocraft.ru |
||||
sp.rusanov@gmail.com |
||||
zyabra@gmail.com |
||||
timakova@fistashki.org |
||||
aknoraz@deloitte.ru |
||||
sesyunin@realweb.ru |
||||
bravo.johnny@yandex.ru |
||||
didenko@braind.agency |
||||
whysecondjuly@gmail.com |
||||
yuzik.74@gmail.com |
||||
art@amado-id.ru |
||||
9330733@mail.ru |
||||
ek.design11@gmail.com |
||||
danila.zarechnev@gmail.com |
||||
kira.yakuhina@gmail.com |
||||
geiz@yandex.ru |
||||
tuning_a@mail.ru |
||||
suonarama@gmail.com |
||||
abrakadavr@gmail.com |
||||
irina_z_z@mail.ru irina.huchak@gmail.com |
||||
ha@brightstudio.ru |
||||
smorozov@qsoft.ru |
||||
a.reva@qsoft.ru |
||||
d.pogodin@itech-group.ru |
||||
lemma.ka@gmail.com |
||||
@ -1,117 +1,117 @@ |
||||
makspirogov@gmail.com |
||||
velesart@gmail.com |
||||
dmitrij.pastushenko@gmail.com |
||||
pavlov@complexsys.ru |
||||
ceo@pride-m.ru |
||||
spinngewebex@gmail.com |
||||
an_b@inbox.ru |
||||
ilyuha86@gmail.com |
||||
juniperland@gmail.com |
||||
egor@yugs.ru |
||||
kashlatch@gmail.com |
||||
niozuki@mail.ru |
||||
Gnatovych@gmail.com |
||||
sahem@mail.ru |
||||
zfalevich@gmail.com |
||||
lalaviva@yandex.ru |
||||
z.ilnurri@gmail.com |
||||
mmaslennikov@mail.ru |
||||
info@wbest.ru |
||||
arthur.subbota@gmail.com |
||||
goha@kiosov.com |
||||
Igorfedorenko@mail.ru |
||||
annazayidova@gmail.com |
||||
anton.reznichenko@gmail.com |
||||
me@flexure.ru |
||||
es@vipro.ru |
||||
km@colary.ru |
||||
kiselev_s_l@mail.ru |
||||
a.reznichenko@clientlab.ru |
||||
soldakov.p@yandex.ru |
||||
ap@ds-p.ru |
||||
702752@gmail.com |
||||
shpakova@sebbia.com |
||||
skugarov@sebbia.com |
||||
taranov@sebbia.com |
||||
rusakovevgen@gmail.com |
||||
frostoffman@gmail.com |
||||
a.khadeko@gmail.com |
||||
trogatyuk@gmail.com |
||||
hello@aokunev.com |
||||
dengenich@gmail.com |
||||
Alexpozdnyakof@gmail.com |
||||
korobajr@ya.ru |
||||
pavlov@complexsys.ru |
||||
elizaveta.bandalet@gmail.com |
||||
deniskondrashov@yahoo.com |
||||
prokosha10@gmail.com |
||||
i.flinn@yandex.ru |
||||
s.darbaidze@inostudio.com |
||||
zhurakoff@gmail.com |
||||
krylya@inbox.ru |
||||
146133@gmail.com |
||||
i.flinn@yandex.ru |
||||
sasha.melbourne@gmail.com |
||||
tiano_taurus747@mail.ru |
||||
hip-hop-org@yandex.ru |
||||
j.tolkova@yandex.ru |
||||
jaglin@itsoft.ru |
||||
den.volchkevich@gmail.com |
||||
yakimov.dmitriy@gmail.com |
||||
994677@mail.ru |
||||
rumbeshta@userstory.ru |
||||
ylkin_list@mail.ru |
||||
salofoot@fermastudio.ru |
||||
smiley1776@gmail.com |
||||
info@darneo.ru |
||||
egor@studiofact.ru |
||||
alevtina.i.danilova@gmail.com |
||||
puponina.irina@gmail.com |
||||
yevseev@mail.ru |
||||
ekde@wide-web.spb.ru |
||||
corpas@gmail.com |
||||
nitrohlorid@gmail.com |
||||
kayl24brof@gmail.com |
||||
skovalska@mail.ru |
||||
Dmitry.eremin7@gmail.com |
||||
Nikolebedev@mail.ru |
||||
ishulga86@gmail.com |
||||
bobafas@gmail.com |
||||
kalina531345@gmail.com |
||||
dsgn.shots@gmail.com |
||||
dsukhanova@gmail.com |
||||
kizilov.s@gmail.com |
||||
zlk.marjana@gmail.com |
||||
nava011235@gmail.com |
||||
i.shymanskyi@gmail.com |
||||
anastasy.petrenko87@gmail.com |
||||
dinozavrix@gmail.com |
||||
yana.berezhnaya999@gmail.com |
||||
person.ira@gmail.com |
||||
bershonok@gmail.com |
||||
vivi_bvo@mail.ru |
||||
lens2002@gmail.com |
||||
ohmeinkot@gmail.com |
||||
d22s@ya.ru |
||||
masha49@yandex.ru |
||||
biz.trp@gmail.com |
||||
leo55506@gmail.com |
||||
ksenia.vitkova@gmail.com |
||||
e.poberezhnik@artw.ru |
||||
alexzarkov@gmail.com |
||||
ekde@wide-web.spb.ru |
||||
vemelin@gmail.com |
||||
gausf2@gmail.com |
||||
vd@wearewowagency.com |
||||
va@wearewowagency.com |
||||
domrachv@gmail.com |
||||
ad@wearewowagency.com |
||||
jalalovna@yandex.ru |
||||
mohov-g@yandex.ru |
||||
st.wasp@yandex.ru |
||||
Irina.lisofa@gmail.com |
||||
Kornblumchen@yandex.ru |
||||
albytime@gmail.com |
||||
as.plyaskin@gmail.com |
||||
trunovaon@gmail.com |
||||
makspirogov@gmail.com |
||||
velesart@gmail.com |
||||
dmitrij.pastushenko@gmail.com |
||||
pavlov@complexsys.ru |
||||
ceo@pride-m.ru |
||||
spinngewebex@gmail.com |
||||
an_b@inbox.ru |
||||
ilyuha86@gmail.com |
||||
juniperland@gmail.com |
||||
egor@yugs.ru |
||||
kashlatch@gmail.com |
||||
niozuki@mail.ru |
||||
Gnatovych@gmail.com |
||||
sahem@mail.ru |
||||
zfalevich@gmail.com |
||||
lalaviva@yandex.ru |
||||
z.ilnurri@gmail.com |
||||
mmaslennikov@mail.ru |
||||
info@wbest.ru |
||||
arthur.subbota@gmail.com |
||||
goha@kiosov.com |
||||
Igorfedorenko@mail.ru |
||||
annazayidova@gmail.com |
||||
anton.reznichenko@gmail.com |
||||
me@flexure.ru |
||||
es@vipro.ru |
||||
km@colary.ru |
||||
kiselev_s_l@mail.ru |
||||
a.reznichenko@clientlab.ru |
||||
soldakov.p@yandex.ru |
||||
ap@ds-p.ru |
||||
702752@gmail.com |
||||
shpakova@sebbia.com |
||||
skugarov@sebbia.com |
||||
taranov@sebbia.com |
||||
rusakovevgen@gmail.com |
||||
frostoffman@gmail.com |
||||
a.khadeko@gmail.com |
||||
trogatyuk@gmail.com |
||||
hello@aokunev.com |
||||
dengenich@gmail.com |
||||
Alexpozdnyakof@gmail.com |
||||
korobajr@ya.ru |
||||
pavlov@complexsys.ru |
||||
elizaveta.bandalet@gmail.com |
||||
deniskondrashov@yahoo.com |
||||
prokosha10@gmail.com |
||||
i.flinn@yandex.ru |
||||
s.darbaidze@inostudio.com |
||||
zhurakoff@gmail.com |
||||
krylya@inbox.ru |
||||
146133@gmail.com |
||||
i.flinn@yandex.ru |
||||
sasha.melbourne@gmail.com |
||||
tiano_taurus747@mail.ru |
||||
hip-hop-org@yandex.ru |
||||
j.tolkova@yandex.ru |
||||
jaglin@itsoft.ru |
||||
den.volchkevich@gmail.com |
||||
yakimov.dmitriy@gmail.com |
||||
994677@mail.ru |
||||
rumbeshta@userstory.ru |
||||
ylkin_list@mail.ru |
||||
salofoot@fermastudio.ru |
||||
smiley1776@gmail.com |
||||
info@darneo.ru |
||||
egor@studiofact.ru |
||||
alevtina.i.danilova@gmail.com |
||||
puponina.irina@gmail.com |
||||
yevseev@mail.ru |
||||
ekde@wide-web.spb.ru |
||||
corpas@gmail.com |
||||
nitrohlorid@gmail.com |
||||
kayl24brof@gmail.com |
||||
skovalska@mail.ru |
||||
Dmitry.eremin7@gmail.com |
||||
Nikolebedev@mail.ru |
||||
ishulga86@gmail.com |
||||
bobafas@gmail.com |
||||
kalina531345@gmail.com |
||||
dsgn.shots@gmail.com |
||||
dsukhanova@gmail.com |
||||
kizilov.s@gmail.com |
||||
zlk.marjana@gmail.com |
||||
nava011235@gmail.com |
||||
i.shymanskyi@gmail.com |
||||
anastasy.petrenko87@gmail.com |
||||
dinozavrix@gmail.com |
||||
yana.berezhnaya999@gmail.com |
||||
person.ira@gmail.com |
||||
bershonok@gmail.com |
||||
vivi_bvo@mail.ru |
||||
lens2002@gmail.com |
||||
ohmeinkot@gmail.com |
||||
d22s@ya.ru |
||||
masha49@yandex.ru |
||||
biz.trp@gmail.com |
||||
leo55506@gmail.com |
||||
ksenia.vitkova@gmail.com |
||||
e.poberezhnik@artw.ru |
||||
alexzarkov@gmail.com |
||||
ekde@wide-web.spb.ru |
||||
vemelin@gmail.com |
||||
gausf2@gmail.com |
||||
vd@wearewowagency.com |
||||
va@wearewowagency.com |
||||
domrachv@gmail.com |
||||
ad@wearewowagency.com |
||||
jalalovna@yandex.ru |
||||
mohov-g@yandex.ru |
||||
st.wasp@yandex.ru |
||||
Irina.lisofa@gmail.com |
||||
Kornblumchen@yandex.ru |
||||
albytime@gmail.com |
||||
as.plyaskin@gmail.com |
||||
trunovaon@gmail.com |
||||
yuri.a.k.design@gmail.com |
||||
@ -1,38 +1,38 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from access.models import User |
||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField |
||||
from django import forms |
||||
|
||||
|
||||
class UserCreationForm(forms.ModelForm): |
||||
password1 = forms.CharField(label='Password', widget=forms.PasswordInput) |
||||
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) |
||||
|
||||
class Meta: |
||||
model = User |
||||
fields = '__all__' |
||||
|
||||
def clean_password2(self): |
||||
password1 = self.cleaned_data.get("password1") |
||||
password2 = self.cleaned_data.get("password2") |
||||
if password1 and password2 and password1 != password2: |
||||
raise forms.ValidationError("Passwords don't match") |
||||
return password2 |
||||
|
||||
def save(self, commit=True): |
||||
user = super(UserCreationForm, self).save(commit=False) |
||||
user.set_password(self.cleaned_data["password1"]) |
||||
if commit: |
||||
user.save() |
||||
return user |
||||
|
||||
|
||||
class UserChangeForm(forms.ModelForm): |
||||
password = ReadOnlyPasswordHashField() |
||||
|
||||
class Meta: |
||||
model = User |
||||
fields = '__all__' |
||||
|
||||
def clean_password(self): |
||||
# -*- coding: utf-8 -*- |
||||
from access.models import User |
||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField |
||||
from django import forms |
||||
|
||||
|
||||
class UserCreationForm(forms.ModelForm): |
||||
password1 = forms.CharField(label='Password', widget=forms.PasswordInput) |
||||
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) |
||||
|
||||
class Meta: |
||||
model = User |
||||
fields = '__all__' |
||||
|
||||
def clean_password2(self): |
||||
password1 = self.cleaned_data.get("password1") |
||||
password2 = self.cleaned_data.get("password2") |
||||
if password1 and password2 and password1 != password2: |
||||
raise forms.ValidationError("Passwords don't match") |
||||
return password2 |
||||
|
||||
def save(self, commit=True): |
||||
user = super(UserCreationForm, self).save(commit=False) |
||||
user.set_password(self.cleaned_data["password1"]) |
||||
if commit: |
||||
user.save() |
||||
return user |
||||
|
||||
|
||||
class UserChangeForm(forms.ModelForm): |
||||
password = ReadOnlyPasswordHashField() |
||||
|
||||
class Meta: |
||||
model = User |
||||
fields = '__all__' |
||||
|
||||
def clean_password(self): |
||||
return self.initial["password"] |
||||
@ -1,448 +1,448 @@ |
||||
# coding=utf-8 |
||||
import datetime |
||||
|
||||
from lms.decors import out_api_decor, api_decor |
||||
from access.models import TrafSource, User, TrafHistory # , UserSync |
||||
from lms.regex import check_email |
||||
from management.letters import sent_registration |
||||
from finance.models import Price, Bill |
||||
from lms.tools import out_date_format |
||||
import hashlib |
||||
from django.contrib import auth |
||||
from lms.settings import SECRET_KEY, SUPERVISOR, MANAGER |
||||
from django.http import Http404 |
||||
|
||||
|
||||
@api_decor(without_auth=False) |
||||
def set_in_user(request, context): |
||||
# Наша установка |
||||
data = None |
||||
context['code'] = '0' |
||||
context['response'] = '' |
||||
if request.user and request.user.is_authenticated() and request.user.is_admin: |
||||
if request.method: |
||||
if request.method == 'POST': |
||||
data = request.POST |
||||
elif request.method == 'GET': |
||||
data = request.GET |
||||
else: |
||||
raise Http404 |
||||
|
||||
if not data or not (data.get('SERVICE') or data.get('USER')) or (data.get('SERVICE') and not data.get('USER')): |
||||
context['response'] = u'REQUEST IS NOT VALID. ' \ |
||||
u'USER - user email (required) / ' \ |
||||
u'SERVICE - service token / ' \ |
||||
u'GIFT - will set bill in a payed status / ' \ |
||||
u'PRICE - set self price to the service' |
||||
return context |
||||
|
||||
service = None |
||||
if data.get('SERVICE'): |
||||
try: |
||||
service = Price.objects.get(key=data.get('SERVICE')) |
||||
except Price.DoesNotExist: |
||||
context['response'] = u'SERVICE NOT FOUND' |
||||
return context |
||||
|
||||
if data.get('USER') and check_email(data.get('USER')): |
||||
result, user = self_create_user(data.get('USER'), sent_letter=True) |
||||
context['response'] = 'USER CREATED.' if result else 'USER ALREADY EXISTS.' |
||||
|
||||
elif not check_email(data.get('USER')): |
||||
context['response'] = 'USER EMAIL IS NOT VALID' |
||||
|
||||
if service and user: |
||||
bill, created = Bill.objects.get_or_create(service=service, |
||||
gift=bool(data.get('GIFT')), |
||||
user=user, |
||||
status='F' if data.get('GIFT') else 'W', |
||||
manager=User.objects.get(email=MANAGER), |
||||
price=data['PRICE'] if data.get('PRICE') else service.cost) |
||||
if created: |
||||
if data.get('GIFT'): |
||||
context['response'] += ' ACCESS OPENED. IT IS A GIFT.' |
||||
else: |
||||
context['response'] += ' THIS OFFER SENT TO THE USER. THE SERVICE PRICE: %s' % str(bill.price) |
||||
|
||||
else: |
||||
context['response'] += ' BILL ALREADY EXISTS id:%s' % str(bill.id) |
||||
|
||||
return context |
||||
|
||||
|
||||
def self_check_token(token): |
||||
try: |
||||
source = TrafSource.objects.get(on=True, token=token) |
||||
except TrafSource.DoesNotExist: |
||||
return [False, None] |
||||
else: |
||||
return [True, source] |
||||
|
||||
|
||||
def self_check_user_exists(email): |
||||
email = email.lower() |
||||
try: |
||||
user = User.objects.get(email=email) |
||||
except User.DoesNotExist: |
||||
return [False, None] |
||||
else: |
||||
return [True, user] |
||||
|
||||
|
||||
def self_create_user(email, phone=None, sent_letter=True): |
||||
email = email.lower() |
||||
try: |
||||
user = User.objects.get(email=email) |
||||
except User.DoesNotExist: |
||||
user = User.objects.create_user(email=email, sent_letter=sent_letter) |
||||
user.reg_status = '1' |
||||
user.refer = 'B' |
||||
user.is_active = False |
||||
if phone: |
||||
user.phone = phone |
||||
user.save() |
||||
return [True, user] |
||||
|
||||
else: |
||||
return [False, user] |
||||
|
||||
|
||||
def self_create_bill(user, service_key, uid=None): |
||||
# Создание счета для пользователя по ключу услуги |
||||
description = u'' |
||||
bill = None |
||||
result = False |
||||
try: |
||||
price = Price.objects.get(key=service_key) |
||||
except Price.DoesNotExist: |
||||
description = u'Счет по ключу не найден' |
||||
else: |
||||
bill, c = Bill.objects.get_or_create(user=user, manager=User.objects.get(email=SUPERVISOR), service=price) |
||||
|
||||
if bill.status == 'F': |
||||
description = u'Счет для данного пользователя уже был создан {0}'.format( |
||||
out_date_format(bill.finish_date, no_time=True)) |
||||
result = False |
||||
else: |
||||
result = True |
||||
description = u'Счет успешно создан. Приятного обучения' |
||||
if bill.status in ['C', 'H']: |
||||
bill.status = 'P' |
||||
bill.status_changed = datetime.datetime.now() |
||||
bill.save() |
||||
|
||||
if uid: |
||||
bill.admitad_uid = uid |
||||
bill.save() |
||||
|
||||
return [result, description, bill] |
||||
|
||||
|
||||
def code_dict(d): |
||||
# Преобразование словаря для передачи по HTTP |
||||
return u'||'.join(list([u'{0}|{1}'.format(key, value) for key, value in d.items()])) |
||||
|
||||
|
||||
def decode_dict(s): |
||||
# Расшифровка словаря из строки, переданого по HTTP |
||||
result = {} |
||||
for one in s.split(u'||'): |
||||
__tmp = one.split(u'|') |
||||
result[__tmp[0]] = __tmp[1] |
||||
return result |
||||
|
||||
|
||||
def get_sync_data(user): |
||||
# Синхронизировать пользователя с остальными LMS |
||||
# Отправить в LMS измнениея по пользователю или нового пользователя |
||||
# POST['user'] = {} # Поля с полной информацией пользователя |
||||
_data = {} |
||||
_keys = [] |
||||
exclude = ['id', 'customer', 'deactivate', 'delay', 'delay_description', 'delay_date', 'changed_email', 'status', |
||||
'last_time', 'date_joined', 'avatar', 'last_login', 'activate_time', 'in_avatar'] |
||||
|
||||
for key in user._meta.local_concrete_fields: |
||||
if key.name not in exclude: |
||||
_tmp = key.value_to_string(user) |
||||
if _tmp: |
||||
_keys.append(key.name) |
||||
_data[key.name] = _tmp |
||||
|
||||
_tmp = code_dict(_data) |
||||
return {'data': _tmp, |
||||
'hash': hashlib.md5(_tmp.encode('utf-8')).hexdigest()} |
||||
|
||||
|
||||
''' |
||||
def sent_sync_user(user): |
||||
data = get_sync_data(user) |
||||
data['secret_key'] = SECRET_KEY |
||||
data['source'] = DOMAIN |
||||
## Если провал на одном из этапов - пропустить синхронизацию этого пользователя |
||||
# Авторизация на сервисе под системным пользователем |
||||
result = 0 |
||||
for HOST in REL_LMS: |
||||
__tmp = HOST['protocol'] + HOST['url'] |
||||
if __tmp != DOMAIN: |
||||
log = UserSync.objects.create(user=user, source=DOMAIN, dist=__tmp, data=str(data)) |
||||
_request = requests.post(__tmp + 'access/sync_user/', data=data) |
||||
if _request.status_code == 200: |
||||
_tmp = ast.literal_eval(_request.text) |
||||
if _tmp['code'] == '1': |
||||
result += 1 |
||||
log.good_sync() |
||||
else: |
||||
log.fail_sync() |
||||
else: |
||||
log.fail_sync() |
||||
|
||||
return result == len(REL_LMS)-1 |
||||
''' |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, method='POST', need_keys=['email', 'password', 'secret_key'], check_request=True) |
||||
def service_auth(request, context): |
||||
# Удаленная авторизация для внутренних процессов |
||||
# Авторизация |
||||
if request.POST['secret_key'] == SECRET_KEY: |
||||
email = request.POST['email'].lower() |
||||
user = auth.authenticate(email=email, password=request.POST.get('password')) |
||||
|
||||
if user is not None: |
||||
context['code'] = '1' |
||||
context['response'] = u'AUTH_SUCCESS' |
||||
auth.login(request, user) |
||||
|
||||
elif user is None: |
||||
context['response'] = u'По введенным данным пользователь не найден' |
||||
context['code'] = '0' |
||||
|
||||
else: |
||||
context['response'] = u"Не верные данные. Повторите попытку" |
||||
context['code'] = '0' |
||||
else: |
||||
context['response'] = u'AUTH SUCCESS' |
||||
context['code'] = '0' |
||||
return context |
||||
|
||||
|
||||
''' |
||||
@out_api_decor(without_auth=True, method='POST', need_keys=['secret_key', 'data', 'hash', 'source'], check_request=True) |
||||
def sync_user(request, context): |
||||
if request.POST['secret_key'] == SECRET_KEY: |
||||
|
||||
if hashlib.md5(request.POST['data'].encode('utf-8')).hexdigest() != request.POST['hash']: |
||||
context['code'] = '0' |
||||
context['data'] = '' |
||||
context['response'] = u'Не сходится хеш данных' |
||||
return context |
||||
|
||||
data = decode_dict(request.POST['data']) |
||||
|
||||
# Получение пользователя для вставки |
||||
try: |
||||
user = User.objects.get(email=data['email']) |
||||
except User.DoesNotExist: |
||||
# Создать пользователя |
||||
user = User.objects.create(email=data['email']) |
||||
log = UserSync.objects.create(user=user, source=request.POST['source'], dist=DOMAIN, data=str(request.POST['data'])) |
||||
save = False |
||||
if 'refer' in data and user.refer != data['refer']: |
||||
user.refer = data['refer'] |
||||
save = True |
||||
|
||||
if 'refer_source' in data and user.refer_source != data['refer_source']: |
||||
user.refer_source = data['refer_source'] |
||||
save = True |
||||
|
||||
if 'private' in data and user.private != data['private']: |
||||
user.private = data['private'] |
||||
save = True |
||||
|
||||
if 'interactive_key' in data and user.interactive_key != data['interactive_key']: |
||||
user.interactive_key = data['interactive_key'] |
||||
save = True |
||||
|
||||
if 'email' in data and user.email != data['email']: |
||||
user.email = data['email'] |
||||
save = True |
||||
|
||||
if 'phone' in data and user.phone != data['phone']: |
||||
user.phone = data['phone'] |
||||
save = True |
||||
|
||||
if 'back_phone' in data and user.back_phone != data['back_phone']: |
||||
user.back_phone = data['back_phone'] |
||||
save = True |
||||
|
||||
if 'in_role' in data and user.in_role != data['in_role']: |
||||
user.in_role = data['in_role'] |
||||
save = True |
||||
|
||||
if 'unique_role' in data and user.unique_role != data['unique_role']: |
||||
user.unique_role = data['unique_role'] |
||||
save = True |
||||
|
||||
if 'city' in data and user.city != data['city']: |
||||
user.city = data['city'] |
||||
save = True |
||||
|
||||
if 'b_day' in data and user.b_day != data['b_day']: |
||||
user.b_day = data['b_day'] |
||||
save = True |
||||
|
||||
if 'token' in data and user.token != data['token']: |
||||
user.token = data['token'] |
||||
save = True |
||||
|
||||
if 'reg_status' in data and user.reg_status != data['reg_status']: |
||||
user.reg_status = data['reg_status'] |
||||
save = True |
||||
|
||||
if 'is_active' in data and user.is_active != data['is_active']: |
||||
user.is_active = data['is_active'] |
||||
save = True |
||||
|
||||
if 'is_admin' in data and user.is_admin != data['is_admin']: |
||||
user.is_admin = data['is_admin'] |
||||
save = True |
||||
|
||||
if 'is_staff' in data and user.is_staff != data['is_staff']: |
||||
user.is_staff = data['is_staff'] |
||||
save = True |
||||
|
||||
if 'fname' in data and user.fname != data['fname']: |
||||
user.fname = data['fname'] |
||||
save = True |
||||
|
||||
if 'name' in data and user.name != data['name']: |
||||
user.name = data['name'] |
||||
save = True |
||||
|
||||
if 'oname' in data and user.oname != data['oname']: |
||||
user.oname = data['oname'] |
||||
save = True |
||||
|
||||
if 'skype' in data and user.skype != data['skype']: |
||||
user.skype = data['skype'] |
||||
save = True |
||||
|
||||
if 'facebook' in data and user.facebook != data['facebook']: |
||||
user.facebook = data['facebook'] |
||||
save = True |
||||
|
||||
if 'vk' in data and user.vk != data['vk']: |
||||
user.vk = data['vk'] |
||||
save = True |
||||
|
||||
if 'linkedin' in data and user.linkedin != data['linkedin']: |
||||
user.linkedin = data['linkedin'] |
||||
save = True |
||||
|
||||
if 'odnoklassniki' in data and user.odnoklassniki != data['odnoklassniki']: |
||||
user.odnoklassniki = data['odnoklassniki'] |
||||
save = True |
||||
|
||||
if 'password' in data and user.password != data['password']: |
||||
user.password = data['password'] |
||||
save = True |
||||
|
||||
if save: |
||||
user.save() |
||||
log.good_sync() |
||||
context['code'] = '1' |
||||
else: |
||||
log.fail_sync() |
||||
|
||||
else: |
||||
raise Http404 |
||||
return context |
||||
''' |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, need_keys=['token', 'email'], method='POST', check_request=True) |
||||
def create_user(request, context): |
||||
# Создание пользователя |
||||
# TODO: Политика использования токена |
||||
res = False |
||||
result, source = self_check_token(request.POST['token']) |
||||
if not result: |
||||
context['code'] = '0' |
||||
description = u'Не найден активный источник' |
||||
context['response'] = description |
||||
return context |
||||
|
||||
result, user = self_check_user_exists(request.POST['email']) |
||||
if result: |
||||
if user.is_active and user.reg_status == '4': |
||||
context['code'] = '0' |
||||
description = u'Пользователь уже существует и активен' |
||||
context['response'] = description |
||||
else: |
||||
context['code'] = '1' |
||||
res = True |
||||
description = u'Пользователь уже существует. Отправлено повторное письмо активации' |
||||
context['response'] = description |
||||
sent_registration(user, title=u'Повторное письмо активации') |
||||
return context |
||||
else: |
||||
result, user = self_create_user(request.POST['email'], |
||||
phone=request.POST['phone'] if request.POST.get('phone') else None) |
||||
context['code'] = '1' |
||||
res = True |
||||
description = u'Пользователь создан. На указанный email отправлено письмо активации' |
||||
context['response'] = description |
||||
|
||||
ref_history = TrafHistory.objects.create(action='C', source=source, token=request.POST['token'], data=request.POST, |
||||
result_description=description, result=res) |
||||
user.traf_source = ref_history |
||||
user.save() |
||||
return context |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, check_request=True, need_keys=['token', 'service', 'email'], method='POST') |
||||
def create_bill(request, context): |
||||
# TODO: Политика использования токена |
||||
result, source = self_check_token(request.POST['token']) |
||||
if not result: |
||||
context['code'] = '0' |
||||
context['response'] = u'Не найден активный источник' |
||||
return context |
||||
|
||||
result, user = self_check_user_exists(request.POST['email']) |
||||
if result: |
||||
if not user.is_active or user.reg_status != '4': |
||||
sent_registration(user, title=u'Повторное письмо активации') |
||||
if request.POST.get('phone') and user.phone != request.POST.get('phone'): |
||||
user.phone = request.POST['phone'] |
||||
user.save() |
||||
else: |
||||
result, user = self_create_user(request.POST['email'], |
||||
phone=request.POST['phone'] if request.POST.get('phone') else None) |
||||
|
||||
result, description, bill = self_create_bill(user, request.POST['service'], |
||||
request.POST['uid'] if request.POST.get('uid') else None) |
||||
context['code'] = '1' if result else '0' |
||||
context['response'] = description |
||||
context['data'] = bill.get_face() |
||||
rel_source = TrafHistory.objects.create(action='O', source=source, token=request.POST['token'], data=request.POST, |
||||
result_description=description, result=True if result else False) |
||||
bill.traf_source = rel_source |
||||
bill.save() |
||||
return context |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, need_keys=['token', 'data'], method='POST', check_request=True) |
||||
def set_lendos_data(request, context): |
||||
# Создание пользователя |
||||
res = False |
||||
result, source = self_check_token(request.POST['token']) |
||||
if not result: |
||||
context['code'] = '0' |
||||
description = u'Не найден активный источник' |
||||
context['response'] = description |
||||
return context |
||||
|
||||
TrafHistory.objects.create(action='D', source=source, token=request.POST['token'], data=request.POST['data'], |
||||
result_description='Данные из форм', result=res) |
||||
return context |
||||
# coding=utf-8 |
||||
import datetime |
||||
|
||||
from lms.decors import out_api_decor, api_decor |
||||
from access.models import TrafSource, User, TrafHistory # , UserSync |
||||
from lms.regex import check_email |
||||
from management.letters import sent_registration |
||||
from finance.models import Price, Bill |
||||
from lms.tools import out_date_format |
||||
import hashlib |
||||
from django.contrib import auth |
||||
from lms.settings import SECRET_KEY, SUPERVISOR, MANAGER |
||||
from django.http import Http404 |
||||
|
||||
|
||||
@api_decor(without_auth=False) |
||||
def set_in_user(request, context): |
||||
# Наша установка |
||||
data = None |
||||
context['code'] = '0' |
||||
context['response'] = '' |
||||
if request.user and request.user.is_authenticated() and request.user.is_admin: |
||||
if request.method: |
||||
if request.method == 'POST': |
||||
data = request.POST |
||||
elif request.method == 'GET': |
||||
data = request.GET |
||||
else: |
||||
raise Http404 |
||||
|
||||
if not data or not (data.get('SERVICE') or data.get('USER')) or (data.get('SERVICE') and not data.get('USER')): |
||||
context['response'] = u'REQUEST IS NOT VALID. ' \ |
||||
u'USER - user email (required) / ' \ |
||||
u'SERVICE - service token / ' \ |
||||
u'GIFT - will set bill in a payed status / ' \ |
||||
u'PRICE - set self price to the service' |
||||
return context |
||||
|
||||
service = None |
||||
if data.get('SERVICE'): |
||||
try: |
||||
service = Price.objects.get(key=data.get('SERVICE')) |
||||
except Price.DoesNotExist: |
||||
context['response'] = u'SERVICE NOT FOUND' |
||||
return context |
||||
|
||||
if data.get('USER') and check_email(data.get('USER')): |
||||
result, user = self_create_user(data.get('USER'), sent_letter=True) |
||||
context['response'] = 'USER CREATED.' if result else 'USER ALREADY EXISTS.' |
||||
|
||||
elif not check_email(data.get('USER')): |
||||
context['response'] = 'USER EMAIL IS NOT VALID' |
||||
|
||||
if service and user: |
||||
bill, created = Bill.objects.get_or_create(service=service, |
||||
gift=bool(data.get('GIFT')), |
||||
user=user, |
||||
status='F' if data.get('GIFT') else 'W', |
||||
manager=User.objects.get(email=MANAGER), |
||||
price=data['PRICE'] if data.get('PRICE') else service.cost) |
||||
if created: |
||||
if data.get('GIFT'): |
||||
context['response'] += ' ACCESS OPENED. IT IS A GIFT.' |
||||
else: |
||||
context['response'] += ' THIS OFFER SENT TO THE USER. THE SERVICE PRICE: %s' % str(bill.price) |
||||
|
||||
else: |
||||
context['response'] += ' BILL ALREADY EXISTS id:%s' % str(bill.id) |
||||
|
||||
return context |
||||
|
||||
|
||||
def self_check_token(token): |
||||
try: |
||||
source = TrafSource.objects.get(on=True, token=token) |
||||
except TrafSource.DoesNotExist: |
||||
return [False, None] |
||||
else: |
||||
return [True, source] |
||||
|
||||
|
||||
def self_check_user_exists(email): |
||||
email = email.lower() |
||||
try: |
||||
user = User.objects.get(email=email) |
||||
except User.DoesNotExist: |
||||
return [False, None] |
||||
else: |
||||
return [True, user] |
||||
|
||||
|
||||
def self_create_user(email, phone=None, sent_letter=True): |
||||
email = email.lower() |
||||
try: |
||||
user = User.objects.get(email=email) |
||||
except User.DoesNotExist: |
||||
user = User.objects.create_user(email=email, sent_letter=sent_letter) |
||||
user.reg_status = '1' |
||||
user.refer = 'B' |
||||
user.is_active = False |
||||
if phone: |
||||
user.phone = phone |
||||
user.save() |
||||
return [True, user] |
||||
|
||||
else: |
||||
return [False, user] |
||||
|
||||
|
||||
def self_create_bill(user, service_key, uid=None): |
||||
# Создание счета для пользователя по ключу услуги |
||||
description = u'' |
||||
bill = None |
||||
result = False |
||||
try: |
||||
price = Price.objects.get(key=service_key) |
||||
except Price.DoesNotExist: |
||||
description = u'Счет по ключу не найден' |
||||
else: |
||||
bill, c = Bill.objects.get_or_create(user=user, manager=User.objects.get(email=SUPERVISOR), service=price) |
||||
|
||||
if bill.status == 'F': |
||||
description = u'Счет для данного пользователя уже был создан {0}'.format( |
||||
out_date_format(bill.finish_date, no_time=True)) |
||||
result = False |
||||
else: |
||||
result = True |
||||
description = u'Счет успешно создан. Приятного обучения' |
||||
if bill.status in ['C', 'H']: |
||||
bill.status = 'P' |
||||
bill.status_changed = datetime.datetime.now() |
||||
bill.save() |
||||
|
||||
if uid: |
||||
bill.admitad_uid = uid |
||||
bill.save() |
||||
|
||||
return [result, description, bill] |
||||
|
||||
|
||||
def code_dict(d): |
||||
# Преобразование словаря для передачи по HTTP |
||||
return u'||'.join(list([u'{0}|{1}'.format(key, value) for key, value in d.items()])) |
||||
|
||||
|
||||
def decode_dict(s): |
||||
# Расшифровка словаря из строки, переданого по HTTP |
||||
result = {} |
||||
for one in s.split(u'||'): |
||||
__tmp = one.split(u'|') |
||||
result[__tmp[0]] = __tmp[1] |
||||
return result |
||||
|
||||
|
||||
def get_sync_data(user): |
||||
# Синхронизировать пользователя с остальными LMS |
||||
# Отправить в LMS измнениея по пользователю или нового пользователя |
||||
# POST['user'] = {} # Поля с полной информацией пользователя |
||||
_data = {} |
||||
_keys = [] |
||||
exclude = ['id', 'customer', 'deactivate', 'delay', 'delay_description', 'delay_date', 'changed_email', 'status', |
||||
'last_time', 'date_joined', 'avatar', 'last_login', 'activate_time', 'in_avatar'] |
||||
|
||||
for key in user._meta.local_concrete_fields: |
||||
if key.name not in exclude: |
||||
_tmp = key.value_to_string(user) |
||||
if _tmp: |
||||
_keys.append(key.name) |
||||
_data[key.name] = _tmp |
||||
|
||||
_tmp = code_dict(_data) |
||||
return {'data': _tmp, |
||||
'hash': hashlib.md5(_tmp.encode('utf-8')).hexdigest()} |
||||
|
||||
|
||||
''' |
||||
def sent_sync_user(user): |
||||
data = get_sync_data(user) |
||||
data['secret_key'] = SECRET_KEY |
||||
data['source'] = DOMAIN |
||||
## Если провал на одном из этапов - пропустить синхронизацию этого пользователя |
||||
# Авторизация на сервисе под системным пользователем |
||||
result = 0 |
||||
for HOST in REL_LMS: |
||||
__tmp = HOST['protocol'] + HOST['url'] |
||||
if __tmp != DOMAIN: |
||||
log = UserSync.objects.create(user=user, source=DOMAIN, dist=__tmp, data=str(data)) |
||||
_request = requests.post(__tmp + 'access/sync_user/', data=data) |
||||
if _request.status_code == 200: |
||||
_tmp = ast.literal_eval(_request.text) |
||||
if _tmp['code'] == '1': |
||||
result += 1 |
||||
log.good_sync() |
||||
else: |
||||
log.fail_sync() |
||||
else: |
||||
log.fail_sync() |
||||
|
||||
return result == len(REL_LMS)-1 |
||||
''' |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, method='POST', need_keys=['email', 'password', 'secret_key'], check_request=True) |
||||
def service_auth(request, context): |
||||
# Удаленная авторизация для внутренних процессов |
||||
# Авторизация |
||||
if request.POST['secret_key'] == SECRET_KEY: |
||||
email = request.POST['email'].lower() |
||||
user = auth.authenticate(email=email, password=request.POST.get('password')) |
||||
|
||||
if user is not None: |
||||
context['code'] = '1' |
||||
context['response'] = u'AUTH_SUCCESS' |
||||
auth.login(request, user) |
||||
|
||||
elif user is None: |
||||
context['response'] = u'По введенным данным пользователь не найден' |
||||
context['code'] = '0' |
||||
|
||||
else: |
||||
context['response'] = u"Не верные данные. Повторите попытку" |
||||
context['code'] = '0' |
||||
else: |
||||
context['response'] = u'AUTH SUCCESS' |
||||
context['code'] = '0' |
||||
return context |
||||
|
||||
|
||||
''' |
||||
@out_api_decor(without_auth=True, method='POST', need_keys=['secret_key', 'data', 'hash', 'source'], check_request=True) |
||||
def sync_user(request, context): |
||||
if request.POST['secret_key'] == SECRET_KEY: |
||||
|
||||
if hashlib.md5(request.POST['data'].encode('utf-8')).hexdigest() != request.POST['hash']: |
||||
context['code'] = '0' |
||||
context['data'] = '' |
||||
context['response'] = u'Не сходится хеш данных' |
||||
return context |
||||
|
||||
data = decode_dict(request.POST['data']) |
||||
|
||||
# Получение пользователя для вставки |
||||
try: |
||||
user = User.objects.get(email=data['email']) |
||||
except User.DoesNotExist: |
||||
# Создать пользователя |
||||
user = User.objects.create(email=data['email']) |
||||
log = UserSync.objects.create(user=user, source=request.POST['source'], dist=DOMAIN, data=str(request.POST['data'])) |
||||
save = False |
||||
if 'refer' in data and user.refer != data['refer']: |
||||
user.refer = data['refer'] |
||||
save = True |
||||
|
||||
if 'refer_source' in data and user.refer_source != data['refer_source']: |
||||
user.refer_source = data['refer_source'] |
||||
save = True |
||||
|
||||
if 'private' in data and user.private != data['private']: |
||||
user.private = data['private'] |
||||
save = True |
||||
|
||||
if 'interactive_key' in data and user.interactive_key != data['interactive_key']: |
||||
user.interactive_key = data['interactive_key'] |
||||
save = True |
||||
|
||||
if 'email' in data and user.email != data['email']: |
||||
user.email = data['email'] |
||||
save = True |
||||
|
||||
if 'phone' in data and user.phone != data['phone']: |
||||
user.phone = data['phone'] |
||||
save = True |
||||
|
||||
if 'back_phone' in data and user.back_phone != data['back_phone']: |
||||
user.back_phone = data['back_phone'] |
||||
save = True |
||||
|
||||
if 'in_role' in data and user.in_role != data['in_role']: |
||||
user.in_role = data['in_role'] |
||||
save = True |
||||
|
||||
if 'unique_role' in data and user.unique_role != data['unique_role']: |
||||
user.unique_role = data['unique_role'] |
||||
save = True |
||||
|
||||
if 'city' in data and user.city != data['city']: |
||||
user.city = data['city'] |
||||
save = True |
||||
|
||||
if 'b_day' in data and user.b_day != data['b_day']: |
||||
user.b_day = data['b_day'] |
||||
save = True |
||||
|
||||
if 'token' in data and user.token != data['token']: |
||||
user.token = data['token'] |
||||
save = True |
||||
|
||||
if 'reg_status' in data and user.reg_status != data['reg_status']: |
||||
user.reg_status = data['reg_status'] |
||||
save = True |
||||
|
||||
if 'is_active' in data and user.is_active != data['is_active']: |
||||
user.is_active = data['is_active'] |
||||
save = True |
||||
|
||||
if 'is_admin' in data and user.is_admin != data['is_admin']: |
||||
user.is_admin = data['is_admin'] |
||||
save = True |
||||
|
||||
if 'is_staff' in data and user.is_staff != data['is_staff']: |
||||
user.is_staff = data['is_staff'] |
||||
save = True |
||||
|
||||
if 'fname' in data and user.fname != data['fname']: |
||||
user.fname = data['fname'] |
||||
save = True |
||||
|
||||
if 'name' in data and user.name != data['name']: |
||||
user.name = data['name'] |
||||
save = True |
||||
|
||||
if 'oname' in data and user.oname != data['oname']: |
||||
user.oname = data['oname'] |
||||
save = True |
||||
|
||||
if 'skype' in data and user.skype != data['skype']: |
||||
user.skype = data['skype'] |
||||
save = True |
||||
|
||||
if 'facebook' in data and user.facebook != data['facebook']: |
||||
user.facebook = data['facebook'] |
||||
save = True |
||||
|
||||
if 'vk' in data and user.vk != data['vk']: |
||||
user.vk = data['vk'] |
||||
save = True |
||||
|
||||
if 'linkedin' in data and user.linkedin != data['linkedin']: |
||||
user.linkedin = data['linkedin'] |
||||
save = True |
||||
|
||||
if 'odnoklassniki' in data and user.odnoklassniki != data['odnoklassniki']: |
||||
user.odnoklassniki = data['odnoklassniki'] |
||||
save = True |
||||
|
||||
if 'password' in data and user.password != data['password']: |
||||
user.password = data['password'] |
||||
save = True |
||||
|
||||
if save: |
||||
user.save() |
||||
log.good_sync() |
||||
context['code'] = '1' |
||||
else: |
||||
log.fail_sync() |
||||
|
||||
else: |
||||
raise Http404 |
||||
return context |
||||
''' |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, need_keys=['token', 'email'], method='POST', check_request=True) |
||||
def create_user(request, context): |
||||
# Создание пользователя |
||||
# TODO: Политика использования токена |
||||
res = False |
||||
result, source = self_check_token(request.POST['token']) |
||||
if not result: |
||||
context['code'] = '0' |
||||
description = u'Не найден активный источник' |
||||
context['response'] = description |
||||
return context |
||||
|
||||
result, user = self_check_user_exists(request.POST['email']) |
||||
if result: |
||||
if user.is_active and user.reg_status == '4': |
||||
context['code'] = '0' |
||||
description = u'Пользователь уже существует и активен' |
||||
context['response'] = description |
||||
else: |
||||
context['code'] = '1' |
||||
res = True |
||||
description = u'Пользователь уже существует. Отправлено повторное письмо активации' |
||||
context['response'] = description |
||||
sent_registration(user, title=u'Повторное письмо активации') |
||||
return context |
||||
else: |
||||
result, user = self_create_user(request.POST['email'], |
||||
phone=request.POST['phone'] if request.POST.get('phone') else None) |
||||
context['code'] = '1' |
||||
res = True |
||||
description = u'Пользователь создан. На указанный email отправлено письмо активации' |
||||
context['response'] = description |
||||
|
||||
ref_history = TrafHistory.objects.create(action='C', source=source, token=request.POST['token'], data=request.POST, |
||||
result_description=description, result=res) |
||||
user.traf_source = ref_history |
||||
user.save() |
||||
return context |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, check_request=True, need_keys=['token', 'service', 'email'], method='POST') |
||||
def create_bill(request, context): |
||||
# TODO: Политика использования токена |
||||
result, source = self_check_token(request.POST['token']) |
||||
if not result: |
||||
context['code'] = '0' |
||||
context['response'] = u'Не найден активный источник' |
||||
return context |
||||
|
||||
result, user = self_check_user_exists(request.POST['email']) |
||||
if result: |
||||
if not user.is_active or user.reg_status != '4': |
||||
sent_registration(user, title=u'Повторное письмо активации') |
||||
if request.POST.get('phone') and user.phone != request.POST.get('phone'): |
||||
user.phone = request.POST['phone'] |
||||
user.save() |
||||
else: |
||||
result, user = self_create_user(request.POST['email'], |
||||
phone=request.POST['phone'] if request.POST.get('phone') else None) |
||||
|
||||
result, description, bill = self_create_bill(user, request.POST['service'], |
||||
request.POST['uid'] if request.POST.get('uid') else None) |
||||
context['code'] = '1' if result else '0' |
||||
context['response'] = description |
||||
context['data'] = bill.get_face() |
||||
rel_source = TrafHistory.objects.create(action='O', source=source, token=request.POST['token'], data=request.POST, |
||||
result_description=description, result=True if result else False) |
||||
bill.traf_source = rel_source |
||||
bill.save() |
||||
return context |
||||
|
||||
|
||||
@out_api_decor(without_auth=True, need_keys=['token', 'data'], method='POST', check_request=True) |
||||
def set_lendos_data(request, context): |
||||
# Создание пользователя |
||||
res = False |
||||
result, source = self_check_token(request.POST['token']) |
||||
if not result: |
||||
context['code'] = '0' |
||||
description = u'Не найден активный источник' |
||||
context['response'] = description |
||||
return context |
||||
|
||||
TrafHistory.objects.create(action='D', source=source, token=request.POST['token'], data=request.POST['data'], |
||||
result_description='Данные из форм', result=res) |
||||
return context |
||||
|
||||
@ -1,40 +1,40 @@ |
||||
# coding=utf-8 |
||||
from celery.task import periodic_task |
||||
from datetime import timedelta, datetime |
||||
from access.models import User, TrafSource, TrafTokenHistory |
||||
|
||||
|
||||
@periodic_task(run_every=timedelta(minutes=20)) |
||||
def check_prepo_delay(): |
||||
# Проверка просроченых задач преподавателя |
||||
for res in User.objects.filter(delay_date__lte=datetime.now(), in_role='T'): |
||||
res.delay = False |
||||
res.delay_description = '' |
||||
res.delay_date = None |
||||
res.save() |
||||
|
||||
|
||||
@periodic_task(run_every=timedelta(minutes=1)) |
||||
def check_online(): |
||||
for user in User.objects.filter(status='ON', last_time__lte=datetime.now()-timedelta(minutes=10)): |
||||
user.status = 'OFF' |
||||
user.save() |
||||
|
||||
|
||||
@periodic_task(run_every=timedelta(hours=1)) |
||||
def check_traf_source(): |
||||
for source in TrafSource.objects.filter(on=True).exclude(live_time=None): |
||||
if source.token and source.token_start + timedelta(hours=source.live_time) < datetime.now(): |
||||
source.on = False |
||||
TrafTokenHistory.objects.create(token=source.token, source=source, live_time=source.live_time, date_start=source.token_start, date_end=datetime.now()) |
||||
source.token = None |
||||
source.token_start = None |
||||
source.save() |
||||
|
||||
|
||||
#@periodic_task(run_every=timedelta(minutes=1)) |
||||
#def sync_users(): |
||||
# for user in User.objects.filter(sync=False): |
||||
# result = sent_sync_user(user) |
||||
# if result: |
||||
# user._set_synced() |
||||
# coding=utf-8 |
||||
from celery.task import periodic_task |
||||
from datetime import timedelta, datetime |
||||
from access.models import User, TrafSource, TrafTokenHistory |
||||
|
||||
|
||||
@periodic_task(run_every=timedelta(minutes=20)) |
||||
def check_prepo_delay(): |
||||
# Проверка просроченых задач преподавателя |
||||
for res in User.objects.filter(delay_date__lte=datetime.now(), in_role='T'): |
||||
res.delay = False |
||||
res.delay_description = '' |
||||
res.delay_date = None |
||||
res.save() |
||||
|
||||
|
||||
@periodic_task(run_every=timedelta(minutes=1)) |
||||
def check_online(): |
||||
for user in User.objects.filter(status='ON', last_time__lte=datetime.now()-timedelta(minutes=10)): |
||||
user.status = 'OFF' |
||||
user.save() |
||||
|
||||
|
||||
@periodic_task(run_every=timedelta(hours=1)) |
||||
def check_traf_source(): |
||||
for source in TrafSource.objects.filter(on=True).exclude(live_time=None): |
||||
if source.token and source.token_start + timedelta(hours=source.live_time) < datetime.now(): |
||||
source.on = False |
||||
TrafTokenHistory.objects.create(token=source.token, source=source, live_time=source.live_time, date_start=source.token_start, date_end=datetime.now()) |
||||
source.token = None |
||||
source.token_start = None |
||||
source.save() |
||||
|
||||
|
||||
#@periodic_task(run_every=timedelta(minutes=1)) |
||||
#def sync_users(): |
||||
# for user in User.objects.filter(sync=False): |
||||
# result = sent_sync_user(user) |
||||
# if result: |
||||
# user._set_synced() |
||||
|
||||
@ -1,13 +1,13 @@ |
||||
from access import teach_views as views |
||||
from django.conf.urls import url |
||||
|
||||
urlpatterns = [ |
||||
url(r'profile/$', views.profile), |
||||
url(r'homeworks/([0-9]{1,99})$', views.homeworks), |
||||
url(r'comments/([0-9]{1,99})$', views.comments), |
||||
url(r'exams/([0-9]{1,99})$', views.exams), |
||||
url(r'materials/([0-9]{1,99})$', views.materials), |
||||
url(r'workshop/homework/([0-9]{1,99})$', views.homework_workshop), |
||||
url(r'workshop/exam/([0-9]{1,99})$', views.exam_workshop), |
||||
url(r'history/', views.history) |
||||
from access import teach_views as views |
||||
from django.conf.urls import url |
||||
|
||||
urlpatterns = [ |
||||
url(r'profile/$', views.profile), |
||||
url(r'homeworks/([0-9]{1,99})$', views.homeworks), |
||||
url(r'comments/([0-9]{1,99})$', views.comments), |
||||
url(r'exams/([0-9]{1,99})$', views.exams), |
||||
url(r'materials/([0-9]{1,99})$', views.materials), |
||||
url(r'workshop/homework/([0-9]{1,99})$', views.homework_workshop), |
||||
url(r'workshop/exam/([0-9]{1,99})$', views.exam_workshop), |
||||
url(r'history/', views.history) |
||||
] |
||||
@ -1,150 +1,150 @@ |
||||
# coding=utf-8 |
||||
from django.http import Http404 |
||||
from lms.decors import response_decor |
||||
from lms.tools import check_role |
||||
from courses.models import Course |
||||
from journals.models import HomeworkJ, ExamJ, HomeworkTry, ExamTry |
||||
|
||||
|
||||
@response_decor(template='teach_profile.html') |
||||
def profile(request): |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
# Быстрый список активных студентов |
||||
all_homeworks = [] |
||||
homeworks = {} |
||||
exams = {} |
||||
|
||||
for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None |
||||
).order_by('date'): |
||||
if journal.parent.get_status_flag() not in ['N', 'F']: |
||||
title = (journal.material.course.get_title(), |
||||
journal.material.get_title(), |
||||
journal.material.id, |
||||
journal.material.theme.sort, |
||||
journal.material.get_icon()) |
||||
if not title in homeworks: homeworks[title] = [] |
||||
homeworks[title].append(journal) |
||||
|
||||
for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None |
||||
).order_by('date'): |
||||
if journal.parent.get_status_flag() not in ['N', 'F']: |
||||
all_homeworks.append(journal) |
||||
|
||||
for journal in ExamTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None |
||||
).order_by('date'): |
||||
|
||||
if journal.parent.get_status_flag() not in ['N', 'F']: |
||||
title = (journal.material.course.get_title(), |
||||
journal.material.get_title(), |
||||
journal.material.id) |
||||
if not title in exams: exams[title] = [] |
||||
exams[title].append(journal) |
||||
|
||||
return { |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), |
||||
'active_themes': homeworks, |
||||
'active_exams': exams, |
||||
'all_homeworks': all_homeworks, |
||||
} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_homeworks.html') |
||||
def homeworks(request, course): |
||||
# Список домашних заданий по курсу на проверку |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'T': 'H', |
||||
'course': Course.objects.get(id=course), |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), |
||||
'homeworks': HomeworkTry.objects.filter(teacher=request.user).order_by( |
||||
'-date') |
||||
} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_comments.html') |
||||
def comments(request, course): |
||||
# Комментари для преподавателя |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id')} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_materials.html') |
||||
def materials(request, course): |
||||
# Материалы курсов |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'T': 'M', |
||||
'courses': Course.objects.filter(teachers__in=[request.user]), |
||||
'course': Course.objects.get(id=course)} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_exams.html') |
||||
def exams(request, exam): |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'T': 'E', |
||||
'course': Course.objects.get(id=exam), |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), |
||||
'exams': ExamTry.objects.filter(teacher=request.user).order_by('-date')} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='workshop_homework.html') |
||||
def homework_workshop(request, homework): |
||||
if request.user.in_role in ['T', 'S2', 'A']: |
||||
try: |
||||
journal = HomeworkJ.objects.get(id=homework) |
||||
except HomeworkJ.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']: |
||||
return { |
||||
'homework': journal.get_face(request.user), |
||||
'student': journal.student, |
||||
'theme': journal.material.theme |
||||
} |
||||
else: |
||||
raise Http404 |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='workshop_exam.html') |
||||
def exam_workshop(request, exam): |
||||
if request.user.in_role in ['T', 'S2', 'A']: |
||||
try: |
||||
journal = ExamJ.objects.get(id=exam) |
||||
except ExamJ.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']: |
||||
return { |
||||
'exam': journal.get_face(request.user), |
||||
'student': journal.student, |
||||
'theme': journal.material.theme |
||||
} |
||||
else: |
||||
raise Http404 |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='teacher_history.html') |
||||
def history(request): |
||||
if request.user.in_role in ['T', 'S2', 'A']: |
||||
return {'hw': HomeworkJ.objects.filter(teacher=request.user, success=True).exclude(f_date=None), |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id') |
||||
} |
||||
else: |
||||
raise Http404 |
||||
# coding=utf-8 |
||||
from django.http import Http404 |
||||
from lms.decors import response_decor |
||||
from lms.tools import check_role |
||||
from courses.models import Course |
||||
from journals.models import HomeworkJ, ExamJ, HomeworkTry, ExamTry |
||||
|
||||
|
||||
@response_decor(template='teach_profile.html') |
||||
def profile(request): |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
# Быстрый список активных студентов |
||||
all_homeworks = [] |
||||
homeworks = {} |
||||
exams = {} |
||||
|
||||
for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None |
||||
).order_by('date'): |
||||
if journal.parent.get_status_flag() not in ['N', 'F']: |
||||
title = (journal.material.course.get_title(), |
||||
journal.material.get_title(), |
||||
journal.material.id, |
||||
journal.material.theme.sort, |
||||
journal.material.get_icon()) |
||||
if not title in homeworks: homeworks[title] = [] |
||||
homeworks[title].append(journal) |
||||
|
||||
for journal in HomeworkTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None |
||||
).order_by('date'): |
||||
if journal.parent.get_status_flag() not in ['N', 'F']: |
||||
all_homeworks.append(journal) |
||||
|
||||
for journal in ExamTry.objects.filter(teacher=request.user, f_date=None).exclude(success=True, date=None |
||||
).order_by('date'): |
||||
|
||||
if journal.parent.get_status_flag() not in ['N', 'F']: |
||||
title = (journal.material.course.get_title(), |
||||
journal.material.get_title(), |
||||
journal.material.id) |
||||
if not title in exams: exams[title] = [] |
||||
exams[title].append(journal) |
||||
|
||||
return { |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), |
||||
'active_themes': homeworks, |
||||
'active_exams': exams, |
||||
'all_homeworks': all_homeworks, |
||||
} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_homeworks.html') |
||||
def homeworks(request, course): |
||||
# Список домашних заданий по курсу на проверку |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'T': 'H', |
||||
'course': Course.objects.get(id=course), |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), |
||||
'homeworks': HomeworkTry.objects.filter(teacher=request.user).order_by( |
||||
'-date') |
||||
} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_comments.html') |
||||
def comments(request, course): |
||||
# Комментари для преподавателя |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id')} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_materials.html') |
||||
def materials(request, course): |
||||
# Материалы курсов |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'T': 'M', |
||||
'courses': Course.objects.filter(teachers__in=[request.user]), |
||||
'course': Course.objects.get(id=course)} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='teacher_exams.html') |
||||
def exams(request, exam): |
||||
checker = check_role(request.user, 'T') |
||||
if checker['result']: |
||||
return {'T': 'E', |
||||
'course': Course.objects.get(id=exam), |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id'), |
||||
'exams': ExamTry.objects.filter(teacher=request.user).order_by('-date')} |
||||
else: |
||||
return checker |
||||
|
||||
|
||||
@response_decor(template='workshop_homework.html') |
||||
def homework_workshop(request, homework): |
||||
if request.user.in_role in ['T', 'S2', 'A']: |
||||
try: |
||||
journal = HomeworkJ.objects.get(id=homework) |
||||
except HomeworkJ.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']: |
||||
return { |
||||
'homework': journal.get_face(request.user), |
||||
'student': journal.student, |
||||
'theme': journal.material.theme |
||||
} |
||||
else: |
||||
raise Http404 |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='workshop_exam.html') |
||||
def exam_workshop(request, exam): |
||||
if request.user.in_role in ['T', 'S2', 'A']: |
||||
try: |
||||
journal = ExamJ.objects.get(id=exam) |
||||
except ExamJ.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
if not journal.teacher or journal.teacher == request.user or request.user.in_role in ['S2', 'A']: |
||||
return { |
||||
'exam': journal.get_face(request.user), |
||||
'student': journal.student, |
||||
'theme': journal.material.theme |
||||
} |
||||
else: |
||||
raise Http404 |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='teacher_history.html') |
||||
def history(request): |
||||
if request.user.in_role in ['T', 'S2', 'A']: |
||||
return {'hw': HomeworkJ.objects.filter(teacher=request.user, success=True).exclude(f_date=None), |
||||
'courses': Course.objects.filter(teachers__in=[request.user]).values('title', 'id') |
||||
} |
||||
else: |
||||
raise Http404 |
||||
|
||||
@ -1,43 +1,43 @@ |
||||
from access import views |
||||
from access import api |
||||
from access import out_api |
||||
from django.conf.urls import url |
||||
|
||||
urlpatterns = [ |
||||
url(r'accept_forgot/$', views.accept_forgot), |
||||
url(r'activate_email/$', views.activate_email), |
||||
url(r'all_actions/$', views.all_actions), |
||||
url(r'get_subscription_data/$', api.get_subscription_data), |
||||
url(r'send_subscription_data/$', api.send_subscription_data), |
||||
url(r'forgot/$', api.forgot), |
||||
url(r'fast_auth/$', views.fast_auth), |
||||
url(r'auth/', api.auth_in), |
||||
url(r'auth_from_admin/', api.auth_from_admin), |
||||
url(r'activate/$', views.activate), |
||||
url(r'profile/$', views.profile), |
||||
url(r'profile/(?P<view_id>.*)/$', views.profile_view), |
||||
url(r'registration/$', api.registration), |
||||
url(r'reg_step/$', api.reg_step), |
||||
url(r'logout/$', views.logout_in), |
||||
url(r'come_off/$', views.come_off), |
||||
url(r'check_auth/$', api.check_auth), |
||||
url(r'get_settings_data/$', api.get_settings_data), |
||||
url(r'send_settings_data/$', api.send_settings_data), |
||||
url(r'get_user_role/$', api.get_user_role), |
||||
url(r'new_role/$', api.new_role), |
||||
url(r'change_password/$', api.change_password), |
||||
url(r'by_error/$', views.by_error), |
||||
url(r'auth_error/$', views.auth_error), |
||||
url(r'access_error/$', views.access_error), |
||||
url(r'check_active/$', api.check_active), |
||||
url(r'resent_active_email$', api.resent_active_email), |
||||
url(r'change_private/$', api.change_private), |
||||
url(r'create_user/$', out_api.create_user), |
||||
url(r'create_bill/$', out_api.create_bill), |
||||
url(r'set_lendos_data/$', out_api.set_lendos_data), |
||||
#url(r'sync_user/$', out_api.sync_user), |
||||
url(r'search_user/$', api.search_user), |
||||
url(r'find_user/$', api.find_user), |
||||
url(r'service_auth/$', out_api.service_auth), |
||||
url(r'set_in_user/$', out_api.set_in_user) |
||||
] |
||||
from access import views |
||||
from access import api |
||||
from access import out_api |
||||
from django.conf.urls import url |
||||
|
||||
urlpatterns = [ |
||||
url(r'accept_forgot/$', views.accept_forgot), |
||||
url(r'activate_email/$', views.activate_email), |
||||
url(r'all_actions/$', views.all_actions), |
||||
url(r'get_subscription_data/$', api.get_subscription_data), |
||||
url(r'send_subscription_data/$', api.send_subscription_data), |
||||
url(r'forgot/$', api.forgot), |
||||
url(r'fast_auth/$', views.fast_auth), |
||||
url(r'auth/', api.auth_in), |
||||
url(r'auth_from_admin/', api.auth_from_admin), |
||||
url(r'activate/$', views.activate), |
||||
url(r'profile/$', views.profile), |
||||
url(r'profile/(?P<view_id>.*)/$', views.profile_view), |
||||
url(r'registration/$', api.registration), |
||||
url(r'reg_step/$', api.reg_step), |
||||
url(r'logout/$', views.logout_in), |
||||
url(r'come_off/$', views.come_off), |
||||
url(r'check_auth/$', api.check_auth), |
||||
url(r'get_settings_data/$', api.get_settings_data), |
||||
url(r'send_settings_data/$', api.send_settings_data), |
||||
url(r'get_user_role/$', api.get_user_role), |
||||
url(r'new_role/$', api.new_role), |
||||
url(r'change_password/$', api.change_password), |
||||
url(r'by_error/$', views.by_error), |
||||
url(r'auth_error/$', views.auth_error), |
||||
url(r'access_error/$', views.access_error), |
||||
url(r'check_active/$', api.check_active), |
||||
url(r'resent_active_email$', api.resent_active_email), |
||||
url(r'change_private/$', api.change_private), |
||||
url(r'create_user/$', out_api.create_user), |
||||
url(r'create_bill/$', out_api.create_bill), |
||||
url(r'set_lendos_data/$', out_api.set_lendos_data), |
||||
#url(r'sync_user/$', out_api.sync_user), |
||||
url(r'search_user/$', api.search_user), |
||||
url(r'find_user/$', api.find_user), |
||||
url(r'service_auth/$', out_api.service_auth), |
||||
url(r'set_in_user/$', out_api.set_in_user) |
||||
] |
||||
|
||||
@ -1,234 +1,234 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.contrib import auth |
||||
from django.contrib.auth import logout |
||||
from django.http import Http404 |
||||
from django.shortcuts import redirect |
||||
from access.models import User, ActionJ, Document |
||||
from lms.tools import random_string, condition_factory, check_role |
||||
from lms.decors import response_decor |
||||
from courses.tools import get_user_achievements, get_user_diploms, get_user_completed_courses_count, \ |
||||
get_user_skills_size_count, get_user_achievements_count |
||||
from courses.tools import get_user_skills |
||||
from journals.models import TeacherJ |
||||
from management.letters import sent_forgot_password |
||||
from finance.models import Bill |
||||
from management.models import Comment |
||||
from library.models import Article |
||||
|
||||
|
||||
@response_decor(template='index.html', without_auth=True) |
||||
def activate_email(request): |
||||
# Активация пользователя через почту |
||||
if request.GET.get('token') and request.GET.get('email'): |
||||
try: |
||||
email = request.GET['email'].lower() |
||||
user = User.objects.get(email=email, token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} |
||||
else: |
||||
user.email = user.changed_email |
||||
user.save() |
||||
user.change_token() |
||||
return {'DIALOG': 'activate_email'} |
||||
else: |
||||
# TODO: Отправлять пользователя в тупиковую страницу, а не на 404 |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='index.html', without_auth=True) |
||||
def accept_forgot(request): |
||||
# Подтверждение почты при восстановлении |
||||
if request.GET.get('token') and request.GET.get('email'): |
||||
try: |
||||
email = request.GET['email'].lower() |
||||
user = User.objects.get(email=email, token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} |
||||
else: |
||||
pas = random_string(length=6).upper() |
||||
user.set_password(pas) |
||||
user.change_token() |
||||
sent_forgot_password(user, pas) |
||||
return {'DIALOG': 'accept_forgot'} |
||||
else: |
||||
# TODO: Отправлять пользователя в тупиковую страницу, а не на 404 |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='activation.html', without_auth=True) |
||||
def activate(request): |
||||
# Страница активации пользователя |
||||
condition = condition_factory([ |
||||
{'condition': request.GET.get('email'), 'error': u'Поле пользователя передано не корректно'}, |
||||
{'condition': request.GET.get('token'), 'error': u'Поле токена передано не корректно'}, |
||||
{'condition': request.GET.get('step'), 'error': u'Не верно передан этап'} |
||||
]) |
||||
if condition['code'] == '1': |
||||
try: |
||||
email = request.GET['email'].lower() |
||||
user = User.objects.get(email=email, token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} |
||||
else: |
||||
if not user.is_active or user.reg_status != '4': |
||||
user.save() |
||||
return {'step': user.reg_status, 'token': request.GET['token'], 'email': email, |
||||
'phone': user.phone if user.phone else None} |
||||
|
||||
else: |
||||
raise Http404 |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='profile.html', without_auth=True) |
||||
def profile(request): |
||||
if request.user.is_authenticated(): |
||||
checker = check_role(request.user, 'U') |
||||
if checker['result']: |
||||
courses = [i.get_head_face() for i in |
||||
TeacherJ.objects.filter(student=request.user, course__public=True).exclude(progress=0)] |
||||
return {'in_user': None, |
||||
'courses': courses, |
||||
'achievements': get_user_achievements(request.user), |
||||
'skills': get_user_skills(request.user), |
||||
'diploms': get_user_diploms(request.user), |
||||
'completed_courses': get_user_completed_courses_count(request.user), |
||||
'got_achievements': get_user_achievements_count(request.user), |
||||
'skills_size': get_user_skills_size_count(request.user), |
||||
'documents': Document.objects.filter(user=request.user), |
||||
'b_bills': Bill.objects.filter(user=request.user), |
||||
'articles': [i.get_face(request.user) for i in Article.objects.filter(views__id=request.user.id)], |
||||
'forum_ask': Comment.objects.filter(owner=request.user, status='Q'), |
||||
'forum_ans': { |
||||
'all': |
||||
Comment.objects.filter(owner=request.user, status='Q2'), |
||||
'best': |
||||
Comment.objects.filter(owner=request.user, status='Q2', best=True).count() |
||||
} |
||||
} |
||||
else: |
||||
return checker |
||||
else: |
||||
return {'redirect': '/access/auth_error/'} |
||||
|
||||
|
||||
@response_decor(template='profile.html', without_auth=True) |
||||
def profile_view(request, view_id): |
||||
if view_id: |
||||
try: |
||||
user = User.objects.get(interactive_key=view_id) |
||||
except User.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
if request.user.is_authenticated() and request.user.is_admin: |
||||
go = True |
||||
else: |
||||
go = False |
||||
if user.private == 'A' or user.private == 'L': |
||||
go = True |
||||
elif user.private == 'U': |
||||
if request.user.is_authenticated() and request.user.is_active: |
||||
go = True |
||||
elif user.private == 'B': |
||||
if request.user == user: |
||||
go = True |
||||
|
||||
if go: |
||||
courses = [i.get_head_face() for i in TeacherJ.objects.filter(student=user, course__public=True).exclude(progress=0)] |
||||
return {'in_user': user, |
||||
'courses': courses, |
||||
'achievements': get_user_achievements(user), |
||||
'skills': get_user_skills(user), |
||||
'diploms': get_user_diploms(user), |
||||
'articles': [i.get_face(user) for i in Article.objects.filter(views__id=user.id)], |
||||
'completed_courses': get_user_completed_courses_count(user), |
||||
'got_achievements': get_user_achievements_count(user), |
||||
'skills_size': get_user_skills_size_count(user), |
||||
'forum_ask': Comment.objects.filter(owner=user, status='Q'), |
||||
'forum_ans': { |
||||
'all': |
||||
Comment.objects.filter(owner=user, status='Q2'), |
||||
'best': |
||||
Comment.objects.filter(owner=user, status='Q2', best=True).count() |
||||
}} |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
def logout_in(request): |
||||
logout(request) |
||||
return redirect('/') |
||||
|
||||
|
||||
@response_decor(template='index.html') |
||||
def come_off(request): |
||||
# Деактивация подписок |
||||
context = {'code': 'error'} |
||||
condition = condition_factory([ |
||||
{'condition': request.GET.get('token'), 'error': u'В запросе не обнаружен токен'}, |
||||
{'condition': request.GET.get('right'), 'error': u'В запросе не обнаружено изменяемое право'} |
||||
]) |
||||
|
||||
if condition['code'] == '1': |
||||
try: |
||||
user = User.objects.get(token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
context['response'] = u'Запрос не обработан' |
||||
else: |
||||
if user.rights.check_right(user, request.GET['right']): |
||||
if request.GET['right'] == 'feedback_follow': |
||||
user.rights.set_right('feedback_follow', False) |
||||
context['response'] = u'Подписка деактивирована' |
||||
context['code'] = u'info' |
||||
elif request.GET['right'] == 'news_follow': |
||||
user.rights.set_right('news_follow', False) |
||||
context['response'] = u'Подписка деактивирована' |
||||
context['code'] = u'info' |
||||
else: |
||||
context[ |
||||
'response'] = u'Вы указали право, на которое не распространяется функция быстрого отключения' |
||||
else: |
||||
context['response'] = u'Вы уже описаны от данной рассылки' |
||||
else: |
||||
context['response'] = condition['response'] |
||||
context['code'] = '0' |
||||
|
||||
return {'response': context['response'], 'code': context['code']} |
||||
|
||||
|
||||
@response_decor(template='auth_error.html', without_auth=True) |
||||
def auth_error(request): |
||||
# Запрешен доступ - кабинет менеджера, пепода и.т.д. |
||||
return {} |
||||
|
||||
|
||||
@response_decor(template='access_error.html', without_auth=True) |
||||
def access_error(request): |
||||
# Закрытая страница - не открытый урок, дз и.т.д. |
||||
return {} |
||||
|
||||
|
||||
@response_decor(template='by_error.html', without_auth=True) |
||||
def by_error(request): |
||||
# Запрещен доступ по подпискеs |
||||
return {} |
||||
|
||||
|
||||
@response_decor(template='all_actions.html', without_auth=False) |
||||
def all_actions(request): |
||||
# Страница событий |
||||
return {'b_actions': ActionJ.objects.filter(student=request.user).order_by('-id')} |
||||
|
||||
|
||||
@response_decor(template='index.html', without_auth=True) |
||||
def fast_auth(request): |
||||
# Авторизация по кнопке |
||||
# FIXME: Усилить проверку |
||||
if request.POST.get('email') and request.POST.get('password'): |
||||
email = request.POST['email'].lower() |
||||
user = auth.authenticate(email=email, password=request.POST['password']) |
||||
|
||||
if user is not None: |
||||
auth.login(request, user) |
||||
return {'redirect': '/'} |
||||
# -*- coding: utf-8 -*- |
||||
from django.contrib import auth |
||||
from django.contrib.auth import logout |
||||
from django.http import Http404 |
||||
from django.shortcuts import redirect |
||||
from access.models import User, ActionJ, Document |
||||
from lms.tools import random_string, condition_factory, check_role |
||||
from lms.decors import response_decor |
||||
from courses.tools import get_user_achievements, get_user_diploms, get_user_completed_courses_count, \ |
||||
get_user_skills_size_count, get_user_achievements_count |
||||
from courses.tools import get_user_skills |
||||
from journals.models import TeacherJ |
||||
from management.letters import sent_forgot_password |
||||
from finance.models import Bill |
||||
from management.models import Comment |
||||
from library.models import Article |
||||
|
||||
|
||||
@response_decor(template='index.html', without_auth=True) |
||||
def activate_email(request): |
||||
# Активация пользователя через почту |
||||
if request.GET.get('token') and request.GET.get('email'): |
||||
try: |
||||
email = request.GET['email'].lower() |
||||
user = User.objects.get(email=email, token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} |
||||
else: |
||||
user.email = user.changed_email |
||||
user.save() |
||||
user.change_token() |
||||
return {'DIALOG': 'activate_email'} |
||||
else: |
||||
# TODO: Отправлять пользователя в тупиковую страницу, а не на 404 |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='index.html', without_auth=True) |
||||
def accept_forgot(request): |
||||
# Подтверждение почты при восстановлении |
||||
if request.GET.get('token') and request.GET.get('email'): |
||||
try: |
||||
email = request.GET['email'].lower() |
||||
user = User.objects.get(email=email, token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} |
||||
else: |
||||
pas = random_string(length=6).upper() |
||||
user.set_password(pas) |
||||
user.change_token() |
||||
sent_forgot_password(user, pas) |
||||
return {'DIALOG': 'accept_forgot'} |
||||
else: |
||||
# TODO: Отправлять пользователя в тупиковую страницу, а не на 404 |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='activation.html', without_auth=True) |
||||
def activate(request): |
||||
# Страница активации пользователя |
||||
condition = condition_factory([ |
||||
{'condition': request.GET.get('email'), 'error': u'Поле пользователя передано не корректно'}, |
||||
{'condition': request.GET.get('token'), 'error': u'Поле токена передано не корректно'}, |
||||
{'condition': request.GET.get('step'), 'error': u'Не верно передан этап'} |
||||
]) |
||||
if condition['code'] == '1': |
||||
try: |
||||
email = request.GET['email'].lower() |
||||
user = User.objects.get(email=email, token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
return {'redirect': '/404/?error=Ссылка устарела. Дождитесь письма с актуальной ссылкой'} |
||||
else: |
||||
if not user.is_active or user.reg_status != '4': |
||||
user.save() |
||||
return {'step': user.reg_status, 'token': request.GET['token'], 'email': email, |
||||
'phone': user.phone if user.phone else None} |
||||
|
||||
else: |
||||
raise Http404 |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
@response_decor(template='profile.html', without_auth=True) |
||||
def profile(request): |
||||
if request.user.is_authenticated(): |
||||
checker = check_role(request.user, 'U') |
||||
if checker['result']: |
||||
courses = [i.get_head_face() for i in |
||||
TeacherJ.objects.filter(student=request.user, course__public=True).exclude(progress=0)] |
||||
return {'in_user': None, |
||||
'courses': courses, |
||||
'achievements': get_user_achievements(request.user), |
||||
'skills': get_user_skills(request.user), |
||||
'diploms': get_user_diploms(request.user), |
||||
'completed_courses': get_user_completed_courses_count(request.user), |
||||
'got_achievements': get_user_achievements_count(request.user), |
||||
'skills_size': get_user_skills_size_count(request.user), |
||||
'documents': Document.objects.filter(user=request.user), |
||||
'b_bills': Bill.objects.filter(user=request.user), |
||||
'articles': [i.get_face(request.user) for i in Article.objects.filter(views__id=request.user.id)], |
||||
'forum_ask': Comment.objects.filter(owner=request.user, status='Q'), |
||||
'forum_ans': { |
||||
'all': |
||||
Comment.objects.filter(owner=request.user, status='Q2'), |
||||
'best': |
||||
Comment.objects.filter(owner=request.user, status='Q2', best=True).count() |
||||
} |
||||
} |
||||
else: |
||||
return checker |
||||
else: |
||||
return {'redirect': '/access/auth_error/'} |
||||
|
||||
|
||||
@response_decor(template='profile.html', without_auth=True) |
||||
def profile_view(request, view_id): |
||||
if view_id: |
||||
try: |
||||
user = User.objects.get(interactive_key=view_id) |
||||
except User.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
if request.user.is_authenticated() and request.user.is_admin: |
||||
go = True |
||||
else: |
||||
go = False |
||||
if user.private == 'A' or user.private == 'L': |
||||
go = True |
||||
elif user.private == 'U': |
||||
if request.user.is_authenticated() and request.user.is_active: |
||||
go = True |
||||
elif user.private == 'B': |
||||
if request.user == user: |
||||
go = True |
||||
|
||||
if go: |
||||
courses = [i.get_head_face() for i in TeacherJ.objects.filter(student=user, course__public=True).exclude(progress=0)] |
||||
return {'in_user': user, |
||||
'courses': courses, |
||||
'achievements': get_user_achievements(user), |
||||
'skills': get_user_skills(user), |
||||
'diploms': get_user_diploms(user), |
||||
'articles': [i.get_face(user) for i in Article.objects.filter(views__id=user.id)], |
||||
'completed_courses': get_user_completed_courses_count(user), |
||||
'got_achievements': get_user_achievements_count(user), |
||||
'skills_size': get_user_skills_size_count(user), |
||||
'forum_ask': Comment.objects.filter(owner=user, status='Q'), |
||||
'forum_ans': { |
||||
'all': |
||||
Comment.objects.filter(owner=user, status='Q2'), |
||||
'best': |
||||
Comment.objects.filter(owner=user, status='Q2', best=True).count() |
||||
}} |
||||
else: |
||||
raise Http404 |
||||
|
||||
|
||||
def logout_in(request): |
||||
logout(request) |
||||
return redirect('/') |
||||
|
||||
|
||||
@response_decor(template='index.html') |
||||
def come_off(request): |
||||
# Деактивация подписок |
||||
context = {'code': 'error'} |
||||
condition = condition_factory([ |
||||
{'condition': request.GET.get('token'), 'error': u'В запросе не обнаружен токен'}, |
||||
{'condition': request.GET.get('right'), 'error': u'В запросе не обнаружено изменяемое право'} |
||||
]) |
||||
|
||||
if condition['code'] == '1': |
||||
try: |
||||
user = User.objects.get(token=request.GET['token']) |
||||
except User.DoesNotExist: |
||||
context['response'] = u'Запрос не обработан' |
||||
else: |
||||
if user.rights.check_right(user, request.GET['right']): |
||||
if request.GET['right'] == 'feedback_follow': |
||||
user.rights.set_right('feedback_follow', False) |
||||
context['response'] = u'Подписка деактивирована' |
||||
context['code'] = u'info' |
||||
elif request.GET['right'] == 'news_follow': |
||||
user.rights.set_right('news_follow', False) |
||||
context['response'] = u'Подписка деактивирована' |
||||
context['code'] = u'info' |
||||
else: |
||||
context[ |
||||
'response'] = u'Вы указали право, на которое не распространяется функция быстрого отключения' |
||||
else: |
||||
context['response'] = u'Вы уже описаны от данной рассылки' |
||||
else: |
||||
context['response'] = condition['response'] |
||||
context['code'] = '0' |
||||
|
||||
return {'response': context['response'], 'code': context['code']} |
||||
|
||||
|
||||
@response_decor(template='auth_error.html', without_auth=True) |
||||
def auth_error(request): |
||||
# Запрешен доступ - кабинет менеджера, пепода и.т.д. |
||||
return {} |
||||
|
||||
|
||||
@response_decor(template='access_error.html', without_auth=True) |
||||
def access_error(request): |
||||
# Закрытая страница - не открытый урок, дз и.т.д. |
||||
return {} |
||||
|
||||
|
||||
@response_decor(template='by_error.html', without_auth=True) |
||||
def by_error(request): |
||||
# Запрещен доступ по подпискеs |
||||
return {} |
||||
|
||||
|
||||
@response_decor(template='all_actions.html', without_auth=False) |
||||
def all_actions(request): |
||||
# Страница событий |
||||
return {'b_actions': ActionJ.objects.filter(student=request.user).order_by('-id')} |
||||
|
||||
|
||||
@response_decor(template='index.html', without_auth=True) |
||||
def fast_auth(request): |
||||
# Авторизация по кнопке |
||||
# FIXME: Усилить проверку |
||||
if request.POST.get('email') and request.POST.get('password'): |
||||
email = request.POST['email'].lower() |
||||
user = auth.authenticate(email=email, password=request.POST['password']) |
||||
|
||||
if user is not None: |
||||
auth.login(request, user) |
||||
return {'redirect': '/'} |
||||
|
||||
@ -1 +1 @@ |
||||
8311 |
||||
28159 |
||||
|
||||
@ -1,28 +0,0 @@ |
||||
# coding=utf-8 |
||||
import os |
||||
import django |
||||
import sys |
||||
import datetime |
||||
|
||||
start = datetime.datetime.now() |
||||
sys.path.append("/var/www/projects/codemy/") |
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") |
||||
django.setup() |
||||
|
||||
from lms.tools import comment_auth_data |
||||
from access.models import User as U |
||||
|
||||
u = U.objects.get(id=2) |
||||
result = comment_auth_data(u) |
||||
#print(result) |
||||
def_json = '''json_encode: {"nick":"\u041d\u0438\u043a\u043e\u043b\u0430\u0439","avatar":"","id":"2","email":"bez.b.unix@gmail.com","profile_url":""}''' |
||||
def_sign = '''Sign: 9b185a7fa42ecfe88cebb36cd400a1b4''' |
||||
print('====================') |
||||
print(def_json) |
||||
print(def_sign) |
||||
print('-------------------') |
||||
for key, value in result.items(): |
||||
if key == '== sign': print('%s %s' % ('---', bool(def_sign==value))) |
||||
print('%s: %s' % (key, value)) |
||||
|
||||
print('=====================') |
||||
@ -1,40 +1,40 @@ |
||||
; ================================== |
||||
; celery worker supervisor example |
||||
; ================================== |
||||
|
||||
[program:celery_codemy] |
||||
command=/var/www/.envs/codemy/bin/celery worker -A lms --loglevel=INFO |
||||
directory=/var/www/projects/codemy/ |
||||
user=www-data |
||||
numprocs=1 |
||||
stdout_logfile=/var/www/logs/codemy/celery-worker.log |
||||
stderr_logfile=/var/www/logs/codemy/celery-worker.log |
||||
autostart=true |
||||
autorestart=true |
||||
startsecs=10 |
||||
stopwaitsecs = 600 |
||||
killasgroup=true |
||||
|
||||
[program:celery_beat_codemy] |
||||
command=/var/www/.envs/codemy/bin/celery beat -A lms --schedule /var/lib/celery/beat.db --loglevel=INFO |
||||
directory=/var/www/projects/codemy |
||||
user=www-data |
||||
numprocs=1 |
||||
stdout_logfile=/var/www/logs/codemy/celery-beat.log |
||||
stderr_logfile=/var/www/logs/codemy/celery-beat.log |
||||
autostart=true |
||||
autorestart=true |
||||
startsecs=10 |
||||
priority=999 |
||||
|
||||
[program:celery_flower_codemy] |
||||
command=/var/www/.envs/codemy/bin/celery -A lms flower |
||||
directory=/var/www/projects/codemy |
||||
user=www-data |
||||
numprocs=1 |
||||
stdout_logfile=/var/www/logs/codemy/celery-flower.log |
||||
stderr_logfile=/var/www/logs/codemy/celery-flower.log |
||||
autostart=true |
||||
autorestart=true |
||||
startsecs=10 |
||||
priority=600 |
||||
; ================================== |
||||
; celery worker supervisor example |
||||
; ================================== |
||||
|
||||
[program:celery_codemy] |
||||
command=/var/www/.envs/codemy/bin/celery worker -A lms --loglevel=INFO |
||||
directory=/var/www/projects/codemy/ |
||||
user=www-data |
||||
numprocs=1 |
||||
stdout_logfile=/var/www/logs/codemy/celery-worker.log |
||||
stderr_logfile=/var/www/logs/codemy/celery-worker.log |
||||
autostart=true |
||||
autorestart=true |
||||
startsecs=10 |
||||
stopwaitsecs = 600 |
||||
killasgroup=true |
||||
|
||||
[program:celery_beat_codemy] |
||||
command=/var/www/.envs/codemy/bin/celery beat -A lms --schedule /var/lib/celery/beat.db --loglevel=INFO |
||||
directory=/var/www/projects/codemy |
||||
user=www-data |
||||
numprocs=1 |
||||
stdout_logfile=/var/www/logs/codemy/celery-beat.log |
||||
stderr_logfile=/var/www/logs/codemy/celery-beat.log |
||||
autostart=true |
||||
autorestart=true |
||||
startsecs=10 |
||||
priority=999 |
||||
|
||||
[program:celery_flower_codemy] |
||||
command=/var/www/.envs/codemy/bin/celery -A lms flower |
||||
directory=/var/www/projects/codemy |
||||
user=www-data |
||||
numprocs=1 |
||||
stdout_logfile=/var/www/logs/codemy/celery-flower.log |
||||
stderr_logfile=/var/www/logs/codemy/celery-flower.log |
||||
autostart=true |
||||
autorestart=true |
||||
startsecs=10 |
||||
priority=600 |
||||
|
||||
@ -1,51 +1,51 @@ |
||||
-----BEGIN RSA PRIVATE KEY----- |
||||
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 |
||||
-----END RSA PRIVATE KEY----- |
||||
-----BEGIN RSA PRIVATE KEY----- |
||||
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 |
||||
-----END RSA PRIVATE KEY----- |
||||
|
||||
@ -1,85 +1,85 @@ |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIF9jCCBN6gAwIBAgIMY/C5dNv6x+tP/WuUMA0GCSqGSIb3DQEBCwUAMGAxCzAJ |
||||
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H |
||||
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN |
||||
MTYwNzAxMTMyMzM0WhcNMTcwNzAyMTMyMzM0WjA5MSEwHwYDVQQLExhEb21haW4g |
||||
Q29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAMMCyouY29kZW15LnJ1MIICIjANBgkq |
||||
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeS |
||||
Ne8aJVMXRu3IbIML+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7Mv |
||||
Pbts5Y7LWBcwUomJ+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674Z |
||||
ImLLtc+bLl3NjzH6t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefK |
||||
zigr+5sU34SMbWLsczspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWq |
||||
i6OOVZMcNjqePwc41R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvO |
||||
OnK/TeOzaJoCx/yb7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8ty |
||||
WTcypBWhr6xTYhNBGTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNK |
||||
jqMo3wvrvJjcM1mzqRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtp |
||||
kzaMCdEf33ELDshGXN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p |
||||
8MDs1ZCNtjScCzgtaNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOr |
||||
sWFfpoEXjmMCAwEAAaOCAdUwggHRMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYBBQUH |
||||
AQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j |
||||
b20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzABhi1o |
||||
dHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIwVgYD |
||||
VR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu |
||||
Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQCMAAw |
||||
QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9n |
||||
c2RvbWFpbnZhbHNoYTJnMi5jcmwwIQYDVR0RBBowGIILKi5jb2RlbXkucnWCCWNv |
||||
ZGVteS5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYE |
||||
FHlv5NiaqItBFuN0vudXy9jt1bLkMB8GA1UdIwQYMBaAFOpOfNSALeUVgYYmjIJt |
||||
wJikz5cPMA0GCSqGSIb3DQEBCwUAA4IBAQBfIs7hKJlHw5Hly/vVhjAQzX8qcN9H |
||||
ISyHjmU4KeMKtiq0RdvC2Jf1IQFmxvgmycrARH1Xc9cHoMXZ8prYonnXeRX7fqrL |
||||
hsjp6x87DxwDDXqblHqpoakFXhZhY2fJCeH+YQTrY37+hOy3qOreI3CiRK5N+BYF |
||||
PO78hVAa5TdawQGM3c1TeYIG3ZzQ3x2wVGAQNCXdwcJOLF9dl6z+syySTOGPABKN |
||||
rIEKOzc4ScqIHOzuQ1qTG2QcjwyH9tarDjJd79rnZUQzf1O58DwGwaQZwh6gjksz |
||||
QXZOLz6LR55gpBP8cGpqJIwOiZKjtLTqeE6q/kJ0C9sbxnNw9sCkeAhh |
||||
-----END CERTIFICATE----- |
||||
|
||||
Корневой сертификат |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG |
||||
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv |
||||
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw |
||||
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i |
||||
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT |
||||
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ |
||||
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp |
||||
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp |
||||
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG |
||||
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ |
||||
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 |
||||
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E |
||||
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B |
||||
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz |
||||
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE |
||||
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP |
||||
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad |
||||
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME |
||||
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== |
||||
-----END CERTIFICATE----- |
||||
|
||||
Промежуточный сертификат |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG |
||||
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv |
||||
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw |
||||
MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i |
||||
YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0 |
||||
aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK |
||||
AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC |
||||
jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG |
||||
ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX |
||||
qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It |
||||
INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4 |
||||
tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC |
||||
AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A |
||||
mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v |
||||
d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG |
||||
Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE |
||||
MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290 |
||||
cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL |
||||
BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex |
||||
4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE |
||||
GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj |
||||
H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj |
||||
tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6 |
||||
EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIF9jCCBN6gAwIBAgIMY/C5dNv6x+tP/WuUMA0GCSqGSIb3DQEBCwUAMGAxCzAJ |
||||
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H |
||||
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN |
||||
MTYwNzAxMTMyMzM0WhcNMTcwNzAyMTMyMzM0WjA5MSEwHwYDVQQLExhEb21haW4g |
||||
Q29udHJvbCBWYWxpZGF0ZWQxFDASBgNVBAMMCyouY29kZW15LnJ1MIICIjANBgkq |
||||
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcJkDivloDX2QRQE+s1jPH/pxq+oZGeS |
||||
Ne8aJVMXRu3IbIML+iJt0H0XGol9N9FkvSHF2G33oOmJ134Imd6BcQ/OQCT8J7Mv |
||||
Pbts5Y7LWBcwUomJ+QZq9qcHFVrcP95Q0wrZTV5f2zU468dz+eUnmWVfFYIR674Z |
||||
ImLLtc+bLl3NjzH6t23WrTiIUmPpe4dOH9CktKoUyfzgzFcXFOI967mooMAzhefK |
||||
zigr+5sU34SMbWLsczspC7cj22LRpIXowFeuRnoygXXVbDvRlgU2criLFqiDCwWq |
||||
i6OOVZMcNjqePwc41R4qdWeIf7mJ69xuPQtzHrO+rRC8mgGVSU+9nKunNq6tIxvO |
||||
OnK/TeOzaJoCx/yb7XsNcYCoue3ZV3emM2WeUB6MOxG41m9AFo9TKsHOtpFLx8ty |
||||
WTcypBWhr6xTYhNBGTiSUMofGZmM6sjcVyQT6pEFpx50DxZeTDhnO+wSi8NZRoNK |
||||
jqMo3wvrvJjcM1mzqRzHE5nyzU1/Gf/j5WCNdCC/+2Q8s+LXaKkm0iRUuSqmQVtp |
||||
kzaMCdEf33ELDshGXN4jCvTSG5w8fL+GdeZ8BpBPLob8qKkYU2kW3YqawQ9+bi7p |
||||
8MDs1ZCNtjScCzgtaNvoX/3/TFO4tSu/XCz5nGYKVYbjUrr1Mv9NldSIiua/hJOr |
||||
sWFfpoEXjmMCAwEAAaOCAdUwggHRMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYBBQUH |
||||
AQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5j |
||||
b20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzABhi1o |
||||
dHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIwVgYD |
||||
VR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cu |
||||
Z2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQCMAAw |
||||
QwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9n |
||||
c2RvbWFpbnZhbHNoYTJnMi5jcmwwIQYDVR0RBBowGIILKi5jb2RlbXkucnWCCWNv |
||||
ZGVteS5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYE |
||||
FHlv5NiaqItBFuN0vudXy9jt1bLkMB8GA1UdIwQYMBaAFOpOfNSALeUVgYYmjIJt |
||||
wJikz5cPMA0GCSqGSIb3DQEBCwUAA4IBAQBfIs7hKJlHw5Hly/vVhjAQzX8qcN9H |
||||
ISyHjmU4KeMKtiq0RdvC2Jf1IQFmxvgmycrARH1Xc9cHoMXZ8prYonnXeRX7fqrL |
||||
hsjp6x87DxwDDXqblHqpoakFXhZhY2fJCeH+YQTrY37+hOy3qOreI3CiRK5N+BYF |
||||
PO78hVAa5TdawQGM3c1TeYIG3ZzQ3x2wVGAQNCXdwcJOLF9dl6z+syySTOGPABKN |
||||
rIEKOzc4ScqIHOzuQ1qTG2QcjwyH9tarDjJd79rnZUQzf1O58DwGwaQZwh6gjksz |
||||
QXZOLz6LR55gpBP8cGpqJIwOiZKjtLTqeE6q/kJ0C9sbxnNw9sCkeAhh |
||||
-----END CERTIFICATE----- |
||||
|
||||
Корневой сертификат |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG |
||||
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv |
||||
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw |
||||
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i |
||||
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT |
||||
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ |
||||
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp |
||||
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp |
||||
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG |
||||
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ |
||||
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 |
||||
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E |
||||
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B |
||||
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz |
||||
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE |
||||
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP |
||||
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad |
||||
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME |
||||
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== |
||||
-----END CERTIFICATE----- |
||||
|
||||
Промежуточный сертификат |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG |
||||
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv |
||||
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw |
||||
MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i |
||||
YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0 |
||||
aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK |
||||
AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC |
||||
jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG |
||||
ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX |
||||
qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It |
||||
INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4 |
||||
tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC |
||||
AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A |
||||
mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v |
||||
d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG |
||||
Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE |
||||
MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290 |
||||
cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL |
||||
BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex |
||||
4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE |
||||
GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj |
||||
H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj |
||||
tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6 |
||||
EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= |
||||
-----END CERTIFICATE----- |
||||
@ -1,17 +1,17 @@ |
||||
django==1.9.3 |
||||
Pillow==3.3.0 |
||||
psycopg2==2.6.2 |
||||
simplejson==3.8.2 |
||||
celery==3.1.23 |
||||
django-celery==3.1.17 |
||||
django-wysiwyg-redactor==0.4.9 |
||||
raven==5.24.3 |
||||
uwsgi==2.0.13.1 |
||||
flower==0.9.1 |
||||
django-import-export==0.4.5 |
||||
python-dateutil==2.5.3 |
||||
requests==2.11.0 |
||||
ipython==5.1.0 |
||||
django-precise-bbcode==1.2.6 |
||||
html2bbcode==2.3.2 |
||||
markdown==2.6.7 |
||||
Pillow |
||||
psycopg2 |
||||
simplejson |
||||
celery |
||||
django-celery |
||||
django-wysiwyg-redactor |
||||
raven |
||||
uwsgi |
||||
flower |
||||
django-import-export |
||||
python-dateutil |
||||
requests |
||||
ipython |
||||
django-precise-bbcode |
||||
html2bbcode |
||||
markdown |
||||
@ -1,50 +0,0 @@ |
||||
sudo apt-get update |
||||
sudo apt-get upgrade |
||||
sudo su |
||||
# Установка программ |
||||
apt-get install -y python-dev python-virtualenv python-pip postgresql postgresql-server-dev-9.3 libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk git |
||||
pip install --upgrade pip |
||||
# Создание иерархии |
||||
cd /var/ |
||||
mkdir www |
||||
cd www |
||||
mkdir projects |
||||
mkdir .envs |
||||
virtualenv .envs/codemy |
||||
source .envs/codemy/bin/activate |
||||
mkdir logs |
||||
mkdir run |
||||
cd projects |
||||
mkdir codemy |
||||
cd codemy/configs |
||||
# Установка пакетов |
||||
pip install -r packs |
||||
# Создание базы и пользователя |
||||
echo 'psql -c "create user team with password 'nu5Xefise';"' > start.sh |
||||
echo 'psql -c "CREATE DATAbase codemy owner team;"' >> start.sh |
||||
echo 'psql -c "alter role team login createdb;"' >> start.sh |
||||
sudo -u postgres './start.sh' |
||||
rm -rf start.sh |
||||
# Подправить postgres |
||||
# Изменить метод авторизации в pg_hba |
||||
echo 'local all postgres trust' > /etc/postgresql/9.3/main/pg_hba.conf |
||||
echo 'local all all md5' >> /etc/postgresql/9.3/main/pg_hba.conf |
||||
echo 'host all all 127.0.0.1/32 md5' >> /etc/postgresql/9.3/main/pg_hba.conf |
||||
echo 'host all all ::1/128 md5' >> /etc/postgresql/9.3/main/pg_hba.conf |
||||
service postgresql restart |
||||
# Миграция базы |
||||
cd /var/www/projects/codemy/ |
||||
# Импорь рабочего backup.sql |
||||
# echo 'psql -f backup.sql' > make_backup.sh |
||||
# sudo -u postgres './make_backup.sh' |
||||
rm -rf make_backup.sh |
||||
# Пути nginx |
||||
#ln -s /var/www/projects/codemy/configs/dev_nginx /etc/nginx/conf.d/codemy.conf |
||||
#service nginx restart |
||||
# Пути supervisor |
||||
#ln -s /var/www/projects/codemy/configs/supervisor.conf /etc/supervisor/conf.d/codemy.conf |
||||
#supervisorctl reread |
||||
#supervisorctl update |
||||
cd /var/ |
||||
chown www-data:www-data -R www |
||||
#supervisorctl restart all |
||||
@ -1,51 +0,0 @@ |
||||
-----BEGIN RSA PRIVATE KEY----- |
||||
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 |
||||
-----END RSA PRIVATE KEY----- |
||||
@ -1,100 +0,0 @@ |
||||
Ваш SSL-сертификат предоставлен ниже |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIIdDCCB1ygAwIBAgIMPkc95DAdllwTruefMA0GCSqGSIb3DQEBCwUAMGAxCzAJ |
||||
BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTYwNAYDVQQDEy1H |
||||
bG9iYWxTaWduIERvbWFpbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwHhcN |
||||
MTYxMjI2MTMxNzM0WhcNMTcxMjI3MTMxNzM0WjA8MSEwHwYDVQQLExhEb21haW4g |
||||
Q29udHJvbCBWYWxpZGF0ZWQxFzAVBgNVBAMMDiouc2tpbGwtYm94LnJ1MIICIjAN |
||||
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzBKLQbxjOT4tn618AMkbUjcuATjA |
||||
TJNRJ/vcZWtoNER+y8Xh64WyZlXkB3vaRAedmoe5pxYF7gtoATpTgwxhM7ah2RDb |
||||
ui/ZLgK8MHtjhwhcDVu1iCSeXnlYUuqysnbPDHymYZRVtiBVPkRK7sshkIB0CIpA |
||||
XpjoYyHiVoEqFk/xSrsLveXXgQtzPipzuweVHwwq7KufRJkHPWbAEZBpwc3QoLga |
||||
o5khVHTvZuLUMFB9vFGp34AaGkGNbTWDepIn2QviqnWvGqyIshhNv8uuf++irKZM |
||||
BLxuh0MnkSkbXYLf5CCcjw04nzPRDsd5ZZFXQyyIOLL2NIYYiIp22q082idSjbSX |
||||
kobwfagH8nc5ljv8Gryqeo22QERI3Fp3bZ/t+gTVzpFjbCYP8c/nusNKk2vyA/yo |
||||
/aqou9+EjoIFSrqgdiv/FDYyK0MwWik3VrykqCbgy6MuaSdex4iAKBOlAzjRmrSi |
||||
2AF5q3SEaLLhPV1e8HS8z8Z6Xo0EbeEFvLuVeHdukEsPk6167aToNmk0pC5Ic0hq |
||||
eeNtgLZfCLUhLzh/AhYW6sTjT620O6mQP/3IiEpEFYk4iGe+TJ81d7P11/W7+7Va |
||||
gFL611WBnDafYdxT4OZFKhqpnXW0lWvGK4ROtxNmaaZmsfFwAZVDFvavsy0G4FLx |
||||
Miw1CKJNiC4cQjkCAwEAAaOCBFAwggRMMA4GA1UdDwEB/wQEAwIFoDCBlAYIKwYB |
||||
BQUHAQEEgYcwgYQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9zZWN1cmUuZ2xvYmFsc2ln |
||||
bi5jb20vY2FjZXJ0L2dzZG9tYWludmFsc2hhMmcycjEuY3J0MDkGCCsGAQUFBzAB |
||||
hi1odHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nkb21haW52YWxzaGEyZzIw |
||||
VgYDVR0gBE8wTTBBBgkrBgEEAaAyAQowNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93 |
||||
d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCAYGZ4EMAQIBMAkGA1UdEwQC |
||||
MAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9n |
||||
cy9nc2RvbWFpbnZhbHNoYTJnMi5jcmwwJwYDVR0RBCAwHoIOKi5za2lsbC1ib3gu |
||||
cnWCDHNraWxsLWJveC5ydTAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw |
||||
HQYDVR0OBBYEFO9PIphPbOr4Bnhcxb2sF7dgOwEsMB8GA1UdIwQYMBaAFOpOfNSA |
||||
LeUVgYYmjIJtwJikz5cPMIICcQYKKwYBBAHWeQIEAgSCAmEEggJdAlsAdgDd6x0r |
||||
eg1PpiCLga2BaHB+Lo6dAdVciI09EcTNtuy+zAAAAVk7R3L9AAAEAwBHMEUCIA2s |
||||
RoFsKZS5geHSL6Gm6nixJWSRjOIDdHiFJU0CuinHAiEAy+5pWxoLEhADou6GVjCS |
||||
j4X3Sq/x2TJhPU4J3IuweBUAdwBWFAaaL9fC7NP14b1Esj7HRna5vJkRXMDvlJhV |
||||
1onQ3QAAAVk7R3XgAAAEAwBIMEYCIQDxshxHNK9czqomcjPMfit/R8WpdYXit/Ke |
||||
ZALI23oZ9wIhAIvmBuv4BssQ1oV/PxxVdNYF7PCC0ZFnTDRdBTDY6A6zAHcAu9nf |
||||
vB+KcbWTlCOXqpJ7RzhXlQqrUugakJZkNo4e0YUAAAFZO0d23QAABAMASDBGAiEA |
||||
zcvKaoSjhTHBDkwiDUtdlcrbWtWF7nzVOXu9lr6A39QCIQCvdi7G5Lf2V5Rp6hyy |
||||
EsAK+2Mq9x/GQukjtfrM90CUdwB3AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3 |
||||
zQ7IDdwQAAABWTtHdioAAAQDAEgwRgIhAInPwgCa+2PDWQo+lJFu2UWHxwyCe2lg |
||||
w9wFjVM6gXJ3AiEAufHeiiQz/yVC//v5l4SMxvvNyvKYQPDf6/Zao2g3wfYAdgDu |
||||
S723dc5guuFCaR+r4Z5mow9+X7By2IMAxHuJeqj9ywAAAVk7R3kcAAAEAwBHMEUC |
||||
IQCv1xvEaL4wxup86rGUTdATh8Ui07/vjBvI8uc+Fvbc1wIgRe5kpxDNZQNwBFZC |
||||
eR8Wbc2X2yV9zI2uDel2HDGNnvcwDQYJKoZIhvcNAQELBQADggEBAH8d8vr922T5 |
||||
vuMYKy/l9id0K8W4HWn3OpHVfIJc91Hm21XWrDDV6AJFDrusQswNCGD4TsFl68U7 |
||||
L+RlnBQZ0piDcrNoveMOeW0nMMP96HLS91G2BbwOxQoJWsWpmbeLryMk0lWhBlAN |
||||
C3LmCASXjMqbgt4IpAKghz6HjGlMgDLM9B7+BsXV3te4kVdLW7SanSpOz5PCDSLB |
||||
Urb4hIbMtMJiiam5eLRLFDByMZoT29hKdgapUbbxBpCOtu0SvSOdp7ArAOLdMNDQ |
||||
RLaI7BJP39stYkp6nS0Ayc2Dsq6NEaFumdFt8gTlmhb4WxmTybRsMfSK2ZxQgB4z |
||||
OJV1e2ozq2g= |
||||
-----END CERTIFICATE----- |
||||
|
||||
Корневой сертификат |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG |
||||
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv |
||||
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw |
||||
MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i |
||||
YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT |
||||
aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ |
||||
jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp |
||||
xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp |
||||
1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG |
||||
snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ |
||||
U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 |
||||
9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E |
||||
BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B |
||||
AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz |
||||
yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE |
||||
38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP |
||||
AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad |
||||
DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME |
||||
HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== |
||||
-----END CERTIFICATE----- |
||||
|
||||
Промежуточный сертификат |
||||
-----BEGIN CERTIFICATE----- |
||||
MIIEYzCCA0ugAwIBAgILBAAAAAABRE7wPiAwDQYJKoZIhvcNAQELBQAwVzELMAkG |
||||
A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv |
||||
b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw |
||||
MDBaFw0yNDAyMjAxMDAwMDBaMGAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i |
||||
YWxTaWduIG52LXNhMTYwNAYDVQQDEy1HbG9iYWxTaWduIERvbWFpbiBWYWxpZGF0 |
||||
aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK |
||||
AoIBAQCp3cwOs+IyOd1JIqgTaZOHiOEM7nF9vZCHll1Z8syz0lhXV/lG72wm2DZC |
||||
jn4wsy+aPlN7H262okxFHzzTFZMcie089Ffeyr3sBppqKqAZUn9R0XQ5CJ+r69eG |
||||
ExWXrjbDVGYOWvKgc4Ux47JkFGr/paKOJLu9hVIVonnu8LXuPbj0fYC82ZA1ZbgX |
||||
qa2zmJ+gfn1u+z+tfMIbWTaW2jcyS0tdNQJjjtunz2LuzC7Ujcm9PGqRcqIip3It |
||||
INH6yjfaGJjmFiRxJUvE5XuJUgkC/VkrBG7KB4HUs9ra2+PMgKhWBwZ8lgg3nds4 |
||||
tmI0kWIHdAE42HIw4uuQcSZiwFfzAgMBAAGjggElMIIBITAOBgNVHQ8BAf8EBAMC |
||||
AQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU6k581IAt5RWBhiaMgm3A |
||||
mKTPlw8wRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8v |
||||
d3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCowKKAmoCSG |
||||
Imh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYBBQUHAQEE |
||||
MTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNvbS9yb290 |
||||
cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZIhvcNAQEL |
||||
BQADggEBANdFnqDc4ONhWgt9d4QXLWVagpqNoycqhffJ7+mG/dRHzQFSlsVDvTex |
||||
4bjyqdKKEYRxkRWJ3AKdC8tsM4U0KJ4gsrGX3G0LEME8zV/qXdeYMcU0mVwAYVXE |
||||
GwJbxeOJyLS4bx448lYm6UHvPc2smU9ZSlctS32ux4j71pg79eXw6ImJuYsDy1oj |
||||
H6T9uOr7Lp2uanMJvPzVoLVEgqtEkS5QLlfBQ9iRBIvpES5ftD953x77PzAAi1Pj |
||||
tywdO02L3ORkHQRYM68bVeerDL8wBHTk8w4vMDmNSwSMHnVmZkngvkA0x1xaUZK6 |
||||
EjxS1QSCVS1npd+3lXzuP8MIugS+wEY= |
||||
-----END CERTIFICATE----- |
||||
@ -1,28 +0,0 @@ |
||||
-----BEGIN CERTIFICATE REQUEST----- |
||||
MIIEyDCCArACAQAwgYIxCzAJBgNVBAYTAlJVMQ8wDQYDVQQIDAZNb3Njb3cxDzAN |
||||
BgNVBAcMBk1vc2NvdzEVMBMGA1UECwwMSVREZXBhcnRtZW50MRcwFQYDVQQDDA4q |
||||
LnNraWxsLWJveC5ydTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac2tpbGwtYm94LnJ1 |
||||
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzBKLQbxjOT4tn618AMkb |
||||
UjcuATjATJNRJ/vcZWtoNER+y8Xh64WyZlXkB3vaRAedmoe5pxYF7gtoATpTgwxh |
||||
M7ah2RDbui/ZLgK8MHtjhwhcDVu1iCSeXnlYUuqysnbPDHymYZRVtiBVPkRK7ssh |
||||
kIB0CIpAXpjoYyHiVoEqFk/xSrsLveXXgQtzPipzuweVHwwq7KufRJkHPWbAEZBp |
||||
wc3QoLgao5khVHTvZuLUMFB9vFGp34AaGkGNbTWDepIn2QviqnWvGqyIshhNv8uu |
||||
f++irKZMBLxuh0MnkSkbXYLf5CCcjw04nzPRDsd5ZZFXQyyIOLL2NIYYiIp22q08 |
||||
2idSjbSXkobwfagH8nc5ljv8Gryqeo22QERI3Fp3bZ/t+gTVzpFjbCYP8c/nusNK |
||||
k2vyA/yo/aqou9+EjoIFSrqgdiv/FDYyK0MwWik3VrykqCbgy6MuaSdex4iAKBOl |
||||
AzjRmrSi2AF5q3SEaLLhPV1e8HS8z8Z6Xo0EbeEFvLuVeHdukEsPk6167aToNmk0 |
||||
pC5Ic0hqeeNtgLZfCLUhLzh/AhYW6sTjT620O6mQP/3IiEpEFYk4iGe+TJ81d7P1 |
||||
1/W7+7VagFL611WBnDafYdxT4OZFKhqpnXW0lWvGK4ROtxNmaaZmsfFwAZVDFvav |
||||
sy0G4FLxMiw1CKJNiC4cQjkCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4ICAQBVuWBe |
||||
QHNuT6998V8kBFlWOAhoBr2+bxR6mdL+qiCQTsbAjPemkZiZXp/2uji6Wmf11qMB |
||||
dxmPMGiFvXgPsfCcctbxfLqwtJvAo4s0yjCv3N8DISuO56C3WwnAsfF5xoxSDiAa |
||||
SvkpQ0TnuSl2cU4x6HsiKWNgILOLs1f+Lf6NlImC6Yz/bkRwn+1RXyjEDqJJz/wN |
||||
3Eekb9fPWXnloyOgqF+ESZzZbgZ653+nBUg0OMkeKhA82pC8r83CduQMy08YCwXu |
||||
FuHhGWs4AF2xHjwTwKfGjE1E7Ni+Ak5znriCu7o27Kq9UiGMujhKMxOroWxE1wYZ |
||||
Z0x2MuhnI3O1+dSnv7+ffDt75C8i4WiYQcgC2d6QD4Rt9SAxvgedkAbn2Xtadn8i |
||||
Qg+lGouPLhPjT9wCCTYNI/17MJaBpmrz/q+oEXXjSnFFDEXgbv534ltaVujvbLbV |
||||
gMF0beoI0FA6dlLyzHOgiiiyDEyS0znU8Qxfc92S9yD40v8mf0sJBH/mpZmEBO6c |
||||
Wlv9sBBrPWtiLUmbOzsv1eD6g4u992yqpJB317HOECjXXhKJCpw1MXr921tvMnyN |
||||
v5SCf6jIQXHm6k/Srau1upgOkm1GfJT9NIAzbomUSCiWs+0Iucw7FuH0S5RDIfD2 |
||||
3/8LVBh9A/6ddAlsndZ4J0bKysjGW9M1LCU2Gg== |
||||
-----END CERTIFICATE REQUEST----- |
||||
Binary file not shown.
@ -1,51 +1,51 @@ |
||||
-----BEGIN RSA PRIVATE KEY----- |
||||
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 |
||||
-----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----- |
||||
|
||||
Binary file not shown.
@ -1,8 +1,8 @@ |
||||
[program:codemy] |
||||
command=/usr/bin/uwsgi --ini /var/www/configs/codemy/uwsgi.ini |
||||
directory=/var/www/projects/codemy |
||||
user=www-data |
||||
group=www-data |
||||
autostart=true |
||||
autorestart=true |
||||
[program:codemy] |
||||
command=/usr/bin/uwsgi --ini /var/www/configs/codemy/uwsgi.ini |
||||
directory=/var/www/projects/codemy |
||||
user=www-data |
||||
group=www-data |
||||
autostart=true |
||||
autorestart=true |
||||
stderr_logfile=/var/www/logs/codemy/supervisor-errors.log |
||||
@ -1,15 +1,15 @@ |
||||
[uwsgi] |
||||
chdir = /var/www/projects/codemy/ |
||||
env = DJANGO_SETTINGS_MODULE=lms.settings |
||||
module = lms.wsgi:application |
||||
home = /var/www/.envs/codemy/ |
||||
master = true |
||||
threads = 3 |
||||
processes = 2 |
||||
socket = /var/www/run/codemy.sock |
||||
chmod-socket = 777 |
||||
vacuum = true |
||||
harakiri = 20 |
||||
plugins=python34 |
||||
uid = www-data |
||||
gid = www-data |
||||
[uwsgi] |
||||
chdir = /var/www/projects/codemy/ |
||||
env = DJANGO_SETTINGS_MODULE=lms.settings |
||||
module = lms.wsgi:application |
||||
home = /var/www/.envs/codemy/ |
||||
master = true |
||||
threads = 3 |
||||
processes = 2 |
||||
socket = /var/www/run/codemy.sock |
||||
chmod-socket = 777 |
||||
vacuum = true |
||||
harakiri = 20 |
||||
plugins=python34 |
||||
uid = www-data |
||||
gid = www-data |
||||
|
||||
@ -1,120 +1,120 @@ |
||||
from django.contrib import admin |
||||
|
||||
from access.models import User |
||||
from courses.models import Lesson, Course, CourseTheme, Homework, Exam, Skills, Achievements, SkillJ, CourseMap, \ |
||||
AchievementsMap, Diploma, MaterialDirection |
||||
|
||||
|
||||
class LessonAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'get_title', 'sort', 'theme', 'token', 'on_comment') |
||||
raw_id_fields = ['materials'] |
||||
search_fields = ['title', 'sort', 'id', 'token'] |
||||
list_filter = ['course', 'on_comment', 'theme'] |
||||
|
||||
def get_title(self, obj): |
||||
return obj.title[:100] |
||||
|
||||
admin.site.register(Lesson, LessonAdmin) |
||||
|
||||
|
||||
class MaterialDirectionAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'color',) |
||||
raw_id_fields = ['mentors'] |
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs): |
||||
if db_field.name == "mentors": |
||||
kwargs["queryset"] = User.objects.filter(in_role='S2') |
||||
return super(MaterialDirectionAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) |
||||
|
||||
admin.site.register(MaterialDirection, MaterialDirectionAdmin) |
||||
|
||||
|
||||
class CourseAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'id', 'direction', 'must_build', 'public', ) |
||||
list_filter = ('direction', ) |
||||
raw_id_fields = ['teachers'] |
||||
search_fields = ['title', 'id'] |
||||
filter_horizontal = ['recommend', 'keywords'] |
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs): |
||||
if db_field.name == "teachers": |
||||
kwargs["queryset"] = User.objects.filter(in_role='T') |
||||
|
||||
if db_field.name == "mentors": |
||||
kwargs["queryset"] = User.objects.filter(in_role='S2') |
||||
|
||||
return super(CourseAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) |
||||
|
||||
admin.site.register(Course, CourseAdmin) |
||||
|
||||
|
||||
class CourseThemeAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'sort', 'title', 'course', '_type', 'price_type', 'on_comment', ) |
||||
list_filter = ['course', '_type', 'on_comment'] |
||||
search_fields = ['title', 'sort'] |
||||
|
||||
admin.site.register(CourseTheme, CourseThemeAdmin) |
||||
|
||||
|
||||
class HomeworkAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'course', 'theme', 'token') |
||||
search_fields = ['id', 'theme', 'course', 'token'] |
||||
list_filter = ('course',) |
||||
raw_id_fields = ('theme', 'course', 'materials', ) |
||||
|
||||
admin.site.register(Homework, HomeworkAdmin) |
||||
|
||||
|
||||
class ExamAdmin(admin.ModelAdmin): |
||||
list_display = ('course', 'token', ) |
||||
raw_id_fields = ['materials'] |
||||
search_fields = ['id', 'course__title'] |
||||
|
||||
admin.site.register(Exam, ExamAdmin) |
||||
|
||||
|
||||
class SkillsAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'color', 'mini_icon', 'big_icon') |
||||
search_fields = ['title'] |
||||
|
||||
admin.site.register(Skills, SkillsAdmin) |
||||
|
||||
|
||||
class AchievementsAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'title', 'icon', 'image', 'background', 'border',) |
||||
|
||||
|
||||
admin.site.register(Achievements, AchievementsAdmin) |
||||
|
||||
|
||||
class SkillJAdmin(admin.ModelAdmin): |
||||
list_display = ('skill', 'lesson', 'size',) |
||||
raw_id_fields = ['lesson'] |
||||
list_filter = ['lesson__course'] |
||||
|
||||
admin.site.register(SkillJ, SkillJAdmin) |
||||
|
||||
|
||||
class CourseMapAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'course', 'lesson', 'homework', 'exam', 'sort', 'token', ) |
||||
raw_id_fields = ['course', 'lesson', 'homework', 'exam'] |
||||
list_filter = ('course',) |
||||
search_fields = ['lesson_id'] |
||||
|
||||
admin.site.register(CourseMap, CourseMapAdmin) |
||||
|
||||
|
||||
class AchievementsMapAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'point', 'achiv', 'after', ) |
||||
raw_id_fields = ['point'] |
||||
|
||||
|
||||
admin.site.register(AchievementsMap, AchievementsMapAdmin) |
||||
|
||||
|
||||
class DiplomaAdmin(admin.ModelAdmin): |
||||
list_filter = ('course__title', 'key', ) |
||||
search_fields = ['course__title'] |
||||
|
||||
|
||||
admin.site.register(Diploma, DiplomaAdmin) |
||||
from django.contrib import admin |
||||
|
||||
from access.models import User |
||||
from courses.models import Lesson, Course, CourseTheme, Homework, Exam, Skills, Achievements, SkillJ, CourseMap, \ |
||||
AchievementsMap, Diploma, MaterialDirection |
||||
|
||||
|
||||
class LessonAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'get_title', 'sort', 'theme', 'token', 'on_comment') |
||||
raw_id_fields = ['materials'] |
||||
search_fields = ['title', 'sort', 'id', 'token'] |
||||
list_filter = ['course', 'on_comment', 'theme'] |
||||
|
||||
def get_title(self, obj): |
||||
return obj.title[:100] |
||||
|
||||
admin.site.register(Lesson, LessonAdmin) |
||||
|
||||
|
||||
class MaterialDirectionAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'color',) |
||||
raw_id_fields = ['mentors'] |
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs): |
||||
if db_field.name == "mentors": |
||||
kwargs["queryset"] = User.objects.filter(in_role='S2') |
||||
return super(MaterialDirectionAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) |
||||
|
||||
admin.site.register(MaterialDirection, MaterialDirectionAdmin) |
||||
|
||||
|
||||
class CourseAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'id', 'direction', 'must_build', 'public', ) |
||||
list_filter = ('direction', ) |
||||
raw_id_fields = ['teachers'] |
||||
search_fields = ['title', 'id'] |
||||
filter_horizontal = ['recommend', 'keywords'] |
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs): |
||||
if db_field.name == "teachers": |
||||
kwargs["queryset"] = User.objects.filter(in_role='T') |
||||
|
||||
if db_field.name == "mentors": |
||||
kwargs["queryset"] = User.objects.filter(in_role='S2') |
||||
|
||||
return super(CourseAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) |
||||
|
||||
admin.site.register(Course, CourseAdmin) |
||||
|
||||
|
||||
class CourseThemeAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'sort', 'title', 'course', '_type', 'price_type', 'on_comment', ) |
||||
list_filter = ['course', '_type', 'on_comment'] |
||||
search_fields = ['title', 'sort'] |
||||
|
||||
admin.site.register(CourseTheme, CourseThemeAdmin) |
||||
|
||||
|
||||
class HomeworkAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'course', 'theme', 'token') |
||||
search_fields = ['id', 'theme', 'course', 'token'] |
||||
list_filter = ('course',) |
||||
raw_id_fields = ('theme', 'course', 'materials', ) |
||||
|
||||
admin.site.register(Homework, HomeworkAdmin) |
||||
|
||||
|
||||
class ExamAdmin(admin.ModelAdmin): |
||||
list_display = ('course', 'token', ) |
||||
raw_id_fields = ['materials'] |
||||
search_fields = ['id', 'course__title'] |
||||
|
||||
admin.site.register(Exam, ExamAdmin) |
||||
|
||||
|
||||
class SkillsAdmin(admin.ModelAdmin): |
||||
list_display = ('title', 'color', 'mini_icon', 'big_icon') |
||||
search_fields = ['title'] |
||||
|
||||
admin.site.register(Skills, SkillsAdmin) |
||||
|
||||
|
||||
class AchievementsAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'title', 'icon', 'image', 'background', 'border',) |
||||
|
||||
|
||||
admin.site.register(Achievements, AchievementsAdmin) |
||||
|
||||
|
||||
class SkillJAdmin(admin.ModelAdmin): |
||||
list_display = ('skill', 'lesson', 'size',) |
||||
raw_id_fields = ['lesson'] |
||||
list_filter = ['lesson__course'] |
||||
|
||||
admin.site.register(SkillJ, SkillJAdmin) |
||||
|
||||
|
||||
class CourseMapAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'course', 'lesson', 'homework', 'exam', 'sort', 'token', ) |
||||
raw_id_fields = ['course', 'lesson', 'homework', 'exam'] |
||||
list_filter = ('course',) |
||||
search_fields = ['lesson_id'] |
||||
|
||||
admin.site.register(CourseMap, CourseMapAdmin) |
||||
|
||||
|
||||
class AchievementsMapAdmin(admin.ModelAdmin): |
||||
list_display = ('id', 'point', 'achiv', 'after', ) |
||||
raw_id_fields = ['point'] |
||||
|
||||
|
||||
admin.site.register(AchievementsMap, AchievementsMapAdmin) |
||||
|
||||
|
||||
class DiplomaAdmin(admin.ModelAdmin): |
||||
list_filter = ('course__title', 'key', ) |
||||
search_fields = ['course__title'] |
||||
|
||||
|
||||
admin.site.register(Diploma, DiplomaAdmin) |
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,199 +1,199 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-18 16:46 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
import redactor.fields |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
initial = True |
||||
|
||||
dependencies = [ |
||||
('management', '0001_initial'), |
||||
('storage', '0001_initial'), |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Achievements', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('tech_name', models.CharField(blank=True, default=b'', editable=False, help_text='\u0414\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f', max_length=20, unique=True, verbose_name='\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435')), |
||||
('icon', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430')), |
||||
('title', models.CharField(help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f', max_length=50, verbose_name='\u0418\u043c\u044f')), |
||||
('image', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), |
||||
('background', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')), |
||||
('border', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435', |
||||
'verbose_name_plural': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Course', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('level', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439'), (b'A', '\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 '), (b'E', '\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u043d\u044b\u0439'), (b'B+A', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 + \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439')], default=b'B', max_length=3, verbose_name='\u0423\u0440\u043e\u0432\u0435\u043d\u044c')), |
||||
('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')), |
||||
('title', models.CharField(max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), |
||||
('description', redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), |
||||
('big_image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), |
||||
('page', models.URLField(blank=True, default=b'', verbose_name='\u0421\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f')), |
||||
('preview', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0422\u0440\u044d\u0439\u043b')), |
||||
('sort', models.IntegerField(default=0, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438')), |
||||
('use_fail', models.BooleanField(default=False, verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0435\u0439\u043a\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e')), |
||||
('basic_len', models.IntegerField(default=0, verbose_name='\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')), |
||||
('addition_len', models.IntegerField(default=0, verbose_name='\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')), |
||||
('min_price', models.IntegerField(default=0, verbose_name='\u0426\u0435\u043d\u0430 \u043e\u0442')), |
||||
('buy_icon', models.ImageField(blank=True, null=True, upload_to=b'course', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438')), |
||||
('teachers', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u0438')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u041a\u0443\u0440\u0441', |
||||
'verbose_name_plural': '\u041a\u0443\u0440\u0441\u044b', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='CourseMap', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('_type', models.CharField(choices=[(b'L', '\u0423\u0440\u043e\u043a'), (b'H', '\u0414\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435'), (b'E', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d')], default=b'L', max_length=1, verbose_name='\u0422\u0438\u043f\u044b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432')), |
||||
('sort', models.IntegerField(default=0, verbose_name='\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a')), |
||||
('token', models.CharField(editable=False, max_length=20, null=True, unique=True, verbose_name='\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043b\u044e\u0447')), |
||||
('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', |
||||
'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='CourseTheme', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('price_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')), |
||||
('_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'M', '\u041f\u0440\u0435\u0434\u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b'), (b'Ex', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u043c\u0430')], default=b'B', max_length=2, verbose_name='\u0422\u0438\u043f \u0442\u0435\u043c\u044b')), |
||||
('icon', models.ImageField(blank=True, null=True, upload_to=b'CourseTheme', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430 \u0442\u0435\u043c\u044b')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), |
||||
('title', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), |
||||
('description', models.TextField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u0422\u0435\u043c\u0430', |
||||
'verbose_name_plural': '\u0422\u0435\u043c\u044b', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Exam', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), |
||||
('title', models.CharField(default=b'', help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0430', max_length=255, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), |
||||
('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('diploma', models.ForeignKey(help_text='\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435', on_delete=django.db.models.deletion.CASCADE, related_name='exam_diploma', to='storage.Storage', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430')), |
||||
('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='storage.Storage', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0434\u0438\u043f\u043b\u043e\u043c\u0430')), |
||||
('materials', models.ManyToManyField(blank=True, related_name='exam_materials', to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), |
||||
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d', |
||||
'verbose_name_plural': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u044b', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Homework', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), |
||||
('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b')), |
||||
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u0414\u043e\u0431\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435', |
||||
'verbose_name_plural': '\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Lesson', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('free', models.BooleanField(default=False, verbose_name='\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e')), |
||||
('token', models.CharField(blank=True, default=b'', editable=False, max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), |
||||
('title', models.TextField(blank=True, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), |
||||
('description', redactor.fields.RedactorField(blank=True, default=b'', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('video', models.TextField(default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e')), |
||||
('comments', models.ManyToManyField(blank=True, editable=False, to='management.Comment', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0443\u0440\u043e\u043a\u0430')), |
||||
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u0423\u0440\u043e\u043a', |
||||
'verbose_name_plural': '\u0423\u0440\u043e\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='SkillJ', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('size', models.IntegerField(default=0, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440')), |
||||
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a')), |
||||
], |
||||
options={ |
||||
'ordering': ['id'], |
||||
'verbose_name': '\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0432\u044b\u043a\u0430', |
||||
'verbose_name_plural': '\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u0430\u0432\u044b\u043a\u043e\u0432', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Skills', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('title', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435')), |
||||
('color', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u041d\u0430\u0432\u044b\u043a', |
||||
'verbose_name_plural': '\u041d\u0430\u0432\u044b\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.AddField( |
||||
model_name='skillj', |
||||
name='skill', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='\u041d\u0430\u0432\u044b\u043a'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursemap', |
||||
name='exam', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Exam', verbose_name='\u042d\u043a\u0437\u0430\u043c\u0435\u043d'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursemap', |
||||
name='homework', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Homework', verbose_name='\u0417\u0430\u0434\u0430\u043d\u0438\u0435'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursemap', |
||||
name='lesson', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-18 16:46 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
import redactor.fields |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
initial = True |
||||
|
||||
dependencies = [ |
||||
('management', '0001_initial'), |
||||
('storage', '0001_initial'), |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Achievements', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('tech_name', models.CharField(blank=True, default=b'', editable=False, help_text='\u0414\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f', max_length=20, unique=True, verbose_name='\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435')), |
||||
('icon', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430')), |
||||
('title', models.CharField(help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f', max_length=50, verbose_name='\u0418\u043c\u044f')), |
||||
('image', models.ImageField(upload_to=b'achives', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), |
||||
('background', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')), |
||||
('border', models.CharField(max_length=10, verbose_name='\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435', |
||||
'verbose_name_plural': '\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Course', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('level', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439'), (b'A', '\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 '), (b'E', '\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u043d\u044b\u0439'), (b'B+A', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 + \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439')], default=b'B', max_length=3, verbose_name='\u0423\u0440\u043e\u0432\u0435\u043d\u044c')), |
||||
('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')), |
||||
('title', models.CharField(max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), |
||||
('description', redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), |
||||
('big_image', models.ImageField(blank=True, upload_to=b'course', verbose_name='\u0411\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435')), |
||||
('page', models.URLField(blank=True, default=b'', verbose_name='\u0421\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f')), |
||||
('preview', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0422\u0440\u044d\u0439\u043b')), |
||||
('sort', models.IntegerField(default=0, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438')), |
||||
('use_fail', models.BooleanField(default=False, verbose_name='\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0435\u0439\u043a\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e')), |
||||
('basic_len', models.IntegerField(default=0, verbose_name='\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')), |
||||
('addition_len', models.IntegerField(default=0, verbose_name='\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439')), |
||||
('min_price', models.IntegerField(default=0, verbose_name='\u0426\u0435\u043d\u0430 \u043e\u0442')), |
||||
('buy_icon', models.ImageField(blank=True, null=True, upload_to=b'course', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438')), |
||||
('teachers', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u0438')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u041a\u0443\u0440\u0441', |
||||
'verbose_name_plural': '\u041a\u0443\u0440\u0441\u044b', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='CourseMap', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('_type', models.CharField(choices=[(b'L', '\u0423\u0440\u043e\u043a'), (b'H', '\u0414\u043e\u043c\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435'), (b'E', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d')], default=b'L', max_length=1, verbose_name='\u0422\u0438\u043f\u044b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432')), |
||||
('sort', models.IntegerField(default=0, verbose_name='\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a')), |
||||
('token', models.CharField(editable=False, max_length=20, null=True, unique=True, verbose_name='\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043b\u044e\u0447')), |
||||
('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', |
||||
'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='CourseTheme', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('price_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')), |
||||
('_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'M', '\u041f\u0440\u0435\u0434\u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b'), (b'Ex', '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0442\u0435\u043c\u0430')], default=b'B', max_length=2, verbose_name='\u0422\u0438\u043f \u0442\u0435\u043c\u044b')), |
||||
('icon', models.ImageField(blank=True, null=True, upload_to=b'CourseTheme', verbose_name='\u0418\u043a\u043e\u043d\u043a\u0430 \u0442\u0435\u043c\u044b')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), |
||||
('title', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), |
||||
('description', models.TextField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u043c\u044b')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u0422\u0435\u043c\u0430', |
||||
'verbose_name_plural': '\u0422\u0435\u043c\u044b', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Exam', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), |
||||
('title', models.CharField(default=b'', help_text='\u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0430', max_length=255, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), |
||||
('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('diploma', models.ForeignKey(help_text='\u041f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435', on_delete=django.db.models.deletion.CASCADE, related_name='exam_diploma', to='storage.Storage', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430')), |
||||
('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='storage.Storage', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0434\u0438\u043f\u043b\u043e\u043c\u0430')), |
||||
('materials', models.ManyToManyField(blank=True, related_name='exam_materials', to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430')), |
||||
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d', |
||||
'verbose_name_plural': '\u042d\u043a\u0437\u0430\u043c\u0435\u043d\u044b', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Homework', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('token', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), |
||||
('description', redactor.fields.RedactorField(verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b')), |
||||
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u0414\u043e\u0431\u0430\u0448\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435', |
||||
'verbose_name_plural': '\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u044f', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Lesson', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('free', models.BooleanField(default=False, verbose_name='\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e')), |
||||
('token', models.CharField(blank=True, default=b'', editable=False, max_length=100, verbose_name='\u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430')), |
||||
('title', models.TextField(blank=True, verbose_name='\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a')), |
||||
('sort', models.IntegerField(default=1, verbose_name='\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430')), |
||||
('description', redactor.fields.RedactorField(blank=True, default=b'', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('video', models.TextField(default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e')), |
||||
('comments', models.ManyToManyField(blank=True, editable=False, to='management.Comment', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('materials', models.ManyToManyField(blank=True, to='storage.Storage', verbose_name='\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0443\u0440\u043e\u043a\u0430')), |
||||
('theme', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.CourseTheme', verbose_name='\u0422\u0435\u043c\u0430 \u043a\u0443\u0440\u0441\u0430')), |
||||
], |
||||
options={ |
||||
'ordering': ['sort'], |
||||
'verbose_name': '\u0423\u0440\u043e\u043a', |
||||
'verbose_name_plural': '\u0423\u0440\u043e\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='SkillJ', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('size', models.IntegerField(default=0, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440')), |
||||
('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a')), |
||||
], |
||||
options={ |
||||
'ordering': ['id'], |
||||
'verbose_name': '\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0432\u044b\u043a\u0430', |
||||
'verbose_name_plural': '\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043d\u0430\u0432\u044b\u043a\u043e\u0432', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Skills', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('title', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435')), |
||||
('color', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u041d\u0430\u0432\u044b\u043a', |
||||
'verbose_name_plural': '\u041d\u0430\u0432\u044b\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.AddField( |
||||
model_name='skillj', |
||||
name='skill', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Skills', verbose_name='\u041d\u0430\u0432\u044b\u043a'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursemap', |
||||
name='exam', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Exam', verbose_name='\u042d\u043a\u0437\u0430\u043c\u0435\u043d'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursemap', |
||||
name='homework', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Homework', verbose_name='\u0417\u0430\u0434\u0430\u043d\u0438\u0435'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursemap', |
||||
name='lesson', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Lesson', verbose_name='\u0423\u0440\u043e\u043a'), |
||||
), |
||||
] |
||||
|
||||
@ -1,29 +1,29 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-20 20:26 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0001_initial'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='AchievementsMap', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('after', models.BooleanField(default=True, verbose_name='\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f')), |
||||
('achiv', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Achievements', verbose_name='\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435')), |
||||
('point', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.CourseMap', verbose_name='\u041f\u043e\u0437\u0438\u0446\u0438\u044f')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u044f\u044f \u0430\u0447\u0438\u0432\u043a\u0430', |
||||
'verbose_name_plural': '\u0412\u043d\u0435\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0430\u0447\u0438\u0432\u043a\u0438', |
||||
}, |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-20 20:26 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0001_initial'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='AchievementsMap', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('after', models.BooleanField(default=True, verbose_name='\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f')), |
||||
('achiv', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Achievements', verbose_name='\u0414\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435')), |
||||
('point', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.CourseMap', verbose_name='\u041f\u043e\u0437\u0438\u0446\u0438\u044f')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u044f\u044f \u0430\u0447\u0438\u0432\u043a\u0430', |
||||
'verbose_name_plural': '\u0412\u043d\u0435\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0430\u0447\u0438\u0432\u043a\u0438', |
||||
}, |
||||
), |
||||
] |
||||
|
||||
@ -1,19 +1,19 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-22 18:52 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0002_achievementsmap'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterModelOptions( |
||||
name='coursemap', |
||||
options={'ordering': ['sort'], 'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', 'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432'}, |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-22 18:52 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0002_achievementsmap'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterModelOptions( |
||||
name='coursemap', |
||||
options={'ordering': ['sort'], 'verbose_name': '\u041a\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430', 'verbose_name_plural': '\u041a\u0430\u0440\u0442\u044b \u043a\u0443\u0440\u0441\u043e\u0432'}, |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-30 22:39 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0003_auto_20160322_1852'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='lesson', |
||||
name='video_id', |
||||
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u0412\u0438\u0434\u0435\u043e ID'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-30 22:39 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0003_auto_20160322_1852'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='lesson', |
||||
name='video_id', |
||||
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='\u0412\u0438\u0434\u0435\u043e ID'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-31 20:30 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0004_lesson_video_id'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='lesson', |
||||
name='video', |
||||
field=models.TextField(blank=True, default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-31 20:30 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0004_lesson_video_id'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='lesson', |
||||
name='video', |
||||
field=models.TextField(blank=True, default=b'', verbose_name='\u041a\u043e\u0434 \u0432\u0438\u0434\u0435\u043e'), |
||||
), |
||||
] |
||||
|
||||
@ -1,25 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-04-07 20:06 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0005_auto_20160331_2030'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='coursetheme', |
||||
name='empty', |
||||
field=models.BooleanField(default=False, help_text='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u0430. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0443\u0440\u0441 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e.', verbose_name='\u0422\u044b \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0448\u044c!'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursetheme', |
||||
name='empty_description', |
||||
field=models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-04-07 20:06 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0005_auto_20160331_2030'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='coursetheme', |
||||
name='empty', |
||||
field=models.BooleanField(default=False, help_text='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u0430. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0443\u0440\u0441 \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u043e\u0433\u043e.', verbose_name='\u0422\u044b \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0448\u044c!'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='coursetheme', |
||||
name='empty_description', |
||||
field=models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-13 15:39 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0006_auto_20160407_2006'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='lesson', |
||||
name='video_date', |
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u0435\u043e'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-13 15:39 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0006_auto_20160407_2006'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='lesson', |
||||
name='video_date', |
||||
field=models.DateTimeField(blank=True, null=True, verbose_name='\u0412\u0440\u0435\u043c\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0432\u0438\u0434\u0435\u043e'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-20 18:19 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0007_lesson_video_date'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='coursetheme', |
||||
name='block', |
||||
field=models.BooleanField(default=False, verbose_name='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-20 18:19 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0007_lesson_video_date'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='coursetheme', |
||||
name='block', |
||||
field=models.BooleanField(default=False, verbose_name='\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435'), |
||||
), |
||||
] |
||||
|
||||
@ -1,19 +1,19 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-20 18:21 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0008_coursetheme_block'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='coursetheme', |
||||
name='block', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-20 18:21 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0008_coursetheme_block'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='coursetheme', |
||||
name='block', |
||||
), |
||||
] |
||||
|
||||
@ -1,19 +1,19 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-20 19:09 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0009_remove_coursetheme_block'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='coursetheme', |
||||
name='empty_description', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-20 19:09 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0009_remove_coursetheme_block'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='coursetheme', |
||||
name='empty_description', |
||||
), |
||||
] |
||||
|
||||
@ -1,25 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 15:50 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0010_remove_coursetheme_empty_description'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 15:50 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0010_remove_coursetheme_empty_description'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 15:53 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0011_auto_20160425_1550'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 15:53 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0011_auto_20160425_1550'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
] |
||||
|
||||
@ -1,42 +1,42 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:20 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0012_course_diploma_key'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
), |
||||
migrations.AddField( |
||||
model_name='exam', |
||||
name='diploma_key', |
||||
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='exam', |
||||
name='in_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='exam', |
||||
name='out_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:20 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0012_course_diploma_key'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
), |
||||
migrations.AddField( |
||||
model_name='exam', |
||||
name='diploma_key', |
||||
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='exam', |
||||
name='in_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='exam', |
||||
name='out_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), |
||||
), |
||||
] |
||||
|
||||
@ -1,35 +1,35 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:37 |
||||
from __future__ import unicode_literals |
||||
|
||||
import datetime |
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('courses', '0013_auto_20160425_1720'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Diploma', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('key', models.CharField(max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('date', models.DateField(default=datetime.date.today, verbose_name='\u0414\u0430\u0442\u0430 \u0432\u044b\u0434\u0430\u0447\u0438')), |
||||
('out_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')), |
||||
('in_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')), |
||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u043a\u0443\u0440\u0441')), |
||||
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b', |
||||
'verbose_name_plural': '\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0430\u0447\u0438 \u042d\u043a\u0437\u0430\u043c\u0435\u043d\u043e\u0432', |
||||
}, |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:37 |
||||
from __future__ import unicode_literals |
||||
|
||||
import datetime |
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('courses', '0013_auto_20160425_1720'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Diploma', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('key', models.CharField(max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('date', models.DateField(default=datetime.date.today, verbose_name='\u0414\u0430\u0442\u0430 \u0432\u044b\u0434\u0430\u0447\u0438')), |
||||
('out_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')), |
||||
('in_image', models.ImageField(upload_to=b'', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e')), |
||||
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u043a\u0443\u0440\u0441')), |
||||
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b', |
||||
'verbose_name_plural': '\u041f\u043e\u043f\u044b\u0442\u043a\u0438 \u0441\u0434\u0430\u0447\u0438 \u042d\u043a\u0437\u0430\u043c\u0435\u043d\u043e\u0432', |
||||
}, |
||||
), |
||||
] |
||||
|
||||
@ -1,45 +1,45 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:50 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0014_diploma'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterModelOptions( |
||||
name='diploma', |
||||
options={'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c', 'verbose_name_plural': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b'}, |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='diploma_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='in_diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='out_diploma', |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='in_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='out_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:50 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0014_diploma'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterModelOptions( |
||||
name='diploma', |
||||
options={'verbose_name': '\u0414\u0438\u043f\u043b\u043e\u043c', 'verbose_name_plural': '\u0414\u0438\u043f\u043b\u043e\u043c\u044b'}, |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='diploma_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='in_diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='out_diploma', |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='in_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='out_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'), |
||||
), |
||||
] |
||||
|
||||
@ -1,30 +1,30 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:52 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0015_auto_20160425_1750'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-25 17:52 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0015_auto_20160425_1750'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
field=models.IntegerField(default=0, help_text='\u0422\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440\u044b, \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432', verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
field=models.ImageField(null=True, upload_to=b'diploma', verbose_name='\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u0438\u043f\u043b\u043e\u043c\u0430 c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e'), |
||||
), |
||||
] |
||||
|
||||
@ -1,39 +1,39 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:40 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0016_auto_20160425_1752'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='diploma', |
||||
name='date', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='diploma', |
||||
name='student', |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='icon', |
||||
field=models.ImageField(null=True, upload_to=b'diploms', verbose_name='\u041c\u0438\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='course', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key', |
||||
field=models.CharField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:40 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0016_auto_20160425_1752'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='diploma', |
||||
name='date', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='diploma', |
||||
name='student', |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='icon', |
||||
field=models.ImageField(null=True, upload_to=b'diploms', verbose_name='\u041c\u0438\u043d\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='course', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key', |
||||
field=models.CharField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
] |
||||
|
||||
@ -1,19 +1,19 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:41 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0017_auto_20160426_1240'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='icon', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:41 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0017_auto_20160426_1240'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='icon', |
||||
), |
||||
] |
||||
|
||||
@ -1,19 +1,19 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:42 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0018_remove_exam_icon'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='title', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:42 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0018_remove_exam_icon'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='exam', |
||||
name='title', |
||||
), |
||||
] |
||||
|
||||
@ -1,27 +1,27 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:43 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0019_remove_exam_title'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 12:43 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0019_remove_exam_title'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='diploma_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='in_diploma', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='course', |
||||
name='out_diploma', |
||||
), |
||||
] |
||||
|
||||
@ -1,75 +1,75 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 14:47 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0020_auto_20160426_1243'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_place', |
||||
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_place', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_place', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 14:47 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0020_auto_20160426_1243'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_place', |
||||
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='date_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_place', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='key_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_place', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='diploma', |
||||
name='name_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
] |
||||
|
||||
@ -1,60 +1,60 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 15:26 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0021_auto_20160426_1447'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='in_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key', |
||||
field=models.IntegerField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='out_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 15:26 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0021_auto_20160426_1447'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='in_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c c \u043f\u0435\u0447\u0430\u0442\u044c\u044e'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key', |
||||
field=models.IntegerField(max_length=255, verbose_name='\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u044e\u0447'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_font', |
||||
field=models.FileField(null=True, upload_to=b'diploms', verbose_name='\u0428\u0440\u0438\u0444\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_size', |
||||
field=models.CharField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='out_image', |
||||
field=models.ImageField(upload_to=b'diploms', verbose_name='\u0414\u0438\u043f\u043b\u043e\u043c \u0431\u0435\u0437 \u043f\u0435\u0447\u0430\u0442\u0438'), |
||||
), |
||||
] |
||||
|
||||
@ -1,55 +1,55 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 17:29 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0022_auto_20160426_1526'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='date_color', |
||||
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='date_size', |
||||
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_place', |
||||
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_size', |
||||
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_place', |
||||
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_size', |
||||
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-26 17:29 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0022_auto_20160426_1526'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='date_color', |
||||
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='date_size', |
||||
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_place', |
||||
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_size', |
||||
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(help_text='RGBA. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0,1', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_place', |
||||
field=models.CharField(help_text='\u041f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443:\u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0441\u043b\u0435\u0432\u0430 - 256:256', max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_size', |
||||
field=models.IntegerField(max_length=255, null=True, verbose_name='\u0420\u0430\u0437\u043c\u0435\u0440 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
] |
||||
|
||||
@ -1,30 +1,30 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 17:48 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0023_auto_20160426_1729'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='date_color', |
||||
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 17:48 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0023_auto_20160426_1729'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='date_color', |
||||
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0434\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='key_color', |
||||
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u043a\u043b\u044e\u0447\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='diploma', |
||||
name='name_color', |
||||
field=models.CharField(help_text='RGB. \u041f\u0440\u0438\u043c\u0435\u0440: 0,0,0', max_length=255, null=True, verbose_name='\u0426\u0432\u0435\u0442 \u0438\u043c\u0435\u043d\u0438'), |
||||
), |
||||
] |
||||
|
||||
@ -1,31 +1,31 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-06 13:03 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import redactor.fields |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0024_auto_20160505_1748'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='skills', |
||||
name='big_icon', |
||||
field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='skills', |
||||
name='description', |
||||
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='skills', |
||||
name='mini_icon', |
||||
field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-06 13:03 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import redactor.fields |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0024_auto_20160505_1748'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='skills', |
||||
name='big_icon', |
||||
field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='skills', |
||||
name='description', |
||||
field=redactor.fields.RedactorField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='skills', |
||||
name='mini_icon', |
||||
field=models.ImageField(null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,30 +1,30 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-06 18:38 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0025_auto_20160506_1303'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='skills', |
||||
name='big_icon', |
||||
field=models.ImageField(help_text=b'65x65', null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='skills', |
||||
name='description', |
||||
field=models.TextField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='skills', |
||||
name='mini_icon', |
||||
field=models.ImageField(help_text=b'15x15', null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-06 18:38 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0025_auto_20160506_1303'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='skills', |
||||
name='big_icon', |
||||
field=models.ImageField(help_text=b'65x65', null=True, upload_to=b'skills', verbose_name='\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='skills', |
||||
name='description', |
||||
field=models.TextField(blank=True, verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='skills', |
||||
name='mini_icon', |
||||
field=models.ImageField(help_text=b'15x15', null=True, upload_to=b'skills', verbose_name='\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,303 +1,303 @@ |
||||
# coding=utf-8 |
||||
import copy |
||||
|
||||
from lms.tools import out_date_format |
||||
|
||||
STATUS_LABEL_CLASS = 'btn btn-{0} pull-right btn-lg m-b-xs m-r-xs m-t-lg' |
||||
|
||||
# Ключи материалов |
||||
# L - Урок |
||||
# H - ДЗ |
||||
# E - Экзамен |
||||
|
||||
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! |
||||
STATUS_COLLECTION = ({ |
||||
'title': {'default': u'Доступно для выполнения', 'L': u'Доступно'}, |
||||
'flag': 'A', |
||||
'color': 'info', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-time' |
||||
}, { |
||||
'title': {'default': u'Проверяется преподавателем'}, |
||||
'flag': 'T', |
||||
'color': 'info', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-time' |
||||
}, { |
||||
'title': {'default': u'Требуется доработка'}, |
||||
'flag': 'E', |
||||
'color': 'danger', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-time' |
||||
}, { |
||||
'title': {'default': u'Сдано', 'L': u'Пройдено'}, |
||||
'flag': 'F', |
||||
'color': 'success', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-ok' |
||||
}, { |
||||
'title': {'default': u'Не доступно'}, |
||||
'flag': 'N', |
||||
'color': 'default', |
||||
'styles': 'color: #ccc;text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-remove' |
||||
}) |
||||
|
||||
|
||||
COMMENTS_STATUS_COLLECTION = ({ |
||||
'title': 'Одобрено', |
||||
'flag': 'G', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': 'Отклонено', |
||||
'flag': 'F', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': 'Сообщение от администрации', |
||||
'flag': 'A', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': 'Технический вопрос', |
||||
'flag': 'T', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': '', |
||||
'flag': 'S', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}) |
||||
|
||||
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! |
||||
LEVELS_COLLECTION = ({ |
||||
'title': u'Базовый', |
||||
'flag': 'B', |
||||
'color': '#fff', |
||||
'background': '#5cb85c', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}, { |
||||
'title': u'Продвинутый', |
||||
'flag': 'A', |
||||
'color': '#fff', |
||||
'background': '#5bc0de', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}, { |
||||
'title': u'Экспертный', |
||||
'flag': 'E', |
||||
'color': '#fff', |
||||
'background': '#d9534f', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}, { |
||||
'title': u'Базовый + Продвинутый', |
||||
'flag': 'B+A', |
||||
'color': '#fff', |
||||
'background': '#e68917', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}) |
||||
|
||||
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! |
||||
MATERIAL_TYPE_COLLECTION = ({ |
||||
'title': u'Базовый материал', # Выводимое имя типа |
||||
'flag': 'B', # Флаг, по которому идет поиск |
||||
'color': '#dee5e7', # Стандартный цвет отображения типа материала |
||||
'icon': '/static/img/1441672724_new_seo-37.png' # Стандартная иконка темы |
||||
}, { |
||||
'title': u'Расширеный материал', |
||||
'flag': 'E', |
||||
'color': '#66cc99', |
||||
'icon': '/static/img/1441673370_8.png' |
||||
}, { |
||||
'title': u'Премиум материал', |
||||
'flag': 'P', |
||||
'color': '#ffffcc', |
||||
'icon': '/static/img/1441671767_new_seo-36.png' |
||||
}, { |
||||
'title': u'Предэкзаменационные материалы', |
||||
'flag': 'M', |
||||
'color': '#dee5e7', |
||||
'icon': '/static/img/1447237167_BeOS_app_serv.png' |
||||
}, { |
||||
'title': u'Экзаменационная тема', |
||||
'flag': 'Ex', |
||||
'color': '#ff1', |
||||
'icon': '/static/img/1441672223_new_seo2-17.png' |
||||
}) |
||||
|
||||
USER_TYPES = ({ |
||||
'flag': 'U', |
||||
'title': u'Студент', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'T', |
||||
'title': u'Преподаватель', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'M', |
||||
'title': u'Менеджер', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'S', |
||||
'title': 'Руководитель', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'A', |
||||
'title': u'Команда «SkillBox»', |
||||
'background': 'bg-warning', |
||||
'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'S2', |
||||
'title': u'Куратор', |
||||
'background': 'bg-warning', |
||||
'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;', |
||||
'label': '' |
||||
}) |
||||
|
||||
BUTTON_TYPES = { |
||||
'N': '', |
||||
'B': u'Получить полный доступ к курсу', |
||||
'H': u'Перейти к заданию', |
||||
'L': u'Перейти к изучению', |
||||
'O': u'Открыть лекцию', |
||||
'E': u'Страница экзамена', |
||||
'T': u'Не доступно по подписке', |
||||
'F': u'Перейти к экзамену' |
||||
} |
||||
|
||||
BUTTON_TYPE = ({ |
||||
'flag': 'A', |
||||
'title': {'default': u'Открыть материал', |
||||
'L': u'Перейти к уроку', |
||||
'H': u'Перейти к заданию', |
||||
'E': u'Перейти к экзамену'}, |
||||
'color': {'default': '#fff'}, |
||||
'background': { |
||||
'default': '#23ad44', |
||||
'H': '#23b7e5' |
||||
}, |
||||
'link': {'L': '/courses/lesson/', |
||||
'H': '/courses/homework/', |
||||
'E': '/courses/exam/'}, |
||||
'by_type': { |
||||
'L': 'lesson', |
||||
'H': 'homework', |
||||
'E': 'exam' |
||||
} |
||||
}, { |
||||
'flag': 'F', |
||||
'title': {'default': u'Открыть материал', |
||||
'L': u'Открыть лекцию', |
||||
'H': u'Открыть задание', |
||||
'E': u'Открыть экзамен'}, |
||||
'color': {'default': '#fff'}, |
||||
'background': { |
||||
'default': '#23ad44', |
||||
'H': '#23b7e5' |
||||
}, |
||||
'link': {'L': '/courses/lesson/', # ID урока |
||||
'H': '/courses/homework/', # ID ДЗ |
||||
'E': '/courses/exam/'}, # ID экзамена |
||||
'by_type': { |
||||
'L': 'lesson', |
||||
'H': 'homework', |
||||
'E': 'exam' |
||||
} |
||||
}) |
||||
|
||||
|
||||
def comment_fabric(_comment, __type=None, __user=None): |
||||
result = { |
||||
'id': _comment.id, |
||||
'status': search_in_collection(COMMENTS_STATUS_COLLECTION, 'flag', _comment.status), |
||||
'closed': _comment.closed, |
||||
'owner': _comment.owner.name if _comment.owner.name else _comment.owner.get_short_name(), |
||||
'owner_name': _comment.owner.get_full_name(), |
||||
'owner_id': _comment.owner.id, |
||||
'owner_email': _comment.owner.email, |
||||
'owner_type': search_in_collection(USER_TYPES, 'flag', _comment.owner.in_role), |
||||
'owner_avatar': _comment.owner.get_image_url(type_in='small'), |
||||
'owner_status': _comment.owner.get_status_display(), |
||||
'owner_interactive_key': _comment.owner.interactive_key, |
||||
'owner_model': '', |
||||
'text': _comment.get_text(), |
||||
'date': out_date_format(_comment.date, no_time=False), |
||||
'replies': _comment.get_replies(__type, __user), |
||||
'files': material_fabric(_comment.files.all()), |
||||
'response': _comment.response, |
||||
'response_comment': _comment.response_comment.get_face(_type=__type, _user=__user) if _comment.response else None |
||||
} |
||||
if __user: |
||||
result['saw'] = _comment.saw.filter(id=__user.id).exists() |
||||
#comment.set_saw(__user) |
||||
|
||||
return result |
||||
|
||||
|
||||
def material_fabric(stores): |
||||
result = [] |
||||
for store in stores: |
||||
result.append({ |
||||
'id': store.id, |
||||
'format': store.f_format.f_type, |
||||
'icon_type': 'class' if store.f_format.icon_class else 'icon', |
||||
'icon': store.f_format.icon.url if store.f_format.icon else store.f_format.icon_class, |
||||
'url': store.original.url, |
||||
'title': store.get_name_for_user(), |
||||
'name': store.get_file_name() |
||||
}) |
||||
return result |
||||
|
||||
|
||||
def search_in_collection(collection, field, word, artifact=None, in_type='default'): |
||||
# Поиск по полю в коллекции словарей |
||||
# == Коллекции статичны. Найдя словарь отображения по флагу к примеру, можно просто вывести результат в веб |
||||
# == artifact - получить значение конкретно поля из словаря |
||||
# Получает кортеж, берет словари по очереди и сравнивает в них поле field |
||||
# Если значение в поле template[field] == work - возвращает полную копию словаря или возвращает пустое значение |
||||
render = '' |
||||
for template in collection: |
||||
if template[field] == word: |
||||
if artifact: |
||||
render = copy.deepcopy(template[artifact]) |
||||
else: |
||||
render = copy.deepcopy(template) |
||||
break |
||||
if render: |
||||
# Получить шаблон специально для запрашиваемого объекта по ключу объекта |
||||
# У урока к примеру сейчас это 'L' |
||||
try: |
||||
for key, value in render.items(): |
||||
if type(value) == dict: |
||||
if in_type in value: |
||||
render[key] = value[in_type] |
||||
else: |
||||
render[key] = value['default'] |
||||
except AttributeError: |
||||
return render |
||||
return render |
||||
# coding=utf-8 |
||||
import copy |
||||
|
||||
from lms.tools import out_date_format |
||||
|
||||
STATUS_LABEL_CLASS = 'btn btn-{0} pull-right btn-lg m-b-xs m-r-xs m-t-lg' |
||||
|
||||
# Ключи материалов |
||||
# L - Урок |
||||
# H - ДЗ |
||||
# E - Экзамен |
||||
|
||||
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! |
||||
STATUS_COLLECTION = ({ |
||||
'title': {'default': u'Доступно для выполнения', 'L': u'Доступно'}, |
||||
'flag': 'A', |
||||
'color': 'info', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-time' |
||||
}, { |
||||
'title': {'default': u'Проверяется преподавателем'}, |
||||
'flag': 'T', |
||||
'color': 'info', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-time' |
||||
}, { |
||||
'title': {'default': u'Требуется доработка'}, |
||||
'flag': 'E', |
||||
'color': 'danger', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-time' |
||||
}, { |
||||
'title': {'default': u'Сдано', 'L': u'Пройдено'}, |
||||
'flag': 'F', |
||||
'color': 'success', |
||||
'styles': 'text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-ok' |
||||
}, { |
||||
'title': {'default': u'Не доступно'}, |
||||
'flag': 'N', |
||||
'color': 'default', |
||||
'styles': 'color: #ccc;text-shadow: 0 0 0;', |
||||
'icon': 'glyphicon glyphicon-remove' |
||||
}) |
||||
|
||||
|
||||
COMMENTS_STATUS_COLLECTION = ({ |
||||
'title': 'Одобрено', |
||||
'flag': 'G', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': 'Отклонено', |
||||
'flag': 'F', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': 'Сообщение от администрации', |
||||
'flag': 'A', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': 'Технический вопрос', |
||||
'flag': 'T', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}, { |
||||
'title': '', |
||||
'flag': 'S', |
||||
'label': '', |
||||
'background': '', |
||||
'color': '', |
||||
'style': '', |
||||
'icon': '' |
||||
}) |
||||
|
||||
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! |
||||
LEVELS_COLLECTION = ({ |
||||
'title': u'Базовый', |
||||
'flag': 'B', |
||||
'color': '#fff', |
||||
'background': '#5cb85c', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}, { |
||||
'title': u'Продвинутый', |
||||
'flag': 'A', |
||||
'color': '#fff', |
||||
'background': '#5bc0de', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}, { |
||||
'title': u'Экспертный', |
||||
'flag': 'E', |
||||
'color': '#fff', |
||||
'background': '#d9534f', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}, { |
||||
'title': u'Базовый + Продвинутый', |
||||
'flag': 'B+A', |
||||
'color': '#fff', |
||||
'background': '#e68917', |
||||
'icon': 'glyphicon glyphicon-signal' |
||||
}) |
||||
|
||||
# ! Если мы ставим словарь в значение, обязательно должен быть ключь 'default' ! |
||||
MATERIAL_TYPE_COLLECTION = ({ |
||||
'title': u'Базовый материал', # Выводимое имя типа |
||||
'flag': 'B', # Флаг, по которому идет поиск |
||||
'color': '#dee5e7', # Стандартный цвет отображения типа материала |
||||
'icon': '/static/img/1441672724_new_seo-37.png' # Стандартная иконка темы |
||||
}, { |
||||
'title': u'Расширеный материал', |
||||
'flag': 'E', |
||||
'color': '#66cc99', |
||||
'icon': '/static/img/1441673370_8.png' |
||||
}, { |
||||
'title': u'Премиум материал', |
||||
'flag': 'P', |
||||
'color': '#ffffcc', |
||||
'icon': '/static/img/1441671767_new_seo-36.png' |
||||
}, { |
||||
'title': u'Предэкзаменационные материалы', |
||||
'flag': 'M', |
||||
'color': '#dee5e7', |
||||
'icon': '/static/img/1447237167_BeOS_app_serv.png' |
||||
}, { |
||||
'title': u'Экзаменационная тема', |
||||
'flag': 'Ex', |
||||
'color': '#ff1', |
||||
'icon': '/static/img/1441672223_new_seo2-17.png' |
||||
}) |
||||
|
||||
USER_TYPES = ({ |
||||
'flag': 'U', |
||||
'title': u'Студент', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'T', |
||||
'title': u'Преподаватель', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'M', |
||||
'title': u'Менеджер', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'S', |
||||
'title': 'Руководитель', |
||||
'background': 'bg-primary', |
||||
'style': '', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'A', |
||||
'title': u'Команда «SkillBox»', |
||||
'background': 'bg-warning', |
||||
'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;', |
||||
'label': '' |
||||
}, { |
||||
'flag': 'S2', |
||||
'title': u'Куратор', |
||||
'background': 'bg-warning', |
||||
'style': 'color: #666;font-weight: normal;text-shadow: 0 0 0;', |
||||
'label': '' |
||||
}) |
||||
|
||||
BUTTON_TYPES = { |
||||
'N': '', |
||||
'B': u'Получить полный доступ к курсу', |
||||
'H': u'Перейти к заданию', |
||||
'L': u'Перейти к изучению', |
||||
'O': u'Открыть лекцию', |
||||
'E': u'Страница экзамена', |
||||
'T': u'Не доступно по подписке', |
||||
'F': u'Перейти к экзамену' |
||||
} |
||||
|
||||
BUTTON_TYPE = ({ |
||||
'flag': 'A', |
||||
'title': {'default': u'Открыть материал', |
||||
'L': u'Перейти к уроку', |
||||
'H': u'Перейти к заданию', |
||||
'E': u'Перейти к экзамену'}, |
||||
'color': {'default': '#fff'}, |
||||
'background': { |
||||
'default': '#23ad44', |
||||
'H': '#23b7e5' |
||||
}, |
||||
'link': {'L': '/courses/lesson/', |
||||
'H': '/courses/homework/', |
||||
'E': '/courses/exam/'}, |
||||
'by_type': { |
||||
'L': 'lesson', |
||||
'H': 'homework', |
||||
'E': 'exam' |
||||
} |
||||
}, { |
||||
'flag': 'F', |
||||
'title': {'default': u'Открыть материал', |
||||
'L': u'Открыть лекцию', |
||||
'H': u'Открыть задание', |
||||
'E': u'Открыть экзамен'}, |
||||
'color': {'default': '#fff'}, |
||||
'background': { |
||||
'default': '#23ad44', |
||||
'H': '#23b7e5' |
||||
}, |
||||
'link': {'L': '/courses/lesson/', # ID урока |
||||
'H': '/courses/homework/', # ID ДЗ |
||||
'E': '/courses/exam/'}, # ID экзамена |
||||
'by_type': { |
||||
'L': 'lesson', |
||||
'H': 'homework', |
||||
'E': 'exam' |
||||
} |
||||
}) |
||||
|
||||
|
||||
def comment_fabric(_comment, __type=None, __user=None): |
||||
result = { |
||||
'id': _comment.id, |
||||
'status': search_in_collection(COMMENTS_STATUS_COLLECTION, 'flag', _comment.status), |
||||
'closed': _comment.closed, |
||||
'owner': _comment.owner.name if _comment.owner.name else _comment.owner.get_short_name(), |
||||
'owner_name': _comment.owner.get_full_name(), |
||||
'owner_id': _comment.owner.id, |
||||
'owner_email': _comment.owner.email, |
||||
'owner_type': search_in_collection(USER_TYPES, 'flag', _comment.owner.in_role), |
||||
'owner_avatar': _comment.owner.get_image_url(type_in='small'), |
||||
'owner_status': _comment.owner.get_status_display(), |
||||
'owner_interactive_key': _comment.owner.interactive_key, |
||||
'owner_model': '', |
||||
'text': _comment.get_text(), |
||||
'date': out_date_format(_comment.date, no_time=False), |
||||
'replies': _comment.get_replies(__type, __user), |
||||
'files': material_fabric(_comment.files.all()), |
||||
'response': _comment.response, |
||||
'response_comment': _comment.response_comment.get_face(_type=__type, _user=__user) if _comment.response else None |
||||
} |
||||
if __user: |
||||
result['saw'] = _comment.saw.filter(id=__user.id).exists() |
||||
#comment.set_saw(__user) |
||||
|
||||
return result |
||||
|
||||
|
||||
def material_fabric(stores): |
||||
result = [] |
||||
for store in stores: |
||||
result.append({ |
||||
'id': store.id, |
||||
'format': store.f_format.f_type, |
||||
'icon_type': 'class' if store.f_format.icon_class else 'icon', |
||||
'icon': store.f_format.icon.url if store.f_format.icon else store.f_format.icon_class, |
||||
'url': store.original.url, |
||||
'title': store.get_name_for_user(), |
||||
'name': store.get_file_name() |
||||
}) |
||||
return result |
||||
|
||||
|
||||
def search_in_collection(collection, field, word, artifact=None, in_type='default'): |
||||
# Поиск по полю в коллекции словарей |
||||
# == Коллекции статичны. Найдя словарь отображения по флагу к примеру, можно просто вывести результат в веб |
||||
# == artifact - получить значение конкретно поля из словаря |
||||
# Получает кортеж, берет словари по очереди и сравнивает в них поле field |
||||
# Если значение в поле template[field] == work - возвращает полную копию словаря или возвращает пустое значение |
||||
render = '' |
||||
for template in collection: |
||||
if template[field] == word: |
||||
if artifact: |
||||
render = copy.deepcopy(template[artifact]) |
||||
else: |
||||
render = copy.deepcopy(template) |
||||
break |
||||
if render: |
||||
# Получить шаблон специально для запрашиваемого объекта по ключу объекта |
||||
# У урока к примеру сейчас это 'L' |
||||
try: |
||||
for key, value in render.items(): |
||||
if type(value) == dict: |
||||
if in_type in value: |
||||
render[key] = value[in_type] |
||||
else: |
||||
render[key] = value['default'] |
||||
except AttributeError: |
||||
return render |
||||
return render |
||||
|
||||
@ -1,443 +1,443 @@ |
||||
# coding=utf-8 |
||||
from django.db.models import Q |
||||
from courses.models import CourseTheme, Exam, Achievements, Lesson, Homework, SkillJ |
||||
from journals.models import LessonJ, HomeworkJ, ExamJ, AchievementJ, TeacherJ, DiplomaJ |
||||
|
||||
|
||||
def get_empty_face(course): |
||||
return TeacherJ.objects.filter(course__id=course).first().get_empty_face() |
||||
|
||||
|
||||
def set_read_flag(student, course): |
||||
pass |
||||
|
||||
|
||||
def get_next_button(student, start_place_type, start_place_id): |
||||
pass |
||||
|
||||
|
||||
def get_read_flag(student, course): |
||||
pass |
||||
|
||||
|
||||
def check_read_flag(student, course): |
||||
pass |
||||
|
||||
|
||||
def check_bought(token, user): |
||||
# Проверка доступа материала по подписке |
||||
pass |
||||
|
||||
|
||||
def make_journal(journal): |
||||
course = journal.course |
||||
student = journal.student |
||||
|
||||
|
||||
def get_user_courses(user): |
||||
# Получить рабочие курсы студента |
||||
return TeacherJ.objects.filter(student=user) |
||||
|
||||
|
||||
def get_user_diploms(user): |
||||
# Получить дипломы пользователя |
||||
return DiplomaJ.objects.filter(student=user).exclude(Q(in_image=None)|Q(key=None)).only('material', 'date') |
||||
|
||||
|
||||
def get_user_achievements(user): |
||||
# Получить все ачивки пользователя |
||||
themes = {} |
||||
for i in AchievementJ.objects.filter(student=user): |
||||
themes[i.group] = [] |
||||
|
||||
for i in AchievementJ.objects.filter(student=user): |
||||
themes[i.group].append(i) |
||||
|
||||
return themes |
||||
|
||||
|
||||
def get_user_achievements_count(user): |
||||
# Получение количества ачивок пользователя |
||||
return AchievementJ.objects.filter(student=user).count() |
||||
|
||||
|
||||
def get_user_skills(user): |
||||
# Получить скилы пользователя |
||||
lessons = [i.material for i in LessonJ.objects.filter(student=user, success=True)] |
||||
skills = SkillJ.objects.filter(lesson__in=lessons).only('size', 'skill') |
||||
result = {} |
||||
for i in skills: |
||||
if i.skill.title in result: |
||||
result[i.skill.title]['size'] += i.size |
||||
else: |
||||
result[i.skill.title] = { |
||||
'color': i.skill.color, |
||||
'size': i.size, |
||||
'icon': i.skill.mini_icon |
||||
} |
||||
return result |
||||
|
||||
|
||||
def get_user_completed_courses_count(user): |
||||
return ExamJ.objects.filter(student=user, success=True).count() |
||||
|
||||
|
||||
def get_user_skills_size_count(user): |
||||
# Посчитать размер навыка |
||||
result = 0 |
||||
for key, value in get_user_skills(user).items(): |
||||
result += value['size'] |
||||
return result |
||||
|
||||
|
||||
def set_achievement(user, title, text, group, achievement_name): |
||||
# Просвоить ачивку |
||||
achievement = Achievements.objects.get(tech_name=achievement_name) |
||||
AchievementJ.objects.create(student=user, title=title, text=text, group=group, achievement=achievement) |
||||
|
||||
### Методы над курсом |
||||
def get_students_on_homework_length(course): |
||||
l = 0 |
||||
for i in CourseTheme.objects.filter(course=course): |
||||
l += i.get_active_homework_students_length() |
||||
return l |
||||
|
||||
|
||||
def get_active_exam_students(course): |
||||
result = [i.student for i in ExamJ.objects.filter(exam__course=course, status='T').exclude(success=True)] |
||||
return result |
||||
|
||||
|
||||
def get_active_exam_students_length(course): |
||||
result = ExamJ.objects.filter(exam__course=course, status='T').count() |
||||
return result |
||||
|
||||
|
||||
def exam_status_html(course, student): |
||||
status = course.get_exam_status(student) |
||||
data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>' |
||||
if status == 'B': |
||||
return data.format(u'primary', u'Пока недоступно') |
||||
elif status == 'P': |
||||
return data.format(u'warning', u'Достуно для выполнения') |
||||
elif status == 'T': |
||||
return data.format(u'info', u'Проверяется преподавателем') |
||||
elif status == 'E': |
||||
return data.format(u'danger', u'Требуется доработка') |
||||
elif status == 'F': |
||||
return data.format(u'success', u'Сдано') |
||||
|
||||
|
||||
def get_exam_status(course, student): |
||||
try: |
||||
exam = Exam.objects.get(course=course) |
||||
except Exam.DoesNotExist: |
||||
return 'B' |
||||
else: |
||||
return exam.get_status(student) |
||||
|
||||
|
||||
def check_course_finish(course, student): |
||||
if LessonJ.objects.filter(lesson__course=course, student=student, status='F').count() == Lesson.objects.filter( |
||||
course=course).count() \ |
||||
and HomeworkJ.objects.filter(homework__course=course, student=student, |
||||
status='F').count() == Homework.objects.filter(course=course).count() \ |
||||
and ExamJ.objects.filter(exam__course=course, student=student, status='F').count() == Exam.objects.filter( |
||||
course=course).count(): |
||||
return True |
||||
else: |
||||
return False |
||||
|
||||
|
||||
### Методы над темой |
||||
def get_theme_no_saw_lessons_length(__theme): |
||||
result = 0 |
||||
for n in __theme.get_lessons(): |
||||
result += n.get_no_saw_lessons_length() |
||||
|
||||
return result |
||||
|
||||
|
||||
def get_theme_description(theme, student): |
||||
result = '' |
||||
if theme.description: |
||||
result += '<p style="padding:10px;">%s</p>' % theme.description |
||||
|
||||
if theme.lessons_length() > 1: |
||||
result += u'<ul style="padding: 0 0 0 15px;">' |
||||
for i in Lesson.objects.filter(course=theme.course, theme=theme).order_by('sort'): |
||||
result += i.get_description(student) |
||||
result += u'</ul>' |
||||
return result |
||||
|
||||
if not theme.description and theme.lessons_length() == 1: |
||||
return Lesson.objects.get(theme=theme).description |
||||
|
||||
|
||||
def get_active_homework_students(theme): |
||||
result = [] |
||||
if theme.homework_exist(): |
||||
for i in HomeworkJ.objects.filter(homework=theme.get_homework(), status='T'): |
||||
result.append(i.student) |
||||
return result |
||||
|
||||
|
||||
def get_active_homework_students_length(theme): |
||||
if theme.homework_exist(): |
||||
return HomeworkJ.objects.filter(homework=self.get_homework(), status='T').count() |
||||
else: |
||||
return 0 |
||||
|
||||
|
||||
def get_actual_theme_lesson_id(theme, student): |
||||
# Получение читаемого урока |
||||
if student: |
||||
try: |
||||
if student.is_authenticated() and student.is_admin: |
||||
return Lesson.objects.get(theme=theme, sort='1').id |
||||
except: |
||||
pass |
||||
|
||||
status = theme.get_status(student) |
||||
if status == 'R': |
||||
if LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).exists(): |
||||
return LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).first().lesson.id |
||||
else: |
||||
if theme.homework_status(student) in ['R', 'E', 'T', 'A']: |
||||
return Lesson.objects.filter(theme=theme).order_by('sort').last().id |
||||
else: |
||||
return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id |
||||
|
||||
elif status == 'F': |
||||
return Lesson.objects.filter(theme=theme).order_by('sort').first().id |
||||
|
||||
else: |
||||
if Lesson.objects.filter(theme=theme, free=True).exists(): |
||||
return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id |
||||
else: |
||||
return False |
||||
|
||||
|
||||
def get_one_lesson_id(theme): |
||||
if theme.lessons_length() == 1: |
||||
return Lesson.objects.filter(course=theme.course, theme=theme).first().id |
||||
else: |
||||
return '0' |
||||
|
||||
|
||||
def homework_status_html(theme, student): |
||||
status = theme.homework_status(student) |
||||
data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>' |
||||
if status == 'B': |
||||
return data.format(u'primary', u'Пока недоступно') |
||||
elif status == 'A': |
||||
return data.format(u'warning', u'Достуно для выполнения') |
||||
elif status == 'T': |
||||
return data.format(u'info', u'Проверяется преподавателем') |
||||
elif status == 'E': |
||||
return data.format(u'danger', u'Требуется доработка') |
||||
elif status == 'F': |
||||
return data.format(u'success', u'Сдано') |
||||
|
||||
|
||||
def homework_status(theme, student): |
||||
if Homework.objects.filter(theme=theme).exists(): |
||||
try: |
||||
homework = HomeworkJ.objects.get(student=student, homework=Homework.objects.get(theme=theme)) |
||||
except HomeworkJ.DoesNotExist: |
||||
return 'B' |
||||
else: |
||||
return homework.status |
||||
else: |
||||
return 'B' |
||||
|
||||
|
||||
def check_theme_finish(theme, student): |
||||
# Проверка, прошел ли пользователь тему по урокам |
||||
if LessonJ.objects.filter(student=student, status='F', lesson__theme=theme).count() == theme.lessons_length(): |
||||
return True |
||||
else: |
||||
return False |
||||
|
||||
|
||||
def check_study_access(theme, student): |
||||
if LessonJ.objects.filter(Q(student=student, status='R', lesson__theme=theme) | Q(student=student, status='F', |
||||
lesson__theme=theme)).exists(): |
||||
return True |
||||
else: |
||||
return False |
||||
|
||||
|
||||
def get_status(theme, student): |
||||
# 1) Читаемая тема |
||||
# 2) ДЗ на прохождении |
||||
# 3) Укомплектовано |
||||
if student: |
||||
if LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme), |
||||
status='R').exists(): |
||||
return 'R' |
||||
|
||||
elif Lesson.objects.filter(free=True, theme=theme).exists() \ |
||||
and not LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme, |
||||
free=True)): |
||||
return 'R' |
||||
|
||||
elif theme.homework_status(student) != 'B': |
||||
h_status = theme.homework_status(student) |
||||
if h_status == 'F': |
||||
return 'F' |
||||
|
||||
else: |
||||
return 'R' |
||||
|
||||
elif LessonJ.objects.filter(student=student, lesson__theme=theme, |
||||
status='F').count() == Lesson.objects.filter(theme=theme).count(): |
||||
return 'F' |
||||
|
||||
else: |
||||
return 'N' |
||||
else: |
||||
if theme.sort == 1 and Lesson.objects.filter(free=True, theme=theme).exists(): |
||||
return 'R' |
||||
else: |
||||
return 'N' |
||||
|
||||
|
||||
def get_theme_color(theme, student): |
||||
# Получить тип |
||||
# Если тип премиум или пополнение |
||||
status = theme.get_status(student) |
||||
if status == 'F': |
||||
return 'b-success' |
||||
elif status == 'N': |
||||
return 'b-default' |
||||
else: |
||||
return 'b-info' |
||||
|
||||
|
||||
def get_theme_skills(__theme): |
||||
result = [] |
||||
for i in SkillJ.objects.filter(lesson__in=__theme.get_lessons()): |
||||
if i.skill not in result: |
||||
result.append(i.skill) |
||||
return result |
||||
|
||||
|
||||
def have_skills(self): |
||||
return SkillJ.objects.filter(lesson__in=self.get_lessons()).exists() |
||||
|
||||
|
||||
### Методы над уроком |
||||
def get_lesson_description(lesson, student): |
||||
# 1 - id |
||||
# 2 - course_id |
||||
# 3 - title |
||||
# 4 - status |
||||
# 5 - free |
||||
button = u'<li style="margin-bottom:5px;">' \ |
||||
u'<a href="/courses/lesson/{0}" by_type="lesson" self_id="{0}" course_id="{1}" ' \ |
||||
u'style="color:#333; border-bottom:1px dotted #333; color: #333;">{2}</a> ' \ |
||||
u'{3} ' \ |
||||
u'<span class="label label-success" style="margin-left: 10px;">{4}</span>' \ |
||||
u'</li>' |
||||
# 0 - title |
||||
# 1 - status |
||||
# 2 - free |
||||
button2 = u'<li style="margin-bottom:5px;">' \ |
||||
u'{0} ' \ |
||||
u'{1} ' \ |
||||
u'<span class="label label-success" style="margin-left: 10px;">{2}</span>' \ |
||||
u'</li>' |
||||
|
||||
if student and student.is_authenticated() and student.is_admin: |
||||
return button.format(lesson.id, lesson.course.id, |
||||
u'<b>ID: %s</b> %s' % (lesson.id, lesson.title) if student.is_admin else lesson.title, |
||||
'<i class="glyphicon glyphicon-time"></i>', '') |
||||
|
||||
elif lesson.get_status(student) != 'N': |
||||
return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), '') |
||||
|
||||
else: |
||||
if lesson.sort == 1 and lesson.free: |
||||
return button.format(lesson.id, lesson.course.id, lesson.title, '<i class="glyphicon glyphicon-time"></i>', |
||||
'') |
||||
else: |
||||
return button2.format(lesson.title, lesson.get_status_html(student), '') |
||||
|
||||
# if lesson.get_status(student) != 'N': |
||||
# return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), |
||||
# u'Бесплатный урок' if lesson.free else '') |
||||
|
||||
# else: |
||||
# if lesson.sort == 1 and lesson.free: |
||||
# return button.format(lesson.id, lesson.course.id, lesson.title, |
||||
# '<i class="glyphicon glyphicon-time"></i>', |
||||
# u'Бесплатный урок' if lesson.free else '') |
||||
# else: |
||||
# return button2.format(lesson.title, lesson.get_status_html(student), |
||||
# u'Бесплатный урок' if lesson.free else '') |
||||
|
||||
|
||||
def get_no_saw_lessons_length(lesson): |
||||
return lesson.comments.filter(saw=False).count() |
||||
|
||||
|
||||
def get_status_html(lesson, student): |
||||
status = lesson.get_status(student) |
||||
if status == 'N': |
||||
return u'<i class="glyphicon glyphicon-remove"></i>' |
||||
elif status == 'F': |
||||
return u'<i class="glyphicon glyphicon-ok"></i>' |
||||
elif status == 'R': |
||||
return u'<i class="glyphicon glyphicon-time"></i>' |
||||
|
||||
|
||||
def get_lesson_skills(lesson): |
||||
return SkillJ.objects.filter(lesson=lesson) |
||||
|
||||
|
||||
def get_comments_length(lesson): |
||||
return lesson.comments.filter(public=True).count() |
||||
|
||||
|
||||
def get_lesson_status(lesson, student): |
||||
try: |
||||
return LessonJ.objects.get(student=student, lesson=lesson).status |
||||
except LessonJ.DoesNotExist: |
||||
return 'N' |
||||
|
||||
|
||||
def get_status_name(lesson, student): |
||||
try: |
||||
return LessonJ.objects.get(student=student, lesson=lesson).get_status_display() |
||||
except LessonJ.DoesNotExist: |
||||
return u'Не доступно' |
||||
|
||||
|
||||
### Методы над ДЗ |
||||
def get_homework_status(__homework, student): |
||||
try: |
||||
homework = HomeworkJ.objects.get(student=student, homework=__homework) |
||||
except HomeworkJ.DoesNotExist: |
||||
return 'B' |
||||
else: |
||||
return homework.status |
||||
|
||||
|
||||
### Методы экзамена |
||||
|
||||
def get_exam_color(exam, student): |
||||
# Получить тип |
||||
# Если тип премиум или пополнение |
||||
status = exam.get_status(student) |
||||
if status == 'P': |
||||
return 'b-info' |
||||
elif status == 'T': |
||||
return 'b-primary' |
||||
elif status == 'F': |
||||
return 'b-success' |
||||
elif status == 'E': |
||||
return 'b-danger' |
||||
else: |
||||
return 'b-default' |
||||
|
||||
# coding=utf-8 |
||||
from django.db.models import Q |
||||
from courses.models import CourseTheme, Exam, Achievements, Lesson, Homework, SkillJ |
||||
from journals.models import LessonJ, HomeworkJ, ExamJ, AchievementJ, TeacherJ, DiplomaJ |
||||
|
||||
|
||||
def get_empty_face(course): |
||||
return TeacherJ.objects.filter(course__id=course).first().get_empty_face() |
||||
|
||||
|
||||
def set_read_flag(student, course): |
||||
pass |
||||
|
||||
|
||||
def get_next_button(student, start_place_type, start_place_id): |
||||
pass |
||||
|
||||
|
||||
def get_read_flag(student, course): |
||||
pass |
||||
|
||||
|
||||
def check_read_flag(student, course): |
||||
pass |
||||
|
||||
|
||||
def check_bought(token, user): |
||||
# Проверка доступа материала по подписке |
||||
pass |
||||
|
||||
|
||||
def make_journal(journal): |
||||
course = journal.course |
||||
student = journal.student |
||||
|
||||
|
||||
def get_user_courses(user): |
||||
# Получить рабочие курсы студента |
||||
return TeacherJ.objects.filter(student=user) |
||||
|
||||
|
||||
def get_user_diploms(user): |
||||
# Получить дипломы пользователя |
||||
return DiplomaJ.objects.filter(student=user).exclude(Q(in_image=None)|Q(key=None)).only('material', 'date') |
||||
|
||||
|
||||
def get_user_achievements(user): |
||||
# Получить все ачивки пользователя |
||||
themes = {} |
||||
for i in AchievementJ.objects.filter(student=user): |
||||
themes[i.group] = [] |
||||
|
||||
for i in AchievementJ.objects.filter(student=user): |
||||
themes[i.group].append(i) |
||||
|
||||
return themes |
||||
|
||||
|
||||
def get_user_achievements_count(user): |
||||
# Получение количества ачивок пользователя |
||||
return AchievementJ.objects.filter(student=user).count() |
||||
|
||||
|
||||
def get_user_skills(user): |
||||
# Получить скилы пользователя |
||||
lessons = [i.material for i in LessonJ.objects.filter(student=user, success=True)] |
||||
skills = SkillJ.objects.filter(lesson__in=lessons).only('size', 'skill') |
||||
result = {} |
||||
for i in skills: |
||||
if i.skill.title in result: |
||||
result[i.skill.title]['size'] += i.size |
||||
else: |
||||
result[i.skill.title] = { |
||||
'color': i.skill.color, |
||||
'size': i.size, |
||||
'icon': i.skill.mini_icon |
||||
} |
||||
return result |
||||
|
||||
|
||||
def get_user_completed_courses_count(user): |
||||
return ExamJ.objects.filter(student=user, success=True).count() |
||||
|
||||
|
||||
def get_user_skills_size_count(user): |
||||
# Посчитать размер навыка |
||||
result = 0 |
||||
for key, value in get_user_skills(user).items(): |
||||
result += value['size'] |
||||
return result |
||||
|
||||
|
||||
def set_achievement(user, title, text, group, achievement_name): |
||||
# Просвоить ачивку |
||||
achievement = Achievements.objects.get(tech_name=achievement_name) |
||||
AchievementJ.objects.create(student=user, title=title, text=text, group=group, achievement=achievement) |
||||
|
||||
### Методы над курсом |
||||
def get_students_on_homework_length(course): |
||||
l = 0 |
||||
for i in CourseTheme.objects.filter(course=course): |
||||
l += i.get_active_homework_students_length() |
||||
return l |
||||
|
||||
|
||||
def get_active_exam_students(course): |
||||
result = [i.student for i in ExamJ.objects.filter(exam__course=course, status='T').exclude(success=True)] |
||||
return result |
||||
|
||||
|
||||
def get_active_exam_students_length(course): |
||||
result = ExamJ.objects.filter(exam__course=course, status='T').count() |
||||
return result |
||||
|
||||
|
||||
def exam_status_html(course, student): |
||||
status = course.get_exam_status(student) |
||||
data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>' |
||||
if status == 'B': |
||||
return data.format(u'primary', u'Пока недоступно') |
||||
elif status == 'P': |
||||
return data.format(u'warning', u'Достуно для выполнения') |
||||
elif status == 'T': |
||||
return data.format(u'info', u'Проверяется преподавателем') |
||||
elif status == 'E': |
||||
return data.format(u'danger', u'Требуется доработка') |
||||
elif status == 'F': |
||||
return data.format(u'success', u'Сдано') |
||||
|
||||
|
||||
def get_exam_status(course, student): |
||||
try: |
||||
exam = Exam.objects.get(course=course) |
||||
except Exam.DoesNotExist: |
||||
return 'B' |
||||
else: |
||||
return exam.get_status(student) |
||||
|
||||
|
||||
def check_course_finish(course, student): |
||||
if LessonJ.objects.filter(lesson__course=course, student=student, status='F').count() == Lesson.objects.filter( |
||||
course=course).count() \ |
||||
and HomeworkJ.objects.filter(homework__course=course, student=student, |
||||
status='F').count() == Homework.objects.filter(course=course).count() \ |
||||
and ExamJ.objects.filter(exam__course=course, student=student, status='F').count() == Exam.objects.filter( |
||||
course=course).count(): |
||||
return True |
||||
else: |
||||
return False |
||||
|
||||
|
||||
### Методы над темой |
||||
def get_theme_no_saw_lessons_length(__theme): |
||||
result = 0 |
||||
for n in __theme.get_lessons(): |
||||
result += n.get_no_saw_lessons_length() |
||||
|
||||
return result |
||||
|
||||
|
||||
def get_theme_description(theme, student): |
||||
result = '' |
||||
if theme.description: |
||||
result += '<p style="padding:10px;">%s</p>' % theme.description |
||||
|
||||
if theme.lessons_length() > 1: |
||||
result += u'<ul style="padding: 0 0 0 15px;">' |
||||
for i in Lesson.objects.filter(course=theme.course, theme=theme).order_by('sort'): |
||||
result += i.get_description(student) |
||||
result += u'</ul>' |
||||
return result |
||||
|
||||
if not theme.description and theme.lessons_length() == 1: |
||||
return Lesson.objects.get(theme=theme).description |
||||
|
||||
|
||||
def get_active_homework_students(theme): |
||||
result = [] |
||||
if theme.homework_exist(): |
||||
for i in HomeworkJ.objects.filter(homework=theme.get_homework(), status='T'): |
||||
result.append(i.student) |
||||
return result |
||||
|
||||
|
||||
def get_active_homework_students_length(theme): |
||||
if theme.homework_exist(): |
||||
return HomeworkJ.objects.filter(homework=self.get_homework(), status='T').count() |
||||
else: |
||||
return 0 |
||||
|
||||
|
||||
def get_actual_theme_lesson_id(theme, student): |
||||
# Получение читаемого урока |
||||
if student: |
||||
try: |
||||
if student.is_authenticated() and student.is_admin: |
||||
return Lesson.objects.get(theme=theme, sort='1').id |
||||
except: |
||||
pass |
||||
|
||||
status = theme.get_status(student) |
||||
if status == 'R': |
||||
if LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).exists(): |
||||
return LessonJ.objects.filter(status='R', lesson__theme=theme, student=student).first().lesson.id |
||||
else: |
||||
if theme.homework_status(student) in ['R', 'E', 'T', 'A']: |
||||
return Lesson.objects.filter(theme=theme).order_by('sort').last().id |
||||
else: |
||||
return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id |
||||
|
||||
elif status == 'F': |
||||
return Lesson.objects.filter(theme=theme).order_by('sort').first().id |
||||
|
||||
else: |
||||
if Lesson.objects.filter(theme=theme, free=True).exists(): |
||||
return Lesson.objects.filter(theme=theme, free=True).order_by('sort').first().id |
||||
else: |
||||
return False |
||||
|
||||
|
||||
def get_one_lesson_id(theme): |
||||
if theme.lessons_length() == 1: |
||||
return Lesson.objects.filter(course=theme.course, theme=theme).first().id |
||||
else: |
||||
return '0' |
||||
|
||||
|
||||
def homework_status_html(theme, student): |
||||
status = theme.homework_status(student) |
||||
data = u'<span class="label font-normal text-white bg-{0}" style="margin-left: 10px;">{1}</span>' |
||||
if status == 'B': |
||||
return data.format(u'primary', u'Пока недоступно') |
||||
elif status == 'A': |
||||
return data.format(u'warning', u'Достуно для выполнения') |
||||
elif status == 'T': |
||||
return data.format(u'info', u'Проверяется преподавателем') |
||||
elif status == 'E': |
||||
return data.format(u'danger', u'Требуется доработка') |
||||
elif status == 'F': |
||||
return data.format(u'success', u'Сдано') |
||||
|
||||
|
||||
def homework_status(theme, student): |
||||
if Homework.objects.filter(theme=theme).exists(): |
||||
try: |
||||
homework = HomeworkJ.objects.get(student=student, homework=Homework.objects.get(theme=theme)) |
||||
except HomeworkJ.DoesNotExist: |
||||
return 'B' |
||||
else: |
||||
return homework.status |
||||
else: |
||||
return 'B' |
||||
|
||||
|
||||
def check_theme_finish(theme, student): |
||||
# Проверка, прошел ли пользователь тему по урокам |
||||
if LessonJ.objects.filter(student=student, status='F', lesson__theme=theme).count() == theme.lessons_length(): |
||||
return True |
||||
else: |
||||
return False |
||||
|
||||
|
||||
def check_study_access(theme, student): |
||||
if LessonJ.objects.filter(Q(student=student, status='R', lesson__theme=theme) | Q(student=student, status='F', |
||||
lesson__theme=theme)).exists(): |
||||
return True |
||||
else: |
||||
return False |
||||
|
||||
|
||||
def get_status(theme, student): |
||||
# 1) Читаемая тема |
||||
# 2) ДЗ на прохождении |
||||
# 3) Укомплектовано |
||||
if student: |
||||
if LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme), |
||||
status='R').exists(): |
||||
return 'R' |
||||
|
||||
elif Lesson.objects.filter(free=True, theme=theme).exists() \ |
||||
and not LessonJ.objects.filter(student=student, lesson__in=Lesson.objects.filter(theme=theme, |
||||
free=True)): |
||||
return 'R' |
||||
|
||||
elif theme.homework_status(student) != 'B': |
||||
h_status = theme.homework_status(student) |
||||
if h_status == 'F': |
||||
return 'F' |
||||
|
||||
else: |
||||
return 'R' |
||||
|
||||
elif LessonJ.objects.filter(student=student, lesson__theme=theme, |
||||
status='F').count() == Lesson.objects.filter(theme=theme).count(): |
||||
return 'F' |
||||
|
||||
else: |
||||
return 'N' |
||||
else: |
||||
if theme.sort == 1 and Lesson.objects.filter(free=True, theme=theme).exists(): |
||||
return 'R' |
||||
else: |
||||
return 'N' |
||||
|
||||
|
||||
def get_theme_color(theme, student): |
||||
# Получить тип |
||||
# Если тип премиум или пополнение |
||||
status = theme.get_status(student) |
||||
if status == 'F': |
||||
return 'b-success' |
||||
elif status == 'N': |
||||
return 'b-default' |
||||
else: |
||||
return 'b-info' |
||||
|
||||
|
||||
def get_theme_skills(__theme): |
||||
result = [] |
||||
for i in SkillJ.objects.filter(lesson__in=__theme.get_lessons()): |
||||
if i.skill not in result: |
||||
result.append(i.skill) |
||||
return result |
||||
|
||||
|
||||
def have_skills(self): |
||||
return SkillJ.objects.filter(lesson__in=self.get_lessons()).exists() |
||||
|
||||
|
||||
### Методы над уроком |
||||
def get_lesson_description(lesson, student): |
||||
# 1 - id |
||||
# 2 - course_id |
||||
# 3 - title |
||||
# 4 - status |
||||
# 5 - free |
||||
button = u'<li style="margin-bottom:5px;">' \ |
||||
u'<a href="/courses/lesson/{0}" by_type="lesson" self_id="{0}" course_id="{1}" ' \ |
||||
u'style="color:#333; border-bottom:1px dotted #333; color: #333;">{2}</a> ' \ |
||||
u'{3} ' \ |
||||
u'<span class="label label-success" style="margin-left: 10px;">{4}</span>' \ |
||||
u'</li>' |
||||
# 0 - title |
||||
# 1 - status |
||||
# 2 - free |
||||
button2 = u'<li style="margin-bottom:5px;">' \ |
||||
u'{0} ' \ |
||||
u'{1} ' \ |
||||
u'<span class="label label-success" style="margin-left: 10px;">{2}</span>' \ |
||||
u'</li>' |
||||
|
||||
if student and student.is_authenticated() and student.is_admin: |
||||
return button.format(lesson.id, lesson.course.id, |
||||
u'<b>ID: %s</b> %s' % (lesson.id, lesson.title) if student.is_admin else lesson.title, |
||||
'<i class="glyphicon glyphicon-time"></i>', '') |
||||
|
||||
elif lesson.get_status(student) != 'N': |
||||
return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), '') |
||||
|
||||
else: |
||||
if lesson.sort == 1 and lesson.free: |
||||
return button.format(lesson.id, lesson.course.id, lesson.title, '<i class="glyphicon glyphicon-time"></i>', |
||||
'') |
||||
else: |
||||
return button2.format(lesson.title, lesson.get_status_html(student), '') |
||||
|
||||
# if lesson.get_status(student) != 'N': |
||||
# return button.format(lesson.id, lesson.course.id, lesson.title, lesson.get_status_html(student), |
||||
# u'Бесплатный урок' if lesson.free else '') |
||||
|
||||
# else: |
||||
# if lesson.sort == 1 and lesson.free: |
||||
# return button.format(lesson.id, lesson.course.id, lesson.title, |
||||
# '<i class="glyphicon glyphicon-time"></i>', |
||||
# u'Бесплатный урок' if lesson.free else '') |
||||
# else: |
||||
# return button2.format(lesson.title, lesson.get_status_html(student), |
||||
# u'Бесплатный урок' if lesson.free else '') |
||||
|
||||
|
||||
def get_no_saw_lessons_length(lesson): |
||||
return lesson.comments.filter(saw=False).count() |
||||
|
||||
|
||||
def get_status_html(lesson, student): |
||||
status = lesson.get_status(student) |
||||
if status == 'N': |
||||
return u'<i class="glyphicon glyphicon-remove"></i>' |
||||
elif status == 'F': |
||||
return u'<i class="glyphicon glyphicon-ok"></i>' |
||||
elif status == 'R': |
||||
return u'<i class="glyphicon glyphicon-time"></i>' |
||||
|
||||
|
||||
def get_lesson_skills(lesson): |
||||
return SkillJ.objects.filter(lesson=lesson) |
||||
|
||||
|
||||
def get_comments_length(lesson): |
||||
return lesson.comments.filter(public=True).count() |
||||
|
||||
|
||||
def get_lesson_status(lesson, student): |
||||
try: |
||||
return LessonJ.objects.get(student=student, lesson=lesson).status |
||||
except LessonJ.DoesNotExist: |
||||
return 'N' |
||||
|
||||
|
||||
def get_status_name(lesson, student): |
||||
try: |
||||
return LessonJ.objects.get(student=student, lesson=lesson).get_status_display() |
||||
except LessonJ.DoesNotExist: |
||||
return u'Не доступно' |
||||
|
||||
|
||||
### Методы над ДЗ |
||||
def get_homework_status(__homework, student): |
||||
try: |
||||
homework = HomeworkJ.objects.get(student=student, homework=__homework) |
||||
except HomeworkJ.DoesNotExist: |
||||
return 'B' |
||||
else: |
||||
return homework.status |
||||
|
||||
|
||||
### Методы экзамена |
||||
|
||||
def get_exam_color(exam, student): |
||||
# Получить тип |
||||
# Если тип премиум или пополнение |
||||
status = exam.get_status(student) |
||||
if status == 'P': |
||||
return 'b-info' |
||||
elif status == 'T': |
||||
return 'b-primary' |
||||
elif status == 'F': |
||||
return 'b-success' |
||||
elif status == 'E': |
||||
return 'b-danger' |
||||
else: |
||||
return 'b-default' |
||||
|
||||
|
||||
@ -1,45 +1,45 @@ |
||||
from courses import views, api |
||||
from django.conf.urls import url |
||||
|
||||
urlpatterns = [ |
||||
url(r'^([0-9]{1,99})$', views.course), |
||||
url(r'^([0-9]{1,99})#\s+$', views.course), |
||||
url(r'lesson/([0-9]{1,99})$', views.lesson), |
||||
url(r'homework/([0-9]{1,99})$', views.homework), |
||||
url(r'exam/([0-9]{1,99})$', views.exam), |
||||
url(r'read_lesson/$', api.read_lesson), |
||||
url(r'load_lesson_comments$', api.load_lesson_comments), |
||||
url(r'load_homework_comments_for_teacher$', api.load_homework_comments_for_teacher), |
||||
url(r'load_exam_comments_for_teacher$', api.load_exam_comments_for_teacher), |
||||
url(r'load_homework_comments$', api.load_homework_comments), |
||||
url(r'load_exam_comments$', api.load_exam_comments), |
||||
url(r'get_achievement$', api.get_achievement), |
||||
url(r'close_achievement$', api.close_achievement), |
||||
url(r'delete_comment$', api.delete_comment), |
||||
url(r'sent_lesson_comment$', api.sent_lesson_comment), |
||||
url(r'get_homework_comments_length_for_teacher$', api.get_homework_comments_length_for_teacher), |
||||
url(r'get_exam_comments_length_for_teacher$', api.get_exam_comments_length_for_teacher), |
||||
url(r'get_homework_comments_length$', api.get_homework_comments_length), |
||||
url(r'get_exam_comments_length$', api.get_exam_comments_length), |
||||
url(r'sent_homework_comment$', api.sent_homework_comment), |
||||
url(r'sent_exam_comment$', api.sent_exam_comment), |
||||
url(r'get_lesson_comments_length$', api.get_lesson_comments_length), |
||||
url(r'get_lesson_context/$', api.get_lesson_context), |
||||
url(r'send_accept_teach_comment$', api.send_accept_teach_comment), |
||||
url(r'send_cancel_teach_comment', api.send_cancel_teach_comment), |
||||
url(r'send_exam_accept_teach_comment$', api.send_exam_accept_teach_comment), |
||||
url(r'send_exam_cancel_teach_comment', api.send_exam_cancel_teach_comment), |
||||
url(r'get_next_button/$', api.get_next_button_ajax), |
||||
url(r'by_course_data/$', api.by_course_data), |
||||
url(r'get_homework_context/$', api.get_homework_context), |
||||
url(r'load_comment/$', api.load_comment), |
||||
url(r'sent_homework_up_teacher$', api.sent_homework_up_teacher), |
||||
url(r'sent_homework_down_teacher$', api.sent_homework_down_teacher), |
||||
url(r'sent_exam_up_teacher$', api.sent_exam_up_teacher), |
||||
url(r'sent_exam_down_teacher$', api.sent_exam_down_teacher), |
||||
url(r'get_process_vector$', api.get_process_vector), |
||||
url(r'get_comment_text/$', api.get_comment_text), |
||||
url(r'sent_comment_response/$', api.sent_comment_response), |
||||
url(r'achievements/$', views.achievements), |
||||
url(r'^(?P<slug>.*)$', views.course), |
||||
] |
||||
from courses import views, api |
||||
from django.conf.urls import url |
||||
|
||||
urlpatterns = [ |
||||
url(r'^([0-9]{1,99})$', views.course), |
||||
url(r'^([0-9]{1,99})#\s+$', views.course), |
||||
url(r'lesson/([0-9]{1,99})$', views.lesson), |
||||
url(r'homework/([0-9]{1,99})$', views.homework), |
||||
url(r'exam/([0-9]{1,99})$', views.exam), |
||||
url(r'read_lesson/$', api.read_lesson), |
||||
url(r'load_lesson_comments$', api.load_lesson_comments), |
||||
url(r'load_homework_comments_for_teacher$', api.load_homework_comments_for_teacher), |
||||
url(r'load_exam_comments_for_teacher$', api.load_exam_comments_for_teacher), |
||||
url(r'load_homework_comments$', api.load_homework_comments), |
||||
url(r'load_exam_comments$', api.load_exam_comments), |
||||
url(r'get_achievement$', api.get_achievement), |
||||
url(r'close_achievement$', api.close_achievement), |
||||
url(r'delete_comment$', api.delete_comment), |
||||
url(r'sent_lesson_comment$', api.sent_lesson_comment), |
||||
url(r'get_homework_comments_length_for_teacher$', api.get_homework_comments_length_for_teacher), |
||||
url(r'get_exam_comments_length_for_teacher$', api.get_exam_comments_length_for_teacher), |
||||
url(r'get_homework_comments_length$', api.get_homework_comments_length), |
||||
url(r'get_exam_comments_length$', api.get_exam_comments_length), |
||||
url(r'sent_homework_comment$', api.sent_homework_comment), |
||||
url(r'sent_exam_comment$', api.sent_exam_comment), |
||||
url(r'get_lesson_comments_length$', api.get_lesson_comments_length), |
||||
url(r'get_lesson_context/$', api.get_lesson_context), |
||||
url(r'send_accept_teach_comment$', api.send_accept_teach_comment), |
||||
url(r'send_cancel_teach_comment', api.send_cancel_teach_comment), |
||||
url(r'send_exam_accept_teach_comment$', api.send_exam_accept_teach_comment), |
||||
url(r'send_exam_cancel_teach_comment', api.send_exam_cancel_teach_comment), |
||||
url(r'get_next_button/$', api.get_next_button_ajax), |
||||
url(r'by_course_data/$', api.by_course_data), |
||||
url(r'get_homework_context/$', api.get_homework_context), |
||||
url(r'load_comment/$', api.load_comment), |
||||
url(r'sent_homework_up_teacher$', api.sent_homework_up_teacher), |
||||
url(r'sent_homework_down_teacher$', api.sent_homework_down_teacher), |
||||
url(r'sent_exam_up_teacher$', api.sent_exam_up_teacher), |
||||
url(r'sent_exam_down_teacher$', api.sent_exam_down_teacher), |
||||
url(r'get_process_vector$', api.get_process_vector), |
||||
url(r'get_comment_text/$', api.get_comment_text), |
||||
url(r'sent_comment_response/$', api.sent_comment_response), |
||||
url(r'achievements/$', views.achievements), |
||||
url(r'^(?P<slug>.*)$', views.course), |
||||
] |
||||
|
||||
@ -1,254 +1,250 @@ |
||||
# coding=utf-8 |
||||
import datetime |
||||
from django.http import Http404 |
||||
|
||||
from finance.models import Bill |
||||
from lms.decors import response_decor |
||||
from lms.tools import user_fabric |
||||
from courses.models import Course, Lesson, Homework, Exam, MaterialDirection, Achievements, Skills, SkillJ, CourseMap |
||||
from journals.models import LessonJ, TeacherJ, HomeworkJ, check_journal, ExamJ, AchievementJ |
||||
from finance.tools import system_check_bill |
||||
|
||||
|
||||
@response_decor(template='course.html', without_auth=True) |
||||
def course(request, slug): |
||||
# Страница курса |
||||
user = user_fabric(request.user) |
||||
if not slug: return {'redirect': '/'} |
||||
try: |
||||
course = Course.objects.get(slug=slug) |
||||
except Course.DoesNotExist: |
||||
try: |
||||
course = Course.objects.get(id=slug) |
||||
except ValueError: |
||||
raise Http404 |
||||
except Course.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
return {'redirect': course.get_absolute_url()} |
||||
except Course.DoesNotExist: |
||||
raise Http404 |
||||
|
||||
if not course.public and not (request.user.is_authenticated() and request.user.is_admin): |
||||
raise Http404 |
||||
|
||||
if course.hidden: |
||||
if not request.user.is_authenticated(): |
||||
raise Http404 |
||||
else: |
||||
if not request.user.is_admin: |
||||
try: |
||||
Bill.objects.get(service__course=course, user=request.user, status='F') |
||||
except Bill.DoesNotExist: |
||||
raise Http404 |
||||
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) |
||||
if created: |
||||
check_journal(journal) |
||||
_map = CourseMap.objects.filter(course=course).order_by('sort').first() |
||||
_j = _map.get_obj() |
||||
j = HomeworkJ.objects.get(material=_j, student=request.user) |
||||
j.open_material() |
||||
else: |
||||
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) |
||||
|
||||
if user and not journal.start_date: |
||||
journal.start_date = datetime.datetime.now() |
||||
journal.save() |
||||
|
||||
waiting_materials = [] |
||||
if journal.waiting.exists(): |
||||
for n in journal.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
return { |
||||
'course': journal.get_face(user_fabric(request.user)), |
||||
'user': user_fabric(request.user), |
||||
'waiting_materials': waiting_materials |
||||
} |
||||
|
||||
|
||||
@response_decor(template='lesson.html') |
||||
def lesson(request, lesson): |
||||
# Открытие окна урока |
||||
# TODO: Проверить все ссылки на ID Lesson |
||||
try: |
||||
lesson = Lesson.objects.get(id=lesson) |
||||
lj = LessonJ.objects.get(material=lesson, student=request.user) |
||||
except Lesson.DoesNotExist: |
||||
raise Http404 |
||||
except LessonJ.DoesNotExist: |
||||
j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course) |
||||
check_journal(j) |
||||
lj = LessonJ.objects.get(material=lesson, student=request.user) |
||||
|
||||
waiting_materials = [] |
||||
if lj.parent.parent.waiting.exists(): |
||||
for n in lj.parent.parent.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
|
||||
if request.user.is_authenticated() and request.user.is_admin or request.user in lesson.course.teachers.all(): |
||||
return {'lesson': lj.get_face(user_fabric(request.user)), |
||||
'course': {'head': lj.parent.parent.get_head_face(), |
||||
'level': lj.parent.parent.course.get_level(), |
||||
'journal': lj.parent.parent.get_face(user_fabric(request.user))}, |
||||
'bought': True, 'accept': True, 'waiting_materials': waiting_materials} |
||||
|
||||
if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type): |
||||
return {'redirect': '/access/by_error/'} |
||||
else: |
||||
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists(): |
||||
return {'redirect': '/access/auth_error/'} |
||||
else: |
||||
result = False |
||||
if lj.get_status_flag() != 'N': |
||||
result = True |
||||
elif lj.parent.parent.waiting.filter(token=lj.material.token).exists(): |
||||
result = True |
||||
lj.date = datetime.datetime.now() |
||||
lj.save() |
||||
if result: |
||||
return {'lesson': lj.get_face(user_fabric(request.user)), 'course': {'head': lj.parent.parent.get_head_face(), 'level': lj.parent.parent.course.get_level(), 'journal': lj.parent.parent.get_face(user_fabric(request.user))}, 'bought': True, 'accept': True, 'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='homework.html') |
||||
def homework(request, homework): |
||||
# Страница ДЗ |
||||
# TODO: Проверить везде ссылки с ID ДЗ |
||||
try: |
||||
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user) |
||||
except Homework.DoesNotExist: |
||||
raise Http404 |
||||
except HomeworkJ.DoesNotExist: |
||||
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course) |
||||
check_journal(j) |
||||
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user) |
||||
|
||||
waiting_materials = [] |
||||
if hj.parent.parent.waiting.exists(): |
||||
for n in hj.parent.parent.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
|
||||
if request.user.is_authenticated() and request.user.is_admin: |
||||
return {'homework': hj.get_face(user_fabric(request.user)), |
||||
'course': {'head': hj.parent.parent.get_head_face(), |
||||
'level': hj.parent.parent.course.get_level(), |
||||
'journal': hj.parent.parent.get_face(user_fabric(request.user))}, |
||||
'waiting_materials': waiting_materials} |
||||
|
||||
if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type): |
||||
return {'redirect': '/access/by_error/'} |
||||
else: |
||||
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists(): |
||||
return {'redirect': '/access/auth_error/'} |
||||
else: |
||||
result = False |
||||
if hj.get_status_flag() != 'N': |
||||
result = True |
||||
elif hj.parent.parent.waiting.filter(token=hj.material.token).exists(): |
||||
hj.date = datetime.datetime.now() |
||||
hj.save() |
||||
result = True |
||||
|
||||
if result: |
||||
return {'homework': hj.get_face(user_fabric(request.user)), |
||||
'course': {'head': hj.parent.parent.get_head_face(), |
||||
'level': hj.parent.parent.course.get_level(), 'journal': hj.parent.parent.get_face(user_fabric(request.user))}, |
||||
'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='exam.html') |
||||
def exam(request, exam): |
||||
# Страница экзамена |
||||
# TODO: проверить, чтобы это было ID экзамена |
||||
try: |
||||
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user) |
||||
except Exam.DoesNotExist: |
||||
raise Http404 |
||||
except ExamJ.DoesNotExist: |
||||
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course) |
||||
check_journal(j) |
||||
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user) |
||||
|
||||
waiting_materials = [] |
||||
if exam.parent.parent.waiting.all().exists(): |
||||
for n in exam.parent.parent.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
|
||||
if request.user.is_authenticated() and request.user.is_admin: |
||||
return {'exam': exam.get_face(user_fabric(request.user)), |
||||
'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, |
||||
'waiting_materials': waiting_materials} |
||||
|
||||
if not system_check_bill(exam.material.token, request.user): |
||||
return {'redirect': '/access/by_error/'} |
||||
else: |
||||
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists(): |
||||
return {'redirect': '/access/auth_error/'} |
||||
else: |
||||
result = False |
||||
if exam.get_status_flag() != 'N': |
||||
result = True |
||||
elif exam.parent.parent.waiting.filter(token=exam.material.token).exists(): |
||||
result = True |
||||
exam.date = datetime.datetime.now() |
||||
exam.save() |
||||
|
||||
if result: |
||||
return {'exam': exam.get_face(user_fabric(request.user)), 'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, 'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='all_achievements.html', without_auth=True) |
||||
def achievements(request): |
||||
# Список ачивок и статус получения |
||||
skills = {} |
||||
for course in Course.objects.all().order_by('sort'): |
||||
skills[(course.id, course.title)] = {} |
||||
for skillj in SkillJ.objects.filter(lesson__course=course): |
||||
if not skills[(course.id, course.title)].get(skillj.skill.title): |
||||
skills[(course.id, course.title)][skillj.skill.title] = { |
||||
'size': 0, |
||||
'icon': skillj.skill.mini_icon, |
||||
'color': skillj.skill.color |
||||
} |
||||
skills[(course.id, course.title)][skillj.skill.title]['size'] += skillj.size |
||||
|
||||
return {'achievements': Achievements.objects.all(), 'skills': skills} |
||||
# coding=utf-8 |
||||
import datetime |
||||
from django.http import Http404 |
||||
|
||||
from finance.models import Bill |
||||
from lms.decors import response_decor |
||||
from lms.tools import user_fabric |
||||
from courses.models import Course, Lesson, Homework, Exam, MaterialDirection, Achievements, Skills, SkillJ, CourseMap |
||||
from journals.models import LessonJ, TeacherJ, HomeworkJ, check_journal, ExamJ, AchievementJ |
||||
from finance.tools import system_check_bill |
||||
|
||||
|
||||
@response_decor(template='course.html', without_auth=True) |
||||
def course(request, slug): |
||||
# Страница курса |
||||
user = user_fabric(request.user) |
||||
if not slug: return {'redirect': '/'} |
||||
try: |
||||
course = Course.objects.get(slug=slug) |
||||
except Course.DoesNotExist: |
||||
try: |
||||
course = Course.objects.get(id=slug) |
||||
except ValueError: |
||||
raise Http404 |
||||
except Course.DoesNotExist: |
||||
raise Http404 |
||||
else: |
||||
return {'redirect': course.get_absolute_url()} |
||||
except Course.DoesNotExist: |
||||
raise Http404 |
||||
|
||||
if not course.public and not (request.user.is_authenticated() and request.user.is_admin): |
||||
raise Http404 |
||||
|
||||
if course.hidden: |
||||
if not request.user.is_authenticated(): |
||||
raise Http404 |
||||
else: |
||||
if not request.user.is_admin: |
||||
try: |
||||
Bill.objects.get(service__course=course, user=request.user, status='F') |
||||
except Bill.DoesNotExist: |
||||
raise Http404 |
||||
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) |
||||
if created: |
||||
check_journal(journal) |
||||
_map = CourseMap.objects.filter(course=course).order_by('sort').first() |
||||
_j = _map.get_obj() |
||||
j = HomeworkJ.objects.get(material=_j, student=request.user) |
||||
j.open_material() |
||||
else: |
||||
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) |
||||
|
||||
if user and not journal.start_date: |
||||
journal.start_date = datetime.datetime.now() |
||||
journal.save() |
||||
|
||||
waiting_materials = [] |
||||
if journal.waiting.exists(): |
||||
for n in journal.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
return {'course': journal.get_face(user_fabric(request.user)), 'user': user_fabric(request.user), 'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='lesson.html') |
||||
def lesson(request, lesson): |
||||
# Открытие окна урока |
||||
# TODO: Проверить все ссылки на ID Lesson |
||||
try: |
||||
lesson = Lesson.objects.get(id=lesson) |
||||
lj = LessonJ.objects.get(material=lesson, student=request.user) |
||||
except Lesson.DoesNotExist: |
||||
raise Http404 |
||||
except LessonJ.DoesNotExist: |
||||
j, c = TeacherJ.objects.get_or_create(student=request.user, course=lesson.course) |
||||
check_journal(j) |
||||
lj = LessonJ.objects.get(material=lesson, student=request.user) |
||||
|
||||
waiting_materials = [] |
||||
if lj.parent.parent.waiting.exists(): |
||||
for n in lj.parent.parent.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
|
||||
if request.user.is_authenticated() and request.user.is_admin or request.user in lesson.course.teachers.all(): |
||||
return {'lesson': lj.get_face(user_fabric(request.user)), |
||||
'course': {'head': lj.parent.parent.get_head_face(), |
||||
'level': lj.parent.parent.course.get_level(), |
||||
'journal': lj.parent.parent.get_face(user_fabric(request.user))}, |
||||
'bought': True, 'accept': True, 'waiting_materials': waiting_materials} |
||||
|
||||
if not lesson.free and not system_check_bill(lesson.token, request.user, theme_type=lesson.theme._type): |
||||
return {'redirect': '/access/by_error/'} |
||||
else: |
||||
if lj.get_status_flag() == 'N' and not lj.parent.parent.waiting.filter(token=lj.material.token).exists(): |
||||
return {'redirect': '/access/auth_error/'} |
||||
else: |
||||
result = False |
||||
if lj.get_status_flag() != 'N': |
||||
result = True |
||||
elif lj.parent.parent.waiting.filter(token=lj.material.token).exists(): |
||||
result = True |
||||
lj.date = datetime.datetime.now() |
||||
lj.save() |
||||
if result: |
||||
return {'lesson': lj.get_face(user_fabric(request.user)), 'course': {'head': lj.parent.parent.get_head_face(), 'level': lj.parent.parent.course.get_level(), 'journal': lj.parent.parent.get_face(user_fabric(request.user))}, 'bought': True, 'accept': True, 'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='homework.html') |
||||
def homework(request, homework): |
||||
# Страница ДЗ |
||||
# TODO: Проверить везде ссылки с ID ДЗ |
||||
try: |
||||
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user) |
||||
except Homework.DoesNotExist: |
||||
raise Http404 |
||||
except HomeworkJ.DoesNotExist: |
||||
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Homework.objects.get(id=homework).course) |
||||
check_journal(j) |
||||
hj = HomeworkJ.objects.get(material=Homework.objects.get(id=homework), student=request.user) |
||||
|
||||
waiting_materials = [] |
||||
if hj.parent.parent.waiting.exists(): |
||||
for n in hj.parent.parent.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
|
||||
if request.user.is_authenticated() and request.user.is_admin: |
||||
return {'homework': hj.get_face(user_fabric(request.user)), |
||||
'course': {'head': hj.parent.parent.get_head_face(), |
||||
'level': hj.parent.parent.course.get_level(), |
||||
'journal': hj.parent.parent.get_face(user_fabric(request.user))}, |
||||
'waiting_materials': waiting_materials} |
||||
|
||||
if not system_check_bill(hj.material.token, request.user, theme_type=hj.material.theme._type): |
||||
return {'redirect': '/access/by_error/'} |
||||
else: |
||||
if hj.get_status_flag() == 'N' and not hj.parent.parent.waiting.filter(token=hj.material.token).exists(): |
||||
return {'redirect': '/access/auth_error/'} |
||||
else: |
||||
result = False |
||||
if hj.get_status_flag() != 'N': |
||||
result = True |
||||
elif hj.parent.parent.waiting.filter(token=hj.material.token).exists(): |
||||
hj.date = datetime.datetime.now() |
||||
hj.save() |
||||
result = True |
||||
|
||||
if result: |
||||
return {'homework': hj.get_face(user_fabric(request.user)), |
||||
'course': {'head': hj.parent.parent.get_head_face(), |
||||
'level': hj.parent.parent.course.get_level(), 'journal': hj.parent.parent.get_face(user_fabric(request.user))}, |
||||
'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='exam.html') |
||||
def exam(request, exam): |
||||
# Страница экзамена |
||||
# TODO: проверить, чтобы это было ID экзамена |
||||
try: |
||||
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user) |
||||
except Exam.DoesNotExist: |
||||
raise Http404 |
||||
except ExamJ.DoesNotExist: |
||||
j, c = TeacherJ.objects.get_or_create(student=request.user, course=Exam.objects.get(id=exam).course) |
||||
check_journal(j) |
||||
exam = ExamJ.objects.get(material=Exam.objects.get(id=exam), student=request.user) |
||||
|
||||
waiting_materials = [] |
||||
if exam.parent.parent.waiting.all().exists(): |
||||
for n in exam.parent.parent.waiting.all(): |
||||
_obj = n.get_obj() |
||||
__type = n.get_type() |
||||
_type = None |
||||
if __type == 'L': |
||||
_type = 'lesson' |
||||
elif __type == 'H': |
||||
_type = 'homework' |
||||
elif __type == 'E': |
||||
_type = 'exam' |
||||
|
||||
waiting_materials.append({'obj': _obj, 'type': _type}) |
||||
|
||||
if request.user.is_authenticated() and request.user.is_admin: |
||||
return {'exam': exam.get_face(user_fabric(request.user)), |
||||
'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, |
||||
'waiting_materials': waiting_materials} |
||||
|
||||
if not system_check_bill(exam.material.token, request.user): |
||||
return {'redirect': '/access/by_error/'} |
||||
else: |
||||
if exam.get_status_flag() == 'N' and not exam.parent.parent.waiting.filter(token=exam.material.token).exists(): |
||||
return {'redirect': '/access/auth_error/'} |
||||
else: |
||||
result = False |
||||
if exam.get_status_flag() != 'N': |
||||
result = True |
||||
elif exam.parent.parent.waiting.filter(token=exam.material.token).exists(): |
||||
result = True |
||||
exam.date = datetime.datetime.now() |
||||
exam.save() |
||||
|
||||
if result: |
||||
return {'exam': exam.get_face(user_fabric(request.user)), 'course': {'head': exam.parent.parent.get_head_face(), 'level': exam.parent.parent.course.get_level()}, 'waiting_materials': waiting_materials} |
||||
|
||||
|
||||
@response_decor(template='all_achievements.html', without_auth=True) |
||||
def achievements(request): |
||||
# Список ачивок и статус получения |
||||
skills = {} |
||||
for course in Course.objects.all().order_by('sort'): |
||||
skills[(course.id, course.title)] = {} |
||||
for skillj in SkillJ.objects.filter(lesson__course=course): |
||||
if not skills[(course.id, course.title)].get(skillj.skill.title): |
||||
skills[(course.id, course.title)][skillj.skill.title] = { |
||||
'size': 0, |
||||
'icon': skillj.skill.mini_icon, |
||||
'color': skillj.skill.color |
||||
} |
||||
skills[(course.id, course.title)][skillj.skill.title]['size'] += skillj.size |
||||
|
||||
return {'achievements': Achievements.objects.all(), 'skills': skills} |
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1,125 +1,125 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-18 16:46 |
||||
from __future__ import unicode_literals |
||||
|
||||
import datetime |
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
import django.utils.timezone |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
initial = True |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('courses', '0001_initial'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Bill', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('status', models.CharField(choices=[(b'W', '\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f'), (b'P', '\u041d\u0430 \u043e\u043f\u043b\u0430\u0442\u0435'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'W', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), |
||||
('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')), |
||||
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0430')), |
||||
('status_changed', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u0430')), |
||||
('comment', models.TextField(blank=True, help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430')), |
||||
('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f')), |
||||
('salt', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0421\u043e\u043b\u044c')), |
||||
('manager', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_manager', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0421\u0447\u0435\u0442', |
||||
'verbose_name_plural': '\u0421\u0447\u0435\u0442\u0430', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Price', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('m_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')), |
||||
('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')), |
||||
('title', models.CharField(default=b'', help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430')), |
||||
('cost', models.IntegerField(verbose_name='\u0426\u0435\u043d\u0430')), |
||||
('description', models.TextField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', |
||||
'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='SelfBillHistory', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('status', models.CharField(choices=[(b'O', '\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043f\u043b\u0430\u0442\u044b'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'O', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), |
||||
('fio', models.CharField(max_length=255, verbose_name='\u0424\u0418\u041e')), |
||||
('phone', models.CharField(blank=True, max_length=255, verbose_name='\u0422\u0435\u043b\u0435\u0444\u043e\u043d')), |
||||
('email', models.CharField(blank=True, max_length=255, verbose_name='Email')), |
||||
('s_date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f')), |
||||
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u043f\u043b\u0430\u0442\u044b')), |
||||
('salt', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0421\u043e\u043b\u044c')), |
||||
('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')), |
||||
('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('sent', models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='SelfBillRequest', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438')), |
||||
('sum', models.IntegerField(verbose_name='\u0421\u0443\u043c\u043c\u0430')), |
||||
('key', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('url', models.URLField(blank=True, verbose_name='URL')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0428\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
'verbose_name_plural': '\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='ServiceRequest', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('status', models.CharField(choices=[(b'S', '\u041d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d'), (b'W', '\u0412 \u0440\u0430\u0431\u043e\u0442\u0435'), (b'F', '\u041f\u0440\u043e\u0434\u0430\u043d'), (b'B', '\u041d\u0435 \u043f\u0440\u043e\u0434\u0430\u043b')], default=b'S', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), |
||||
('cancel_description', models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430')), |
||||
('charge', models.TextField(blank=True, default=b'', verbose_name='\u041f\u043e\u0440\u0443\u0447\u0435\u043d\u0438\u0435')), |
||||
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0430\u0437\u0430')), |
||||
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0431\u0430\u0431\u043e\u0442\u043a\u0438')), |
||||
('send', models.BooleanField(default=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='manager_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')), |
||||
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_user', to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443', |
||||
'verbose_name_plural': '\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u043a\u0443\u043f\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='request', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillRequest', verbose_name='\u0424\u043e\u0440\u043c\u0430 \u0441\u0447\u0435\u0442\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='service', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u041e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0443\u0441\u043b\u0443\u0433\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='user', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043b\u0430\u0442\u0435\u043b\u044c\u0449\u0438\u043a'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-03-18 16:46 |
||||
from __future__ import unicode_literals |
||||
|
||||
import datetime |
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
import django.utils.timezone |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
initial = True |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('courses', '0001_initial'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Bill', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('status', models.CharField(choices=[(b'W', '\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044f'), (b'P', '\u041d\u0430 \u043e\u043f\u043b\u0430\u0442\u0435'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'W', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), |
||||
('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')), |
||||
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0430')), |
||||
('status_changed', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0441\u043c\u0435\u043d\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u0430')), |
||||
('comment', models.TextField(blank=True, help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e', verbose_name='\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430')), |
||||
('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f')), |
||||
('salt', models.CharField(blank=True, default=b'', max_length=100, verbose_name='\u0421\u043e\u043b\u044c')), |
||||
('manager', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_manager', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0421\u0447\u0435\u0442', |
||||
'verbose_name_plural': '\u0421\u0447\u0435\u0442\u0430', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='Price', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('m_type', models.CharField(choices=[(b'B', '\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'E', '\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b'), (b'P', '\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b')], default=b'B', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438')), |
||||
('public', models.BooleanField(default=False, verbose_name='\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c')), |
||||
('title', models.CharField(default=b'', help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430')), |
||||
('cost', models.IntegerField(verbose_name='\u0426\u0435\u043d\u0430')), |
||||
('description', models.TextField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c', verbose_name='\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', |
||||
'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='SelfBillHistory', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('status', models.CharField(choices=[(b'O', '\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043f\u043b\u0430\u0442\u044b'), (b'F', '\u041e\u043f\u043b\u0430\u0447\u0435\u043d'), (b'C', '\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d')], default=b'O', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), |
||||
('fio', models.CharField(max_length=255, verbose_name='\u0424\u0418\u041e')), |
||||
('phone', models.CharField(blank=True, max_length=255, verbose_name='\u0422\u0435\u043b\u0435\u0444\u043e\u043d')), |
||||
('email', models.CharField(blank=True, max_length=255, verbose_name='Email')), |
||||
('s_date', models.DateTimeField(default=datetime.datetime.now, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f')), |
||||
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u043f\u043b\u0430\u0442\u044b')), |
||||
('salt', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u0421\u043e\u043b\u044c')), |
||||
('out_id', models.CharField(blank=True, default=b'', max_length=100, verbose_name='ID \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u0437\u0430')), |
||||
('key', models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('sent', models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
'verbose_name_plural': '\u0418\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u043f\u043b\u0430\u0442\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u043e\u0432', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='SelfBillRequest', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438')), |
||||
('sum', models.IntegerField(verbose_name='\u0421\u0443\u043c\u043c\u0430')), |
||||
('key', models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='\u041a\u043b\u044e\u0447')), |
||||
('url', models.URLField(blank=True, verbose_name='URL')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0428\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
'verbose_name_plural': '\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
}, |
||||
), |
||||
migrations.CreateModel( |
||||
name='ServiceRequest', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('status', models.CharField(choices=[(b'S', '\u041d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d'), (b'W', '\u0412 \u0440\u0430\u0431\u043e\u0442\u0435'), (b'F', '\u041f\u0440\u043e\u0434\u0430\u043d'), (b'B', '\u041d\u0435 \u043f\u0440\u043e\u0434\u0430\u043b')], default=b'S', max_length=1, verbose_name='\u0421\u0442\u0430\u0442\u0443\u0441')), |
||||
('cancel_description', models.TextField(blank=True, default=b'', verbose_name='\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u0430\u0437\u0430')), |
||||
('charge', models.TextField(blank=True, default=b'', verbose_name='\u041f\u043e\u0440\u0443\u0447\u0435\u043d\u0438\u0435')), |
||||
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0430\u0437\u0430')), |
||||
('f_date', models.DateTimeField(blank=True, null=True, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0431\u0430\u0431\u043e\u0442\u043a\u0438')), |
||||
('send', models.BooleanField(default=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e')), |
||||
('course', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441')), |
||||
('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='manager_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u0440\u043e\u0434\u0430\u0432\u0435\u0446')), |
||||
('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_user', to=settings.AUTH_USER_MODEL, verbose_name='\u0421\u0442\u0443\u0434\u0435\u043d\u0442')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0443', |
||||
'verbose_name_plural': '\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u043a\u0443\u043f\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='request', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillRequest', verbose_name='\u0424\u043e\u0440\u043c\u0430 \u0441\u0447\u0435\u0442\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='service', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u041e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0443\u0441\u043b\u0443\u0433\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='user', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_user', to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043b\u0430\u0442\u0435\u043b\u044c\u0449\u0438\u043a'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-04-07 17:41 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0001_initial'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='description', |
||||
field=models.TextField(blank=True, default=b'', help_text='\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438', verbose_name='\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-04-07 17:41 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0001_initial'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='description', |
||||
field=models.TextField(blank=True, default=b'', help_text='\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438', verbose_name='\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 16:52 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0002_bill_description'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbillrequest', |
||||
name='company', |
||||
field=models.CharField(choices=[(b'lms', b'http://lms.ru/'), (b'skillbox', b'http://skill-box.ru/')], default=b'lms', max_length=255, verbose_name='\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 16:52 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0002_bill_description'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbillrequest', |
||||
name='company', |
||||
field=models.CharField(choices=[(b'lms', b'http://lms.ru/'), (b'skillbox', b'http://skill-box.ru/')], default=b'lms', max_length=255, verbose_name='\u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f'), |
||||
), |
||||
] |
||||
|
||||
@ -1,30 +1,30 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 17:00 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0003_selfbillrequest_company'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='day_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='month_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043c\u0435\u0441\u044f\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='week_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 17:00 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0003_selfbillrequest_company'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='day_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0434\u043d\u0435\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='month_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043c\u0435\u0441\u044f\u0447\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='week_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u044f'), |
||||
), |
||||
] |
||||
|
||||
@ -1,28 +1,28 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:27 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0004_auto_20160414_1700'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='SelfBillDesign', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')), |
||||
('logo', models.ImageField(upload_to=b'self', verbose_name='\u041b\u043e\u0433\u043e\u0442\u0438\u043f')), |
||||
('background', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
'verbose_name_plural': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
}, |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:27 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0004_auto_20160414_1700'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='SelfBillDesign', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('name', models.CharField(max_length=255, verbose_name='\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438')), |
||||
('logo', models.ImageField(upload_to=b'self', verbose_name='\u041b\u043e\u0433\u043e\u0442\u0438\u043f')), |
||||
('background', models.CharField(max_length=255, verbose_name='\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
'verbose_name_plural': '\u0414\u0438\u0437\u0430\u0439\u043d \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', |
||||
}, |
||||
), |
||||
] |
||||
|
||||
@ -1,25 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:30 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0005_selfbilldesign'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='selfbillrequest', |
||||
name='company', |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillrequest', |
||||
name='design', |
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:30 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0005_selfbilldesign'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='selfbillrequest', |
||||
name='company', |
||||
), |
||||
migrations.AddField( |
||||
model_name='selfbillrequest', |
||||
name='design', |
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u041e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u0435'), |
||||
), |
||||
] |
||||
|
||||
@ -1,25 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:41 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0006_auto_20160414_1930'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterModelOptions( |
||||
name='selfbilldesign', |
||||
options={'verbose_name': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430'}, |
||||
), |
||||
migrations.AlterField( |
||||
model_name='selfbillrequest', |
||||
name='design', |
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:41 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0006_auto_20160414_1930'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterModelOptions( |
||||
name='selfbilldesign', |
||||
options={'verbose_name': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430', 'verbose_name_plural': '\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0447\u0435\u0442\u0430'}, |
||||
), |
||||
migrations.AlterField( |
||||
model_name='selfbillrequest', |
||||
name='design', |
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='finance.SelfBillDesign', verbose_name='\u0411\u0435\u043d\u0435\u0444\u0438\u0446\u0438\u0430\u0440'), |
||||
), |
||||
] |
||||
|
||||
@ -1,22 +1,22 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:44 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('finance', '0007_auto_20160414_1941'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbilldesign', |
||||
name='users', |
||||
field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u043f\u043b\u0430\u0442\u0435\u0436\u0430\u0445'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 19:44 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('finance', '0007_auto_20160414_1941'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbilldesign', |
||||
name='users', |
||||
field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e \u043f\u043b\u0430\u0442\u0435\u0436\u0430\u0445'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 20:30 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0008_selfbilldesign_users'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='new_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-14 20:30 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0008_selfbilldesign_users'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbillhistory', |
||||
name='new_sent', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-28 14:15 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0009_selfbillhistory_new_sent'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbilldesign', |
||||
name='pay_id', |
||||
field=models.IntegerField(default=0, max_length=255, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-04-28 14:15 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0009_selfbillhistory_new_sent'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='selfbilldesign', |
||||
name='pay_id', |
||||
field=models.IntegerField(default=0, max_length=255, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'), |
||||
), |
||||
] |
||||
|
||||
@ -1,26 +1,26 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 17:48 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0024_auto_20160505_1748'), |
||||
('finance', '0010_selfbilldesign_pay_id'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='included', |
||||
field=models.ManyToManyField(null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='selfbilldesign', |
||||
name='pay_id', |
||||
field=models.IntegerField(blank=True, default=0, help_text='ID \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 - \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f "1501".\u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e, \u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 17:48 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('courses', '0024_auto_20160505_1748'), |
||||
('finance', '0010_selfbilldesign_pay_id'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='included', |
||||
field=models.ManyToManyField(null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='selfbilldesign', |
||||
name='pay_id', |
||||
field=models.IntegerField(blank=True, default=0, help_text='ID \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 - \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f "1501".\u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e, \u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438'), |
||||
), |
||||
] |
||||
|
||||
@ -1,25 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 20:09 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0011_auto_20160505_1748'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='by_time', |
||||
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='included', |
||||
field=models.ManyToManyField(blank=True, help_text='\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430', null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 20:09 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0011_auto_20160505_1748'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='by_time', |
||||
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='included', |
||||
field=models.ManyToManyField(blank=True, help_text='\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u0430', null=True, to='courses.CourseMap', verbose_name='\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u044b'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 20:35 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0012_auto_20160505_2009'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='by_time', |
||||
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-05 20:35 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0012_auto_20160505_2009'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='by_time', |
||||
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-06 13:03 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0013_auto_20160505_2035'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='by_time', |
||||
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-06 13:03 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0013_auto_20160505_2035'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='by_time', |
||||
field=models.IntegerField(blank=True, default=0, help_text='\u041f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.', null=True, verbose_name='\u0414\u043d\u0435\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-09 17:10 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0014_auto_20160506_1303'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='key', |
||||
field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.5 on 2016-05-09 17:10 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0014_auto_20160506_1303'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='key', |
||||
field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,25 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-24 12:55 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0015_price_key'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='flex', |
||||
field=models.BooleanField(default=False, verbose_name='\u041e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='key', |
||||
field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-24 12:55 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0015_price_key'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='flex', |
||||
field=models.BooleanField(default=False, verbose_name='\u041e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='key', |
||||
field=models.CharField(blank=True, editable=False, max_length=255, null=True, verbose_name='\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,19 +1,19 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-24 12:58 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0016_auto_20160524_1255'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='price', |
||||
name='flex', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-24 12:58 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0016_auto_20160524_1255'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='price', |
||||
name='flex', |
||||
), |
||||
] |
||||
|
||||
@ -1,117 +1,117 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-31 12:56 |
||||
from __future__ import unicode_literals |
||||
|
||||
import datetime |
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('finance', '0017_remove_price_flex'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Installment', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('price', models.IntegerField(verbose_name='\u041e\u0431\u0449\u0430\u044f \u0446\u0435\u043d\u0430')), |
||||
('first_price', models.IntegerField(default=0, verbose_name='\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436')), |
||||
('period', models.IntegerField(default=5, verbose_name='\u041c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443')), |
||||
('date', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f')), |
||||
('f_date', models.DateField(blank=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f')), |
||||
('rest', models.IntegerField(default=0, verbose_name='\u041e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u043e \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')), |
||||
('wait', models.IntegerField(default=0, help_text='\u0427\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438', verbose_name='\u0414\u043d\u0435\u0439 \u0432 \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')), |
||||
('expired', models.BooleanField(default=False, verbose_name='\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043e')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430', |
||||
'verbose_name_plural': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='selfbilldesign', |
||||
name='users', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='selfbillhistory', |
||||
name='request', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='selfbillrequest', |
||||
name='design', |
||||
), |
||||
migrations.AlterModelOptions( |
||||
name='price', |
||||
options={'ordering': ['-id'], 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438'}, |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='_method', |
||||
field=models.CharField(choices=[(b'H', '\u0412 \u0420\u0443\u0447\u043d\u0443\u044e'), (b'S', 'SimplePay'), (b'A1', '\u0410\u043b\u044c\u0444\u0430\u0411\u0430\u043d\u043a'), (b'A2', '\u0410\u043b\u044c\u0431\u0430\u0411\u0430\u043d\u043a c \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u043e\u0439')], default=b'H', max_length=2, verbose_name='\u0421\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='_type', |
||||
field=models.CharField(choices=[(b'I', '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), (b'F', '\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436'), (b'S', '\u0423\u0441\u043b\u0443\u0433\u0430')], default=b'S', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043b\u0430\u0442\u0435\u0436\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='gift', |
||||
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u0434\u0430\u0440\u043e\u043a'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='price', |
||||
field=models.CharField(default=0, max_length=255, verbose_name='\u0421\u0443\u043c\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='freepay', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0447\u0435\u0442'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='course', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='title', |
||||
field=models.CharField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430'), |
||||
), |
||||
migrations.DeleteModel( |
||||
name='SelfBillDesign', |
||||
), |
||||
migrations.DeleteModel( |
||||
name='SelfBillHistory', |
||||
), |
||||
migrations.DeleteModel( |
||||
name='SelfBillRequest', |
||||
), |
||||
migrations.AddField( |
||||
model_name='installment', |
||||
name='initiative', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u0418\u043d\u0438\u0430\u0446\u0438\u0430\u0442\u0438\u0432\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='installment', |
||||
name='payments', |
||||
field=models.ManyToManyField(blank=True, null=True, related_name='bill_point', to='finance.Bill', verbose_name='\u041f\u043b\u0430\u0442\u0435\u0436\u0438'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='installment', |
||||
name='user', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='installment', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='installment_point', to='finance.Installment', verbose_name='\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-31 12:56 |
||||
from __future__ import unicode_literals |
||||
|
||||
import datetime |
||||
from django.conf import settings |
||||
from django.db import migrations, models |
||||
import django.db.models.deletion |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
('finance', '0017_remove_price_flex'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.CreateModel( |
||||
name='Installment', |
||||
fields=[ |
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
('price', models.IntegerField(verbose_name='\u041e\u0431\u0449\u0430\u044f \u0446\u0435\u043d\u0430')), |
||||
('first_price', models.IntegerField(default=0, verbose_name='\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436')), |
||||
('period', models.IntegerField(default=5, verbose_name='\u041c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443')), |
||||
('date', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f')), |
||||
('f_date', models.DateField(blank=True, verbose_name='\u0414\u0430\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f')), |
||||
('rest', models.IntegerField(default=0, verbose_name='\u041e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u043e \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')), |
||||
('wait', models.IntegerField(default=0, help_text='\u0427\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438', verbose_name='\u0414\u043d\u0435\u0439 \u0432 \u0437\u0430\u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u0438')), |
||||
('expired', models.BooleanField(default=False, verbose_name='\u041f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043e')), |
||||
], |
||||
options={ |
||||
'verbose_name': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430', |
||||
'verbose_name_plural': '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0438', |
||||
}, |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='selfbilldesign', |
||||
name='users', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='selfbillhistory', |
||||
name='request', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='selfbillrequest', |
||||
name='design', |
||||
), |
||||
migrations.AlterModelOptions( |
||||
name='price', |
||||
options={'ordering': ['-id'], 'verbose_name': '\u0423\u0441\u043b\u0443\u0433\u0430', 'verbose_name_plural': '\u0423\u0441\u043b\u0443\u0433\u0438'}, |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='_method', |
||||
field=models.CharField(choices=[(b'H', '\u0412 \u0420\u0443\u0447\u043d\u0443\u044e'), (b'S', 'SimplePay'), (b'A1', '\u0410\u043b\u044c\u0444\u0430\u0411\u0430\u043d\u043a'), (b'A2', '\u0410\u043b\u044c\u0431\u0430\u0411\u0430\u043d\u043a c \u043f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u043e\u0439')], default=b'H', max_length=2, verbose_name='\u0421\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u043b\u0430\u0442\u044b'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='_type', |
||||
field=models.CharField(choices=[(b'I', '\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), (b'F', '\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u043f\u043b\u0430\u0442\u0435\u0436'), (b'S', '\u0423\u0441\u043b\u0443\u0433\u0430')], default=b'S', max_length=1, verbose_name='\u0422\u0438\u043f \u043f\u043b\u0430\u0442\u0435\u0436\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='gift', |
||||
field=models.BooleanField(default=False, verbose_name='\u041f\u043e\u0434\u0430\u0440\u043e\u043a'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='price', |
||||
field=models.CharField(default=0, max_length=255, verbose_name='\u0421\u0443\u043c\u043c\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='freepay', |
||||
field=models.BooleanField(default=False, editable=False, verbose_name='\u0421\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0447\u0435\u0442'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='course', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='\u041a\u0443\u0440\u0441'), |
||||
), |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='title', |
||||
field=models.CharField(help_text='\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c', max_length=255, verbose_name='\u0423\u0441\u043b\u0443\u0433\u0430'), |
||||
), |
||||
migrations.DeleteModel( |
||||
name='SelfBillDesign', |
||||
), |
||||
migrations.DeleteModel( |
||||
name='SelfBillHistory', |
||||
), |
||||
migrations.DeleteModel( |
||||
name='SelfBillRequest', |
||||
), |
||||
migrations.AddField( |
||||
model_name='installment', |
||||
name='initiative', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.Price', verbose_name='\u0418\u043d\u0438\u0430\u0446\u0438\u0430\u0442\u0438\u0432\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='installment', |
||||
name='payments', |
||||
field=models.ManyToManyField(blank=True, null=True, related_name='bill_point', to='finance.Bill', verbose_name='\u041f\u043b\u0430\u0442\u0435\u0436\u0438'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='installment', |
||||
name='user', |
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='installment', |
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='installment_point', to='finance.Installment', verbose_name='\u0420\u0430\u0441\u0441\u0440\u043e\u0447\u043a\u0430'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-31 13:00 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0018_auto_20160531_1256'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='url', |
||||
field=models.URLField(blank=True, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-31 13:00 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0018_auto_20160531_1256'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AddField( |
||||
model_name='price', |
||||
name='url', |
||||
field=models.URLField(blank=True, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'), |
||||
), |
||||
] |
||||
|
||||
@ -1,20 +1,20 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-31 13:03 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0019_price_url'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='url', |
||||
field=models.URLField(blank=True, editable=False, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-05-31 13:03 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0019_price_url'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.AlterField( |
||||
model_name='price', |
||||
name='url', |
||||
field=models.URLField(blank=True, editable=False, null=True, verbose_name='\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u043b\u0430\u0442\u0443'), |
||||
), |
||||
] |
||||
|
||||
@ -1,34 +1,34 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-06-01 13:09 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0020_auto_20160531_1303'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='bill', |
||||
name='key', |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='pay_key', |
||||
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043b\u0430\u0442\u0435\u0436\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='result_key', |
||||
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='success_key', |
||||
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f'), |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-06-01 13:09 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations, models |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0020_auto_20160531_1303'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RemoveField( |
||||
model_name='bill', |
||||
name='key', |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='pay_key', |
||||
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043b\u0430\u0442\u0435\u0436\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='result_key', |
||||
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430'), |
||||
), |
||||
migrations.AddField( |
||||
model_name='bill', |
||||
name='success_key', |
||||
field=models.CharField(blank=True, default=b'', max_length=255, verbose_name='\u041a\u043b\u044e\u0447 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f'), |
||||
), |
||||
] |
||||
|
||||
@ -1,28 +1,28 @@ |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-06-01 13:20 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0021_auto_20160601_1309'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RenameField( |
||||
model_name='bill', |
||||
old_name='pay_key', |
||||
new_name='key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='bill', |
||||
name='result_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='bill', |
||||
name='success_key', |
||||
), |
||||
] |
||||
# -*- coding: utf-8 -*- |
||||
# Generated by Django 1.9.2 on 2016-06-01 13:20 |
||||
from __future__ import unicode_literals |
||||
|
||||
from django.db import migrations |
||||
|
||||
|
||||
class Migration(migrations.Migration): |
||||
|
||||
dependencies = [ |
||||
('finance', '0021_auto_20160601_1309'), |
||||
] |
||||
|
||||
operations = [ |
||||
migrations.RenameField( |
||||
model_name='bill', |
||||
old_name='pay_key', |
||||
new_name='key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='bill', |
||||
name='result_key', |
||||
), |
||||
migrations.RemoveField( |
||||
model_name='bill', |
||||
name='success_key', |
||||
), |
||||
] |
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue