Merge remote-tracking branch 'origin/dev' into dev

remotes/origin/hasaccess
nikita 8 years ago
commit 8262a875df
  1. 2
      project/templates/blocks/footer.html
  2. 23
      project/templates/blocks/social.html
  3. 66
      project/templates/lilcity/about.html
  4. 23
      project/templates/lilcity/index.html
  5. 3
      project/urls.py
  6. 4
      project/views.py
  7. 199
      web/src/components/CourseRedactor.vue
  8. 73
      web/src/components/LessonRedactor.vue
  9. 70
      web/src/js/modules/api.js

@ -9,7 +9,7 @@
<div class="footer__col"> <div class="footer__col">
<div class="footer__title">КОМПАНИЯ</div> <div class="footer__title">КОМПАНИЯ</div>
<nav class="footer__nav"> <nav class="footer__nav">
<a class="footer__link" href="/#about">О нас</a> <a class="footer__link" href="{% url 'about' %}">О нас</a>
<a class="footer__link" href="/#teachers">Преподаватели</a> <a class="footer__link" href="/#teachers">Преподаватели</a>
<a class="footer__link" href="https://blog.lil.school">Блог</a> <a class="footer__link" href="https://blog.lil.school">Блог</a>
<a class="footer__link" href="/#game">Наши приложения</a> <a class="footer__link" href="/#game">Наши приложения</a>

@ -0,0 +1,23 @@
{% load static %}
<div class="main__socials">
<a target="_blank" class="main__social" href="{{ config.SERVICE_INSTAGRAM_URL }}">
<svg class="icon icon-instagram">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-instagram"></use>
</svg>
</a>
<a target="_blank" class="main__social" href="{{ config.SERVICE_TWITTER_URL }}">
<svg class="icon icon-twitter">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-twitter"></use>
</svg>
</a>
<a target="_blank" class="main__social" href="{{ config.SERVICE_FB_URL }}">
<svg class="icon icon-fb">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-fb"></use>
</svg>
</a>
<a target="_blank" class="main__social" href="{{ config.SERVICE_YOUTUBE_URL }}">
<svg class="icon icon-youtube">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-youtube"></use>
</svg>
</a>
</div>

@ -0,0 +1,66 @@
{% extends "templates/lilcity/index.html" %} {% load static %} {% block title %}О школе{% endblock title %} {% block content %} {% load static %}
<div
class="main main_default"
{% if config.MAIN_PAGE_TOP_IMAGE %}
style="background-image: url({{ config.MAIN_PAGE_TOP_IMAGE.url }});"
{% else %}
style="background-image: url({% static 'img/bg-1.jpg' %});"
{% endif %}>
<div class="main__center center">
<div class="main__title">
<a target="_blank" href="http://lil.city/">
<span class="main__bold">Lil City</span>
</a> – компания по разработке комплексных развивающих программ для детей, которые включают в себя книги, приложения, а также
первую образовательную онлайн-платформу креативного мышления
<a target="_blank" href="{% url 'index' %}">
<span class="main__bold">Lil School</span>
</a>.
</div>
</div>
</div>
<div class="section">
<div class="section__center center">
<div class="title title_center">Цели</div>
<div class="text text_lg">
<p>
Мы стремимся развить в детях креативность с раннего возраста, умение думать и анализировать, работать в смешанных техниках
и всевозможными материалами. Каждый урок интересен и уникален.
</p>
<p>
Доступность образования - ещё одна наша цель. Приобретая доступ к урокам на одного ученика, заниматься у экрана можно целыми
семьями. Мы создаём качественный и уникальный продукт для детей из любой точки мира. Для того, чтобы учиться у нас
нужно только желание и интернет. Наши ученики становятся осознанными, уверенными и творческими личностями, способные
решать сложные задачи благодаря воображению.
</p>
</div>
<div class="title title_center">Миссия</div>
<div class="text text_lg">
Для раскрытия творческого потенциала мы создаем благоприятные условия, которые вдохновляют к развитию. Мы формируем необходимую
среду, в которой маленькое семечко способностей и желания рисовать вырастет в могучее дерево безграничного потенциала.
</div>
<div class="title title_center">История</div>
<div class="text text_lg">
<p>
Основатель Lil City Саша Крючкова
<a target="_blank" href="https://instagram.com/sashakru">@sashakru</a> – художник и иллюстратор. В далеком 2006-м, после окончания Пензенского художественного училища, одного
из старейших худ. заведений в России, Саша открыла экспериментальный класс для детей от 2-х лет. После трех месяцев
класс вырос с 5 до 40 человек. Многие родители даже не представляли, на что дети способны при правильном подходе.
Также Саша сотрудничала с крупными издательствами, и на данный момент выпущено более 15 книг с ее иллюстрациями.
</p>
<p>
Позже случился переезд в Вильнюс и
<a target="_blank" href="http://lil.city">разработка приложений для детей</a>. Одним из флагманов стало приложение
<a target="_blank" href="http://lil.city/lilworld">Lil World</a>, ставшее стандартом и своего рода культурой в обработке фото родителями с более чем 20 тысячами хэштегов
<a target="_blank" href="https://www.instagram.com/explore/tags/lilworld/">#lilworld</a>.
</p>
<p>
В итоге опыт в образовании, IT и искусстве дал начало компании Lil City, где все продукты объединены под одним брендом Lil.
</p>
<p>
<a target="_blank" href="{% url 'index' %}">Lil School</a> - это не только онлайн-школа или видео-курсы в записи, это экосистема и комплексный подход в обучении
детей.
</p>
</div>
</div>
{% endblock content %}

@ -54,28 +54,7 @@
{% include "templates/blocks/mixpanel.html" %} {% include "templates/blocks/mixpanel.html" %}
</head> </head>
<body> <body>
<div class="main__socials"> {% include "templates/blocks/social.html" %}
<a target="_blank" class="main__social" href="{{ config.SERVICE_INSTAGRAM_URL }}">
<svg class="icon icon-instagram">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-instagram"></use>
</svg>
</a>
<a target="_blank" class="main__social" href="{{ config.SERVICE_TWITTER_URL }}">
<svg class="icon icon-twitter">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-twitter"></use>
</svg>
</a>
<a target="_blank" class="main__social" href="{{ config.SERVICE_FB_URL }}">
<svg class="icon icon-fb">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-fb"></use>
</svg>
</a>
<a target="_blank" class="main__social" href="{{ config.SERVICE_YOUTUBE_URL }}">
<svg class="icon icon-youtube">
<use xlink:href="{% static 'img/sprite.svg' %}#icon-youtube"></use>
</svg>
</a>
</div>
{% include "templates/blocks/baner.html" %} {% include "templates/blocks/baner.html" %}
<div class="outer js-outer"> <div class="outer js-outer">
{% include "templates/blocks/header.html" %} {% include "templates/blocks/header.html" %}

@ -37,11 +37,12 @@ from apps.payment.views import (
SchoolBuyView, SchoolBuyView,
) )
from .views import IndexView, SchoolSchedulesView from .views import AboutView, IndexView, SchoolSchedulesView
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('auth/', include(('apps.auth.urls', 'lilcity'))), path('auth/', include(('apps.auth.urls', 'lilcity'))),
path('about/', AboutView.as_view(), name='about'),
path('author-request/', AuthorRequestView.as_view(), name='author_request'), path('author-request/', AuthorRequestView.as_view(), name='author_request'),
path('author-request/success/', TemplateView.as_view(template_name='user/become-author-success.html'), name='author-request-success'), path('author-request/success/', TemplateView.as_view(template_name='user/become-author-success.html'), name='author-request-success'),
path('courses/', CoursesView.as_view(), name='courses'), path('courses/', CoursesView.as_view(), name='courses'),

@ -12,6 +12,10 @@ from apps.payment.models import SchoolPayment
User = get_user_model() User = get_user_model()
class AboutView(TemplateView):
template_name = 'templates/lilcity/about.html'
class IndexView(TemplateView): class IndexView(TemplateView):
template_name = 'templates/lilcity/main.html' template_name = 'templates/lilcity/main.html'

@ -12,9 +12,7 @@
</div> </div>
<div v-if="me" class="info__group info__field--light"> <div v-if="me" class="info__group info__field--light">
<div class="info__label">АВТОР</div> <div class="info__label">АВТОР</div>
<div v-if="me.role != ROLE_ADMIN" class="info__value">{{ authorName }}</div> <div class="info__value">{{ authorName }}</div>
<div v-else class="info__value"><lil-select :value.sync="userSelect" :options="users"
placeholder="Выберите автора"/></div>
</div> </div>
</div> </div>
<div class="info__upload upload"> <div class="info__upload upload">
@ -246,8 +244,8 @@
</div> </div>
</form> </form>
<form v-if="viewSection === 'lessons-edit'" @submit.prevent="onLessonSubmit"> <form v-if="viewSection === 'lessons-edit'" @submit.prevent="onLessonSubmit">
<lesson-redactor :lesson.sync="currentLesson" :saving="lessonSaving" :access-token="accessToken" <lesson-redactor :$v="$v" :lesson.sync="currentLesson" :saving.sync="lessonSaving" :access-token="accessToken"
v-on:back="goToLessons"/> v-on:back="goToLessons" />
</form> </form>
</div> </div>
<div v-else> <div v-else>
@ -304,9 +302,9 @@
status: null, status: null,
category: null, category: null,
categorySelect: null, categorySelect: null,
duration: 1, duration: null,
author: null, author: null,
price: 0, price: null,
url: '', url: '',
coverImage: '', coverImage: '',
coverImageId: null, coverImageId: null,
@ -390,6 +388,10 @@
duration: "Продолжительность", duration: "Продолжительность",
category: "Категория", category: "Категория",
}, },
lessonFields: {
title: "Название урока",
short_description: "Описание урока",
},
showErrors: false, showErrors: false,
savingTimeout: null, savingTimeout: null,
savingDebounceTimeout: null, savingDebounceTimeout: null,
@ -435,8 +437,16 @@
required, required,
numeric, numeric,
minValue: minValue(1) minValue: minValue(1)
} },
}, },
currentLesson: {
title: {
required
},
short_description: {
required
},
}
}; };
} }
}, },
@ -541,12 +551,18 @@
}); });
}, },
onLessonSubmit() { onLessonSubmit() {
if(!this.validateLesson()) {
return;
}
this.saveLesson();
},
saveLesson() {
this.lessonSaving = true; this.lessonSaving = true;
const currentLessonId = this.currentLesson.id; const currentLessonId = this.currentLesson.id;
this.currentLesson.course_id = this.course.id; this.currentLesson.course_id = this.course.id;
api.saveLesson(this.currentLesson, this.accessToken) api.saveLesson(this.currentLesson, this.accessToken)
.then((response) => { .then((response) => {
this.lessonSaving = false;
const newLesson = api.convertLessonJson(response.data); const newLesson = api.convertLessonJson(response.data);
newLesson.course_id = this.course.id; newLesson.course_id = this.course.id;
this.currentLesson = newLesson; this.currentLesson = newLesson;
@ -556,13 +572,37 @@
if (this.lessons && Array.isArray(this.lessons)) { if (this.lessons && Array.isArray(this.lessons)) {
this.lessons.forEach((lesson, index) => { this.lessons.forEach((lesson, index) => {
if (newLesson.id === lesson.id) { if (newLesson.id === lesson.id) {
this.$set('lessons', index, newLesson); this.$set(this.lessons, index, newLesson);
} }
}); });
} }
document.getElementById('course-redactor__saving-status').innerText = 'СОХРАНЕНО';
this.savingTimeout = setTimeout(() => {
document.getElementById('course-redactor__saving-status').innerText = '';
}, 2000);
showNotification("success", 'Урок сохранён');
this.goToLessons();
this.lessonSaving = false;
}) })
.catch((err) => { .catch((err) => {
this.lessonSaving = false; this.lessonSaving = false;
//console.error(err);
document.getElementById('course-redactor__saving-status').innerText = 'ОШИБКА';
this.savingTimeout = setTimeout(() => {
document.getElementById('course-redactor__saving-status').innerText = '';
}, 2000);
// alert('Произошло что-то страшное: '+err.toString());
console.log(err);
if(err.response) {
for(let i in err.response.data) {
if(typeof err.response.data[i] === "array") {
showNotification("error", this.lessonFields[i]+": "+err.response.data[i].join(', '));
}
}
}
}); });
}, },
goToLessons() { goToLessons() {
@ -652,15 +692,32 @@
} }
}, },
validate(silent) { validate(silent) {
//console.log('valadte', arguments); console.log('validate', this.$v.$invalid);
this.showErrors = true;
if (this.$v.course.$invalid) {
if(!silent) {
for(let i in this.$v.course) {
if(this.$v.course[i].$invalid) {
showNotification("error", "Ошибка валидации поля "+this.fields[i]);
}
}
}
// showNotification("error", "Заполните все необходимые поля");
return false;
}
return true;
},
validateLesson(silent) {
console.log('validate', this.$v.$invalid);
this.showErrors = true; this.showErrors = true;
if (this.$v.$invalid) { if (this.$v.currentLesson.$invalid) {
if(!silent) { if(!silent) {
for(let i in this.$v.course) { for(let i in this.$v.currentLesson) {
if(this.$v.course[i].$invalid) { if(this.$v.currentLesson[i].$invalid) {
showNotification("error", "Ошибка валидации поля "+this.fields[i]); showNotification("error", "Ошибка валидации поля "+this.lessonFields[i]);
} }
} }
} }
// showNotification("error", "Заполните все необходимые поля"); // showNotification("error", "Заполните все необходимые поля");
return false; return false;
@ -671,13 +728,18 @@
onCoursePreview() { onCoursePreview() {
if(this.course.id) { if(this.course.id) {
let url; let url;
if(this.live) {
url = `/school/lessons/${this.course.id}`; if(this.currentLesson && this.currentLesson.id) {
url = `/lesson/${this.currentLesson.id}`;
} else { } else {
if (this.course.url) { if(this.live) {
url = `/course/${this.course.url}`; url = `/school/lessons/${this.course.id}`;
} else {
if (this.course.url) {
url = `/course/${this.course.url}`;
}
url = `/course/${this.course.id}`;
} }
url = `/course/${this.course.id}`;
} }
let newTab = window.open(url, '_blank'); let newTab = window.open(url, '_blank');
@ -781,12 +843,12 @@
}, 2000); }, 2000);
// alert('Произошло что-то страшное: '+err.toString()); // alert('Произошло что-то страшное: '+err.toString());
//console.log(err.response.data); //console.log(err.response.data);
if(err.response.data) { if(err.response) {
for(let i in err.response.data) { for(let i in err.response.data) {
showNotification("error", this.fields[i]+": "+err.response.data[i].join(', ')); if(typeof err.response.data[i] === "array") {
showNotification("error", this.fields[i] + ": " + err.response.data[i].join(', '));
}
} }
} else {
showNotification("error", "Ошибка "+err.toString());
} }
}); });
}, 500); }, 500);
@ -883,28 +945,28 @@
}); });
} }
let user = api.getCurrentUser(this.accessToken); // let user = api.getCurrentUser(this.accessToken);
promises.push(user); // promises.push(user);
//
user.then((response) => { // user.then((response) => {
if (response.data) { // if (response.data) {
this.me = response.data; // this.me = response.data;
//
if(this.me.role == ROLE_ADMIN) { // if(this.me.role == ROLE_ADMIN) {
api.getUsers({role: [ROLE_AUTHOR,ROLE_ADMIN], page_size: 1000}, this.accessToken) // api.getUsers({role: [ROLE_AUTHOR,ROLE_ADMIN], page_size: 1000}, this.accessToken)
.then((usersResponse) => { // .then((usersResponse) => {
if (usersResponse.data) { // if (usersResponse.data) {
this.users = usersResponse.data.results.map((user) => { // this.users = usersResponse.data.results.map((user) => {
return { // return {
title: `${user.first_name} ${user.last_name}`, // title: `${user.first_name} ${user.last_name}`,
value: user.id // value: user.id
} // }
}); // });
} // }
}); // });
} // }
} // }
}); // });
// if (this.courseId) { // if (this.courseId) {
// this.loadCourse().then(()=>{this.updateViewSection(window.location, 'load')}).catch(()=>{ // this.loadCourse().then(()=>{this.updateViewSection(window.location, 'load')}).catch(()=>{
@ -967,23 +1029,23 @@
this.course.category = value.value; this.course.category = value.value;
} }
}, },
userSelect: { // userSelect: {
get() { // get() {
if (!this.users || this.users.length === 0 || !this.course || !this.course.author) { // if (!this.users || this.users.length === 0 || !this.course || !this.course.author) {
return null; // return null;
} // }
let value; // let value;
this.users.forEach((user) => { // this.users.forEach((user) => {
if (user.value === this.course.author) { // if (user.value === this.course.author) {
value = user; // value = user;
} // }
}); // });
return value; // return value;
}, // },
set(value) { // set(value) {
this.course.author = value.value; // this.course.author = value.value;
} // }
}, // },
courseFullUrl() { courseFullUrl() {
if (!this.course.url) { if (!this.course.url) {
return `https://lil.city/course/${this.course.id}`; return `https://lil.city/course/${this.course.id}`;
@ -1118,5 +1180,12 @@
background: white; background: white;
border-radius: 10px; border-radius: 10px;
} }
.course-redactor__preview-button-bg-save {
background-color: #58fffb;
}
.course-redactor__preview-button {
transition: backgroundColor 0.5s ease-in-out;
}
</style> </style>

@ -14,52 +14,56 @@
</div> </div>
<div class="kit__title title">{{ title }}</div> <div class="kit__title title">{{ title }}</div>
<div class="kit__section"> <div class="kit__section">
<div class="kit__field field"> <div class="kit__field field"
v-bind:class="{ error: $v.currentLesson.title.$invalid }">
<div class="field__wrap"> <div class="field__wrap">
<input type="text" class="field__input" placeholder="Название урока" v-model="lesson.title"> <input type="text" class="field__input" placeholder="Название урока" v-model="lesson.title">
</div> </div>
</div> </div>
<div class="kit__field field"> <div class="kit__field field"
v-bind:class="{ error: $v.currentLesson.short_description.$invalid }">
<div class="field__wrap"> <div class="field__wrap">
<textarea class="field__input" v-autosize="lesson.short_description" placeholder="Описание урока" v-model="lesson.short_description"></textarea> <textarea class="field__input" v-autosize="lesson.short_description" placeholder="Описание урока" v-model="lesson.short_description"></textarea>
</div> </div>
</div> </div>
</div> </div>
<div v-for="(block, index) in lesson.content"> <vue-draggable v-model="lesson.content" @start="drag=true" @end="drag=false" :options="{ handle: '.sortable__handle' }">
<block-text v-if="block.type === 'text'" <div v-for="(block, index) in lesson.content">
:index="index" <block-text v-if="block.type === 'text'"
:title.sync="block.data.title"
:text.sync="block.data.text"
v-on:remove="onBlockRemoved"
:access-token="accessToken"/>
<block-image-text v-if="block.type === 'image-text'"
:index="index"
:title.sync="block.data.title"
:text.sync="block.data.text"
:image-id.sync="block.data.image_id"
:image-url.sync="block.data.image_url"
v-on:remove="onBlockRemoved"
:access-token="accessToken"/>
<block-image v-if="block.type === 'image'"
:index="index"
:title.sync="block.data.title"
:image-id.sync="block.data.image_id"
:image-url.sync="block.data.image_url"
v-on:remove="onBlockRemoved"
:access-token="accessToken"/>
<block-images v-if="block.type === 'images'"
:index="index" :index="index"
:title.sync="block.data.title" :title.sync="block.data.title"
:text.sync="block.data.text" :text.sync="block.data.text"
:images.sync="block.data.images"
v-on:remove="onBlockRemoved" v-on:remove="onBlockRemoved"
:access-token="accessToken"/> :access-token="accessToken"/>
<block-video v-if="block.type === 'video'" <block-image-text v-if="block.type === 'image-text'"
:index="index" :index="index"
:title.sync="block.data.title" :title.sync="block.data.title"
v-on:remove="onBlockRemoved" :text.sync="block.data.text"
:video-url.sync="block.data.video_url"/> :image-id.sync="block.data.image_id"
</div> :image-url.sync="block.data.image_url"
v-on:remove="onBlockRemoved"
:access-token="accessToken"/>
<block-image v-if="block.type === 'image'"
:index="index"
:title.sync="block.data.title"
:image-id.sync="block.data.image_id"
:image-url.sync="block.data.image_url"
v-on:remove="onBlockRemoved"
:access-token="accessToken"/>
<block-images v-if="block.type === 'images'"
:index="index"
:title.sync="block.data.title"
:text.sync="block.data.text"
:images.sync="block.data.images"
v-on:remove="onBlockRemoved"
:access-token="accessToken"/>
<block-video v-if="block.type === 'video'"
:index="index"
:title.sync="block.data.title"
v-on:remove="onBlockRemoved"
:video-url.sync="block.data.video_url"/>
</div>
</vue-draggable>
<block-add v-on:added="onBlockAdded" /> <block-add v-on:added="onBlockAdded" />
<div class="kit__foot"> <div class="kit__foot">
@ -78,10 +82,12 @@
import BlockImageText from './blocks/BlockImageText' import BlockImageText from './blocks/BlockImageText'
import BlockVideo from './blocks/BlockVideo' import BlockVideo from './blocks/BlockVideo'
import {api} from "../js/modules/api"; import {api} from "../js/modules/api";
import Draggable from 'vuedraggable';
import _ from 'lodash'
export default { export default {
name: "lesson-redactor", name: "lesson-redactor",
props: ["lesson", "saving", "accessToken"], props: ["lesson", "saving", "accessToken", "$v"],
methods: { methods: {
goBack() { goBack() {
this.$emit('back'); this.$emit('back');
@ -113,6 +119,7 @@
'block-image-text': BlockImageText, 'block-image-text': BlockImageText,
'block-images': BlockImages, 'block-images': BlockImages,
'block-video': BlockVideo, 'block-video': BlockVideo,
'vue-draggable': Draggable,
} }
} }
</script> </script>

@ -1,19 +1,51 @@
import axios from 'axios'; import axios from 'axios';
import moment from 'moment'; import moment from 'moment';
import {showNotification} from "../../js/modules/notification";
axios.defaults.headers.post['Content-Type'] = 'application/json'; axios.defaults.headers.post['Content-Type'] = 'application/json';
axios.defaults.headers.post['Accept'] = 'application/json'; axios.defaults.headers.post['Accept'] = 'application/json';
export const api = { export const api = {
get: (url, params) => {
let request = axios.get(url, params);
request.catch(api.errorHandler);
return request;
},
post: (url, data, params) => {
let request = axios.post(url, data, params);
request.catch(api.errorHandler);
return request;
},
put: (url, data, params) => {
let request = axios.put(url, data, params);
request.catch(api.errorHandler);
return request;
},
patch: (url, data, params) => {
let request = axios.patch(url, data, params);
request.catch(api.errorHandler);
return request;
},
delete: (url, params) => {
let request = axios.delete(url, params);
request.catch(api.errorHandler);
return request;
},
errorHandler: (error) => {
console.log('всё очень плохо', error, error.response);
if(error.response.status >= 500) {
showNotification("error", "Ошибка сервера "+error.toString());
}
},
getCurrentUser: (accessToken) => { getCurrentUser: (accessToken) => {
return axios.get('/api/v1/users/me/', { return api.get('/api/v1/users/me/', {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
getUsers: (params, accessToken) => { getUsers: (params, accessToken) => {
return axios.get('/api/v1/users/', { return api.get('/api/v1/users/', {
params: params, params: params,
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
@ -21,14 +53,14 @@ export const api = {
}); });
}, },
getCategories: (accessToken) => { getCategories: (accessToken) => {
return axios.get('/api/v1/categories/', { return api.get('/api/v1/categories/', {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
uploadImage: (imageData, accessToken) => { uploadImage: (imageData, accessToken) => {
return axios.post('/api/v1/image-objects/', { return api.post('/api/v1/image-objects/', {
image: imageData, image: imageData,
}, { }, {
headers: { headers: {
@ -37,21 +69,21 @@ export const api = {
}); });
}, },
removeImage: (imageId, accessToken) => { removeImage: (imageId, accessToken) => {
return axios.delete(`/api/v1/image-objects/${imageId}/`, { return api.delete(`/api/v1/image-objects/${imageId}/`, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
loadCourse: (courseId, accessToken) => { loadCourse: (courseId, accessToken) => {
return axios.get(`/api/v1/courses/${courseId}/`, { return api.get(`/api/v1/courses/${courseId}/`, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
loadLive: (courseId, accessToken) => { loadLive: (courseId, accessToken) => {
return axios.get(`/api/v1/live-lesson/${courseId}/`, { return api.get(`/api/v1/live-lesson/${courseId}/`, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
@ -360,56 +392,56 @@ export const api = {
}); });
}, },
addCourse: (courseJson, accessToken) => { addCourse: (courseJson, accessToken) => {
return axios.post('/api/v1/courses/', courseJson, { return api.post('/api/v1/courses/', courseJson, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
updateCourse: (courseId, courseJson, accessToken) => { updateCourse: (courseId, courseJson, accessToken) => {
return axios.put(`/api/v1/courses/${courseId}/`, courseJson, { return api.put(`/api/v1/courses/${courseId}/`, courseJson, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
addLive: (courseJson, accessToken) => { addLive: (courseJson, accessToken) => {
return axios.post('/api/v1/live-lesson/', courseJson, { return api.post('/api/v1/live-lesson/', courseJson, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
updateLive: (courseId, courseJson, accessToken) => { updateLive: (courseId, courseJson, accessToken) => {
return axios.put(`/api/v1/live-lesson/${courseId}/`, courseJson, { return api.put(`/api/v1/live-lesson/${courseId}/`, courseJson, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
getCourseLessons: (courseId, accessToken) => { getCourseLessons: (courseId, accessToken) => {
return axios.get(`/api/v1/lessons/?course=${courseId}`, { return api.get(`/api/v1/lessons/?course=${courseId}`, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
removeCourseLesson: (lessonId, accessToken) => { removeCourseLesson: (lessonId, accessToken) => {
return axios.delete(`/api/v1/lessons/${lessonId}/`, { return api.delete(`/api/v1/lessons/${lessonId}/`, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
addLesson: (lessonJson, accessToken) => { addLesson: (lessonJson, accessToken) => {
return axios.post('/api/v1/lessons/', lessonJson, { return api.post('/api/v1/lessons/', lessonJson, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
updateLesson: (lessonId, lessonJson, accessToken) => { updateLesson: (lessonId, lessonJson, accessToken) => {
return axios.put(`/api/v1/lessons/${lessonId}/`, lessonJson, { return api.put(`/api/v1/lessons/${lessonId}/`, lessonJson, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
@ -437,28 +469,28 @@ export const api = {
if (!removeUrl) { if (!removeUrl) {
return; return;
} }
return axios.delete(removeUrl, { return api.delete(removeUrl, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
getCourseDraft: (accessToken) => { getCourseDraft: (accessToken) => {
return axios.get('/api/v1/courses/draft/', { return api.get('/api/v1/courses/draft/', {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
publishCourse: (courseId, accessToken) => { publishCourse: (courseId, accessToken) => {
return axios.patch(`/api/v1/courses/${courseId}/`, {status: 1}, { return api.patch(`/api/v1/courses/${courseId}/`, {status: 1}, {
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,
} }
}); });
}, },
getSchedule: (accessToken, params) => { getSchedule: (accessToken, params) => {
return axios.get('/api/v1/school-schedules/', { return api.get('/api/v1/school-schedules/', {
params: params, params: params,
headers: { headers: {
'Authorization': `Token ${accessToken}`, 'Authorization': `Token ${accessToken}`,

Loading…
Cancel
Save