diff --git a/Makefile b/Makefile index de5cc2ed..09bc7fb1 100644 --- a/Makefile +++ b/Makefile @@ -12,3 +12,5 @@ run: cd landing_page; DEBUG=1 python manage.py runserver shell: cd landing_page; DEBUG=1 python manage.py shell +migrate: + cd landing_page; DEBUG=1 python manage.py migrate diff --git a/landing_page/landing_page/settings.py b/landing_page/landing_page/settings.py index 29285c74..8c759562 100644 --- a/landing_page/landing_page/settings.py +++ b/landing_page/landing_page/settings.py @@ -9,7 +9,7 @@ ALLOWED_HOSTS = ['*'] CSRF_TRUSTED_ORIGINS = ['https://learn.python.ru'] -X_FRAME_OPTIONS = "ALLOW" +X_FRAME_OPTIONS = "SAMEORIGIN" INSTALLED_APPS = [ 'mainpage.apps.MainpageConfig', @@ -23,6 +23,7 @@ 'django.contrib.sitemaps', 'memoize', + 'waffle', ] MIDDLEWARE = [ @@ -33,6 +34,7 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'waffle.middleware.WaffleMiddleware', ] ROOT_URLCONF = 'landing_page.urls' diff --git a/landing_page/mainpage/models.py b/landing_page/mainpage/models.py index 416a892a..b34a9eeb 100644 --- a/landing_page/mainpage/models.py +++ b/landing_page/mainpage/models.py @@ -96,3 +96,6 @@ class CourseReview(models.Model): review_for = models.CharField(max_length=10, choices=EnrollmentType.get_choices(), null=True, blank=True) reviewer_name = models.CharField(max_length=254, null=True, blank=True) reviewed_at = models.DateField() + + def __str__(self) -> str: + return f'{self.title} ({self.review_for})' diff --git a/landing_page/mainpage/static/css/style.css b/landing_page/mainpage/static/css/style.css index 801879af..0334c792 100644 --- a/landing_page/mainpage/static/css/style.css +++ b/landing_page/mainpage/static/css/style.css @@ -4762,3 +4762,8 @@ ul.installment-plan li:before { text-transform: none; } +.advanced-promo { + background: #252526; + color: #ffffff; + padding: 15px; +} diff --git a/landing_page/mainpage/static/images/favicon_lp_120.png b/landing_page/mainpage/static/images/favicon_lp_120.png new file mode 100644 index 00000000..98e5ab00 Binary files /dev/null and b/landing_page/mainpage/static/images/favicon_lp_120.png differ diff --git a/landing_page/mainpage/static/images/favicon_lp_16.png b/landing_page/mainpage/static/images/favicon_lp_16.png new file mode 100644 index 00000000..eb69d5b4 Binary files /dev/null and b/landing_page/mainpage/static/images/favicon_lp_16.png differ diff --git a/landing_page/mainpage/static/images/favicon_lpa_120.png b/landing_page/mainpage/static/images/favicon_lpa_120.png new file mode 100644 index 00000000..e1f001fc Binary files /dev/null and b/landing_page/mainpage/static/images/favicon_lpa_120.png differ diff --git a/landing_page/mainpage/static/images/favicon_lpa_16.png b/landing_page/mainpage/static/images/favicon_lpa_16.png new file mode 100644 index 00000000..23765864 Binary files /dev/null and b/landing_page/mainpage/static/images/favicon_lpa_16.png differ diff --git a/landing_page/mainpage/static/js/widgets/advance_widget.js b/landing_page/mainpage/static/js/widgets/advance_widget.js new file mode 100644 index 00000000..bb35fffe --- /dev/null +++ b/landing_page/mainpage/static/js/widgets/advance_widget.js @@ -0,0 +1,69 @@ +document.addEventListener("DOMContentLoaded", function() { + var script = document.getElementById('f5be3bcced9b8d99a4cc095aadcc152acc1c0aa02'); + + var par = script.parentNode; + script.parentNode.style.overflow = 'hidden'; + + var iframe = document.createElement('iframe'); + iframe.src = 'https://learnpythonru.getcourse.ru/pl/lite/widget/widget' + + "?" + window.location.search.substring(1) + + "&id=1151238" + + "&ref=" + encodeURIComponent(document.referrer) + + "&loc=" + encodeURIComponent(document.location.href); + iframe.style.width = '100%'; + iframe.style.height = '0px'; + iframe.style.border = 'none'; + iframe.style.overflow = 'hidden'; + iframe.setAttribute('allowfullscreen', 'allowfullscreen'); + iframe.className = '511'; + iframe.id = 'c6b45c08ef83f13b64a41560165b2147de61cf2a' + '_' + iframe.className; + // name можно получить изнутри iframe + iframe.name = iframe.className; + + var iframeId = iframe.id; + + var gcEmbedOnMessage = function(e) { + var insertedIframe = document.getElementById(iframeId); + if (!insertedIframe) { + return; + } + + if (e.data.uniqName == 'f5be3bcced9b8d99a4cc095aadcc152acc1c0aa0') { + if (e.data.height) { + if (e.data.iframeName) { + if (e.data.iframeName == iframe.name) { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } else { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } + } + }; + + if (window.addEventListener) { + window.addEventListener("message", gcEmbedOnMessage, false); + } else if (window.attachEvent) { + window.attachEvent('onmessage', gcEmbedOnMessage) + } else { + window['onmessage'] = gcEmbedOnMessage + } + + script.parentNode.insertBefore(iframe, script); + par.removeChild( script ) +}); + +var getLocation = function(href) { + var l = document.createElement("a"); + l.href = href; + return l; +}; + +var currentScript = document.currentScript || (function() { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; +})(); + +var domain = ( (getLocation( currentScript.src )).hostname ); \ No newline at end of file diff --git a/landing_page/mainpage/static/js/widgets/advance_widget_bottom.js b/landing_page/mainpage/static/js/widgets/advance_widget_bottom.js new file mode 100644 index 00000000..d40b05d8 --- /dev/null +++ b/landing_page/mainpage/static/js/widgets/advance_widget_bottom.js @@ -0,0 +1,69 @@ +document.addEventListener("DOMContentLoaded", function() { + var script = document.getElementById('f5be3bcced9b8d99a4cc095aadcc152acc1c0aa0'); + + var par = script.parentNode; + script.parentNode.style.overflow = 'hidden'; + + var iframe = document.createElement('iframe'); + iframe.src = 'https://learnpythonru.getcourse.ru/pl/lite/widget/widget' + + "?" + window.location.search.substring(1) + + "&id=1151238" + + "&ref=" + encodeURIComponent(document.referrer) + + "&loc=" + encodeURIComponent(document.location.href); + iframe.style.width = '100%'; + iframe.style.height = '0px'; + iframe.style.border = 'none'; + iframe.style.overflow = 'hidden'; + iframe.setAttribute('allowfullscreen', 'allowfullscreen'); + iframe.className = '51'; + iframe.id = 'c6b45c08ef83f13b64a41560165b2147de61cf2a' + '_' + iframe.className; + // name можно получить изнутри iframe + iframe.name = iframe.className; + + var iframeId = iframe.id; + + var gcEmbedOnMessage = function(e) { + var insertedIframe = document.getElementById(iframeId); + if (!insertedIframe) { + return; + } + + if (e.data.uniqName == 'f5be3bcced9b8d99a4cc095aadcc152acc1c0aa0') { + if (e.data.height) { + if (e.data.iframeName) { + if (e.data.iframeName == iframe.name) { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } else { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } + } + }; + + if (window.addEventListener) { + window.addEventListener("message", gcEmbedOnMessage, false); + } else if (window.attachEvent) { + window.attachEvent('onmessage', gcEmbedOnMessage) + } else { + window['onmessage'] = gcEmbedOnMessage + } + + script.parentNode.insertBefore(iframe, script); + par.removeChild( script ) +}); + +var getLocation = function(href) { + var l = document.createElement("a"); + l.href = href; + return l; +}; + +var currentScript = document.currentScript || (function() { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; +})(); + +var domain = ( (getLocation( currentScript.src )).hostname ); \ No newline at end of file diff --git a/landing_page/mainpage/static/js/widgets/widget.js b/landing_page/mainpage/static/js/widgets/widget.js new file mode 100644 index 00000000..cbe5de5f --- /dev/null +++ b/landing_page/mainpage/static/js/widgets/widget.js @@ -0,0 +1,71 @@ +console.log('in file') + +document.addEventListener("DOMContentLoaded", function() { + var script = document.getElementById('3e6321862d90cf3a72c6198927067b35e82b0b822'); + // var script = document.currentScript; + var par = script.parentNode; + script.parentNode.style.overflow = 'hidden'; + + var iframe = document.createElement('iframe'); + iframe.src = 'https://learnpythonru.getcourse.ru/pl/lite/widget/widget' + + "?" + window.location.search.substring(1) + + "&id=1139675" + + "&ref=" + encodeURIComponent(document.referrer) + + "&loc=" + encodeURIComponent(document.location.href); + iframe.style.width = '100%'; + iframe.style.height = '0px'; + iframe.style.border = 'none'; + iframe.style.overflow = 'hidden'; + iframe.setAttribute('allowfullscreen', 'allowfullscreen'); + iframe.className = '941'; + iframe.id = 'cc9d55a8a649fc463bf0a580d1c0567f6542b153' + '_' + iframe.className; + // name можно получить изнутри iframe + iframe.name = iframe.className; + + var iframeId = iframe.id; + + var gcEmbedOnMessage = function(e) { + var insertedIframe = document.getElementById(iframeId); + if (!insertedIframe) { + return; + } + + if (e.data.uniqName == '3e6321862d90cf3a72c6198927067b35e82b0b82') { + if (e.data.height) { + if (e.data.iframeName) { + if (e.data.iframeName == iframe.name) { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } else { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } + } + }; + + if (window.addEventListener) { + window.addEventListener("message", gcEmbedOnMessage, false); + } else if (window.attachEvent) { + window.attachEvent('onmessage', gcEmbedOnMessage) + } else { + window['onmessage'] = gcEmbedOnMessage + } + + script.parentNode.insertBefore(iframe, script); + par.removeChild( script ) +}); + +var getLocation = function(href) { + var l = document.createElement("a"); + l.href = href; + return l; +}; + +var currentScript = document.currentScript || (function() { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; +})(); + +var domain = ( (getLocation( currentScript.src )).hostname ); \ No newline at end of file diff --git a/landing_page/mainpage/static/js/widgets/widget_bottom.js b/landing_page/mainpage/static/js/widgets/widget_bottom.js new file mode 100644 index 00000000..49df1eb5 --- /dev/null +++ b/landing_page/mainpage/static/js/widgets/widget_bottom.js @@ -0,0 +1,71 @@ +console.log('in file') + +document.addEventListener("DOMContentLoaded", function() { + var script = document.getElementById('3e6321862d90cf3a72c6198927067b35e82b0b82'); + // var script = document.currentScript; + var par = script.parentNode; + script.parentNode.style.overflow = 'hidden'; + + var iframe = document.createElement('iframe'); + iframe.src = 'https://learnpythonru.getcourse.ru/pl/lite/widget/widget' + + "?" + window.location.search.substring(1) + + "&id=1139675" + + "&ref=" + encodeURIComponent(document.referrer) + + "&loc=" + encodeURIComponent(document.location.href); + iframe.style.width = '100%'; + iframe.style.height = '0px'; + iframe.style.border = 'none'; + iframe.style.overflow = 'hidden'; + iframe.setAttribute('allowfullscreen', 'allowfullscreen'); + iframe.className = '940'; + iframe.id = 'cc9d55a8a649fc463bf0a580d1c0567f6542b153' + '_' + iframe.className; + // name можно получить изнутри iframe + iframe.name = iframe.className; + + var iframeId = iframe.id; + + var gcEmbedOnMessage = function(e) { + var insertedIframe = document.getElementById(iframeId); + if (!insertedIframe) { + return; + } + + if (e.data.uniqName == '3e6321862d90cf3a72c6198927067b35e82b0b82') { + if (e.data.height) { + if (e.data.iframeName) { + if (e.data.iframeName == iframe.name) { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } else { + par.style.height = ( e.data.height ) + "px"; + insertedIframe.style.height = (e.data.height) + "px"; + } + } + } + }; + + if (window.addEventListener) { + window.addEventListener("message", gcEmbedOnMessage, false); + } else if (window.attachEvent) { + window.attachEvent('onmessage', gcEmbedOnMessage) + } else { + window['onmessage'] = gcEmbedOnMessage + } + + script.parentNode.insertBefore(iframe, script); + par.removeChild( script ) +}); + +var getLocation = function(href) { + var l = document.createElement("a"); + l.href = href; + return l; +}; + +var currentScript = document.currentScript || (function() { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; +})(); + +var domain = ( (getLocation( currentScript.src )).hostname ); \ No newline at end of file diff --git a/landing_page/mainpage/static/js/yandex_map.js b/landing_page/mainpage/static/js/yandex_map.js index c7cbb53c..b81eb15a 100644 --- a/landing_page/mainpage/static/js/yandex_map.js +++ b/landing_page/mainpage/static/js/yandex_map.js @@ -90,7 +90,7 @@ jQuery(function() { + data-target="#overlay">${today > early_date ? 'Регистрация закрыта' : 'Записаться на курс'}

Обычная регистрация

@@ -100,7 +100,7 @@ jQuery(function() { + data-target="#overlay">${today < basic_date ? `С ${format_date_with_year(basic_date)}` : 'Записаться на курс'}
` diff --git a/landing_page/mainpage/static/robots.txt b/landing_page/mainpage/static/robots.txt index 3865dbed..a68ba7bc 100644 --- a/landing_page/mainpage/static/robots.txt +++ b/landing_page/mainpage/static/robots.txt @@ -3,4 +3,4 @@ Disallow: /admin/ Disallow: /success/ Disallow: /lessons/ Sitemap: http://learn.python.ru/sitemap.xml -Clean-param: utm ref source trk 1* 2* 3* 4* 5* 6* 7* 8* 9* +Clean-param: utm&ref&source&trk&&5030bbc2&calltouch_tm&etext diff --git a/landing_page/mainpage/templates/mainpage/advanced.html b/landing_page/mainpage/templates/mainpage/advanced.html index db424bd9..68d0a6c7 100644 --- a/landing_page/mainpage/templates/mainpage/advanced.html +++ b/landing_page/mainpage/templates/mainpage/advanced.html @@ -5,7 +5,7 @@ - + @@ -23,7 +23,7 @@ - + Learn Python Advanced - продвинутые курсы Python онлайн {% include 'mainpage/include/common/counters.html' %} @@ -139,98 +139,24 @@

Записаться

- {% if enrollment %} -
-
-

онлайн курс

-
-
-
-
-
Ранняя регистрация
-
До - {{ enrollment.early_price.date_to | date:"j E" }}
- {{ enrollment.early_price_rub }} - р. -
- -
- {% if today <= enrollment.early_price_date_to %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
- -
-
-
-
Обычная регистрация
-
С - {{ enrollment.late_price.date_from | date:"j E" }}
- {{ enrollment.late_price_rub }} - р. -
- -
- {% if today >= enrollment.late_price_date_from %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
+
+
+

онлайн курс

+
+
+
- {% endif %} +
+ {% if reviews %} + {% include 'mainpage/include/common/index_reviews.html' with reviews=reviews %} + {% endif %} + {% if enrollment.platim_url %} {% include 'mainpage/include/index_how_to_pay_by_platim.html' %} {% else %} diff --git a/landing_page/mainpage/templates/mainpage/include/advanced/index_hero.html b/landing_page/mainpage/templates/mainpage/include/advanced/index_hero.html index 2d15a4aa..7933c273 100644 --- a/landing_page/mainpage/templates/mainpage/include/advanced/index_hero.html +++ b/landing_page/mainpage/templates/mainpage/include/advanced/index_hero.html @@ -1,3 +1,5 @@ +{% load static %} +
@@ -6,7 +8,7 @@

Курс программирования на - Python 3.11 + Python 3.12 для тех, кто уже знаком с веб-разработкой на Python

@@ -45,82 +47,17 @@

{% endif %}
- {% if enrollment %} -
-
-
-
-

Учитесь онлайн

-
-
-
-
-
Ранняя регистрация
-
- До {{ enrollment.early_price_date_to | date:"j E" }} -
- {{ enrollment.early_price_rub }} р. -
- -
- {% if today <= enrollment.early_price_date_to %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
-
-
-
-
Обычная регистрация
-
С {{ enrollment.late_price_date_from | date:"j E" }}
- {{ enrollment.late_price_rub }} р. -
- -
- {% if today >= enrollment.late_price_date_from %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
-
+
+
+
+
+

Учитесь онлайн

+
+
- {% endif %} +
diff --git a/landing_page/mainpage/templates/mainpage/include/advanced/index_menu.html b/landing_page/mainpage/templates/mainpage/include/advanced/index_menu.html index a21c5368..bcf61d8f 100644 --- a/landing_page/mainpage/templates/mainpage/include/advanced/index_menu.html +++ b/landing_page/mainpage/templates/mainpage/include/advanced/index_menu.html @@ -15,17 +15,7 @@
- {% if enrollment %} - {% if enrollment.platim_url %} - - Записаться - - {% else %} - - Записаться - - {% endif %} - {% endif %} + {% include 'mainpage/include/common/buttons/menu_order_button.html' %}
-
- {% if enrollment.platim_url %} - - Записаться - - {% else %} - - Записаться - - {% endif %} + {% include 'mainpage/include/common/buttons/menu_order_button.html' %}
diff --git a/landing_page/mainpage/templates/mainpage/include/advanced/track_code_infrastructure.html b/landing_page/mainpage/templates/mainpage/include/advanced/track_code_infrastructure.html index db23b5f5..28901046 100644 --- a/landing_page/mainpage/templates/mainpage/include/advanced/track_code_infrastructure.html +++ b/landing_page/mainpage/templates/mainpage/include/advanced/track_code_infrastructure.html @@ -48,3 +48,5 @@

CI/CD

  • GA – параллельные джобы
  • GA – контейнеры
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/advanced/track_django.html b/landing_page/mainpage/templates/mainpage/include/advanced/track_django.html index de0452ba..5c94860d 100644 --- a/landing_page/mainpage/templates/mainpage/include/advanced/track_django.html +++ b/landing_page/mainpage/templates/mainpage/include/advanced/track_django.html @@ -29,3 +29,5 @@

    Смежные темы

  • Django tooling
  • Хорошая архитектура
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/advanced/track_programming_practice.html b/landing_page/mainpage/templates/mainpage/include/advanced/track_programming_practice.html index 8d8f5fde..80a6756c 100644 --- a/landing_page/mainpage/templates/mainpage/include/advanced/track_programming_practice.html +++ b/landing_page/mainpage/templates/mainpage/include/advanced/track_programming_practice.html @@ -20,3 +20,5 @@

    Примеры проектов

  • Скрипт, который собирает данные и строит статистику по постам и комментариям на Reddit.
  • Электронный журнал.
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/advanced/track_unittests.html b/landing_page/mainpage/templates/mainpage/include/advanced/track_unittests.html index c4273f02..ea1383bf 100644 --- a/landing_page/mainpage/templates/mainpage/include/advanced/track_unittests.html +++ b/landing_page/mainpage/templates/mainpage/include/advanced/track_unittests.html @@ -33,3 +33,5 @@

    Инструменты pytest

  • Моки в фикстурах
  • randomly
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} diff --git a/landing_page/mainpage/templates/mainpage/include/common/buttons/block_order_button.html b/landing_page/mainpage/templates/mainpage/include/common/buttons/block_order_button.html new file mode 100644 index 00000000..3cd7a6da --- /dev/null +++ b/landing_page/mainpage/templates/mainpage/include/common/buttons/block_order_button.html @@ -0,0 +1,16 @@ + +{% if enrollment.platim_url %} + + Записаться на курс + +{% else %} + +{% endif %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/common/buttons/menu_order_button.html b/landing_page/mainpage/templates/mainpage/include/common/buttons/menu_order_button.html new file mode 100644 index 00000000..e8ba82e2 --- /dev/null +++ b/landing_page/mainpage/templates/mainpage/include/common/buttons/menu_order_button.html @@ -0,0 +1,3 @@ + + Записаться + diff --git a/landing_page/mainpage/templates/mainpage/include/common/buttons/track_order_button.html b/landing_page/mainpage/templates/mainpage/include/common/buttons/track_order_button.html new file mode 100644 index 00000000..b30e9150 --- /dev/null +++ b/landing_page/mainpage/templates/mainpage/include/common/buttons/track_order_button.html @@ -0,0 +1,8 @@ +
    + \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/common/counters.html b/landing_page/mainpage/templates/mainpage/include/common/counters.html index 33e273b2..e29a695d 100644 --- a/landing_page/mainpage/templates/mainpage/include/common/counters.html +++ b/landing_page/mainpage/templates/mainpage/include/common/counters.html @@ -42,3 +42,60 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/index_reviews.html b/landing_page/mainpage/templates/mainpage/include/common/index_reviews.html similarity index 100% rename from landing_page/mainpage/templates/mainpage/include/index_reviews.html rename to landing_page/mainpage/templates/mainpage/include/common/index_reviews.html diff --git a/landing_page/mainpage/templates/mainpage/include/index_hero.html b/landing_page/mainpage/templates/mainpage/include/index_hero.html index a560c3c6..c909e000 100644 --- a/landing_page/mainpage/templates/mainpage/include/index_hero.html +++ b/landing_page/mainpage/templates/mainpage/include/index_hero.html @@ -1,3 +1,5 @@ +{% load static %} +
    @@ -6,7 +8,7 @@

    Курс программирования на - Python 3.11 + Python 3.12 для любого уровня c упором на практику

    Ближайший набор пройдет только Онлайн

    @@ -45,82 +47,17 @@

    {% endif %}
    - {% if enrollment %} -
    -
    -
    -
    -

    Учитесь онлайн

    -
    -
    -
    -
    -
    Ранняя регистрация
    -
    - До {{ enrollment.early_price_date_to | date:"j E" }} -
    - {{ enrollment.early_price_rub }} р. -
    - -
    - {% if today <= enrollment.early_price_date_to %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
    -
    -
    -
    -
    Обычная регистрация
    -
    С {{ enrollment.late_price_date_from | date:"j E" }}
    - {{ enrollment.late_price_rub }} р. -
    - -
    - {% if today >= enrollment.late_price_date_from %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
    -
    +
    +
    +
    +
    +

    Учитесь онлайн

    +
    +
    - {% endif %} +
    diff --git a/landing_page/mainpage/templates/mainpage/include/index_menu.html b/landing_page/mainpage/templates/mainpage/include/index_menu.html index 68fede65..f51b3088 100644 --- a/landing_page/mainpage/templates/mainpage/include/index_menu.html +++ b/landing_page/mainpage/templates/mainpage/include/index_menu.html @@ -15,17 +15,7 @@ - {% if enrollment %} - {% if enrollment.platim_url %} - - Записаться - - {% else %} - - Записаться - - {% endif %} - {% endif %} + {% include 'mainpage/include/common/buttons/menu_order_button.html' %} -
    - {% if enrollment.platim_url %} - - Записаться - - {% else %} - - Записаться - - {% endif %} + {% include 'mainpage/include/common/buttons/menu_order_button.html' %}
    diff --git a/landing_page/mainpage/templates/mainpage/include/index_modules.html b/landing_page/mainpage/templates/mainpage/include/index_modules.html index 501e27b0..eff53c90 100644 --- a/landing_page/mainpage/templates/mainpage/include/index_modules.html +++ b/landing_page/mainpage/templates/mainpage/include/index_modules.html @@ -33,10 +33,18 @@

    Что вас ждет

    и получают одинаковое внимание преподавателей и кураторов.

    - Каждую субботу - мы проводим созвон всего набора, а потом каждая группа отдельно созванивается со своим - преподавателем. Затем в течение недели вы изучаете материалы и пишете код, укладываясь в - дедлайны. Как только накопятся вопросы - пишете в общий чат или куратору. + Каждую субботу в 12 часов + по московскому времени мы проводим созвон всего набора для обсуждения + достигнутых результатов и возникших вопросов, а также презентаций проектов + участников курса. Также регулярно проходят созвоны с кураторами групп по + индивидуальному расписанию каждой группы (об удобном времени вы договариваетесь + с куратором своей группы в начале обучения). В течение недели вы изучаете теорию + по предоставленным материалам и выполняете практические домашние задания + (первые 3 недели - это учебные задачи, а в дальнейшем вы пишете свой проект) в + удобном для вас графике. Вы всегда можете обратиться с вопросами к своему + куратору или в общий чат и оперативно получить ответ и рекомендации. + Такой формат курса позволяет вам эффективно проходить обучение и при этом совмещать + его с своей регулярной деятельностью - работой или учебой в вузе.

    @@ -137,6 +145,11 @@

    Программа

    +

    + Ещё у нас есть + продвинутый курс + для тех, кто уже освоил эту программу. +

    diff --git a/landing_page/mainpage/templates/mainpage/include/track_bots.html b/landing_page/mainpage/templates/mainpage/include/track_bots.html index 45ddfbf1..950c9ade 100644 --- a/landing_page/mainpage/templates/mainpage/include/track_bots.html +++ b/landing_page/mainpage/templates/mainpage/include/track_bots.html @@ -69,3 +69,5 @@

    Тестирование чат-ботов

  • Мокапы: тестируем функции, работающие с MongoDB
  • Тестируем колбеки
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/track_ds.html b/landing_page/mainpage/templates/mainpage/include/track_ds.html index c168df3c..9d660278 100644 --- a/landing_page/mainpage/templates/mainpage/include/track_ds.html +++ b/landing_page/mainpage/templates/mainpage/include/track_ds.html @@ -44,3 +44,5 @@

    Делаем предсказания

  • Знакомство с scikit-learn
  • Делаем предсказания
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/track_main.html b/landing_page/mainpage/templates/mainpage/include/track_main.html index 6484d17e..856c4e62 100644 --- a/landing_page/mainpage/templates/mainpage/include/track_main.html +++ b/landing_page/mainpage/templates/mainpage/include/track_main.html @@ -53,3 +53,5 @@

    Размещение проекта в Интернете

  • Администрирование и настройка сервера
  • Запуск проекта на сервере
  • + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/include/track_web.html b/landing_page/mainpage/templates/mainpage/include/track_web.html index 4d8c9701..f91d745c 100644 --- a/landing_page/mainpage/templates/mainpage/include/track_web.html +++ b/landing_page/mainpage/templates/mainpage/include/track_web.html @@ -61,4 +61,6 @@

    Добавляем комментарии на сайт

  • Делаем запросы из связанных таблиц
  • Отображение комментариев на сайте
  • Добавляем возможность комментировать новости
  • - \ No newline at end of file + + +{% include 'mainpage/include/common/buttons/track_order_button.html' %} \ No newline at end of file diff --git a/landing_page/mainpage/templates/mainpage/index.html b/landing_page/mainpage/templates/mainpage/index.html index 943711e8..cdc4acc4 100644 --- a/landing_page/mainpage/templates/mainpage/index.html +++ b/landing_page/mainpage/templates/mainpage/index.html @@ -5,7 +5,7 @@ - + @@ -23,7 +23,7 @@ - + Learn Python - курсы Python онлайн {% include 'mainpage/include/common/counters.html' %} @@ -157,102 +157,16 @@

    Записаться

    - - {% if enrollment %} -
    -
    -

    онлайн курс

    -
    -
    -
    -
    -
    Ранняя регистрация
    -
    До - {{ enrollment.early_price.date_to | date:"j E" }}
    - {{ enrollment.early_price_rub }} - р. -
    - -
    - {% if today <= enrollment.early_price_date_to %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
    - -
    -
    -
    -
    Обычная регистрация
    -
    С - {{ enrollment.late_price.date_from | date:"j E" }}
    - {{ enrollment.late_price_rub }} - р. -
    - -
    - {% if today >= enrollment.late_price_date_from %} - {% if enrollment.platim_url %} - - Купить билет - - {% else %} - - {% endif %} - {% else %} - - {% endif %} -
    +
    +
    +

    онлайн курс

    +
    +
    +
    - {% endif %} +
    @@ -263,12 +177,20 @@

    онлайн курс

    {% include 'mainpage/include/index_how_to_pay.html' %} {% endif %} - {% include 'mainpage/include/index_reviews.html' with reviews=reviews %} + {% if reviews %} + {% include 'mainpage/include/common/index_reviews.html' with reviews=reviews %} + {% endif %} {% include 'mainpage/include/index_faq.html' %} + {% if should_show_chat %} +
    + {% endif %} {% include 'mainpage/include/index_footer.html' %} - {% include 'mainpage/include/index_register_popup.html' with enrollment=enrollment %} @@ -291,5 +213,6 @@

    онлайн курс

    crossorigin="anonymous" referrerpolicy="no-referrer" > + diff --git a/landing_page/mainpage/templates/mainpage/success.html b/landing_page/mainpage/templates/mainpage/success.html index 86a7c20e..fc44c1ef 100644 --- a/landing_page/mainpage/templates/mainpage/success.html +++ b/landing_page/mainpage/templates/mainpage/success.html @@ -22,7 +22,7 @@ - + Learn Python - Курсы Python онлайн {% include 'mainpage/include/common/counters.html' %} diff --git a/landing_page/mainpage/utils/utm_parser.py b/landing_page/mainpage/utils/utm_parser.py new file mode 100644 index 00000000..26df2242 --- /dev/null +++ b/landing_page/mainpage/utils/utm_parser.py @@ -0,0 +1,6 @@ +from typing import Iterator + + +def get_utm_params(params: Iterator[tuple[str, ...]]) -> str: + utm_string = "&".join([f"{k}={v.encode('utf-8').decode('utf-8')}" for k, v in params if v and "utm_" in k]) + return '?' + utm_string if utm_string else '' diff --git a/landing_page/mainpage/views.py b/landing_page/mainpage/views.py index 558836c4..8ec3e837 100644 --- a/landing_page/mainpage/views.py +++ b/landing_page/mainpage/views.py @@ -2,8 +2,10 @@ from django.http import HttpRequest, HttpResponse from django.shortcuts import render +from waffle import switch_is_active from .models import CourseReview, Curators, Enrollment, EnrollmentType, GraduateProjects +from .utils.utm_parser import get_utm_params def index(request: HttpRequest) -> HttpResponse: @@ -18,6 +20,8 @@ def index(request: HttpRequest) -> HttpResponse: 'curators_list': Curators.objects.filter(is_visible=True), 'today': date.today(), 'reviews': CourseReview.objects.filter(review_for=EnrollmentType.BASE), + 'should_show_chat': switch_is_active('show_tg_chat_widget'), + 'utm_string': get_utm_params(request.GET.items()) } return render(request, 'mainpage/index.html', context) @@ -30,6 +34,8 @@ def advanced_handle(request: HttpRequest) -> HttpResponse: context={ 'today': date.today(), 'enrollment': enrollment, + 'reviews': CourseReview.objects.filter(review_for=EnrollmentType.ADVANCED), + 'utm_string': get_utm_params(request.GET.items()), 'registration_closes_date_formatted': ( enrollment.end_registration_date.strftime('%b %d, %Y %H:%M:%S') if enrollment else "" diff --git a/requirements-dev.txt b/requirements-dev.txt index 73c4fb51..5a1cb6e8 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,7 @@ -r requirements.txt -flake8==6.1.0 -mypy==1.5.0 -isort==5.12.0 -pytest==7.4.0 -pytest-django==4.5.2 -types-requests==2.31.0.10 +flake8==7.0.0 +mypy==1.9.0 +isort==5.13.2 +pytest==8.1.1 +pytest-django==4.8.0 +types-requests==2.31.0.20240311 diff --git a/requirements.txt b/requirements.txt index a56b32c2..c2e09f6c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ -Django==4.2.4 -Pillow==10.0.0 +Django==5.0.3 +Pillow==10.2.0 requests==2.31.0 django-memoize==2.3.1 +django-waffle==4.1.0