Compare commits

267 Commits

Author SHA1 Message Date
b923665c07 Update app.py
All checks were successful
continuous-integration/drone/push Build is passing
2024-08-04 12:53:06 +10:00
Simple_Not
315e6f8142 threads almost normal
All checks were successful
continuous-integration/drone/push Build is passing
2024-02-02 18:59:34 +10:00
Simple_Not
17fc89ebbd threads gogogo
All checks were successful
continuous-integration/drone/push Build is passing
2024-02-02 01:51:03 +10:00
Simple_Not
fbb586b56c threads rising
All checks were successful
continuous-integration/drone/push Build is passing
2024-02-01 03:26:12 +10:00
Simple_Not
f9bbd5e6af pics tryout
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-31 23:58:05 +10:00
Simple_Not
412b26244a pics tryout
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-31 23:56:43 +10:00
Simple_Not
32f1d87831 pics tryout
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-31 23:53:00 +10:00
Simple_Not
216d60c84d ip-getter
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 13:51:23 +10:00
Simple_Not
ad6feb7afb ip-getter
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 13:50:38 +10:00
Simple_Not
a95d556e8c re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 01:54:07 +10:00
Simple_Not
956b59c2fa re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 01:52:45 +10:00
Simple_Not
a325ea91fe re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 01:51:31 +10:00
Simple_Not
a84da0a6f9 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 01:49:36 +10:00
Simple_Not
9838f7f024 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:35:54 +10:00
Simple_Not
d21e5e0bf6 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:33:14 +10:00
Simple_Not
38842ec947 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:27:50 +10:00
Simple_Not
5ad7f7514d re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:26:45 +10:00
Simple_Not
365c4909fe re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:25:24 +10:00
Simple_Not
71f72c66f3 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:24:54 +10:00
Simple_Not
d4e585fb13 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:22:50 +10:00
Simple_Not
92bb87c816 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:19:43 +10:00
Simple_Not
9e90bd2458 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:18:17 +10:00
Simple_Not
2b5fd02929 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:16:33 +10:00
Simple_Not
d4131c26c8 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:15:08 +10:00
Simple_Not
edd102e5e3 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:14:31 +10:00
Simple_Not
2a5a3fd8e4 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:13:23 +10:00
Simple_Not
a7e17694c2 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:11:23 +10:00
Simple_Not
d0163a8963 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:09:03 +10:00
Simple_Not
e83dfebee5 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:08:46 +10:00
Simple_Not
c8241f2613 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:04:10 +10:00
Simple_Not
25e5430b4c re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-30 00:02:38 +10:00
Simple_Not
e34be51a16 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 23:59:38 +10:00
Simple_Not
e30077bf4d re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 23:53:41 +10:00
Simple_Not
3320baf0f2 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 23:53:26 +10:00
Simple_Not
68e455fe7b re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 23:51:59 +10:00
Simple_Not
134297911b re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:49:42 +10:00
Simple_Not
d89ba3f582 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:47:56 +10:00
Simple_Not
14057ead4d re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:44:05 +10:00
Simple_Not
1b2bfb601b re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:34:24 +10:00
Simple_Not
b3d20faec3 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:31:01 +10:00
Simple_Not
2a68a6d8c2 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:30:50 +10:00
Simple_Not
c36968ec16 re ans-post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:28:38 +10:00
Simple_Not
e6ae7440aa re post
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:13:25 +10:00
Simple_Not
3f3e5711b6 move answers
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:11:01 +10:00
Simple_Not
a416e46139 move answers
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:09:55 +10:00
Simple_Not
33c609645c move answers
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:08:44 +10:00
Simple_Not
1f58b37b96 checking threads viz
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 02:03:20 +10:00
Simple_Not
1ff5f2803f checking threads viz
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 01:44:22 +10:00
Simple_Not
e91c6dba41 checking threads viz
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 01:42:37 +10:00
Simple_Not
5c99fc6f8d checking threads viz
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 01:39:59 +10:00
Simple_Not
bb6f126811 checking threads viz
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-29 01:35:08 +10:00
Simple_Not
0e727ef4fe Merge branch 'dev' into master-of-slaves
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-26 19:08:04 +10:00
Simple_Not
cf479d2353 order-bug fix
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-26 19:05:33 +10:00
Simple_Not
9aaec391b2 well
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-26 00:33:31 +10:00
Simple_Not
7600ab6e3e well
All checks were successful
continuous-integration/drone/push Build is passing
2024-01-26 00:32:44 +10:00
Simple_Not
fd4ff11562 check changin
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-16 17:34:16 +10:00
Simple_Not
bceda9bdde check changin
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-16 17:27:05 +10:00
Simple_Not
ef157ed64b upd drone mst
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-16 17:05:43 +10:00
Simple_Not
90522346ac upd drone dev
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-16 17:05:19 +10:00
Simple_Not
d5f4fd3989 upd drone dev 2023-11-16 17:03:03 +10:00
Simple_Not
765bad6d5e upd drone mst
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-16 17:02:32 +10:00
Simple_Not
348cd21ed9 upd drone mst
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-16 16:55:23 +10:00
Simple_Not
5995344e04 upd drone mst
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-16 16:42:37 +10:00
Simple_Not
6b3ae65d73 upd drone dev 2023-11-16 16:42:09 +10:00
Simple_Not
b3dc40fa20 upd dev branche
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-15 22:39:48 +10:00
Simple_Not
03c197aa6f upd dev branche
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-15 22:37:11 +10:00
Simple_Not
6b2b0a6142 upd dev branche
Some checks failed
continuous-integration/drone/push Build is failing
2023-11-15 22:34:55 +10:00
Simple_Not
b858c9db9d upd dev branche
All checks were successful
continuous-integration/drone/push Build is passing
2023-11-15 22:30:31 +10:00
Simple_Not
f37c6aeecd allowed extensions
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-28 23:31:24 +10:00
Simple_Not
d2907b9362 добавлено много файлов, и отсутствие файлов
All checks were successful
continuous-integration/drone/push Build is passing
2023-09-28 14:56:29 +10:00
Simple_Not
85dce5ce2e we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 16:24:50 +10:00
Simple_Not
f482dd03ed we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 16:21:42 +10:00
Simple_Not
75958f9d9a we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 16:20:11 +10:00
Simple_Not
8415845488 we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 16:18:33 +10:00
Simple_Not
5790ea301c we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 01:45:56 +10:00
Simple_Not
7a08ae00cd we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 01:43:33 +10:00
Simple_Not
d646b120d5 we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 01:42:43 +10:00
Simple_Not
2f630ddde0 we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 01:32:57 +10:00
Simple_Not
25a99b4549 we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 01:28:34 +10:00
Simple_Not
5938f4e063 we can send now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-20 01:24:15 +10:00
Simple_Not
8d98c04fa3 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:48:55 +10:00
Simple_Not
67fac37e44 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:36:02 +10:00
Simple_Not
a46cc7c78c we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:30:56 +10:00
Simple_Not
ae638c25db we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:29:35 +10:00
Simple_Not
a08e14367b we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:28:06 +10:00
Simple_Not
75f2d5a08f we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:26:52 +10:00
Simple_Not
0b9f373486 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:24:55 +10:00
Simple_Not
24f294bad1 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:23:02 +10:00
Simple_Not
48ec4c9c59 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:22:07 +10:00
Simple_Not
496ca85240 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:18:59 +10:00
Simple_Not
69442b671e we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:17:47 +10:00
Simple_Not
05370dae8b we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:16:40 +10:00
Simple_Not
694e1dbfcd we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:15:37 +10:00
Simple_Not
fe439b6b1a we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:14:36 +10:00
Simple_Not
7dce872df3 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:13:11 +10:00
Simple_Not
88e2b021f9 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:12:50 +10:00
Simple_Not
ce5f33e604 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:07:42 +10:00
Simple_Not
57e598814f we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:05:40 +10:00
Simple_Not
f49f97a8ea we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:04:55 +10:00
Simple_Not
390974f1a3 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:03:05 +10:00
Simple_Not
089b022a3b we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 01:01:55 +10:00
Simple_Not
c30e2c8705 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:54:27 +10:00
Simple_Not
b391326806 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:53:20 +10:00
Simple_Not
fc5b0d7491 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:50:31 +10:00
Simple_Not
d97035a32b we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:34:30 +10:00
Simple_Not
a622768a13 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:32:18 +10:00
Simple_Not
78a60c6d90 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:29:33 +10:00
Simple_Not
7f94bade46 we can chat now?
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:28:45 +10:00
Simple_Not
586b76bc25 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:21:03 +10:00
Simple_Not
6f37ff03ab check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:19:58 +10:00
Simple_Not
b7f4813ec0 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:18:15 +10:00
Simple_Not
e7fee4999e check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:14:13 +10:00
Simple_Not
1e2d39a5c0 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:02:34 +10:00
Simple_Not
feec65123a check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:01:15 +10:00
Simple_Not
a807114c58 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-19 00:00:22 +10:00
Simple_Not
ed2cf28893 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:59:10 +10:00
Simple_Not
622fa4f50d check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:55:48 +10:00
Simple_Not
ca15046bda check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:54:45 +10:00
Simple_Not
e96ff651cc check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:53:27 +10:00
Simple_Not
f653d1f234 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:53:06 +10:00
Simple_Not
ee869d4693 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:50:48 +10:00
Simple_Not
621dadd47d check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:49:31 +10:00
Simple_Not
03be9453fb check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:48:36 +10:00
Simple_Not
39e16ffdb8 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:47:46 +10:00
Simple_Not
919c860475 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:46:12 +10:00
Simple_Not
54bb686249 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:44:33 +10:00
Simple_Not
22e2062cb1 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:43:22 +10:00
Simple_Not
27be10ee32 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:41:09 +10:00
Simple_Not
c26c016adc check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:39:40 +10:00
Simple_Not
a4ea21dfa6 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:31:26 +10:00
Simple_Not
ed851efd50 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:30:11 +10:00
Simple_Not
410861aa75 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:28:39 +10:00
Simple_Not
5b25dced59 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:27:23 +10:00
Simple_Not
75e07c2118 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:26:41 +10:00
Simple_Not
113bd64b0e check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:26:32 +10:00
Simple_Not
6e9587e074 check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:24:39 +10:00
Simple_Not
421fecce4d check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:23:27 +10:00
Simple_Not
c5a4c8e6ed check many hexes
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 23:22:14 +10:00
Simple_Not
9727bf5c61 Merge branch 'master-of-slaves' of https://git.guaranteedstruggle.host/vdk2ch/flask-htmx-board1 into master-of-slaves
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 20:07:34 +10:00
Simple_Not
94524a326d fix ci 2023-07-18 20:07:12 +10:00
Simple_Not
e5c4ec6730 fix ci
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 20:06:50 +10:00
root
6414aa4410 Merge branch 'master-of-slaves' of https://git.guaranteedstruggle.host/vdk2ch/flask-htmx-board1 into master-of-slaves
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-18 20:01:59 +10:00
Simple_Not
411a973102 remake many certs
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-17 13:00:37 +10:00
Simple_Not
ec8a36b7ed Merge branch 'dev' of https://git.vdk2ch.ru/vdk2ch/flask-htmx-board1 into master-of-slaves 2023-07-17 12:58:23 +10:00
Simple_Not
8b54e30493 remake many certs
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-17 12:58:15 +10:00
Simple_Not
353551b219 remake many certs
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-17 12:56:15 +10:00
Simple_Not
4eb4b28609 rm styles
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-16 02:27:50 +10:00
Simple_Not
758f2abb96 new branch
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-16 02:26:25 +10:00
Simple_Not
4ec4263e08 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:20:33 +10:00
Simple_Not
a4c1a4cb7b check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:19:50 +10:00
Simple_Not
d83ccb48ec check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:19:01 +10:00
Simple_Not
d4bcfa7b8f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:16:32 +10:00
Simple_Not
db9279ea2a check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:16:05 +10:00
Simple_Not
f0ff983fc8 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:14:27 +10:00
Simple_Not
132028c649 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 13:13:21 +10:00
Simple_Not
e11888c930 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 12:45:46 +10:00
Simple_Not
79196c3c9f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 12:39:28 +10:00
Simple_Not
382e50391c check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 12:38:22 +10:00
Simple_Not
25725646cb check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 12:34:27 +10:00
Simple_Not
f670bc9b2c check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 12:31:18 +10:00
Simple_Not
f9c55713d4 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 12:29:19 +10:00
Simple_Not
eee63ed855 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:14:08 +10:00
Simple_Not
dfa38a20d3 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:13:10 +10:00
Simple_Not
7c4c3b4d25 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:12:10 +10:00
Simple_Not
0378e7e484 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:10:40 +10:00
Simple_Not
ad75b536f1 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:09:52 +10:00
Simple_Not
7c026e82bf check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:09:01 +10:00
Simple_Not
8e0ddee465 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:08:51 +10:00
Simple_Not
fd5cb4140a check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:06:24 +10:00
Simple_Not
4eb7bd8a50 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:05:33 +10:00
Simple_Not
ed9260ca66 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 02:04:38 +10:00
Simple_Not
b824370a43 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 01:52:36 +10:00
Simple_Not
39aa0a9687 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 01:52:00 +10:00
Simple_Not
bda72fc32d check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 01:43:56 +10:00
Simple_Not
6d9caa78f2 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 01:40:19 +10:00
Simple_Not
6add3fe85d check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 01:35:31 +10:00
Simple_Not
1d5369d73a check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-14 01:32:56 +10:00
Simple_Not
10b0643899 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 22:06:10 +10:00
Simple_Not
9492835187 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 22:03:03 +10:00
Simple_Not
12cfadab19 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 22:02:19 +10:00
Simple_Not
ec724d0c18 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 22:01:47 +10:00
Simple_Not
4024f8f032 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:56:36 +10:00
Simple_Not
1173482a57 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:45:11 +10:00
Simple_Not
8739ad9313 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:34:56 +10:00
Simple_Not
9b7fae2a62 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:34:06 +10:00
Simple_Not
5e9d093589 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:32:36 +10:00
Simple_Not
216a35734c check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:31:16 +10:00
Simple_Not
7e01cf90b5 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:27:39 +10:00
Simple_Not
3361533b62 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:26:04 +10:00
Simple_Not
9488d197dc check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:05:09 +10:00
Simple_Not
8aa2d0b0bf check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:03:33 +10:00
Simple_Not
012f55c18d check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:02:51 +10:00
Simple_Not
98388b2021 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 21:01:57 +10:00
Simple_Not
697d2f5703 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:54:44 +10:00
Simple_Not
694c0bc1a9 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:51:33 +10:00
Simple_Not
bf8581a560 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:50:19 +10:00
Simple_Not
be8202d2b0 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:48:47 +10:00
Simple_Not
7510c10e9f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:48:10 +10:00
Simple_Not
34bb443b0d check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:47:10 +10:00
Simple_Not
8c8fab8147 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:45:52 +10:00
Simple_Not
463d539ea4 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:45:23 +10:00
Simple_Not
c923785016 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:44:32 +10:00
Simple_Not
a2c552df47 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:42:35 +10:00
Simple_Not
329614ed3f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:41:22 +10:00
Simple_Not
33c7a8e59f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:38:48 +10:00
Simple_Not
f027a04c0f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:38:08 +10:00
Simple_Not
295381937c check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:36:52 +10:00
Simple_Not
2876a00bed check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:35:37 +10:00
Simple_Not
1222913234 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:35:11 +10:00
Simple_Not
8fde2c68ee check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:33:47 +10:00
Simple_Not
faf6296efd check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:33:42 +10:00
Simple_Not
c94424d110 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:32:42 +10:00
Simple_Not
fb336375c6 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:31:23 +10:00
Simple_Not
52769de237 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:29:29 +10:00
Simple_Not
da1a38971a check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:28:21 +10:00
Simple_Not
c9d0424926 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:27:31 +10:00
Simple_Not
9ad17b25d4 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:26:14 +10:00
Simple_Not
e7955b9585 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:23:59 +10:00
Simple_Not
11f1cada7e check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:23:27 +10:00
Simple_Not
1fef23b5a4 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:23:01 +10:00
Simple_Not
74233dd498 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:21:17 +10:00
Simple_Not
f3a0c82ef5 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:20:34 +10:00
Simple_Not
17d84638e3 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:19:57 +10:00
Simple_Not
7b1e40820f check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:18:12 +10:00
Simple_Not
3e935e4d1b check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:13:33 +10:00
Simple_Not
270b3f562b check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:12:11 +10:00
Simple_Not
e7e34ff9f6 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:09:26 +10:00
Simple_Not
f064c0aedd check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 20:03:01 +10:00
Simple_Not
974e1f52d6 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 19:59:56 +10:00
Simple_Not
b92b5c63b1 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 19:57:40 +10:00
Simple_Not
f1d5ef70ad check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 19:56:43 +10:00
Simple_Not
6094f277b5 check posts
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 19:50:45 +10:00
Simple_Not
a57a964c60 fix
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 15:12:58 +10:00
Simple_Not
9847f24432 fix bd
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 15:02:52 +10:00
Simple_Not
6c4235bed1 now we counting
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-13 01:05:54 +10:00
Simple_Not
0118b859d1 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:26:01 +10:00
Simple_Not
b69f359af9 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:24:36 +10:00
Simple_Not
74cf65b299 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:20:03 +10:00
Simple_Not
578e3eae3d annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:18:00 +10:00
Simple_Not
62c27f9729 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:17:01 +10:00
Simple_Not
742f32b5c5 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:16:34 +10:00
Simple_Not
d354cb1ab2 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:15:09 +10:00
Simple_Not
04ca092bae annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:14:07 +10:00
Simple_Not
b6b9e2426d annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:12:48 +10:00
Simple_Not
6fbb7b035c annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:10:59 +10:00
Simple_Not
52b73d89dc annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:10:22 +10:00
Simple_Not
685a53ffee annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:09:26 +10:00
Simple_Not
7579471b77 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:06:58 +10:00
Simple_Not
2b817b96c6 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:05:47 +10:00
Simple_Not
0ce9283cc7 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:04:44 +10:00
Simple_Not
8cdcab76d5 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:03:39 +10:00
Simple_Not
ddfb8f217a annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:02:56 +10:00
Simple_Not
4e583b6507 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:01:46 +10:00
Simple_Not
375994a607 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 02:00:29 +10:00
Simple_Not
3d13563437 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:59:04 +10:00
Simple_Not
88e1b7afdd annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:57:15 +10:00
Simple_Not
55f0db1a33 annother hexxo
Some checks failed
continuous-integration/drone/push Build is failing
2023-07-12 01:56:16 +10:00
Simple_Not
16a249c9d4 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:53:31 +10:00
Simple_Not
66cc98ecfc annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:50:29 +10:00
Simple_Not
1cde8d0d02 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:45:44 +10:00
Simple_Not
3adcc12242 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:45:29 +10:00
Simple_Not
1016d11ae2 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:43:59 +10:00
Simple_Not
38d9e1443f annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:39:13 +10:00
Simple_Not
77b3520b12 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:36:34 +10:00
Simple_Not
f952ef97c6 annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:31:15 +10:00
Simple_Not
22d5932d8d annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:30:05 +10:00
Simple_Not
e18923fe3a annother hexxo
All checks were successful
continuous-integration/drone/push Build is passing
2023-07-12 01:23:49 +10:00
29 changed files with 778 additions and 7394 deletions

View File

@@ -15,42 +15,93 @@ steps:
- name: pull into the folduh - name: pull into the folduh
commands: commands:
- cd /usr/share/repos/$DRONE_REPO_NAME - cd /usr/share/repos/$DRONE_REPO_NAME
- git checkout $DRONE_COMMIT_BRANCH
- git pull origin $DRONE_COMMIT_BRANCH - git pull origin $DRONE_COMMIT_BRANCH
- name: build # - name: build
environment: # environment:
DOCKER_TLS_VERIFY: 1 # DOCKER_TLS_VERIFY: 1
DOCKER_HOST: "tcp://192.168.49.2:2376" # DOCKER_HOST: "tcp://192.168.49.2:2376"
DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs" # DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs"
MINIKUBE_ACTIVE_DOCKERD: "minikube" # MINIKUBE_ACTIVE_DOCKERD: "minikube"
# commands:
# - cd /usr/share/repos/$DRONE_REPO_NAME
# - git checkout $DRONE_COMMIT_BRANCH
# - docker build . -t ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)"
# - docker tag ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" ${DRONE_REPO_NAME}:latest
# - docker tag ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}
- name: build to harbor
commands: commands:
- cd /usr/share/repos/$DRONE_REPO_NAME - cd /usr/share/repos/$DRONE_REPO_NAME
- git checkout $DRONE_COMMIT_BRANCH - git checkout $DRONE_COMMIT_BRANCH
- docker build . -t ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" #- docker build . -t ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)"
- docker tag ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" ${DRONE_REPO_NAME}:latest #- docker tag ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" harbor.guaranteedstruggle.host/library/${DRONE_REPO_NAME}:latest
- docker tag ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH} #- docker tag ${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}-"$(git rev-parse --short HEAD)" harbor.guaranteedstruggle.host/library/${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}
- docker build . -t harbor.guaranteedstruggle.host/library/${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}
- docker login harbor.guaranteedstruggle.host -u 'robot$drono' -p valgBwMgcB86azvmuezTOC3omjXZ1NZe
- docker push harbor.guaranteedstruggle.host/library/${DRONE_REPO_NAME}:${DRONE_COMMIT_BRANCH}
- name: restart deployment master - name: restart deployment master
environment: environment:
DOCKER_TLS_VERIFY: 1 KUBECONFIG: /etc/kubernetes/admin.conf
DOCKER_HOST: "tcp://192.168.49.2:2376"
DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs"
MINIKUBE_ACTIVE_DOCKERD: "minikube"
commands: commands:
- su - hogweed1 -c "minikube kubectl -- rollout restart -n vdk2ch deployment flask-htmx-master" - kubectl rollout restart -n vdk2ch deployment flask-htmx-master
when: when:
branch: branch:
- master-of-slaves - master-of-slaves
- name: restart deployment dev - name: restart deployment dev
environment: environment:
DOCKER_TLS_VERIFY: 1 KUBECONFIG: /etc/kubernetes/admin.conf
DOCKER_HOST: "tcp://192.168.49.2:2376"
DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs"
MINIKUBE_ACTIVE_DOCKERD: "minikube"
commands: commands:
- su - hogweed1 -c "minikube kubectl -- rollout restart -n vdk2ch deployment flask-htmx-dev" - kubectl rollout restart -n vdk2ch deployment flask-htmx-dev
when: when:
branch: branch:
- dev - dev
- name: restart deployment our-style
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
commands:
- kubectl rollout restart -n vdk2ch deployment flask-htmx-our-style
when:
branch:
- our-style
# - name: restart deployment master
# environment:
# DOCKER_TLS_VERIFY: 1
# DOCKER_HOST: "tcp://192.168.49.2:2376"
# DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs"
# MINIKUBE_ACTIVE_DOCKERD: "minikube"
# commands:
# - su - hogweed1 -c "minikube kubectl -- rollout restart -n vdk2ch deployment flask-htmx-master"
# when:
# branch:
# - master-of-slaves
# - name: restart deployment dev
# environment:
# DOCKER_TLS_VERIFY: 1
# DOCKER_HOST: "tcp://192.168.49.2:2376"
# DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs"
# MINIKUBE_ACTIVE_DOCKERD: "minikube"
# commands:
# - su - hogweed1 -c "minikube kubectl -- rollout restart -n vdk2ch deployment flask-htmx-dev"
# when:
# branch:
# - dev
# - name: restart deployment our-style
# environment:
# DOCKER_TLS_VERIFY: 1
# DOCKER_HOST: "tcp://192.168.49.2:2376"
# DOCKER_CERT_PATH: "/home/hogweed1/.minikube/certs"
# MINIKUBE_ACTIVE_DOCKERD: "minikube"
# commands:
# - su - hogweed1 -c "minikube kubectl -- rollout restart -n vdk2ch deployment flask-htmx-our-style"
# when:
# branch:
# - our-style

View File

@@ -2,13 +2,13 @@
FROM python:3.11-alpine FROM python:3.11-alpine
# copy the requirements file into the image # copy the requirements file into the image
COPY ./reqs.txt /app/reqs.txt COPY ./reqs.txt /app/reqs0.txt
# switch working directory # switch working directory
WORKDIR /app WORKDIR /app
# install the dependencies and packages in the requirements file # install the dependencies and packages in the requirements file
RUN pip install -r reqs.txt RUN pip install -r reqs0.txt
# copy every content from the local file to the image # copy every content from the local file to the image
COPY . /app COPY . /app

View File

@@ -212,4 +212,5 @@ stateDiagram-v2
Grafana --> dash_join Grafana --> dash_join
dash_join --> User : дашборды dash_join --> User : дашборды
``` ```

271
app.py
View File

@@ -1,11 +1,12 @@
from flask import Flask, render_template, request from flask import Flask, render_template, request, jsonify, make_response
from flask_assets import Bundle, Environment
from todo import todos from flask_assets import Bundle, Environment
from boards import board_list from arango import ArangoClient
from threads import threads_lists from minio import Minio
from threads_with_posts import open_threads
import socket, os
import socket
app = Flask(__name__) app = Flask(__name__)
@@ -14,15 +15,33 @@ assets = Environment(app)
css = Bundle("src/*.css", output="dist/main.css") css = Bundle("src/*.css", output="dist/main.css")
# https://unpkg.com/htmx.org # https://unpkg.com/htmx.org
js = Bundle("src/*.js", output="dist/main.js") #js = Bundle("src/*.js", output="dist/main.js")
assets.register("css", css) assets.register("css", css)
assets.register("js", js) #assets.register("js", js)
css.build() css.build()
js.build() #js.build()
docker_short_id = socket.gethostname()
arango_client = ArangoClient(hosts='https://arango.guaranteedstruggle.host')
db = arango_client.db('board1', username='root', password='123-very-unsafe-way-to-protect-yourself321')
# предполагается что меняться список будет весьма редко, поэтому подхватываем при лишь при перезапуске
# # boards0 = db.collection('boards')
# # print(boards0)
# # board_list = [ k['_key'] for k in boards0]
@app.route("/get_my_ip")
def get_my_ip():
return jsonify({'ip': request.remote_addr,
'real-ip': request.environ.get('HTTP_X_REAL_IP', request.remote_addr)}), 200
@app.route('/liveness') @app.route('/liveness')
def healthx(): def healthx():
@@ -30,45 +49,231 @@ def healthx():
@app.route('/readiness') @app.route('/readiness')
def healthz(): def healthz():
#### TODU return arango check
return "<h1><center>Readiness check completed</center><h1>" return "<h1><center>Readiness check completed</center><h1>"
@app.route("/") @app.route("/")
def homepage(): def homepage():
docker_short_id = socket.gethostname() boards0 = db.collection('boards')
board_list = [ k['_key'] for k in boards0]
return render_template("main-page.html", host_id=docker_short_id, boards=board_list) return render_template("main-page.html", host_id=docker_short_id, boards=board_list)
### stolen #### TODO если борды нет, то возвращать 404 мемную
@app.route("/boards/<board_id>") #### TODO если треда нет, то возвращать 404 мемную
def page_board(board_id):
b_threads = [ open_threads[thread_id] for thread_id in open_threads if thread_id in threads_lists[board_id]]
return render_template("board.html", board_id=board_id, boards=board_list, board_threads=b_threads)
### stolen #### DONE route :: /{board}/
@app.route("/todo") @app.route('/<board>')
def page_todo(): def board_posts(board=None):
return render_template("page1.html") postos = db.collection('posts')
postos = [ p for p in postos if p.get('root_post') == True and p.get('board') == board ]
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
boards0 = db.collection('boards')
board_list = [ k['_key'] for k in boards0]
return render_template("board-posts.html", host_id=docker_short_id, postos=postos, board=board, target_post_id=None, boards=board_list)
#### TODO route :: /{board}/{thread}/
#### TODO убрать отсюда чужие рут-потсы
@app.route("/<board>/<int:target_post_id>")
def thread_posts(board=None, target_post_id=None):
## взять рут-пост
## взять всех его детей
# postos = db.collection('posts')
# postos = [ p for p in postos]
# postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
cursor = db.aql.execute(
f"""FOR ppp IN posts
FILTER ppp.root_post == True and ppp._key == "{target_post_id}"
FOR v IN 1..9999 OUTBOUND ppp post_parents RETURN v"""
)
postos = [ ]
while not cursor.empty(): # Pop until nothing is left on the cursor.
postos.append(cursor.pop())
cursor = db.aql.execute(
f'RETURN DOCUMENT("posts/{target_post_id}")'
)
while not cursor.empty(): # Pop until nothing is left on the cursor.
postos.append(cursor.pop())
postos = [ p for p in postos ]
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
if not target_post_id:
target_post_id = postos[0]['_key']
boards0 = db.collection('boards')
board_list = [ k['_key'] for k in boards0]
return render_template("interactive-posts.html", board=board, host_id=docker_short_id, postos=postos, target_post_id=target_post_id, boards=board_list)
#### TODO route :: /{board}/create_thread/{target_post_id}
@app.route("/<board>/create-thread/<target_post_id>", methods=['POST'])
def create_thread(board=None, target_post_id=None):
postos = db.collection('posts')
data = request.form['send_this_text']
metadata = postos.insert({
'texto': data,
"root_post": True,
'board': board,
'images': [],
"children_num": 0,
"answers_num": 0,
"answers_list": [ [], [], [] ]
}, overwrite_mode='update')
response = make_response()
response.headers["HX-Redirect"] = f"/{board}/{metadata['_key']}"
response.status_code = 200
return response
#### TODO route :: /{board}/{thread}/answer_post/
#### TODO route :: /{board}/{thread}/post_to_another_post/
# @app.route('/db_posts')
# @app.route("/db_posts/<target_post_id>")
# def page_posts_from_db(target_post_id=None):
# postos = db.collection('posts')
# postos = [ p for p in postos]
# postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
# for p in postos:
# #if p['root_post']:
# print(p)
# if not target_post_id:
# target_post_id = postos[0]['_key']
# return render_template("interactive-posts.html", host_id=docker_short_id, postos=postos, target_post_id=target_post_id)
@app.route("/search", methods=["POST"]) @app.route("/<board>/answer_post/<target_post_id>", methods=['POST'])
def search_todo(): def answer_post(board, target_post_id):
search_term = request.form.get("search")
postos = db.collection('posts')
postos = [ p for p in postos ]
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
## ?? wut
if not target_post_id:
target_post_id = postos[0]['_key']
if not len(search_term): return render_template("answer-post.html", board=board, target_post_id=target_post_id)
return render_template("todo.html", todos=[])
res_todos = []
for todo in todos:
if search_term in todo["title"]:
res_todos.append(todo)
return render_template("todo.html", todos=res_todos) ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'mp4', 'webm', 'webp'}
### /stolen def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/<board>/post_to_another_post/<post_key>', methods=['POST'])
def post_to_post(board, post_key):
#### TODO resize pics https://stackoverflow.com/questions/53337318/how-can-i-resize-image-with-pil-on-upload-and-serve-them-with-flask-cloudy
#### TODO allow only imgs, videos, and gifs
if 'file' in request.files:
minioClient = Minio( "static.guaranteedstruggle.host" )
bucket_name = "thread-pics"
files = request.files.getlist("file")
for file in files:
size = os.fstat(file.fileno()).st_size
#### работает ли??
if allowed_file(file.filename):
minioClient.put_object(
bucket_name, file.filename, file, size
)
else:
print(f'somebody tried to put this inside minio: {file.filename} size: {size}')
postos = db.collection('posts')
data = request.form['send_this_text']
cursor = db.aql.execute(
f'RETURN DOCUMENT("posts/{post_key}")'
)
p = cursor.pop()
if p.get('root_post') == True:
thread = p.get('_key')
elif not p.get('root_post'):
thread = p.get('thread')
else:
thread = 'ERROR'
print(p)
metadata = postos.insert({
'texto': data,
'parent_post': f'{post_key}',
'images': [],
"thread": thread
}, overwrite_mode='update')
metadata = db.collection('post_parents').insert({
'_from': f'posts/{post_key}',
'_to': f'posts/{metadata["_key"]}'
}, overwrite_mode='update')
#### TODO оптимайз для только тредовых штук
cursor = db.aql.execute(
"""FOR ppp IN posts
LET children = (FOR v IN 1..9999 OUTBOUND ppp post_parents RETURN v)
UPDATE ppp WITH { children_num : COUNT_DISTINCT( children[*]._key ) } IN posts"""
)
cursor = db.aql.execute(
"""FOR ppp IN posts
LET children = (FOR v IN 1 OUTBOUND ppp post_parents RETURN v)
UPDATE ppp WITH { answers_num : COUNT_DISTINCT( children[*]._key ) } IN posts"""
)
cursor = db.aql.execute(
"""FOR ppp IN posts
LET children0 = (FOR v IN 1 OUTBOUND ppp post_parents RETURN v)
LET children = (FOR c IN children0
SORT c._key DESC
RETURN c)
UPDATE ppp WITH { answers_list : [ children[*]._key, children[*].answers_num, children[*].children_num ] } IN posts"""
)
postos = db.collection('posts')
postos = [ p for p in postos if (not p.get('root_post')) and p.get('thread') == thread ]
cursor = db.aql.execute(
f'RETURN DOCUMENT("posts/{thread}")'
)
postos.append(cursor.pop())
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
return render_template("i-posts.html", board=board, host_id=docker_short_id, postos=postos)
#### TODO websockets
#### TODO sse
#### TODO kafka
#### TODO shards
#### TODO grpc

View File

@@ -1,3 +0,0 @@
board_list = [
'b','a','d'
]

View File

@@ -1,2 +1,4 @@
flask flask
flask-assets flask-assets
python-arango
minio

41
static/dist/main.css vendored Normal file
View File

@@ -0,0 +1,41 @@
/* украдено здесь https://css-tricks.com/hexagons-and-beyond-flexible-responsive-grid-patterns-sans-media-queries/ */
.hex-main {
display:flex;
--s: 100px; /* size */
--m: 4px; /* margin */
--f: calc(1.732 * var(--s) + 4 * var(--m) - 1px);
max-width: 440px;
margin: 15px;
}
.hex-container {
font-size: 0; /*disable white space between inline block element */
}
.hex-container img {
width: var(--s);
margin: var(--m);
height: calc(var(--s)*1.1547);
display: inline-block;
font-size:initial;
clip-path: polygon(0% 25%, 0% 75%, 50% 100%, 100% 75%, 100% 25%, 50% 0%);
background: transparent;
margin-bottom: calc(var(--m) - var(--s)*0.2885);
}
.hex-container img:nth-child(odd) {
background: transparent;
}
.hex-container::before {
content: "";
width: calc(var(--s)/2 + var(--m));
float: left;
height: 120%;
shape-outside: repeating-linear-gradient(
#0000 0 calc(var(--f) - 3px),
#000 0 var(--f));
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,41 @@
/* украдено здесь https://css-tricks.com/hexagons-and-beyond-flexible-responsive-grid-patterns-sans-media-queries/ */
.hex-main {
display:flex;
--s: 100px; /* size */
--m: 4px; /* margin */
--f: calc(1.732 * var(--s) + 4 * var(--m) - 1px);
max-width: 440px;
margin: 15px;
}
.hex-container {
font-size: 0; /*disable white space between inline block element */
}
.hex-container img {
width: var(--s);
margin: var(--m);
height: calc(var(--s)*1.1547);
display: inline-block;
font-size:initial;
clip-path: polygon(0% 25%, 0% 75%, 50% 100%, 100% 75%, 100% 25%, 50% 0%);
background: transparent;
margin-bottom: calc(var(--m) - var(--s)*0.2885);
}
.hex-container img:nth-child(odd) {
background: transparent;
}
.hex-container::before {
content: "";
width: calc(var(--s)/2 + var(--m));
float: left;
height: 120%;
shape-outside: repeating-linear-gradient(
#0000 0 calc(var(--f) - 3px),
#000 0 var(--f));
}

View File

@@ -0,0 +1,69 @@
<div class="card">
<form
hx-encoding='multipart/form-data'
_='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'
hx-on::after-request="this.reset()"
>
<div class="card-content">
<div class="row">
<span class="card-title">Ты отвечаешь: <a href="#post-{{ target_post_id }}">>>{{ target_post_id }}</a></span>
</div>
<div class="row">
<a class="btn-floating halfway-fab waves-effect waves-light red" href="#post-{{ target_post_id }}"><i class="material-icons">>>{{ target_post_id }}</i></a>
</div>
<div class="row">
<div class="input-field col s6">
<input id="send_this_text" name="send_this_text" type="text" >
<label for="send_this_text">Печатать сюда</label>
</div>
</div>
<div class="row">
<div class="input-field col s6">
<div class="file-field input-field">
<div class="btn">
<span>File</span>
<input id="file" name="file" type="file" multiple>
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text" placeholder="Upload one or more files">
<progress id='progress' value='0' max='100'></progress>
</div>
<!-- <div class="file-progress">
</div> -->
</div>
</div>
</div>
</div>
<div class="card-action">
<a href="#answer-post">
<button class="btn waves-effect waves-light"
type="submit" name="action" hx-encoding='multipart/form-data'
_='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'
hx-post="/{{board}}/post_to_another_post/{{ target_post_id }}"
hx-target="#neu-posts"
hx-include="[name='send_this_text'], [name='file']"
>
Отправить!!
<i class="material-icons right">send</i>
</button>
</a>
</div>
</form>
<!-- <div class="row">
<form hx-encoding='multipart/form-data' hx-post='/send_dudes'
_='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'>
<input type='file' name='file'>
<button>
Upload
</button>
<progress id='progress' value='0' max='100'></progress>
</form>
</div> -->
<!-- <h1>Загрузить картинку:</h1>
<input type="file" #file placeholder="Загрузить картинку" (change)="sendPic($event)" style="display:none;">
<button type="button" class="btn btn-success" (click)="file.click()">Загрузить картинку</button>
<div *ngFor="let singlePic of inputImages" >Картинка: {{singlePic}}</div>
<p>
<button (click)="eraseData()" >Убрать картинку</button>
</p> -->
</div>

View File

@@ -5,7 +5,15 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/purecss@3.0.0/build/pure-min.css" integrity="sha384-X38yfunGUhNzHpBaEBsWLO+A0HDYOQi8ufWDkZ0k9e0eXz/tH3II7uKZ9msv++Ls" crossorigin="anonymous"> <!-- Compiled and minified CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<!-- Compiled and minified JavaScript -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<script src="https://unpkg.com/htmx.org@1.9.3" integrity="sha384-lVb3Rd/Ca0AxaoZg5sACe8FJKF0tnUgR2Kd7ehUOG5GCcROv5uBIZsOqovBAcWua" crossorigin="anonymous"></script>
<script src="https://unpkg.com/hyperscript.org@0.9.9"></script>
{% assets 'css' %} {% assets 'css' %}
<link rel="stylesheet" href="{{ ASSET_URL }}"> <link rel="stylesheet" href="{{ ASSET_URL }}">
{% endassets %} {% endassets %}
@@ -18,7 +26,29 @@
<title>Board++</title> <title>Board++</title>
</head> </head>
<body class="bg-blue-100"> <body class="bg-blue-100">
<div id="multi-bg">
{% block content %} {% block content %}
{% endblock content %} {% endblock content %}
</div>
<style>
#multi-bg{
background-size: 100% 100%;
height: 100%;
background-repeat: repeat-y;
background-attachment: fixed;
/* height: 1080px;
background-position: bottom center, 50%, 50%;
*/
display: block;
background-color: #808;
background-image:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900'%3E%3Cpolygon fill='%23cc3f47' points='957 450 539 900 1396 900'/%3E%3Cpolygon fill='%23b3373e' points='957 450 872.9 900 1396 900'/%3E%3Cpolygon fill='%23c8364e' points='-60 900 398 662 816 900'/%3E%3Cpolygon fill='%23b02f44' points='337 900 398 662 816 900'/%3E%3Cpolygon fill='%23c22f55' points='1203 546 1552 900 876 900'/%3E%3Cpolygon fill='%23ab294b' points='1203 546 1552 900 1162 900'/%3E%3Cpolygon fill='%23bb285c' points='641 695 886 900 367 900'/%3E%3Cpolygon fill='%23a52351' points='587 900 641 695 886 900'/%3E%3Cpolygon fill='%23b32362' points='1710 900 1401 632 1096 900'/%3E%3Cpolygon fill='%239f1f57' points='1710 900 1401 632 1365 900'/%3E%3Cpolygon fill='%23aa2068' points='1210 900 971 687 725 900'/%3E%3Cpolygon fill='%23971c5d' points='943 900 1210 900 971 687'/%3E%3C/svg%3E"),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='200' viewBox='0 0 160 80'%3E%3Cg fill='%23FFF' fill-opacity='0.2'%3E%3Cpolygon points='0 10 0 0 10 0'/%3E%3Cpolygon points='0 40 0 30 10 30'/%3E%3Cpolygon points='0 30 0 20 10 20'/%3E%3Cpolygon points='0 70 0 60 10 60'/%3E%3Cpolygon points='0 80 0 70 10 70'/%3E%3Cpolygon points='50 80 50 70 60 70'/%3E%3Cpolygon points='10 20 10 10 20 10'/%3E%3Cpolygon points='10 40 10 30 20 30'/%3E%3Cpolygon points='20 10 20 0 30 0'/%3E%3Cpolygon points='10 10 10 0 20 0'/%3E%3Cpolygon points='30 20 30 10 40 10'/%3E%3Cpolygon points='20 20 20 40 40 20'/%3E%3Cpolygon points='40 10 40 0 50 0'/%3E%3Cpolygon points='40 20 40 10 50 10'/%3E%3Cpolygon points='40 40 40 30 50 30'/%3E%3Cpolygon points='30 40 30 30 40 30'/%3E%3Cpolygon points='40 60 40 50 50 50'/%3E%3Cpolygon points='50 30 50 20 60 20'/%3E%3Cpolygon points='40 60 40 80 60 60'/%3E%3Cpolygon points='50 40 50 60 70 40'/%3E%3Cpolygon points='60 0 60 20 80 0'/%3E%3Cpolygon points='70 30 70 20 80 20'/%3E%3Cpolygon points='70 40 70 30 80 30'/%3E%3Cpolygon points='60 60 60 80 80 60'/%3E%3Cpolygon points='80 10 80 0 90 0'/%3E%3Cpolygon points='70 40 70 60 90 40'/%3E%3Cpolygon points='80 60 80 50 90 50'/%3E%3Cpolygon points='60 30 60 20 70 20'/%3E%3Cpolygon points='80 70 80 80 90 80 100 70'/%3E%3Cpolygon points='80 10 80 40 110 10'/%3E%3Cpolygon points='110 40 110 30 120 30'/%3E%3Cpolygon points='90 40 90 70 120 40'/%3E%3Cpolygon points='10 50 10 80 40 50'/%3E%3Cpolygon points='110 60 110 50 120 50'/%3E%3Cpolygon points='100 60 100 80 120 60'/%3E%3Cpolygon points='110 0 110 20 130 0'/%3E%3Cpolygon points='120 30 120 20 130 20'/%3E%3Cpolygon points='130 10 130 0 140 0'/%3E%3Cpolygon points='130 30 130 20 140 20'/%3E%3Cpolygon points='120 40 120 30 130 30'/%3E%3Cpolygon points='130 50 130 40 140 40'/%3E%3Cpolygon points='120 50 120 70 140 50'/%3E%3Cpolygon points='110 70 110 80 130 80 140 70'/%3E%3Cpolygon points='140 10 140 0 150 0'/%3E%3Cpolygon points='140 20 140 10 150 10'/%3E%3Cpolygon points='140 40 140 30 150 30'/%3E%3Cpolygon points='140 50 140 40 150 40'/%3E%3Cpolygon points='140 70 140 60 150 60'/%3E%3Cpolygon points='150 20 150 40 160 30 160 20'/%3E%3Cpolygon points='150 60 150 50 160 50'/%3E%3Cpolygon points='140 70 140 80 150 80 160 70'/%3E%3C/g%3E%3C/svg%3E"),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpolygon fill='%23740074' points='1600 160 0 460 0 350 1600 50'/%3E%3Cpolygon fill='%235f005f' points='1600 260 0 560 0 450 1600 150'/%3E%3Cpolygon fill='%234b004b' points='1600 360 0 660 0 550 1600 250'/%3E%3Cpolygon fill='%23360036' points='1600 460 0 760 0 650 1600 350'/%3E%3Cpolygon fill='%23220022' points='1600 800 0 800 0 750 1600 450'/%3E%3C/g%3E%3C/svg%3E");
background-size: cover;
}
</style>
</body> </body>
</html> </html>

View File

@@ -0,0 +1,23 @@
{% extends "base.html" %}
{% block content %}
{% include 'navbar.html' %}
<div class="row" >
{% include 'create-thread.html' %}
</div>
<div class="row" >
<div class="col s6 m5" id="op-posts">
{% include 'op-posts.html' %}
</div>
<!-- <div class="col s6 m5" id="thread-viz">
<iframe src="https://thread-visualizah-dev.board.vdk2ch.ru/" scrolling="no" frameborder="0" style="position: relative; height: 600px; width: 100%; margin:10px;"></iframe>
</div> -->
</div>
{% endblock content %}

View File

@@ -1,66 +0,0 @@
{% extends "base.html" %}
{% block content %}
<div class="content">
<p>Вы тут: /{{board_id}}</p>
</div>
<nav>
<a href="/">glavnaya</a>
<br>
Доски:
<div class="boards">
<ul>
{% for board in boards %}
<li><a href="/boards/{{board}}">/{{board}}</a></li>
{% endfor %}
</ul>
</div>
</nav>
<!--
<table class="pure-table-odd">
<thead>
<tr>
<th class="">пикча эта ваша</th>
<th class="">номер треда</th>
<th class="">номер поста</th>
<th class="">автор(ка)</th>
<th class="">текст</th>
</tr>
</thead>
<tbody id="thread-results">
{% for thread in board_threads %}
<tr class="">
<td class="">
<a href="https://static.vdk2ch.ru/thread-pics/{{thread.pic_links}}" target=”_blank”>
<svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="img-{{thread.post_num}}" patternUnits="userSpaceOnUse" width="100" height="100">
<image xlink:href="https://static.vdk2ch.ru/thread-pics/{{thread.pic_links}}" x="-25" width="150" height="100" />
</pattern>
</defs>
<polygon points="50 1 95 25 95 75 50 99 5 75 5 25" fill="url(#img-{{thread.post_num}})"/>
</svg>
</a>
<img src="https://static.vdk2ch.ru/thread-pics/{{thread.pic_links}}" alt="" width="200" height="200">
</td>
<td class="">{{thread.thread_num}}</td>
<td class="">{{thread.post_num}}</td>
<td class="">{{thread.name}}</td>
<td class="">{{thread.txt}}</td>
</tr>
{% endfor %}
</tbody>
</table>
-->
<li>
{% include 'posts.html' %}
{% endblock content %}

View File

@@ -0,0 +1,48 @@
<div class="card">
<form
hx-encoding='multipart/form-data'
_='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'
hx-on::after-request="this.reset()"
>
<div class="card-content">
<div class="row">
<span class="card-title">Создавай тред уже!</span>
</div>
<div class="row">
<div class="input-field col s6">
<input id="send_this_text" name="send_this_text" type="text" >
<label for="send_this_text">Печатать сюда</label>
</div>
</div>
<div class="row">
<div class="input-field col s6">
<div class="file-field input-field">
<div class="btn">
<span>File</span>
<input id="file" name="file" type="file" multiple>
</div>
<div class="file-path-wrapper">
<input class="file-path validate" type="text" placeholder="Upload one or more files">
<progress id='progress' value='0' max='100'></progress>
</div>
<!-- <div class="file-progress">
</div> -->
</div>
</div>
</div>
</div>
<div class="card-action">
<a href="/{{board}}/create-thread/{{ target_post_id }}">
<button class="btn waves-effect waves-light"
type="submit" name="action" hx-encoding='multipart/form-data'
_='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'
hx-post="/{{board}}/create-thread/{{ target_post_id }}"
hx-include="[name='send_this_text'], [name='file']"
>
Отправить!!
<i class="material-icons right">send</i>
</button>
</a>
</div>
</form>
</div>

96
templates/i-posts.html Normal file
View File

@@ -0,0 +1,96 @@
{% if postos | length > 0 %}
{% for posto in postos %}
<div class="row">
{% if posto.root_post %}
<div class="card s5 deep-orange accent-4 darken-1">
{% else %}
<div class="card s5 blue-grey darken-1">
{% endif %}
<div class="card-content white-text">
<span class="new badge yellow" data-badge-caption="">
<a class="purple-text" href="#post-{{ posto._key }}"> #{{ posto._key }} </a>
</span>
<span class="new badge blue" data-badge-caption="">Ответов: {{ posto.answers_num }}</span>
<span class="new badge red" data-badge-caption="">Длина треда: {{ posto.children_num }}</span>
</div>
<div class="row" id="post-{{ posto._key }}">
{% if posto.images | length > 0 %}
<div class="col s12">
<!-- <div class="hex-main">
<div class="hex-container">
<a href="https://loremflickr.com/g/320/240/paris" target="_blank" ">
<img src="https://loremflickr.com/g/320/240/paris">
</a>
</div>
</div> -->
<div class="nav-wrapper">
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li>
<a href="https://static.guaranteedstruggle.host/thread-pics/photo_2023-05-16_00-49-34.jpg" target="_blank" ">
<img src="https://static.guaranteedstruggle.host/thread-pics/photo_2023-05-16_00-49-34.jpg" width="300px">
</a>
<span class=" "><a class="" href="https://static.guaranteedstruggle.host/thread-pics/photo_2023-05-16_00-49-34.jpg" target="_blank"> photo_2023-05-16_00-49-34.jpg </a> </span>
</li>
<li>
<a href="https://static.guaranteedstruggle.host/thread-pics/109.png" target="_blank" ">
<img src="https://static.guaranteedstruggle.host/thread-pics/109.png" width="300px">
</a>
<span class=" "><a class="" href="https://static.guaranteedstruggle.host/thread-pics/109.png" target="_blank"> 109.png </a> </span>
</li>
</ul>
</div>
</div>
{% endif %}
<!-- <div class="col s8">
<div class="card-content white-text">
<span class="card-title">#{{ posto._key }}
<span class="new badge blue" data-badge-caption="">Ответов: {{ posto.answers_num }}</span>
<span class="new badge red" data-badge-caption="">Длина треда: {{ posto.children_num }}</span>
</span>
{% if posto.parent_post %}
<a class="link orange-text purple" href="#post-{{ posto.parent_post }}"> >>{{ posto.parent_post }} </a>
{% endif %}
<p>{{ posto.texto }}</p>
</div>
</div> -->
<div class="col s12 card-content white-text">
{% if posto.parent_post %}
<a class="link orange-text purple" href="#post-{{ posto.parent_post }}"> >>{{ posto.parent_post }} </a>
{% endif %}
<p>{{ posto.texto }}</p>
</div>
<div class="col s12 card-action white-text">
<div class="right">
<!-- <a href="#" hx-post="/post_my_post/{{ posto._key }}" hx-target="#neu-posts" >Answer me!</a> -->
<a href="#answer-post" hx-post="/{{board}}/answer_post/{{ posto._key }}" hx-target="#answer-post" >Ответить этому.</a>
</div>
</div>
<div class="col s12 card-content white-text">
<!-- TODO !подгрузка следующего поста в конец треда без перезагрузки всего треда! -->
<div class="left">
<!-- <a href="#" hx-post="/post_my_post/{{ posto._key }}" hx-target="#neu-posts" >Answer me!</a> -->
{% if posto.answers_list[0] | length > 0 %}
<p>Ответы:</p>
{% for ans in posto.answers_list[0] %}
{% if (posto.answers_list[1])[loop.index-1] > 0 %}
{% if (posto.answers_list[2])[loop.index-1] > 0 %}
<a href="#post-{{ (posto.answers_list[0])[loop.index-1] }}" class="lime-text red collection-item" style="padding: 2px 2px;">>>{{ (posto.answers_list[0])[loop.index-1] }} (ответов {{ (posto.answers_list[1])[loop.index-1] }}, длина {{ (posto.answers_list[2])[loop.index-1] }})</a>
{% else %}
<a href="#post-{{ (posto.answers_list[0])[loop.index-1] }}" class="lime-text red collection-item" style="padding: 2px 2px;">>>{{ (posto.answers_list[0])[loop.index-1] }} (ответов {{ (posto.answers_list[1])[loop.index-1] }})</a>
{% endif %}
{% else %}
<a href="#post-{{ (posto.answers_list[0])[loop.index-1] }}" class="lime-text red collection-item" style="padding: 2px 2px;">>>{{ (posto.answers_list[0])[loop.index-1] }}</a>
{% endif %}
{% endfor %}
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endif %}

View File

@@ -0,0 +1,25 @@
{% extends "base.html" %}
{% block content %}
{% include 'navbar.html' %}
<div class="row" >
<div class="col s6 m5" id="neu-posts">
{% include 'i-posts.html' %}
</div>
<div class="col s6 m5" id="thread-viz">
<iframe src="https://thread-visualizah-dev.board.vdk2ch.ru/" scrolling="no" frameborder="0" style="position: relative; height: 600px; width: 100%; margin:10px;"></iframe>
</div>
</div>
<div class="row">
<div class="col s3 m3 " id="aa"></div>
<div class="col s7 m6 " id="answer-post">
{% include 'answer-post.html' %}
</div>
</div>
{% endblock content %}

View File

@@ -1,42 +1,20 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<div id="multi-bg"> {% include 'navbar.html' %}
<div class="host-id">Вас закинуло сюда: {{host_id}}</div> <div class="container">
<div class="content"> <div class="row">
Dobro pozhalovat. AGAIN. <div class="col s4 center">
</div> <div class="card">
<div class="card-image">
<nav> <img class="img-responsive" src="https://static.guaranteedstruggle.host/test-public/sin.jpg" height="400px" width="320px">
<a routerLink = "/">Напоминание </a> </div>
<br> <div class="card-content">
<a routerLink = "/about">О нас </a> <p> Dobro pozhalovat. AGAIN. </p>
<br> </div>
Доски: </div>
<div class="boards"> </div>
<ul>
{% for board in boards %}
<li><a href="/boards/{{board}}">/{{board}}</a></li>
{% endfor %}
</ul>
</div> </div>
</nav> </div>
<img src="https://static.vdk2ch.ru/test-public/sin.jpg">
</div>
<style>
#multi-bg{
height: 300px;
display: block;
background-color: #808;
background-image:
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900'%3E%3Cpolygon fill='%23cc3f47' points='957 450 539 900 1396 900'/%3E%3Cpolygon fill='%23b3373e' points='957 450 872.9 900 1396 900'/%3E%3Cpolygon fill='%23c8364e' points='-60 900 398 662 816 900'/%3E%3Cpolygon fill='%23b02f44' points='337 900 398 662 816 900'/%3E%3Cpolygon fill='%23c22f55' points='1203 546 1552 900 876 900'/%3E%3Cpolygon fill='%23ab294b' points='1203 546 1552 900 1162 900'/%3E%3Cpolygon fill='%23bb285c' points='641 695 886 900 367 900'/%3E%3Cpolygon fill='%23a52351' points='587 900 641 695 886 900'/%3E%3Cpolygon fill='%23b32362' points='1710 900 1401 632 1096 900'/%3E%3Cpolygon fill='%239f1f57' points='1710 900 1401 632 1365 900'/%3E%3Cpolygon fill='%23aa2068' points='1210 900 971 687 725 900'/%3E%3Cpolygon fill='%23971c5d' points='943 900 1210 900 971 687'/%3E%3C/svg%3E"),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='200' viewBox='0 0 160 80'%3E%3Cg fill='%23FFF' fill-opacity='0.2'%3E%3Cpolygon points='0 10 0 0 10 0'/%3E%3Cpolygon points='0 40 0 30 10 30'/%3E%3Cpolygon points='0 30 0 20 10 20'/%3E%3Cpolygon points='0 70 0 60 10 60'/%3E%3Cpolygon points='0 80 0 70 10 70'/%3E%3Cpolygon points='50 80 50 70 60 70'/%3E%3Cpolygon points='10 20 10 10 20 10'/%3E%3Cpolygon points='10 40 10 30 20 30'/%3E%3Cpolygon points='20 10 20 0 30 0'/%3E%3Cpolygon points='10 10 10 0 20 0'/%3E%3Cpolygon points='30 20 30 10 40 10'/%3E%3Cpolygon points='20 20 20 40 40 20'/%3E%3Cpolygon points='40 10 40 0 50 0'/%3E%3Cpolygon points='40 20 40 10 50 10'/%3E%3Cpolygon points='40 40 40 30 50 30'/%3E%3Cpolygon points='30 40 30 30 40 30'/%3E%3Cpolygon points='40 60 40 50 50 50'/%3E%3Cpolygon points='50 30 50 20 60 20'/%3E%3Cpolygon points='40 60 40 80 60 60'/%3E%3Cpolygon points='50 40 50 60 70 40'/%3E%3Cpolygon points='60 0 60 20 80 0'/%3E%3Cpolygon points='70 30 70 20 80 20'/%3E%3Cpolygon points='70 40 70 30 80 30'/%3E%3Cpolygon points='60 60 60 80 80 60'/%3E%3Cpolygon points='80 10 80 0 90 0'/%3E%3Cpolygon points='70 40 70 60 90 40'/%3E%3Cpolygon points='80 60 80 50 90 50'/%3E%3Cpolygon points='60 30 60 20 70 20'/%3E%3Cpolygon points='80 70 80 80 90 80 100 70'/%3E%3Cpolygon points='80 10 80 40 110 10'/%3E%3Cpolygon points='110 40 110 30 120 30'/%3E%3Cpolygon points='90 40 90 70 120 40'/%3E%3Cpolygon points='10 50 10 80 40 50'/%3E%3Cpolygon points='110 60 110 50 120 50'/%3E%3Cpolygon points='100 60 100 80 120 60'/%3E%3Cpolygon points='110 0 110 20 130 0'/%3E%3Cpolygon points='120 30 120 20 130 20'/%3E%3Cpolygon points='130 10 130 0 140 0'/%3E%3Cpolygon points='130 30 130 20 140 20'/%3E%3Cpolygon points='120 40 120 30 130 30'/%3E%3Cpolygon points='130 50 130 40 140 40'/%3E%3Cpolygon points='120 50 120 70 140 50'/%3E%3Cpolygon points='110 70 110 80 130 80 140 70'/%3E%3Cpolygon points='140 10 140 0 150 0'/%3E%3Cpolygon points='140 20 140 10 150 10'/%3E%3Cpolygon points='140 40 140 30 150 30'/%3E%3Cpolygon points='140 50 140 40 150 40'/%3E%3Cpolygon points='140 70 140 60 150 60'/%3E%3Cpolygon points='150 20 150 40 160 30 160 20'/%3E%3Cpolygon points='150 60 150 50 160 50'/%3E%3Cpolygon points='140 70 140 80 150 80 160 70'/%3E%3C/g%3E%3C/svg%3E"),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpolygon fill='%23740074' points='1600 160 0 460 0 350 1600 50'/%3E%3Cpolygon fill='%235f005f' points='1600 260 0 560 0 450 1600 150'/%3E%3Cpolygon fill='%234b004b' points='1600 360 0 660 0 550 1600 250'/%3E%3Cpolygon fill='%23360036' points='1600 460 0 760 0 650 1600 350'/%3E%3Cpolygon fill='%23220022' points='1600 800 0 800 0 750 1600 450'/%3E%3C/g%3E%3C/svg%3E");
background-repeat: no-repeat;
background-size: cover;
background-position: bottom center, 50%, 50%;
}
</style>
{% endblock content %} {% endblock content %}

18
templates/navbar.html Normal file
View File

@@ -0,0 +1,18 @@
<nav>
<div class="nav-wrapper purple darken-3">
<ul id="nav-mobile" class="left ">
<li> <a href="/">glavnaya</a> </li>
{% if boards | length > 0 %}
{% for board in boards %}
<li><a href="/{{board}}"><span class="new badge red" data-badge-caption="">{{board}}</span></a> </li>
{% endfor %}
{% endif %}
<li>
<a href="#">Вас закинуло сюда: <span class="new badge blue" data-badge-caption="">{{host_id}}</span></a>
</li>
</ul>
</div>
</nav>

53
templates/op-posts.html Normal file
View File

@@ -0,0 +1,53 @@
{% if postos | length > 0 %}
{% for posto in postos %}
<div class="row">
{% if posto.root_post %}
<div class="card s5 deep-orange accent-4 darken-1">
{% else %}
<div class="card s5 blue-grey darken-1">
{% endif %}
<div class="card-content white-text">
<span class="new badge yellow" data-badge-caption="">
<a class="purple-text" href="/{{board}}/{{ posto._key }}"> #{{ posto._key }} </a>
</span>
<span class="new badge blue" data-badge-caption="">Ответов: {{ posto.answers_num }}</span>
<span class="new badge red" data-badge-caption="">Длина треда: {{ posto.children_num }}</span>
</div>
<div class="row" id="post-{{ posto._key }}">
{% if posto.images | length > 0 %}
<div class="col s12">
<!-- <div class="nav-wrapper">
<ul id="nav-mobile" class="right hide-on-med-and-down">
<li>
<a href="https://static.guaranteedstruggle.host/thread-pics/photo_2023-05-16_00-49-34.jpg" target="_blank" ">
<img src="https://static.guaranteedstruggle.host/thread-pics/photo_2023-05-16_00-49-34.jpg" width="300px">
</a>
<span class=" "><a class="" href="https://static.guaranteedstruggle.host/thread-pics/photo_2023-05-16_00-49-34.jpg" target="_blank"> photo_2023-05-16_00-49-34.jpg </a> </span>
</li>
<li>
<a href="https://static.guaranteedstruggle.host/thread-pics/109.png" target="_blank" ">
<img src="https://static.guaranteedstruggle.host/thread-pics/109.png" width="300px">
</a>
<span class=" "><a class="" href="https://static.guaranteedstruggle.host/thread-pics/109.png" target="_blank"> 109.png </a> </span>
</li>
</ul>
</div> -->
</div>
{% endif %}
<div class="col s12 card-content white-text">
<p>{{ posto.texto }}</p>
</div>
<div class="col s12 card-action white-text">
<div class="right">
<!-- <a href="#" hx-post="/post_my_post/{{ posto._key }}" hx-target="#neu-posts" >Answer me!</a> -->
<a href="/{{board}}/{{ posto._key }}" >В тред!</a>
</div>
</div>
</div>
</div>
</div>
{% endfor %}
{% endif %}

View File

@@ -1,36 +0,0 @@
{% extends "base.html" %}
{% block content %}
<div class="panel-block">
<div class="w-small w-2/3 mx-auto py-10 text-gray-600">
<input
type="text"
name="search"
hx-post="/search"
hx-trigger="keyup changed delay:250ms"
hx-indicator=".htmx-indicator"
hx-target="#todo-results"
placeholder="Search"
class="bg-white h-10 px-5 pr-10 rounded-full text-2xl focus:outline-none"
>
<span class="htmx-indicator">Searching...</span>
</div>
+dev 3
<table class="border-collapse w-small w-2/3 mx-auto">
<thead>
<tr>
<th class="p-3 font-bold uppercase bg-gray-200 text-gray-600 border border-gray-300 hidden lg:table-cell">#</th>
<th class="p-3 font-bold uppercase bg-gray-200 text-gray-600 border border-gray-300 hidden lg:table-cell">Title</th>
<th class="p-3 font-bold uppercase bg-gray-200 text-gray-600 border border-gray-300 hidden lg:table-cell">Completed</th>
</tr>
</thead>
<tbody id="todo-results">
{% include 'todo.html' %}
</tbody>
</table>
</div>
{% endblock content %}

View File

@@ -1,81 +0,0 @@
{% if board_threads|length>0 %}
{% for thread in board_threads %}
<div class="post post_type_reply post_withimg" id="post-15135655" data-num="15135655">
<div class="post__details" id="post-details-15135655">
<input type="checkbox" name="delete" class="turnmeoff" value="15135655">
<span class="post__detailpart">
<span class="post__anon">{{thread.name}}</span>
</span>
<span class="post__detailpart">
<span class="post__time">05/07/23 Срд 14:53:58</span>
</span>
<span class="post__detailpart">
<a href="/news/res/15135633.html#15135655" id="15135655" class="post__reflink"></a>
<a href="/news/res/15135633.html#15135655" class="js-post-reply-btn post__reflink" data-num="15135655">{{thread.post_num}}</a>
<span class="post__number">2</span></span>
<span class="post__detailpart">
<svg xmlns="http://www.w3.org/2000/svg" class="post__btn post__btn_type_menu icon desktop" data-num="15135655"><use xlink:href="#icon__addmenu"></use></svg>
<span data-num="15135655" onclick="addAdminMenu(this); return false;" onmouseout="removeAdminMenu(event); return false;" style="display: flex;">
<svg xmlns="http://www.w3.org/2000/svg" class="post__btn post__btn_type_adm icon"><use xlink:href="#icon__report"></use></svg>
</span>
</span>
</div>
<div class="post__images post__images_type_multi">
{% for pic in thread.pic_links %}
<!-- <div class="post__images">
<svg class="post__file-preview " data-width="954" data-height="960" data-type="2" data-md5="15135655-d39bd5b1ed6c40e9a1d1eb2971a57584" data-title="image.png" viewBox="0 0 100 100" data-src="https://static.vdk2ch.ru/thread-pics/{{pic}}" width="168" height="170" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="img-{{thread.post_num}}" patternUnits="userSpaceOnUse" width="100" height="100">
<image xlink:href="https://static.vdk2ch.ru/thread-pics/{{pic}}" x="-25" width="150" height="100" />
</pattern>
</defs>
<use>
<polygon points="50 1 95 25 95 75 50 99 5 75 5 25" fill="url(#img-{{thread.post_num}})"/>
</use>
</svg>
</div> -->
<figure class="post__image">
<figcaption class="post__file-attr">
<a class="desktop" target="_blank" href="https://static.vdk2ch.ru/thread-pics/{{pic}}" title="image.png">{{pic}}</a>
<!-- <svg xmlns="http://www.w3.org/2000/svg" class="icon js-post-findimg desktop"><use xlink:href="#icon__findimg"></use></svg>
<svg xmlns="http://www.w3.org/2000/svg" class="icon js-post-saveimg desktop" data-url="https://static.vdk2ch.ru/thread-pics/{{pic}}" data-name="image.png"><use xlink:href="#icon__saveimg"></use></svg> -->
</figcaption>
<a href="https://static.vdk2ch.ru/thread-pics/{{pic}}" class="post__image-link" target="_blank" onclick="return false;">
<!-- <svg visibility="visible" class="post__file-preview " data-width="954" data-height="960" data-type="2" data-md5="15135655-d39bd5b1ed6c40e9a1d1eb2971a57584" data-title="image.png" viewBox="0 0 100 100" data-src="https://static.vdk2ch.ru/thread-pics/{{pic}}" width="168" height="170" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="img-{{thread.post_num}}" patternUnits="userSpaceOnUse" width="100" height="100">
<image xlink:href="https://static.vdk2ch.ru/thread-pics/{{pic}}" x="-25" width="150" height="100" />
</pattern>
</defs>
<use>
<polygon points="50 1 95 25 95 75 50 99 5 75 5 25" fill="url(#img-{{thread.post_num}})"/>
</use>
</svg> -->
<img src="https://static.vdk2ch.ru/thread-pics/{{pic}}" alt="954x960" id="img-15135655-d39bd5b1ed6c40e9a1d1eb2971a57584" class="post__file-preview " data-type="2" data-title="image.png" data-width="954" data-height="960" data-md5="15135655-d39bd5b1ed6c40e9a1d1eb2971a57584" data-src="https://static.vdk2ch.ru/thread-pics/{{pic}}" width="168" height="170">
</a>
</figure>
{% endfor %}
</div>
<article id="m15135655" class="post__message ">
<a href="/news/res/15135633.html#15135633" class="post-reply-link" data-thread="15135633" data-num="15135633">&gt;&gt;15135633 (OP)</a><br>
<!--
{% for pic in thread.pic_links %}
<svg class="post__file-preview " data-width="954" data-height="960" data-type="2" data-md5="15135655-d39bd5b1ed6c40e9a1d1eb2971a57584" data-title="image.png" viewBox="0 0 100 100" data-src="https://static.vdk2ch.ru/thread-pics/{{pic}}" width="168" height="170" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<pattern id="img-{{thread.post_num}}" patternUnits="userSpaceOnUse" width="100" height="100">
<image xlink:href="https://static.vdk2ch.ru/thread-pics/{{pic}}" x="-25" width="150" height="100" />
</pattern>
</defs>
<use>
<polygon points="50 1 95 25 95 75 50 99 5 75 5 25" fill="url(#img-{{thread.post_num}})"/>
</use>
</svg>
{% endfor %} -->
{{thread.txt}}
</article>
<div id="refmap-15135655" class="post__refmap" style="display: none;"></div>
</div>
{% endfor %}
{% endif %}

View File

@@ -1,15 +0,0 @@
{% if todos|length>0 %}
{% for todo in todos %}
<tr class="bg-white lg:hover:bg-gray-100 flex lg:table-row flex-row lg:flex-row flex-wrap lg:flex-no-wrap mb-10 lg:mb-0">
<td class="w-full lg:w-auto p-3 text-gray-800 text-center border border-b block lg:table-cell relative lg:static">{{todo.id}}</td>
<td class="w-full lg:w-auto p-3 text-gray-800 text-center border border-b block lg:table-cell relative lg:static">{{todo.title}}</td>
<td class="w-full lg:w-auto p-3 text-gray-800 text-center border border-b block lg:table-cell relative lg:static">
{% if todo.completed %}
<span class="rounded bg-green-400 py-1 px-3 text-xs font-bold">Yes</span>
{% else %}
<span class="rounded bg-red-400 py-1 px-3 text-xs font-bold">No</span>
{% endif %}
</td>
</tr>
{% endfor %}
{% endif %}

View File

@@ -1,11 +0,0 @@
threads_lists = {
'b': {
'123','124'
},
'a': {
'1'
},
'd': {
'44','99','1230'
}
}

View File

@@ -1,45 +0,0 @@
# <id>: {<post_num>, <pic_links>, <texto>, <name>}
open_threads = {
'123': {
'thread_num': '123',
'post_num': '9999',
'pic_links': ['16216445863900.jpg'],
'txt': 'фыва',
'name': 'anonius'
},
'124': {
'thread_num': '124',
'post_num': '456',
'pic_linkss': ['16672846165910.png'],
'txt': 'Test',
'name': 'anonius'
},
'1': {
'thread_num': '123',
'post_num': '1',
'pic_links': ['16211265989190.jpg'],
'txt': 'фыва',
'name': 'anonius'
},
'44': {
'thread_num': '44',
'post_num': '12',
'pic_links': ['15937598937440.png'],
'txt': 'I hate my brother-nation..',
'name': 'Владимир Владимирович'
},
'99': {
'thread_num': '99',
'post_num': '55',
'pic_links': ['Экран-смерти.jpg'],
'txt': 'фыва',
'name': 'anonius'
},
'1230': {
'thread_num': '1230',
'post_num': '1234',
'pic_links': ['15906018690140.png'],
'txt': '33333!',
'name': 'SIRNA'
}
}

457
todo.py
View File

@@ -1,457 +0,0 @@
todos = [
{"userId": 1, "id": 1, "title": "delectus aut autem", "completed": False},
{
"userId": 1,
"id": 2,
"title": "quis ut nam facilis et officia qui",
"completed": False,
},
{"userId": 1, "id": 3, "title": "fugiat veniam minus", "completed": False},
{"userId": 1, "id": 4, "title": "et porro tempora", "completed": True},
{
"userId": 1,
"id": 5,
"title": "laboriosam mollitia et enim quasi adipisci quia provident illum",
"completed": False,
},
{
"userId": 1,
"id": 6,
"title": "qui ullam ratione quibusdam voluptatem quia omnis",
"completed": False,
},
{
"userId": 1,
"id": 7,
"title": "illo expedita consequatur quia in",
"completed": False,
},
{"userId": 1, "id": 8, "title": "quo adipisci enim quam ut ab", "completed": True},
{"userId": 1, "id": 9, "title": "molestiae perspiciatis ipsa", "completed": False},
{
"userId": 1,
"id": 10,
"title": "illo est ratione doloremque quia maiores aut",
"completed": True,
},
{"userId": 1, "id": 11, "title": "vero rerum temporibus dolor", "completed": True},
{"userId": 1, "id": 12, "title": "ipsa repellendus fugit nisi", "completed": True},
{"userId": 1, "id": 13, "title": "et doloremque nulla", "completed": False},
{
"userId": 1,
"id": 14,
"title": "repellendus sunt dolores architecto voluptatum",
"completed": True,
},
{"userId": 1, "id": 15, "title": "ab voluptatum amet voluptas", "completed": True},
{
"userId": 1,
"id": 16,
"title": "accusamus eos facilis sint et aut voluptatem",
"completed": True,
},
{
"userId": 1,
"id": 17,
"title": "quo laboriosam deleniti aut qui",
"completed": True,
},
{
"userId": 1,
"id": 18,
"title": "dolorum est consequatur ea mollitia in culpa",
"completed": False,
},
{
"userId": 1,
"id": 19,
"title": "molestiae ipsa aut voluptatibus pariatur dolor nihil",
"completed": True,
},
{
"userId": 1,
"id": 20,
"title": "ullam nobis libero sapiente ad optio sint",
"completed": True,
},
{
"userId": 2,
"id": 21,
"title": "suscipit repellat esse quibusdam voluptatem incidunt",
"completed": False,
},
{
"userId": 2,
"id": 22,
"title": "distinctio vitae autem nihil ut molestias quo",
"completed": True,
},
{
"userId": 2,
"id": 23,
"title": "et itaque necessitatibus maxime molestiae qui quas velit",
"completed": False,
},
{
"userId": 2,
"id": 24,
"title": "adipisci non ad dicta qui amet quaerat doloribus ea",
"completed": False,
},
{
"userId": 2,
"id": 25,
"title": "voluptas quo tenetur perspiciatis explicabo natus",
"completed": True,
},
{"userId": 2, "id": 26, "title": "aliquam aut quasi", "completed": True},
{"userId": 2, "id": 27, "title": "veritatis pariatur delectus", "completed": True},
{
"userId": 2,
"id": 28,
"title": "nesciunt totam sit blanditiis sit",
"completed": False,
},
{"userId": 2, "id": 29, "title": "laborum aut in quam", "completed": False},
{
"userId": 2,
"id": 30,
"title": "nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis",
"completed": True,
},
{
"userId": 2,
"id": 31,
"title": "repudiandae totam in est sint facere fuga",
"completed": False,
},
{
"userId": 2,
"id": 32,
"title": "earum doloribus ea doloremque quis",
"completed": False,
},
{"userId": 2, "id": 33, "title": "sint sit aut vero", "completed": False},
{
"userId": 2,
"id": 34,
"title": "porro aut necessitatibus eaque distinctio",
"completed": False,
},
{
"userId": 2,
"id": 35,
"title": "repellendus veritatis molestias dicta incidunt",
"completed": True,
},
{
"userId": 2,
"id": 36,
"title": "excepturi deleniti adipisci voluptatem et neque optio illum ad",
"completed": True,
},
{"userId": 2, "id": 37, "title": "sunt cum tempora", "completed": False},
{"userId": 2, "id": 38, "title": "totam quia non", "completed": False},
{
"userId": 2,
"id": 39,
"title": "doloremque quibusdam asperiores libero corrupti illum qui omnis",
"completed": False,
},
{"userId": 2, "id": 40, "title": "totam atque quo nesciunt", "completed": True},
{
"userId": 3,
"id": 41,
"title": "aliquid amet impedit consequatur aspernatur placeat eaque fugiat suscipit",
"completed": False,
},
{
"userId": 3,
"id": 42,
"title": "rerum perferendis error quia ut eveniet",
"completed": False,
},
{
"userId": 3,
"id": 43,
"title": "tempore ut sint quis recusandae",
"completed": True,
},
{
"userId": 3,
"id": 44,
"title": "cum debitis quis accusamus doloremque ipsa natus sapiente omnis",
"completed": True,
},
{
"userId": 3,
"id": 45,
"title": "velit soluta adipisci molestias reiciendis harum",
"completed": False,
},
{
"userId": 3,
"id": 46,
"title": "vel voluptatem repellat nihil placeat corporis",
"completed": False,
},
{
"userId": 3,
"id": 47,
"title": "nam qui rerum fugiat accusamus",
"completed": False,
},
{
"userId": 3,
"id": 48,
"title": "sit reprehenderit omnis quia",
"completed": False,
},
{
"userId": 3,
"id": 49,
"title": "ut necessitatibus aut maiores debitis officia blanditiis velit et",
"completed": False,
},
{
"userId": 3,
"id": 50,
"title": "cupiditate necessitatibus ullam aut quis dolor voluptate",
"completed": True,
},
{
"userId": 3,
"id": 51,
"title": "distinctio exercitationem ab doloribus",
"completed": False,
},
{
"userId": 3,
"id": 52,
"title": "nesciunt dolorum quis recusandae ad pariatur ratione",
"completed": False,
},
{
"userId": 3,
"id": 53,
"title": "qui labore est occaecati recusandae aliquid quam",
"completed": False,
},
{
"userId": 3,
"id": 54,
"title": "quis et est ut voluptate quam dolor",
"completed": True,
},
{
"userId": 3,
"id": 55,
"title": "voluptatum omnis minima qui occaecati provident nulla voluptatem ratione",
"completed": True,
},
{"userId": 3, "id": 56, "title": "deleniti ea temporibus enim", "completed": True},
{
"userId": 3,
"id": 57,
"title": "pariatur et magnam ea doloribus similique voluptatem rerum quia",
"completed": False,
},
{
"userId": 3,
"id": 58,
"title": "est dicta totam qui explicabo doloribus qui dignissimos",
"completed": False,
},
{
"userId": 3,
"id": 59,
"title": "perspiciatis velit id laborum placeat iusto et aliquam odio",
"completed": False,
},
{
"userId": 3,
"id": 60,
"title": "et sequi qui architecto ut adipisci",
"completed": True,
},
{"userId": 4, "id": 61, "title": "odit optio omnis qui sunt", "completed": True},
{
"userId": 4,
"id": 62,
"title": "et placeat et tempore aspernatur sint numquam",
"completed": False,
},
{
"userId": 4,
"id": 63,
"title": "doloremque aut dolores quidem fuga qui nulla",
"completed": True,
},
{
"userId": 4,
"id": 64,
"title": "voluptas consequatur qui ut quia magnam nemo esse",
"completed": False,
},
{
"userId": 4,
"id": 65,
"title": "fugiat pariatur ratione ut asperiores necessitatibus magni",
"completed": False,
},
{
"userId": 4,
"id": 66,
"title": "rerum eum molestias autem voluptatum sit optio",
"completed": False,
},
{
"userId": 4,
"id": 67,
"title": "quia voluptatibus voluptatem quos similique maiores repellat",
"completed": False,
},
{
"userId": 4,
"id": 68,
"title": "aut id perspiciatis voluptatem iusto",
"completed": False,
},
{
"userId": 4,
"id": 69,
"title": "doloribus sint dolorum ab adipisci itaque dignissimos aliquam suscipit",
"completed": False,
},
{
"userId": 4,
"id": 70,
"title": "ut sequi accusantium et mollitia delectus sunt",
"completed": False,
},
{"userId": 4, "id": 71, "title": "aut velit saepe ullam", "completed": False},
{
"userId": 4,
"id": 72,
"title": "praesentium facilis facere quis harum voluptatibus voluptatem eum",
"completed": False,
},
{
"userId": 4,
"id": 73,
"title": "sint amet quia totam corporis qui exercitationem commodi",
"completed": True,
},
{
"userId": 4,
"id": 74,
"title": "expedita tempore nobis eveniet laborum maiores",
"completed": False,
},
{
"userId": 4,
"id": 75,
"title": "occaecati adipisci est possimus totam",
"completed": False,
},
{"userId": 4, "id": 76, "title": "sequi dolorem sed", "completed": True},
{
"userId": 4,
"id": 77,
"title": "maiores aut nesciunt delectus exercitationem vel assumenda eligendi at",
"completed": False,
},
{
"userId": 4,
"id": 78,
"title": "reiciendis est magnam amet nemo iste recusandae impedit quaerat",
"completed": False,
},
{"userId": 4, "id": 79, "title": "eum ipsa maxime ut", "completed": True},
{
"userId": 4,
"id": 80,
"title": "tempore molestias dolores rerum sequi voluptates ipsum consequatur",
"completed": True,
},
{"userId": 5, "id": 81, "title": "suscipit qui totam", "completed": True},
{
"userId": 5,
"id": 82,
"title": "voluptates eum voluptas et dicta",
"completed": False,
},
{
"userId": 5,
"id": 83,
"title": "quidem at rerum quis ex aut sit quam",
"completed": True,
},
{"userId": 5, "id": 84, "title": "sunt veritatis ut voluptate", "completed": False},
{"userId": 5, "id": 85, "title": "et quia ad iste a", "completed": True},
{"userId": 5, "id": 86, "title": "incidunt ut saepe autem", "completed": True},
{
"userId": 5,
"id": 87,
"title": "laudantium quae eligendi consequatur quia et vero autem",
"completed": True,
},
{
"userId": 5,
"id": 88,
"title": "vitae aut excepturi laboriosam sint aliquam et et accusantium",
"completed": False,
},
{"userId": 5, "id": 89, "title": "sequi ut omnis et", "completed": True},
{
"userId": 5,
"id": 90,
"title": "molestiae nisi accusantium tenetur dolorem et",
"completed": True,
},
{
"userId": 5,
"id": 91,
"title": "nulla quis consequatur saepe qui id expedita",
"completed": True,
},
{"userId": 5, "id": 92, "title": "in omnis laboriosam", "completed": True},
{
"userId": 5,
"id": 93,
"title": "odio iure consequatur molestiae quibusdam necessitatibus quia sint",
"completed": True,
},
{"userId": 5, "id": 94, "title": "facilis modi saepe mollitia", "completed": False},
{
"userId": 5,
"id": 95,
"title": "vel nihil et molestiae iusto assumenda nemo quo ut",
"completed": True,
},
{
"userId": 5,
"id": 96,
"title": "nobis suscipit ducimus enim asperiores voluptas",
"completed": False,
},
{
"userId": 5,
"id": 97,
"title": "dolorum laboriosam eos qui iure aliquam",
"completed": False,
},
{
"userId": 5,
"id": 98,
"title": "debitis accusantium ut quo facilis nihil quis sapiente necessitatibus",
"completed": True,
},
{"userId": 5, "id": 99, "title": "neque voluptates ratione", "completed": False},
{
"userId": 5,
"id": 100,
"title": "excepturi a et neque qui expedita vel voluptate",
"completed": False,
},
]