295 Commits

Author SHA1 Message Date
174f702e3e Merge pull request 'dev' (#66) from dev into main
Reviewed-on: #66
2025-03-21 17:54:29 +03:00
f6f4bfa2ab reklama code insert 2025-03-21 17:53:06 +03:00
f625537b6f reklama code insert 2025-03-21 17:52:35 +03:00
794d5e810d reklama code insert 2025-03-21 16:58:12 +03:00
a5c0985093 reklama code insert 2025-03-21 16:54:43 +03:00
70b481480f reklama code insert 2025-03-21 16:53:40 +03:00
a37e009109 reklama code insert 2025-03-21 16:52:37 +03:00
191ceaca36 reklama code insert 2025-03-21 16:51:46 +03:00
53ec69d27c reklama code insert 2025-03-21 16:50:03 +03:00
26f29e4353 reklama code insert 2025-03-21 16:47:19 +03:00
e1f239d6ee reklama code insert 2025-03-21 16:44:30 +03:00
9cf25e37ed Merge pull request 'yandex code insert' (#65) from dev into main
Reviewed-on: #65
2025-03-21 16:41:05 +03:00
355abb1add yandex code insert 2025-03-21 16:40:27 +03:00
0c8db13341 Merge pull request 'dev' (#64) from dev into main
Reviewed-on: #64
2025-03-21 15:38:29 +03:00
a3795dd267 tik tok code insert 2025-03-21 15:37:40 +03:00
90ffcd090c tik tok code insert 2025-03-21 15:37:05 +03:00
e5575398a3 Merge pull request 'dev' (#63) from dev into main
Reviewed-on: #63
2025-03-11 11:01:01 +03:00
acb52aef73 Merge remote-tracking branch 'origin/dev' into dev 2025-03-11 10:59:50 +03:00
fa04e5275f google code insert 2025-03-11 10:59:39 +03:00
b31f99aa94 Merge pull request 'correct registration js metrics' (#62) from dev into main
Reviewed-on: #62
2025-03-05 15:04:55 +03:00
SBD
0288c05e2b correct registration js metrics 2025-03-05 15:03:41 +03:00
c5baa2d9ab Merge pull request 'pixel code replace' (#61) from dev into main
Reviewed-on: #61
2025-02-24 13:33:01 +03:00
9c96d8c253 pixel code replace 2025-02-24 13:31:54 +03:00
3aecf2eb08 Merge pull request '0.0.165 routes' (#60) from dev into main
Reviewed-on: #60
2025-02-18 08:37:26 +03:00
SBD
423394a9d9 0.0.165 routes 2025-02-17 22:53:58 +03:00
4c28c17088 Merge pull request '2.1.39 fix users_notify_by_result_search_matches' (#59) from dev into main
Reviewed-on: #59
2025-02-17 18:25:32 +03:00
SDE
3b0e1f6524 2.1.39 fix users_notify_by_result_search_matches 2025-02-17 18:22:23 +03:00
f376656937 Merge pull request 'dev' (#58) from dev into main
Reviewed-on: #58
2025-02-12 15:02:23 +03:00
c57eec05c9 pixel code replace 2025-02-12 15:01:47 +03:00
197f910b82 pixel code replace 2025-02-12 15:00:30 +03:00
a5cca5f23e Merge pull request 'pixel code replace' (#57) from dev into main
Reviewed-on: #57
2025-02-10 17:17:39 +03:00
a940f2ff0d pixel code replace 2025-02-10 17:17:09 +03:00
e454fd2343 Merge pull request 'pixel code replace' (#56) from dev into main
Reviewed-on: #56
2025-02-10 15:00:27 +03:00
66a1170221 pixel code replace 2025-02-10 14:59:53 +03:00
8a175ee357 Merge pull request 'pixel code replace' (#55) from dev into main
Reviewed-on: #55
2025-02-09 01:08:13 +03:00
5f403710d1 pixel code replace 2025-02-09 01:07:16 +03:00
6626840fa9 Merge pull request 'pixel code replace' (#54) from dev into main
Reviewed-on: #54
2025-02-07 11:22:43 +03:00
529fb3fc5d pixel code replace 2025-02-07 11:21:34 +03:00
SDE
d1c3e68d6d 2.1.31 check problem send mail 2025-02-03 12:38:50 +03:00
SDE
d816733b0d 2.1.30 check problem send mail 2025-02-03 11:18:53 +03:00
SDE
168ae345d6 2.1.29 check problem send mail 2025-02-03 11:02:42 +03:00
d071458032 Merge pull request 'facebook domain verification add' (#53) from dev into main
Reviewed-on: #53
2025-02-03 00:51:31 +03:00
cae627f0b0 facebook domain verification add 2025-02-03 00:49:56 +03:00
7102af7d2d Merge pull request 'facebook domain verification add' (#52) from dev into main
Reviewed-on: #52
2025-02-03 00:33:26 +03:00
5ff75a4a80 facebook domain verification add 2025-02-03 00:32:03 +03:00
495cc43246 Merge pull request 'facebook domain verification add' (#51) from dev into main
Reviewed-on: #51
2025-02-03 00:12:56 +03:00
80deab3c42 facebook domain verification add 2025-02-03 00:12:08 +03:00
360493e564 Merge pull request 'facebook domain verification add' (#50) from dev into main
Reviewed-on: #50
2025-01-29 09:46:44 +03:00
6030998018 facebook domain verification add 2025-01-29 09:45:18 +03:00
faac300903 Merge pull request 'facebook domain verification add' (#49) from dev into main
Reviewed-on: #49
2025-01-27 23:17:18 +03:00
abaff023cd facebook domain verification add 2025-01-27 23:16:40 +03:00
a6d7a8c8e0 Merge pull request 'meta pixel add' (#48) from dev into main
Reviewed-on: #48
2025-01-24 18:07:20 +03:00
4dbe424f84 meta pixel add 2025-01-24 18:05:48 +03:00
2f94bf20be Merge pull request 'telegram link fix' (#47) from dev into main
Reviewed-on: #47
2025-01-17 14:54:41 +03:00
7488a9f8c8 telegram link fix 2025-01-17 14:52:56 +03:00
ee1107c976 Merge pull request '2.1.23 fix send support mail' (#46) from dev into main
Reviewed-on: #46
2025-01-16 15:29:18 +03:00
SDE
b759ce2d5a 2.1.23 fix send support mail 2025-01-16 15:28:06 +03:00
b4c8ffe95d Merge pull request 'telegram link fix' (#45) from dev into main
Reviewed-on: #45
2024-12-13 16:42:28 +03:00
84c88ba406 telegram link fix 2024-12-13 16:41:40 +03:00
86e6a2acc1 Merge pull request 'TRI-303 correct texts mistakes' (#44) from dev into main
Reviewed-on: #44
2024-12-11 14:56:04 +03:00
b2f7612452 TRI-303 correct texts mistakes 2024-12-11 14:54:56 +03:00
432409b3d8 Merge pull request 'TRI-302 add yandex metrika and goals for buttons and urls for landings' (#43) from dev into main
Reviewed-on: #43
2024-12-09 12:21:54 +03:00
09769542f9 TRI-302 add yandex metrika and goals for buttons and urls for landings 2024-12-09 12:19:29 +03:00
fca75a30aa Merge pull request 'TRI-302 add yandex metrika for landings' (#42) from dev into main
Reviewed-on: #42
2024-12-07 16:23:34 +03:00
a90d7c06a9 TRI-302 add yandex metrika for landings 2024-12-07 16:22:23 +03:00
6e342ca021 Merge pull request '1.8.11 fix stat landings' (#41) from dev into main
Reviewed-on: #41
2024-12-05 14:03:47 +03:00
SDE
4ce12a5428 1.8.11 fix stat landings 2024-12-05 14:02:24 +03:00
d89619fe61 Merge pull request 'TRI-283: fix video2' (#40) from dev into main
Reviewed-on: #40
2024-12-04 15:02:39 +03:00
7ba65e73ae TRI-283: fix video2 2024-12-04 15:00:44 +03:00
b0387362b5 Merge pull request 'TRI-283: fix video1' (#39) from dev into main
Reviewed-on: #39
2024-12-04 13:44:40 +03:00
4a58a47a8e TRI-283: fix video1 2024-12-04 10:02:23 +03:00
c284c1a784 Merge pull request 'TRI-297 add facebook pixel' (#38) from dev into main
Reviewed-on: #38
2024-12-03 23:37:36 +03:00
e8506e1b4e TRI-297 add facebook pixel 2024-12-03 23:33:09 +03:00
a7dd676a76 Merge pull request 'dev' (#37) from dev into main
Reviewed-on: #37
2024-12-03 12:49:46 +03:00
61805df66b TRI-297 add facebook pixel 2024-12-03 12:47:18 +03:00
e98d426324 TRI-297 add facebook pixel 2024-12-03 12:46:13 +03:00
6c062ce3c8 TRI-297 add facebook pixel 2024-12-03 12:43:29 +03:00
dd4134f2d7 Merge pull request 'TRI-283: reload images' (#36) from dev into main
Reviewed-on: #36
2024-12-02 13:41:34 +03:00
8f47d4fb65 TRI-283: reload images 2024-12-02 13:38:09 +03:00
c1398284c7 Merge pull request 'TRI-283: reload images + text edit' (#35) from dev into main
Reviewed-on: #35
2024-11-29 22:24:34 +03:00
63e507d0ff TRI-283: reload images + text edit 2024-11-29 13:39:44 +03:00
a9b4fd95c3 Merge pull request 'dev' (#34) from dev into main
Reviewed-on: #34
2024-11-29 10:21:52 +03:00
5a16466766 Merge remote-tracking branch 'origin/dev' into dev 2024-11-28 13:37:30 +03:00
4b0c923ec0 1.3.6 recovery password TRI-261 2024-11-28 13:37:14 +03:00
0fe7aa189c Merge pull request 'TRI-283: fix nags' (#33) from dev into main
Reviewed-on: #33
2024-11-28 11:57:31 +03:00
87f67aa24a TRI-283: fix nags 2024-11-28 07:47:48 +03:00
9133bfd8fa Merge pull request 'dev' (#32) from dev into main
Reviewed-on: #32
2024-11-27 16:45:02 +03:00
93e48f3cbc TRI-283: fix scroll 2024-11-27 16:23:28 +03:00
baadc67fcf Merge remote-tracking branch 'origin/dev' into dev 2024-11-27 16:14:00 +03:00
bc16aea3a4 1.3.5 registration TRI-265 2024-11-27 16:13:50 +03:00
8041e3eb4d TRI-283: edit fixed 2024-11-27 15:54:51 +03:00
3e4c0b2ab5 1.3.4 TRI-288 phone in my routes 2024-11-27 15:50:47 +03:00
960c9ba5b0 Merge remote-tracking branch 'origin/dev' into dev 2024-11-27 15:38:19 +03:00
3efec91d74 1.3.3 TRI-288 phone in my routes 2024-11-27 15:38:05 +03:00
9e48c72245 TRI-283: edit bg 2024-11-27 15:31:03 +03:00
4dac9a5eec TRI-283: edit sticky2 2024-11-27 15:09:34 +03:00
bf25c67f1e TRI-283: edit sticky 2024-11-27 15:04:29 +03:00
1245899c07 TRI-283: edit ыешслн 2024-11-27 15:02:24 +03:00
66f25b6937 TRI-283: edit img 2024-11-27 14:55:46 +03:00
2d44edf5ab TRI-283: edit some code 2024-11-27 14:41:38 +03:00
7062c756b6 TRI-283: edit customer 2024-11-27 12:24:21 +03:00
7c173c9195 TRI-283: edit mover 2024-11-27 12:06:11 +03:00
e070ab15ac TRI-283: edit 2 height btn, text, image 2024-11-27 10:15:51 +03:00
400498c6fa TRI-283: edit height btn, text, image 2024-11-27 10:14:03 +03:00
aa1657bd10 Merge pull request 'dev' (#31) from dev into main
Reviewed-on: #31
2024-11-26 22:32:25 +03:00
3c5331c2d3 TRI-283: edit images xs 2024-11-23 09:00:55 +03:00
800b7ba493 TRI-283: edit dropdown 2024-11-22 15:21:54 +03:00
bc2689d1cf TRI-283: edit logo 2024-11-22 13:55:53 +03:00
ce9be11c0a TRI-283: post btns 2024-11-22 12:44:54 +03:00
43ba192496 TRI-283: edit footer 2024-11-22 12:38:11 +03:00
ee410315ee TRI-283: edit btns 2024-11-22 12:20:27 +03:00
f3c78f0575 TRI-283: end editors pages 2024-11-22 08:59:49 +03:00
b98a4a5364 TRI-283: edits btns reg landing_page 2024-11-22 07:24:46 +03:00
68aad97e46 TRI-283: save for show p_customer_landing_page 2024-11-22 06:38:22 +03:00
8de6676b40 TRI-283: end p_mover_landing_page 2024-11-21 19:49:38 +03:00
7a345a6c80 TRI-283: edit chatterbox 2024-11-21 14:24:47 +03:00
e3adbeeea4 TRI-283: start 768> 2024-11-21 13:10:25 +03:00
b0db3534f2 TRI-283: add feader fixed 2024-11-20 22:55:34 +03:00
6f646264dc TRI-283: end 1280 2024-11-20 22:00:18 +03:00
d83940b47d TRI-283: end header + start adaptive 1400> 2024-11-20 01:38:34 +03:00
4996d02f71 TRI-283: end adaptive 1920 + start header 2024-11-19 00:25:47 +03:00
SDE
da6f47f439 1.8.9 p_customer_landing_page.html media_items 2024-11-18 15:46:07 +03:00
SDE
54fbc3f4b2 1.8.8 p_mover_landing_page.html media_items 2024-11-18 15:38:28 +03:00
10411dd714 Merge pull request 'dev' (#30) from dev into main
Reviewed-on: #30
2024-11-18 15:07:50 +03:00
SDE
6e2c54eccf 1.8.7 Billing migrations 2024-11-17 16:48:38 +03:00
89166100e3 TRI-283: start adaptive 1920 2024-11-16 20:03:47 +03:00
3d28a1ee86 TRI-283: end pade move 2024-11-16 18:28:26 +03:00
034d5faa0d TRI-283: add scss posterinvideo 2024-11-16 15:02:40 +03:00
f58038ab90 TRI-283: add benefits animate about 2024-11-15 21:07:29 +03:00
SDE
ad25cc67ec 1.8.6 search_matches fix weight params 2024-11-15 18:21:17 +03:00
SDE
384d1e8aec 1.8.5 search_matches fix weight params 2024-11-15 17:12:40 +03:00
SDE
b0a1007a76 1.8.4 media for landing 2024-11-15 16:21:40 +03:00
SDE
0419ba7847 1.8.3 media for landing 2024-11-15 16:05:07 +03:00
SDE
c52dbca9a1 1.8.2 media for landing 2024-11-15 15:14:50 +03:00
SDE
43153a9fdf Merge remote-tracking branch 'origin/dev' into dev 2024-11-15 13:55:04 +03:00
SDE
c23dd1ff4c 1.8.1 landing_customer 2024-11-15 13:54:53 +03:00
67d9528614 TRI-283: добавил и настроил видео 2024-11-15 13:48:11 +03:00
1151744247 TRI-283: вёрстка лендинга 2024-11-14 21:10:53 +03:00
4be3686d2b Merge pull request 'dev' (#29) from dev into main
Reviewed-on: #29
2024-11-14 14:41:27 +03:00
9dd3fbe47d youtube link repair 2024-11-14 14:39:39 +03:00
f42e155f2b add some code 2024-11-13 23:49:01 +03:00
SDE
f5a084684a 1.8.0 landing_mover 2024-11-12 20:05:07 +03:00
70e1fa2a10 Merge pull request '1.7.19 get_my_routes_ajax log fail' (#28) from dev into main
Reviewed-on: #28
2024-11-12 17:36:48 +03:00
SDE
b22adac365 1.7.19 get_my_routes_ajax log fail 2024-11-12 17:34:49 +03:00
3a14430cd5 Merge pull request 'dev' (#27) from dev into main
Reviewed-on: #27
2024-11-12 16:08:27 +03:00
SDE
a329720f1c 1.7.18 w_carrier_card.html fix route.highlight_end_DT 2024-11-12 16:04:12 +03:00
SDE
e03f4a015a 1.7.18 generate routes 2024-11-12 14:06:58 +03:00
73621de710 Merge pull request 'dev' (#26) from dev into main
Reviewed-on: #26
2024-11-12 13:10:14 +03:00
SDE
94f677ae6f 1.7.17 get_routes_Dict send techmail if user undefined 2024-11-12 12:52:46 +03:00
SDE
8afdfc87c5 1.7.16 registration send mail test 2024-11-12 12:42:10 +03:00
cc3739f701 Merge remote-tracking branch 'origin/dev' into dev 2024-11-12 12:33:27 +03:00
dbee8dabb1 1.3.2 phone is not required TRI-249, TRI-265 2024-11-12 12:33:10 +03:00
SDE
cfb7acfddb 1.7.15 fix user_profile.js 1312 2024-11-12 12:15:52 +03:00
SDE
e14072e829 1.7.15 fix registration.js 71 2024-11-12 12:01:28 +03:00
SDE
f80f8d8c7e 1.7.14 route phone is not exists 2024-11-12 10:51:40 +03:00
SDE
e9b3dc1da9 1.7.13 route phone is not exists 2024-11-12 10:50:15 +03:00
5cbae093e9 Merge pull request 'dev' (#25) from dev into main
Reviewed-on: #25
2024-11-11 07:39:53 +03:00
63137188e5 instagram link repair 2024-11-11 07:38:36 +03:00
Rewardio
07031d693c TRI-265 adding checks to eliminate getting null at classList.add 2024-11-08 17:01:44 +03:00
fdaa18c0e6 Merge pull request 'dev' (#24) from dev into main
Reviewed-on: #24
2024-11-06 17:30:10 +03:00
SDE
531955bdc7 Merge remote-tracking branch 'origin/dev' into dev 2024-11-06 15:52:02 +03:00
SDE
2cfa314c3c 1.7.12 fix search_matches sendmail link 2024-11-06 15:51:54 +03:00
ff6ee93497 Merge pull request 'dev' (#23) from dev into main
Reviewed-on: #23
2024-11-03 23:44:45 +03:00
cfe37ec57d 1.3.1 counters in footer TRI-276 2024-11-01 14:58:11 +03:00
995733d6e3 TRI-275 disable googlesindicator script in head section 2024-10-25 13:04:25 +03:00
aec622831d TRI-275 disable googlesindicator script in head section 2024-10-25 13:03:17 +03:00
d62261066f Merge pull request 'dev' (#22) from dev into main
Reviewed-on: #22
2024-10-24 10:40:47 +03:00
e8f092a88b TRI-275 disable googlesindicator script in head section 2024-10-24 10:39:15 +03:00
a1da574c04 TRI-274 replace password recovery text 2024-10-23 13:54:33 +03:00
08e28d14c9 TRI-274 replace password recovery text 2024-10-23 13:44:47 +03:00
2a852cbb51 Merge pull request 'TRI-274 replace password recovery text' (#21) from dev into main
Reviewed-on: #21
2024-10-23 13:35:45 +03:00
cffd810184 TRI-274 replace password recovery text 2024-10-23 13:31:28 +03:00
f561c32526 Merge pull request 'dev' (#20) from dev into main
Reviewed-on: #20
2024-10-22 17:41:12 +03:00
SDE
774ee85f8d 1.7.11 Admin_Route add search_fields 2024-10-22 17:11:34 +03:00
SDE
a1c6db28a8 1.7.10 Admin_Route add search_fields 2024-10-22 17:06:29 +03:00
cd36747b5c Merge pull request 'dev' (#19) from dev into main
Reviewed-on: #19
2024-10-22 16:50:19 +03:00
SDE
bcd0c8900d 1.7.9 fix html b_profile call to select_tab_profile 2024-10-21 14:15:57 +03:00
SDE
f3e3b608f1 1.7.8 fix js dublicates login section 2024-10-21 13:42:32 +03:00
SDE
a839114cdf 1.7.7 fix js dublicates login section 2024-10-21 13:24:08 +03:00
SDE
a315a52791 Merge remote-tracking branch 'origin/dev' into dev 2024-10-21 12:53:00 +03:00
SDE
fc0d9f07c0 1.7.6 fix get_profile_change_page_content_html 2024-10-21 12:52:51 +03:00
d020bdf9d0 TRI-262 replace invocation in subscription mail template 2024-10-18 15:44:38 +03:00
cd323ab66c Merge pull request 'TRI-262 replace invocation in subscription mail template' (#18) from dev into main
Reviewed-on: #18
2024-10-18 00:47:14 +03:00
26b4b77271 TRI-262 replace invocation in subscription mail template 2024-10-18 00:46:08 +03:00
0ac236d2ff Merge pull request 'dev' (#17) from dev into main
Reviewed-on: #17
2024-10-17 18:20:26 +03:00
SDE
09cfe8938f Merge remote-tracking branch 'origin/dev' into dev 2024-10-17 17:58:05 +03:00
SDE
8989d13928 1.7.5 admin search for Admin_SubscribeForUser 2024-10-17 17:56:47 +03:00
769a42ec8b Merge pull request 'dev' (#16) from dev into main
Reviewed-on: #16
2024-10-10 14:37:43 +03:00
a39c96cc61 TRI-260 replace placeholder login 2024-10-10 14:30:19 +03:00
db8beca609 TRI-260 replace placeholder login 2024-10-10 14:28:35 +03:00
60ff29b23f Merge pull request 'fix tiktok link' (#15) from dev into main
Reviewed-on: #15
2024-10-05 11:26:01 +03:00
94e7881aa0 fix tiktok link 2024-10-05 11:23:33 +03:00
15ff3d37fc Merge pull request 'dev' (#14) from dev into main
Reviewed-on: #14
2024-10-02 13:52:51 +03:00
e4a07e2c88 TRI-258 Replace logo in email templates 2024-10-02 13:36:32 +03:00
1414003e3f TRI-258 Replace logo in email templates 2024-10-02 13:30:56 +03:00
b9f4804d74 Merge pull request 'main' (#13) from main into dev
Reviewed-on: #13
2024-10-02 13:22:01 +03:00
e2b63f6706 Merge remote-tracking branch 'origin/dev' into dev 2024-09-24 15:05:13 +03:00
393f165095 1.3.0 get_routes in my_routes TRI-251 2024-09-24 15:05:01 +03:00
547e4e8f9f TRI-258 Replace logo in email templates 2024-09-24 02:28:59 +03:00
ffeab227c9 TRI-258 Replace logo in email templates 2024-09-23 23:35:51 +03:00
4452398773 TRI-258 Replace logo in email templates 2024-09-23 23:34:03 +03:00
454f4711f3 TRI-258 Replace logo in email templates 2024-09-23 23:31:52 +03:00
46c456af2c TRI-258 Replace logo in email templates 2024-09-23 23:29:26 +03:00
2f459e982a TRI-258 Replace logo in email templates 2024-09-23 23:25:40 +03:00
b8d934fa28 TRI-258 Replace logo in email templates 2024-09-23 23:22:14 +03:00
1107c01d5c TRI-258 Replace logo in email templates 2024-09-23 23:18:21 +03:00
b8ca85c20e TRI-258 Replace logo in email templates 2024-09-23 23:16:57 +03:00
a29cf29041 TRI-258 Replace logo in email templates 2024-09-23 23:13:55 +03:00
05bf1d59df TRI-258 Replace logo in email templates 2024-09-23 23:08:01 +03:00
2cf129d0b9 TRI-258 Replace logo in email templates 2024-09-23 23:03:01 +03:00
488cd72f2c 1.2.9 add favicon TRI-255 2024-09-23 23:01:07 +03:00
6fab07fd79 1.2.8 add favicon TRI-255 2024-09-23 16:32:23 +03:00
382b2d122c 1.2.7 comment popup TRI-257 2024-09-23 16:08:11 +03:00
b4beac26a7 1.2.6 password recovery TRI-108 2024-09-23 16:02:27 +03:00
SDE
86d78fdd06 1.7.4 password recovery 2024-09-20 20:41:42 +03:00
SDE
92ad985355 1.7.3 password recovery 2024-09-20 18:51:53 +03:00
SDE
eaf94f0ceb 1.7.2 password recovery 2024-09-20 18:43:37 +03:00
SDE
acee0ccec5 1.7.1 password recovery 2024-09-20 18:32:18 +03:00
fddea097d3 1.2.6 password recovery TRI-108 2024-09-20 18:16:00 +03:00
SDE
7dc25532a3 1.7.0 password recovery 2024-09-20 16:43:33 +03:00
SDE
19721cf5da Merge remote-tracking branch 'origin/dev' into dev 2024-09-10 13:51:14 +03:00
SDE
a6d9d1595a 1.6.19 generate routes w change date 2024-09-10 13:51:04 +03:00
5e0d5f4b91 TRI-254 Replace placeholder text for registration form 2024-09-09 23:49:40 +03:00
09a6de1544 TRI-254 Replace placeholder text for registration form 2024-09-09 23:42:13 +03:00
a20b502b70 TRI-254 Replace placeholder text for registration form 2024-09-09 23:40:15 +03:00
8bb8013f67 TRI-254 Replace placeholder text for registration form 2024-09-09 23:37:37 +03:00
94c7c54cc1 TRI-254 Replace placeholder text for registration form 2024-09-09 23:36:19 +03:00
c257d22618 TRI-254 Replace placeholder text for registration form 2024-09-09 23:34:14 +03:00
b57dbb75e8 TRI-254 Replace placeholder text for registration form 2024-09-09 23:30:22 +03:00
9781f33440 TRI-254 Replace placeholder text for registration form 2024-09-09 23:29:33 +03:00
45b4236748 TRI-254 Replace placeholder text for registration form 2024-09-09 23:23:33 +03:00
8b0c82c3ca TRI-254 Replace placeholder text for registration form 2024-09-09 23:21:46 +03:00
5518a99ee9 TRI-254 Replace placeholder text for registration form 2024-09-09 23:20:39 +03:00
63124a350e Replace Main text on main page 2024-09-09 23:16:25 +03:00
SDE
c7de08ca49 Merge remote-tracking branch 'origin/dev' into dev 2024-09-09 16:45:29 +03:00
SDE
41e4b23317 1.6.18 fix reset highlight after change route 2024-09-09 16:45:20 +03:00
b23f379db0 1.2.5 new init for calendar in create_route TRI-247 2024-09-05 11:26:50 +03:00
SDE
1faf9e0cc7 Merge remote-tracking branch 'origin/dev' into dev 2024-09-02 15:14:17 +03:00
SDE
90e1a87bf4 1.6.17 registration not required phone 2024-09-02 15:14:06 +03:00
9ec8d4189f Replace Main text on main page 2024-08-29 23:53:13 +03:00
8f08e360ef Replace Main text on main page 2024-08-29 23:52:18 +03:00
SDE
4371cd1a85 1.6.16 generate routes road 2024-08-26 17:55:49 +03:00
SDE
f6ba0ab1ad 1.6.15 split send mail to user and copy for dev 2024-08-23 15:19:33 +03:00
SDE
c60b9942f6 Merge remote-tracking branch 'origin/dev' into dev 2024-08-22 13:41:47 +03:00
SDE
85f6e69d63 1.6.14 generate routes 2024-08-22 13:41:34 +03:00
83aeab9341 1.2.4 upd meta_OpenGraph_Schema.html TRI-200 2024-08-20 13:27:29 +03:00
8a539a2868 1.2.2 limitation of color selection for 24 hours TRI-228 2024-08-20 12:18:52 +03:00
379db1cb39 Merge pull request '1.2.2 upd mover search card TRI-246' (#12) from dev into main
Reviewed-on: #12
2024-08-19 18:03:25 +03:00
e51b23cb91 1.2.2 upd mover search card TRI-246 2024-08-19 16:27:31 +03:00
e824a258ea Merge pull request 'dev' (#11) from dev into main
Reviewed-on: #11
2024-08-18 17:48:09 +03:00
SDE
526f035659 1.6.13 fix next package for my_routes 2024-08-13 15:03:20 +03:00
SDE
42c2843cab 1.6.12 fix next package for my_routes 2024-08-13 14:41:11 +03:00
SDE
a99ffcc9d2 1.6.11 fix next package for my_routes 2024-08-13 12:58:41 +03:00
40a2412b9b 1.2.2 add url check for my_route dynamic_loading_routes.js 2024-08-13 12:49:08 +03:00
cd2985a170 Merge pull request 'Add text if email in spam and translate it' (#10) from dev into main
Reviewed-on: #10
2024-08-09 23:50:40 +03:00
cb84352475 Add text if email in spam and translate it 2024-08-09 23:49:10 +03:00
a19b4fe212 Merge pull request 'dev' (#9) from dev into main
Reviewed-on: #9
2024-08-09 22:44:34 +03:00
SDE
f718df47c8 Merge remote-tracking branch 'origin/dev' into dev 2024-08-09 21:53:33 +03:00
SDE
7620f97042 1.6.10 adds for search timezone for cities 2024-08-09 21:53:25 +03:00
3bfb7d040d Merge pull request 'replace tb_base.html' (#8) from dev into main
Reviewed-on: #8
2024-08-09 21:08:58 +03:00
aea50ed806 replace tb_base.html 2024-08-09 21:08:02 +03:00
7dab17905b Merge pull request 'dev' (#7) from dev into main
Reviewed-on: #7
2024-08-09 18:55:31 +03:00
a3a3565189 add rightpaneluser from dev 2024-08-09 18:53:53 +03:00
3f82f42e1e add chatsocketfunctions from dev 2024-08-09 18:52:23 +03:00
0de00c5a34 add chatsocketfunctions from dev 2024-08-09 18:51:14 +03:00
0daee07086 add models.py from dev 2024-08-09 18:49:10 +03:00
2619539415 add django.po from dev 2024-08-09 18:46:00 +03:00
aa8bed6efb add tb_base from main 2024-08-09 18:42:48 +03:00
9b01d79955 1.0.25 password text in registration mail 2024-08-09 18:30:03 +03:00
17f21a25bb 1.0.26 translate 2024-08-09 18:29:41 +03:00
8c523e8c65 1.6.3 parsing timezones 2024-08-09 18:25:07 +03:00
d7956e24a6 1.6.2 parsing timezones 2024-08-09 18:23:52 +03:00
eaafbec1ea 1.6.1 parsing timezones 2024-08-09 18:23:29 +03:00
4ba5f6492f 1.6.0 parsing timezones 2024-08-09 18:21:12 +03:00
SDE
4355586afc Merge remote-tracking branch 'origin/dev' into dev 2024-08-09 14:33:52 +03:00
SDE
ed4dce4bf2 1.6.9 admin routes search by cities 2024-08-09 14:33:41 +03:00
a8c4d22b51 1.2.1 add Telegram icon 2024-08-08 08:52:08 +03:00
92f08b5174 1.1.60 add Meta Pixel Code 2024-08-06 21:22:24 +03:00
a7128908f4 1.1.59 upd the calendar initialization after receiving an error when submitting the form 2024-08-02 17:35:17 +03:00
d86a531495 1.1.58 add TikTok Pixel Code to registration.js 2024-08-02 15:55:28 +03:00
f894cec38b 1.1.57 add TikTok Pixel Code 2024-08-01 17:26:14 +03:00
0ef2f9aeb1 1.1.56 upd meta OG 2024-08-01 17:17:58 +03:00
3b10299249 1.1.49 add new gtag to MAIN branch 2024-07-29 14:43:19 +03:00
2098032d81 1.1.48 add new gtag to MAIN branch 2024-07-29 13:20:44 +03:00
61161e6335 1.0.26 translate 2024-07-25 01:22:12 +03:00
327681d3db 1.0.26 translate 2024-07-25 01:17:57 +03:00
68c5bfe275 1.0.26 translate 2024-07-25 01:08:27 +03:00
c3f116fbc3 1.1.36 show/hide unanswered_msgs_count 2024-07-17 13:58:21 +03:00
b8b3c19bfc 1.1.33 upd chat_socket 2024-07-16 09:47:58 +03:00
e95062c6eb Merge remote-tracking branch 'origin/main' 2024-07-16 09:34:37 +03:00
2f4c472a41 1.1.32 upd chat_socket 2024-07-16 09:34:13 +03:00
3f0f1d4408 1.0.25 password text in registration mail 2024-07-15 23:55:17 +03:00
225a958cb4 1.0.24 robots 2024-07-10 17:58:30 +03:00
a42f3c7e71 1.0.24 robots 2024-07-10 17:38:02 +03:00
ddf8428884 Merge pull request 'dev в main' (#1) from dev into main
Reviewed-on: #1
2024-07-10 17:34:03 +03:00
204 changed files with 8362 additions and 281 deletions

4
.gitignore vendored
View File

@@ -415,3 +415,7 @@ fabric.properties
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
# packages for node
package.json
package-lock.json

View File

@@ -26,7 +26,7 @@ class RegistrationForm(forms.Form):
email = forms.EmailField()
password = forms.CharField(widget=forms.PasswordInput())
confirm_password = forms.CharField(widget=forms.PasswordInput())
tel = forms.CharField()
tel = forms.CharField(required=False)
agreement = forms.BooleanField(initial=False, required=True)
def __init__(self, *args, **kwargs):

View File

@@ -1,3 +1,4 @@
from django.http import QueryDict
from django.template.loader import render_to_string
from SubscribesApp.funcs import check_option_in_cur_user_subscribe
@@ -56,7 +57,7 @@ def get_profile_page_content_html(request, page_name, data):
return None
def get_profile_change_page_content_html(request):
def get_profile_change_page_content_html(request, data=None):
init_Dict = {
'firstname': request.user.first_name,
@@ -66,6 +67,25 @@ def get_profile_change_page_content_html(request):
'country': request.user.user_profile.country,
'city': request.user.user_profile.city,
}
if data:
if type(data) == QueryDict:
data = data.dict()
init_Dict.update(data)
# if 'firstname' in data:
# init_Dict.update({'first_name': data['firstname']})
# if 'lastname' in data:
# init_Dict.update({'last_name': data['lastname']})
# if 'email' in data:
# init_Dict.update({'email': data['email']})
# init_Dict.update({'username': data['email']})
# if 'country' in data:
# init_Dict.update({'country': data['country']})
# if 'city' in data:
# init_Dict.update({'city': data['city']})
# if 'tel' in data:
# init_Dict.update({'tel': data['tel']})
from .forms import RegistrationForm
form = RegistrationForm(initial=init_Dict)

View File

@@ -23,6 +23,8 @@ urlpatterns = [
path('support_tickets/', support_tickets_ajax, name='support_tickets_ajax'),
path('password_recovery/', password_recovery_ajax, name='password_recovery_ajax'),
path('password_recovery_confirm/', password_recovery_confirm_ajax, name='password_recovery_confirm_ajax'),
path('change_profile/', change_profile_ajax, name='change_profile_ajax'),
path('change_profile_confirm/', change_profile_confirm_ajax, name='change_profile_confirm_ajax'),

View File

@@ -31,6 +31,125 @@ from GeneralApp.funcs import get_and_set_lang
# html = render_to_string('blocks/profile/b_subscribe.html', Dict, request=request)
# return JsonResponse({'html': html}, status=200)
def password_recovery_confirm_ajax(request):
if request.method != 'POST':
raise Http404
if not 'pass' in request.POST or not 'pass_confirm' in request.POST or not 'user_id' in request.POST:
raise Http404
lang = get_and_set_lang(request)
try:
if not request.POST['pass'] or request.POST['pass'] != request.POST['pass_confirm']:
return JsonResponse({
'status': 'error',
'error': _('Пароли не совпадают')
}, status=400)
user = User.objects.get(id=request.POST['user_id'])
user.set_password(request.POST['pass'])
user.user_profile.authMailCode = None
user.user_profile.save(update_fields=['authMailCode'])
user.is_active = True
user.save()
return JsonResponse({
'status': 'success',
'message': _('Пароль был успешно изменен')
})
except Exception as e:
return JsonResponse({
'status': 'error',
'error': str(e)
}, status=400)
def password_recovery_ajax(request):
if request.method != 'POST':
raise Http404
lang = get_and_set_lang(request)
try:
email = request.POST['email']
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
msg = _('Пользователь с указанным email не зарегистрирован на сайте')
return JsonResponse({
'status': 'error',
'error': msg
}, status=400)
user.user_profile.authMailCode = uuid1().hex
user.user_profile.save(update_fields=['authMailCode'])
from GeneralApp.funcs_options import get_options_by_opt_types, get_mail_send_options
sets = get_options_by_opt_types(['domain', 'project_name'], only_vals=True)
subject = _('Изменение пароля учетной записи на сайте tripwb.com')
mail_txt = _('Вы получили это письмо потому что '
'был произведен запрос на изменение пароля '
'для данного email на сайте tripwb.com.<br>'
'<br>'
'Если Вы не выполняли запрос - просто проигнорируйте это письмо.<br><br>'
'Если же это были Вы и Вам требуется изменить пароль от учетной записи - '
'перейдите по ссылке, указанной ниже.<br><br>')
link = sets["domain"] + f'/profile/reset_password/{str(user.id)}/{user.user_profile.authMailCode}/'
link_str = f'<a href="{link}">ИЗМЕНИТЬ ПАРОЛЬ</a><br><br>'
sign_txt = _('Спасибо за то, что вы с нами!<br>'
'С уважением,<br>'
'Команда Trip With Bonus.<br>')
Dict = {
'logo': f'{sets["domain"]}/static/img/svg/LogoMobile.svg',
'project_name': sets['project_name'],
'message_title': subject,
'message_text': f'<p style="padding-left: 20px; line-height: 30px;">'
f'{mail_txt}'
f'{link_str}'
f'{sign_txt}'
f'</p>'
}
html = render_to_string('mail/m_request_offer.html', Dict, request)
from BaseModels.mailSender import admin_send_mail_by_SMTPlib
mail_sets = get_mail_send_options()
to = [email]
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
to = ['web@syncsystems.net']
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
return JsonResponse({
'status': 'sended',
'message': _('На email') + ' ' + email + ' '
+ _('отправлено письмо с инструкциями для восстановления пароля. Если не пришло письмо, проверьте папку СПАМ')
})
except Exception as e:
return JsonResponse({
'status': 'error',
'error': str(e)
}, status=400)
def mailing_subscribe_ajax(request):
if request.method != 'POST':
@@ -84,6 +203,8 @@ def mailing_subscribe_ajax(request):
def send_message_ajax(request):
print('send_message_ajax')
if request.method != 'POST':
raise Http404
@@ -192,10 +313,25 @@ def send_message_ajax(request):
f'</p>'
}
print('render html for mail')
html = render_to_string('mail/m_request_offer.html', Dict, request)
from BaseModels.mailSender import admin_send_mail_by_SMTPlib
mail_sets = get_mail_send_options()
to = [mail_sets['sender_email'], 'web@syncsystems.net']
opts = get_options_by_opt_types('support_email', only_vals=True)
print(f'options: {str(opts)}')
if opts and 'support_email' in opts:
to = [opts['support_email']]
else:
to = [mail_sets['sender_email']]
print(f'to: {str(to)}')
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
to = ['web@syncsystems.net']
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
@@ -213,7 +349,6 @@ def send_message_ajax(request):
res_Dict.update(get_add_to_ajax_response_Dict(request.user))
return JsonResponse(res_Dict)
except Exception as e:
return JsonResponse({
'status': 'error',
@@ -377,7 +512,7 @@ def change_profile_confirm_ajax(request):
if data_for_save:
user_profiles.update(**data_for_save)
html = get_profile_change_page_content_html(request)
html = get_profile_change_page_content_html(request, data)
from GeneralApp.funcs import get_add_to_ajax_response_Dict
res_Dict = {'html': html}
res_Dict.update(get_add_to_ajax_response_Dict(request.user))
@@ -514,15 +649,23 @@ def send_check_email_after_registration(data_Dict, user):
html = render_to_string('mail/m_confirm_email.html', Dict)
from BaseModels.mailSender import admin_send_mail_by_SMTPlib
mail_sets = get_mail_send_options()
to = [user.email, 'web@syncsystems.net', 'sa@a3-global.com', 'sysadmin.hax@gmail.com']
to = [user.email]
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
to = ['web@syncsystems.net', 'sa@a3-global.com', 'sysadmin.hax@gmail.com']
admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
return res
except Exception as e:
print(f'send_registration_mail Error = {str(e)}')
return None
@@ -578,6 +721,7 @@ def registration_ajax(request):
}
res = send_check_email_after_registration(mail_Dict, user)
print(str(res))
# res = send_registration_mail(mail_Dict, user)
res_Dict = {

View File

@@ -8,6 +8,9 @@ from django.contrib.auth import views
urlpatterns = [
path('registration/', registration_View, name='registration_page'),
path('reset_password/<int:user_id>/<str:token>/',
recovery_password_page_View, name='recovery_password_page'),
# path('', user_profile_View, name='user_profile'),
# path('page/chat/<int:user_id>/', chat_w_user_View, name='chat_w_user'),
# path('page/chat/', chat_w_user_View, name='chat_w_user_wo_user_id'),

View File

@@ -37,15 +37,23 @@ def send_registration_mail(user):
html = render_to_string('mail/m_registration.html', Dict)
from BaseModels.mailSender import admin_send_mail_by_SMTPlib
mail_sets = get_mail_send_options()
to = [user.email, 'web@syncsystems.net', 'sa@a3-global.com', 'sysadmin.hax@gmail.com']
to = [user.email]
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
to = ['web@syncsystems.net', 'sa@a3-global.com', 'sysadmin.hax@gmail.com']
admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
return res
except Exception as e:
print(f'send_registration_mail Error = {str(e)}')
return None
@@ -270,12 +278,19 @@ def decode_get_param(data):
def recovery_password_user(request, uidb64=None, token=None):
from django.contrib.auth.views import PasswordResetConfirmView
def recovery_password_page_View(request, user_id, token):
try:
user = User.objects.get(id=user_id, user_profile__authMailCode=token)
except User.DoesNotExist:
raise Http404
return PasswordResetConfirmView(request=request, uidb64=uidb64, token=token
)
Dict = {
'user': user
}
t = loader.get_template('pages/profile/p_password_recovery.html')
response = get_inter_http_response(t, Dict, request)
return response

View File

@@ -29,12 +29,31 @@ class BaseModel(models.Model):
json_data = models.JSONField(verbose_name=_('Дополнительные данные'), default=dict, blank=True)
media_items = GenericRelation('GeneralApp.MediaItem', related_query_name='grel_%(class)s_for_media_item')
def __str__(self):
if self.name:
return self.name
else:
return str(self.id)
def get_media_items(self, exclude_kwargs=None):
if not exclude_kwargs:
exclude_kwargs = {}
return self.media_items.exclude(
**exclude_kwargs
).filter(
enable=True
).order_by('order')
def get_video_items(self):
exclude_kwargs = {'video': None}
return self.get_media_items(exclude_kwargs=exclude_kwargs)
def get_picture_items(self):
exclude_kwargs = {'picture': None}
return self.get_media_items(exclude_kwargs=exclude_kwargs)
def pop_node_by_name(self, node_name):
if not self.json_data or not node_name in self.json_data:
return None
@@ -108,7 +127,6 @@ class BaseModelViewPage(BaseModel):
FAQ_title = models.CharField(max_length=250, verbose_name=_(u'FAQ Заголовок'), null=True, blank=True)
FAQ_items = GenericRelation('GeneralApp.FAQitem', related_query_name='grel_%(class)s_for_faq_item')
class Meta:
abstract = True

View File

@@ -105,6 +105,7 @@ def admin_send_mail_by_SMTPlib(sets, subject, from_email, to, html_content, atta
def send_mail_by_SMTPlib(sets, subject, from_email, to_init, html_content, smtp_server, smtp_port, smtp_login, smtp_password,
attachments=None):
print('send_mail_by_SMTPlib')
to = to_init
# if not settings.prod_server:
# to = 'web@syncsystems.net'
@@ -123,7 +124,11 @@ def send_mail_by_SMTPlib(sets, subject, from_email, to_init, html_content, smtp_
try:
# context = ssl.create_default_context()
mail_lib = smtplib.SMTP(smtp_server, smtp_port)
print(f'connect to mail server smtp_server={str(smtp_server)} smtp_port={str(smtp_port)}')
mail_lib = smtplib.SMTP(smtp_server, smtp_port, timeout=60)
print('connection established')
res = mail_lib.ehlo()
@@ -139,14 +144,18 @@ def send_mail_by_SMTPlib(sets, subject, from_email, to_init, html_content, smtp_
res = mail_lib.esmtp_features['auth'] = 'LOGIN PLAIN'
# print('mail_lib.esmtp_features = {0}'.format(str(res)))
print('try to login')
res = mail_lib.login(smtp_login, smtp_password)
# print('mail_lib.login = {0}'.format(str(res)))
print('login')
res = None
if type(to) in (list, tuple):
if sets['sender_email'] in to:
to.remove(sets['sender_email'])
# if sets['sender_email'] in to:
# to.remove(sets['sender_email'])
if len(to) > 1:
to_str = u', '.join(to)
@@ -159,6 +168,8 @@ def send_mail_by_SMTPlib(sets, subject, from_email, to_init, html_content, smtp_
to = []
to.append(to_str)
print(f'send mail to {str(to)}')
if type(subject) != str:
try:
subject = subject.decode('utf-8')
@@ -168,6 +179,8 @@ def send_mail_by_SMTPlib(sets, subject, from_email, to_init, html_content, smtp_
except:
pass
print(f'add context')
msg = MIMEMultipart()
from email.headerregistry import Address
msg['From'] = from_email
@@ -192,13 +205,17 @@ def send_mail_by_SMTPlib(sets, subject, from_email, to_init, html_content, smtp_
res = msg.attach(attachments)
# print('else attach file complete = {0}'.format(str(res)))
print(f'send mail')
res = mail_lib.sendmail(from_email, to, msg.as_string())
msg = mail_lib.quit()
# print('mail_lib.quit = {0}'.format(str(msg)))
except Exception as e:
msg = 'send_mail_by_SMTPlib error = {0}'.format(str(e))
import traceback
msg = (f'send_mail_by_SMTPlib error = {str(e)}\n<br>'
f'{str(traceback.format_exc())}')
print(msg)
try:
mail_lib.quit()

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2024-07-12 17:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('BillingApp', '0005_subscribeorder_last_operation_status'),
]
operations = [
migrations.AlterField(
model_name='subscribeorder',
name='currency',
field=models.CharField(default='KZT', max_length=3, verbose_name='Валюта'),
),
]

View File

@@ -3,6 +3,8 @@ from .models import *
from django.contrib import admin
from django.utils.translation import gettext as _
class Admin_StaticPage(Admin_Trans_BaseModelViewPage):
fieldsets = [

View File

@@ -0,0 +1,41 @@
# Generated by Django 4.2.2 on 2024-11-15 14:50
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('GeneralApp', '0005_option_name_en_option_name_ru_option_prefix_en_and_more'),
]
operations = [
migrations.CreateModel(
name='MediaItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
('name_ru', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
('name_en', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')),
('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')),
('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')),
('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')),
('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')),
('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')),
('object_id', models.PositiveIntegerField()),
('picture', models.ImageField(blank=True, null=True, upload_to='media/', verbose_name='Фото')),
('video', models.FileField(blank=True, null=True, upload_to='media/video/', verbose_name='Видео')),
('comment', models.TextField(blank=True, null=True, verbose_name='Комментарий')),
('comment_ru', models.TextField(blank=True, null=True, verbose_name='Комментарий')),
('comment_en', models.TextField(blank=True, null=True, verbose_name='Комментарий')),
('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype')),
],
options={
'verbose_name': 'Медиа элемент',
'verbose_name_plural': 'Медиа элементы',
},
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.2 on 2024-11-15 15:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('GeneralApp', '0006_mediaitem'),
]
operations = [
migrations.AlterField(
model_name='mediaitem',
name='picture',
field=models.ImageField(blank=True, null=True, upload_to='uploads/', verbose_name='Фото'),
),
migrations.AlterField(
model_name='mediaitem',
name='video',
field=models.FileField(blank=True, null=True, upload_to='uploads/video/', verbose_name='Видео'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.2 on 2024-11-15 15:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('GeneralApp', '0007_alter_mediaitem_picture_alter_mediaitem_video'),
]
operations = [
migrations.AlterField(
model_name='mediaitem',
name='picture',
field=models.ImageField(blank=True, null=True, upload_to='media_items/photo/', verbose_name='Фото'),
),
migrations.AlterField(
model_name='mediaitem',
name='video',
field=models.FileField(blank=True, null=True, upload_to='media_items/video/', verbose_name='Видео'),
),
]

View File

@@ -3,6 +3,26 @@ from BaseModels.base_models import BaseModelViewPage, BaseModel
from django.utils.translation import gettext_lazy as _
# from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
class MediaItem(BaseModel):
content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
picture = models.ImageField(upload_to='media_items/photo/', verbose_name=_('Фото'), null=True, blank=True)
video = models.FileField(upload_to='media_items/video/', verbose_name=_('Видео'), null=True, blank=True)
comment = models.TextField(verbose_name=_('Комментарий'), null=True, blank=True)
class Meta:
verbose_name = _('Медиа элемент')
verbose_name_plural = _('Медиа элементы')
class StaticPage(BaseModelViewPage):
promo_header = models.BooleanField(verbose_name=_('Промо-хэдер'), default=False)
@@ -29,9 +49,6 @@ class Option(BaseModel):
class FAQitem(BaseModel):
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')

View File

@@ -27,3 +27,9 @@ class FAQitem_TranslationOptions(TranslationOptions):
)
translator.register(FAQitem, FAQitem_TranslationOptions)
class MediaItem_TranslationOptions(TranslationOptions):
fields = (
'name', 'comment',
)
translator.register(MediaItem, MediaItem_TranslationOptions)

View File

@@ -6,6 +6,11 @@ from .views import *
urlpatterns = [
path('', MainPage, name='main'),
path('mover_landing_page/', LandingMoverPage, name='mover_landing_page'),
path('customer_landing_page/', LandingCustomerPage, name='customer_landing_page'),
path('page/<str:url>/', StaticPageView, name='static_page'),
path('test_code', test_code, name='test_code'),
path('generate_routes/<int:routes_count>/', generate_routes, name='generate_routes'),
]

View File

@@ -1,8 +1,9 @@
import json
from django.http import HttpResponse, Http404, FileResponse
from django.http import HttpResponse, Http404, FileResponse, HttpResponseRedirect
from django.template import loader, RequestContext
from django.contrib.auth.decorators import login_required
from .models import *
from django.conf import settings
from .funcs import get_inter_http_response
@@ -14,16 +15,115 @@ from django.views.decorators.csrf import csrf_exempt
from webpush import send_user_notification
import json
from datetime import datetime, timedelta
from django.urls import reverse
def generate_routes(request, routes_count):
if (not request.user
or not request.user.is_active
or not request.user.is_authenticated
or not request.user.is_staff
):
raise Http404
def test_code(request):
from RoutesApp.funcs import get_city_by_type_transport_and_address_point
from RoutesApp.models import Route
from ReferenceDataApp.models import Airport, City
res = None
from ReferenceDataApp.funcs import parse_data
parse_data()
from_air = Airport.objects.get(iata_code='MSQ')
to_air = Airport.objects.get(iata_code='SVO')
routes = [
Route(
type_transport='road',
departure_DT=datetime.now() + timedelta(days=7),
arrival_DT=datetime.now() + timedelta(days=8),
from_address_point=to_air.city.id,
to_address_point=from_air.city.id,
from_city=to_air.city,
to_city=from_air.city,
weight=item,
phone='0987654321',
owner=request.user
) for item in range(routes_count)
]
Route.objects.bulk_create(routes)
if res:
if type(res) == str:
return HttpResponse(res)
else:
return res
return HttpResponse('finished')
def test_code(request):
if (not request.user
or not request.user.is_active
or not request.user.is_authenticated
or not request.user.is_staff
):
raise Http404
res = ''
from RoutesApp.search_matches import search_matches
from RoutesApp.models import Route
search_matches(Route.objects.filter(id=17158))
# from RoutesApp.funcs import get_city_by_type_transport_and_address_point
# from RoutesApp.models import Route
# from ReferenceDataApp.models import Airport, City
#
# res = None
#
# from_air = Airport.objects.get(iata_code='MSQ')
# to_air = Airport.objects.get(iata_code='SVO')
#
# routes = [
# Route(
# type_transport='road',
# departure_DT=datetime.now() + timedelta(days=7),
# arrival_DT=datetime.now() + timedelta(days=8),
# from_address_point=to_air.city.id,
# to_address_point=from_air.city.id,
# from_city=to_air.city,
# to_city=from_air.city,
# weight=item,
# phone='0987654321',
# owner=request.user
# ) for item in range(100)
# ]
# routes = [
# Route(
# type_transport='avia',
# departure_DT=datetime(year=2024, month=9, day=1),
# arrival_DT=datetime(year=2024, month=9, day=3),
# from_address_point = from_air.id,
# to_address_point = to_air.id,
# from_city = from_air.city,
# to_city = to_air.city,
# weight = item,
# phone = '1234567890',
# owner = request.user
# ) for item in range(1000)
# ]
#
# Route.objects.bulk_create(routes)
# from RoutesApp.search_matches import search_matches
# routes = Route.objects.filter()[:10]
# msg = search_matches(routes)
# from ReferenceDataApp.funcs import parse_data
# parse_data()
# from SubscribesApp.reports import send_mail_for_user_subscribes_that_is_going_to_finish
# send_mail_for_user_subscribes_that_is_going_to_finish()
@@ -49,7 +149,52 @@ def Page404(request, exeption=None):
except Exception as e:
return HttpResponse(str(e))
def LandingMoverPage(request):
from .init_options import init_options
init_options()
print(f'LOCALE_PATHS = {str(settings.LOCALE_PATHS)}')
page, is_created = StaticPage.objects.get_or_create(url='landing_mover')
Dict = {
'page': page,
}
breadcrumbs_Dict = {
}
Dict.update({'breadcrumbs': breadcrumbs_Dict})
t = loader.get_template('pages/p_mover_landing_page.html')
return get_inter_http_response(t, Dict, request)
def LandingCustomerPage(request):
from .init_options import init_options
init_options()
print(f'LOCALE_PATHS = {str(settings.LOCALE_PATHS)}')
page, is_created = StaticPage.objects.get_or_create(url='landing_customer')
Dict = {
'page': page,
}
breadcrumbs_Dict = {
}
Dict.update({'breadcrumbs': breadcrumbs_Dict})
t = loader.get_template('pages/p_customer_landing_page.html')
return get_inter_http_response(t, Dict, request)
def MainPage(request):
@@ -104,6 +249,12 @@ def StaticPageView(request, url):
'route_form': RouteForm(),
'owner_type': 'mover'
})
elif url in ['landing_customer', 'landing_mover']:
raise Http404
# return HttpResponseRedirect(reverse('customer_landing_page'))
# elif url == 'landing_mover':
# return HttpResponseRedirect(reverse('mover_landing_page'))
# elif url == 'works':
# return WorksPage(request)
elif url in ['main']:

View File

@@ -8,22 +8,40 @@ from timezonefinder import TimezoneFinder
tzf = TimezoneFinder()
def search_cities_in_db(search_str):
res_data = []
Q_obj = Q(name_en__icontains=search_str) | Q(name_ru__icontains=search_str) | \
Q(country__name_en__icontains=search_str) | Q(country__name_ru__icontains=search_str)
res_data = City.objects.filter(Q_obj).values('id', 'name', 'country__name', 'timezone')
objs = City.objects.filter(Q_obj)
if objs:
ids = objs.values_list('id', flat=True)
objs_wo_tz = objs.filter(timezone=None)
for item in objs_wo_tz:
item.get_n_save_timezone()
res_data = City.objects.filter(id__in=ids).values(
'id', 'name', 'country__name', 'timezone'
)
return list(res_data)
def search_airports_in_db(search_str):
res_data = []
Q_obj = Q(iata_code__icontains=search_str) | \
Q(name_en__icontains=search_str) | Q(name_ru__icontains=search_str) | \
Q(city__name_en__icontains=search_str) | Q(city__name_ru__icontains=search_str) | \
Q(city__country__name_en__icontains=search_str) | \
Q(city__country__name_ru__icontains=search_str)
res_data = Airport.objects.filter(Q_obj).values(
'id', 'name', 'iata_code',
'city__name', 'city__country__name', 'city__timezone'
)
objs = Airport.objects.filter(Q_obj)
if objs:
ids = objs.values_list('id', flat=True)
objs_wo_tz = objs.filter(city__timezone=None)
for item in objs_wo_tz:
item.city.get_n_save_timezone()
res_data = Airport.objects.filter(id__in=ids).values(
'id', 'name', 'iata_code',
'city__name', 'city__country__name', 'city__timezone'
)
return list(res_data)

View File

@@ -3,17 +3,33 @@ from .models import *
from django.contrib import admin
class Admin_Route(Admin_Trans_BaseModel):
readonly_fields = [
# 'highlight_end_DT',
'rising_DT'
]
list_display = [
'id', 'owner_type', 'receive_msg_by_email', 'type_transport', 'cargo_type',
'id', 'owner_type',
'rising_DT',
'receive_msg_by_email', 'type_transport', 'cargo_type',
'departure_DT', 'from_city', 'from_place',
'arrival_DT', 'to_city', 'to_place', 'owner',
'order', 'modifiedDT', 'createDT'
]
list_editable = ['rising_DT']
list_display_links = ['id']
list_filter = ['owner_type', 'type_transport', 'cargo_type', 'from_place', 'arrival_DT', 'modifiedDT', 'createDT']
search_fields = ['owner__first_name', 'owner__last_name']
raw_id_fields = ['from_city', 'to_city']
list_filter = [
'owner_type', 'type_transport',
'rising_DT',
'cargo_type',
'from_place', 'arrival_DT',
'modifiedDT', 'createDT'
]
admin.site.register(Route,Admin_Route)
search_fields = [
'owner__first_name', 'owner__last_name', 'from_city__name', 'to_city__name', 'owner__email'
]
raw_id_fields = ['from_city', 'to_city', 'owner']
admin.site.register(Route, Admin_Route)

View File

@@ -1,9 +1,11 @@
from BaseModels.mailSender import techSendMail
from GeneralApp.funcs_options import get_mail_send_options
from .models import *
from .forms import *
from django.utils.translation import gettext as _
from django.template.loader import render_to_string
from datetime import datetime
from django.db.models import F
from datetime import datetime, timedelta
from django.db.models import F, Q
elements_on_page = 25
@@ -109,9 +111,9 @@ def get_profile_new_route_page_html(request, data):
return html
def get_country_n_city_str_by_type_transport_and_address_point(type_transport, address_point):
city = get_city_by_type_transport_and_address_point(type_transport, address_point)
return city.get_country_n_city_str()
# def get_country_n_city_str_by_type_transport_and_address_point(type_transport, address_point):
# city = get_city_by_type_transport_and_address_point(type_transport, address_point)
# return city.get_country_n_city_str()
def get_city_by_type_transport_and_address_point(type_transport, address_point):
@@ -127,6 +129,16 @@ def get_city_by_type_transport_and_address_point(type_transport, address_point):
print(msg)
return None
def get_city_by_address_point(address_point):
from ReferenceDataApp.models import Airport, City
try:
return City.objects.get(id=address_point)
except Exception as e:
msg = f'get_city_by_address_point Error = {str(e)}, address_point = {address_point}'
print(msg)
return None
def get_profile_my_routes_page_content_html(request):
routes_Dict = get_routes_Dict(request.user)
@@ -160,6 +172,7 @@ def get_routes_Dict(user=None, data=None):
'owner': user
})
from_el = None
to_el = None
@@ -209,16 +222,19 @@ def get_routes_Dict(user=None, data=None):
):
kwargs.update({key: val})
if key == 'from_address_point':
city = get_city_by_type_transport_and_address_point(type_transport, val)
if key == 'from_address_point': # в from_address_point всегда город
# city = get_city_by_type_transport_and_address_point(type_transport, val)
city = get_city_by_address_point(val)
kwargs.update({f'from_city': city})
res_Dict.update({
'from_address_point_txt': city.get_country_n_city_str()
})
if key == 'to_address_point':
city = get_city_by_type_transport_and_address_point(type_transport, val)
if key == 'to_address_point': # в to_address_point всегда город
# city = get_city_by_type_transport_and_address_point(type_transport, val)
city = get_city_by_address_point(val)
kwargs.update({f'to_city': city})
res_Dict.update({
'to_address_point_txt': city.get_country_n_city_str()
@@ -236,14 +252,20 @@ def get_routes_Dict(user=None, data=None):
# ).order_by(
# '-rising_DT', '-departure_DT', '-arrival_DT', '-modifiedDT'
# )
routes = Route.objects.exclude(
rising_DT=None
).filter(
departure_DT__lt=datetime.now()
)
routes.update(
rising_DT=None
# routes = Route.objects.exclude(
# rising_DT=None
# ).filter(
# departure_DT__lt=datetime.now()
# )
# routes.update(
# rising_DT=None
# )
routes_rising_off = Route.objects.exclude(rising_DT=None).filter(
Q(rising_DT__lt=datetime.now() - timedelta(days=1)) | Q(departure_DT__lt=datetime.now())
)
if routes_rising_off:
routes_rising_off.update(rising_DT=None)
routes = Route.objects.filter(
**kwargs

View File

@@ -1,4 +1,5 @@
import json
from copy import deepcopy
from django.shortcuts import render
@@ -10,7 +11,7 @@ from django.template import loader, RequestContext
from django.contrib.auth.decorators import login_required
from BaseModels.mailSender import techSendMail
from django.utils.translation import gettext as _
from datetime import datetime
from datetime import datetime, timedelta
from django.template.loader import render_to_string
from django.urls import reverse
from .forms import *
@@ -41,14 +42,20 @@ def highlight_route_ajax(request):
msg = _('Нет доступа к выделению')
return JsonResponse({'errors': msg})
route.highlight_color = '#FF0000'
route.save(update_fields=['highlight_color'])
from SubscribesApp.funcs import get_cur_user_subscribe
user_subscribe = get_cur_user_subscribe(request.user)
user_subscribe.used_route_highlight_count += 1
user_subscribe.save(update_fields=['used_route_highlight_count'])
route.highlight_color = '#FF0000'
highlight_hours = user_subscribe.get_highlight_hours()
route.highlight_end_DT = datetime.now() + timedelta(hours=highlight_hours)
route.save(update_fields=['highlight_color', 'highlight_end_DT'])
Dict = {
'route': route,
}
@@ -293,8 +300,20 @@ def get_my_routes_ajax(request):
lang = get_and_set_lang(request)
data = request.POST.dict()
if not data and request.body:
data = json.loads(request.body)
try:
routes_Dict = get_routes_Dict(request.user)
if not request.user or request.user.is_anonymous:
msg = (f'get_my_routes_ajax not have user - user={str(request.user)}<br>'
f'data={str(data)}<br>'
f'request={str(request)}')
mail_sets = get_mail_send_options()
techSendMail(mail_sets, msg)
routes_Dict = get_routes_Dict(request.user, data)
if 'errors' in routes_Dict:
return JsonResponse(routes_Dict, status=400)
@@ -337,6 +356,7 @@ def create_or_change_route_ajax(request, route_id=None):
lang = get_and_set_lang(request)
Dict = {}
route_old_Dict = None
try:
@@ -351,6 +371,7 @@ def create_or_change_route_ajax(request, route_id=None):
if route:
form = RouteForm(data, instance=route)
Dict.update({'route': route})
route_old_Dict = deepcopy(route.__dict__)
else:
form = RouteForm(data)
@@ -371,6 +392,16 @@ def create_or_change_route_ajax(request, route_id=None):
if obj.to_address_point:
obj.to_city = get_city_by_type_transport_and_address_point(obj.type_transport, obj.to_address_point)
if route_old_Dict:
if route_old_Dict['highlight_color'] != obj.highlight_color:
obj.highlight_color = route_old_Dict['highlight_color']
if route_old_Dict['highlight_end_DT'] != obj.highlight_end_DT:
obj.highlight_end_DT = route_old_Dict['highlight_end_DT']
if route_old_Dict['rising_DT'] != obj.rising_DT:
obj.rising_DT = route_old_Dict['rising_DT']
obj.owner = request.user
obj.save()

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2024-08-13 13:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('RoutesApp', '0007_rename_select_color_route_highlight_color'),
]
operations = [
migrations.AddField(
model_name='route',
name='highlight_end_DT',
field=models.DateTimeField(blank=True, null=True, verbose_name='Дата и время окончания выделения'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2024-11-12 10:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('RoutesApp', '0008_route_highlight_end_dt'),
]
operations = [
migrations.AlterField(
model_name='route',
name='phone',
field=models.CharField(blank=True, null=True, verbose_name='Укажите номер для связи'),
),
]

View File

@@ -57,7 +57,7 @@ class Route(BaseModel):
verbose_name=_('Куда можете доставить?'))
cargo_type = models.CharField(choices=cargo_type_choices, default='parcel', verbose_name=_('Могу перевезти'))
weight = models.IntegerField(verbose_name=_('Укажите вес до (кг)'))
phone = models.CharField(verbose_name=_('Укажите номер для связи'))
phone = models.CharField(verbose_name=_('Укажите номер для связи'), blank=True, null=True)
extra_phone = models.CharField(verbose_name=_('Дополнительный номер'), blank=True, null=True)
receive_msg_by_email = models.BooleanField(default=False, verbose_name=_('Получать уведомления по E-mail'))
receive_msg_by_sms = models.BooleanField(default=False, verbose_name=_('Получать уведомления по SMS'))
@@ -71,6 +71,10 @@ class Route(BaseModel):
verbose_name=_('Цвет выделения'),
blank=True, null=True
)
highlight_end_DT = models.DateTimeField(
verbose_name=_('Дата и время окончания выделения'),
blank=True, null=True
)
def __str__(self):
if self.name:

View File

@@ -47,7 +47,7 @@ def send_push_message_for_found_matches_routes(route, data_Dict):
def send_mail_found_matches_routes(route, data_Dict):
def send_mail_found_matches_routes(route, matched_route, data_Dict):
print(f'send_mail_found_matches_routes to route id = {route.id}')
Dict = {
@@ -59,7 +59,7 @@ def send_mail_found_matches_routes(route, data_Dict):
mail_sets = get_mail_send_options()
to = [route.owner.email, 'web@syncsystems.net']
to = [route.owner.email]
subject = _('Мы нашли исполнителя по Вашему объявлению!')
res = admin_send_mail_by_SMTPlib(
mail_sets,
@@ -68,9 +68,68 @@ def send_mail_found_matches_routes(route, data_Dict):
html_content=html
)
subject = f'route matches {route.id} <> {matched_route.id} send to {route.owner.email}'
to = ['web@syncsystems.net', 'sa@a3-global.com']
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
return res
def user_notify_by_result_search_matches(route_for_send, founded_route, params):
log = ''
data_Dict = None
try:
data_Dict = get_Dict_for_send_msgs(params, founded_route.owner_type)
except Exception as e:
msg = f'<br>\n! search_matches Error get_Dict_for_send_msgs = {str(e)}'
print(msg)
log += msg
if data_Dict and check_option_in_cur_user_subscribe(
route_for_send.owner, 'push уведомления'
):
try:
msg = send_push_message_for_found_matches_routes(route_for_send, data_Dict)
if msg:
log += msg
except Exception as e:
msg = f'<br>\n! search_matches Error send_push_message_for_found_matches_routes = {str(e)}'
print(msg)
log += msg
if data_Dict and check_option_in_cur_user_subscribe(
route_for_send.owner,
'уведомление на e-mail о появлении перевозчика по заданным критериям'
):
try:
msg = send_mail_found_matches_routes(route_for_send, founded_route, data_Dict)
if msg:
log += msg
except Exception as e:
msg = f'<br>\n! search_matches Error send_mail_found_matches_routes = {str(e)}'
print(msg)
log += msg
return log
def users_notify_by_result_search_matches(source_route, found_routes, params):
log = ''
log += user_notify_by_result_search_matches(source_route, found_routes[0], params)
for route in found_routes:
log += user_notify_by_result_search_matches(route, source_route, params)
return log
def search_matches(for_routes=None):
print('search_matches')
@@ -84,8 +143,11 @@ def search_matches(for_routes=None):
)
check_fields = [
'type_transport', 'departure_DT', 'arrival_DT', 'from_address_point', 'to_address_point',
'from_place', 'to_place', 'cargo_type', 'weight'
'type_transport', 'departure_DT', 'arrival_DT',
# 'from_address_point', 'to_address_point',
'from_place', 'to_place',
'cargo_type', 'weight',
'from_city', 'to_city',
]
if for_routes:
@@ -106,11 +168,20 @@ def search_matches(for_routes=None):
kwargs.update({f"{field_name}__date": field_val.date()})
elif field_name == 'weight':
# print(field_name)
params.update({f"{field_name}": field_val})
if route.owner_type == 'mover':
# params.update({f"{field_name}__lte": field_val})
kwargs.update({f"{field_name}__lte": field_val})
else:
# params.update({f"{field_name}__gte": field_val})
kwargs.update({f"{field_name}__gte": field_val})
elif field_name == 'from_city':
params.update({'from_address_point': field_val.id})
kwargs.update({field_name: field_val})
elif field_name == 'to_city':
params.update({'to_address_point': field_val.id})
kwargs.update({field_name: field_val})
# elif field_name in ['from_address_point', 'to_address_point']:
# kwargs.update({field_name: field_val})
else:
kwargs.update({field_name: field_val})
params.update({field_name: field_val})
@@ -128,39 +199,9 @@ def search_matches(for_routes=None):
if found_routes:
msg = f'found routes for send messages = {found_routes.count()}'
print(msg)
data_Dict = None
try:
data_Dict = get_Dict_for_send_msgs(params, found_routes[0].owner_type)
except Exception as e:
msg = f'<br>\n! search_matches Error get_Dict_for_send_msgs = {str(e)}'
print(msg)
log += msg
if data_Dict and check_option_in_cur_user_subscribe(
route.owner, 'push уведомления'
):
try:
msg = send_push_message_for_found_matches_routes(route, data_Dict)
if msg:
log += msg
except Exception as e:
msg = f'<br>\n! search_matches Error send_push_message_for_found_matches_routes = {str(e)}'
print(msg)
log += msg
if data_Dict and check_option_in_cur_user_subscribe(
route.owner,
'уведомление на e-mail о появлении перевозчика по заданным критериям'
):
try:
msg = send_mail_found_matches_routes(route, data_Dict)
if msg:
log += msg
except Exception as e:
msg = f'<br>\n! search_matches Error send_mail_found_matches_routes = {str(e)}'
print(msg)
log += msg
log += users_notify_by_result_search_matches(route, found_routes, params)
except Exception as e:
msg = f'<br>\n! search_matches Error = {str(e)}'

View File

@@ -45,7 +45,8 @@ class Admin_SubscribeOption(Admin_Trans_BaseModel):
(None, {
'classes': ['wide'],
'fields': (
'allow_route_rising_count', 'allow_route_highlight_count'
('allow_route_rising_count',),
('allow_route_highlight_count', 'route_highlight_hours'),
)
}),
)
@@ -53,6 +54,8 @@ class Admin_SubscribeOption(Admin_Trans_BaseModel):
list_display = [
'id', 'enable',
'name',
'allow_route_rising_count',
'allow_route_highlight_count', 'route_highlight_hours',
'order', 'modifiedDT', 'createDT'
]
list_editable = ['enable']
@@ -96,6 +99,6 @@ class Admin_SubscribeForUser(Admin_Trans_BaseModel):
'modifiedDT', 'createDT'
]
list_editable = ['enable']
search_fields = ['name']
search_fields = ['name', 'id', 'user__email', 'user__first_name', 'user__last_name']
admin.site.register(SubscribeForUser,Admin_SubscribeForUser)

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2024-08-13 13:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('SubscribesApp', '0006_rename_allow_route_select_count_subscribeoption_allow_route_highlight_count'),
]
operations = [
migrations.AddField(
model_name='subscribeoption',
name='route_highlight_hours',
field=models.IntegerField(default=24, verbose_name='Количество часов выделения цветом объявлений'),
),
]

View File

@@ -0,0 +1,14 @@
# Generated by Django 4.2.2 on 2025-02-17 17:48
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('SubscribesApp', '0004_alter_subscribe_bg_color_alter_subscribe_text_color'),
('SubscribesApp', '0007_subscribeoption_route_highlight_hours'),
]
operations = [
]

View File

@@ -17,8 +17,12 @@ from datetime import datetime, timedelta
class SubscribeOption(BaseModel):
allow_route_rising_count = models.IntegerField(verbose_name=_('Количество поднятий объявлений') ,default=0)
allow_route_highlight_count = models.IntegerField(verbose_name=_('Количество выделений объявлений'), default=0)
allow_route_rising_count = models.IntegerField(
verbose_name=_('Количество поднятий объявлений') ,default=0)
allow_route_highlight_count = models.IntegerField(
verbose_name=_('Количество выделений объявлений'), default=0)
route_highlight_hours = models.IntegerField(
verbose_name=_('Количество часов выделения цветом объявлений'), default=24)
class Meta:
verbose_name = _('Опция подписки')
@@ -88,6 +92,14 @@ class SubscribeForUser(BaseModel):
res += f' {str(self.id)}'
return res
def get_highlight_hours(self):
options = self.subscribe.options.filter(
allow_route_highlight_count__gt=0,
)
if options:
return options[0].route_highlight_hours
return 0
def remains_route_adding_options(self):
total_data = SubscribeOption.objects.filter(

View File

@@ -30,7 +30,7 @@ def send_mail_for_user_subscribes_that_is_going_to_finish():
html = render_to_string('mail/m_user_subscribes_that_is_going_to_finish.html', Dict)
from BaseModels.mailSender import admin_send_mail_by_SMTPlib
mail_sets = get_mail_send_options()
to = [user_subscribe.user.email, 'web@syncsystems.net', 'sa@a3-global.com', 'sysadmin.hax@gmail.com']
to = [user_subscribe.user.email]
res = admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
@@ -40,7 +40,13 @@ def send_mail_for_user_subscribes_that_is_going_to_finish():
if res and type(res) == str:
print(res)
# log += f'\n{res}'
to = ['web@syncsystems.net', 'sa@a3-global.com', 'sysadmin.hax@gmail.com']
admin_send_mail_by_SMTPlib(
mail_sets,
subject=subject,
from_email=mail_sets['sender_email'], to=to,
html_content=html
)
except Exception as e:
msg = (f'send_mail_for_user_subscribes_that_is_going_to_finish '

View File

@@ -1798,8 +1798,8 @@ msgid "Зарегистрироваться"
msgstr "Register"
#: templates/forms/f_registration.html:118
msgid "На Вашу почту отправлено письмо для подтверждения регистрации."
msgstr ""
msgid "На Вашу почту отправлено письмо для подтверждения регистрации. Если не получили письмо, то проверьте папку СПАМ"
msgstr "An email has been sent to your mailbox to confirm your registration. If you have not received the email, please check your SPAM folder"
#: templates/mail/m_confirm_email.html:20
#: templates/mail/m_found_matched_routes.html:13
@@ -1809,12 +1809,12 @@ msgstr "Hello"
#: templates/mail/m_confirm_email.html:22
msgid "На сайте"
msgstr ""
msgstr "on site"
#: templates/mail/m_confirm_email.html:22
msgid ""
"произведена регистрация с использованием Вашего адреса электронной почты"
msgstr ""
msgstr "you have registered using your e-mail address"
#: templates/mail/m_confirm_email.html:24
msgid ""

View File

@@ -1,4 +1,5 @@
User-agent: *
Disallow: /
Allow: /
Disallow: */admin/*
Host: dev.tripwb.com
Host: tripwb.com

View File

@@ -1,6 +1,10 @@
from BaseModels.admin_utils import Admin_GenericBaseIconStackedInline, Admin_BaseIconModel, GenericStackedInline
from BaseModels.admin_utils import (
Admin_GenericBaseIconStackedInline, Admin_BaseIconModel, GenericStackedInline,
AdminImageWidget, get_image_thumb
)
from copy import deepcopy
from django.db import models
from django.utils.translation import gettext as _
class Admin_BaseModel(Admin_BaseIconModel):
@@ -86,12 +90,17 @@ class AdminTranslationBase(TranslationAdmin):
'screen': ('modeltranslation/css/tabbed_translation_fields.css',),
}
from modeltranslation.admin import TranslationGenericStackedInline
class AdminStacked_FAQitem(TranslationGenericStackedInline):
from GeneralApp.models import FAQitem
model = FAQitem
extra = 0
fields = ['order', 'question', 'answer']
from modeltranslation.admin import TranslationGenericStackedInline, TranslationGenericTabularInline
class TranslationGenericTabularInlineCustom(TranslationGenericTabularInline):
formfield_overrides = {
models.ImageField: {'widget': AdminImageWidget},
}
def image_thumb(self, obj):
return get_image_thumb(self, obj)
image_thumb.short_description = _('Миниатюра')
image_thumb.allow_tags = True
class Media:
@@ -105,6 +114,46 @@ class AdminStacked_FAQitem(TranslationGenericStackedInline):
'screen': ('modeltranslation/css/tabbed_translation_fields.css',),
}
class TranslationGenericStackedInlineCustom(TranslationGenericStackedInline):
formfield_overrides = {
models.ImageField: {'widget': AdminImageWidget},
}
def image_thumb(self, obj):
return get_image_thumb(self, obj)
image_thumb.short_description = _('Миниатюра')
image_thumb.allow_tags = True
class Media:
js = (
'modeltranslation/js/force_jquery.js',
'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js',
'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js',
'modeltranslation/js/tabbed_translation_fields.js',
)
css = {
'screen': ('modeltranslation/css/tabbed_translation_fields.css',),
}
class AdminStacked_FAQitem(TranslationGenericStackedInlineCustom):
from GeneralApp.models import FAQitem
model = FAQitem
extra = 0
fields = ['order', 'question', 'answer']
class AdminTabular_Mediaitem(TranslationGenericTabularInlineCustom):
from GeneralApp.models import MediaItem
model = MediaItem
extra = 0
fields = ['order', 'video', 'picture']
class Admin_BaseModelViewPage(Admin_BaseIconModel):
pass
# def get_fieldsets(self, request, obj=None):
@@ -129,7 +178,7 @@ class Admin_BaseModelViewPage(Admin_BaseIconModel):
# else:
# return {}
#
inlines = [AdminStacked_FAQitem]
inlines = [AdminStacked_FAQitem, AdminTabular_Mediaitem]

2
static/css/moover.css Normal file

File diff suppressed because one or more lines are too long

178
static/css/moover/about.css Normal file
View File

@@ -0,0 +1,178 @@
.about {
margin-bottom: 168px;
}
@media (min-width: 1720px) {
.about {
margin-bottom: 188px;
}
}
@media (max-width: 1304.98px) {
.about {
margin-bottom: 138px;
}
}
@media (max-width: 991.98px) {
.about {
margin-bottom: 110px;
}
}
.about .title {
margin-bottom: 60px;
}
@media (min-width: 1720px) {
.about .title {
margin-bottom: 49px;
}
}
@media (max-width: 1304.98px) {
.about .title {
margin-bottom: 39px;
}
}
@media (max-width: 991.98px) {
.about .title {
margin-bottom: 48px;
}
}
@media (max-width: 479.98px) {
.about .title {
margin-bottom: 37px;
}
}
.about__grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
@media (max-width: 991.98px) {
.about__grid {
display: block;
}
}
.about__img {
box-shadow: inset 18.19px 1.21px 18.19px 0 #FFFFFFCC, inset -18.19px -1.21px 18.19px 0 #4052801A, 48.5px 36.38px 36.38px 0 #6B7F9933;
border-radius: 31px;
margin-left: -20px;
margin-top: 8px;
}
@media (min-width: 1720px) {
.about__img {
margin-top: 19px;
}
}
@media (max-width: 1304.98px) {
.about__img {
margin-left: -10px;
}
}
@media (max-width: 991.98px) {
.about__img {
margin-left: 0;
margin-bottom: 49px;
display: block;
}
}
@media (max-width: 479.98px) {
.about__img {
margin-bottom: 38px;
}
}
.about__right {
text-align: left;
padding-top: 43px;
padding-left: 50px;
}
@media (min-width: 1720px) {
.about__right {
padding-top: 90px;
padding-left: 21px;
}
}
@media (max-width: 1304.98px) {
.about__right {
padding-left: 11px;
padding-top: 19px;
}
}
@media (max-width: 991.98px) {
.about__right {
padding: 0 8px;
text-align: center;
}
}
@media (max-width: 479.98px) {
.about__right {
padding: 0;
}
}
.about__right::after {
content: '';
display: block;
clear: both;
}
.about__half {
max-width: 50%;
float: left;
}
@media (max-width: 991.98px) {
.about__half {
max-width: initial;
}
}
.about__half:last-child {
padding-left: 16px;
max-width: 47%;
}
@media (max-width: 991.98px) {
.about__half:last-child {
max-width: initial;
padding-left: 0;
}
}
.about b {
letter-spacing: 0.4px;
}
@media (min-width: 1720px) {
.about b {
font-weight: 700;
letter-spacing: 0;
}
}
@media (max-width: 479.98px) {
.about b {
letter-spacing: 0.9px;
}
}
@media (min-width: 1720px) {
.about p {
margin-bottom: 39px;
}
}

1
static/css/moover/animate.css vendored Normal file
View File

@@ -0,0 +1 @@
.animate{padding:60px 40px 49px;opacity:0;background-color:var(--color-black2);border-radius:30px;color:white;margin-bottom:160px}@media (min-width: 1720px){.animate{padding-top:100px;padding-bottom:89px;margin-bottom:180px}}@media (max-width: 1304.98px){.animate{margin-bottom:141px}}@media (max-width: 991.98px){.animate{padding-top:40px;padding-bottom:29px;margin-bottom:121px}}@media (max-width: 479.98px){.animate{padding:30px 7px 19px}}.animate.left{transform:scale(0);opacity:0}.animate.right{opacity:0;transform:scale(0)}.animate.right .title{margin-bottom:17px}@media (min-width: 1720px){.animate.right .title{max-width:80%;margin-bottom:40px}}@media (max-width: 1304.98px){.animate.right .title{margin-bottom:25px}}@media (max-width: 991.98px){.animate.right .title{margin-bottom:31px}}@media (max-width: 479.98px){.animate.right .title{margin-bottom:20px}}@media (max-width: 991.98px){.animate.right .subtitle{margin-bottom:31px}}@media (max-width: 479.98px){.animate.right .use__btn{margin-top:-11px}}.animate__link{color:var(--color-orange);text-decoration:underline !important}.animate .title{margin-bottom:25px;max-width:87%}@media (min-width: 1720px){.animate .title{margin-bottom:40px}}@media (max-width: 1304.98px){.animate .title{max-width:99%}}@media (max-width: 991.98px){.animate .title{max-width:85%;font-size:24px;line-height:29.05px}}@media (max-width: 767.98px){.animate .title{max-width:100%;margin-bottom:14px}}.animate .subtitle{width:47%;margin:0 auto 23px}@media (min-width: 1720px){.animate .subtitle{line-height:26px;letter-spacing:0.1px;margin-bottom:40px}}@media (max-width: 1304.98px){.animate .subtitle{width:54%}}@media (max-width: 991.98px){.animate .subtitle{width:102%;margin-bottom:26px}}@media (max-width: 479.98px){.animate .use__btn{margin-top:-6px;padding-left:15px;padding-right:15px;display:flex}}

View File

@@ -0,0 +1,157 @@
.benefits {
margin-bottom: 132px;
}
@media (min-width: 1720px) {
.benefits {
margin-bottom: 147px;
}
}
@media (max-width: 1304.98px) {
.benefits {
margin-bottom: 101px;
}
}
@media (max-width: 991.98px) {
.benefits {
margin-bottom: 93px;
}
}
@media (max-width: 479.98px) {
.benefits {
margin-bottom: 103px;
}
}
.benefits__grid {
text-align: left;
display: grid;
grid-template-columns: 1.5fr 3fr 1.5fr;
}
@media (max-width: 991.98px) {
.benefits__grid {
grid-template-columns: 1fr 1fr;
}
}
@media (max-width: 479.98px) {
.benefits__grid {
grid-template-columns: 1fr;
text-align: center;
}
}
.benefits__item {
min-height: 122px;
padding-right: 7px;
margin-bottom: 22px;
}
@media (min-width: 1720px) {
.benefits__item {
min-height: 145px;
}
}
@media (max-width: 991.98px) {
.benefits__item {
padding-right: 25px;
}
}
@media (max-width: 479.98px) {
.benefits__item {
padding-right: 0;
margin-bottom: 19px;
min-height: 90px;
}
}
@media (max-width: 991.98px) {
.benefits__second {
grid-column: 1 / 3;
order: -1;
margin-bottom: 56px;
}
}
@media (max-width: 479.98px) {
.benefits__second {
grid-column: 1/2;
margin-bottom: 31px;
}
}
.benefits__third {
padding-left: 16px;
}
@media (min-width: 1720px) {
.benefits__third {
padding-left: 31px;
margin-right: 5px;
}
}
@media (max-width: 991.98px) {
.benefits__third {
padding-left: 11px;
}
}
@media (max-width: 479.98px) {
.benefits__third {
padding-left: 0;
}
}
.benefits .title {
margin-bottom: 76px;
}
@media (min-width: 1720px) {
.benefits .title {
margin-bottom: 93px;
}
}
@media (max-width: 991.98px) {
.benefits .title {
margin-bottom: 19px;
}
}
.benefits img {
position: relative;
top: 14px;
right: -11px;
}
@media (min-width: 1720px) {
.benefits img {
top: -33px;
}
}
@media (max-width: 1304.98px) {
.benefits img {
top: 20px;
right: 0;
}
}
@media (min-width: 1720px) {
.benefits h2 {
margin-bottom: 10px;
}
}
@media (max-width: 479.98px) {
.benefits p {
margin-bottom: 13px;
}
}

194
static/css/moover/cards.css Normal file
View File

@@ -0,0 +1,194 @@
.cards__list {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.cards__item {
position: relative;
}
@media (max-width: 991.98px) {
.cards__item {
max-width: 270px;
}
}
@media (max-width: 767.98px) {
.cards__item {
max-width: 251px;
margin-right: 18px;
}
}
.slick-active .cards__item .cards__desc, .cards__item:hover .cards__desc, .cards__item:focus .cards__desc {
-webkit-line-clamp: initial;
/* number of lines to show */
line-clamp: initial;
max-height: 17em;
}
.cards__img {
margin-bottom: 5px;
}
@media (min-width: 1720px) {
.cards__img {
width: 100%;
margin-bottom: 15px;
}
}
@media (max-width: 1304.98px) {
.cards__img {
margin-bottom: 8px;
}
}
@media (max-width: 991.98px) {
.cards__img {
margin-bottom: 8px;
}
}
@media (max-width: 767.98px) {
.cards__img {
margin-bottom: 10px;
}
}
.cards__img:hover {
scale: 1.05;
transition: scale 0.15s linear;
}
.cards__desc {
font-weight: 500;
line-height: 22px;
padding: 0 5px;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 7;
/* number of lines to show */
line-clamp: 7;
-webkit-box-orient: vertical;
transition: all 0.3s ease-in-out;
max-height: 10em;
}
@media (min-width: 1720px) {
.cards__desc {
font-size: 20px;
line-height: 26px;
padding-left: 20px;
padding-right: 20px;
}
}
@media (max-width: 1279.98px) {
.cards__desc {
padding-left: 5px;
padding-right: 5px;
margin-bottom: 3px;
}
}
@media (max-width: 991.98px) {
.cards__desc {
padding-left: 8px;
padding-right: 8px;
}
}
.slick-active .cards__desc, .cards__desc:hover, .cards__desc:focus {
-webkit-line-clamp: initial;
/* number of lines to show */
line-clamp: initial;
max-height: 999em;
}
.cards__desc a {
color: var(--color-orange);
}
.cards__arrow {
width: 62px;
height: 20px;
position: absolute;
right: -30px;
top: -21px;
background-image: url("/static/img/svg/Arrow23.svg");
}
@media (min-width: 1720px) {
.cards__arrow {
right: -45px;
top: -29px;
}
}
@media (max-width: 1304.98px) {
.cards__arrow {
top: -8%;
}
}
@media (max-width: 991.98px) {
.cards__arrow {
display: none;
}
}
.cards .slick-list {
overflow: visible;
}
@media (max-width: 767.98px) {
.cards .slick-list {
margin-bottom: 1px;
padding-left: 58px;
}
}
.cards .slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding: 1rem 0;
list-style-type: none;
}
.cards .slick-dots li {
margin: 0 0.25rem;
}
@media (max-width: 767.98px) {
.cards .slick-dots li {
margin: 0 0.31rem;
}
}
.cards .slick-dots button {
display: block;
width: 8px;
height: 8px;
padding: 0;
border: none;
border-radius: 100%;
background-color: #D9D9D9;
text-indent: -9999px;
}
.cards .slick-dots li.slick-active button {
background-color: var(--color-orange);
}
.cards--cstmr .cards__desc {
padding: 0 50px;
}
@media (max-width: 1304.98px) {
.cards--cstmr .cards__desc {
padding-left: 10px;
padding-right: 10px;
}
}

View File

@@ -0,0 +1 @@
.chatterbox{margin-bottom:160px}@media (min-width: 1720px){.chatterbox{margin-bottom:180px}}@media (max-width: 1304.98px){.chatterbox{margin-bottom:142px}}@media (max-width: 991.98px){.chatterbox{margin-left:-50vw;margin-right:-50vw;margin-bottom:122px}}@media (max-width: 767.98px){.chatterbox{max-width:100vw;margin:0 auto 121px;position:relative}}.chatterbox__slider{max-width:1200px;margin:0 auto}@media (min-width: 1720px){.chatterbox__slider{max-width:1640px}}@media (max-width: 1304.98px){.chatterbox__slider{max-width:1100px}}@media (max-width: 991.98px){.chatterbox__slider{max-width:720px}}@media (max-width: 767.98px){.chatterbox__slider{max-width:830px;width:830px;left:50%;transform:translateX(-50%)}}@media (max-width: 479.98px){.chatterbox__slider{max-width:initial}}.chatterbox__slide{width:335px;height:615px;background:url("/static/img/webp/phone-border.webp") center no-repeat;transition:scale 0.2s ease-in-out;margin:auto;position:relative}@media (min-width: 1720px){.chatterbox__slide{width:456px;height:836px;background-size:456px 836px}}@media (max-width: 1304.98px){.chatterbox__slide{width:308px;height:565px;background-size:308px 565px}}@media (max-width: 991.98px){.chatterbox__slide{width:206px;height:377px;background-size:206px 377px}}@media (max-width: 767.98px){.chatterbox__slide{width:234px;height:429px;background-size:234px 429px}}.chatterbox__slide.loaded video{opacity:1}.chatterbox__slide.loaded img{z-index:-10}.chatterbox__slide video{max-width:100%;opacity:0;transition:opacity 0.2s ease-in-out;pointer-events:none;position:relative}@media (min-width: 1720px){.chatterbox__slide video{top:-2px}}@media (max-width: 1304.98px){.chatterbox__slide video{top:10px}}@media (max-width: 991.98px){.chatterbox__slide video{top:-4px}}@media (max-width: 767.98px){.chatterbox__slide video{top:22px}}.chatterbox__slide img{position:absolute;scale:1.32;top:11%}.chatterbox__wrap{position:absolute;left:8px;right:8px;top:8px;bottom:8px;border-radius:25px;background-color:grey;overflow:hidden}@media (min-width: 1720px){.chatterbox__wrap{border-radius:50px}}.chatterbox__vbtn{position:absolute;left:0;right:0;top:0;bottom:0;opacity:0;transition:opacity 0.2s ease-in-out;pointer-events:none}.loaded .chatterbox__vbtn{display:none}.chatterbox__vbtn::before{width:80px;height:80px;display:flex;align-items:center;justify-content:center;background:var(--color-primary);border:0;border-radius:50%;transition:opacity 100ms linear}@media (min-width: 1720px){.chatterbox__vbtn::before{width:109px;height:109px}}@media (max-width: 991.98px){.chatterbox__vbtn::before{width:48px;height:48px}}@media (max-width: 767.98px){.chatterbox__vbtn::before{width:55px;height:55px}}.chatterbox__vbtn::before,.chatterbox__vbtn::after{content:"";position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);cursor:pointer}.chatterbox__vbtn::after{border-color:transparent transparent transparent #ffffff;border-style:solid;border-width:15px 0 15px 25px;display:inline-block;margin-left:2px}@media (min-width: 1720px){.chatterbox__vbtn::after{border-width:23px 0 23px 35px;margin-left:4px}}@media (max-width: 991.98px){.chatterbox__vbtn::after{border-width:10px 0 10px 14px}}.chatterbox__vbox{position:relative;display:flex;justify-content:center;align-items:center;height:600px}@media (min-width: 1720px){.chatterbox__vbox{height:827px}}@media (max-width: 1304.98px){.chatterbox__vbox{height:530px}}@media (max-width: 991.98px){.chatterbox__vbox{height:370px}}.chatterbox__mbtns{position:absolute;top:58%;transform:translateY(-50%);left:0;right:0}@media (max-width: 479.98px){.chatterbox__mbtns{top:61.6%}}.chatterbox .title{margin-bottom:60px}@media (max-width: 1304.98px){.chatterbox .title{margin-bottom:39px}}@media (max-width: 767.98px){.chatterbox .title{margin-bottom:50px}}.chatterbox .slick-next{right:-40px}@media (max-width: 1304.98px){.chatterbox .slick-next{right:-10px}}@media (max-width: 991.98px){.chatterbox .slick-next{width:40px;height:40px;background-size:32%;right:5%}}@media (max-width: 479.98px){.chatterbox .slick-next{right:0}}.chatterbox .slick-prev{left:-40px}@media (max-width: 1304.98px){.chatterbox .slick-prev{left:-10px}}@media (max-width: 991.98px){.chatterbox .slick-prev{width:40px;height:40px;background-size:32%;left:5%}}@media (max-width: 479.98px){.chatterbox .slick-prev{left:0}}@media (max-width: 991.98px){.chatterbox .slick-list{overflow:visible}}.slick-slide:not(.slick-center) .chatterbox__slide{scale:0.72}@media (max-width: 1304.98px){.slick-slide:not(.slick-center) .chatterbox__slide{scale:0.69}}@media (max-width: 991.98px){.slick-slide:not(.slick-center) .chatterbox__slide{scale:0.8}}@media (max-width: 479.98px){.slick-slide:not(.slick-center) .chatterbox__slide{scale:0.85}}.slick-center .chatterbox__vbtn{opacity:1;pointer-events:initial;z-index:1}.slick-center .chatterbox__vbox video{pointer-events:initial;cursor:pointer}

347
static/css/moover/diff.css Normal file
View File

@@ -0,0 +1,347 @@
.diff {
margin-bottom: 179px;
}
@media (min-width: 1720px) {
.diff {
margin-bottom: 172px;
}
}
@media (max-width: 1304.98px) {
.diff {
margin-bottom: 140px;
}
}
@media (max-width: 991.98px) {
.diff {
margin-bottom: 125px;
}
}
@media (max-width: 767.98px) {
.diff {
margin-bottom: 139px;
}
}
.diff .title {
width: 60%;
margin-bottom: 65px;
}
@media (min-width: 1720px) {
.diff .title {
width: 49%;
margin-bottom: 60px;
}
}
@media (max-width: 1304.98px) {
.diff .title {
width: 73%;
margin-bottom: 40px;
}
}
@media (max-width: 991.98px) {
.diff .title {
width: 90%;
margin-bottom: 40px;
}
}
@media (max-width: 767.98px) {
.diff .title {
width: 100%;
margin-bottom: 30px;
}
}
.diff__grid {
display: flex;
position: relative;
margin-bottom: 30px;
}
.diff__grid::before {
content: '';
position: absolute;
height: 96%;
width: 5px;
border-radius: 5px;
background-color: #EDEDED;
left: 50%;
transform: translateX(-50%);
bottom: 0;
}
@media (max-width: 1304.98px) {
.diff__grid::before {
height: 90%;
}
}
@media (max-width: 991.98px) {
.diff__grid::before {
display: none;
}
}
@media (max-width: 991.98px) {
.diff__grid {
display: block;
}
}
.diff__coll {
width: 50%;
}
@media (max-width: 991.98px) {
.diff__coll {
width: 100%;
}
}
.diff__coll.left {
margin-right: 29px;
}
@media (min-width: 1720px) {
.diff__coll.left {
margin-right: 12px;
}
}
@media (max-width: 1304.98px) {
.diff__coll.left {
margin-right: 10px;
}
}
@media (max-width: 991.98px) {
.diff__coll.left {
margin-right: 0;
}
}
.diff__coll.left .diff__coll-title {
padding-left: 39px;
}
@media (min-width: 1720px) {
.diff__coll.left .diff__coll-title {
padding-left: 2px;
}
}
@media (max-width: 1304.98px) {
.diff__coll.left .diff__coll-title {
padding-left: 0;
}
}
@media (max-width: 991.98px) {
.diff__coll.left .diff__coll-title {
padding-left: 0;
}
}
.diff__coll.right {
margin-left: 29px;
}
@media (max-width: 1304.98px) {
.diff__coll.right {
margin-left: 10px;
}
}
@media (max-width: 991.98px) {
.diff__coll.right {
margin-left: 0;
display: none;
}
}
.diff__coll.right .diff__coll-title {
padding-right: 39px;
}
@media (min-width: 1720px) {
.diff__coll.right .diff__coll-title {
padding-right: 0;
}
}
@media (max-width: 1304.98px) {
.diff__coll.right .diff__coll-title {
padding-right: 0;
}
}
@media (max-width: 991.98px) {
.diff__coll.right .diff__coll-title {
padding-right: 0;
}
}
.diff__coll-title {
margin-bottom: 38px;
}
@media (max-width: 1304.98px) {
.diff__coll-title {
margin-bottom: 18px;
}
}
@media (max-width: 991.98px) {
.diff__coll-title {
margin-bottom: 19px;
}
}
@media (max-width: 767.98px) {
.diff__coll-title {
margin-bottom: 29px;
}
}
.diff__item {
position: relative;
text-align: left;
padding-left: 10px;
padding-top: 11px;
padding-bottom: 11px;
display: flex;
gap: 11px;
align-items: center;
background-color: #FFFFFF;
border-radius: 15px;
font-weight: 500;
font-size: 20px;
line-height: 28px;
margin-bottom: 35px;
cursor: default;
}
@media (min-width: 1720px) {
.diff__item {
padding: 20px;
gap: 20px;
margin-bottom: 40px;
}
}
@media (max-width: 1304.98px) {
.diff__item {
margin-bottom: 18px;
}
}
@media (max-width: 991.98px) {
.diff__item {
font-size: 18px;
margin-bottom: 25px;
padding-bottom: 9px;
}
}
@media (max-width: 767.98px) {
.diff__item {
font-size: 16px;
line-height: 19.36px;
padding-right: 15px;
margin-bottom: 14px;
}
}
.diff__item:last-child {
margin-bottom: 0;
}
.diff__item:hover .diff__status::before {
scale: 1.2;
}
.diff__status {
position: relative;
height: 48px;
width: 48px;
border-radius: 5px;
flex-shrink: 0;
}
@media (min-width: 1720px) {
.diff__status {
border-radius: 12px;
}
}
@media (max-width: 1304.98px) {
.diff__status {
border-radius: 13px;
}
}
@media (max-width: 991.98px) {
.diff__status {
border-radius: 11px;
}
}
@media (max-width: 767.98px) {
.diff__status {
width: 35px;
height: 35px;
}
}
.diff__status::before {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
transform-origin: 0% 15%;
}
.diff__status::before {
content: '';
width: 36px;
height: 36px;
}
.diff__item--done .diff__status {
background-color: #CCF9D9;
}
.diff__item--done .diff__status::before {
width: 26px;
height: 26px;
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjYiIGhlaWdodD0iMjYiIHZpZXdCb3g9IjAgMCAyNiAyNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTI0IDJMOS4zMzMzMyAyNEwyIDEzLjAwMDUiIHN0cm9rZT0iIzQ1QzIyNiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==);
}
@media (max-width: 767.98px) {
.diff__item--done .diff__status::before {
scale: 0.7;
}
}
.diff__item--error .diff__status {
background-color: #F9CCCC;
}
.diff__item--error .diff__status::before {
width: 36px;
height: 36px;
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzYiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCAzNiAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTI4LjEyNSA3Ljg3NUw3Ljg3NSAyOC4xMjUiIHN0cm9rZT0iI0ZGMDAwMCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPHBhdGggZD0iTTI4LjEyNSAyOC4xMjVMNy44NzUgNy44NzUiIHN0cm9rZT0iI0ZGMDAwMCIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==);
}
@media (max-width: 767.98px) {
.diff__item--error .diff__status::before {
scale: 0.7;
}
}

418
static/css/moover/easy.css Normal file
View File

@@ -0,0 +1,418 @@
.easy {
margin-bottom: 162px;
}
@media (min-width: 1720px) {
.easy {
margin-bottom: 180px;
}
}
@media (max-width: 1304.98px) {
.easy {
margin-bottom: 140px;
}
}
@media (max-width: 991.98px) {
.easy {
margin-bottom: 121px;
}
}
.easy .title {
max-width: 55%;
margin-bottom: 21px;
}
@media (min-width: 1720px) {
.easy .title {
max-width: 45%;
margin-bottom: 23px;
}
}
@media (max-width: 991.98px) {
.easy .title {
max-width: 75%;
}
}
@media (max-width: 767.98px) {
.easy .title {
max-width: 95%;
margin-bottom: 30px;
}
}
.easy .subtitle {
margin-bottom: 41px;
}
@media (min-width: 1720px) {
.easy .subtitle {
margin-bottom: 59px;
}
}
@media (max-width: 767.98px) {
.easy .subtitle {
max-width: 90%;
margin: 0 auto 23px;
}
}
.easy__grid {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(2, minmax(186px, auto));
grid-template-areas: 'a b' 'a c';
grid-column-gap: 20px;
grid-row-gap: 80px;
margin-bottom: 46px;
}
@media (min-width: 1720px) {
.easy__grid {
grid-column-gap: 147px;
grid-template-rows: repeat(2, minmax(245px, auto));
grid-row-gap: 136px;
margin-bottom: 63px;
}
}
@media (max-width: 1304.98px) {
.easy__grid {
grid-column-gap: 69px;
grid-template-rows: repeat(2, minmax(172px, auto));
margin-bottom: 41px;
}
}
@media (max-width: 991.98px) {
.easy__grid {
display: block;
margin-bottom: 37px;
}
}
@media (max-width: 767.98px) {
.easy__grid {
margin-bottom: 40px;
}
}
.easy__item {
border-radius: 30px;
background-color: var(--color-grey);
/*background-color: #a72525;*/
text-align: left;
padding: 21px;
box-shadow: var(--box-shadow-primary);
}
.easy__item--fir {
grid-area: a;
margin-right: 60px;
padding-bottom: 0;
}
@media (min-width: 1720px) {
.easy__item--fir {
margin-right: -10px;
padding-top: 31px;
}
}
@media (max-width: 1304.98px) {
.easy__item--fir {
margin-right: 13px;
}
}
@media (max-width: 991.98px) {
.easy__item--fir {
padding-top: 17px;
margin-right: 0;
margin-bottom: 49px;
}
}
@media (max-width: 767.98px) {
.easy__item--fir {
margin-bottom: 42px;
}
}
.easy__item--fir p {
width: 93%;
margin-bottom: 29px;
}
@media (min-width: 1720px) {
.easy__item--fir p {
width: 89%;
margin-bottom: 53px;
}
}
@media (max-width: 991.98px) {
.easy__item--fir p {
max-width: 78%;
}
}
.easy__item--sec {
grid-area: b;
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0;
padding-top: 0;
padding-bottom: 0;
}
@media (min-width: 1720px) {
.easy__item--sec {
padding-left: 15px;
}
}
@media (max-width: 991.98px) {
.easy__item--sec {
padding-top: 35px;
padding-bottom: 37px;
margin-bottom: 46px;
}
}
@media (max-width: 767.98px) {
.easy__item--sec {
display: block;
padding-top: 0;
padding-bottom: 0;
margin-bottom: 49px;
}
}
.easy__item--sec img {
margin-bottom: -10px;
margin-right: -5px;
max-width: 50.1%;
}
@media (min-width: 1720px) {
.easy__item--sec img {
max-width: 53%;
}
}
@media (max-width: 1304.98px) {
.easy__item--sec img {
max-width: 42%;
margin-bottom: -4px;
margin-right: 0;
}
}
@media (max-width: 991.98px) {
.easy__item--sec img {
margin-right: 0;
margin-bottom: 0;
}
}
@media (max-width: 767.98px) {
.easy__item--sec img {
max-width: 104%;
position: relative;
left: -6px;
top: -4px;
}
}
.easy__item--sec p {
margin-bottom: 0;
padding-top: 0;
padding-bottom: 0;
}
@media (max-width: 767.98px) {
.easy__item--sec p {
margin-bottom: 22px;
}
}
.easy__item--thr {
grid-area: c;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0;
padding-top: 0;
padding-bottom: 0;
}
@media (min-width: 1720px) {
.easy__item--thr {
padding-left: 15px;
}
}
@media (max-width: 991.98px) {
.easy__item--thr {
padding-top: 42px;
padding-bottom: 46px;
}
}
@media (max-width: 767.98px) {
.easy__item--thr {
display: block;
padding-top: 0;
padding-bottom: 0;
}
}
.easy__item--thr .img {
margin-bottom: -10px;
margin-right: 24px;
max-width: 80%;
}
@media (max-width: 1279.98px) {
.easy__item--thr .img {
max-width: 35%;
}
}
@media (max-width: 1304.98px) {
.easy__item--thr .img {
margin-right: 2px;
}
}
@media (max-width: 991.98px) {
.easy__item--thr .img {
margin-right: 0;
max-width: 34%;
}
}
@media (max-width: 767.98px) {
.easy__item--thr .img img {
display: block;
margin: 0 auto;
}
}
.easy__item--thr p {
max-width: 50%;
margin-bottom: 0;
padding-top: 0;
padding-bottom: 0;
}
@media (max-width: 991.98px) {
.easy__item--thr p {
max-width: 60%;
}
}
@media (max-width: 767.98px) {
.easy__item--thr p {
margin-bottom: 22px;
max-width: 100%;
}
}
.easy__arrow {
width: 68px;
height: 18px;
background-image: url("/static/img/svg/Arrow08.svg");
position: absolute;
z-index: 1;
}
@media (min-width: 1720px) {
.easy__arrow {
scale: 1.4;
}
}
@media (max-width: 1304.98px) {
.easy__arrow {
scale: 0.8;
}
}
@media (max-width: 991.98px) {
.easy__arrow {
display: none;
}
}
.easy__arrow--fir {
top: 46%;
right: 101%;
}
@media (min-width: 1720px) {
.easy__arrow--fir {
right: 105%;
top: 34%;
}
}
@media (max-width: 1304.98px) {
.easy__arrow--fir {
top: 48%;
}
}
.easy__arrow--sec {
top: 117%;
left: 30%;
transform: rotate(90deg);
}
@media (min-width: 1720px) {
.easy__arrow--sec {
left: 45%;
top: 124%;
}
}
@media (max-width: 1304.98px) {
.easy__arrow--sec {
left: 38%;
}
}
.easy__btn {
margin-top: -21px;
}
@media (max-width: 1304.98px) {
.easy__btn {
margin-top: -20px;
}
}
@media (max-width: 991.98px) {
.easy__btn {
margin-top: -19px;
padding-left: 54px;
padding-right: 54px;
}
}
@media (max-width: 767.98px) {
.easy__btn {
padding-left: 50px;
padding-right: 50px;
margin-top: -8px;
max-width: 100%;
}
}

View File

@@ -0,0 +1 @@
.header{margin-top:0;position:fixed;display:block;left:0;top:0;width:100vw;padding:15px 5px;transition:all 0.1s ease-in-out;background-color:white}@media (max-width: 991.98px){.header{padding-top:7px;padding-bottom:7px}}.header.scrolled{padding-top:7px;padding-bottom:7px;box-shadow:var(--box-shadow-primary);border-bottom:1px solid var(--color-grey)}.header__grid,.header__list{display:flex;align-items:center;justify-content:space-between}.header__logo{width:48px;height:48px;position:relative;left:5px}@media (max-width: 1304.98px){.header__logo{left:6px}}@media (max-width: 991.98px){.header__logo{left:0}}@media (max-width: 767.98px){.header__logo{left:-3px}}.header__nav{flex-grow:1;max-width:41%;margin-left:auto}@media (min-width: 1720px){.header__nav{max-width:34%}}@media (max-width: 1304.98px){.header__nav{max-width:46.5%}}.header__link{color:var(--color-black2);text-decoration:none}.header__btn{padding:8px 0 6px;font-size:16px;margin-left:61px;margin-right:-3px}@media (min-width: 1720px){.header__btn{margin-left:81px}}@media (max-width: 1304.98px){.header__btn{margin-right:0}}@media (max-width: 991.98px){.header__btn{display:none}}.header .dropdown{left:-4px}@media (max-width: 767.98px){.header .dropdown{left:-8px}}.header .dropdown-content{right:0;height:initial}@media (max-width: 575px){.header .dropdown-content{right:0;left:initial}}

View File

@@ -0,0 +1,189 @@
.presentation {
margin: 12px -65px 140px;
}
@media (min-width: 1720px) {
.presentation {
margin-left: 0;
margin-right: 0;
margin-bottom: 160px;
}
}
@media (max-width: 1304.98px) {
.presentation {
margin-bottom: 118px;
}
}
@media (max-width: 991.98px) {
.presentation {
margin-bottom: 105px;
}
}
.presentation__top {
position: relative;
min-height: 270px;
margin: 0 auto 116px;
padding: 29px 0 40px;
background-image: url(/static/img/png/Box9.png), url(/static/img/png/Box10.png), url(/static/img/png/Box11.png), url(/static/img/png/Box12.png);
background-position: top -4px left 46px, top -30px right -14px, bottom 73px left 278px, bottom 71px right 276px;
background-repeat: no-repeat, no-repeat, no-repeat, no-repeat;
background-size: 17.5%, 21.8%, 8.5%, 8.8%;
}
@media (min-width: 1720px) {
.presentation__top {
background-size: 18.5%, 22%, 9%, 10.1%;
background-position: top -47px left 58px, top -31px right 20px, bottom 8px left 347px, bottom -5px right 352px;
padding-top: 95px;
margin-bottom: 176px;
}
}
@media (max-width: 1304.98px) {
.presentation__top {
background-size: 16%, 20%, 9.5%, 10.1%;
background-position: top -2.8% left 6.5%, top -19% right 3.5%, bottom 32% left 23%, bottom 29% right 22.6%;
margin-bottom: 96px;
}
}
@media (max-width: 991.98px) {
.presentation__top {
background-size: 14.5%, 17%, 8.3%, 9.1%;
background-position: top 9% left 7%, top 5% right 6%, bottom 51% left 14.8%, bottom 47.5% right 13.8%;
padding-top: 31px;
margin-bottom: 76px;
}
}
@media (max-width: 767.98px) {
.presentation__top {
margin-bottom: 77px;
}
}
@media (max-width: 991.98px) {
.presentation__bottom .subtitle {
max-width: 40%;
margin: 0 auto 30px;
}
}
@media (max-width: 767.98px) {
.presentation__bottom .subtitle {
max-width: 65%;
margin-bottom: 21px;
}
}
.presentation__title {
margin-bottom: 23px;
}
@media (max-width: 991.98px) {
.presentation__title {
max-width: 75%;
margin: 0 auto 19px;
}
}
@media (max-width: 767.98px) {
.presentation__title {
margin-bottom: 15px;
}
}
.presentation__subtitle {
margin-bottom: 41px;
font-weight: 600;
}
@media (max-width: 991.98px) {
.presentation__subtitle {
max-width: 55%;
margin: 0 auto 40px;
font-size: 16px;
}
}
@media (max-width: 767.98px) {
.presentation__subtitle {
margin-bottom: 30px;
max-width: 77%;
}
}
.presentation__btn {
margin-bottom: 40px;
}
@media (max-width: 991.98px) {
.presentation__btn {
padding-left: 82px;
padding-right: 82px;
}
}
@media (max-width: 767.98px) {
.presentation__btn {
margin-bottom: 30px;
}
}
.presentation__next {
font-weight: 500;
line-height: 22px;
padding-right: 5px;
}
.presentation__arrows {
padding-top: 2px;
animation: jump 2s ease-in-out infinite;
}
.presentation__cards {
max-width: 1300px;
margin: 0 auto;
}
@media (min-width: 1720px) {
.presentation__cards {
max-width: initial;
margin-left: -10px;
margin-right: -10px;
}
}
@media (max-width: 1304.98px) {
.presentation__cards {
max-width: 1140px;
}
}
.presentation__bottom .presentation__title {
margin-bottom: 13px;
}
@keyframes jump {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(-5px);
}
60% {
transform: translateY(20px);
}
70% {
transform: translateY(0px);
}
80% {
transform: translateY(20px);
}
100% {
transform: translateY(0px);
}
}

View File

@@ -0,0 +1,2 @@
.container{margin:0 auto;width:1280px;position:relative}@media (min-width: 1720px){.container{width:1720px}}@media (max-width: 1304.98px){.container{width:1120px;max-width:88vw}}@media (max-width: 991.98px){.container{width:640px;max-width:100vw}}@media (max-width: 767.98px){.container{margin:0 16px;width:auto}}:root{--color-primary: #FF613A;--color-white: #FFFFFF;--color-black: #000000;--color-black2: #272424;--color-grey: #F1F1F1;--color-grey2: #7A7979;--color-orange: #FF613A;--box-shadow-primary: -1px 4px 10px 0 rgba(198, 199, 203, 0.20),
0 -1px 10px 0 rgba(198, 199, 203, 0.20);text-align:center;color:var(--color-black2)}html,body{max-width:100vw;max-height:initial}body{height:100%;position:relative}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:700}h1,.h1{font-size:44px;line-height:52px}@media (min-width: 1720px){h1,.h1{font-size:48px;line-height:52px}}h2,.h2{font-size:24px;line-height:36px;margin-bottom:10px}@media (min-width: 1720px){h2,.h2{font-size:28px;margin-bottom:20px}}h3,.h3{font-size:20px;line-height:28px;margin-bottom:12px}@media (max-width: 1304.98px){h3,.h3{margin-bottom:13px}}h4,.h4{font-size:18px;line-height:26px;margin-bottom:20px}p{line-height:22px;margin-bottom:20px}@media (min-width: 1720px){p{font-size:20px;line-height:26px}}@media (max-width: 991.98px){p{margin-bottom:18px}}@media (max-width: 479.98px){p{margin-bottom:14px}}b{font-weight:500}@media (max-width: 991.98px){b{font-size:16px;line-height:22px}}.btn{display:inline-flex;text-decoration:none;color:black;line-height:22px;border-radius:10px;padding:20px 76px 18px;justify-content:center;align-items:center;margin:0 3px;letter-spacing:0.2px;font-size:18px}.btn--primary{background:var(--color-primary);color:var(--color-white)}.title{font-size:44px;font-weight:700;line-height:52px;margin-bottom:13px;margin-left:auto;margin-right:auto}@media (min-width: 1720px){.title{font-size:48px;margin-bottom:22px}}@media (max-width: 1304.98px){.title{margin-bottom:20px}}@media (max-width: 991.98px){.title{font-size:32px;line-height:38.73px}}@media (max-width: 767.98px){.title{margin-bottom:14px}}.subtitle{margin-bottom:81px;line-height:22px}@media (min-width: 1720px){.subtitle{font-size:20px;margin-bottom:105px}}@media (max-width: 1304.98px){.subtitle{margin-bottom:71px}}.hide{display:none}.hide__xxl{display:inline-flex}@media (min-width: 1720px){.hide__xxl{display:none}}@media (max-width: 991.98px){.hide__md{display:none}}@media (max-width: 479.98px){.hide__xs{display:none}}.show__xxl{display:none}@media (min-width: 1720px){.show__xxl{display:block}}.show__md{display:none}@media (max-width: 991.98px){.show__md{display:initial}}@media (min-width: 480px){.show__xs{display:none}}@media (min-width: 1440px){.br--xxl{display:none}}@media (max-width: 991.98px){.br--md{display:none}}@media (max-width: 767.98px){.br--sm{display:none}}.is-container.wrapper_main{overflow-x:hidden}.is-container.wrapper_main>.container{padding-top:129px}@media (max-width: 1304.98px){.is-container.wrapper_main>.container{padding-top:126px}}@media (max-width: 991.98px){.is-container.wrapper_main>.container{padding-top:85px}}@media (max-width: 767.98px){.is-container.wrapper_main>.container{padding-top:57px}}@media (min-width: 1440px){.is-container.wrapper_main{max-width:initial}}.is-container.wrapper_main>.container{position:relative;left:15px}@media (min-width: 1720px){.is-container.wrapper_main>.container{left:17px}}@media (max-width: 767.98px){.is-container.wrapper_main>.container{left:0}}

View File

@@ -0,0 +1 @@
.sore{margin-bottom:160px;margin-top:1px}@media (min-width: 1720px){.sore{margin-bottom:178px}}@media (max-width: 1304.98px){.sore{margin-bottom:140px}}@media (max-width: 991.98px){.sore{margin-bottom:60px}}@media (max-width: 479.98px){.sore{margin-bottom:40px}}.sore__img{margin:0 auto 13px;position:relative;left:-17px;top:-13px}@media (min-width: 1720px){.sore__img{margin-bottom:40px;top:-5px;left:-21px}}@media (max-width: 1304.98px){.sore__img{left:2px;top:-22px;margin-bottom:4px}}@media (max-width: 991.98px){.sore__img{top:-8px;left:-15px;margin-bottom:18px}}@media (max-width: 479.98px){.sore__img{max-width:108.5%;top:-26px;left:-18px;margin-bottom:-9px}}.sore .title{margin-bottom:40px}@media (min-width: 1720px){.sore .title{margin-bottom:61px}}@media (max-width: 991.98px){.sore .title{margin-bottom:20px}}@media (max-width: 479.98px){.sore .title{margin-bottom:29px}}.sore .subtitle{max-width:62%;margin:0 auto 10px}@media (min-width: 1720px){.sore .subtitle{line-height:26px;max-width:60%}}@media (max-width: 1304.98px){.sore .subtitle{max-width:65%}}@media (max-width: 991.98px){.sore .subtitle{max-width:85%}}@media (max-width: 479.98px){.sore .subtitle{max-width:99%}}.sore .h3{max-width:47%;margin:0 auto 19px}@media (min-width: 1720px){.sore .h3{max-width:38%}}@media (max-width: 1304.98px){.sore .h3{max-width:50%}}@media (max-width: 991.98px){.sore .h3{max-width:65%;margin-bottom:21px}}@media (max-width: 479.98px){.sore .h3{max-width:100%;margin-bottom:17px}}@media (max-width: 767.98px){.sore__btn{padding-left:50px;padding-right:50px}}@media (max-width: 479.98px){.sore__btn{box-sizing:border-box;padding:8px 15px;min-height:60px;display:flex}}

View File

@@ -0,0 +1 @@
.use{margin-bottom:123px}@media (min-width: 1720px){.use{margin-bottom:184px}}@media (max-width: 1304.98px){.use{margin-bottom:142px}}@media (max-width: 991.98px){.use{margin-bottom:121px}}.use__img{width:67.5%;margin-left:16px;margin-bottom:31px}@media (min-width: 1720px){.use__img{width:50.2%;margin-left:15px;margin-bottom:46px}}@media (max-width: 1304.98px){.use__img{width:77%;margin-left:10px;margin-bottom:34px}}@media (max-width: 991.98px){.use__img{margin-left:0;width:100%;margin-bottom:40px}}@media (max-width: 767.98px){.use__img{margin-bottom:30px}}.use__btn{margin-bottom:11px;text-align:center}@media (max-width: 767.98px){.use__btn{max-width:100%;padding-left:50px;padding-right:50px}}.use__link{font-size:18px;font-weight:600;line-height:26px;color:var(--color-grey2)}.use .title{max-width:80%;margin-bottom:49px}@media (min-width: 1720px){.use .title{max-width:40%}}@media (max-width: 991.98px){.use .title{margin-bottom:40px}}@media (max-width: 767.98px){.use .title{max-width:100%;margin-bottom:29px}}.use--lett{margin-bottom:120px}@media (min-width: 1720px){.use--lett{margin-bottom:126px}}@media (max-width: 1304.98px){.use--lett{margin-bottom:106px}}@media (max-width: 991.98px){.use--lett{margin-bottom:79px}}@media (max-width: 767.98px){.use--lett{margin-bottom:81px}}.use--lett .title{margin-bottom:51px}@media (max-width: 1304.98px){.use--lett .title{margin-bottom:39px}}@media (max-width: 767.98px){.use--lett .title{margin-bottom:10px}}.use--lett .use__img{margin-left:-5px;margin-right:-5px;max-width:110%;width:1290px}@media (min-width: 1720px){.use--lett .use__img{width:initial}}@media (max-width: 1304.98px){.use--lett .use__img{margin-left:0;margin-right:0;max-width:100%;width:1120px}}@media (max-width: 767.98px){.use--lett .use__img{max-width:103%;margin-left:-5px;margin-top:-6px}}@media (max-width: 479.98px){.use--lett .use__img{margin-bottom:3px}}@media (max-width: 991.98px){.use .h3{max-width:75%;margin:0 auto 22px}}@media (max-width: 767.98px){.use .h3{max-width:100%;margin-bottom:16px}}

189
static/css/moover/uses.css Normal file
View File

@@ -0,0 +1,189 @@
.uses {
margin-bottom: 120px;
}
@media (min-width: 1720px) {
.uses {
margin-bottom: 136px;
}
}
@media (max-width: 1304.98px) {
.uses {
margin-bottom: 125px;
}
}
@media (max-width: 991.98px) {
.uses {
margin-bottom: 100px;
}
}
@media (max-width: 479.98px) {
.uses {
margin-bottom: 199px;
}
}
.uses__grid {
text-align: left;
display: grid;
grid-template-columns: repeat(3, 1fr);
/* max-width: 101.5%; */
/* width: 101.5%; */
}
@media (max-width: 991.98px) {
.uses__grid {
grid-template-columns: 1fr 1fr;
column-gap: 15px;
}
}
@media (max-width: 479.98px) {
.uses__grid {
display: block;
text-align: center;
}
}
.uses__item {
min-height: 50px;
margin-bottom: 19px;
padding: 0 50px 0 2px;
}
@media (min-width: 1720px) {
.uses__item {
margin-bottom: 22px;
}
}
@media (max-width: 991.98px) {
.uses__item {
padding-right: 0;
}
}
@media (max-width: 991.98px) {
.uses__item p:last-child {
margin-bottom: 0;
}
}
.uses__icon {
margin-bottom: 11px;
}
@media (min-width: 1720px) {
.uses__icon {
width: 147px;
height: 147px;
margin-bottom: 20px;
}
}
.uses .title {
max-width: 50%;
margin: 0 auto 60px;
}
@media (max-width: 1304.98px) {
.uses .title {
max-width: 70%;
margin-bottom: 39px;
}
}
@media (max-width: 479.98px) {
.uses .title {
margin-bottom: 30px;
}
}
.uses__title {
font-size: 24px;
font-weight: 700;
line-height: 36px;
margin-bottom: 10px;
}
.uses--cstmr .uses__item {
text-align: center;
padding: 0 15px;
}
@media (max-width: 991.98px) {
.uses--cstmr .uses__item {
margin-bottom: 42px;
min-height: 255px;
}
}
@media (max-width: 479.98px) {
.uses--cstmr .uses__item {
margin-bottom: 25px;
min-height: 194px;
}
}
@media (max-width: 991.98px) {
.uses--cstmr .uses__item p {
max-width: 90%;
margin: 0 auto;
}
}
@media (max-width: 479.98px) {
.uses--cstmr .uses__item p {
max-width: 100%;
}
}
.uses--cstmr .uses__icon {
width: 118px;
height: 118px;
}
@media (max-width: 991.98px) {
.uses--cstmr .uses__icon {
width: 142px;
height: 142px;
margin-bottom: 23px;
}
}
@media (max-width: 479.98px) {
.uses--cstmr .uses__icon {
width: 117px;
height: 117px;
margin-bottom: 8px;
}
}
@media (max-width: 991.98px) {
.uses--cstmr .uses__grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 1304.98px) {
.uses--cstmr .title {
margin-bottom: 61px;
max-width: 80%;
}
}
@media (max-width: 991.98px) {
.uses--cstmr .title {
margin-bottom: 44px;
}
}
@media (max-width: 479.98px) {
.uses--cstmr .title {
max-width: 90%;
margin-bottom: 31px;
}
}

204
static/css/slick-theme.css Normal file
View File

@@ -0,0 +1,204 @@
@charset 'UTF-8';
/* Slider */
.slick-loading .slick-list
{
background: #fff url('./ajax-loader.gif') center center no-repeat;
}
/* Icons */
@font-face
{
font-family: 'slick';
font-weight: normal;
font-style: normal;
src: url('./fonts/slick.eot');
src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg');
}
/* Arrows */
.slick-prev,
.slick-next
{
font-size: 0;
line-height: 0;
position: absolute;
top: 50%;
display: block;
width: 20px;
height: 20px;
padding: 0;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
cursor: pointer;
color: transparent;
border: none;
outline: none;
background: transparent;
}
.slick-prev:hover,
.slick-prev:focus,
.slick-next:hover,
.slick-next:focus
{
color: transparent;
outline: none;
background: transparent;
}
.slick-prev:hover:before,
.slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before
{
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before
{
opacity: .25;
}
.slick-prev:before,
.slick-next:before
{
font-family: 'slick';
font-size: 20px;
line-height: 1;
opacity: .75;
color: white;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-prev
{
left: -25px;
}
[dir='rtl'] .slick-prev
{
right: -25px;
left: auto;
}
.slick-prev:before
{
content: '←';
}
[dir='rtl'] .slick-prev:before
{
content: '→';
}
.slick-next
{
right: -25px;
}
[dir='rtl'] .slick-next
{
right: auto;
left: -25px;
}
.slick-next:before
{
content: '→';
}
[dir='rtl'] .slick-next:before
{
content: '←';
}
/* Dots */
.slick-dotted.slick-slider
{
margin-bottom: 30px;
}
.slick-dots
{
position: absolute;
bottom: -25px;
display: block;
width: 100%;
padding: 0;
margin: 0;
list-style: none;
text-align: center;
}
.slick-dots li
{
position: relative;
display: inline-block;
width: 20px;
height: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button
{
font-size: 0;
line-height: 0;
display: block;
width: 20px;
height: 20px;
padding: 5px;
cursor: pointer;
color: transparent;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus
{
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before
{
opacity: 1;
}
.slick-dots li button:before
{
font-family: 'slick';
font-size: 6px;
line-height: 20px;
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
content: '•';
text-align: center;
opacity: .25;
color: black;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before
{
opacity: .75;
color: black;
}

146
static/css/slick.css Normal file
View File

@@ -0,0 +1,146 @@
/* Slider */
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-khtml-user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
display: block;
overflow: hidden;
margin: 0;
padding: 0;
}
.slick-list:focus {
outline: none;
}
.slick-list.dragging {
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
top: 0;
left: 0;
display: block;
margin-left: auto;
margin-right: auto;
}
.slick-track:before,
.slick-track:after {
display: table;
content: '';
}
.slick-track:after {
clear: both;
}
.slick-loading .slick-track {
visibility: hidden;
}
.slick-slide {
display: none;
float: left;
height: 100%;
min-height: 1px;
}
[dir='rtl'] .slick-slide {
float: right;
}
.slick-slide img {
display: block;
}
.slick-slide.slick-loading img {
display: none;
}
.slick-slide.dragging img {
pointer-events: none;
}
.slick-initialized .slick-slide {
display: block;
}
.slick-loading .slick-slide {
visibility: hidden;
}
.slick-vertical .slick-slide {
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}
.slick-prev, .slick-next {
font-size: 0;
line-height: 0;
position: absolute;
top: 50%;
display: block;
width: 80px;
height: 80px;
padding: 0;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
cursor: pointer;
color: transparent;
outline: none;
background: transparent;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border: 1px solid var(--color-primary);
outline: 0;
border-radius: 50%;
box-sizing: border-box;
text-indent: -9999px;
z-index: 1;
background: var(--color-primary) url("/static/img/svg/slick-arrow.svg") no-repeat center;
transition: background-color .2s ease-in-out;
}
.slick-next {
right: 0;
transform: rotate(180deg) translate(0, 50%);
}
.slick-disabled {
display: none !important;
}

View File

@@ -253,6 +253,7 @@ footer {
height: 318px;
background: #272424;
margin-top: 50px;
text-align: left;
}
section.register>h1 {
@@ -419,6 +420,7 @@ footer>div {
font-style: normal;
font-weight: 400;
line-height: 22px;
}
.footer_text_contact {
@@ -1000,6 +1002,16 @@ section.register>form {
display: inline-block;
width: 90%;
}
.necessary_text {
color: rgba(39, 36, 36, 0.60);
/* Body text 3 */
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 20px;
display: inline-block;
width: 100%;
}
.button_register>button {
display: block;
@@ -1209,7 +1221,7 @@ section.login {
margin-bottom: 120px;
}
section.login>h1 {
section.login>h1, div.recovery_pas>h1 {
color: #272424;
text-align: center;
/* Heading 1 */
@@ -1221,7 +1233,7 @@ section.login>h1 {
margin-bottom: 40px;
}
section.login>form {
section.login>form, div.recovery_pas>form {
max-width: 420px;
margin: auto;
text-align: center;
@@ -1293,7 +1305,8 @@ section.login>form {
color: rgba(39, 36, 36, 0.60);
}
.call_to_reg {
cursor: pointer;
text-align: center;
color: rgba(39, 36, 36, 0.60);
font-style: normal;
font-weight: 500;
@@ -3355,6 +3368,25 @@ details[open] summary ~ *{
/*END news articles all*/
.login.hide{
display: none;
}
.recovery_pas{
display: none;
}
.recovery_pas.show{
display: block;
}
.recovery.hide{
display: none;
}
input.error::placeholder {
color: red;
font-weight: bold;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
static/favicon/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

BIN
static/img/png/Box10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
static/img/png/Box11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
static/img/png/Box12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
static/img/png/Box9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Some files were not shown because too many files have changed in this diff Show More