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.
# Official docker image.
#image: docker:latest
#services:
# - docker:dind
image: docker:latest
services:
- docker:dind
variables:
CHANNEL: "skillbox"
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)
mentors = models.ManyToManyField(User, verbose_name=u'Кураторы', null=True, blank=True, related_name='course_mentors')
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)
description = RedactorField(verbose_name=u'Описание', 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
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))
super(Course, self).save(*args, **kwargs)
@ -234,7 +227,6 @@ class CourseTheme(models.Model):
empty = models.BooleanField(verbose_name=u'Ты не пройдешь!',
help_text=u'Заблокировать дальнейшее прохождение курса. Из-за того, '
u'что курс не заполнен или что-то вроде того.', default=False)
empty_old = models.BooleanField(verbose_name=u'Для проверки галочки', default=False)
def __unicode__(self):
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()
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():
# Переформировать порядок
test_in = self.sort + 1
@ -684,14 +669,6 @@ class CourseMap(models.Model):
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):
try:
_next = CourseMap.objects.get(course=self.course, sort=self.sort - 1)

@ -45,9 +45,12 @@ def course(request, slug):
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()
_j = _map.get_obj()
if _map._type == 'H':
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:
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
if request.user.is_authenticated() and not request.user.is_admin:
try:
bill = Bill.objects.get(
bills = Bill.objects.filter(
service__course=course, user=request.user, status='F')
if bill.flow:
flow = bill.flow.get_status()
start_flow = bill.flow.start_flow
for bill in bills:
if bill.flow:
flow = bill.flow.get_status()
start_flow = bill.flow.start_flow
except Bill.DoesNotExist:
pass

@ -414,15 +414,6 @@ class CourseThemeJ(models.Model):
p.save()
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):
if not self.parent:
self.parent = self.get_parent()
@ -437,8 +428,11 @@ class CourseThemeJ(models.Model):
elif actual_lesson != self.actual_lesson.id:
self.actual_lesson = Lesson.objects.get(id=self.make_actual_lesson())
if self.check_lessons():
self.success = True
if LessonJ.objects.filter(parent=self, student=self.student).exists():
if LessonJ.objects.filter(parent=self, student=self.student, success=False).exists():
self.success = False
else:
self.success = True
if self.set_open:
if Lesson.objects.filter(theme=self.material).order_by('sort').exists():
@ -591,9 +585,7 @@ class LessonJ(models.Model):
if _type == 'L':
obj = LessonJ
elif _type == 'H':
_before = CourseMap.objects.get(token=_before.token)
_type, _before = _before.get_lesson_before()
obj = LessonJ
obj = HomeworkJ
elif _type == 'E':
obj = ExamJ

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

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

@ -10,7 +10,7 @@ from finance.models import Bill
from courses.templates import comment_fabric
from library.models import Article
from management.reports import get_now_success_hw, get_second_success_hw
from django.http import HttpResponse
def sortByTimeStamp(inputStr):
return inputStr['sort']
@ -154,3 +154,9 @@ def new_reports(request):
@response_decor(template='contacts.html', without_auth=True)
def contacts(request):
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 management.letters import sent_new_bill, sent_clean_letter, send_burning_course_letter
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)
def self_sent_letter(request, context):
@ -172,3 +173,115 @@ def burning_course(request):
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/now_success_hw/$', reports.now_success_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 courses.models import Course, CourseTheme
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')
def super_bill(request):
@ -129,3 +131,46 @@ def progress_report(request):
'journals': []}
map.append(c)
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(){
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').fadeIn('fast');
var theForm = $(document.forms['registration_form']).serialize();
console.log(theForm)
$.ajax({
type: 'POST',
url: '/access/registration/',
@ -120,6 +128,7 @@ function registry_go(){
console.log('Возникла ошибка registry_go(): ' + str);
}
});
}
}
function registry_go2(){

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

@ -8,7 +8,7 @@ from lms.decors import api_decor
from lms.tools import translit
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):

@ -137,7 +137,7 @@ class CroppedImage(models.Model):
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):

@ -301,6 +301,10 @@
</li>
</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;">
<i class="glyphicon glyphicon-copyright-mark"></i> {% now "Y" %}
<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 }}">
{% if i.head.lessons_length > 0 %}
{% 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 %}
<a href="#">
{% endif %}
@ -143,10 +143,14 @@
<span style="float: left; margin: 5px 7px 0 0;">
{% if i.head.lessons_length > 0 %}
{% if i.head.button %}
{% if flow or flow == None %}
<a name="theme{{ i.head.mid }}" 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 %}
<a style="cursor: default;border-bottom: 0;">
{% endif %}
{% else %}
<a style="cursor: default;border-bottom: 0;">
{% endif %}
@ -163,7 +167,7 @@
{{ i.head.title|safe }}
</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;">
{{ i.head.status.title }}<i class="{{ i.head.status.icon }}" style="margin-right: 5px; margin-left: 10px;"></i>
</span>
@ -192,12 +196,17 @@
<ul style="padding: 0 0 0 15px;">
{% for lesson in i.lessons %}
<li style=" padding-bottom: 3px;">
{% if flow or flow == None %}
<a href="{{ lesson.button.link }}{{ lesson.button.id }}" by_type="{{ lesson.button.by_type }}"
self_id="{{ lesson.button.id }}" course_id="{{ lesson.button.course }}"
style="border-bottom: 1px dotted #333;color: #333;">
{{ lesson.title|safe }}
<span class="label font-normal text-white bg-{{ lesson.status.color }}"><i class="{{ lesson.status.icon }}"></i></span>
</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>
{% endfor %}
</ul>
@ -280,7 +289,7 @@
{% if i.head.button %}
<div style="clear: both; width: 100%; margin-top: 10px;">
{% 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"
style="background: {{ i.head.button.background }}; color: {{ i.head.button.color }}"
by_type="{{ i.head.button.by_type }}"
@ -289,6 +298,13 @@
{{ i.head.button.title }}
</button>
</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 %}
</div>
{% endif %}
@ -332,6 +348,23 @@
});
$('[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'){
$('#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 %}
<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 %}>
{% endcomment %}
<a href="/courses/{{ i.slug }}">
<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 }};">
<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="password2" style="box-sizing: border-box;"><br>
<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>
<a href="#" data-toggle="modal" data-target="#myModal1" data-dismiss="modal" aria-label="Close" class="wht js-open-modal">Я уже зарегистрирован</a>

Loading…
Cancel
Save