From 06830f6c6320502c6f307cb559e4495520feb031 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Jul 2018 22:42:22 +0300 Subject: [PATCH 01/25] review --- .gitlab-ci.yml | 58 +++++++++++++++++++++++++++-- docker/docker-compose-prod.yml | 7 ++++ docker/docker-compose-review.yml | 64 ++++++++++++++++++++++++++++++++ docker/entrypoint_app.sh | 1 + 4 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 docker/docker-compose-review.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a2b0562..2f95e77f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,5 +1,10 @@ stages: - - deploy + - deploy + - db + - stop + +variables: + REVIEW_DOMAIN: back-review.lil.school deploy_prod: stage: deploy @@ -8,9 +13,56 @@ deploy_prod: - cd /work/www/lil.school/docker/ - docker-compose -f docker-compose-prod.yml up --build -d environment: - name: prod/site + name: prod url: https://lil.school only: - - master + - release tags: - prod + +deploy_review: + stage: deploy + script: + - cd docker + - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME up --build -d + environment: + name: review/$CI_COMMIT_REF_SLUG + url: https://$CI_COMMIT_REF_SLUG-$REVIEW_DOMAIN + on_stop: stop-review + tags: + - review + only: + - branches + except: + - release + +stop-review: + stage: stop + environment: + name: review/$CI_COMMIT_REF_SLUG + action: stop + script: + - cd docker + - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME down + - rm -rf /work/data/back_${CI_COMMIT_REF_NAME}/ + when: manual + only: + - branches + except: + - release + tags: + - review + +prod-db: + stage: db + script: + - cd docker + - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME restart db + - echo 'DROP DATABASE IF EXISTS lilcity; CREATE DATABASE lilcity' | docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME exec -T -u postgres postgres psql postgres + when: manual + only: + - branches + except: + - release + tags: + - review diff --git a/docker/docker-compose-prod.yml b/docker/docker-compose-prod.yml index 440f2cbf..c3b97c9e 100644 --- a/docker/docker-compose-prod.yml +++ b/docker/docker-compose-prod.yml @@ -10,6 +10,11 @@ services: - .env volumes: - ./data/postgres:/var/lib/postgresql/data + logging: &logging + driver: "json-file" + options: + max-size: "1m" + max-file: "1" redis: image: redis:4.0.9-alpine @@ -18,6 +23,7 @@ services: - "127.0.0.1:6379:6379" volumes: - ./data/redis:/data + logging: *logging app: build: @@ -36,3 +42,4 @@ services: links: - db - redis + logging: *logging diff --git a/docker/docker-compose-review.yml b/docker/docker-compose-review.yml new file mode 100644 index 00000000..e84063a1 --- /dev/null +++ b/docker/docker-compose-review.yml @@ -0,0 +1,64 @@ +version: '3' + +services: + db: + image: postgres:10.3-alpine + restart: always + ports: + - "5432:5432" + env_file: + - .env + volumes: + - /work/data/back_${CI_COMMIT_REF_NAME}/postgres:/var/lib/postgresql/data + logging: &logging + driver: "json-file" + options: + max-size: "1m" + max-file: "1" + networks: + - internal + - review + labels: + - traefik.enable=false + + redis: + image: redis:4.0.9-alpine + restart: always + ports: + - "127.0.0.1:6379:6379" + volumes: + - /work/data/back_${CI_COMMIT_REF_NAME}/redis:/data + logging: *logging + networks: + - internal + - review + labels: + - traefik.enable=false + + app: + build: + context: ../ + dockerfile: docker/Dockerfile + restart: always + env_file: + - .env + volumes: + - /work/data/back_${CI_COMMIT_REF_NAME}/media:/app/media + ports: + - "${PORT}:80" + depends_on: + - db + - redis + logging: *logging + networks: + - internal + - review + labels: + - traefik.frontend.rule=Host:${REVIEW_HOST} + - traefik.docker.network=review + +networks: + internal: + review: + external: + name: review diff --git a/docker/entrypoint_app.sh b/docker/entrypoint_app.sh index a61879d2..a346f89c 100755 --- a/docker/entrypoint_app.sh +++ b/docker/entrypoint_app.sh @@ -1,5 +1,6 @@ #!/bin/sh cd /app +chown www-data:www-data /app/media python manage.py migrate #python manage.py loaddata /app/apps/*/fixtures/*.json python2.7 /usr/bin/supervisord -n From ad9eec21546071847bf6b9a828519ba117b4f810 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Jul 2018 22:48:11 +0300 Subject: [PATCH 02/25] review --- docker/docker-compose-review.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docker/docker-compose-review.yml b/docker/docker-compose-review.yml index e84063a1..9413f978 100644 --- a/docker/docker-compose-review.yml +++ b/docker/docker-compose-review.yml @@ -4,8 +4,6 @@ services: db: image: postgres:10.3-alpine restart: always - ports: - - "5432:5432" env_file: - .env volumes: @@ -24,8 +22,6 @@ services: redis: image: redis:4.0.9-alpine restart: always - ports: - - "127.0.0.1:6379:6379" volumes: - /work/data/back_${CI_COMMIT_REF_NAME}/redis:/data logging: *logging @@ -44,8 +40,6 @@ services: - .env volumes: - /work/data/back_${CI_COMMIT_REF_NAME}/media:/app/media - ports: - - "${PORT}:80" depends_on: - db - redis From ed2ed3fe44c8b5cfa3dc5f4be3e7eeb578d40c4d Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Jul 2018 22:49:43 +0300 Subject: [PATCH 03/25] review --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f95e77f..181d5ba8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,6 +23,7 @@ deploy_prod: deploy_review: stage: deploy script: + - export REVIEW_HOST=$CI_COMMIT_REF_SLUG-$REVIEW_DOMAIN - cd docker - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME up --build -d environment: @@ -42,6 +43,7 @@ stop-review: name: review/$CI_COMMIT_REF_SLUG action: stop script: + - export REVIEW_HOST=$CI_COMMIT_REF_SLUG-$REVIEW_DOMAIN - cd docker - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME down - rm -rf /work/data/back_${CI_COMMIT_REF_NAME}/ @@ -56,6 +58,7 @@ stop-review: prod-db: stage: db script: + - export REVIEW_HOST=$CI_COMMIT_REF_SLUG-$REVIEW_DOMAIN - cd docker - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME restart db - echo 'DROP DATABASE IF EXISTS lilcity; CREATE DATABASE lilcity' | docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME exec -T -u postgres postgres psql postgres From 654d6c7cd6fb29d24da6f0f57ae3536fab362978 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Jul 2018 22:51:35 +0300 Subject: [PATCH 04/25] review --- .gitlab-ci.yml | 1 + docker/.env.review | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 docker/.env.review diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 181d5ba8..cb9cab82 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,6 +25,7 @@ deploy_review: script: - export REVIEW_HOST=$CI_COMMIT_REF_SLUG-$REVIEW_DOMAIN - cd docker + - cp .env.review .env - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME up --build -d environment: name: review/$CI_COMMIT_REF_SLUG diff --git a/docker/.env.review b/docker/.env.review new file mode 100644 index 00000000..bc750b18 --- /dev/null +++ b/docker/.env.review @@ -0,0 +1,22 @@ +# DEBUG=True +ALLOWED_HOSTS=* +PORT=8000 +CORS_ORIGIN_WHITELIST=lilcity.9ev.ru:8080 +LANG=ru_RU.UTF-8 +POSTGRES_DB=lilcity +POSTGRES_USER=lilcity +POSTGRES_PASSWORD=GPVs/E/{5&qe +DJANGO_SETTINGS_MODULE=project.settings +DATABASE_SERVICE_HOST=db +SECRET_KEY=jelm*91lj(_-o20+6^a+bgv!4s6e_efry^#+f#=1ak&s1xr-2j +MAILGUN_API_KEY=key-ec6af2d43d031d59bff6b1c8fb9390cb +MAILGUN_SENDER_DOMAIN=mail.9ev.ru +DEFAULT_FROM_EMAIL=postmaster@mail.9ev.ru +TWILIO_ACCOUNT=ACdf4a96b776cc764bc3ec0f0e136ba550 +TWILIO_TOKEN=559a6b1fce121759c9af2dcbb3f755ea +TWILIO_FROM_PHONE=+37128914409 +PAYMENTWALL_APP_KEY=d6f02b90cf6b16220932f4037578aff7 +PAYMENTWALL_SECRET_KEY=4ea515bf94e34cf28646c2e12a7b8707 +MIXPANEL_TOKEN=79bd6bfd98667ed977737e6810b8abcd +RAVEN_DSN=https://b545dac0ae0545a1bcfc443326fe5850:6f9c900cef7f4c11b63561030b37d15c@sentry.io/1197254 +ROISTAT_COUNTER_ID=09db30c750035ae3d70a41d5f10d59ec From 817a6110c0a128824ed8d02874f2a5f104d646aa Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Jul 2018 23:07:49 +0300 Subject: [PATCH 05/25] review --- docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 46722a2f..acaa74c8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,4 +18,5 @@ ADD . /app/ COPY --from=front /web/build/ /app/web/build/ RUN python manage.py collectstatic --no-input RUN rm -rf /etc/nginx/ && cp -r docker/conf/nginx /etc/ && cp -r docker/conf/supervisor/* /etc/supervisor/conf.d/ && chown -R www-data:www-data /app/ +EXPOSE 80 ENTRYPOINT ["/app/docker/entrypoint_app.sh"] From ae0160fc9c356c252bbfeda3b8f6eda028d6fb85 Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 3 Jul 2018 01:44:05 +0500 Subject: [PATCH 06/25] =?UTF-8?q?LIL-523=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2=D0=BE=D0=B7=D0=BC?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=83=D1=80=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D0=BA=D1=83=D1=80=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/v1/serializers/course.py | 5 + .../course/migrations/0039_lesson_position.py | 18 +++ apps/course/models.py | 8 ++ .../templates/course/course_only_lessons.html | 2 +- apps/course/views.py | 2 + web/src/components/CourseRedactor.vue | 113 ++++++++++++------ web/src/js/modules/api.js | 4 +- 7 files changed, 111 insertions(+), 41 deletions(-) create mode 100644 apps/course/migrations/0039_lesson_position.py diff --git a/api/v1/serializers/course.py b/api/v1/serializers/course.py index d07e58b5..1a9695bb 100644 --- a/api/v1/serializers/course.py +++ b/api/v1/serializers/course.py @@ -181,6 +181,7 @@ class LessonCreateSerializer(DispatchContentMixin, serializers.ModelSerializer): 'created_at', 'update_at', 'deactivated_at', + 'position', ) read_only_fields = ( @@ -193,6 +194,9 @@ class LessonCreateSerializer(DispatchContentMixin, serializers.ModelSerializer): def create(self, validated_data): content = validated_data.pop('content', []) lesson = super().create(validated_data) + if not validated_data.get('position'): + lesson.set_last_position() + lesson.save() self.dispatch_content(lesson, content) return lesson @@ -223,6 +227,7 @@ class LessonSerializer(serializers.ModelSerializer): 'created_at', 'update_at', 'deactivated_at', + 'position', ) read_only_fields = ( diff --git a/apps/course/migrations/0039_lesson_position.py b/apps/course/migrations/0039_lesson_position.py new file mode 100644 index 00000000..7a26d8e5 --- /dev/null +++ b/apps/course/migrations/0039_lesson_position.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.6 on 2018-07-02 13:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0038_lesson_author'), + ] + + operations = [ + migrations.AddField( + model_name='lesson', + name='position', + field=models.PositiveSmallIntegerField(default=1, verbose_name='Положение на странице'), + ), + ] diff --git a/apps/course/models.py b/apps/course/models.py index 7d0300c7..942a0593 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -177,10 +177,18 @@ class Lesson(BaseModel, DeactivatedMixin): ) created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) + position = models.PositiveSmallIntegerField( + 'Положение на странице', + default=1, + ) def __str__(self): return self.title + def set_last_position(self): + if self.course: + self.position = self.course.lessons.count() + def save(self, *args, **kwargs): if not self.author and self.course and self.course.author: self.author = self.course.author diff --git a/apps/course/templates/course/course_only_lessons.html b/apps/course/templates/course/course_only_lessons.html index a919e08f..f0217bcf 100644 --- a/apps/course/templates/course/course_only_lessons.html +++ b/apps/course/templates/course/course_only_lessons.html @@ -173,7 +173,7 @@
Содержание курса
- {% for lesson in course.lessons.all %} + {% for lesson in lessons %} {% if course.author == request.user or request.user.role >= request.user.TEACHER_ROLE or paid %} {% else %} diff --git a/apps/course/views.py b/apps/course/views.py index 60b7e308..8cff720a 100644 --- a/apps/course/views.py +++ b/apps/course/views.py @@ -214,6 +214,8 @@ class CourseView(DetailView): status=Pingback.PINGBACK_TYPE_RISK_UNDER_REVIEW, ).exists() context['only_lessons'] = self.only_lessons + if self.only_lessons: + context['lessons'] = self.object.lessons.order_by('position') return context def get_queryset(self): diff --git a/web/src/components/CourseRedactor.vue b/web/src/components/CourseRedactor.vue index 3ba9359e..4407671c 100644 --- a/web/src/components/CourseRedactor.vue +++ b/web/src/components/CourseRedactor.vue @@ -215,24 +215,31 @@
Содержание курса
-
-
- - -
-
{{ lesson.title }}
-
-
{{ lesson.short_description }}
-
-
+ +
+
+ + + +
+
{{ lesson.title }}
+
+
{{ lesson.short_description }}
+
+
+
Загрузка...
@@ -307,7 +314,7 @@ price: null, url: '', coverImage: '', - coverImageId: null, + kit__body: null, is_paid: false, is_featured: true, is_deferred: false, @@ -507,6 +514,7 @@ api.removeCourseLesson(lesson.id, this.accessToken); } this.lessons.splice(lessonIndex, 1); + this.onLessonsChanged(); }, editLesson(lessonIndex) { this.currentLesson = this.lessons[lessonIndex]; @@ -581,11 +589,7 @@ }); } - document.getElementById('course-redactor__saving-status').innerText = 'СОХРАНЕНО'; - this.savingTimeout = setTimeout(() => { - document.getElementById('course-redactor__saving-status').innerText = ''; - }, 2000); - + this.changeSavingStatus(true); showNotification("success", 'Урок сохранён'); // this.goToLessons(); @@ -594,10 +598,7 @@ .catch((err) => { this.lessonSaving = false; //console.error(err); - document.getElementById('course-redactor__saving-status').innerText = 'ОШИБКА'; - this.savingTimeout = setTimeout(() => { - document.getElementById('course-redactor__saving-status').innerText = ''; - }, 2000); + this.changeSavingStatus(true, true); // alert('Произошло что-то страшное: '+err.toString()); console.log(err); if(err.response) { @@ -668,6 +669,15 @@ this.lessons = response.data.lessons.map((lessonJson) => { return api.convertLessonJson(lessonJson); }); + this.lessons.sort((a, b) => { + if (a.position > b.position) { + return 1; + } + if (a.position < b.position) { + return -1; + } + return 0; + }); }) .catch((err) => { this.courseLoading = false; @@ -794,17 +804,13 @@ } this.courseSaving = true; - clearTimeout(this.savingTimeout); - document.getElementById('course-redactor__saving-status').innerText = 'СОХРАНЕНИЕ...'; + this.changeSavingStatus(); const courseObject = this.course; courseObject.url = (courseObject.url) ? slugify(courseObject.url):courseObject.url; api.saveCourse(courseObject, this.accessToken) .then((response) => { this.courseSaving = false; - document.getElementById('course-redactor__saving-status').innerText = 'СОХРАНЕНО'; - this.savingTimeout = setTimeout(() => { - document.getElementById('course-redactor__saving-status').innerText = ''; - }, 2000); + this.changeSavingStatus(true); this.courseSyncHook = true; const courseData = api.convertCourseJson(response.data); if (this.course.coverImage) { @@ -854,10 +860,7 @@ this.courseSyncHook = false; this.courseSaving = false; //console.error(err); - document.getElementById('course-redactor__saving-status').innerText = 'ОШИБКА'; - this.savingTimeout = setTimeout(() => { - document.getElementById('course-redactor__saving-status').innerText = ''; - }, 2000); + this.changeSavingStatus(true, true); // alert('Произошло что-то страшное: '+err.toString()); //console.log(err.response.data); if(err.response) { @@ -886,10 +889,42 @@ this.viewSection = 'lessons-edit'; } }, + onLessonsChanged() { + let promises = []; + this.courseSaving = true; + this.lessons.map((lesson, index) => { + lesson.position = index + 1; + lesson.course_id = this.course.id; + let res = api.saveLesson(lesson, this.accessToken); + promises.push(res); + }); + Promise.all(promises).then(() => { + this.courseSaving = false; + this.changeSavingStatus(true); + }, () => { + this.courseSaving = false; + this.changeSavingStatus(true, true); + }); + }, pluralize(count, words) { var cases = [2, 0, 1, 1, 1, 2]; return words[ (count % 100 > 4 && count % 100 < 20) ? 2 : cases[ Math.min(count % 10, 5)] ]; - } + }, + changeSavingStatus(saved, error) { + let text = ''; + if(error) { + text = 'ОШИБКА'; + } else { + text = saved ? 'СОХРАНЕНО' : 'СОХРАНЕНИЕ...'; + } + clearTimeout(this.savingTimeout); + document.getElementById('course-redactor__saving-status').innerText = text; + if(saved || error){ + this.savingTimeout = setTimeout(() => { + document.getElementById('course-redactor__saving-status').innerText = ''; + }, 2000); + } + }, }, mounted() { this.mounting = true; diff --git a/web/src/js/modules/api.js b/web/src/js/modules/api.js index 36dc5f99..3b48837b 100644 --- a/web/src/js/modules/api.js +++ b/web/src/js/modules/api.js @@ -208,6 +208,7 @@ export const api = { title: lessonObject.title, short_description: lessonObject.short_description, course: lessonObject.course_id, + position: lessonObject.position, content: lessonObject.content.map((block, index) => { if (block.type === 'text') { return { @@ -287,7 +288,8 @@ export const api = { short_description: lessonJSON.short_description, coverImageId: lessonJSON.cover && lessonJSON.cover.id ? lessonJSON.cover.id : null, coverImage: lessonJSON.cover && lessonJSON.cover.image ? lessonJSON.cover.image : null, - content: api.convertContentResponse(lessonJSON.content) + content: api.convertContentResponse(lessonJSON.content), + position: lessonJSON.position, } }, convertCourseJson: (courseJSON) => { From 7a931aadcd2df63516685b564b0e31ff10d86232 Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 3 Jul 2018 14:23:01 +0500 Subject: [PATCH 07/25] =?UTF-8?q?LIL-467=20=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BA=D0=BE=D0=B9,=20=D0=B0=20=D0=BD=D0=B5?= =?UTF-8?q?=20'0'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/components/CourseRedactor.vue | 29 ++++++++++----------------- web/src/js/modules/api.js | 4 ++-- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/web/src/components/CourseRedactor.vue b/web/src/components/CourseRedactor.vue index 3ba9359e..1a9a0779 100644 --- a/web/src/components/CourseRedactor.vue +++ b/web/src/components/CourseRedactor.vue @@ -619,6 +619,14 @@ $(window).scrollTop(elementTop); }); }, + processCourseJson(data) { + this.course = api.convertCourseJson(data); + this.course.live = this.live; + this.lessons = data.lessons.map((lessonJson) => { + return api.convertLessonJson(lessonJson); + }); + this.course.duration = this.course.duration || ''; + }, loadCourseDraft() { //console.log('loadCourseDraft'); if(this.live) { return; } @@ -628,12 +636,8 @@ response .then((response) => { - this.course = api.convertCourseJson(response.data); - this.course.live = this.live; + this.processCourseJson(response.data); this.courseLoading = false; - this.lessons = response.data.lessons.map((lessonJson) => { - return api.convertLessonJson(lessonJson); - }); }) .catch((err) => { this.courseLoading = false; @@ -653,21 +657,10 @@ } request .then((response) => { - this.course = api.convertCourseJson(response.data); - this.course.live = this.live; - - /* if (this.live && this.course.date) { - this.course.date = _.find(this.scheduleOptions, (item) => { - return item.value == this.course.date; - }) - } */ - + this.processCourseJson(response.data); this.$nextTick(() => { this.courseLoading = false; }); - this.lessons = response.data.lessons.map((lessonJson) => { - return api.convertLessonJson(lessonJson); - }); }) .catch((err) => { this.courseLoading = false; @@ -1025,7 +1018,7 @@ }, displayPrice: { get: function () { - return this.course.is_paid ? (this.course.price || 0) : 0; + return this.course.is_paid ? (this.course.price || '') : ''; }, set: function (value) { this.course.price = value || 0; diff --git a/web/src/js/modules/api.js b/web/src/js/modules/api.js index 36dc5f99..31787852 100644 --- a/web/src/js/modules/api.js +++ b/web/src/js/modules/api.js @@ -107,9 +107,9 @@ export const api = { author: courseObject.author ? courseObject.author : null, short_description: courseObject.short_description, category: courseObject.category, - price: courseObject.is_paid ? courseObject.price : 0, + price: courseObject.is_paid && courseObject.price || 0, deferred_start_at: deferredStart, - duration: courseObject.duration, + duration: courseObject.duration || 0, is_featured: courseObject.is_featured, slug: courseObject.url, date: (courseObject.date) ? courseObject.date.value:null, From 4be21776df51c6908fe0e1caead67b8fa7b4a899 Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 18:30:18 +0300 Subject: [PATCH 08/25] test --- project/templates/blocks/promo.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/templates/blocks/promo.html b/project/templates/blocks/promo.html index 49fde3ee..ba61ac8e 100644 --- a/project/templates/blocks/promo.html +++ b/project/templates/blocks/promo.html @@ -12,7 +12,7 @@ Lil School — первая образовательная онлайн-платформа креативного мышления для детей
- Урок Рисовальный лагерь, Альбрехт Дюрер начнется сегодня в 17:00 + Урок Рисовальный лагерь, Альбрехт Дюрер начнется завтра в 17:00
{% if is_purchased %} From c64f61b5a0ac975ff0e2734a206fd44f095a1dee Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 20:20:50 +0300 Subject: [PATCH 09/25] roistat checking fix --- project/templates/lilcity/index.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index 7f3fed4e..18e4135a 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -75,8 +75,7 @@ {% comment %} ROISTAT {% endcomment %} {% block foot %}{% endblock foot %} From aa20afb2cfc18290211e703611dd6666b9e9ac9b Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 20:22:17 +0300 Subject: [PATCH 10/25] roistat checking fix --- project/templates/lilcity/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index 18e4135a..e74656de 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -75,7 +75,7 @@ {% comment %} ROISTAT {% endcomment %} {% block foot %}{% endblock foot %} From 7a8fcbf082fc20abfb1dde4541a08cee53322c20 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 Jul 2018 12:20:02 +0300 Subject: [PATCH 11/25] review --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb9cab82..e86bed7f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,7 @@ deploy_prod: script: - rsync -a --stats --delete --exclude="docker/data/" --exclude="docker/.env" ./ /work/www/lil.school/ - cd /work/www/lil.school/docker/ - - docker-compose -f docker-compose-prod.yml up --build -d + - docker-compose -f docker-compose-prod.yml -p back up --build -d environment: name: prod url: https://lil.school From 698ffa34d804bef9a950a1e8af179bd9d133182b Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 4 Jul 2018 12:45:11 +0300 Subject: [PATCH 12/25] today mainpage hardcode --- project/templates/blocks/promo.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/project/templates/blocks/promo.html b/project/templates/blocks/promo.html index 53b7f7a9..74d66932 100644 --- a/project/templates/blocks/promo.html +++ b/project/templates/blocks/promo.html @@ -12,12 +12,11 @@ Lil School — первая образовательная онлайн-платформа креативного мышления для детей
- Урок Рисовальный лагерь, Альбрехт Дюрер завершен
- Следующий урок пройдет 4 июля + Урок Рисовальный лагерь, Поль Синьяк пройдет сегодня в 17:00
{% elif user.is_authenticated and online_coming_soon and school_schedule and school_schedule.start_at_humanize %} -
- Урок «{{ school_schedule.title }}» начнётся +
+ Урок «{{ school_schedule.current_live_lesson.title }}» начнётся
- {{ school_schedule.start_at_humanize }} + Сегодня в 17:00
{% if user.is_authenticated and online %}
- Сейчас идёт прямой эфир урока «{{ school_schedule.title }}» + Сейчас идёт прямой эфир урока «{{ school_schedule.title }}, {{ school_schedule.current_live_lesson.title }}»
{% elif user.is_authenticated and online_coming_soon and school_schedule and school_schedule.start_at_humanize %}
- Урок «{{ school_schedule.current_live_lesson.title }}» начнётся + Урок «{{ school_schedule.title }}, {{ school_schedule.current_live_lesson.title }}» начнётся
- Сегодня в 17:00 + {{ school_schedule.start_at_humanize }}
{% endif %} From 961f9ac950d77f3cb2aa1a0e1759e34e99f02243 Mon Sep 17 00:00:00 2001 From: Mikhail Lavkin Date: Wed, 4 Jul 2018 18:55:47 +0000 Subject: [PATCH 16/25] Ci get prod db --- .gitlab-ci.yml | 4 +++- .../{sites-available/default => conf.d/default.conf} | 10 ++++++++++ docker/conf/nginx/nginx.conf | 1 - docker/conf/nginx/sites-enabled/default | 1 - 4 files changed, 13 insertions(+), 3 deletions(-) rename docker/conf/nginx/{sites-available/default => conf.d/default.conf} (71%) delete mode 120000 docker/conf/nginx/sites-enabled/default diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3d4ff10c..1d78b5d1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -57,8 +57,10 @@ prod-db: script: - export REVIEW_HOST=$CI_COMMIT_REF_SLUG-$REVIEW_DOMAIN - cd docker + - cp .env.review .env - docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME restart db - - echo 'DROP DATABASE IF EXISTS lilcity; CREATE DATABASE lilcity' | docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME exec -T -u postgres postgres psql postgres + - echo 'DROP DATABASE IF EXISTS lilcity; CREATE DATABASE lilcity' | docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME exec -T -u postgres db psql postgres + - /work/scripts/get_prod_db.sh | docker-compose -f docker-compose-review.yml -p back$CI_COMMIT_REF_NAME exec -T -u postgres db psql lilcity when: manual only: - branches diff --git a/docker/conf/nginx/sites-available/default b/docker/conf/nginx/conf.d/default.conf similarity index 71% rename from docker/conf/nginx/sites-available/default rename to docker/conf/nginx/conf.d/default.conf index 1aaa7519..b20174f6 100644 --- a/docker/conf/nginx/sites-available/default +++ b/docker/conf/nginx/conf.d/default.conf @@ -19,9 +19,19 @@ server { location /media/instagram/results/ { expires 1d; + try_files $uri @prod; } + try_files $uri @prod; } + location @prod { + if ($host = "lil.school") { + return 404; + } + proxy_pass https://lil.school; + proxy_buffering off; + } + location / { try_files $uri @django; } diff --git a/docker/conf/nginx/nginx.conf b/docker/conf/nginx/nginx.conf index c477630e..2889f7ad 100644 --- a/docker/conf/nginx/nginx.conf +++ b/docker/conf/nginx/nginx.conf @@ -26,7 +26,6 @@ http { gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; include /etc/nginx/conf.d/*.conf; - include /etc/nginx/sites-enabled/*; set_real_ip_from 192.168.0.0/24; } diff --git a/docker/conf/nginx/sites-enabled/default b/docker/conf/nginx/sites-enabled/default deleted file mode 120000 index ad35b834..00000000 --- a/docker/conf/nginx/sites-enabled/default +++ /dev/null @@ -1 +0,0 @@ -/etc/nginx/sites-available/default \ No newline at end of file From 5a01145ea9365a1ce7e0fa1996151500a9cab54d Mon Sep 17 00:00:00 2001 From: nikita Date: Fri, 6 Jul 2018 13:52:26 +0300 Subject: [PATCH 17/25] Add google, yandex snippets --- project/templates/lilcity/index.html | 39 +++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index 30b5541a..5d7b9d2d 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -76,7 +76,44 @@ &noscript=1"/> - + + + + + + + {% include "templates/blocks/mixpanel.html" %} From c3b49276d9be018fc367696b9637e81257907a40 Mon Sep 17 00:00:00 2001 From: nikita Date: Fri, 6 Jul 2018 18:27:03 +0300 Subject: [PATCH 18/25] text fix --- apps/school/templates/blocks/online.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/school/templates/blocks/online.html b/apps/school/templates/blocks/online.html index 1da3e731..c4c82931 100644 --- a/apps/school/templates/blocks/online.html +++ b/apps/school/templates/blocks/online.html @@ -3,7 +3,7 @@
ПРЯМОЙ ЭФИР
Каждый день в 17.00 (по Мск)
-
Кроме выходных. Запись эфира доступна в течение 24-х часов.
+
Кроме выходных. Запись эфира доступна по завершению трансляции
From 1a3a595cd2dc2ffe60996770e1215a2ed651f54c Mon Sep 17 00:00:00 2001 From: nikita Date: Mon, 9 Jul 2018 10:19:48 +0300 Subject: [PATCH 19/25] Teacher role fix --- api/v1/permissions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/permissions.py b/api/v1/permissions.py index 95a136ee..c0854a4f 100644 --- a/api/v1/permissions.py +++ b/api/v1/permissions.py @@ -15,7 +15,7 @@ class IsAdmin(BasePermission): class IsTeacherOrAdmin(BasePermission): def has_permission(self, request, view): return request.user.is_authenticated and ( - request.user.role > User.TEACHER_ROLE or + request.user.role >= User.TEACHER_ROLE or request.user.is_staff or request.user.is_superuser ) From 8d47365cf8a8f766605acb5a4e4e87e74648970f Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 10 Jul 2018 16:00:12 +0500 Subject: [PATCH 20/25] =?UTF-8?q?LIL-560=20=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D1=83=20=C2=AB=D0=A1=D0=BC=D0=BE=D1=82=D1=80=D0=B5=D1=82=D1=8C?= =?UTF-8?q?=20=D1=83=D1=80=D0=BE=D0=BA=C2=BB=20=D0=BF=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D1=8F=D1=82=D1=8C=20=D0=B2=D1=8B=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../summer/_schedule_purchased_item.html | 18 +++++++++--------- web/src/sass/_common.sass | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/apps/school/templates/summer/_schedule_purchased_item.html b/apps/school/templates/summer/_schedule_purchased_item.html index b9d1db1f..4620367c 100644 --- a/apps/school/templates/summer/_schedule_purchased_item.html +++ b/apps/school/templates/summer/_schedule_purchased_item.html @@ -8,16 +8,16 @@ {% if live_lesson %}
{{ live_lesson.date }}
{% endif %} -
-
-
{{ school_schedule.start_at }} (МСК)
- {% if school_schedule.weekday in school_schedules_purchased %} - {% if live_lesson and live_lesson.title %} - {% include './open_lesson.html' %} +
+
{{ school_schedule.start_at }} (МСК)
+ {% if school_schedule.weekday in school_schedules_purchased %} + {% if live_lesson and live_lesson.title %} + {% include './open_lesson.html' %} + {% endif %} + {% else %} + {% include './day_pay_btn.html' %} {% endif %} - {% else %} - {% include './day_pay_btn.html' %} - {% endif %} +
{% comment %} diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index 7e5a870a..033ce477 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -3852,7 +3852,6 @@ a.grey-link .icon font-size: 8px fill: $pink - &__buy, &__more display: none &__more From 3776d53464f9a8851b180c16ad13abfb70c44426 Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 10 Jul 2018 16:36:33 +0300 Subject: [PATCH 21/25] Review env debug on --- docker/.env.review | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/.env.review b/docker/.env.review index bc750b18..351dc795 100644 --- a/docker/.env.review +++ b/docker/.env.review @@ -1,4 +1,4 @@ -# DEBUG=True +DEBUG=True ALLOWED_HOSTS=* PORT=8000 CORS_ORIGIN_WHITELIST=lilcity.9ev.ru:8080 From d1d8d4bccdf2eb54411ec93576d9a8b29ef4fa71 Mon Sep 17 00:00:00 2001 From: nikita Date: Wed, 11 Jul 2018 12:38:51 +0300 Subject: [PATCH 22/25] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BF=D0=BE=D0=BA=20=D0=B4=D0=BB=D1=8F=20=D0=BB?= =?UTF-8?q?=D0=B5=D1=82=D0=BD=D0=B5=D0=B3=D0=BE=20=D0=BB=D0=B0=D0=B3=D0=B5?= =?UTF-8?q?=D1=80=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/payment/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/payment/views.py b/apps/payment/views.py index 4f4a958a..2f70df36 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -222,7 +222,9 @@ class PaymentwallCallbackView(View): date_start = arrow.get(school_payment.date_end).shift(days=1).datetime date_end = arrow.get(date_start).shift(months=1).datetime else: - month = 0 if now().day >= 1 and now().day <= 10 else 1 + #month = 0 if now().day >= 1 and now().day <= 10 else 1 + # Логика июльского лагеря: до конца июля приобретаем только на текущий месяц + month = 0 date_start = self.add_months(sourcedate=now().replace(hour=0, minute=0, day=1), months=month) date_end = arrow.get(date_start).shift(months=1, minutes=-1).datetime payment.date_start = date_start From fae11c2d4ffc5136044548ff255fc2c13879182f Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 17 Jul 2018 15:12:38 +0500 Subject: [PATCH 23/25] =?UTF-8?q?LIL-560=20=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D1=83=20=C2=AB=D0=A1=D0=BC=D0=BE=D1=82=D1=80=D0=B5=D1=82=D1=8C?= =?UTF-8?q?=20=D1=83=D1=80=D0=BE=D0=BA=C2=BB=20=D0=BF=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D1=8F=D1=82=D1=8C=20=D0=B2=D1=8B=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../summer/_schedule_purchased_item.html | 90 ++++++++++--------- apps/school/templates/summer/open_lesson.html | 2 +- web/src/sass/_common.sass | 29 ++---- 3 files changed, 56 insertions(+), 65 deletions(-) diff --git a/apps/school/templates/summer/_schedule_purchased_item.html b/apps/school/templates/summer/_schedule_purchased_item.html index 4620367c..0e86ccba 100644 --- a/apps/school/templates/summer/_schedule_purchased_item.html +++ b/apps/school/templates/summer/_schedule_purchased_item.html @@ -1,6 +1,6 @@ {% load static %} {% load thumbnail %}
-
+
{{ school_schedule }} @@ -26,53 +26,55 @@ {% endif %}
-
-
- {% thumbnail live_lesson.cover.image "70x70" crop="center" as im %} - - {% empty %} - - {% endthumbnail %} +
+
+
+ {% thumbnail live_lesson.cover.image "70x70" crop="center" as im %} + + {% empty %} + + {% endthumbnail %} +
-
-
-
{{ school_schedule.title }}{% if live_lesson and live_lesson.title %}, - {{ live_lesson.title }} +
+
{{ school_schedule.title }}{% if live_lesson and live_lesson.title %}, + {{ live_lesson.title }} + {% endif %} +
+
+ {% if live_lesson and live_lesson.short_description %} + {{ live_lesson.short_description }} + {% else %} + {{ school_schedule.description }} {% endif %} -
-
- {% if live_lesson and live_lesson.short_description %} - {{ live_lesson.short_description }} - {% else %} - {{ school_schedule.description }} - {% endif %} -
-
-
Материалы
-
-
- {{ school_schedule.materials }} -
- {% if school_schedule.schoolschedule_images.exists %} -
Результаты прошлых уроков
- -
-
- +
+ +
diff --git a/apps/school/templates/summer/open_lesson.html b/apps/school/templates/summer/open_lesson.html index 46999c7f..abb8a9a2 100644 --- a/apps/school/templates/summer/open_lesson.html +++ b/apps/school/templates/summer/open_lesson.html @@ -1,4 +1,4 @@ смотреть урок +>подробнее diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index 033ce477..01efd236 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -3731,6 +3731,8 @@ a.grey-link box-shadow: -40px 0 0 0 $pink-light, 40px 0 0 0 $pink-light +nf border-color: transparent + +m + display: block &__item.open padding-bottom: 40px &__item.open &__toggle @@ -3750,14 +3752,8 @@ a.grey-link &__item.disable &__title, &__item.disable &__content opacity: .4 - &__item.disable &__cell - &:nth-child(1) - justify-content: center - &:nth-child(3) - +m - padding: 0 0 50px &__cell - &:nth-child(1) + &--info display: flex padding-right: 20px flex-direction: column @@ -3766,15 +3762,15 @@ a.grey-link +m padding: 0 flex: 0 0 0 - &:nth-child(2) + margin-bottom: 15px + &--preview padding-right: 20px flex: 0 0 90px - &:nth-child(3) + &--content flex: 0 0 calc(100% - 254px) +m - padding-top: 20px flex: 0 0 calc(100% - 114px) - &:nth-child(4) + &--toggle flex: 0 0 34px &__unlock +m @@ -3785,11 +3781,6 @@ a.grey-link margin-bottom: auto +m display: flex - position: absolute - top: 20px - left: 90px - right: 0 - padding: 0 flex-direction: row &__day position: relative @@ -3816,10 +3807,8 @@ a.grey-link margin: -3px 0 0 auto &__buy +m - position: absolute - left: 0 - bottom: 40px - align-items: center + display: flex + margin-left: 20px &__time margin: 15px 0 opacity: .5 From c36f68300a919f9e526387b65fc6cc872148b353 Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 17 Jul 2018 22:05:22 +0500 Subject: [PATCH 24/25] =?UTF-8?q?LIL-572=20=D0=9D=D0=B5=D0=B7=D0=B0=D1=80?= =?UTF-8?q?=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B4=D0=B8=D1=82=20=D0=BA=D1=83=D1=80=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/user/templates/user/profile.html | 14 ++++++-------- apps/user/views.py | 1 + 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/apps/user/templates/user/profile.html b/apps/user/templates/user/profile.html index caddc204..6b0f0b07 100644 --- a/apps/user/templates/user/profile.html +++ b/apps/user/templates/user/profile.html @@ -62,22 +62,22 @@
-{% if not guest %}
+ {% if owner %} - {% if not simple_user %} - - {% endif %}
+ {% if owner %}
{% if is_purchased_future %}
@@ -126,8 +126,8 @@
- {% if not simple_user %} -
+ {% endif %} +
{% if published.exists %} @@ -145,10 +145,8 @@
- {% endif %}
-{% endif %} {% endblock content %} diff --git a/apps/user/views.py b/apps/user/views.py index 14ecef7b..500d8404 100644 --- a/apps/user/views.py +++ b/apps/user/views.py @@ -56,6 +56,7 @@ class UserView(DetailView): else: context['simple_user'] = True context['guest'] = True + context['owner'] = self.request.user.id == self.object.id if context['guest'] and self.object.role <= User.USER_ROLE: raise Http404() From e5e5a065836c5203b2cd4a0168d41fef966d657e Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 17 Jul 2018 22:47:45 +0500 Subject: [PATCH 25/25] =?UTF-8?q?LIL-574=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=81=D1=83=D0=BC=D0=BC=D0=B0/=D0=BC?= =?UTF-8?q?=D0=B5=D1=81=D1=8F=D1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/templates/blocks/popup_buy.html | 4 ++-- web/src/sass/_common.sass | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/project/templates/blocks/popup_buy.html b/project/templates/blocks/popup_buy.html index f35c3474..96b3b29d 100644 --- a/project/templates/blocks/popup_buy.html +++ b/project/templates/blocks/popup_buy.html @@ -37,7 +37,7 @@ {% comment %} dont delete {% endcomment %} {{ school_schedule.title }} - {{school_schedule.month_price}}р + {{school_schedule.month_price}}р в мес. {% endfor %} @@ -58,7 +58,7 @@ {% comment %} dont delete {% endcomment %} {{ school_schedule.title }} - {{school_schedule.month_price}}р + {{school_schedule.month_price}}р в мес. {% endfor %} diff --git a/web/src/sass/_common.sass b/web/src/sass/_common.sass index 033ce477..8b994f06 100755 --- a/web/src/sass/_common.sass +++ b/web/src/sass/_common.sass @@ -1832,17 +1832,17 @@ a.grey-link padding: 0 text-align: right flex: 0 0 calc(100% - 110px) - &:nth-child(2), - &:last-child + &:nth-child(2) flex: 0 0 60px &:nth-child(3) - flex: 0 0 calc(100% - 230px) + flex: 0 0 calc(100% - 290px) +t padding: 0 - flex: 0 0 calc(100% - 60px) + flex: 0 0 calc(100% - 120px) &:last-child padding: 0 text-align: right + flex: 0 0 120px &_blue &__content &:after background: #4A90E2