Merge branch 'develop' into 'master'

Develop

See merge request !36
remotes/origin/pm_task_31703
Zolotarev Alexander 9 years ago
commit 4005e008ca
  1. 6
      .gitlab-ci.yml
  2. 38
      courses/migrations/0046_auto_20170711_1704.py
  3. 19
      courses/migrations/0047_remove_course_public_old.py
  4. 23
      courses/models.py
  5. 18
      courses/views.py
  6. 20
      journals/models.py
  7. 4
      lms/settings.py
  8. 2
      lms/urls.py
  9. 8
      lms/views.py
  10. 115
      management/api.py
  11. 5
      management/forms.py
  12. 9
      management/urls.py
  13. 47
      management/views.py
  14. BIN
      oferta.pdf
  15. 9
      static/js/apis/access.js
  16. 31
      static/js/apis/activation.js
  17. 2
      storage/files_api.py
  18. 2
      storage/models.py
  19. 4
      templates/activation.html
  20. 238
      templates/cabinet.html
  21. 39
      templates/course.html
  22. 14
      templates/diplomscab.html
  23. 3
      templates/index.html
  24. 4
      templates/no_auth_modals.html

@ -1,8 +1,8 @@
# This file is a template, and might need editing before it works on your project. # This file is a template, and might need editing before it works on your project.
# Official docker image. # Official docker image.
#image: docker:latest image: docker:latest
#services: services:
# - docker:dind - docker:dind
variables: variables:
CHANNEL: "skillbox" CHANNEL: "skillbox"
SERVER_URL: "lms.test.spicycms.com" SERVER_URL: "lms.test.spicycms.com"

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2017-07-11 17:04
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('courses', '0045_merge'),
]
operations = [
migrations.CreateModel(
name='Flow',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='Название')),
('description', models.TextField(blank=True, default='', null=True, verbose_name='Описание')),
('start_flow', models.DateTimeField(default=datetime.datetime.now, verbose_name='Дата начала потока')),
('created', models.DateTimeField(default=datetime.datetime.now, editable=False, verbose_name='Создан')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Изменен')),
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Course', verbose_name='Курс')),
],
options={
'ordering': ['-modified'],
'verbose_name_plural': 'Потоки',
'verbose_name': 'Поток',
},
),
migrations.RemoveField(
model_name='coursetheme',
name='empty_old',
),
]

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2017-07-11 17:09
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('courses', '0046_auto_20170711_1704'),
]
operations = [
migrations.RemoveField(
model_name='course',
name='public_old',
),
]

@ -77,7 +77,6 @@ class Course(models.Model):
direction = models.ForeignKey(MaterialDirection, verbose_name=u'Направление', null=True) direction = models.ForeignKey(MaterialDirection, verbose_name=u'Направление', null=True)
mentors = models.ManyToManyField(User, verbose_name=u'Кураторы', null=True, blank=True, related_name='course_mentors') mentors = models.ManyToManyField(User, verbose_name=u'Кураторы', null=True, blank=True, related_name='course_mentors')
public = models.BooleanField(verbose_name=u'Опубликовать', default=False) public = models.BooleanField(verbose_name=u'Опубликовать', default=False)
public_old = models.BooleanField(verbose_name=u'Старый статус', default=False)
title = models.CharField(verbose_name=u"Заголовок", max_length=255) title = models.CharField(verbose_name=u"Заголовок", max_length=255)
description = RedactorField(verbose_name=u'Описание', blank=True) description = RedactorField(verbose_name=u'Описание', blank=True)
image = models.ImageField(verbose_name=u'Изображение', upload_to='course', blank=True) image = models.ImageField(verbose_name=u'Изображение', upload_to='course', blank=True)
@ -206,12 +205,6 @@ class Course(models.Model):
return '/courses/%s' % self.slug return '/courses/%s' % self.slug
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# Костыль для поиска ошибки галочки
if self.public != self.public_old:
log = logging.getLogger('Course_public_change')
log.error('status change')
self.public_old = self.public
#
if not self.slug: self.slug = '{0}'.format(translit(self.title)) if not self.slug: self.slug = '{0}'.format(translit(self.title))
super(Course, self).save(*args, **kwargs) super(Course, self).save(*args, **kwargs)
@ -234,7 +227,6 @@ class CourseTheme(models.Model):
empty = models.BooleanField(verbose_name=u'Ты не пройдешь!', empty = models.BooleanField(verbose_name=u'Ты не пройдешь!',
help_text=u'Заблокировать дальнейшее прохождение курса. Из-за того, ' help_text=u'Заблокировать дальнейшее прохождение курса. Из-за того, '
u'что курс не заполнен или что-то вроде того.', default=False) u'что курс не заполнен или что-то вроде того.', default=False)
empty_old = models.BooleanField(verbose_name=u'Для проверки галочки', default=False)
def __unicode__(self): def __unicode__(self):
return u'%s:%s/%s' % (self.sort, self.course, self.title if self.title else self.get__type_display()) return u'%s:%s/%s' % (self.sort, self.course, self.title if self.title else self.get__type_display())
@ -322,13 +314,6 @@ class CourseTheme(models.Model):
return Homework.objects.filter(theme=self).count() return Homework.objects.filter(theme=self).count()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# Костыль для поиска ошибки смены галочки
if self.empty != self.empty_old:
log = logging.getLogger('Themes_status_change')
log.error('status change')
self.public_old = self.public
# Костыль конец
if CourseTheme.objects.filter(course=self.course, sort=self.sort).exclude(id=self.id).exists(): if CourseTheme.objects.filter(course=self.course, sort=self.sort).exclude(id=self.id).exists():
# Переформировать порядок # Переформировать порядок
test_in = self.sort + 1 test_in = self.sort + 1
@ -684,14 +669,6 @@ class CourseMap(models.Model):
return _next._type, _next.get_obj() return _next._type, _next.get_obj()
def get_lesson_before(self):
try:
_before = CourseMap.objects.get(course=self.course, sort=self.sort - 2)
except CourseMap.DoesNotExist:
_before = CourseMap.objects.get(course=self.course, sort=0)
return _before._type, _before.get_obj()
def get_before(self): def get_before(self):
try: try:
_next = CourseMap.objects.get(course=self.course, sort=self.sort - 1) _next = CourseMap.objects.get(course=self.course, sort=self.sort - 1)

@ -45,9 +45,12 @@ def course(request, slug):
if created: if created:
check_journal(journal) check_journal(journal)
_map = CourseMap.objects.filter(course=course).order_by('sort').first() _map = CourseMap.objects.filter(course=course).order_by('sort').first()
#_j = _map.get_obj() _j = _map.get_obj()
#j = HomeworkJ.objects.get(material=_j, student=request.user) if _map._type == 'H':
#j.open_material() j = HomeworkJ.objects.get(material=_j, student=request.user)
if _map._type == 'L':
j = LessonJ.objects.get(material=_j, student=request.user)
j.open_material()
else: else:
journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user)) journal, created = TeacherJ.objects.get_or_create(course=course, student=user_fabric(request.user))
@ -59,11 +62,12 @@ def course(request, slug):
start_flow = None start_flow = None
if request.user.is_authenticated() and not request.user.is_admin: if request.user.is_authenticated() and not request.user.is_admin:
try: try:
bill = Bill.objects.get( bills = Bill.objects.filter(
service__course=course, user=request.user, status='F') service__course=course, user=request.user, status='F')
if bill.flow: for bill in bills:
flow = bill.flow.get_status() if bill.flow:
start_flow = bill.flow.start_flow flow = bill.flow.get_status()
start_flow = bill.flow.start_flow
except Bill.DoesNotExist: except Bill.DoesNotExist:
pass pass

@ -414,15 +414,6 @@ class CourseThemeJ(models.Model):
p.save() p.save()
return p return p
def check_lessons(self):
""" Проверка уроков темы на статус. Если сдано - сдана тема"""
for lessonj in LessonJ.objects.filter(parent=self, student=self.student):
if lessonj.success == False:
return False
return True
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.parent: if not self.parent:
self.parent = self.get_parent() self.parent = self.get_parent()
@ -437,8 +428,11 @@ class CourseThemeJ(models.Model):
elif actual_lesson != self.actual_lesson.id: elif actual_lesson != self.actual_lesson.id:
self.actual_lesson = Lesson.objects.get(id=self.make_actual_lesson()) self.actual_lesson = Lesson.objects.get(id=self.make_actual_lesson())
if self.check_lessons(): if LessonJ.objects.filter(parent=self, student=self.student).exists():
self.success = True if LessonJ.objects.filter(parent=self, student=self.student, success=False).exists():
self.success = False
else:
self.success = True
if self.set_open: if self.set_open:
if Lesson.objects.filter(theme=self.material).order_by('sort').exists(): if Lesson.objects.filter(theme=self.material).order_by('sort').exists():
@ -591,9 +585,7 @@ class LessonJ(models.Model):
if _type == 'L': if _type == 'L':
obj = LessonJ obj = LessonJ
elif _type == 'H': elif _type == 'H':
_before = CourseMap.objects.get(token=_before.token) obj = HomeworkJ
_type, _before = _before.get_lesson_before()
obj = LessonJ
elif _type == 'E': elif _type == 'E':
obj = ExamJ obj = ExamJ

@ -65,6 +65,10 @@ YANDEX_SHOP_ID = '84348'
YANDEX_scid = '78309' YANDEX_scid = '78309'
# Application definition # Application definition
# место куда сохраняем пользовательские файлы
PERSONAL_FILES = '/personal_files/'
INSTALLED_APPS = [ INSTALLED_APPS = [
#'jet.dashboard', #'jet.dashboard',
#'jet', #'jet',

@ -6,8 +6,10 @@ from lms import views
from lms import settings from lms import settings
from access.views import profile_view from access.views import profile_view
urlpatterns = [ urlpatterns = [
url(r'^$', views.index), url(r'^$', views.index),
url(r'^oferta/', views.show_oferta),
url(r'^test/$', views.test), url(r'^test/$', views.test),
url(r'^all_comments/$', views.all_comments), url(r'^all_comments/$', views.all_comments),
url(r'^reports/$', views.new_reports), url(r'^reports/$', views.new_reports),

@ -10,7 +10,7 @@ from finance.models import Bill
from courses.templates import comment_fabric from courses.templates import comment_fabric
from library.models import Article from library.models import Article
from management.reports import get_now_success_hw, get_second_success_hw from management.reports import get_now_success_hw, get_second_success_hw
from django.http import HttpResponse
def sortByTimeStamp(inputStr): def sortByTimeStamp(inputStr):
return inputStr['sort'] return inputStr['sort']
@ -154,3 +154,9 @@ def new_reports(request):
@response_decor(template='contacts.html', without_auth=True) @response_decor(template='contacts.html', without_auth=True)
def contacts(request): def contacts(request):
return {} return {}
def show_oferta(request):
with open('oferta.pdf', 'rb') as pdf:
response = HttpResponse(pdf.read(), content_type='application/pdf')
response['Content-Disposition'] = 'filename=oferta.pdf'
return response

@ -7,7 +7,8 @@ from lms.tools import out_date_format, condition_factory, user_fabric
from finance.models import Price, Bill, ServiceRequest from finance.models import Price, Bill, ServiceRequest
from management.letters import sent_new_bill, sent_clean_letter, send_burning_course_letter from management.letters import sent_new_bill, sent_clean_letter, send_burning_course_letter
from management.models import News, Feedback, Comment from management.models import News, Feedback, Comment
from courses.models import Course, CourseTheme
from journals.models import TeacherJ, CourseThemeJ, LessonJ, HomeworkJ
@api_decor(without_auth=False, need_keys=['title', 'content', 'to'], method='POST', check_request=True) @api_decor(without_auth=False, need_keys=['title', 'content', 'to'], method='POST', check_request=True)
def self_sent_letter(request, context): def self_sent_letter(request, context):
@ -172,3 +173,115 @@ def burning_course(request):
send_burning_course_letter(user, course) send_burning_course_letter(user, course)
"""
Все функции снизу используются в подобии кабинета для отдела по работе с персоналом.
Если хочешь переписать - перепиши.
"""
@api_decor(without_auth=False)
def find_user(request, context):
try:
user = User.objects.get(id=request.GET['user'])
data = "%s | %s %s" % (user.id, user.name, user.fname)
except User.DoesNotExist:
data = '0'
except ValueError:
data = '0'
return data
@api_decor(without_auth=False)
def find_course(request, context):
try:
course = Course.objects.get(id=request.GET['course'])
data = course.title
except Course.DoesNotExist:
data = '0'
except ValueError:
data = '0'
return data
@api_decor(without_auth=False)
def open_lessons(request, context):
try:
user = User.objects.get(id=request.GET['user'])
course = Course.objects.get(id=request.GET['course'])
checkbox = True if request.GET.get('homes') == 'on' else False
themes = request.GET['themes'].split(' ')
if '' in themes:
themes.remove('')
for t in themes:
t = int(t)
except Exception:
return '0'
try:
teachj, status = TeacherJ.objects.get_or_create(student=user, course=course)
if themes:
course_themes = CourseTheme.objects.filter(course=course, sort__in=themes)
else:
course_themes = CourseTheme.objects.filter(course=course)
for t in course_themes:
for l in LessonJ.objects.filter(student=user, parent__material=t):
l.success = True
l.save()
if open_homes:
if HomeworkJ.objects.filter(student=user, parent__material=t).exists():
homej = HomeworkJ.objects.get(student=user, parent__material=t)
homej.success = True
homej.save()
themej, status = CourseThemeJ.objects.get_or_create(student=user, material=t)
themej.success = True
themej.save()
teachj.reload_progress()
except Exception:
return '1'
return '2'
@api_decor(without_auth=False)
def open_homes(request, context):
try:
user = User.objects.get(id=request.GET['user'])
course = Course.objects.get(id=request.GET['course'])
themes = request.GET['themes'].split(' ')
if '' in themes:
themes.remove('')
for t in themes:
t = int(t)
except Exception:
return'0'
try:
if themes:
course_themes = CourseTheme.objects.filter(course=course, sort__in=themes)
else:
course_themes = CourseTheme.objects.filter(course=course)
for t in course_themes:
if HomeworkJ.objects.filter(student=user, parent__material=t).exists():
homej = HomeworkJ.objects.get(student=user, parent__material=t)
homej.success = True
homej.save()
except Exception:
return '1'
return '2'
@api_decor(without_auth=False)
def change_pass(request, context):
try:
user = User.objects.get(id=request.GET['user'])
password = request.GET.get('pass')
except Exception:
return '0'
try:
user.set_password(password)
user.save()
except Exception:
return '1'
return '2'

@ -0,0 +1,5 @@
from django import forms
class UploadFileForm(forms.Form):
service_id = forms.CharField(max_length=50, label=u'id услуги')
file = forms.FileField()

@ -36,5 +36,12 @@ urlpatterns = [
url(r'reports_api/get_process_report/$', reports.get_process_report), url(r'reports_api/get_process_report/$', reports.get_process_report),
url(r'reports_api/now_success_hw/$', reports.now_success_hw), url(r'reports_api/now_success_hw/$', reports.now_success_hw),
url(r'reports_api/now_second_hw/$', reports.now_second_hw), url(r'reports_api/now_second_hw/$', reports.now_second_hw),
url(r'self_sent_letter/$', api.self_sent_letter) url(r'self_sent_letter/$', api.self_sent_letter),
url(r'workcabinet/$', views.render_management_cabinet),
url(r'diplomscabinet/$', views.render_diplom_cabinet),
url(r'find_user/$', api.find_user),
url(r'find_course/$', api.find_course),
url(r'open_lessons/$', api.open_lessons),
url(r'open_homes/$', api.open_homes),
url(r'change_pass/$', api.change_pass),
] ]

@ -9,7 +9,9 @@ from finance.models import Bill, ServiceRequest, Price
from management.models import News, Faq, FaqTitle from management.models import News, Faq, FaqTitle
from courses.models import Course, CourseTheme from courses.models import Course, CourseTheme
from management.reports import get_now_success_hw, get_second_success_hw from management.reports import get_now_success_hw, get_second_success_hw
from access.models import User
from finance.models import Bill, Price
from .forms import UploadFileForm
@response_decor(template='super_bill.html') @response_decor(template='super_bill.html')
def super_bill(request): def super_bill(request):
@ -129,3 +131,46 @@ def progress_report(request):
'journals': []} 'journals': []}
map.append(c) map.append(c)
return {'map': map, 'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()} return {'map': map, 'get_now_success_hw': get_now_success_hw(), 'get_second_success_hw': get_second_success_hw()}
@response_decor(template='cabinet.html')
def render_management_cabinet(request):
if request.user.in_role != 'A':
raise Http404
else:
courses = Course.objects.filter(hidden=False).order_by('id')
return {'courses': courses}
@response_decor(template='diplomscab.html')
def render_diplom_cabinet(request):
context = {}
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
for l in request.FILES['file'].readlines():
try:
user = User.objects.get(email=l.rstrip().lower())
except User.DoesNotExist:
context['error'] = 'Плохая почта %s' % l
try:
data = form.cleaned_data
id_ = int(data['service_id'])
service = Price.objects.get(id=id_)
bill = Bill.objects.create(user=user, status='F', service=service)
bill.save()
except Exception:
context['error'] = 'Не получилось создать счет для %s' % l
context['form'] = form
return context
else:
form = UploadFileForm()
context['form'] = form
return context

Binary file not shown.

@ -95,9 +95,17 @@ function forgot(){
}) })
} }
function registry_go(){ function registry_go(){
if ($('#checkBox').prop('checked') != true){
console.log('NOT PASS')
$('#error_registration').html('Перед регистрацией ознакомтесь с договором-оферты');
$('#error_registration').fadeIn('fast');
} else {
console.log('PASS')
$('#error_registration').html(''); $('#error_registration').html('');
$('#error_registration').fadeIn('fast'); $('#error_registration').fadeIn('fast');
var theForm = $(document.forms['registration_form']).serialize(); var theForm = $(document.forms['registration_form']).serialize();
console.log(theForm)
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/access/registration/', url: '/access/registration/',
@ -120,6 +128,7 @@ function registry_go(){
console.log('Возникла ошибка registry_go(): ' + str); console.log('Возникла ошибка registry_go(): ' + str);
} }
}); });
}
} }
function registry_go2(){ function registry_go2(){

@ -28,20 +28,27 @@ function sent_step(step){
return result; return result;
} }
function check_step(step){ function check_step(step){
// Проверка данных этапа - > Отправка данных if ($('#checkBox').prop('checked') != true){
var result = sent_step(step); console.log('NOT PASS')
if (result[0]){ $('[name="error"]').html('Перед регистрацией ознакомтесь с договором-оферты');
if (step==3){ $('#error_registration').fadeIn('fast');
final_button()
}
close_step(step);
enable_step(step+1);
} else { } else {
visible_error(step, result[1]['inputs'], result[1]['message']) // Проверка данных этапа - > Отправка данных
var result = sent_step(step);
if (result[0]){
if (step==3){
final_button()
}
close_step(step);
enable_step(step+1);
} else {
visible_error(step, result[1]['inputs'], result[1]['message'])
}
// Если все верно - > Переход на новый уровень
// Если нет - > Подсвечивание полей
//console.log('Получил запрос этапа '+step)
} }
// Если все верно - > Переход на новый уровень
// Если нет - > Подсвечивание полей
//console.log('Получил запрос этапа '+step)
} }
function enable_step(step){ function enable_step(step){
// Активация этапа // Активация этапа

@ -8,7 +8,7 @@ from lms.decors import api_decor
from lms.tools import translit from lms.tools import translit
from storage.models import Storage, CroppedImage, FormatIndex from storage.models import Storage, CroppedImage, FormatIndex
IMAGE_TMP = settings.MEDIA_ROOT + 'tmp/' IMAGE_TMP = settings.MEDIA_ROOT + settings.PERSONAL_FILES
def save_gif(pil_img, path): def save_gif(pil_img, path):

@ -137,7 +137,7 @@ class CroppedImage(models.Model):
verbose_name_plural = u'Картинки' verbose_name_plural = u'Картинки'
IMAGE_TMP = settings.MEDIA_ROOT + 'tmp/' IMAGE_TMP = settings.MEDIA_ROOT + settings.PERSONAL_FILES
def save_resize_image(filename, pil_img, save_field, file_format): def save_resize_image(filename, pil_img, save_field, file_format):

@ -301,6 +301,10 @@
</li> </li>
</ul> </ul>
<div style="width: 570px; margin: auto;">
<input id="checkBox" type="checkbox" style="width: 20px; height: 20px; margin-top: 0px;">
<span>Регистрируясь, вы соглашаетесь с <a href="/oferta">договором-оферты</a></span>
</div>
<p style="text-align: left;margin: 20px auto;width: 530px;"> <p style="text-align: left;margin: 20px auto;width: 530px;">
<i class="glyphicon glyphicon-copyright-mark"></i> {% now "Y" %} <i class="glyphicon glyphicon-copyright-mark"></i> {% now "Y" %}
<span style="float: right;">{{ NAME }}</span> <span style="float: right;">{{ NAME }}</span>

@ -0,0 +1,238 @@
{% extends 'base_index.html' %}
{% block title %}Рабочий кабинет{% endblock %}
{% block content %}
<style type="text/css">
.functions{
width: 500px;
}
.themes, .homes, .password-change, .open-diplom{
width: 600px;
height: auto;
margin-left: 100px;
border: 1px solid #000;
margin-bottom: 5px;
}
.name{
width: 600px;
height: 60px;
line-height: 60px;
color: #0c0c0c;
font-size: 24px;
font-style: bold;
text-align: center;
}
.input-block{
width: 100%;
height: 60px;
}
form{
width: 450px;
margin: auto;
}
input{
float: right;
}
textarea{
float: right;
width: 200px;
height: 300px;
}
.submit{
float: none;
margin-left: 190px;
margin-bottom: 20px;
margin-top: 10px;
}
.responce{
font-size: 16px;
font-style: bold;
}
.courses{
position: absolute;
right: 300px;
top: 70px;
font-size: 18px;
}
</style>
<div class="functions">
<div class="themes">
<div class="name">Открыть уроки</div>
<form id='lessons'>
<div class="input-block">
<span>Введите id пользователя</span>
<input type="text" class="id-user" name='user' required>
<div id='output-user'></div>
</div>
<div class="input-block">
<span>Введите id курса</span>
<input type="text" class="id-course" name="course" required>
<div class="output-course"></div>
</div>
<div class="input-block">
<span>Открыть домашки</span>
<input type="checkbox" id="open-homes" name="homes">
</div>
<div class="input-block">
<span>Отдельные темы</span>
<input type="text" id="themes" name="themes">
</div>
<div class="lresp responce"></div>
<input type="submit" class='submit'>
</form>
</div>
<div class="homes">
<div class="name">Открыть домашки</div>
<form id='homes'>
<div class="input-block">
<span>Введите id пользователя</span>
<input type="text" class="id-user" name="user" required>
<div id='output-user'></div>
</div>
<div class="input-block">
<span>Введите id курса</span>
<input type="text" class="id-course" name="course" required>
<div class="output-course"></div>
</div>
<div class="input-block">
<span>Отдельные темы</span>
<input type="text" id="themes" name="themes">
</div>
<div class="hresp responce"></div>
<input type="submit" class='submit'>
</form>
</div>
<div class="password-change">
<div class="name">Поменять пароль</div>
<form id='pass'>
<div class="input-block">
<span>Введите id пользователя</span>
<input type="text" name="user" class="id-user">
<div id='output-user'></div>
</div>
<div class="input-block">
<span>Введите новый пароль</span>
<input type="text" name="pass">
</div>
<div class="presp responce"></div>
<input type="submit" name="" class='submit'>
</form>
</div>
</div>
<div class="courses">
{% for c in courses %}
<div class="course">{{ c.id }}: {{ c.title }}</div>
{% endfor %}
</div>
<script type="text/javascript">
$('.id-user').on('focusout', function(){
outblock = $(this).next()
value = $(this).val()
console.log(value)
$.ajax({
url: 'find_user/',
type: 'GET',
data: {'user': value },
success: function(data){
console.log(data)
if (data == 0){
$(outblock).html('Пользователь не найден') // передлать элемент
}
else {
$(outblock).html(data)
}
}
})
})
$('.id-course').on('focusout', function(){
value = $(this).val()
outblock = $(this).next()
console.log(outblock)
$.ajax({
url: 'find_course/',
type: 'GET',
data: {'course': value},
success: function(data){
if (data == 0){
$(outblock).html('Курс не найден')
}
else {
$(outblock).html(data)
}
}
})
})
$('#lessons').on('submit', function(event){
event.preventDefault()
data = $(this).serialize()
console.log(data)
$.ajax({
url: 'open_lessons/',
type: 'GET',
data: data,
success: function(data){
console.log(data)
if (data == '0'){
$('.lresp').html('Не получается обработать данные')
}
if (data == '1'){
$('.lresp').html('Ошибка в работе')
}
if (data == '2'){
$('.lresp').html('Уроки открыты')
}
}
})
})
$('#homes').on('submit', function(event){
event.preventDefault()
data = $(this).serialize()
console.log(data)
$.ajax({
url: 'open_homes/',
type: 'GET',
data: data,
success: function(data){
console.log(data)
if (data == 0){
$('.hresp').html('Не получается обработать данные')
}
if (data == 1){
$('.hresp').html('Ошибка в работе')
}
if (data == 2){
$('.hresp').html('Домашки открыты')
}
}
})
})
$('#pass').on('submit', function(event){
event.preventDefault()
data = $(this).serialize()
console.log(data)
$.ajax({
url: 'change_pass/',
type: 'GET',
data: data,
success: function(data){
console.log(data)
if (data == 0){
$('.presp').html('Не получается обработать данные')
}
if (data == 1){
$('.presp').html('Ошибка в работе')
}
if (data == 2){
$('.presp').html('Пароль сменен')
}
}
})
})
</script>
{% endblock %}

@ -118,7 +118,7 @@
<div class="tl-wrap b-{{ i.head.status.color }}"> <div class="tl-wrap b-{{ i.head.status.color }}">
{% if i.head.lessons_length > 0 %} {% if i.head.lessons_length > 0 %}
{% if i.head.button %} {% if i.head.button %}
<a href="{{ i.head.button.link }}{{ i.head.button.id }}" by_type="{{ i.head.button.by_type }}" self_id="{{ i.head.button.id }}" course_id="{{ i.head.button.course }}"> <a {% if flow or flow == None %}href="{{ i.head.button.link }}{{ i.head.button.id }}" by_type="{{ i.head.button.by_type }}" self_id="{{ i.head.button.id }}" course_id="{{ i.head.button.course }}"{% else %}style="cursor: default;border-bottom: 0;"{% endif %}>
{% else %} {% else %}
<a href="#"> <a href="#">
{% endif %} {% endif %}
@ -143,10 +143,14 @@
<span style="float: left; margin: 5px 7px 0 0;"> <span style="float: left; margin: 5px 7px 0 0;">
{% if i.head.lessons_length > 0 %} {% if i.head.lessons_length > 0 %}
{% if i.head.button %} {% if i.head.button %}
{% if flow or flow == None %}
<a name="theme{{ i.head.mid }}" href="{{ i.head.button.link }}{{ i.head.button.id }}" <a name="theme{{ i.head.mid }}" href="{{ i.head.button.link }}{{ i.head.button.id }}"
by_type="{{ i.head.button.by_type }}" by_type="{{ i.head.button.by_type }}"
self_id="{{ i.head.button.id }}" self_id="{{ i.head.button.id }}"
course_id="{{ i.head.button.course }}"> course_id="{{ i.head.button.course }}">
{% else %}
<a style="cursor: default;border-bottom: 0;">
{% endif %}
{% else %} {% else %}
<a style="cursor: default;border-bottom: 0;"> <a style="cursor: default;border-bottom: 0;">
{% endif %} {% endif %}
@ -163,7 +167,7 @@
{{ i.head.title|safe }} {{ i.head.title|safe }}
</a> </a>
{% if i.head.status.flag != 'N' %} {% if i.head.status.flag != 'N' and flow or flow == None %}
<span class="label font-normal text-white bg-{{ i.head.status.color }}" style="margin-left: 10px;"> <span class="label font-normal text-white bg-{{ i.head.status.color }}" style="margin-left: 10px;">
{{ i.head.status.title }}<i class="{{ i.head.status.icon }}" style="margin-right: 5px; margin-left: 10px;"></i> {{ i.head.status.title }}<i class="{{ i.head.status.icon }}" style="margin-right: 5px; margin-left: 10px;"></i>
</span> </span>
@ -192,12 +196,17 @@
<ul style="padding: 0 0 0 15px;"> <ul style="padding: 0 0 0 15px;">
{% for lesson in i.lessons %} {% for lesson in i.lessons %}
<li style=" padding-bottom: 3px;"> <li style=" padding-bottom: 3px;">
{% if flow or flow == None %}
<a href="{{ lesson.button.link }}{{ lesson.button.id }}" by_type="{{ lesson.button.by_type }}" <a href="{{ lesson.button.link }}{{ lesson.button.id }}" by_type="{{ lesson.button.by_type }}"
self_id="{{ lesson.button.id }}" course_id="{{ lesson.button.course }}" self_id="{{ lesson.button.id }}" course_id="{{ lesson.button.course }}"
style="border-bottom: 1px dotted #333;color: #333;"> style="border-bottom: 1px dotted #333;color: #333;">
{{ lesson.title|safe }} {{ lesson.title|safe }}
<span class="label font-normal text-white bg-{{ lesson.status.color }}"><i class="{{ lesson.status.icon }}"></i></span> <span class="label font-normal text-white bg-{{ lesson.status.color }}"><i class="{{ lesson.status.icon }}"></i></span>
</a> </a>
{% else %}
{{ lesson.title|safe }}
<span class="label font-normal text-white bg-{{ lesson.status.color }}"><i class="{{ lesson.status.icon }}"></i></span>
{% endif %}
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
@ -280,7 +289,7 @@
{% if i.head.button %} {% if i.head.button %}
<div style="clear: both; width: 100%; margin-top: 10px;"> <div style="clear: both; width: 100%; margin-top: 10px;">
{% if flow or flow == None %} {% if flow or flow == None %}
<a type="button" href="{{ i.head.button.link }}{{ i.head.button.id }}"> <a type="button" class="flow" href="{{ i.head.button.link }}{{ i.head.button.id }}">
<button class="btn pull-right btn-lg m-b-xs m-r-xs m-t-lg course_button" <button class="btn pull-right btn-lg m-b-xs m-r-xs m-t-lg course_button"
style="background: {{ i.head.button.background }}; color: {{ i.head.button.color }}" style="background: {{ i.head.button.background }}; color: {{ i.head.button.color }}"
by_type="{{ i.head.button.by_type }}" by_type="{{ i.head.button.by_type }}"
@ -289,6 +298,13 @@
{{ i.head.button.title }} {{ i.head.button.title }}
</button> </button>
</a> </a>
{% else %}
<a type="button" class="flow" href="#">
<button class="btn pull-right btn-lg m-b-xs m-r-xs m-t-lg course_button"
style="background: {{ i.head.button.background }}; color: {{ i.head.button.color }}">
{{ i.head.button.title }}
</button>
</a>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
@ -332,6 +348,23 @@
}); });
$('[data-toggle="tooltip"]').tooltip() $('[data-toggle="tooltip"]').tooltip()
// Проверка доступности уроков(старт потока)
// если поток открыт редирект на урок
$('.flow').on('click', function(e){
e.preventDefault();
var path = document.location.pathname;
$.get(path, function(data){
_flow = $(data).find('.flow').attr('href');
if (_flow === '#'){
$('#flowAccess').modal('show');
}
else {
document.location.href = _flow;
}
//console.log(_flow);
});
});
if(flow == 'False'){ if(flow == 'False'){
$('#flowAccess').modal('show'); $('#flowAccess').modal('show');
} }

@ -0,0 +1,14 @@
{% extends 'base_index.html' %}
{% block title %}Рабочий кабинет{% endblock %}
{% block content %}
<div class="name">Массовое открытие дипломов</div>
<form enctype="multipart/form-data" method="post" >
{% csrf_token %}
<table>
{{form.as_table}}
</table>
<div class="errors">{{ ERROR }}</div>
<input type="submit" value="Submit" id="Save"/>
</form>
{% endblock %}

@ -58,7 +58,10 @@
{% for i in courses %} {% for i in courses %}
<div class="col-lg-4 {% if i.by %}bought{% else %}no_bought{% endif %}"> <div class="col-lg-4 {% if i.by %}bought{% else %}no_bought{% endif %}">
{% comment %}
<a {% if i.by_flow or i.by_flow == None %}href="/courses/{{ i.slug }}"{% else %}class="flow" href="#" data-toggle="modal" data-target="#flowAccess"{% endif %}> <a {% if i.by_flow or i.by_flow == None %}href="/courses/{{ i.slug }}"{% else %}class="flow" href="#" data-toggle="modal" data-target="#flowAccess"{% endif %}>
{% endcomment %}
<a href="/courses/{{ i.slug }}">
<div class="panel b-a course_cart " style="overflow: hidden;"> <div class="panel b-a course_cart " style="overflow: hidden;">
<div class="panel-heading no-border index" style="background: {{ i.level.background }};color:{{ i.level.color }};"> <div class="panel-heading no-border index" style="background: {{ i.level.background }};color:{{ i.level.color }};">
<span class="text-lt ">{{ i.level.title }}</span> <span class="text-lt ">{{ i.level.title }}</span>

@ -18,6 +18,10 @@
<input class="padd_bottom" type="password" placeholder="Введите пароль" name="password1" style="box-sizing: border-box;"><br> <input class="padd_bottom" type="password" placeholder="Введите пароль" name="password1" style="box-sizing: border-box;"><br>
<input class="padd_bottom" type="password" placeholder="Подтвердите пароль" name="password2" style="box-sizing: border-box;"><br> <input class="padd_bottom" type="password" placeholder="Подтвердите пароль" name="password2" style="box-sizing: border-box;"><br>
<button class="btn btn-warning btn-lg" onclick="registry_go()" style="box-sizing: border-box;">Зарегистрироваться</button> <button class="btn btn-warning btn-lg" onclick="registry_go()" style="box-sizing: border-box;">Зарегистрироваться</button>
<div>
<input id="checkBox" type="checkbox" style="float: left; width: 20px; height: 20px; margin-right: 10px; margin-top: 0px;">
<span>Регистрируясь, вы соглашаетесь с <a href="/oferta">договором-оферты</a></span>
</div>
</form> </form>
<a href="#" data-toggle="modal" data-target="#myModal1" data-dismiss="modal" aria-label="Close" class="wht js-open-modal">Я уже зарегистрирован</a> <a href="#" data-toggle="modal" data-target="#myModal1" data-dismiss="modal" aria-label="Close" class="wht js-open-modal">Я уже зарегистрирован</a>

Loading…
Cancel
Save