From 091f34ebcaf84218046de13fe5b10ea882c68aa7 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 11:02:00 +0300 Subject: [PATCH 01/50] Revert dev docker files --- docker/Dockerfile.dev | 18 ++++++++++++++ ...dev.yml_notwork => docker-compose-dev.yml} | 24 +++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 docker/Dockerfile.dev rename docker/{docker-compose-dev.yml_notwork => docker-compose-dev.yml} (56%) diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev new file mode 100644 index 00000000..9ae8465a --- /dev/null +++ b/docker/Dockerfile.dev @@ -0,0 +1,18 @@ +FROM node:9.11.1-alpine as front +RUN apk update && apk add python alpine-sdk --no-cache +WORKDIR /web/ +ADD ./web/yarn.lock /web/ +ADD ./web/package.json /web/ +RUN yarn install +ADD ./web/ /web/ +RUN yarn build + +FROM python:3.6 +ENV PYTHONUNBUFFERED 1 +RUN mkdir /app +WORKDIR /app +ADD requirements.txt /app/ +RUN pip install --no-cache-dir -r requirements.txt +ADD . /app/ +COPY --from=front /web/build/ /app/web/build/ +RUN python manage.py collectstatic --no-input diff --git a/docker/docker-compose-dev.yml_notwork b/docker/docker-compose-dev.yml similarity index 56% rename from docker/docker-compose-dev.yml_notwork rename to docker/docker-compose-dev.yml index 4de5b13a..6fca36dc 100644 --- a/docker/docker-compose-dev.yml_notwork +++ b/docker/docker-compose-dev.yml @@ -2,29 +2,35 @@ version: '3' services: db: - image: postgres:10-alpine + image: postgres:alpine + restart: always env_file: - .env ports: - "127.0.0.1:5432:5432" volumes: - - ./postgres_data:/var/lib/postgresql/data/pgdata + - ./data/postgres_dev:/var/lib/postgresql/data redis: - image: redis:latest + image: redis:alpine + restart: always ports: - "127.0.0.1:6379:6379" volumes: - - ./redis_data:/data + - ./data/redis_dev:/data web: - build: . + build: + context: ../ + dockerfile: docker/Dockerfile.dev restart: always volumes: - .:/lilcity - command: bash -c "python manage.py collectstatic --no-input && python manage.py migrate && python manage.py loaddata /lilcity/apps/*/fixtures/*.json && gunicorn --workers=4 project.wsgi --bind=0.0.0.0:8000 --worker-class=gthread --reload" + command: bash -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn --workers=4 project.wsgi --bind=0.0.0.0:8000 --worker-class=gthread --reload" env_file: - .env + volumes: + - ./data/media_dev:/app/media ports: - "127.0.0.1:${PORT}:8000" depends_on: @@ -35,13 +41,17 @@ services: - redis workers: - build: . + build: + context: ../ + dockerfile: docker/Dockerfile.dev restart: always volumes: - .:/lilcity command: bash -c "celery worker -A project -B" env_file: - .env + volumes: + - ./data/media_dev:/app/media depends_on: - db - redis From 3735be64b4f46737fa283788aee909713f20cff5 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 12:13:29 +0300 Subject: [PATCH 02/50] Fix dev docker files --- docker/docker-compose-dev.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docker/docker-compose-dev.yml b/docker/docker-compose-dev.yml index 6fca36dc..b5dcb589 100644 --- a/docker/docker-compose-dev.yml +++ b/docker/docker-compose-dev.yml @@ -26,11 +26,10 @@ services: restart: always volumes: - .:/lilcity + - ./data/media_dev:/app/media command: bash -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn --workers=4 project.wsgi --bind=0.0.0.0:8000 --worker-class=gthread --reload" env_file: - .env - volumes: - - ./data/media_dev:/app/media ports: - "127.0.0.1:${PORT}:8000" depends_on: @@ -47,11 +46,10 @@ services: restart: always volumes: - .:/lilcity + - ./data/media_dev:/app/media command: bash -c "celery worker -A project -B" env_file: - .env - volumes: - - ./data/media_dev:/app/media depends_on: - db - redis From bbce8f8b540266cb81ad535a5eed467df4469147 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 15:10:24 +0300 Subject: [PATCH 03/50] Fix dev docker files --- docker/docker-compose-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose-dev.yml b/docker/docker-compose-dev.yml index b5dcb589..bfabb42d 100644 --- a/docker/docker-compose-dev.yml +++ b/docker/docker-compose-dev.yml @@ -25,7 +25,7 @@ services: dockerfile: docker/Dockerfile.dev restart: always volumes: - - .:/lilcity + - ..:/app - ./data/media_dev:/app/media command: bash -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn --workers=4 project.wsgi --bind=0.0.0.0:8000 --worker-class=gthread --reload" env_file: @@ -45,7 +45,7 @@ services: dockerfile: docker/Dockerfile.dev restart: always volumes: - - .:/lilcity + - ..:/app - ./data/media_dev:/app/media command: bash -c "celery worker -A project -B" env_file: From 90121323ecd065780df8b4f594d6448f807da9f1 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 15:11:57 +0300 Subject: [PATCH 04/50] Add roistat settings --- docker/.env.example | 2 ++ project/settings.py | 3 +++ 2 files changed, 5 insertions(+) diff --git a/docker/.env.example b/docker/.env.example index bc750b18..94fdccb7 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -20,3 +20,5 @@ PAYMENTWALL_SECRET_KEY=4ea515bf94e34cf28646c2e12a7b8707 MIXPANEL_TOKEN=79bd6bfd98667ed977737e6810b8abcd RAVEN_DSN=https://b545dac0ae0545a1bcfc443326fe5850:6f9c900cef7f4c11b63561030b37d15c@sentry.io/1197254 ROISTAT_COUNTER_ID=09db30c750035ae3d70a41d5f10d59ec +ROISTAT_PROJECT=84418 +ROISTAT_KEY=a2d82a254478c1727adf0eb7ceb669f5 diff --git a/project/settings.py b/project/settings.py index c9ef5dee..61ae04e2 100644 --- a/project/settings.py +++ b/project/settings.py @@ -258,7 +258,10 @@ RAVEN_CONFIG = { } # Roistat counter id +ROISTAT_API_URL = 'https://cloud.roistat.com/api/v1' ROISTAT_COUNTER_ID = os.getenv('ROISTAT_COUNTER_ID', None) +ROISTAT_PROJECT = os.getenv('ROISTAT_PROJECT', None) +ROISTAT_KEY = os.getenv('ROISTAT_KEY', None) INSTAGRAM_RESULTS_PATH = 'media/instagram/results/' From 13eafdc5180245daea5f5f7e5b21b74adcfd3cb6 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 15:12:59 +0300 Subject: [PATCH 05/50] LIL-552. Add statuses upload management command --- apps/payment/management/__init__.py | 0 apps/payment/management/commands/__init__.py | 0 .../commands/roistat_set_statuses.py | 50 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 apps/payment/management/__init__.py create mode 100644 apps/payment/management/commands/__init__.py create mode 100644 apps/payment/management/commands/roistat_set_statuses.py diff --git a/apps/payment/management/__init__.py b/apps/payment/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/payment/management/commands/__init__.py b/apps/payment/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/payment/management/commands/roistat_set_statuses.py b/apps/payment/management/commands/roistat_set_statuses.py new file mode 100644 index 00000000..f3ac3e11 --- /dev/null +++ b/apps/payment/management/commands/roistat_set_statuses.py @@ -0,0 +1,50 @@ +import requests + +from paymentwall import Pingback + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError + + +class Command(BaseCommand): + help = 'Update statuses on Roistat' + + def handle(self, *args, **options): + body = [ + { + 'id': str(Pingback.PINGBACK_TYPE_REGULAR), + 'name': 'PINGBACK_TYPE_REGULAR', + 'type': 'paid', + }, + { + 'id': str(Pingback.PINGBACK_TYPE_GOODWILL), + 'name': 'PINGBACK_TYPE_GOODWILL', + 'type': 'paid', + }, + { + 'id': str(Pingback.PINGBACK_TYPE_NEGATIVE), + 'name': 'PINGBACK_TYPE_NEGATIVE', + 'type': 'canceled', + }, + { + 'id': str(Pingback.PINGBACK_TYPE_RISK_UNDER_REVIEW), + 'name': 'PINGBACK_TYPE_RISK_UNDER_REVIEW', + 'type': 'progress', + }, + { + 'id': str(Pingback.PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED), + 'name': 'PINGBACK_TYPE_RISK_REVIEWED_ACCEPTED', + 'type': 'paid', + }, + { + 'id': str(Pingback.PINGBACK_TYPE_RISK_REVIEWED_DECLINED), + 'name': 'PINGBACK_TYPE_RISK_REVIEWED_DECLINED', + 'type': 'canceled', + }, + ] + project = settings.ROISTAT_PROJECT + key = settings.ROISTAT_KEY + url = settings.ROISTAT_API_URL + f'/project/set-statuses?key={key}&project={project}' + resp = requests.post(url, json=body) + self.stdout.write(str(resp)) + self.stdout.write(str(resp.json())) From 382d9a76e81a20157f3bb0458570fc31ecf4cc09 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 15:15:04 +0300 Subject: [PATCH 06/50] LIL-551. Upload clients to roistat --- apps/user/management/__init__.py | 0 apps/user/management/commands/__init__.py | 0 .../management/commands/users_to_roistat.py | 32 +++++++++++++++++++ apps/user/tasks.py | 23 +++++++++++++ project/settings.py | 5 +++ 5 files changed, 60 insertions(+) create mode 100644 apps/user/management/__init__.py create mode 100644 apps/user/management/commands/__init__.py create mode 100644 apps/user/management/commands/users_to_roistat.py diff --git a/apps/user/management/__init__.py b/apps/user/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/user/management/commands/__init__.py b/apps/user/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/user/management/commands/users_to_roistat.py b/apps/user/management/commands/users_to_roistat.py new file mode 100644 index 00000000..84ae366e --- /dev/null +++ b/apps/user/management/commands/users_to_roistat.py @@ -0,0 +1,32 @@ +import requests + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.core.management.base import BaseCommand, CommandError + +# User = get_user_model() + +from apps.user.models import User + + +class Command(BaseCommand): + help = 'Upload users to Roistat' + + def handle(self, *args, **options): + users_queryset = User.objects.all() + users = [ + { + 'id': str(user.id), + 'name': user.get_full_name(), + 'phone': str(user.phone), + 'email': user.email, + 'birth_date': user.birthday.strftime('%d%m%Y') if user.birthday else None, + } + for user in users_queryset + ] + project = settings.ROISTAT_PROJECT + key = settings.ROISTAT_KEY + url = settings.ROISTAT_API_URL + f'/project/clients/import?key={key}&project={project}' + resp = requests.post(url, json=users) + self.stdout.write(str(resp)) + self.stdout.write(str(resp.json())) diff --git a/apps/user/tasks.py b/apps/user/tasks.py index a95988be..e35accef 100644 --- a/apps/user/tasks.py +++ b/apps/user/tasks.py @@ -1,6 +1,9 @@ +import requests + from mixpanel import Mixpanel from django.conf import settings +from django.contrib.auth import get_user_model from project.celery import app @@ -20,3 +23,23 @@ def user_to_mixpanel(user_id, email, phone, first_name, last_name, date_joined, 'subscriptions': subscriptions, } ) + + +@app.task +def users_to_roistat(): + User = get_user_model() + users_queryset = User.objects.all() + users = [ + { + 'id': str(user.id), + 'name': user.get_full_name(), + 'phone': str(user.phone), + 'email': user.email, + 'birth_date': user.birthday.strftime('%d%m%Y') if user.birthday else None, + } + for user in users_queryset + ] + project = settings.ROISTAT_PROJECT + key = settings.ROISTAT_KEY + url = settings.ROISTAT_API_URL + f'/project/clients/import?key={key}&project={project}' + resp = requests.post(url, json=users) diff --git a/project/settings.py b/project/settings.py index 61ae04e2..f3e69e23 100644 --- a/project/settings.py +++ b/project/settings.py @@ -222,6 +222,11 @@ CELERY_BEAT_SCHEDULE = { 'schedule': timedelta(minutes=5) if DEBUG else crontab(minute=0, hour=0), 'args': (), }, + 'update_users_in_roistat': { + 'task': 'apps.user.tasks.users_to_roistat', + 'schedule': timedelta(hours=1), + 'args': (), + }, } try: From fd41a6d69ae1399a06746f1192c4071446f627ec Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 30 Jun 2018 16:24:41 +0300 Subject: [PATCH 07/50] LIL-553. Send order to roistat --- apps/payment/tasks.py | 19 +++++++++++++++++++ apps/payment/views.py | 11 ++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/apps/payment/tasks.py b/apps/payment/tasks.py index 3f487f76..9c9de3d7 100644 --- a/apps/payment/tasks.py +++ b/apps/payment/tasks.py @@ -30,3 +30,22 @@ def product_payment_to_mixpanel(user_id, event_name, time, properties): event_name, properties=props, ) + + +@app.task +def transaction_to_roistat(user_id, payment_id, event_name, amount, time, status, product_type): + body = [{ + 'id': str(payment_id), + 'name': event_name, + 'date_create': time, + 'status': str(status), + 'price': str(amount), + 'client_id': str(user_id), + 'fields': { + 'product_type': product_type, + } + }] + project = settings.ROISTAT_PROJECT + key = settings.ROISTAT_KEY + url = settings.ROISTAT_API_URL + f'/project/add-orders?key={key}&project={project}' + resp = requests.post(url, json=body) diff --git a/apps/payment/views.py b/apps/payment/views.py index 84772ffa..492a43af 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -22,7 +22,7 @@ from paymentwall import Pingback, Product, Widget from apps.course.models import Course from apps.school.models import SchoolSchedule -from apps.payment.tasks import transaction_to_mixpanel, product_payment_to_mixpanel +from apps.payment.tasks import transaction_to_mixpanel, product_payment_to_mixpanel, transaction_to_roistat from .models import AuthorBalance, CoursePayment, SchoolPayment @@ -251,6 +251,15 @@ class PaymentwallCallbackView(View): properties, ) + transaction_to_roistat.delay( + payment.user.id, + payment.id, + f'{product_type_name.title()} payment', + payment.amount, + now().strftime('%Y-%m-%dT%H:%M:%S'), + pingback.get_type(), + product_type_name, + ) author_balance = getattr(payment, 'author_balance', None) if author_balance and author_balance.type == AuthorBalance.IN: if pingback.is_deliverable(): From 8280be6fb3ffead94571690d300a2ae27d385006 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 07:41:50 +0300 Subject: [PATCH 08/50] Fix transaction_to_roistat --- apps/payment/tasks.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/payment/tasks.py b/apps/payment/tasks.py index 9c9de3d7..f650f8bc 100644 --- a/apps/payment/tasks.py +++ b/apps/payment/tasks.py @@ -1,3 +1,5 @@ +import requests + from mixpanel import Mixpanel from django.conf import settings From 6419c15ef4a1a4a466f1f2a3c39d0a7ada6f21a1 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 08:21:33 +0300 Subject: [PATCH 09/50] Add logging for transaction_to_roistat --- apps/payment/tasks.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/payment/tasks.py b/apps/payment/tasks.py index f650f8bc..911235a3 100644 --- a/apps/payment/tasks.py +++ b/apps/payment/tasks.py @@ -1,3 +1,4 @@ +import logging import requests from mixpanel import Mixpanel @@ -6,6 +7,8 @@ from django.conf import settings from project.celery import app +logger = logging.getLogger(__name__) + @app.task def transaction_to_mixpanel(user_id, amount, time, product_type): @@ -51,3 +54,4 @@ def transaction_to_roistat(user_id, payment_id, event_name, amount, time, status key = settings.ROISTAT_KEY url = settings.ROISTAT_API_URL + f'/project/add-orders?key={key}&project={project}' resp = requests.post(url, json=body) + logger.info('TRANSACTION_TO_ROISTAT: ' + str(resp)) From 01f8202dc1501fbd312b1972bee373f9a2d028ea Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 08:30:24 +0300 Subject: [PATCH 10/50] Fix transaction_to_roistat --- apps/payment/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/payment/views.py b/apps/payment/views.py index 492a43af..9852e128 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -256,7 +256,7 @@ class PaymentwallCallbackView(View): payment.id, f'{product_type_name.title()} payment', payment.amount, - now().strftime('%Y-%m-%dT%H:%M:%S'), + now().strftime('%Y-%m-%d %H:%M:%S'), pingback.get_type(), product_type_name, ) From 82e22e79c7efb0a584a8fe91ec125c99ff39a54a Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 08:47:50 +0300 Subject: [PATCH 11/50] Fix ROISTAT_COUNTER_ID --- 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 0438f0de..d72dba67 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 bdb98c16796ccf1ac820b854da5f57c71b881063 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 08:55:39 +0300 Subject: [PATCH 12/50] Fix ROISTAT_COUNTER_ID --- 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 d72dba67..aad9670e 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 a9b96f3a3a9f9a822552363b5b0327de2304ecfc Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 08:59:42 +0300 Subject: [PATCH 13/50] Fix ROISTAT_COUNTER_ID --- 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 aad9670e..1da42b56 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 94460f967ddb514f3d54ab17c1171afcdfd7228d Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 11:03:25 +0300 Subject: [PATCH 14/50] Fix payment logic for first 1-10 days in month --- apps/payment/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/payment/views.py b/apps/payment/views.py index 9852e128..2ae7ef63 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -217,9 +217,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: - date_start = self.add_months(sourcedate=now().replace(hour=0, minute=0, day=1), months=1) - date__end = arrow.get(date_start).shift(months=1) - datetime.timedelta(minutes=1) - date_end = date__end.datetime + month = 0 if now().day >= 1 and now().day <= 10 else 1 + 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) - datetime.timedelta(minutes=1).datetime payment.date_start = date_start payment.date_end = date_end if product_type_name == 'course': From bcd553d5fdff11a58209e534b39bc7b28e621579 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 11:22:13 +0300 Subject: [PATCH 15/50] Fix https://sentry.lil.school/lil/backend/issues/21/ --- apps/payment/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/payment/views.py b/apps/payment/views.py index 2ae7ef63..34d35a0b 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -219,7 +219,7 @@ class PaymentwallCallbackView(View): else: month = 0 if now().day >= 1 and now().day <= 10 else 1 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) - datetime.timedelta(minutes=1).datetime + date_end = arrow.get(date_start).shift(months=1, minutes=-1).datetime payment.date_start = date_start payment.date_end = date_end if product_type_name == 'course': From 8d4fd5b3f61874d2d500b4354879611b9d40677a Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 11:55:19 +0300 Subject: [PATCH 16/50] Fix auto_create_subscription --- apps/user/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/user/models.py b/apps/user/models.py index f53fb977..e3b0cc7b 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -137,7 +137,7 @@ def send_user_info_to_mixpanel(sender, instance=None, created=False, **kwargs): def auto_create_subscription(sender, instance=None, created=False, **kwargs): try: es = EmailSubscription.objects.get(email=instance.email) - if not es.user: + if not hasattr(instance, 'email_subscription'): es.user = instance es.save() except EmailSubscription.DoesNotExist: From 5b22c5cc3bdddda723f4b8d02271b6f03ea9c73c Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 12:20:19 +0300 Subject: [PATCH 17/50] Fix https://sentry.lil.school/lil/backend/issues/11/ --- apps/auth/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/auth/views.py b/apps/auth/views.py index 1473d42b..f6105e75 100644 --- a/apps/auth/views.py +++ b/apps/auth/views.py @@ -37,8 +37,7 @@ class LearnerRegistrationView(FormView): password = form.cleaned_data['password'] user, created = User.objects.get_or_create( - username=email, email=email, - first_name=first_name, last_name=last_name + email=email, ) if not created: @@ -47,6 +46,10 @@ class LearnerRegistrationView(FormView): 'errors': {'__all__': [{'message': 'Возможно вы уже зарегистрированы?'}]} }, status=400) + user.username = email + user.first_name = first_name + user.last_name = last_name + user.set_password(password) user.save() login(self.request, user) From d9cba512a515506cd8f0c30786381da3e7a58b24 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 13:23:52 +0300 Subject: [PATCH 18/50] Add fb and google global tag --- project/templates/lilcity/index.html | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index 1da42b56..fb449534 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -52,6 +52,26 @@ COURSE_ID = "{{ course.id }}"; MIXPANEL_CUSTOM_LIB_URL = "/static/mixpanel-2-latest.js"; + + + + + {% include "templates/blocks/mixpanel.html" %} From 8fb74b000431bd6b3837b74aa22edcf40880e583 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 14:36:25 +0300 Subject: [PATCH 19/50] Fix dev docker files --- docker/docker-compose-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose-dev.yml b/docker/docker-compose-dev.yml index bfabb42d..9b636ee2 100644 --- a/docker/docker-compose-dev.yml +++ b/docker/docker-compose-dev.yml @@ -26,7 +26,7 @@ services: restart: always volumes: - ..:/app - - ./data/media_dev:/app/media + - ./data/media:/app/media command: bash -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn --workers=4 project.wsgi --bind=0.0.0.0:8000 --worker-class=gthread --reload" env_file: - .env @@ -46,7 +46,7 @@ services: restart: always volumes: - ..:/app - - ./data/media_dev:/app/media + - ./data/media:/app/media command: bash -c "celery worker -A project -B" env_file: - .env From 1562d00621f55bed2f17e174bb2adc689f768792 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 15:48:59 +0300 Subject: [PATCH 20/50] Add UniqueValidator for slug field of CourseCreateSerializer --- api/v1/serializers/course.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/v1/serializers/course.py b/api/v1/serializers/course.py index d07e58b5..d1e8dcba 100644 --- a/api/v1/serializers/course.py +++ b/api/v1/serializers/course.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from rest_framework.validators import UniqueValidator from apps.course.models import ( Category, Course, @@ -88,7 +89,9 @@ class CourseCreateSerializer(DispatchContentMixin, ): title = serializers.CharField(allow_blank=True) short_description = serializers.CharField(allow_blank=True) - slug = serializers.SlugField(allow_unicode=True, allow_blank=True, allow_null=True, required=False) + slug = serializers.SlugField( + allow_unicode=True, allow_blank=True, allow_null=True, + required=False, validators=[UniqueValidator(queryset=Course.objects.all())]) content = serializers.ListSerializer( child=ContentCreateSerializer(), required=False, From 6297ec5826bcca812b73427de78f1a25ddb37dc2 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sun, 1 Jul 2018 18:26:33 +0300 Subject: [PATCH 21/50] Fix https://sentry.lil.school/lil/backend/issues/13/ --- apps/user/models.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/apps/user/models.py b/apps/user/models.py index e3b0cc7b..7391b0c8 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -135,18 +135,11 @@ def send_user_info_to_mixpanel(sender, instance=None, created=False, **kwargs): @receiver(post_save, sender=User) def auto_create_subscription(sender, instance=None, created=False, **kwargs): - try: - es = EmailSubscription.objects.get(email=instance.email) - if not hasattr(instance, 'email_subscription'): - es.user = instance - es.save() - except EmailSubscription.DoesNotExist: - instance.email_subscription = EmailSubscription.objects.create( - user=instance, - email=instance.email, - ) + if created: + es, created = EmailSubscription.objects.get_or_create(email=instance.email) + es.user = instance + es.save() instance.email_subscription.categories.set(SubscriptionCategory.objects.filter(auto_add=True)) - instance.save() class AuthorRequestManager(models.Manager): From a6e0abac583053423499a0de5acd5ce2641c5e3a Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Mon, 2 Jul 2018 08:26:26 +0300 Subject: [PATCH 22/50] LIL-557. Add coming soon block --- apps/school/models.py | 5 +++++ project/templates/blocks/promo.html | 7 ++++++- project/views.py | 9 +++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/school/models.py b/apps/school/models.py index f63a2024..eaa17664 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -1,3 +1,4 @@ +import arrow from datetime import datetime, timedelta from django.db import models @@ -65,6 +66,10 @@ class SchoolSchedule(models.Model): ).first() return live_lesson + @property + def start_at_humanize(self): + return arrow.get(self.start_at).humanize(locale='ru') if self.start_at else None + class SchoolScheduleImage(models.Model): schoolschedule = models.ForeignKey( diff --git a/project/templates/blocks/promo.html b/project/templates/blocks/promo.html index 9c37b96a..7f179344 100644 --- a/project/templates/blocks/promo.html +++ b/project/templates/blocks/promo.html @@ -11,6 +11,10 @@
Lil School — первая образовательная онлайн-платформа креативного мышления для детей
+ {% if online_coming_soon and school_schedule and school_schedule.start_at_humanize %} +
До начала урока «{{ school_schedule.title }}»
+
{{ school_schedule.start_at_humanize }}
+ {% else %}
Присоединяйтесь в Рисовальный лагерь
@@ -30,8 +34,9 @@ {% if is_purchased_future and not is_purchased %}ваша подписка начинается {{school_purchased_future.date_start}}{% endif %} {% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}
перейти к оплате{% endif %} - О лагере + {% endif %} + diff --git a/project/views.py b/project/views.py index 61e62c90..2f6b62b1 100644 --- a/project/views.py +++ b/project/views.py @@ -27,6 +27,8 @@ class IndexView(TemplateView): school_schedule = SchoolSchedule.objects.get(weekday=now_time.isoweekday()) except SchoolSchedule.DoesNotExist: online = False + online_coming_soon = False + school_schedule = None else: end_at = datetime.combine(now_time.today(), school_schedule.start_at) online = ( @@ -34,6 +36,12 @@ class IndexView(TemplateView): (end_at + timedelta(hours=2)).time() >= now_time.time() and school_schedule.current_live_lesson() ) + online_coming_soon = ( + school_schedule.start_at < now_time.time() and + (school_schedule.start_at - timedelta(hours=5)).time() >= now_time.time() and + school_schedule.current_live_lesson() + ) + date_now = now_time.date() if self.request.user.is_authenticated: school_payment = SchoolPayment.objects.filter( @@ -62,6 +70,7 @@ class IndexView(TemplateView): context.update({ 'online': online, + 'online_coming_soon': online_coming_soon, 'course_items': Course.objects.filter(status=Course.PUBLISHED)[:6], 'is_purchased': school_payment_exists, 'min_school_price': SchoolSchedule.objects.aggregate(Min('month_price'))['month_price__min'], From 75e7d097b3c28d22c609cdc07491438f64d346d2 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Mon, 2 Jul 2018 08:42:29 +0300 Subject: [PATCH 23/50] LIL-557. Fix condition in promo block --- project/templates/blocks/promo.html | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/project/templates/blocks/promo.html b/project/templates/blocks/promo.html index 7f179344..a4faf5f6 100644 --- a/project/templates/blocks/promo.html +++ b/project/templates/blocks/promo.html @@ -12,8 +12,12 @@ Lil School — первая образовательная онлайн-платформа креативного мышления для детей {% if online_coming_soon and school_schedule and school_schedule.start_at_humanize %} -
До начала урока «{{ school_schedule.title }}»
-
{{ school_schedule.start_at_humanize }}
+
+ До начала урока «{{ school_schedule.title }}» +
+
+ {{ school_schedule.start_at_humanize }} +
{% else %}
Присоединяйтесь в Рисовальный лагерь @@ -35,8 +39,7 @@ {% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}
перейти к оплате{% endif %} О лагере - {% endif %} -
+ {% endif %} From 74c8edf6cfe69f3622a1c3c046708d661100282a Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Mon, 2 Jul 2018 09:45:19 +0300 Subject: [PATCH 24/50] Update coming soon live lesson block in promo --- apps/school/models.py | 2 +- project/views.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/school/models.py b/apps/school/models.py index eaa17664..f1dcc168 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -68,7 +68,7 @@ class SchoolSchedule(models.Model): @property def start_at_humanize(self): - return arrow.get(self.start_at).humanize(locale='ru') if self.start_at else None + return arrow.get(datetime.combine(datetime.today(), self.start_at)).humanize(locale='ru') if self.start_at else None class SchoolScheduleImage(models.Model): diff --git a/project/views.py b/project/views.py index 2f6b62b1..ea165c91 100644 --- a/project/views.py +++ b/project/views.py @@ -37,8 +37,10 @@ class IndexView(TemplateView): school_schedule.current_live_lesson() ) online_coming_soon = ( - school_schedule.start_at < now_time.time() and - (school_schedule.start_at - timedelta(hours=5)).time() >= now_time.time() and + school_schedule.start_at > now_time.time() and + ( + datetime.combine(datetime.today(), school_schedule.start_at) - timedelta(hours=5) + ).time() <= now_time.time() and school_schedule.current_live_lesson() ) @@ -71,6 +73,7 @@ class IndexView(TemplateView): context.update({ 'online': online, 'online_coming_soon': online_coming_soon, + 'school_schedule': school_schedule, 'course_items': Course.objects.filter(status=Course.PUBLISHED)[:6], 'is_purchased': school_payment_exists, 'min_school_price': SchoolSchedule.objects.aggregate(Min('month_price'))['month_price__min'], From 257b3aa8ab17293788396c1a9c5d205e1fb546a7 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Mon, 2 Jul 2018 13:57:47 +0300 Subject: [PATCH 25/50] LIL-557. Add coming soon button --- apps/school/models.py | 4 ++++ project/templates/blocks/promo.html | 30 +++++++++++++++++++++++++++-- project/views.py | 2 +- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/school/models.py b/apps/school/models.py index f1dcc168..35788640 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -2,6 +2,7 @@ import arrow from datetime import datetime, timedelta from django.db import models +from django.urls import reverse_lazy from django.utils.timezone import now from project.mixins import BaseModel, DeactivatedMixin @@ -126,6 +127,9 @@ class LiveLesson(BaseModel, DeactivatedMixin): self.date = (datetime.combine(self.date, now().time()) + timedelta(days=1)).date() super().save(*args, **kwargs) + def get_absolute_url(self): + return reverse_lazy('school:lesson-detail', args=[str(self.id)]) + def stream_index(self): return self.stream.split('/')[-1] diff --git a/project/templates/blocks/promo.html b/project/templates/blocks/promo.html index a4faf5f6..8fa641f4 100644 --- a/project/templates/blocks/promo.html +++ b/project/templates/blocks/promo.html @@ -11,13 +11,39 @@
Lil School — первая образовательная онлайн-платформа креативного мышления для детей
- {% if online_coming_soon and school_schedule and school_schedule.start_at_humanize %} + {% if user.is_authenticated and online %}
- До начала урока «{{ school_schedule.title }}» + Сейчас идёт прямой эфир урока «{{ school_schedule.title }}» +
+ + {% elif user.is_authenticated and online_coming_soon and school_schedule and school_schedule.start_at_humanize %} +
+ Урок «{{ school_schedule.title }}» начнётся
{{ school_schedule.start_at_humanize }}
+ {% else %}
Присоединяйтесь в Рисовальный лагерь diff --git a/project/views.py b/project/views.py index ea165c91..17395e62 100644 --- a/project/views.py +++ b/project/views.py @@ -39,7 +39,7 @@ class IndexView(TemplateView): online_coming_soon = ( school_schedule.start_at > now_time.time() and ( - datetime.combine(datetime.today(), school_schedule.start_at) - timedelta(hours=5) + datetime.combine(datetime.today(), school_schedule.start_at) - timedelta(hours=12) ).time() <= now_time.time() and school_schedule.current_live_lesson() ) From 06830f6c6320502c6f307cb559e4495520feb031 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 2 Jul 2018 22:42:22 +0300 Subject: [PATCH 26/50] 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 27/50] 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 28/50] 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 29/50] 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 30/50] 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 88c863b2d24c854b2a3a8eb8fa89101fdd86b5b5 Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 08:15:32 +0300 Subject: [PATCH 31/50] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D1=82=D1=8C=20=D1=83=D1=80=D0=BE=D0=BA=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D0=BE=D0=B2=20=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B4=D0=B0=D1=82=D1=83=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit bef9ba5) --- apps/school/templates/blocks/_schedule_purchased_item.html | 4 ++-- apps/school/templates/summer/_schedule_purchased_item.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/school/templates/blocks/_schedule_purchased_item.html b/apps/school/templates/blocks/_schedule_purchased_item.html index 416a4f4f..5690d7aa 100644 --- a/apps/school/templates/blocks/_schedule_purchased_item.html +++ b/apps/school/templates/blocks/_schedule_purchased_item.html @@ -6,12 +6,12 @@ {{ school_schedule }}
{% if live_lesson %} - +
{{ live_lesson.date }}
{% endif %}
{{ school_schedule.start_at }} (МСК)
- {% if school_schedule.weekday in school_schedules_purchased and live_lesson %} + {% if school_schedule.weekday in school_schedules_purchased and live_lesson and live_lesson.title %} {% include './open_lesson.html' %} {% else %} {% include './day_pay_btn.html' %} diff --git a/apps/school/templates/summer/_schedule_purchased_item.html b/apps/school/templates/summer/_schedule_purchased_item.html index 416a4f4f..5690d7aa 100644 --- a/apps/school/templates/summer/_schedule_purchased_item.html +++ b/apps/school/templates/summer/_schedule_purchased_item.html @@ -6,12 +6,12 @@ {{ school_schedule }}
{% if live_lesson %} - +
{{ live_lesson.date }}
{% endif %}
{{ school_schedule.start_at }} (МСК)
- {% if school_schedule.weekday in school_schedules_purchased and live_lesson %} + {% if school_schedule.weekday in school_schedules_purchased and live_lesson and live_lesson.title %} {% include './open_lesson.html' %} {% else %} {% include './day_pay_btn.html' %} From 0d0652463f1d13e9baed961a6ab1df05f580a59f Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 08:21:20 +0300 Subject: [PATCH 32/50] =?UTF-8?q?=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D1=82=D1=8C=20=D1=83=D1=80=D0=BE=D0=BA=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BA=D1=83?= =?UTF-8?q?=D1=80=D1=81=D0=BE=D0=B2=20=D0=9F=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B4=D0=B0=D1=82=D1=83=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/templates/blocks/_schedule_purchased_item.html | 8 +++++--- .../school/templates/summer/_schedule_purchased_item.html | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/school/templates/blocks/_schedule_purchased_item.html b/apps/school/templates/blocks/_schedule_purchased_item.html index 5690d7aa..00656e4a 100644 --- a/apps/school/templates/blocks/_schedule_purchased_item.html +++ b/apps/school/templates/blocks/_schedule_purchased_item.html @@ -11,10 +11,12 @@
{{ school_schedule.start_at }} (МСК)
- {% if school_schedule.weekday in school_schedules_purchased and live_lesson and live_lesson.title %} - {% include './open_lesson.html' %} + {% 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' %} + {% include './day_pay_btn.html' %} {% endif %}
{% comment %} diff --git a/apps/school/templates/summer/_schedule_purchased_item.html b/apps/school/templates/summer/_schedule_purchased_item.html index 5690d7aa..00656e4a 100644 --- a/apps/school/templates/summer/_schedule_purchased_item.html +++ b/apps/school/templates/summer/_schedule_purchased_item.html @@ -11,10 +11,12 @@
{{ school_schedule.start_at }} (МСК)
- {% if school_schedule.weekday in school_schedules_purchased and live_lesson and live_lesson.title %} - {% include './open_lesson.html' %} + {% 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' %} + {% include './day_pay_btn.html' %} {% endif %}
{% comment %} From 7000f2456cc4db33267c664a7d100d9d6561713b Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 08:27:23 +0300 Subject: [PATCH 33/50] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D1=8E=D1=8E=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BA=D1=83=20=C2=AB=D0=9F=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8?= =?UTF-8?q?=20=D0=BA=20=D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B5=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/templates/blocks/about.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/project/templates/blocks/about.html b/project/templates/blocks/about.html index 4caf08de..0fd05e03 100644 --- a/project/templates/blocks/about.html +++ b/project/templates/blocks/about.html @@ -56,8 +56,6 @@ href="#" > {% if not is_purchased and not is_purchased_future %}купить доступ от {{ min_school_price }} руб./месяц{% endif %} - {% if is_purchased_future and not is_purchased %}ваша подписка начинается {{school_purchased_future.date_start}}{% endif %} - {% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}
перейти к оплате{% endif %} From 399a7ba53ef833431e9155c18196acd08d380202 Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 08:30:54 +0300 Subject: [PATCH 34/50] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D1=8E=D1=8E=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BA=D1=83=20=C2=AB=D0=9F=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8?= =?UTF-8?q?=20=D0=BA=20=D0=BE=D0=BF=D0=BB=D0=B0=D1=82=D0=B5=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/templates/blocks/about.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/project/templates/blocks/about.html b/project/templates/blocks/about.html index 0fd05e03..8deec906 100644 --- a/project/templates/blocks/about.html +++ b/project/templates/blocks/about.html @@ -44,19 +44,19 @@
- - {% if not is_purchased and not is_purchased_future %}купить доступ от {{ min_school_price }} руб./месяц{% endif %} - + > + купить доступ от {{ min_school_price }} руб./месяц + + {% endif %}
From 9d3f86cedec160c9f4dfb78594580f22bb43e702 Mon Sep 17 00:00:00 2001 From: nikita Date: Tue, 3 Jul 2018 08:36:46 +0300 Subject: [PATCH 35/50] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B5=D1=89=D0=B5=20=D0=BD=D0=B5=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/school/templates/blocks/_schedule_purchased_item.html | 4 ++-- apps/school/templates/summer/_schedule_purchased_item.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/school/templates/blocks/_schedule_purchased_item.html b/apps/school/templates/blocks/_schedule_purchased_item.html index 00656e4a..b9d1db1f 100644 --- a/apps/school/templates/blocks/_schedule_purchased_item.html +++ b/apps/school/templates/blocks/_schedule_purchased_item.html @@ -36,12 +36,12 @@
-
{{ school_schedule.title }}{% if live_lesson %}, +
{{ school_schedule.title }}{% if live_lesson and live_lesson.title %}, {{ live_lesson.title }} {% endif %}
- {% if live_lesson %} + {% if live_lesson and live_lesson.short_description %} {{ live_lesson.short_description }} {% else %} {{ school_schedule.description }} diff --git a/apps/school/templates/summer/_schedule_purchased_item.html b/apps/school/templates/summer/_schedule_purchased_item.html index 00656e4a..b9d1db1f 100644 --- a/apps/school/templates/summer/_schedule_purchased_item.html +++ b/apps/school/templates/summer/_schedule_purchased_item.html @@ -36,12 +36,12 @@
-
{{ school_schedule.title }}{% if live_lesson %}, +
{{ school_schedule.title }}{% if live_lesson and live_lesson.title %}, {{ live_lesson.title }} {% endif %}
- {% if live_lesson %} + {% if live_lesson and live_lesson.short_description %} {{ live_lesson.short_description }} {% else %} {{ school_schedule.description }} From 7a931aadcd2df63516685b564b0e31ff10d86232 Mon Sep 17 00:00:00 2001 From: gzbender Date: Tue, 3 Jul 2018 14:23:01 +0500 Subject: [PATCH 36/50] =?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 fbbb59b975bf5595ee95032578547477a68cc53b Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Tue, 3 Jul 2018 12:38:41 +0300 Subject: [PATCH 37/50] LIL-536. Update static version dynamically --- project/settings.py | 8 ++++++++ project/templates/lilcity/index.html | 7 ++++++- requirements.txt | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/project/settings.py b/project/settings.py index f3e69e23..fe902536 100644 --- a/project/settings.py +++ b/project/settings.py @@ -44,6 +44,7 @@ INSTALLED_APPS = [ ] + [ 'anymail', 'active_link', + 'compressor', 'django_filters', 'polymorphic_tree', 'polymorphic', @@ -161,6 +162,11 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'web/build'), ] +STATICFILES_FINDERS = [ + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + 'compressor.finders.CompressorFinder', +] MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') @@ -272,6 +278,8 @@ INSTAGRAM_RESULTS_PATH = 'media/instagram/results/' DATA_UPLOAD_MAX_MEMORY_SIZE = 20242880 +COMPRESS_ENABLED = True + try: from .local_settings import * except ImportError: diff --git a/project/templates/lilcity/index.html b/project/templates/lilcity/index.html index fb449534..30b5541a 100644 --- a/project/templates/lilcity/index.html +++ b/project/templates/lilcity/index.html @@ -1,5 +1,6 @@ {% load static %} {% load setting from settings %} +{% load compress %} @@ -31,7 +32,11 @@ {% comment %} {% endcomment %} - + + {% compress css %} + + {% endcompress %} + {% 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 40/50] 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 41/50] 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 42/50] 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 47/50] 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 7782042377d98759070f4afb17b48df835615ebd Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Fri, 6 Jul 2018 07:55:56 +0300 Subject: [PATCH 48/50] LIL-563. Add roistat visit field to payment --- apps/payment/admin.py | 3 ++- .../migrations/0019_payment_roistat_visit.py | 18 ++++++++++++++++++ apps/payment/models.py | 1 + apps/payment/views.py | 5 +++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 apps/payment/migrations/0019_payment_roistat_visit.py diff --git a/apps/payment/admin.py b/apps/payment/admin.py index 47dde452..19166563 100644 --- a/apps/payment/admin.py +++ b/apps/payment/admin.py @@ -28,10 +28,11 @@ class PaymentChildAdmin(PolymorphicChildModelAdmin): 'user', 'amount', 'status', + 'roistat_visit', 'created_at', ) base_fieldsets = ( - (None, {'fields': ('user', 'amount', 'status', 'data',)}), + (None, {'fields': ('user', 'amount', 'status', 'data', 'roistat_visit',)}), ) readonly_fields = ('amount', 'data',) diff --git a/apps/payment/migrations/0019_payment_roistat_visit.py b/apps/payment/migrations/0019_payment_roistat_visit.py new file mode 100644 index 00000000..4f7fa40e --- /dev/null +++ b/apps/payment/migrations/0019_payment_roistat_visit.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.7 on 2018-07-06 07:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0018_auto_20180512_1202'), + ] + + operations = [ + migrations.AddField( + model_name='payment', + name='roistat_visit', + field=models.PositiveIntegerField(editable=False, null=True, verbose_name='Номер визита Roistat'), + ), + ] diff --git a/apps/payment/models.py b/apps/payment/models.py index b1368dc4..32d7a0e9 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -97,6 +97,7 @@ class Payment(PolymorphicModel): amount = models.DecimalField('Итого', max_digits=8, decimal_places=2, default=0, editable=False) status = models.PositiveSmallIntegerField('Статус платежа', choices=PW_STATUS_CHOICES, null=True) data = JSONField('Данные платежа от провайдера', default={}, editable=False) + roistat_visit = models.PositiveIntegerField('Номер визита Roistat', null=True, editable=False) created_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) diff --git a/apps/payment/views.py b/apps/payment/views.py index 34d35a0b..6facfaee 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -58,12 +58,14 @@ class CourseBuyView(TemplateView): host = urlsplit(self.request.META.get('HTTP_REFERER')) host = str(host[0]) + '://' + str(host[1]) course = Course.objects.get(id=pk) + roistat_visit = request.COOKIES.get('roistat_visit', None) if request.user == course.author: messages.error(request, 'Вы не можете приобрести свой курс.') return redirect(reverse_lazy('course', args=[course.id])) course_payment = CoursePayment.objects.create( user=request.user, course=course, + roistat_visit=roistat_visit, ) product = Product( f'course_{course_payment.id}', @@ -96,6 +98,7 @@ class SchoolBuyView(TemplateView): host = str(host[0]) + '://' + str(host[1]) weekdays = set(request.GET.getlist('weekdays', [])) add_days = 'add_days' in request.GET + roistat_visit = request.COOKIES.get('roistat_visit', None) if not weekdays: messages.error(request, 'Выберите несколько дней недели.') return redirect('school:summer-school') @@ -117,6 +120,7 @@ class SchoolBuyView(TemplateView): date_start=now().date(), date_end=_school_payment.date_end, add_days=True, + roistat_visit=roistat_visit, ) if school_payment.amount <= 0: messages.error(request, 'Выбранные дни отсутствуют в оставшемся периоде подписки') @@ -125,6 +129,7 @@ class SchoolBuyView(TemplateView): school_payment = SchoolPayment.objects.create( user=request.user, weekdays=weekdays, + roistat_visit=roistat_visit, ) product = Product( f'school_{school_payment.id}', From d377668b52e4362054344b7efc6991f78a3766fc Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Fri, 6 Jul 2018 08:03:49 +0300 Subject: [PATCH 49/50] LIL-563. Add roistat visit to transaction_to_roistat --- apps/payment/tasks.py | 3 ++- apps/payment/views.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/payment/tasks.py b/apps/payment/tasks.py index 911235a3..f6140af6 100644 --- a/apps/payment/tasks.py +++ b/apps/payment/tasks.py @@ -38,12 +38,13 @@ def product_payment_to_mixpanel(user_id, event_name, time, properties): @app.task -def transaction_to_roistat(user_id, payment_id, event_name, amount, time, status, product_type): +def transaction_to_roistat(user_id, payment_id, event_name, amount, time, status, product_type, roistat_visit): body = [{ 'id': str(payment_id), 'name': event_name, 'date_create': time, 'status': str(status), + 'roistat': str(roistat_visit) if roistat_visit or None, 'price': str(amount), 'client_id': str(user_id), 'fields': { diff --git a/apps/payment/views.py b/apps/payment/views.py index 6facfaee..4f4a958a 100644 --- a/apps/payment/views.py +++ b/apps/payment/views.py @@ -264,6 +264,7 @@ class PaymentwallCallbackView(View): now().strftime('%Y-%m-%d %H:%M:%S'), pingback.get_type(), product_type_name, + payment.roistat_visit, ) author_balance = getattr(payment, 'author_balance', None) if author_balance and author_balance.type == AuthorBalance.IN: From 918d70272ade784f46c97f298b4cc965e807c0ae Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Fri, 6 Jul 2018 08:05:32 +0300 Subject: [PATCH 50/50] fix --- apps/payment/tasks.py | 2 +- requirements.txt | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/payment/tasks.py b/apps/payment/tasks.py index f6140af6..e30f4e19 100644 --- a/apps/payment/tasks.py +++ b/apps/payment/tasks.py @@ -44,7 +44,7 @@ def transaction_to_roistat(user_id, payment_id, event_name, amount, time, status 'name': event_name, 'date_create': time, 'status': str(status), - 'roistat': str(roistat_visit) if roistat_visit or None, + 'roistat': str(roistat_visit) if roistat_visit else None, 'price': str(amount), 'client_id': str(user_id), 'fields': { diff --git a/requirements.txt b/requirements.txt index 68723b36..63995574 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,27 +1,26 @@ # Python-3.6 arrow==0.12.1 celery[redis]==4.2.0 -Django==2.0.6 +Django==2.0.7 django-active-link==0.1.5 django-anymail[mailgun]==3.0 django-cors-headers==2.3.0 django_compressor==2.2 django-filter==2.0.0.dev1 django-mptt==0.9.0 -django-silk==3.0.0 django-phonenumber-field==2.0.0 django-polymorphic-tree==1.5 djangorestframework==3.8.2 -drf-yasg[validation]==1.9.0 +drf-yasg==1.9.0 facepy==1.0.9 -gunicorn==19.8.1 +gunicorn==19.9.0 mixpanel==4.3.2 psycopg2-binary==2.7.5 -Pillow==5.1.0 +Pillow==5.2.0 raven==6.9.0 requests==2.19.1 sorl-thumbnail==12.4.1 -twilio==6.14.6 +twilio==6.14.7 # paymentwall-python==1.0.7 git+https://github.com/ivlevdenis/paymentwall-python.git # python-instagram==1.3.2