summaryrefslogtreecommitdiff
path: root/pages
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2025-10-30 19:01:32 +0600
committerunwox <me@unwox.com>2025-10-30 20:36:58 +0600
commit4151e7a73ef0476b4aea5a356d391a7060b8a01c (patch)
treea576a0017fa5fa0c368d39c270a1df99b79b6014 /pages
parentb06fdc9c3b4b6dc0d5d60098303dd57d5c098e13 (diff)
small improvements here and there
Diffstat (limited to 'pages')
-rw-r--r--pages/auth.fnl43
-rw-r--r--pages/index.fnl12
-rw-r--r--pages/information/index.fnl39
-rw-r--r--pages/information/offer.fnl21
-rw-r--r--pages/information/privacy-policy.fnl131
-rw-r--r--pages/shop/_product/edit.fnl2
-rw-r--r--pages/shop/_product/index.fnl21
-rw-r--r--pages/shop/add.fnl2
-rw-r--r--pages/shop/cart/add.fnl2
-rw-r--r--pages/shop/cart/remove.fnl2
-rw-r--r--pages/shop/index.fnl28
-rw-r--r--pages/shop/order/_id.fnl5
-rw-r--r--pages/shop/order/index.fnl71
13 files changed, 306 insertions, 73 deletions
diff --git a/pages/auth.fnl b/pages/auth.fnl
index 1f40cab..29187df 100644
--- a/pages/auth.fnl
+++ b/pages/auth.fnl
@@ -3,7 +3,8 @@
(local lib (require :lib))
(local templates (require :templates))
-(local auth-form
+(local %page-title "Вход")
+(local %auth-form
[{:title ""
:fields [
(forms.text-input "name" "Пользователь" true)
@@ -19,7 +20,7 @@
[:section {:class "content"}
[:div {:class "back"} [:a {:href "/"} "⟵ Обратно на главную"]]
[:h2 {} "Войти"]
- (forms.render-form auth-form data errors)])])
+ (forms.render-form %auth-form data errors)])])
(fn create-session [db user expires-at]
(local id (_G.must (luna.crypto.random-string 64)))
@@ -48,22 +49,26 @@
(if authenticated?
(values 302 {:Location "/"} "")
(if request.form
- (let [name request.form.name
- entered-password request.form.password
- correct-creds? (check-user db name entered-password)]
- (if correct-creds?
- (let [next-week (+ (os.time) (* 60 60 24 7))
- session-id (create-session
- db name (os.date "%Y-%m-%d %H:%M:%S" next-week))
- cookie-expires (os.date "%a, %d %b %Y %H:%M:%S GMT" next-week)]
- (values 302 {:Location "/shop"
- :Set-Cookie (.. "auth=" session-id "; HttpOnly; SameSite=strict;"
- "Expires=" cookie-expires
- (if luna.debug? "" "; Secure"))} ""))
- (values 400 {}
- (templates.base
- (content request.form
- {:password "Пользователя с таким именем и паролем не существует."})))))
- (values 200 {} (templates.base (content {} {}))))))
+ (let [errors (forms.validate %auth-form request.form)
+ has-errors? (not (lib.empty-table? errors))
+ {: name : password } request.form
+ correct-creds? (check-user db name password)]
+ (if has-errors?
+ (values 400 {} (templates.base (content request.form errors) %page-title))
+ (if correct-creds?
+ (let [next-week (+ (os.time) (* 60 60 24 7))
+ session-id (create-session
+ db name (os.date "%Y-%m-%d %H:%M:%S" next-week))
+ cookie-expires (os.date "%a, %d %b %Y %H:%M:%S GMT" next-week)]
+ (values 302 {:Location "/shop"
+ :Set-Cookie (.. "auth=" session-id "; HttpOnly; SameSite=strict;"
+ "Expires=" cookie-expires
+ (if luna.debug? "" "; Secure"))} ""))
+ (values 400 {}
+ (templates.base
+ (content request.form
+ {:password "Пользователя с таким именем и паролем не существует."})
+ %page-title)))))
+ (values 200 {} (templates.base (content {} {}) %page-title)))))
{: render}
diff --git a/pages/index.fnl b/pages/index.fnl
index 37ab914..a740005 100644
--- a/pages/index.fnl
+++ b/pages/index.fnl
@@ -3,11 +3,6 @@
(local templates (require :templates))
(local texts {
- :address
- (lib.improve-typography
- "г. Омск, ул. Пушкина, д. 133/9, этаж 2. Вход с крыльца Магнита, дверь
- слева, домофон 4. Дверь в офисе узнаете по нашему логотипу.")
-
:individual-ceremony
(lib.improve-typography
"Индивидуальная чайная церемония: мастер готовит для вас чай на ваш выбор.
@@ -38,9 +33,7 @@
[(HTML
[:aside {}
(templates.header "" authenticated?)
- [:section {}
- [:h2 {} "Адрес"]
- [:p {} [:NO-ESCAPE texts.address]]]
+ (templates.address-block)
[:section {}
[:h2 {} "Форматы участия"]
[:div {:class "mb-1-5"}
@@ -55,7 +48,8 @@
[:h2 {} "Агрегатор"]
[:p {} [:NO-ESCAPE texts.everytea]]
[:div {}
- [:a {:href "https://everytea.ru"} "everytea.ru ⟶"]]]])
+ [:a {:href "https://everytea.ru"} "everytea.ru ⟶"]]]
+ (templates.contact-block)])
(HTML
[:div {:class "content"}
[:div {:class "gallery"}
diff --git a/pages/information/index.fnl b/pages/information/index.fnl
new file mode 100644
index 0000000..0084a17
--- /dev/null
+++ b/pages/information/index.fnl
@@ -0,0 +1,39 @@
+(import-macros {:compile-html HTML} :macros)
+(local templates (require :templates))
+
+(local %page-title "Контактная информация")
+
+(fn content [authenticated?]
+ [(HTML
+ [:aside {}
+ (templates.header "/information" authenticated?)])
+ (HTML
+ [:div {:class "content"}
+ [:div {:class "back"} [:a {:href "/"} "⟵ Обратно на главную"]]
+ [:section {:class "mb-2"}
+ [:h2 {:id "contact"} %page-title]
+ [:p {:class "mb-0-5"} [:strong {} "Адрес:"]
+ "г. Омск, ул. Пушкина, д. 133/9, этаж 2. Вход с крыльца Магнита, дверь слева, домофон 4."]
+ [:p {:class "mb-0-5"} [:strong {:class "mb-0-5"} "Телеграм:"]
+ [:a {:href "https://t.me/whitetoadvlad"} "@whitetoadvlad"]]
+ [:p {} [:strong {} "E-mail:"]
+ [:a {:href "mailto:vlad@whitetoad.ru"} "vlad@whitetoad.ru"]]]
+
+ [:section {:class "mb-2"}
+ [:h3 {} "Реквизиты"]
+ [:p {:class "mb-0-5"} "ИП Горенкин Владислав Константинович"]
+ [:p {:class "mb-0-5"} [:strong {:class "mb-0-5"} "ИНН:"] "550414799930"]
+ [:p {} [:strong {} "ОГРН:"] "325554300088182"]]
+
+ [:section {}
+ [:h3 {:id "conditions"} "Документы"]
+ [:p {:class "mb-0-25"}
+ [:a {:href "/information/privacy-policy"}
+ "Политика обработки и хранения персональных данных"]]
+ ;; [:p {} [:a {:href "/information/offer"} "Публичная оферта"]]
+ ]])])
+
+(fn render [request db authenticated?]
+ (values 200 {} (templates.base (content authenticated?) %page-title)))
+
+{: render}
diff --git a/pages/information/offer.fnl b/pages/information/offer.fnl
new file mode 100644
index 0000000..87d33d8
--- /dev/null
+++ b/pages/information/offer.fnl
@@ -0,0 +1,21 @@
+(import-macros {:compile-html HTML} :macros)
+(local templates (require :templates))
+
+(local %page-title "Публичная оферта")
+
+(fn content [authenticated?]
+ [(HTML
+ [:aside {}
+ (templates.header "/information" authenticated?)])
+ (HTML
+ [:div {:class "content"}
+ [:div {:class "back"} [:a {:href "/information"} "⟵ Обратно к контактной информации"]]
+ [:section {}
+ [:h2 {:class "mb-2"} %page-title]
+
+ "test"]])])
+
+(fn render []
+ (values 200 {} (templates.base (content) %page-title)))
+
+{: render}
diff --git a/pages/information/privacy-policy.fnl b/pages/information/privacy-policy.fnl
new file mode 100644
index 0000000..5a0ebd4
--- /dev/null
+++ b/pages/information/privacy-policy.fnl
@@ -0,0 +1,131 @@
+(import-macros {:compile-html HTML} :macros)
+(local templates (require :templates))
+
+(local %page-title "Политика обработки и хранения персональных данных")
+
+(fn content [authenticated?]
+ [(HTML
+ [:aside {}
+ (templates.header "/information" authenticated?)])
+ (HTML
+ [:div {:class "content"}
+ [:div {:class "back"} [:a {:href "/information"} "⟵ Обратно к контактной информации"]]
+ [:section {}
+ [:h2 {:class "mb-2"} %page-title]
+
+ [:h3 {} "1. Общие положения"]
+ [:p {} "Настоящая политика обработки персональных данных составлена в соответствии с требованиями Федерального закона от 27.07.2006. № 152-ФЗ «О персональных данных» (далее — Закон о персональных данных) и определяет порядок обработки персональных данных и меры по обеспечению безопасности персональных данных, предпринимаемые ИП Горенкиным Владиславом Константиновичем (далее — Оператор)."]
+ [:p {} "1.1. Оператор ставит своей важнейшей целью и условием осуществления своей деятельности соблюдение прав и свобод человека и гражданина при обработке его персональных данных, в том числе защиты прав на неприкосновенность частной жизни, личную и семейную тайну."]
+ [:p {} "1.2. Настоящая политика Оператора в отношении обработки персональных данных (далее — Политика) применяется ко всей информации, которую Оператор может получить о посетителях веб-сайта "
+ [:NO-ESCAPE "<a style=\"white-space: nowrap;\" href=\"https://whitetoad.ru\">https://whitetoad.ru</a>."]]
+
+ [:h3 {} "2. Основные понятия, используемые в Политике"]
+ [:p {} "2.1. Автоматизированная обработка персональных данных — обработка персональных данных с помощью средств вычислительной техники."]
+ [:p {} "2.2. Блокирование персональных данных — временное прекращение обработки персональных данных (за исключением случаев, если обработка необходима для уточнения персональных данных)."]
+ [:p {} "2.3. Веб-сайт — совокупность графических и информационных материалов, а также программ для ЭВМ и баз данных, обеспечивающих их доступность в сети интернет по сетевому адресу "
+ [:NO-ESCAPE "<a style=\"white-space: nowrap;\" href=\"https://whitetoad.ru\">https://whitetoad.ru</a>."]]
+ [:p {} "2.4. Информационная система персональных данных — совокупность содержащихся в базах данных персональных данных и обеспечивающих их обработку информационных технологий и технических средств."]
+ [:p {} "2.5. Обезличивание персональных данных — действия, в результате которых невозможно определить без использования дополнительной информации принадлежность персональных данных конкретному Пользователю или иному субъекту персональных данных."]
+ [:p {} "2.6. Обработка персональных данных — любое действие (операция) или совокупность действий (операций), совершаемых с использованием средств автоматизации или без использования таких средств с персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (распространение, предоставление, доступ), обезличивание, блокирование, удаление, уничтожение персональных данных."]
+ [:p {} "2.7. Оператор — государственный орган, муниципальный орган, юридическое или физическое лицо, самостоятельно или совместно с другими лицами организующие и/или осуществляющие обработку персональных данных, а также определяющие цели обработки персональных данных, состав персональных данных, подлежащих обработке, действия (операции), совершаемые с персональными данными."]
+ [:p {} "2.8. Персональные данные — любая информация, относящаяся прямо или косвенно к определенному или определяемому Пользователю веб-сайта "
+ [:NO-ESCAPE "<a style=\"white-space: nowrap;\" href=\"https://whitetoad.ru\">https://whitetoad.ru</a>."]]
+ [:p {} "2.9. Персональные данные, разрешенные субъектом персональных данных для распространения, — персональные данные, доступ неограниченного круга лиц к которым предоставлен субъектом персональных данных путем дачи согласия на обработку персональных данных, разрешенных субъектом персональных данных для распространения в порядке, предусмотренном Законом о персональных данных (далее — персональные данные, разрешенные для распространения)."]
+ [:p {} "2.10. Пользователь — любой посетитель веб-сайта "
+ [:NO-ESCAPE "<a style=\"white-space: nowrap;\" href=\"https://whitetoad.ru\">https://whitetoad.ru</a>."]]
+ [:p {} "2.11. Предоставление персональных данных — действия, направленные на раскрытие персональных данных определенному лицу или определенному кругу лиц."]
+ [:p {} "2.12. Распространение персональных данных — любые действия, направленные на раскрытие персональных данных неопределенному кругу лиц (передача персональных данных) или на ознакомление с персональными данными неограниченного круга лиц, в том числе обнародование персональных данных в средствах массовой информации, размещение в информационно-телекоммуникационных сетях или предоставление доступа к персональным данным каким-либо иным способом."]
+ [:p {} "2.13. Трансграничная передача персональных данных — передача персональных данных на территорию иностранного государства органу власти иностранного государства, иностранному физическому или иностранному юридическому лицу."]
+ [:p {} "2.14. Уничтожение персональных данных — любые действия, в результате которых персональные данные уничтожаются безвозвратно с невозможностью дальнейшего восстановления содержания персональных данных в информационной системе персональных данных и/или уничтожаются материальные носители персональных данных."]
+
+ [:h3 {} "3. Основные права и обязанности Оператора"]
+ [:p {} "3.1. Оператор имеет право:"]
+ [:p {} "— получать от субъекта персональных данных достоверные информацию и/или документы, содержащие персональные данные;"]
+ [:p {} "— в случае отзыва субъектом персональных данных согласия на обработку персональных данных, а также, направления обращения с требованием о прекращении обработки персональных данных, Оператор вправе продолжить обработку персональных данных без согласия субъекта персональных данных при наличии оснований, указанных в Законе о персональных данных;"]
+ [:p {} "— самостоятельно определять состав и перечень мер, необходимых и достаточных для обеспечения выполнения обязанностей, предусмотренных Законом о персональных данных и принятыми в соответствии с ним нормативными правовыми актами, если иное не предусмотрено Законом о персональных данных или другими федеральными законами."]
+ [:p {} "3.2. Оператор обязан:"]
+ [:p {} "— предоставлять субъекту персональных данных по его просьбе информацию, касающуюся обработки его персональных данных;"]
+ [:p {} "— организовывать обработку персональных данных в порядке, установленном действующим законодательством РФ;"]
+ [:p {} "— отвечать на обращения и запросы субъектов персональных данных и их законных представителей в соответствии с требованиями Закона о персональных данных;"]
+ [:p {} "— сообщать в уполномоченный орган по защите прав субъектов персональных данных по запросу этого органа необходимую информацию в течение 10 дней с даты получения такого запроса;"]
+ [:p {} "— публиковать или иным образом обеспечивать неограниченный доступ к настоящей Политике в отношении обработки персональных данных;"]
+ [:p {} "— принимать правовые, организационные и технические меры для защиты персональных данных от неправомерного или случайного доступа к ним, уничтожения, изменения, блокирования, копирования, предоставления, распространения персональных данных, а также от иных неправомерных действий в отношении персональных данных;"]
+ [:p {} "— прекратить передачу (распространение, предоставление, доступ) персональных данных, прекратить обработку и уничтожить персональные данные в порядке и случаях, предусмотренных Законом о персональных данных;"]
+ [:p {} "— исполнять иные обязанности, предусмотренные Законом о персональных данных."]
+
+ [:h3 {} "4. Основные права и обязанности субъектов персональных данных"]
+ [:p {} "4.1. Субъекты персональных данных имеют право:"]
+ [:p {} "— получать информацию, касающуюся обработки его персональных данных, за исключением случаев, предусмотренных федеральными законами. Сведения предоставляются субъекту персональных данных Оператором в доступной форме, и в них не должны содержаться персональные данные, относящиеся к другим субъектам персональных данных, за исключением случаев, когда имеются законные основания для раскрытия таких персональных данных. Перечень информации и порядок ее получения установлен Законом о персональных данных;"]
+ [:p {} "— требовать от оператора уточнения его персональных данных, их блокирования или уничтожения в случае, если персональные данные являются неполными, устаревшими, неточными, незаконно полученными или не являются необходимыми для заявленной цели обработки, а также принимать предусмотренные законом меры по защите своих прав;"]
+ [:p {} "— выдвигать условие предварительного согласия при обработке персональных данных в целях продвижения на рынке товаров, работ и услуг;"]
+ [:p {} "— на отзыв согласия на обработку персональных данных, а также, на направление требования о прекращении обработки персональных данных;"]
+ [:p {} "— обжаловать в уполномоченный орган по защите прав субъектов персональных данных или в судебном порядке неправомерные действия или бездействие Оператора при обработке его персональных данных;"]
+ [:p {} "— на осуществление иных прав, предусмотренных законодательством РФ."]
+ [:p {} "4.2. Субъекты персональных данных обязаны:"]
+ [:p {} "— предоставлять Оператору достоверные данные о себе;"]
+ [:p {} "— сообщать Оператору об уточнении (обновлении, изменении) своих персональных данных."]
+ [:p {} "4.3. Лица, передавшие Оператору недостоверные сведения о себе, либо сведения о другом субъекте персональных данных без согласия последнего, несут ответственность в соответствии с законодательством РФ."]
+
+ [:h3 {} "5. Принципы обработки персональных данных"]
+ [:p {} "5.1. Обработка персональных данных осуществляется на законной и справедливой основе."]
+ [:p {} "5.2. Обработка персональных данных ограничивается достижением конкретных, заранее определенных и законных целей. Не допускается обработка персональных данных, несовместимая с целями сбора персональных данных."]
+ [:p {} "5.3. Не допускается объединение баз данных, содержащих персональные данные, обработка которых осуществляется в целях, несовместимых между собой."]
+ [:p {} "5.4. Обработке подлежат только персональные данные, которые отвечают целям их обработки."]
+ [:p {} "5.5. Содержание и объем обрабатываемых персональных данных соответствуют заявленным целям обработки. Не допускается избыточность обрабатываемых персональных данных по отношению к заявленным целям их обработки."]
+ [:p {} "5.6. При обработке персональных данных обеспечивается точность персональных данных, их достаточность, а в необходимых случаях и актуальность по отношению к целям обработки персональных данных. Оператор принимает необходимые меры и/или обеспечивает их принятие по удалению или уточнению неполных или неточных данных."]
+ [:p {} "5.7. Хранение персональных данных осуществляется в форме, позволяющей определить субъекта персональных данных, не дольше, чем этого требуют цели обработки персональных данных, если срок хранения персональных данных не установлен федеральным законом, договором, стороной которого, выгодоприобретателем или поручителем по которому является субъект персональных данных. Обрабатываемые персональные данные уничтожаются либо обезличиваются по достижении целей обработки или в случае утраты необходимости в достижении этих целей, если иное не предусмотрено федеральным законом."]
+
+ [:h3 {} "6. Цели обработки персональных данных"]
+ [:p {} "Цель обработки: уточнение деталей заказа."]
+ [:p {} "Персональные данные: способ обращения, электронный адрес или никнейм в telegram или whatsapp."]
+ [:p {} "Правовые основания: Федеральный закон «Об информации, информационных технологиях и о защите информации» от 27.07.2006 N 149-ФЗ."]
+ [:p {} "Виды обработки персональных данных: сбор, хранение, уточнение, использование."]
+
+ [:h3 {} "7. Условия обработки персональных данных"]
+ [:p {} "7.1. Обработка персональных данных осуществляется с согласия субъекта персональных данных на обработку его персональных данных."]
+ [:p {} "7.2. Обработка персональных данных необходима для достижения целей, предусмотренных международным договором Российской Федерации или законом, для осуществления возложенных законодательством Российской Федерации на оператора функций, полномочий и обязанностей."]
+ [:p {} "7.3. Обработка персональных данных необходима для осуществления правосудия, исполнения судебного акта, акта другого органа или должностного лица, подлежащих исполнению в соответствии с законодательством Российской Федерации об исполнительном производстве."]
+ [:p {} "7.4. Обработка персональных данных необходима для исполнения договора, стороной которого либо выгодоприобретателем или поручителем по которому является субъект персональных данных, а также для заключения договора по инициативе субъекта персональных данных или договора, по которому субъект персональных данных будет являться выгодоприобретателем или поручителем."]
+ [:p {} "7.5. Обработка персональных данных необходима для осуществления прав и законных интересов оператора или третьих лиц либо для достижения общественно значимых целей при условии, что при этом не нарушаются права и свободы субъекта персональных данных."]
+ [:p {} "7.6. Осуществляется обработка персональных данных, доступ неограниченного круга лиц к которым предоставлен субъектом персональных данных либо по его просьбе (далее — общедоступные персональные данные)."]
+ [:p {} "7.7. Осуществляется обработка персональных данных, подлежащих опубликованию или обязательному раскрытию в соответствии с федеральным законом."]
+
+ [:h3 {} "8. Порядок сбора, хранения, передачи и других видов обработки персональных данных"]
+ [:p {} "Безопасность персональных данных, которые обрабатываются Оператором, обеспечивается путем реализации правовых, организационных и технических мер, необходимых для выполнения в полном объеме требований действующего законодательства в области защиты персональных данных."]
+ [:p {} "8.1. Оператор обеспечивает сохранность персональных данных и принимает все возможные меры, исключающие доступ к персональным данным неуполномоченных лиц."]
+ [:p {} "8.2. Персональные данные Пользователя никогда, ни при каких условиях не будут переданы третьим лицам, за исключением случаев, связанных с исполнением действующего законодательства либо в случае, если субъектом персональных данных дано согласие Оператору на передачу данных третьему лицу для исполнения обязательств по гражданско-правовому договору."]
+ [:p {} "8.3. В случае выявления неточностей в персональных данных, Пользователь может актуализировать их самостоятельно, путем направления Оператору уведомление на адрес электронной почты Оператора "
+ [:a {:href "mailto:vlad@whitetoad.ru"} "vlad@whitetoad.ru"]
+ " с пометкой «Актуализация персональных данных»."]
+ [:p {} "8.4. Срок обработки персональных данных определяется достижением целей, для которых были собраны персональные данные, если иной срок не предусмотрен договором или действующим законодательством."]
+ [:p {} "Пользователь может в любой момент отозвать свое согласие на обработку персональных данных, направив Оператору уведомление посредством электронной почты на электронный адрес Оператора "
+ [:a {:href "mailto:vlad@whitetoad.ru"} "vlad@whitetoad.ru"]
+ " с пометкой «Отзыв согласия на обработку персональных данных»."]
+ [:p {} "8.5. Вся информация, которая собирается сторонними сервисами, в том числе платежными системами, средствами связи и другими поставщиками услуг, хранится и обрабатывается указанными лицами (Операторами) в соответствии с их Пользовательским соглашением и Политикой конфиденциальности. Субъект персональных данных и/или с указанными документами. Оператор не несет ответственность за действия третьих лиц, в том числе указанных в настоящем пункте поставщиков услуг."]
+ [:p {} "8.6. Установленные субъектом персональных данных запреты на передачу (кроме предоставления доступа), а также на обработку или условия обработки (кроме получения доступа) персональных данных, разрешенных для распространения, не действуют в случаях обработки персональных данных в государственных, общественных и иных публичных интересах, определенных законодательством РФ."]
+ [:p {} "8.7. Оператор при обработке персональных данных обеспечивает конфиденциальность персональных данных."]
+ [:p {} "8.8. Оператор осуществляет хранение персональных данных в форме, позволяющей определить субъекта персональных данных, не дольше, чем этого требуют цели обработки персональных данных, если срок хранения персональных данных не установлен федеральным законом, договором, стороной которого, выгодоприобретателем или поручителем по которому является субъект персональных данных."]
+ [:p {} "8.9. Условием прекращения обработки персональных данных может являться достижение целей обработки персональных данных, истечение срока действия согласия субъекта персональных данных, отзыв согласия субъектом персональных данных или требование о прекращении обработки персональных данных, а также выявление неправомерной обработки персональных данных."]
+
+ [:h3 {} "9. Перечень действий, производимых Оператором с полученными персональными данными"]
+ [:p {} "9.1. Оператор осуществляет сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (распространение, предоставление, доступ), обезличивание, блокирование, удаление и уничтожение персональных данных."]
+ [:p {} "9.2. Оператор осуществляет автоматизированную обработку персональных данных с получением и/или передачей полученной информации по информационно-телекоммуникационным сетям или без таковой."]
+
+ [:h3 {} "10. Трансграничная передача персональных данных"]
+ [:p {} "10.1. Оператор до начала осуществления деятельности по трансграничной передаче персональных данных обязан уведомить уполномоченный орган по защите прав субъектов персональных данных о своем намерении осуществлять трансграничную передачу персональных данных (такое уведомление направляется отдельно от уведомления о намерении осуществлять обработку персональных данных)."]
+ [:p {} "10.2. Оператор до подачи вышеуказанного уведомления, обязан получить от органов власти иностранного государства, иностранных физических лиц, иностранных юридических лиц, которым планируется трансграничная передача персональных данных, соответствующие сведения."]
+
+ [:h3 {} "11. Конфиденциальность персональных данных"]
+ [:p {} "Оператор и иные лица, получившие доступ к персональным данным, обязаны не раскрывать третьим лицам и не распространять персональные данные без согласия субъекта персональных данных, если иное не предусмотрено федеральным законом."]
+
+ [:h3 {} "12. Заключительные положения"]
+ [:p {} "12.1. Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты "
+ [:NO-ESCAPE "<a href=\"mailto:vlad@whitetoad.ru\">vlad@whitetoad.ru</a>."]]
+ [:p {} "12.2. В данном документе будут отражены любые изменения политики обработки персональных данных Оператором. Политика действует бессрочно до замены ее новой версией."]
+ [:p {} "12.3. Актуальная версия Политики в свободном доступе расположена в сети Интернет по адресу "
+ [:NO-ESCAPE "<a style=\"white-space: nowrap;\" href=\"https://whitetoad.ru/information/privacy-policy\">https://whitetoad.ru/information/privacy-policy</a>."]]]])])
+
+(fn render [request db authenticated?]
+ (values 200 {} (templates.base (content authenticated?) %page-title)))
+
+{: render}
diff --git a/pages/shop/_product/edit.fnl b/pages/shop/_product/edit.fnl
index 3995096..2568aff 100644
--- a/pages/shop/_product/edit.fnl
+++ b/pages/shop/_product/edit.fnl
@@ -63,7 +63,7 @@
(values 302 {:Location "/shop"} "")
(if request.form
(let [data (forms.html-form->data product-form request.form db)
- errors (forms.validate-form product-form data)
+ errors (forms.validate product-form data)
has-errors? (not (lib.empty-table? errors))]
(if has-errors?
(values 400 {} (templates.base (content product-form data errors
diff --git a/pages/shop/_product/index.fnl b/pages/shop/_product/index.fnl
index 0dd5ff9..aabd713 100644
--- a/pages/shop/_product/index.fnl
+++ b/pages/shop/_product/index.fnl
@@ -41,7 +41,7 @@
[name]))
1))
-(fn content [product basket authenticated?]
+(fn content [product basket agreed-to-cookies? authenticated?]
(local redirect-url (.. "/shop/" product.name))
(local images [])
(for [i 1 5]
@@ -50,9 +50,13 @@
[(HTML
[:aside {}
(templates.header "/shop" authenticated?)
- (if (< 0 (# basket)) (templates.basket basket redirect-url) "")])
+ (if (< 0 (# basket)) (templates.basket basket redirect-url) "")
+ (templates.address-block)
+ (templates.conditions-block)
+ (templates.contact-block)])
(HTML
[:div {:class "content"}
+ (if (not agreed-to-cookies?) (templates.cookies-agreement) "")
[:div {:class "back"} [:a {:href "/shop"} "⟵ Обратно к списку"]]
[:div {:class "product-page-layout"}
@@ -64,8 +68,8 @@
[:a {:href (.. "/shop/" product.name "/edit")}
"% Редактировать"]])
"")
+ (templates.product-overview product "mb-0-25")
(templates.add-to-basket-form product basket "mb-0-5" redirect-url)
- (templates.product-overview product "mb-0-5")
[:div {:class "mb-1" :style "font-style: italic;"}
product.short-description]
@@ -93,11 +97,16 @@
(HTML [:img {:class "product-page-img" :src (.. link "-thumbnail.jpg")}]))]))))]]])])
(fn render [request db authenticated?]
- (let [product (find-product db request.params._product)
- order-id (shop.order-id request)
+ (let [agreed-to-cookies? request.cookies.agreed-to-cookies
+ product (find-product db request.params._product)
+ order-id request.cookies.order
basket (if order-id (shop.basket db order-id) [])]
(if (and product (or product.published authenticated?))
- (values 200 {} (templates.base (content product basket authenticated?)))
+ (values 200 {}
+ (templates.base
+ (content product basket agreed-to-cookies? authenticated?)
+ product.title
+ (.. "Купить " product.title " в Омске: " product.short-description)))
(values 404 {} "not found"))))
{: render}
diff --git a/pages/shop/add.fnl b/pages/shop/add.fnl
index 460cc81..02ec731 100644
--- a/pages/shop/add.fnl
+++ b/pages/shop/add.fnl
@@ -82,7 +82,7 @@
(values 302 {:Location "/shop"} "")
(if request.form
(let [data (forms.html-form->data product-form request.form db)
- errors (forms.validate-form product-form request.form)
+ errors (forms.validate product-form request.form)
has-errors? (not (lib.empty-table? errors))]
(if has-errors?
(values 200 {} (templates.base (content product-form request.form errors
diff --git a/pages/shop/cart/add.fnl b/pages/shop/cart/add.fnl
index b276608..f6b3d54 100644
--- a/pages/shop/cart/add.fnl
+++ b/pages/shop/cart/add.fnl
@@ -4,7 +4,7 @@
(fn render [request db]
(if (= request.method "POST")
(do
- (var order-id (shop.order-id request))
+ (var order-id request.cookies.order)
(var headers {})
(when (not order-id)
diff --git a/pages/shop/cart/remove.fnl b/pages/shop/cart/remove.fnl
index 0cdc417..fd514f0 100644
--- a/pages/shop/cart/remove.fnl
+++ b/pages/shop/cart/remove.fnl
@@ -3,7 +3,7 @@
(fn render [request db]
(if (= request.method "POST")
- (let [order-id (shop.order-id request)]
+ (let [order-id request.cookies.order]
(if (and order-id request.body)
(do
(local body-values (lib.parse-values request.body))
diff --git a/pages/shop/index.fnl b/pages/shop/index.fnl
index 0d78b0a..63a1cc9 100644
--- a/pages/shop/index.fnl
+++ b/pages/shop/index.fnl
@@ -7,6 +7,12 @@
(local pagination-limit 12)
+(local texts {
+ :address
+ (lib.improve-typography
+ "г. Омск, ул. Пушкина, д. 133/9, этаж 2. Вход с крыльца Магнита, дверь
+ слева, домофон 4. Дверь в офисе узнаете по нашему логотипу.")})
+
(fn all-products [db page filters]
(local where-stmts [])
(local where-args [])
@@ -125,22 +131,24 @@
"left: calc(100% / " (# without-videos) " * " (- idx 1) ")")}]))))]]
[:a {:href item-url}
[:h3 {:class "shop-item-title"} product.title]]
+ (templates.product-overview product "mb-0-25 font-size-0-875")
[:div {:class "shop-item-price"}
(templates.add-to-basket-form product basket "" redirect-url)]
- (templates.product-overview product "mb-0-25 font-size-0-875")
[:div {} product.short-description]]))
-(fn content [db products page total filters basket authenticated?]
+(fn content [db products page total filters basket agreed-to-cookies? authenticated?]
(local redirect-url (filters-path page filters))
[(HTML
[:aside {}
(templates.header "/shop" authenticated?)
(if (< 0 (# basket)) (templates.basket basket redirect-url) "")
- ;; [:section {} [:h2 {} "Условия"] [:p {} ""]]
- ])
+ (templates.address-block)
+ (templates.conditions-block)
+ (templates.contact-block)])
(HTML
[:div {:class "content"}
+ (if (not agreed-to-cookies?) (templates.cookies-agreement) "")
[:div {:class "back"} [:a {:href "/"} "⟵ Обратно на главную"]]
[:h2 {:class "product-page-title"} "Магазин"]
(if authenticated?
@@ -172,7 +180,8 @@
(paginator-template filters page pagination-limit total "mt-2")])])
(fn render [request db authenticated?]
- (let [order-id (shop.order-id request)
+ (let [agreed-to-cookies? request.cookies.agreed-to-cookies
+ order-id request.cookies.order
basket (if order-id (shop.basket db order-id) [])
type (if (and request.query.type
(not (lib.empty? (. request.query.type 1))))
@@ -189,8 +198,11 @@
only-published? (not authenticated?)
filters {: type : search : page : only-published?}
{: total : products} (all-products db page filters)]
- (values 200 {} (templates.base
- (content db products page total
- filters basket authenticated?)))))
+ (values 200 {}
+ (templates.base
+ (content db products page total filters basket
+ agreed-to-cookies? authenticated?)
+ "Магазин чая"
+ "Купить вкусный китайский чай с доставкой по Омску"))))
{: render}
diff --git a/pages/shop/order/_id.fnl b/pages/shop/order/_id.fnl
index 5c929a3..03ec0a9 100644
--- a/pages/shop/order/_id.fnl
+++ b/pages/shop/order/_id.fnl
@@ -15,7 +15,10 @@
(+ sum (* v.quantity v.price-per))))
[(HTML [:aside {}
- (templates.header "/shop/order" authenticated?)])
+ (templates.header "/shop/order" authenticated?)
+ (templates.address-block)
+ (templates.conditions-block)
+ (templates.contact-block)])
(HTML
[:div {:class "content"}
[:div {:class "back"} [:a {:href "/shop"} "⟵ Обратно к списку"]]
diff --git a/pages/shop/order/index.fnl b/pages/shop/order/index.fnl
index 019b61a..35a48aa 100644
--- a/pages/shop/order/index.fnl
+++ b/pages/shop/order/index.fnl
@@ -4,7 +4,8 @@
(local shop (require :shop))
(local templates (require :templates))
-(local order-form
+(local %page-title "Оформление заказ")
+(local %order-form
[{:title ""
:fields [
(forms.text-input "name" "Как к вам обращаться?" true)
@@ -12,21 +13,26 @@
(forms.checkbox-input "correct-order" "Данные заказа верны" true)
(forms.checkbox-input "consent"
(..
- "Я даю согласие " ;; "ИП «Горенкин Владислав Константинович» (ИНН ...)")
- " на хранение и обработку предоставленных персональных данных для уточнения деталей заказа.")
+ "Я согласен с <a target=\"_blank\" href=\"/information/privacy-policy\">условиями обработки персональных данных</a>."
+ ;;"а также с <a target=\"_blank\" href=\"/information/offer\">нашей публичной офертой</a>."
+ )
true)]}])
-(fn content-template [db basket data errors]
+(fn content [db basket data errors agreed-to-cookies? authenticated?]
[(HTML
[:aside {}
(templates.header "/shop/order")
- (if (< 0 (# basket)) (templates.basket basket "/shop/order") "")])
+ (if (< 0 (# basket)) (templates.basket basket "/shop/order") "")
+ (templates.address-block)
+ (templates.conditions-block)
+ (templates.contact-block)])
(HTML
[:div {:class "content"}
+ (if (not agreed-to-cookies?) (templates.cookies-agreement) "")
[:div {:class "back"} [:a {:href "/shop"} "⟵ Обратно к списку"]]
[:section {}
[:h2 {} "Оформление заказа"]
- (forms.render-form order-form data errors)]])])
+ (forms.render-form %order-form data errors)]])])
(fn check-stocks [db basket]
(var error nil)
@@ -44,29 +50,42 @@
error)
-(fn render [request db]
- (let [order-id (shop.order-id request)
+(fn render [request db authenticated?]
+ (let [order-id request.cookies.order
+ agreed-to-cookies? request.cookies.agreed-to-cookies
basket (if order-id (shop.basket db order-id) [])]
(if (= request.method "POST")
- (let [data (forms.html-form->data order-form request.form)
- stock-error (check-stocks db basket)]
- (if (not stock-error)
- (do
- (shop.place-order db order-id data.name data.contact data.consent)
- (lib.notify
- (.. "Новый заказ "
- "<a href=\"https://whitetoad.ru/shop/order/" order-id "\">"
- order-id
- "</a> от <b>" data.name "</b>.\n\n"
- "<a href=\"https://whitetoad.ru/shop/order/list\">Список заказов</a>"))
- ;; redirect and clear order cookie
- (values 302 {:Location (.. "/shop/order/" order-id)
- :Set-Cookie "order=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT"}
- ""))
- (values 400 {}
- (templates.base (content-template db basket data {:consent stock-error})))))
+ (let [errors (forms.validate %order-form request.form)
+ has-errors? (not (lib.empty-table? errors))]
+ (if has-errors?
+ (values 400 {} (templates.base
+ (content db basket request.form errors
+ agreed-to-cookies? authenticated?)
+ %page-title))
+ (let [data (forms.html-form->data %order-form request.form)
+ stock-error (check-stocks db basket)]
+ (if (not stock-error)
+ (do
+ (shop.place-order db order-id data.name data.contact data.consent)
+ (lib.notify
+ (.. "Новый заказ "
+ "<a href=\"https://whitetoad.ru/shop/order/" order-id "\">"
+ order-id
+ "</a> от <b>" data.name "</b>.\n\n"
+ "<a href=\"https://whitetoad.ru/shop/order/list\">Список заказов</a>"))
+ ;; redirect and clear order cookie
+ (values 302 {:Location (.. "/shop/order/" order-id)
+ :Set-Cookie "order=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT"}
+ ""))
+ (values 400 {}
+ (templates.base (content db basket data {:consent stock-error}
+ agreed-to-cookies? authenticated?))
+ %page-title)))))
(if (< 0 (# basket))
- (values 200 {} (templates.base (content-template db basket {} {})))
+ (values 200 {} (templates.base
+ (content db basket {} {} agreed-to-cookies?
+ authenticated?)
+ %page-title))
(values 302 {:Location "/shop"} "")))))
{: render}