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)}` : 'Записаться на курс'}@@ -45,82 +47,17 @@
- Каждую субботу - мы проводим созвон всего набора, а потом каждая группа отдельно созванивается со своим - преподавателем. Затем в течение недели вы изучаете материалы и пишете код, укладываясь в - дедлайны. Как только накопятся вопросы - пишете в общий чат или куратору. + Каждую субботу в 12 часов + по московскому времени мы проводим созвон всего набора для обсуждения + достигнутых результатов и возникших вопросов, а также презентаций проектов + участников курса. Также регулярно проходят созвоны с кураторами групп по + индивидуальному расписанию каждой группы (об удобном времени вы договариваетесь + с куратором своей группы в начале обучения). В течение недели вы изучаете теорию + по предоставленным материалам и выполняете практические домашние задания + (первые 3 недели - это учебные задачи, а в дальнейшем вы пишете свой проект) в + удобном для вас графике. Вы всегда можете обратиться с вопросами к своему + куратору или в общий чат и оперативно получить ответ и рекомендации. + Такой формат курса позволяет вам эффективно проходить обучение и при этом совмещать + его с своей регулярной деятельностью - работой или учебой в вузе.
+ Ещё у нас есть + продвинутый курс + для тех, кто уже освоил эту программу. +
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 @@