569 Commits
Author SHA1 Message Date
pierre geeraert 130b0af8d8 redirect to streaming
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-10-03 23:17:27 +01:00
pierre geeraert 6f7542ef27 change image format
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-10-03 22:01:02 +01:00
pierre geeraert 919d1a3a28 lowercase the alias as well
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9s
2026-10-03 21:43:09 +01:00
pierre geeraert 3c4c32e72d lowercase the sanitized name 2026-10-03 21:25:11 +01:00
pierre.geeraert 3294e70b3f add rest framework authentication
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-22 10:01:09 +01:00
pierre.geeraert 5908d8d282 views to add or delete ingress for terraform
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-21 22:27:22 +01:00
pierre.geeraert 32f8251a90 enable ingress module
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-21 17:34:07 +01:00
pierre geeraert a3fec86eae increase size poster
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-17 22:49:47 +01:00
pierre geeraert f188e25453 add poster function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-09-17 22:33:11 +01:00
pierre.geeraert d4a72ebf5d we can have logos
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-16 14:38:11 +01:00
pierre.geeraert 4492db4185 cleanup
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-16 13:23:41 +01:00
pierre.geeraert 015edcd63d universal method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-16 11:25:36 +01:00
pierre.geeraert aaad6b2b7e add exmaple
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-15 18:23:16 +01:00
pierre.geeraert 3b6eccba80 create universal admin class
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-15 18:22:03 +01:00
pierre.geeraert ea4ebb0de0 more pretty
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-15 11:39:05 +01:00
pierre.geeraert 1430afe600 change timezone to London
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-15 11:03:48 +01:00
pierre.geeraert 7a5c7b6de9 use ELIF as otherwise the else is ignored
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 16:32:37 +01:00
pierre.geeraert c880172aa5 use function for default
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 16:15:03 +01:00
pierre.geeraert 6b631fb3e3 this was supposed to be deleted
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 16:12:33 +01:00
pierre.geeraert 712f3d50b5 add back timezone as it was required
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-09-14 15:46:51 +01:00
pierre.geeraert f6875b498b add back timezone as it was required
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 15:42:15 +01:00
pierre.geeraert 2e728d4698 add migration file
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 15:36:29 +01:00
pierre.geeraert 98a969fa04 remove old imports
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 15:34:28 +01:00
pierre.geeraert 154717aca7 should be good
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 15:22:13 +01:00
pierre.geeraert cc0eb74090 add the time test
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-14 15:09:16 +01:00
pierre.geeraert e2f49a5b1f untested addition of the condition and scale up and down function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-14 10:44:41 +01:00
pierre geeraert c8ceaab950 untested bit of code
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-13 16:46:33 +01:00
pierre geeraert 3fbf333d3d ordering by name 2026-09-13 16:31:42 +01:00
pierre.geeraert 1d9d723ce9 add favicon
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-11 11:02:52 +01:00
pierre.geeraert cf06bfd1bd add import export
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-11 10:53:19 +01:00
pierre.geeraert 7a02fb89f4 remove django_q
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-11 09:41:24 +01:00
pierre geeraert bfdf8b3b2a stringify
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 22:28:42 +01:00
pierre geeraert 1ae2917263 stringify
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 22:26:25 +01:00
pierre geeraert 1fea1c9e23 add the view
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 7s
2026-09-10 22:24:25 +01:00
pierre geeraert fa804dbed1 add the view
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 22:24:12 +01:00
pierre geeraert 3b28145d0a add the view
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 22:22:10 +01:00
pierre geeraert e9bf6ba7b5 The view apps.cloudmanager.views.import_namespace_view didn't return an HttpResponse object. It returned None instead.
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 21:38:00 +01:00
pierre geeraert cc3394d5eb change the way it work to fix import_namespace() takes 0 positional arguments but 1 was given
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 21:36:02 +01:00
pierre geeraert 90156a4733 enable import namespace from web
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 21:31:10 +01:00
pierre.geeraert 314a6f1bed trying to avoid sidecontainer
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 13:21:33 +01:00
pierre.geeraert eab0ddd697 fix shit
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 11:05:40 +01:00
pierre.geeraert 3c1960f015 clean cloudmanager
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 10:45:45 +01:00
pierre.geeraert 3ff4dd1fae clean cloudmanager
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-10 10:41:29 +01:00
pierre.geeraert dbeaf4c58c remove the dashboard part of cloudmanager
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-10 10:34:39 +01:00
pierre geeraert 0f49484a43 add extra button admin
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 20:59:44 +01:00
pierre geeraert b540c7b7e8 add extra button admin 2026-09-09 20:59:18 +01:00
pierre.geeraert 1012ea31ad testing django_q2
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 17:09:15 +01:00
pierre.geeraert a00baa490f try django-q
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 15:18:00 +01:00
pierre.geeraert bc9e331c68 set always off if the replica was already 0
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 14:46:02 +01:00
pierre.geeraert 496a6bd940 verbose everywhere
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-09-09 14:34:14 +01:00
pierre.geeraert 2bbdad3e47 verbose everywhere
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 14:26:50 +01:00
pierre.geeraert 91e0c992ec verbose everywhere 2026-09-09 14:26:01 +01:00
pierre.geeraert 860de928ba verbose everywhere
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-09-09 14:25:05 +01:00
pierre.geeraert 9d82d61993 add the check to avoid making the operations for everyone
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-09 14:17:37 +01:00
pierre.geeraert 294af1945d add the actua_replicas to gather the data whenever required
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 13:49:53 +01:00
pierre.geeraert 430172911e not touching kube-system 2026-09-09 13:29:31 +01:00
pierre.geeraert 38e00d6ac6 not touching kube-system
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 13:07:51 +01:00
pierre.geeraert 75004d16f9 fix call and remove one echo
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 13:02:18 +01:00
pierre.geeraert 47e6d6630d add function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 12:59:52 +01:00
pierre.geeraert d9366b665b Add check for state true
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-09-09 10:29:55 +01:00
pierre.geeraert 951bf0a807 creating the function to display the expected state list 2026-09-09 10:29:10 +01:00
pierre.geeraert 4145db089f sounds promising
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-09 09:40:23 +01:00
pierre.geeraert a2f6d43398 seems good, more testing to do
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 21:07:46 +01:00
pierre.geeraert 5e41927b8d wrong identiation
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 20:57:22 +01:00
pierre.geeraert ea9459f013 good progress on the filter part
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 19:52:27 +01:00
pierre.geeraert c2e34305eb trying this way
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 19:09:54 +01:00
pierre.geeraert a79a9623b6 trying this way 2026-09-08 18:56:38 +01:00
pierre.geeraert cac74471aa fix the wrong import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 18:50:37 +01:00
pierre.geeraert afe668cca6 change the logic
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 18:48:45 +01:00
pierre.geeraert 2785eecbf3 cleanup 2026-09-08 18:30:05 +01:00
pierre.geeraert 0833a20347 move the import of data so other app can invoke the methods
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 18:24:03 +01:00
pierre.geeraert 95945cd4cf fix same name and add schedule week
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 18:17:25 +01:00
pierre.geeraert fdb32538bf wrong find & replace
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 18:10:52 +01:00
pierre.geeraert d2740d4b62 default schedule
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 18:01:29 +01:00
pierre.geeraert e26ba6d99d default schedule
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 17:57:24 +01:00
pierre.geeraert f419751206 create default day schedule, WIP and function not tested
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-09-08 17:24:12 +01:00
pierre.geeraert 70660fbd5a revert name and namespace , and switch to update and create
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 17:08:30 +01:00
pierre.geeraert a94390916a add replicas
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 17:03:03 +01:00
pierre.geeraert 5d6e5339ad change model
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 16:47:29 +01:00
pierre.geeraert b9cd8e3226 change model
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 13:05:22 +01:00
pierre.geeraert ce42b3dc33 add action
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-08 10:41:19 +01:00
pierre.geeraert 3f25d83f64 add action
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-09-08 10:15:18 +01:00
pierre.geeraert 45a67a11cf big untested try of cmm
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-08 10:10:18 +01:00
pierre.geeraert f0b700a688 big untested try of cmm
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-08 10:08:35 +01:00
pierre.geeraert 8d6234927c lower the key otherwise it will craerte duplicate with the existing key with uppercase
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-07 11:27:19 +01:00
pierre.geeraert c5d0fd8589 change workflow name
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-07 10:57:57 +01:00
pierre.geeraert 4938370eea setup the clearkey
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-07 10:44:14 +01:00
pi-ux-ce 13c360b1b0 Update django_code/apps/streaming/utils.py
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-05 22:08:58 +00:00
pierre.geeraert 87257fb0b5 clickable links
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-04 15:52:38 +01:00
pierre.geeraert f658a018ac fix hardcoded path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-03 09:52:19 +01:00
pierre.geeraert 2608756622 ?
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-03 09:05:47 +01:00
pierre.geeraert 6350dacd4e switch to never start to save laptop ressources
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2026-09-03 09:05:08 +01:00
pierre.geeraert 01c1ce7534 change urls path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-02 12:59:58 +01:00
pierre.geeraert ad0b611cb5 change urls path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-02 12:56:38 +01:00
pierre.geeraert 401ca9f935 change urls path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-09-02 12:55:01 +01:00
pierre.geeraert e98c05ce08 change urls path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-02 12:42:10 +01:00
pierre.geeraert 9759416787 change urls path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-02 12:40:20 +01:00
pierre.geeraert 03b007a5a0 change urls path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-09-02 12:36:06 +01:00
pierre.geeraert 93f3646abc work on the URLs
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-09-02 11:47:02 +01:00
pierre.geeraert 08796241a6 remove the display and put the redirect instead
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 20:36:43 +01:00
pierre.geeraert 8e43ea9dbd maybe finished
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-26 20:33:58 +01:00
pierre.geeraert a42eee7797 no need for psql,proxmox or docker anymore
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 19:50:39 +01:00
pierre.geeraert 25caebeb0a just test the creds
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 19:43:57 +01:00
pi-ux-ce e157a8c077 work on the random part
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-26 19:29:15 +01:00
pi-ux-ce 1d86eb582e new method worked
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 12:35:43 +01:00
pi-ux-ce 04a216f643 adding the episode_seen option and fix potential mistake
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 12:04:58 +01:00
pi-ux-ce e568afc5e0 use this method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 10s
2026-08-26 11:13:40 +01:00
pi-ux-ce 8865052752 use this method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 11:05:45 +01:00
pi-ux-ce f5f73fcacc use this method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-26 11:04:37 +01:00
pi-ux-ce e85c372ad8 following episode function good, need to work on the random episode and more admin stuff
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 7s
2026-08-25 16:24:43 +01:00
pi-ux-ce e66c7034f0 finishing the design of the admin page
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-07 17:17:26 +01:00
pi-ux-ce 8af967b4d3 change default
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-07 16:34:07 +01:00
pi-ux-ce b6e60764bd change default
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-07 16:29:29 +01:00
pi-ux-ce de1977fd2a work on the redirection
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-07 16:26:50 +01:00
pi-ux-ce 60aafb55b8 adding also new migrations
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-07 12:02:01 +01:00
pi-ux-ce 2b410b5ff8 reverting and merging into streaming app instead
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-07 12:00:32 +01:00
pi-ux-ce 7a1021edfa adding streaming_redirect
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-07 11:56:22 +01:00
pi-ux-ce a991b69547 add colored background
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-06 15:33:19 +01:00
pierre geeraert 9595ea326f clean the URLs from import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-05 19:55:27 +01:00
pi-ux-ce 78a95435ae clickable links almost everywhere
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-05 16:59:10 +01:00
pi-ux-ce a2973bcd82 no need for python-json-logger anymore as we cancelled netdata idea
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9s
2026-08-05 15:32:03 +01:00
pi-ux-ce b496c8ee02 add the migrate step for the prod entrypoint
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-05 15:28:51 +01:00
pi-ux-ce cbaf675f09 only edit the URL
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-05 15:28:07 +01:00
pi-ux-ce 3b2f77df35 add a result for the method of use
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-05 14:45:52 +01:00
pi-ux-ce b4ab48be08 display status code
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-05 14:38:06 +01:00
pi-ux-ce 943781d54d enable vpn
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-05 14:34:20 +01:00
pi-ux-ce 54fd66196e test working 2026-08-05 14:34:06 +01:00
pi-ux-ce 12078b1439 global settings and work on test website
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-05 14:05:59 +01:00
pi-ux-ce 1a8b54b718 add new entrypoint
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-05 13:10:11 +01:00
pi-ux-ce 749c971e1f data structure
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-08-05 13:08:06 +01:00
pi-ux-ce 822c42bd62 add new streaming app
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-05 13:01:06 +01:00
pi-ux-ce 21e77ab0b3 try again
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-03 14:43:56 +01:00
pi-ux-ce d38cea53f8 try another build method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-08-03 14:33:25 +01:00
pi-ux-ce 2e5e3b0a26 trying the netdata logging
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-08-03 14:22:48 +01:00
pi-ux-ce 4dbfeff967 add clickable links
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-31 15:14:11 +01:00
pi-ux-ce 441716bbbc stop rollout restart celery as there is no celery anymore
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m48s
2026-07-28 15:07:19 +01:00
pi-ux-ce 09b52bc16c Merge pull request 'testing' (#26) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3m35s
Reviewed-on: #26
2026-07-28 14:02:07 +00:00
pi-ux-ce 4f4de780ca add docker ignore
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-28 14:50:22 +01:00
pi-ux-ce 7681aef96e avoiding git clone within the dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m7s
2026-07-28 13:40:52 +01:00
pi-ux-ce a1d7d8005d avoiding git clone within the dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 7s
2026-07-28 13:38:41 +01:00
pi-ux-ce 31179d99de add cat of requirements as they don't get build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9s
2026-07-28 11:58:28 +01:00
pi-ux-ce d8866b038a add cat of requirements as they don't get build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-28 11:56:30 +01:00
pi-ux-ce 016ffbb1a9 remove redis for website redircet
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-07-28 10:49:01 +01:00
pi-ux-ce 8d90b3ef9d Merge pull request 'testing' (#25) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m44s
Reviewed-on: #25
2026-07-23 12:16:05 +00:00
pi-ux-ce 7e9b474f10 fix random spacing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-23 13:15:23 +01:00
pi-ux-ce e06a02db13 adding djangoql
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-23 13:07:49 +01:00
pi-ux-ce 540b5fea80 adding djangoql 2026-07-23 13:07:39 +01:00
pi-ux-ce ee91dea395 restructuring
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2026-07-17 16:00:02 +01:00
pi-ux-ce 1adc0ffc4a restructuring
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-17 15:52:48 +01:00
pi-ux-ce b123e260b0 restructuring 2026-07-17 15:46:38 +01:00
pi-ux-ce aa6ce119b8 Merge pull request 'testing' (#24) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m12s
Reviewed-on: #24
2026-07-17 14:41:04 +00:00
pi-ux-ce 94e47be079 restructuring
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-17 15:16:16 +01:00
pi-ux-ce 8abcd775ce Merge branch 'testing' of https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube into testing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m35s
2026-07-17 15:14:42 +01:00
pi-ux-ce a9a3cf69c6 restructuring 2026-07-17 15:14:16 +01:00
pi-ux-ce 87d8c52c48 Merge pull request 'testing' (#23) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m32s
Reviewed-on: #23
2026-07-14 22:00:44 +00:00
pierre geeraert f3672fed63 upgrade the testing entrypoint
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-14 22:58:34 +01:00
pierre geeraert 9f7fdbc198 letting re apply the redirect of a previous element
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-07-14 22:57:50 +01:00
pi-ux-ce 2661593e69 Merge pull request 'testing' (#22) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m10s
Reviewed-on: #22
2026-07-10 11:17:38 +00:00
pi-ux-ce 6f1c8cd8ff we can delete the message from telegram from the webui now
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-10 12:09:31 +01:00
pi-ux-ce a3fb4d843a remove unnecessary imports
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-09 09:14:23 +01:00
pi-ux-ce e7b72b1754 use temporary folder to avoid downloading into disk
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-09 09:13:36 +01:00
pi-ux-ce 7cb3d1917e Merge pull request 'testing' (#21) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m54s
Reviewed-on: #21
2026-07-07 09:48:19 +00:00
pi-ux-ce 0aebb19650 generate new urls based on the urlData form
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-07 10:47:24 +01:00
pi-ux-ce 3c2e6fe2f1 migrations from the new model 2026-07-07 10:20:43 +01:00
pi-ux-ce 78e9da8bd3 admin field for the url 2026-07-07 10:20:31 +01:00
pi-ux-ce b31480b68c adding redircet url and also avoid timezone conflict 2026-07-07 10:20:12 +01:00
pierre geeraert d556284977 enable whitenoise for production , as debug=false doesn't support static file
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m55s
2026-07-05 18:53:52 +01:00
pi-ux-ce d90696a1a5 Merge pull request 'testing' (#20) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m36s
Reviewed-on: #20
2026-07-05 13:51:01 +00:00
pierre geeraert b4eaf9eb5d work on timestamp
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-05 14:47:17 +01:00
pierre geeraert 333d065043 utilise less queryset ressources
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-05 14:24:40 +01:00
pierre geeraert 8aed35a67a bad idea actually
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m49s
2026-07-05 14:06:45 +01:00
pi-ux-ce 4fd57edecd Merge pull request 'testing' (#19) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m52s
Reviewed-on: #19
2026-07-05 13:01:18 +00:00
pierre geeraert 15e28502c1 collectstatic all the time
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-05 13:54:52 +01:00
pierre geeraert 035b878b3c re-organise the static 2026-07-05 13:51:34 +01:00
pi-ux-ce 0cbc34293e Merge pull request 'testing' (#18) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m4s
Reviewed-on: #18
2026-07-05 11:59:45 +00:00
pierre geeraert 95c11fe68d remove unnecessary import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-05 12:57:47 +01:00
pierre geeraert cece5eae71 using thread now
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-05 12:56:52 +01:00
pi-ux-ce f659209cd6 Merge pull request 'testing' (#17) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m53s
Reviewed-on: #17
2026-07-04 20:14:02 +00:00
pierre geeraert decbfc1bb5 stop this async crap for now
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-04 20:56:57 +01:00
pierre geeraert e9c7068b52 new readme
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-04 20:50:25 +01:00
pierre geeraert 8be9e7dd13 remove the journal
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-04 19:47:56 +01:00
pi-ux-ce f0e6339b3d Merge pull request 'testing' (#16) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m44s
Reviewed-on: #16
2026-07-04 17:39:51 +00:00
pierre geeraert e320f881d1 celery is an env var now
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-04 16:56:02 +01:00
pierre geeraert 22557fb166 removing migration step
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2026-07-04 14:54:06 +01:00
pierre geeraert 919065093d slowness due to the betaseries step, moving to shared task
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-04 13:53:44 +01:00
pierre geeraert c9e66762df add the admin action for it
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-04 13:21:34 +01:00
pierre geeraert f1ffa5c949 rewriting url and adding new one if they were not created
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-04 13:11:06 +01:00
pierre geeraert 4d5f3809d9 we can get info from show now 2026-07-04 13:09:01 +01:00
pierre geeraert b2ef330fc9 rename the command
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-03 23:48:07 +01:00
pierre geeraert 2ba56cb00f new_url command will automatically gather and replace the router file
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-07-03 23:43:37 +01:00
pierre geeraert d7ef0fcd3e create an equivalent of router, need to find a data type for it
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 22:25:35 +01:00
pierre geeraert c7eb2c5aba templating works some WIP though
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 22:11:43 +01:00
pierre geeraert 19e997f7ae improve message
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-02 21:46:07 +01:00
pierre geeraert 5433b97b00 add commands
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 21:38:37 +01:00
pierre geeraert 2a609b2143 only fetch enabled data
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-02 21:07:38 +01:00
pi-ux-ce dfd77e458a add admin for telegram
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-07-02 16:31:33 +01:00
pi-ux-ce 11d8176622 add proxy
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 16:20:46 +01:00
pi-ux-ce f9f831738d parse the podcasts and run them
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 10:43:59 +01:00
pi-ux-ce a435eac3e8 improve parsing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 09:58:13 +01:00
pi-ux-ce 97a74fb2cf target messages older than today not older than tomorrow
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-07-02 09:42:29 +01:00
pierre geeraert 444039b64a just in case
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-30 23:57:32 +01:00
pierre geeraert 7492061f58 add some options for podcast aggregator , multiple urls
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-30 23:55:35 +01:00
pierre geeraert a44ca7e825 setup new model 2026-06-30 23:55:10 +01:00
pierre geeraert f68b0ad00f add model 2026-06-30 22:55:13 +01:00
pierre geeraert 9863662e34 'QuerySet' object has no attribute 'len'
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-30 20:17:51 +01:00
pierre geeraert 7edecd7d1c exit if the list is empty
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-30 19:54:16 +01:00
pierre geeraert 5e9e5a1e7b fix the result issue
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-30 19:48:58 +01:00
pi-ux-ce 6af4c36fae miss requirement
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-30 16:07:56 +01:00
pi-ux-ce fa61ab2733 run the podcast through an url
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-30 15:57:36 +01:00
pi-ux-ce 8764522525 create usefull functions
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-30 15:40:35 +01:00
pi-ux-ceandClaude Sonnet 4.6 b4545d6c99 Add telegram_communication app with dedicated DB routing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
- Register TelegramCommunicationConfig in INSTALLED_APPS and add telegram_db to DATABASES
- Define TelegramData model mapped to the messages table
- Fix allow_migrate in ProjectDatabaseRouter: redirect and telegram entries were returning the DB name string (always truthy) instead of a boolean comparison, causing their migrations to bleed into every database
- Add telegram routing to db_for_read, db_for_write, allow_relation, and allow_migrate

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 13:20:40 +01:00
pi-ux-ce ec2696ee43 just add a testing loop to clean messages, will be deleted after testing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-30 10:56:50 +01:00
pi-ux-ce 52ba892d6f some news for podcats mostly calling telegram directly 2026-06-30 10:56:25 +01:00
pi-ux-ce 5478a1032c we can send messages through telegram now 2026-06-30 10:12:44 +01:00
pi-ux-ce b11c840688 add some debug 2026-06-30 09:50:51 +01:00
pi-ux-ce 15994f11b1 able to downlaod podcast mp3 2026-06-30 09:49:46 +01:00
pi-ux-ce b5c3aa1bdb Merge pull request 'revoke keys and replace them by env variable' (#15) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m36s
Reviewed-on: #15
2026-06-25 22:27:28 +00:00
pierre geeraert 623bc9b74e revoke keys and replace them by env variable
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-25 23:09:37 +01:00
pi-ux-ce 6a6b0a0167 Merge pull request 'testing' (#14) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 14m51s
Reviewed-on: #14
2026-06-25 21:24:06 +00:00
pi-ux-ce ad9c6c7a2a adding the unseen all option
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-25 16:01:08 +01:00
pi-ux-ce 25b602a3b8 update requirements
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-25 14:03:35 +01:00
pi-ux-ce ed70f03a83 add options for the admin page
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-06-25 13:56:25 +01:00
pi-ux-ce e76fb6684c adding &bulk=false to avoid as If specified, all previous episodes will also be marked as watched (default true) 2026-06-25 13:56:01 +01:00
pierre geeraert 2454d77ce8 last bit added
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-24 23:57:22 +01:00
pierre geeraert 5432647293 some code were usefull
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-24 23:51:12 +01:00
pierre geeraert 14d2e869bb remove unnecessary code
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-24 23:29:14 +01:00
pierre geeraert ce9072124d add quite some betaserie work 2026-06-24 23:25:38 +01:00
pierre geeraert f78ffcc595 add quite some bitwarden work 2026-06-24 23:25:24 +01:00
pierre geeraert 57d2559ad3 more work on bitwarden
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-24 11:42:53 +01:00
pierre geeraert 024736c887 work in progress , stil need to turn everything into a class
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-23 23:46:00 +01:00
pierre geeraert 73f57871b4 settings
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 21:52:47 +01:00
pierre geeraert cf0c355416 add some settings
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 21:33:28 +01:00
pierre geeraert 54c53d4510 add some settings 2026-06-22 21:32:17 +01:00
pi-ux-ce 5e247e831c enable multiple urls
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 11:53:56 +01:00
pi-ux-ce ecaa988b5f remove migrations files
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 11:45:15 +01:00
pi-ux-ce 73c89d8d93 work on new app
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 11:43:38 +01:00
pierre geeraert 1a41a01dfa need to make some try
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 10:54:03 +01:00
pi-ux-ce 5d26a4dd05 add new app
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 10:28:56 +01:00
pi-ux-ce 956e7fc1d0 Duplicate host name: redirect
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 09:42:33 +01:00
pi-ux-ce 73101d8cb9 add alias for testing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-22 09:37:09 +01:00
pierre geeraert 78cc6cbad3 make python version match testing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 11m10s
2026-06-21 23:00:25 +01:00
pierre geeraert ec5eadac06 use the right function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m25s
2026-06-21 22:42:56 +01:00
pierre geeraert f22a33ad1a also remove function then
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m9s
2026-06-21 22:33:50 +01:00
pierre geeraert f28a9096f7 fix function for date and import
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-06-21 22:32:02 +01:00
pierre geeraert 0216a9f1e1 fix function for date and import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m6s
2026-06-21 22:21:55 +01:00
pierre geeraert bb642c781a type object 'redirectData' has no attribute 'create'
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m48s
2026-06-21 22:06:13 +01:00
pi-ux-ce 0af676ec39 Merge pull request 'no need for migration if the DB doesn't exist' (#13) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m7s
Reviewed-on: #13
2026-06-21 20:39:15 +00:00
pierre geeraert e93f00321e no need for migration if the DB doesn't exist
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-21 21:38:19 +01:00
pi-ux-ce 565a381977 Merge pull request 'testing' (#12) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m24s
Reviewed-on: #12
2026-06-21 20:30:30 +00:00
pierre geeraert 914e1c691f write down every time redirect adds something
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-21 21:23:20 +01:00
pierre geeraert e153be4b58 write down every time redirect adds something 2026-06-21 21:21:54 +01:00
pierre geeraert 6cacd1a2cf add import_export into requirement
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-21 20:12:38 +01:00
pierre geeraert eecdb55ba0 add import_export into requirement
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-21 20:11:37 +01:00
pierre geeraert 4de2cbf1bc renaming to core
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-21 19:57:39 +01:00
pierre geeraert aff4debd79 add import/export
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-21 19:52:22 +01:00
pi-ux-ce 022ad01ace don't forgot to clear thge quyeryset before running this
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-19 16:43:28 +01:00
pi-ux-ce cda89ea243 add deploy import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-19 16:41:13 +01:00
pi-ux-ce aa0939be6d add namespace import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-19 15:58:38 +01:00
pi-ux-ce e74b659b45 Add action to crate new entry
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-19 11:04:35 +01:00
pi-ux-ce f522b69a68 add scale down
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-18 17:41:51 +01:00
pi-ux-ce ef7b47b0c5 Try to start a deploy using admin interface
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 17:26:50 +01:00
pi-ux-ce 3d8fc1d848 remove import export as it failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 17:06:11 +01:00
pi-ux-ce 5820be065c remove import export as it failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 17:04:45 +01:00
pi-ux-ce 5ee60c8324 Add import_export pip package
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 17:00:24 +01:00
pi-ux-ce 4918d968b7 work on the import/export and static
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 11:07:09 +01:00
pi-ux-ce 75e172c7c0 work on the import/export 2026-06-18 11:05:02 +01:00
pi-ux-ce 9ad042b371 removing cloudmanager_old
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 10:38:05 +01:00
pi-ux-ce ed240d3cd0 having to change the admin direction due to no router
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-18 10:26:09 +01:00
pi-ux-ce 2da9e9390d 🗑️ cleaning
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-17 18:59:14 +01:00
pi-ux-ce 47bf1d40f9 cleaning 2026-06-17 18:51:05 +01:00
pi-ux-ce 256cc8cd71 simpsons redirection working 2026-06-17 18:48:22 +01:00
pi-ux-ce 51769fb08a avoid untracked files
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-17 14:54:01 +01:00
pi-ux-ce 555b222d6b try another method
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-06-17 13:46:24 +00:00
pi-ux-ce cf26fa90d3 remove pycache
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-17 14:41:39 +01:00
pi-ux-ce 0cce30b7d2 point to DB instead fo sqllite
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-17 14:39:36 +01:00
pi-ux-ce 200fea731c remove all codes
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-17 14:34:33 +01:00
pi-ux-ce 0eca15a19b dispaly data for cloudmanager in admin 2026-06-17 14:18:43 +01:00
pierre geeraert fbe38faf59 downgrade python to 3.12 instead of 3 latest
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-16 21:08:38 +01:00
pierre geeraert 0015e105f9 django-bootstrap-v5 1.0.11 depends on django<5.0 and >=2.2 2026-06-16 21:06:26 +01:00
pierre geeraert 3dc8cce37a upgrade django version as well
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-16 21:04:19 +01:00
pierre geeraert 090eeccf8c add https for the CORS setting 2026-06-16 20:58:09 +01:00
pi-ux-ce 17a7e173fe work on django admin
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 33s
2026-06-16 10:26:17 +01:00
pierre geeraert 8d52c43e68 data work inside the view
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-15 23:01:21 +01:00
pi-ux-ce 3eb7fd44e5 Merge pull request 'testing' (#10) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m30s
Reviewed-on: #10
2026-06-15 19:22:44 +00:00
pierre geeraert 8c09ab3c6e trying to fix the redirect url
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-15 20:20:27 +01:00
pierre geeraert 19665ea0b7 update readme
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m22s
2026-06-15 09:59:43 +01:00
pi-ux-ce 7d4a1897f7 remove pycache files
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-12 11:50:14 +01:00
pi-ux-ce 72ab577431 try to trigger new build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-12 11:16:48 +01:00
pi-ux-ce 535617594f try to trigger new build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-12 11:05:49 +01:00
pi-ux-ce 1230cac914 add tags in the build process
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-12 11:04:18 +01:00
pi-ux-ce a3d5c16484 try to trigger new build
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-06-12 10:57:06 +01:00
pi-ux-ce 29ea329ed5 remove python cache
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-12 10:03:02 +01:00
pi-ux-ce d719af498c reset testing branch 2026-06-12 10:02:37 +01:00
pi-ux-ce b118391dc6 reset testing branch 2026-06-12 09:59:20 +01:00
pi-ux-ce 17d2f3544c wrong cache image
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m37s
2026-06-12 09:54:05 +01:00
pi-ux-ce 25ba693bbd use sqllite as default db for building purpose
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m53s
2026-06-12 09:49:18 +01:00
pi-ux-ce e5406b6549 Merge pull request 'testing' (#9) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 6m52s
Reviewed-on: #9
2026-06-12 08:29:43 +00:00
pi-ux-ce 5fa8ad286f application not renamed
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-12 08:29:30 +01:00
pierre geeraert d3061eddaf work on databse model
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-11 22:12:00 +01:00
pierre geeraert 883e028cae refactoring
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-11 20:18:59 +01:00
pierre geeraert 2f4b93d11c removing print function 2026-06-11 20:17:51 +01:00
pierre geeraert 57d7e8feee removing print function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-11 20:16:07 +01:00
pierre geeraert dd3b0b7731 removing cloudmanager_old
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-11 19:52:20 +01:00
pierre geeraert c86301c9b2 refactoring
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-11 19:51:19 +01:00
pierre geeraert 3079df9072 refactoring
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-11 19:19:15 +01:00
pi-ux-ce 1c04605dc7 prototype fo namespace import
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-06-11 11:51:12 +01:00
pierre geeraert 2b8a4ed46f try again something new
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-09 22:55:46 +01:00
pierre geeraert 622f2c8758 try again something new
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-09 22:52:24 +01:00
pierre geeraert 4e6637aba9 Revert "try new method"
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
This reverts commit c6784759cd.
2026-06-09 22:47:54 +01:00
pierre geeraert c6784759cd try new method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-09 22:45:07 +01:00
pierre geeraert 55f27433f9 try new method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-09 22:41:51 +01:00
pierre geeraert 2dd02f0632 try new method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-09 22:40:03 +01:00
pierre geeraert 5d4bc9e93b try new method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-06-09 22:37:54 +01:00
pierre geeraert ccb69a43d2 try new method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-06-09 22:36:20 +01:00
pierre geeraert 36755ccfb0 add the missing return
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-06-09 21:46:58 +01:00
pierre geeraert 27dff192f2 now the template adapt depending of the data and tries ajax button without success
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-31 00:25:56 +01:00
pierre geeraert e9dad6bfe5 adding alot of template files
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-30 23:40:49 +01:00
pierre geeraert 69d161c19b finding how to target the good one
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-27 00:18:58 +00:00
pierre geeraert 103dcc919e fix scale down and add the down query
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-27 00:08:49 +00:00
pierre geeraert 3eea2ea4a2 need to add the request
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-27 00:05:43 +00:00
pierre geeraert d0a948e93f I was meant to fix it from the start
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-27 00:02:02 +00:00
pierre geeraert 2a3c71f939 adding weekday input
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-26 23:58:29 +00:00
pierre geeraert 8caa778ee0 add servers down as well
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-26 23:56:39 +00:00
pierre geeraert 5521b70e46 adding custom DB name for the terraform secret that point to the django db not the cmm one
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-26 23:44:59 +00:00
pierre geeraert c8d784ae2b using env variable for DB creds
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-26 23:21:52 +00:00
pierre geeraert 910170b594 found the bit of code that deals with days
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-25 23:14:20 +00:00
pierre geeraert 4dee3442b0 actually easy fix
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-25 22:54:55 +00:00
pierre geeraert b38f2a8b2f adding all the files , still work in progress but getting there , needs to move scale_up function to somrthing not managed by REQUEST 2026-03-25 22:53:36 +00:00
pierre geeraert 1e8afcbc44 adding the sql code for the template
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-25 22:00:44 +00:00
pierre geeraert 9e2b51de60 adding some mysql function to convert to postgresal
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-17 23:26:08 +00:00
pierre geeraert eb0f467aad Merge branch 'testing' of https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube into testing 2026-03-17 22:57:20 +00:00
pi-ux-ce da4b86f4d3 no need this anymore
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2026-03-17 10:31:21 +00:00
pi-ux-ce b5ef38bc0d try gemini ai idea
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m48s
2026-03-17 10:26:34 +00:00
pi-ux-ce c5b7e9dcde moving the env variables
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m55s
2026-03-17 10:13:24 +00:00
pi-ux-ce b611d41e8a moving the env variables
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3m41s
2026-03-17 09:51:14 +00:00
pi-ux-ce c3ba43b0fa moving the env variables 2026-03-17 09:47:51 +00:00
pierre geeraert dc0e006e0f change link
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m32s
2026-03-16 23:26:42 +00:00
pierre geeraert 0b66858969 also try for the icon url
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m44s
2026-03-16 23:11:48 +00:00
pierre geeraert 16c8fba623 trying to variablise the title of the blank page
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-03-16 23:08:44 +00:00
pierre geeraert 852fccd95c remove extra slash
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m36s
2026-03-16 23:04:11 +00:00
pierre geeraert 316d07db61 default page is set and button to got to favorite ones
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m52s
2026-03-16 22:55:19 +00:00
pierre geeraert bf99f618f6 fetch only latest commit from main branch
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m43s
2026-03-16 22:09:19 +00:00
pierre geeraert 534f0cb7cb move the vars
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m37s
2026-03-16 21:59:35 +00:00
pierre geeraert 974f6820d4 move the vars 2026-03-16 21:53:47 +00:00
pierre geeraert 6ccf910e29 add env variable
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3m5s
2026-03-16 21:47:03 +00:00
pierre geeraert aaf1ced21c emulate some variables 2026-03-16 21:45:47 +00:00
pi-ux-ce d05a3e2dc6 Merge pull request 'testing' (#8) from testing into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m7s
Reviewed-on: #8
2026-03-16 21:06:42 +00:00
pierre geeraert 8be8b44584 also variablize DEBUG
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 21:03:28 +00:00
pierre geeraert 4a028c04c9 fix the extra s
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:59:41 +00:00
pierre geeraert 1f1d7ab75d convert it to list
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:59:11 +00:00
pierre geeraert e0e5d9e290 trying to variablise allowed_hosts
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:33:46 +00:00
pierre geeraert 181eb67501 remove useless imports
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:21:28 +00:00
pierre geeraert 8af976c528 change path as well
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:16:01 +00:00
pierre geeraert beba1f16b4 changing path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-03-16 20:14:47 +00:00
pierre geeraert 76d0cbdb8d default url
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:03:53 +00:00
pierre geeraert 6ff0bb31d3 fix name of the module
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 20:03:20 +00:00
pierre geeraert e78825b99f importnt first argument
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 19:57:06 +00:00
pi-ux-ce 33a9d6fec7 d
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2026-03-16 18:36:55 +00:00
pi-ux-ce b01145e6bd adding nano
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m40s
2026-03-16 18:33:22 +00:00
pi-ux-ce 06024c82c1 trying like that
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 18:30:37 +00:00
pi-ux-ce ce4a4838f1 adding required value
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-03-16 18:26:03 +00:00
pi-ux-ce f80cfbeba7 adding required value
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 18:24:15 +00:00
pi-ux-ce 61e5966083 missed requirements
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2026-03-16 18:18:46 +00:00
pi-ux-ce f49a606693 trying this url conf
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 18:13:52 +00:00
pi-ux-ce 2b866b32bb enable redirect..tryton.geeraert.eu
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
2026-03-16 17:50:55 +00:00
pi-ux-ce 97896b5170 changing the authorised URL
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2026-03-16 14:50:49 +00:00
pi-ux-ce 3647ff15e1 trying to trigger a new image
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2026-03-16 14:42:55 +00:00
pi-ux-ce 267f753452 using the testing branch
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-03-16 14:36:44 +00:00
pi-ux-ce c33e463e09 addign a restart after restarT
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-03-16 14:32:41 +00:00
pi-ux-ce 40cfc3c9f5 prevent main runner to run if there was a testing change 2026-03-16 14:21:39 +00:00
pi-ux-ce 632ba5257e fixing image name
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m39s
2026-03-16 10:42:57 +00:00
pi-ux-ce 7127effdaf trying to setup the django testing image 2026-03-16 10:39:26 +00:00
pi-ux-ce ca3f7e964e change title page
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m2s
2026-03-03 23:12:26 +00:00
pi-ux-ce 904e779b59 changing the extra >
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m23s
2026-03-03 22:55:55 +00:00
pi-ux-ce 63054b4a3a adding some print
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m56s
2026-02-05 20:11:01 +00:00
pi-ux-ce 871f3c5ba8 put lower var
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7m54s
2026-02-03 14:51:21 +00:00
pi-ux-ce 9c706bb9b1 Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m14s
2026-01-20 00:02:19 +00:00
pi-ux-ce 06c57ca837 try v6
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2s
2026-01-19 23:55:53 +00:00
pi-ux-ce 39a3ec055b try again
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 23:54:36 +00:00
pi-ux-ce 401cf8e1a7 Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 10s
2026-01-19 23:46:19 +00:00
pi-ux-ce f50d624d22 set git location
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 10s
2026-01-19 23:45:27 +00:00
pi-ux-ce 4aeee1acb5 manually git pull
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7s
2026-01-19 23:43:31 +00:00
pi-ux-ce b6a9cfed19 do not clean before checkout
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 23:36:15 +00:00
pi-ux-ce a67dcf763b trigger new build
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 23:31:52 +00:00
pi-ux-ce 0f58c2dcae only if present
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m12s
2026-01-19 20:53:13 +00:00
pi-ux-ce 9cb1418b0d avoid crashing if no source file
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 10s
2026-01-19 20:48:49 +00:00
pi-ux-ce f62e6ca651 trying to cache git folder
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 8s
2026-01-19 20:47:06 +00:00
pi-ux-ce 0c6ddd4904 trying host_runner
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m38s
2026-01-19 19:46:48 +00:00
Pierre Geeraert 14d4dbfe97 update runner to add curl
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 17:53:28 +00:00
Pierre Geeraert 50d0c2cd4d debug
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m57s
2026-01-19 17:43:25 +00:00
Pierre Geeraert 4fe45169c3 try with the exact version of the runner
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m36s
2026-01-19 17:40:43 +00:00
Pierre Geeraert 78d93a16eb remove kubeconfig
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 23s
2026-01-19 17:25:50 +00:00
Pierre Geeraert b94bf528be display kubeconfig
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 17:23:49 +00:00
Pierre Geeraert 11ad57bce4 no need to download docker.io as the base image is doing it now 2026-01-19 17:16:07 +00:00
Pierre Geeraert 495a55f8c1 try to install docker
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7m17s
2026-01-19 16:54:55 +00:00
Pierre Geeraert c611360c04 try debug
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 29s
2026-01-19 16:52:17 +00:00
Pierre Geeraert ada418374b trying gitea.tryton.geeraert.eu/pi-ux-ce/custom-runner-debian-slim:latest
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 35s
2026-01-19 15:57:09 +00:00
Pierre Geeraert 3bf7f2a195 trying to use debian
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m41s
2026-01-19 13:46:25 +00:00
pi-ux-ce 2d22cab6e7 changing to debian image
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-19 11:54:38 +00:00
pi-ux-ce 96dcbe1798 Update django_code/django_code/urls.py
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m14s
2026-01-08 23:58:04 +00:00
pi-ux-ce ac6dc5b426 revert e2d3868a9e
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m58s
revert add prowlarr script in tash until I create a prowlarr project with celery
2026-01-08 23:53:12 +00:00
pi-ux-ce b4f22ffeea update due to some errors
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m14s
2026-01-08 23:42:30 +00:00
pi-ux-ce ca3ed630ed adding the URL
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m42s
2026-01-08 23:34:27 +00:00
pi-ux-ce e2d3868a9e add prowlarr script in tash until I create a prowlarr project with celery
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2026-01-08 23:31:22 +00:00
Pierre Geeraert 47314620be can only concatenate str (not bytes) to str
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m35s
2026-01-07 17:57:22 +00:00
Pierre Geeraert f26f3f2665 try a new function with clearing the key
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m45s
2026-01-07 13:42:47 +00:00
Pierre Geeraert 938b37e920 add some comments
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m52s
2026-01-07 13:31:57 +00:00
Pierre Geeraert 2c5a989306 fix syntax error
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m1s
2026-01-07 13:19:24 +00:00
Pierre Geeraert 88a6dd9316 adding the default page in case there is no redis entry
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m12s
2026-01-07 12:08:03 +00:00
Pierre Geeraert 77742c1d6f ubuntu-slim wasn't working
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m33s
2025-12-09 10:20:21 +00:00
Pierre Geeraert ba16c6475a Merge branch 'main' of https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
2025-12-09 09:50:42 +00:00
Pierre Geeraert 1735098b3a trying ubuntu-slim 2025-12-09 09:49:49 +00:00
pierre geeraert 2fdaaa47ab f you are just trying to redirect to an absolute URL stored in Redis, your code should work provided the string is clean.
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m58s
A robust way to ensure it's treated as a simple URL might involve using Django's HttpResponseRedirect directly instead of the redirect shortcut:
2025-12-08 23:44:06 +00:00
pierre geeraert bd4e4aed27 try to debug it
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m1s
2025-12-08 23:34:41 +00:00
pierre geeraert 94a8240ad4 In Django, the <str:key> part of your URL pattern is designed to capture a value from the URL (e.g., if someone visits /redirect/go/xyz123) and pass it to the view function as a keyword argument named key.
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m51s
2025-12-08 23:22:27 +00:00
pierre geeraert be03af61ea prepare new function
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m44s
2025-12-08 23:14:34 +00:00
pierre geeraert 4da34c98f3 forgot dependencies
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m15s
2025-12-08 23:05:49 +00:00
pierre geeraert 12253f0621 try to work on the redirection
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m8s
2025-12-08 23:00:46 +00:00
Pierre Geeraert 369954f5d2 changing form submit path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m3s
2025-12-08 09:16:20 +00:00
pierre geeraert 4eee702dce add the comment for later review
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m0s
2025-12-07 23:46:59 +00:00
pierre geeraert e90daa2e61 forgot the url
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m19s
2025-12-07 23:39:45 +00:00
pierre geeraert cc8570d02f adding reddit downloader
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m48s
2025-12-07 23:22:46 +00:00
Pierre Geeraert 98e5ea965c forgot one variable
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m59s
2025-12-05 11:16:44 +00:00
Pierre Geeraert 7a98ab1c6d cache seems good , doing a test
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m49s
2025-12-05 11:12:30 +00:00
Pierre Geeraert 70973a63fb frogot the step to move the cache
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2m36s
2025-12-05 10:30:33 +00:00
Pierre Geeraert ad82f73c1d promising solution using volume mount
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 10:24:44 +00:00
Pierre Geeraert e08016c103 promising solution using volume mount
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 10:08:57 +00:00
Pierre Geeraert a65e99b199 another test
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 10:04:07 +00:00
Pierre Geeraert 4853150f07 another test
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
2025-12-05 10:02:22 +00:00
Pierre Geeraert a341e66c13 another test
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-05 09:53:55 +00:00
pierre geeraert 874779d230 now reverting
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m15s
2025-12-04 23:52:19 +00:00
pierre geeraert 779e8a8b0f to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:46:47 +00:00
pierre geeraert 8f35e88ce4 to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:42:58 +00:00
pierre geeraert 71e874cfb4 to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:40:27 +00:00
pierre geeraert 622b8942b5 to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:40:16 +00:00
pierre geeraert 7aeb7d094c to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 27s
2025-12-04 23:39:10 +00:00
pierre geeraert 4ee80f8b7e to revert, just a try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:37:57 +00:00
pierre geeraert 4859fa6877 No matching distribution found for json
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m2s
2025-12-04 23:17:56 +00:00
pierre geeraert a1d831cdf2 another cache try
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 23:17:08 +00:00
pierre geeraert a3ee639d77 put the steps for a reddit downloader
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m1s
2025-12-04 22:59:15 +00:00
pierre geeraert cd274aea81 change path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m49s
2025-12-04 19:59:53 +00:00
Pierre Geeraert aaa548eb21 1.651 IndentationError: unindent does not match any outer indentation level
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m22s
2025-12-04 18:08:51 +00:00
Pierre Geeraert 99f05a055d add the retry function
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m46s
2025-12-04 17:00:48 +00:00
Pierre Geeraert e614d50f9c also clean .gitea/python_build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m55s
2025-12-04 16:54:01 +00:00
Pierre Geeraert 20526c829c revert everything
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 16:53:18 +00:00
pi-ux-ce c9ed33f108 Merge pull request 'addign this for the syntax but this solution is too slow' (#6) from revert-caching into main
Gitea Actions Demo / changes (push) Successful in 24s
Gitea Actions Demo / Build-dockerfile (push) Has been cancelled
Gitea Actions Demo / Explore-Gitea-Actions (push) Has started running
Reviewed-on: #6
2025-12-04 16:50:07 +00:00
Pierre Geeraert 4d728c8e68 addign this for the syntax but this solution is too slow
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
Gitea Actions Demo / changes (push) Has been cancelled
Gitea Actions Demo / Build-dockerfile (push) Has been cancelled
2025-12-04 16:44:46 +00:00
Pierre Geeraert ef3aed4ba2 Good now , but still long, let's try again
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m52s
2025-12-04 16:24:33 +00:00
Pierre Geeraert 8f30fdb88c should be good now
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m53s
2025-12-04 16:16:31 +00:00
Pierre Geeraert d4b67906cd try again the path
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m29s
2025-12-04 16:03:56 +00:00
Pierre Geeraert 075fa32ea2 shunt as I need this to run to debug first
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m20s
2025-12-04 16:00:50 +00:00
Pierre Geeraert f71f678662 fix path
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 16:00:02 +00:00
Pierre Geeraert 457857df32 changing gitignore
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m7s
2025-12-04 15:57:03 +00:00
Pierre Geeraert 49adc84f5c cache issue 2025-12-04 15:56:33 +00:00
Pierre Geeraert a2a9a8c3a0 renaming dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m16s
2025-12-04 15:53:11 +00:00
Pierre Geeraert a62db898aa fixing path
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m14s
2025-12-04 15:50:08 +00:00
Pierre Geeraert a2a6e5c5fe avoid runnign if requirements is modified
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m20s
2025-12-04 15:15:28 +00:00
Pierre Geeraert b9307efba2 work on a different workflow just for requirements 2025-12-04 15:06:03 +00:00
Pierre Geeraert 52ccff4086 try different caching method
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m40s
2025-12-04 14:24:29 +00:00
Pierre Geeraert 7f59856da3 adding share_task
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 14:21:26 +00:00
Pierre Geeraert 10dc913080 adding the check_and_create_destination_folder function but not applied yet to incremental
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-04 14:17:09 +00:00
Pierre Geeraert 1d2f190459 rename url var
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m17s
2025-12-04 11:42:14 +00:00
Pierre Geeraert 859ab9cfaf add proxy on the othe rrequest as well
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m9s
2025-12-04 11:34:32 +00:00
Pierre Geeraert 924d3dabb9 add proxy on requests module
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m15s
2025-12-03 12:41:50 +00:00
Pierre Geeraert b227337ced 1.526 SyntaxError: expected ':'
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m2s
2025-12-03 12:27:18 +00:00
Pierre Geeraert 717ffb4b8a urlparse was its own built-in (i.e., NOT pip-installable) module in Python 2, and was moved to urllib.parse
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m45s
2025-12-03 12:17:13 +00:00
Pierre Geeraert 08121fc701 remove Webcal-python/
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3m55s
2025-12-03 12:10:01 +00:00
Pierre Geeraert 460f18d85a add proxy for the first part and try to develop the second part 2025-12-03 12:08:56 +00:00
pierre geeraert 6c34d510e5 forgot requirements
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m2s
2025-12-02 23:04:55 +00:00
pierre geeraert 789fc8bcbc we are now able locally to get all albums and go through all of them and get the images links
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 6m19s
2025-12-02 22:41:52 +00:00
pierre geeraert 31e72f28b0 change URL for incremental and add the beginning of the new album downloader
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 6m9s
2025-12-02 22:23:40 +00:00
pierre geeraert 3d0b87998d add new stuff
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m27s
2025-12-02 21:33:15 +00:00
pierre geeraert 6c7b9a4ad8 add stash listing
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m32s
2025-12-02 21:24:05 +00:00
Pierre Geeraert f4379b07ca TypeError: can only concatenate str (not int) to str
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m59s
2025-12-02 18:01:43 +00:00
Pierre Geeraert 55364da10b add some print
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m7s
2025-12-02 17:39:15 +00:00
Pierre Geeraert e28b34b49b 10.42 ERROR: No matching distribution found for os
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m13s
2025-12-02 17:21:37 +00:00
Pierre Geeraert 7ce3167d57 import os
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5m54s
2025-12-02 17:13:57 +00:00
Pierre Geeraert b0b9ae068a use path join and create the destination folder 2025-12-02 17:13:25 +00:00
Pierre Geeraert 54349b4e8a cleanup 2025-12-02 17:03:30 +00:00
Pierre Geeraert 2483e71d98 try https
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m31s
2025-12-02 16:45:04 +00:00
Pierre Geeraert 6b46873009 swithc from socks to http
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m14s
2025-12-02 16:35:16 +00:00
Pierre Geeraert 685a76bdd1 fixing imports with urlrequest
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m19s
2025-12-02 15:57:48 +00:00
Pierre Geeraert 933a8bf3c8 changing proxy setup
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m13s
2025-12-02 15:40:02 +00:00
Pierre Geeraert e228d20d0b convert str to INT for the loop
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m43s
2025-12-02 15:06:58 +00:00
Pierre Geeraert 19ec49778e fix mistake
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m51s
2025-12-02 11:34:39 +00:00
Pierre Geeraert 17dbe04c4b restart celery as well
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3m42s
2025-12-02 11:29:12 +00:00
Pierre Geeraert e5404fa1b9 add ceery_imports 2025-12-02 11:27:29 +00:00
pi-ux-ce f6506aeeca Update dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m53s
2025-12-02 11:13:21 +00:00
pi-ux-ce 795720dcd2 changing redis hostname
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m48s
2025-12-02 11:06:00 +00:00
pi-ux-ce 85962b11a6 adding some cache for PIP
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m45s
2025-12-02 10:47:20 +00:00
pi-ux-ce c1229b348e Update django_code/stash_management/apps.py
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 8m49s
2025-12-02 10:33:13 +00:00
pi-ux-ce 06358c4c07 Update django_code/django_code/wsgi.py
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-02 10:29:12 +00:00
pi-ux-ce fffde38fed Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m39s
2025-12-02 10:01:47 +00:00
pi-ux-ce 13bfc40c6a Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 46s
2025-12-02 09:57:19 +00:00
pi-ux-ce 9024a1eab6 Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 46s
2025-12-02 09:55:09 +00:00
pierre geeraert aa851a7779 fix mistake
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 8m18s
2025-12-02 00:54:20 +00:00
pierre geeraert ac3d20d072 work on the versionning
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 56s
2025-12-02 00:52:08 +00:00
pierre geeraert 02f16516f1 work on the versionning
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 59s
2025-12-02 00:47:42 +00:00
pierre geeraert c8301113e5 work on the versionning
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-02 00:47:13 +00:00
pierre geeraert 73fd35ad40 caching python3 image
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 11m24s
2025-12-02 00:31:05 +00:00
pi-ux-ce 996ed3d776 Update dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-02 00:27:30 +00:00
pierre geeraert 05feced28f make things faster
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m37s
2025-12-02 00:20:37 +00:00
pi-ux-ce fe844437fb Update dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m32s
2025-12-02 00:13:53 +00:00
pi-ux-ce 3de05c08bc Update dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m6s
2025-12-02 00:07:44 +00:00
pi-ux-ce e6509e0932 try new git action
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 2m9s
2025-12-02 00:02:28 +00:00
pi-ux-ce ce95ed4854 try new dockerfile
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-02 00:00:40 +00:00
pierre geeraert 3bf2d553c8 fix improt
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7m51s
2025-12-01 23:49:03 +00:00
pierre geeraert b3fb490c16 rename celery file
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 8m37s
2025-12-01 23:38:31 +00:00
pierre geeraert 5e8c2c73fd try new proxy
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 7m40s
2025-12-01 23:26:11 +00:00
pierre geeraert a75aabbec6 enable celery
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-12-01 23:16:55 +00:00
pierre geeraert 583522a422 breakthrough with the increment
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 17m20s
2025-11-27 23:25:42 +00:00
pierre geeraert a9b4a95e0c try
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m59s
2025-07-31 22:23:32 +01:00
pierre geeraert 8b68d52be0 try
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 9m24s
2025-07-31 22:00:56 +01:00
pierre geeraert 8f52aca2b4 try the unbuffered 2025-07-31 21:47:13 +01:00
pierre geeraert 744f920854 wrong copy/paste
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 7m49s
2025-07-31 21:09:41 +01:00
pierre geeraert fe43d274cb change process
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 6m56s
2025-07-31 20:56:46 +01:00
pierre geeraert 53f4c17a08 fix ident
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 8m14s
2025-07-31 20:13:22 +01:00
pierre geeraert f728cdafb4 try to integrate extra URLs
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 6m21s
2025-07-31 20:02:46 +01:00
pi-ux-ce 21b4b9b7fb Merge pull request 'use_external_url' (#5) from use_external_url into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m46s
Reviewed-on: #5
2025-07-31 18:27:38 +00:00
pi-ux-ce 87a5e40e3e Update django_code/stash_management/apps.py
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-07-31 18:26:34 +00:00
pi-ux-ce bf7f831c42 Update django_code/dashboard/templates/stash_form.html
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-07-31 18:23:51 +00:00
pi-ux-ce f74a1a7076 🎨 cleanup useless variables
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m42s
2025-07-30 12:48:34 +00:00
pi-ux-ce 6c9c0ffad2 fixing mistake
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m8s
2025-07-29 23:18:28 +00:00
pi-ux-ce 4b1d75b1ba working change
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4m57s
2025-07-29 23:08:30 +00:00
pi-ux-ce 6f06f7d657 working but work in progress for templating
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m25s
2025-07-29 22:36:50 +00:00
Pierre Geeraert 91c4928ec7 add namespace and purge
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m55s
2025-07-29 11:27:47 +01:00
pi-ux-ce 9ce785014d Merge pull request 'adding new form' (#4) from stash_from into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m7s
Reviewed-on: #4
2025-07-29 08:57:36 +00:00
Pierre Geeraert e139dcea35 remove useless files
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m48s
2025-07-29 09:54:07 +01:00
Pierre Geeraert adb18644ee change .gitignore
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m20s
2025-07-29 09:46:47 +01:00
Pierre Geeraert bccd344aa7 adding new form
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-07-29 09:39:41 +01:00
pierre geeraert 3315fbdb4f change the DB settings and change the policy to restart after build
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m27s
2025-06-22 19:24:22 +01:00
pierre geeraert 5bbe4c5c61 work on the simpsons generator using the DB
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6m57s
2025-06-22 19:14:36 +01:00
Pierre Geeraert 2366d0c2a8 Revert "try without the cache git actions"
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m41s
This reverts commit a4d9f63568.
2025-06-03 11:48:12 +01:00
Pierre Geeraert a4d9f63568 try without the cache git actions
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-06-03 11:46:04 +01:00
Pierre Geeraert 496f2b3bfb modify cache directory
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m56s
2025-06-03 11:39:40 +01:00
Pierre Geeraert cb7a010fb6 modify cache directory
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-06-03 11:20:14 +01:00
Pierre Geeraert 5b5093708d modify cache directory
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-06-03 11:12:46 +01:00
Pierre Geeraert 975252656f modify cache directory
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m23s
2025-06-03 11:07:43 +01:00
Pierre Geeraert 0b7da7a5c9 cache works but I want local
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4m30s
2025-06-03 10:57:01 +01:00
Pierre Geeraert 4e70e2d28d change key for git action cache
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5m19s
2025-06-03 10:48:40 +01:00
Pierre Geeraert 705db14521 commenting ,from=pip_cache 2025-06-03 10:47:34 +01:00
Pierre Geeraert 5b5d62e4fa commenting build-contexts
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 57s
2025-06-03 10:45:53 +01:00
Pierre Geeraert 9afe770202 try to use cache
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 1m40s
2025-06-03 10:43:15 +01:00
Pierre Geeraert 6a52ed2f66 try to use cache
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m20s
2025-06-03 10:28:43 +01:00
pierre geeraert 279d59e376 change the action
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m14s
2025-06-02 23:54:34 +01:00
pierre geeraert a6d9f29f1a change the action 2025-06-02 23:52:20 +01:00
pierre geeraert bb36edfca5 change the action 2025-06-02 23:51:27 +01:00
pierre geeraert f451b8ff3b change the action 2025-06-02 23:50:30 +01:00
pierre geeraert b837e1a952 change the action
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3m3s
2025-06-02 23:41:01 +01:00
pierre geeraert aa1501214d update the number of replicas 2025-06-02 23:37:56 +01:00
pierre geeraert 246eff86a6 test the action
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 44s
2025-06-02 23:13:12 +01:00
pierre geeraert e2ea76c6c9 change the action 2025-06-02 23:12:21 +01:00
pierre geeraert ad4fe6df26 change the action 2025-06-02 23:10:30 +01:00
pierre geeraert 43a000a9c1 fixing the wrong redirect
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 32s
2025-06-02 23:04:03 +01:00
pierre geeraert 32a0e65a68 forgot to remove the baseurl var
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 26s
2025-06-02 22:54:14 +01:00
pierre geeraert b80be01a52 change the config file
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 24s
2025-06-02 22:47:01 +01:00
pi-ux-ce daa935bbef update the secret for kubeconfig
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 26s
2025-06-02 22:39:49 +01:00
pierre geeraert cb49bfba58 change the config file
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 27s
2025-06-02 22:38:26 +01:00
pierre geeraert 60af5e87ce adding views for kubernetes connection
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 26s
2025-06-02 22:19:02 +01:00
Pierre Geeraert aad687f630 enable more view effects
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 26s
2025-06-02 17:38:48 +01:00
pi-ux-ce 6b30f381df Merge branch 'main' of https://gitea.tryton.geeraert.eu/pi-ux-ce/Django_kube
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 35s
2025-06-02 14:40:48 +01:00
Pierre Geeraert 5b03dc35b4 add urls for view
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 25s
2025-06-02 14:01:34 +01:00
pi-ux-ce f9732160f0 try to use only the code from the docker image
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 24s
2025-06-02 13:59:10 +01:00
Pierre Geeraert 8a84a8d42f works on the view
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 27s
2025-06-02 13:52:01 +01:00
Pierre Geeraert 39e6a69a08 fix the syntax error
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 27s
2025-06-02 10:58:21 +01:00
pi-ux-ce c9d6d77931 dependencies for bootstrap
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 26s
2025-06-02 09:39:05 +00:00
pi-ux-ce 2f30234edd Update requirements.txt
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 34s
2025-06-02 09:01:05 +00:00
pi-ux-ce cdd1dd0245 Update .gitea/workflows/dockerfile_runner.yaml
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 28s
2025-06-02 08:40:36 +00:00
pi-ux-ce df9d6c93cc Merge pull request 'working on views' (#1) from view into main
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 30s
Reviewed-on: #1
2025-06-02 08:36:25 +00:00
474 changed files with 88435 additions and 493 deletions
+10
View File
@@ -0,0 +1,10 @@
.git
.github
**/__pycache__
*.pyc
.pytest_cache
media
staticfiles
*.sqlite3
node_modules
.env
+73 -15
View File
@@ -1,27 +1,60 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
name: Dockerfile runner
run-name: Building and deploying to Prod 🚀
on:
push:
branches:
- "*"
paths:
- 'dockerfile'
tags-ignore:
- '*'
- main
paths-ignore:
- 'infra/production/dockerfile'
issue_comment:
types: [created]
workflow_dispatch: # Enables the manual run UI button
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
env:
RUNNER_TOOL_CACHE: /toolcache
DEBUG: True
ALLOWED_HOSTS: "django.tryton.geeraert.eu"
container:
image: gitea.tryton.geeraert.eu/pi-ux-ce/custom-runner-debian-slim:1.0.6
volumes:
- act-toolcache:/opt/hostedtoolcache # this is where Runner store their cache default
runs-on: host-runner
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: restore git folder if exist
run: if [ -d "/opt/hostedtoolcache/${{ github.event.repository.name }}/" ]; then cp -r /opt/hostedtoolcache/${{ github.event.repository.name }}/ ${{ gitea.workspace }}; fi
- name: Check Docker Version
run: whereis docker
- name: Check out repository code
uses: actions/checkout@v4
clean: false
fetch-depth: 1
ref: 'main'
# - name: Manually check out repository code
# run: cd ${{ gitea.workspace }} ; git pull origin main
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Compute next version
id: versioning
run: |
latest="${{ vars.VERSION }}"
next_version=$(echo "$latest" | awk -F. -v OFS=. '{$NF += 1 ; print}')
echo "next_version=$next_version" >> $GITHUB_ENV
echo "Variables used :"
echo "------------------------------------------------"
echo "Next version: $next_version"
- name: Login to gitea
uses: docker/login-action@v3
@@ -30,11 +63,36 @@ jobs:
username: ${{ secrets.USERNAME_GITEA }}
password: ${{ secrets.PASSWORD_GITEA }}
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
tags: gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
- name: Build image
run: |
docker build \
-f infra/production/dockerfile \
--build-arg ALLOWED_HOSTS='django.tryton.geeraert.eu' \
--build-arg DEBUG='True' \
-t gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest \
-t gitea.tryton.geeraert.eu/pi-ux-ce/django-python:${{ env.next_version }} \
.
- name: Push image
run: |
docker push gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
docker push gitea.tryton.geeraert.eu/pi-ux-ce/django-python:${{ env.next_version }}
- name: Rollout Django to force pulling the new image
uses: actions-hub/kubectl@master
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: rollout restart deployment django -n django
- run: echo "🍏 This job's status is ${{ job.status }}."
- name: update version in the variable
run: |
curl -X PUT -H "Content-Type: application/json" \
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/VERSION \
-d "{\"Value\":\"$next_version\"}"
- name: backup git for future use
run: cp -r ${{ gitea.workspace }} /opt/hostedtoolcache/${{ github.event.repository.name }}/
@@ -0,0 +1,73 @@
name: Dockerfile testing runner
run-name: Building and deploying to testing 🔎
on:
push:
branches:
- "testing"
paths:
- 'infra/testing/dockerfile'
tags-ignore:
- '*'
workflow_dispatch: # Enables the manual run UI button
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Check out repository code
uses: actions/checkout@v4
- run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
- name: List files in the repository
run: |
ls ${{ gitea.workspace }}
- name: Compute next version
id: versioning
run: |
latest="${{ vars.VERSION_TESTING }}"
next_version=$(echo "$latest" | awk -F. -v OFS=. '{$NF += 1 ; print}')
echo "next_version=$next_version" >> $GITHUB_ENV
echo "Variables used :"
echo "------------------------------------------------"
echo "Next version: $next_version"
- name: Login to gitea
uses: docker/login-action@v3
with:
registry: gitea.tryton.geeraert.eu
username: ${{ secrets.USERNAME_GITEA }}
password: ${{ secrets.PASSWORD_GITEA }}
- name: Build image
run: |
docker build \
-f infra/testing/dockerfile \
--build-arg ALLOWED_HOSTS='django-testing.tryton.geeraert.eu' \
--build-arg DEBUG='True' \
--build-arg CACHE_BUST=${{ env.next_version }} \
-t gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:latest \
-t gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:${{ env.next_version }} \
.
- name: Push image
run: |
docker push gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:latest
docker push gitea.tryton.geeraert.eu/pi-ux-ce/django-testing:${{ env.next_version }}
- name: update version in the variable
run: |
curl -X PUT -H "Content-Type: application/json" \
--user ${{ secrets.USERNAME_GITEA }}:${{ secrets.PASSWORD_GITEA }} \
https://gitea.tryton.geeraert.eu/api/v1/repos/pi-ux-ce/${{ github.event.repository.name }}/actions/variables/VERSION_TESTING \
-d "{\"Value\":\"$next_version\"}"
- name: Rollout Django to force pulling the new image
uses: actions-hub/kubectl@master
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: rollout restart deployment django-testing -n django-testing
- run: echo "🍏 This job's status is ${{ job.status }}."
+9 -2
View File
@@ -1,6 +1,13 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]
run-name: Deploying to Prod 🪂🛫
on:
push:
branches:
- "*"
paths:
- '*.yaml'
tags-ignore:
- '*'
jobs:
Explore-Gitea-Actions:
@@ -0,0 +1,23 @@
name: Gitea Actions Demo
run-name: Deploying to testing 🏗️🧪
on:
push:
branches:
- "testing"
tags-ignore:
- '*'
jobs:
Explore-Gitea-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
- name: Rollout Django to force pulling the new image
uses: actions-hub/kubectl@master
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
with:
args: rollout restart deployment django-testing -n django-testing
- run: echo "🍏 This job's status is ${{ job.status }}."
+228
View File
@@ -1 +1,229 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[codz]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py.cover
*.lcov
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
# Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
# poetry.lock
# poetry.toml
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
# pdm.lock
# pdm.toml
.pdm-python
.pdm-build/
# pixi
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
# pixi.lock
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
# in the .venv directory. It is recommended not to include this directory in version control.
.pixi/*
!.pixi/config.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule*
celerybeat.pid
# Redis
*.rdb
*.aof
*.pid
# RabbitMQ
mnesia/
rabbitmq/
rabbitmq-data/
# ActiveMQ
activemq-data/
# SageMath parsed files
*.sage.py
# Environments
.env
.envrc
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
# .idea/
# Abstra
# Abstra is an AI-powered process automation framework.
# Ignore directories containing user credentials, local state, and settings.
# Learn more at https://abstra.io/docs
.abstra/
# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/
# Temporary file for partial code execution
tempCodeRunnerFile.py
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# Marimo
marimo/_static/
marimo/_lsp/
__marimo__/
# Streamlit
.streamlit/secrets.toml
*/__pycache__/*
*/.idea/*
*/venv/*
*/.env/*
Webcal-python/*
.idea/*
django_code/db.sqlite3
-60
View File
@@ -1,60 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: django-python
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-webserver
namespace: django-python
spec:
replicas: 1
selector:
matchLabels:
app: django-python
template:
metadata:
labels:
app: django-python
spec:
containers:
- name: django-python
image: gitea.tryton.geeraert.eu/pi-ux-ce/django-python:latest
imagePullPolicy: Always
ports:
- containerPort: 8000
name: webserver-port
volumeMounts:
- name: django-python-code
mountPath: /code
- name: servarr-data
mountPath: /data
readOnly: true
resources:
limits:
cpu: 100m
memory: 200Mi
volumes:
- name: django-python-code
persistentVolumeClaim:
claimName: django-python-code
- name: servarr-data
hostPath:
path: /data
---
apiVersion: v1
kind: Service
metadata:
name: webserver
namespace: django-python
spec:
ports:
- name: http
port: 8000
protocol: TCP
selector:
app: django-python
+61 -5
View File
@@ -1,13 +1,69 @@
=======
# Django_kube
test
## Getting started
### Database migration
```
python django_code/manage.py makemigrations
python django_code/manage.py makemigrations redirect
python django_code/manage.py makemigrations cloudmanager
python django_code/manage.py makemigrations simpsons
python django_code/manage.py makemigrations job
python django_code/manage.py makemigrations telegram
python django_code/manage.py makemigrations podcast
python django_code/manage.py makemigrations streaming
python django_code/manage.py migrate
python django_code/manage.py migrate --database=cloudmanager_db
python django_code/manage.py migrate --database=simpsons_db
python django_code/manage.py migrate --database=redirect_db
python django_code/manage.py migrate --database=job_db
python django_code/manage.py migrate --database=telegram_db
python django_code/manage.py migrate --database=podcast_db
python django_code/manage.py migrate --database=streaming_db
```
### Database debug
```
create database django;
create database redirect;
create database cloudmanager;
create database simpsons;
create database job;
create database telegram;
create database podcast;
create database streaming;
drop database redirect;
drop database cloudmanager;
drop database simpsons;
drop database job;
drop database telegram;
drop database podcast;
drop database streaming;
```
### Setup virtualenv variables
edit venv/bin/activate or .env/bin/activate
and add the following code
```
export DB_HOST=localhost
export DB_PORT=5432
export DB_USERNAME=postgres
export DB_PASSWORD=example
export DB_DATABASE=cloudmanager
export CUSTOM_DB_DATABASE=cloudmanager
export ALLOWED_HOSTS="0.0.0.0,localhost,127.0.0.1"
export DEBUG=true
export bitwarden_access_token="PROVIDED IN BITWARDEN ADMIN INTERFACE"
export bitwarden_organization_id=""
```
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
+154
View File
@@ -0,0 +1,154 @@
import requests
import hashlib
from apps.bitwarden.utils import bitwardenUtils
import os
class betaserieUtils():
url = "https://api.betaseries.com/members/auth"
username_UID="7bc7ebd2-9c95-487f-9ba2-b47301591ef0"
password_UID="262c3246-203b-44e0-854b-b47301599730"
token_UID="2cf4be0f-f26f-473f-b8f1-b473016139e4"
#Adding __ to make the variable private and can't be access outside the class,
# only by the class itself ot the subclass
__bitwarden_access_token = os.environ.get('bitwarden_access_token')
__bitwarden_organization_id = os.environ.get('bitwarden_organization_id')
bw = bitwardenUtils(__bitwarden_access_token,__bitwarden_organization_id)
__betaserie_username = bw.read_value_secret(username_UID)
__betaserie_md5_password = bw.read_value_secret(password_UID)
__betaserie_apikey = bw.read_value_secret(token_UID)
payload = {
'login': __betaserie_username, # username or email
'password': __betaserie_md5_password # MD5 hashed password
}
headers = {
'X-BetaSeries-Key': __betaserie_apikey,
}
response = requests.post(url, headers=headers, data=payload)
#now set with the correct value
__betaserie_token = response.json()['token']
#set the __betaserie_token to the doct headers now
headers.update({'X-BetaSeries-Token': __betaserie_token})
def status_code(self):
print("Status code:", self.response.status_code)
print("Response:", self.response.json())
def identify_serie(self,serie_name,verbose=False):
#
# Usage
# show_id = beta.identify_serie("The simpsons")
# show_id = beta.identify_serie("The simpsons",verbose=True)
#
url = "https://api.betaseries.com/shows/search?title="+serie_name
response = requests.request("GET", url, headers=self.headers, data=self.payload)
if verbose:
print("Url request: "+str(url))
print(response.text)
show_id = response.json()['shows'][0]['id']
return show_id
def poster_serie(self,serie_name,verbose=False):
#
# Usage
# poster_url = beta.poster_serie("The simpsons")
# poster_url = beta.poster_serie("The simpsons",verbose=True)
#
url = "https://api.betaseries.com/shows/search?title="+serie_name
response = requests.request("GET", url, headers=self.headers, data=self.payload)
if verbose:
print("Url request: "+str(url))
print(response.text)
poster_url = response.json()['shows'][0]['images']['show']
return poster_url
def identify_episode(self,show_id,episode_number,verbose=False):
#
# Usage
# episode_id,episode_seen = beta.identify_episode(show_id,"S01E01",True)
#
url = "https://api.betaseries.com/episodes/search?show_id="+str(show_id)+"&number="+str(episode_number)
response = requests.request("GET", url, headers=self.headers, data=self.payload)
episode_id = response.json()['episode']['id']
episode_seen = response.json()['episode']['user']['seen']
if verbose:
print("Url request: "+str(url))
print(response.text)
return episode_id,episode_seen
def mark_episodes_watched(self,episode_id,verbose=False):
#
# Usage
# response = beta.mark_episodes_watched(episode_id,True)
#
url = "https://api.betaseries.com/episodes/watched?id="+str(episode_id)+"&bulk=false"
response = requests.request("POST", url, headers=self.headers, data=self.payload)
if verbose:
print("Url request: "+str(url))
print(response.text)
return response.status_code
def unmark_episodes_watched(self,episode_id,verbose=False):
#
# Usage
# response = beta.unmark_episodes_watched(episode_id,True)
#
url = "https://api.betaseries.com/episodes/watched?id="+str(episode_id)
response = requests.request("DELETE", url, headers=self.headers, data=self.payload)
if verbose:
print("Url request: "+str(url))
print(response.text)
return response.status_code
def series_information(self,show_id,verbose=False):
#
# Usage
#
url = "https://api.betaseries.com/shows/display?id="+str(show_id)
response = requests.request("GET", url, headers=self.headers, data=self.payload)
seasons_details = response.json()['show']['seasons_details']
#checking if the first season is season 0, and if so remove this season
if (seasons_details[0]['number']==0):
season_0_to_remove = seasons_details[0]
if verbose : print(season_0_to_remove)
seasons_details.remove(season_0_to_remove)
maximum_number_seasons = len(seasons_details)
if verbose : print("maximum_number_seasons: "+str(maximum_number_seasons))
if verbose:
print("Url request: "+str(url))
print(response.text)
return seasons_details,maximum_number_seasons
+87
View File
@@ -0,0 +1,87 @@
import logging
import os
from datetime import datetime, timezone
from bitwarden_sdk import BitwardenClient, DeviceType, client_settings_from_dict
class bitwardenUtils():
#documentation
#https://github.com/external-secrets/bitwarden-sdk-server
state_path = "/tmp/state_file.txt"
client = BitwardenClient(
client_settings_from_dict(
{
"apiUrl": os.getenv("API_URL", "https://bitwarden.tryton.geeraert.eu/api"),
"deviceType": DeviceType.SDK,
"identityUrl": os.getenv("IDENTITY_URL", "https://bitwarden.tryton.geeraert.eu/identity"),
"userAgent": "Python",
}
)
)
def verbose(self):
logging.basicConfig(level=logging.DEBUG)
def __init__(self, __access_token, __organization_id):
self.__access_token = __access_token
self.__organization_id = __organization_id
self.client.auth().login_access_token(self.__access_token, self.state_path)
def create_project(self,project_name):
project = self.client.projects().create(self.__organization_id, project_name)
return project.data.id
def generate_strong_password(self):
# Note: using the generator does not require authentication with a server
return self.client.generators().generate() # using default params
def create_secret(self,project_id,secret_name,secret_value,description="description"):
secret = self.client.secrets().create(
self.__organization_id,
secret_name,
secret_value,
description,
[project_id],
)
return secret.data.id
def read_value_secret(self,secret_id):
return self.client.secrets().get_by_ids([secret_id]).data.data[0].value
def read_value_secrets(self,list_secret_id):
if not(isinstance(list_secret_id, list)):
print("this is not a list")
return 1
list_secret_value = []
for secret_value in self.client.secrets().get_by_ids(list_secret_id).data.data:
list_secret_value.append(secret_value.value)
return list_secret_value
def delete_secrets(self,list_secret_id):
if not(isinstance(list_secret_id, list)):
print("this is not a list")
return 1
try:
self.client.secrets().delete(list_secret_id)
status=0
except:
print("Cannot delete the secrets")
status=1
return status
def delete_projects(self,list_project_id):
if not(isinstance(list_project_id, list)):
print("this is not a list")
return 1
try:
self.client.projects().delete(list_project_id)
status=0
except:
print("Cannot delete the project")
status=1
return status
+123
View File
@@ -0,0 +1,123 @@
from django.contrib import admin,messages
from django.utils.translation import ngettext
from .models import Deployment_Data,Schedule_Day_Data,Schedule_Week_Data,Namespace_Data,Ingress_Data
from .utils import import_namespace,import_deployment,generate_default_day_schedule,generate_default_week_schedule,Check_server_supposed_XXX,retrieve_and_apply
from apps.kubernetes_connection.utils import scale_up,scale_down
from admin_extra_buttons.api import button
from core.admin import UniversalModelAdmin
@admin.action(description="scale up")
def scale_up_deploy(modeladmin, request, queryset):
for query in queryset.values():
scale_up(namespace_name=query['namespace'],deploy_name=query['name'],replicas=query['replicas'])
modeladmin.message_user(
request,
ngettext(
"%d server was successfully scaled up.",
"%d servers were successfully scaled up.",
queryset.values().count(),
)
% queryset.values().count(),
messages.SUCCESS,
)
@admin.action(description="scale down")
def scale_down_deploy(modeladmin, request, queryset):
for query in queryset.values():
scale_down(namespace_name=query['namespace'],deploy_name=query['name'])
modeladmin.message_user(
request,
ngettext(
"%d server was successfully scaled down.",
"%d servers were successfully scaled down.",
queryset.values().count(),
)
% queryset.values().count(),
messages.SUCCESS,
)
@admin.action(description="Expected False")
def Check_server_supposed_False(modeladmin, request, queryset):
servers_supposed_false = Check_server_supposed_XXX(False)
for server in servers_supposed_false:
messages.add_message(request, messages.INFO, server)
@admin.action(description="Expected True")
def Check_server_supposed_true(modeladmin, request, queryset):
servers_supposed_false = Check_server_supposed_XXX(True)
for server in servers_supposed_false:
messages.add_message(request, messages.INFO, server)
class ActiveAtHourFilter(admin.SimpleListFilter):
title = 'Active at hour'
parameter_name = 'active_at_hour'
def lookups(self, request, model_admin):
return [(str(h), f'{h:02d}:00') for h in range(24)]
def queryset(self, request, queryset):
if self.value() is not None:
hour = self.value()
return queryset.filter(**{f'schedule_day__state_at_{hour}': True})
return queryset
@admin.register(Deployment_Data)
class DeploymentDataAdmin(UniversalModelAdmin):
list_display = ('name', 'namespace', 'schedule_week', 'schedule_day', 'replicas')
list_filter = (ActiveAtHourFilter,)
actions = [Check_server_supposed_False,Check_server_supposed_true,scale_up_deploy,scale_down_deploy]
ordering = ('name',)
@button()
def retrieve_and_apply(self, request):
# your business logic here
retrieve_and_apply()
self.message_user(request, 'Operation started')
@button()
def import_deployment(self, request):
# your business logic here
import_deployment()
self.message_user(request, 'Deployments imported')
@admin.register(Schedule_Day_Data)
class ScheduleDayAdmin(UniversalModelAdmin):
list_display = ['name_schedule'] + [f'state_at_{h}' for h in range(24)]
@button()
def generate_default_day_schedule_admin(self, request):
generate_default_day_schedule()
generate_default_week_schedule()
self.message_user(request, 'Created default schedules')
@admin.register(Schedule_Week_Data)
class ScheduleWeekAdmin(UniversalModelAdmin):
list_display = (
'name_schedule',
'state_Monday', 'state_Tuesday', 'state_Wednesday',
'state_Thursday', 'state_Friday', 'state_Saturday', 'state_Sunday',
)
@button()
def generate_default_day_schedule_admin(self, request):
generate_default_day_schedule()
generate_default_week_schedule()
self.message_user(request, 'Created default schedules')
@admin.register(Namespace_Data)
class NamespaceAdmin(UniversalModelAdmin):
list_display = ('namespace',)
@button()
def import_namespace(self, request):
# your business logic here
import_namespace()
self.message_user(request, 'Namespaces imported')
@admin.register(Ingress_Data)
class IngressAdmin(UniversalModelAdmin):
list_display = ('url','namespace')
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class CloudmanagerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.cloudmanager'
label = 'cloudmanager'
@@ -0,0 +1,7 @@
class sql:
url = 'localhost'
port = 5432
user = 'postgres'
password = 'example'
database = 'cloudmanager'
@@ -0,0 +1,163 @@
#import psycopg2
from django.http import HttpResponse
from django.views.decorators.http import require_POST
from apps.kubernetes_connection import apps as kubernetes_connection
import datetime
from apps.cloudmanager import credentials
import os
def hello(request):
kubernetes_connection.echoHello();
return HttpResponse('<h1>Hello cmm !</h1>')
def DB_generation(host_in,port_in,user_in,password_in,db_in):
db = psycopg2.connect(host=host_in, port=port_in, user=user_in, password=password_in,database=db_in)
return db
@require_POST
def change_schedule(request):
# HTMX sends these via standard POST data
schedule_id = request.POST.get('schedule_id')
server_name = request.POST.get('server_name')
if not schedule_id or not server_name:
return HttpResponse("<span style='color: red;'>Missing parameters.</span>", status=400)
try:
# --- Your Core Logic Here ---
# e.g., Server.objects.filter(name=server_name).update(schedule_id=schedule_id)
print(f"Updating {server_name} to schedule profile {schedule_id}")
# Return a success message that will instantly inject into the server's status div
return HttpResponse("<span style='color: green;'>✓ Updated successfully!</span>")
except Exception as e:
return HttpResponse(f"<span style='color: red;'>Error: {str(e)}</span>", status=500)
def Launch_sql_query(sql,db):
# prepare a cursor object using cursor() method
cursor = db.cursor()
try:
# Execute the SQL command
cursor.execute(sql)
# Fetch all the rows in a list of lists.
results = cursor.fetchall()
result_machine = []
#result_machine_type = []
for row in results:
result_machine_type = []
namespace = row[0]
name = row[1]
replicas = row[2]
result_machine_type.append(namespace)
result_machine_type.append(name)
result_machine_type.append(replicas)
result_machine.append(result_machine_type)
return result_machine
except:
print ("Error: unable to fetch data")
#Return the day of the week as an integer, where Monday is 0 and Sunday is 6.
def Give_current_weekday():
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday', 'Sunday']
weekday = days[datetime.datetime.today().weekday()]
return weekday
def Give_current_hour():
now = datetime.datetime.now()
return now.hour
def Check_server_supposed_XXX(generated_db_in,wanted_status,Wanted_hour,Wanted_day):
sql_in=""
if wanted_status == "up":
sql_in = "select machine.namespace, machine.name, machine.replicas from scenario_hour,machine ,scenario_day_of_week where state_at_" + str(Wanted_hour) + "='1' and state_" + str(Wanted_day) + "='1' and machine.hour_behaviour_id=scenario_hour.id_scenario and machine.day_behaviour_id=scenario_day_of_week.id_scenario;"
elif wanted_status == "down":
sql_in = "select machine.namespace, machine.name, machine.replicas from scenario_hour,machine ,scenario_day_of_week where not(state_at_" + str(Wanted_hour) + "='1' and state_" + str(Wanted_day) + "='1') and machine.hour_behaviour_id=scenario_hour.id_scenario and machine.day_behaviour_id=scenario_day_of_week.id_scenario;"
else:
print("error value")
print(sql_in)
return_value = Launch_sql_query(sql_in, generated_db_in)
return return_value
def Is_the_server_already_wanted_state(id_machine, wanted_state,instance_type):
#stopped/running
bool_result = ""
proxmox = function.proxmox_connection(credentials.proxmox.zeus.url_proxmox,credentials.proxmox.zeus.user,credentials.proxmox.zeus.password)
if str(function.check_state_mix(id_machine,wanted_state,proxmox,instance_type)) == str(wanted_state):
bool_result = True
else:
bool_result = False
return bool_result
def all_operations(request,wanted_state,list_machine):
for machine_target in list_machine:
print(machine_target[1])
info_to_display = ""
if wanted_state == "up":
kubernetes_connection.scale_up(request,namespace_name=machine_target[0],deploy_name=machine_target[1],replicas=machine_target[2]);
elif wanted_state == "down":
kubernetes_connection.scale_down(request,namespace_name=machine_target[0],deploy_name=machine_target[1]);
else:
print("Incorrect wanted state")
# if not(Is_the_server_already_wanted_state(machine_target[0], wanted_state,machine_target[1])):
# function.action(False,machine_target[0],operation_to_perform,machine_target[1])
# print(str(machine_target[0])+" is now "+str(wanted_state))
# elif Is_the_server_already_wanted_state(machine_target[0], wanted_state,machine_target[1]):
# info_to_display = "operation already performed for "+machine_target[2]
# print(info_to_display)
#return info_to_display
return ""
def main(request):
#get credentials from the env
db_host = os.environ.get('DB_HOST')
db_port = os.environ.get('DB_PORT')
db_user = os.environ.get('DB_USERNAME')
db_password = os.environ.get('DB_PASSWORD')
db_name = os.environ.get('CUSTOM_DB_DATABASE',os.environ.get('DB_DATABASE'))
generated_db = DB_generation(db_host, db_port, db_user, db_password,db_name)
##operation:
## Server(s) supposed to be UP
list_servers_up = Check_server_supposed_XXX(generated_db, "up", Give_current_hour(),Give_current_weekday())
print("------------------------------------------")
print("-----------------UP-----------------------")
print("------------------------------------------")
print(list_servers_up)
print(all_operations(request,"up", list_servers_up))
## Server(s) supposed to be DOWN
list_servers_down = Check_server_supposed_XXX(generated_db, "down", Give_current_hour(),Give_current_weekday())
print("------------------------------------------")
print("----------------DOWN----------------------")
print("------------------------------------------")
print(list_servers_down)
print(all_operations(request,"down",list_servers_down))
# disconnect from server
generated_db.close()
#print(Is_the_server_already_wanted_state(112, "stopped"))
return HttpResponse('<h1>CMM executed!</h1>')
"""
TO DO:
EXTRACT TYPE OF MACHINE
CREATE FUNCTION TO CHECK IF A MACHINE IS ALREADY DOWN OR NOT
ADD FIELD IN SQL WITH PROJECT AND PUT DESCRIPTION -> ATTACH MACHINE TO PROJECT
"""
@@ -0,0 +1,90 @@
# Generated by Django 4.2.29 on 2026-06-22 20:21
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Namespace_Data',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('namespace', models.CharField(max_length=100)),
],
options={
'db_table': 'namespace',
},
),
migrations.CreateModel(
name='Schedule_Day_Data',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name_schedule', models.CharField(max_length=100, unique=True)),
('state_at_0', models.BooleanField()),
('state_at_1', models.BooleanField()),
('state_at_2', models.BooleanField()),
('state_at_3', models.BooleanField()),
('state_at_4', models.BooleanField()),
('state_at_5', models.BooleanField()),
('state_at_6', models.BooleanField()),
('state_at_7', models.BooleanField()),
('state_at_8', models.BooleanField()),
('state_at_9', models.BooleanField()),
('state_at_10', models.BooleanField()),
('state_at_11', models.BooleanField()),
('state_at_12', models.BooleanField()),
('state_at_13', models.BooleanField()),
('state_at_14', models.BooleanField()),
('state_at_15', models.BooleanField()),
('state_at_16', models.BooleanField()),
('state_at_17', models.BooleanField()),
('state_at_18', models.BooleanField()),
('state_at_19', models.BooleanField()),
('state_at_20', models.BooleanField()),
('state_at_21', models.BooleanField()),
('state_at_22', models.BooleanField()),
('state_at_23', models.BooleanField()),
],
options={
'db_table': 'schedule_day',
},
),
migrations.CreateModel(
name='Schedule_Week_Data',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name_schedule', models.CharField(max_length=100, unique=True)),
('state_Monday', models.BooleanField()),
('state_Tuesday', models.BooleanField()),
('state_Wednesday', models.BooleanField()),
('state_Thursday', models.BooleanField()),
('state_Friday', models.BooleanField()),
('state_Saturday', models.BooleanField()),
('state_Sunday', models.BooleanField()),
],
options={
'db_table': 'schedule_week',
},
),
migrations.CreateModel(
name='Deployment_Data',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('namespace', models.CharField(max_length=100)),
('replicas', models.IntegerField()),
('schedule_day', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cloudmanager.schedule_day_data')),
('schedule_week', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cloudmanager.schedule_week_data')),
],
options={
'db_table': 'machine',
},
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-09 12:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='deployment_data',
name='actual_replica',
field=models.IntegerField(default=1),
preserve_default=False,
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.29 on 2026-09-13 15:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0002_deployment_data_actual_replica'),
]
operations = [
migrations.AddField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateField(blank=True, null=True, verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.30 on 2026-09-14 13:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0003_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 14:14
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0004_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=datetime.datetime(2026, 9, 14, 14, 14, 29, 566084, tzinfo=datetime.timezone.utc), verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 14:14
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0005_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=datetime.datetime(2026, 9, 14, 14, 14, 33, 642627, tzinfo=datetime.timezone.utc), verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 14:35
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0006_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=datetime.datetime(2026, 9, 14, 14, 35, 47, 473312, tzinfo=datetime.timezone.utc), verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 14:35
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0007_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=datetime.datetime(2026, 9, 14, 14, 35, 51, 657797, tzinfo=datetime.timezone.utc), verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 14:43
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0008_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=datetime.datetime(2026, 9, 14, 14, 43, 26, 985719, tzinfo=datetime.timezone.utc), verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 14:43
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0009_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=datetime.datetime(2026, 9, 14, 14, 43, 31, 55115, tzinfo=datetime.timezone.utc), verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.30 on 2026-09-14 14:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0010_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-14 15:13
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0011_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.AlterField(
model_name='deployment_data',
name='do_not_touch_until',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='do_not_touch_until'),
),
]
@@ -0,0 +1,22 @@
# Generated by Django 4.2.30 on 2026-09-21 16:14
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0012_alter_deployment_data_do_not_touch_until'),
]
operations = [
migrations.CreateModel(
name='Ingress_Data',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url', models.CharField(max_length=100)),
('namespace', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cloudmanager.namespace_data')),
],
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.30 on 2026-09-21 21:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cloudmanager', '0013_ingress_data'),
]
operations = [
migrations.AlterField(
model_name='ingress_data',
name='namespace',
field=models.CharField(blank=True, max_length=100, null=True),
),
]
+70
View File
@@ -0,0 +1,70 @@
from django.db import models
from django.utils import timezone
class Schedule_Week_Data(models.Model):
name_schedule = models.CharField(max_length=100,unique=True)
state_Monday = models.BooleanField()
state_Tuesday = models.BooleanField()
state_Wednesday = models.BooleanField()
state_Thursday = models.BooleanField()
state_Friday = models.BooleanField()
state_Saturday = models.BooleanField()
state_Sunday = models.BooleanField()
class Meta:
db_table = 'schedule_week'
def __str__(self):
return self.name_schedule
class Schedule_Day_Data(models.Model):
name_schedule = models.CharField(max_length=100,unique=True)
state_at_0 = models.BooleanField()
state_at_1 = models.BooleanField()
state_at_2 = models.BooleanField()
state_at_3 = models.BooleanField()
state_at_4 = models.BooleanField()
state_at_5 = models.BooleanField()
state_at_6 = models.BooleanField()
state_at_7 = models.BooleanField()
state_at_8 = models.BooleanField()
state_at_9 = models.BooleanField()
state_at_10 = models.BooleanField()
state_at_11 = models.BooleanField()
state_at_12 = models.BooleanField()
state_at_13 = models.BooleanField()
state_at_14 = models.BooleanField()
state_at_15 = models.BooleanField()
state_at_16 = models.BooleanField()
state_at_17 = models.BooleanField()
state_at_18 = models.BooleanField()
state_at_19 = models.BooleanField()
state_at_20 = models.BooleanField()
state_at_21 = models.BooleanField()
state_at_22 = models.BooleanField()
state_at_23 = models.BooleanField()
class Meta:
db_table = 'schedule_day'
def __str__(self):
return self.name_schedule
class Deployment_Data(models.Model):
name = models.CharField(max_length=100)
namespace = models.CharField(max_length=100)
schedule_week = models.ForeignKey(Schedule_Week_Data,null=True, blank=True, on_delete=models.SET_NULL)
schedule_day = models.ForeignKey(Schedule_Day_Data,null=True, blank=True, on_delete=models.SET_NULL)
replicas = models.IntegerField()
actual_replica = models.IntegerField()
do_not_touch_until = models.DateTimeField('do_not_touch_until', default=timezone.now)
class Meta:
db_table = 'machine'
class Namespace_Data(models.Model):
namespace = models.CharField(max_length=100)
#deployments = models.ForeignKey(Schedule_Week_Data,null=True, blank=True, on_delete=models.SET_NULL)
class Meta:
db_table = 'namespace'
def __str__(self):
return self.namespace
class Ingress_Data(models.Model):
url = models.CharField(max_length=100)
namespace = models.CharField(max_length=100,null=True, blank=True)
+33
View File
@@ -0,0 +1,33 @@
"""
URL configuration for django_code project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from .views import hello,import_namespace_view,retrieve_and_apply_view,scale_up_gui,scale_down_gui,add_ingress,delete_ingress
urlpatterns = [
################### cloudmanager ###################
path('', hello, name='hello'),
path('import_namespace', import_namespace_view, name='import_namespace'),
path('retrieve_and_apply_view', retrieve_and_apply_view, name='retrieve_and_apply_view'),
path('scale_up/<str:namespace_name>/<str:deploy_name>', scale_up_gui),
path('scale_down/<str:namespace_name>/<str:deploy_name>', scale_down_gui),
path('add_ingress', add_ingress),
path('delete_ingress', delete_ingress),
]
+144
View File
@@ -0,0 +1,144 @@
from django.utils import timezone
import datetime
from apps.kubernetes_connection.utils import get_namespace,get_deployments,scale_up,scale_down
from apps.cloudmanager.models import Schedule_Day_Data,Schedule_Week_Data,Namespace_Data,Deployment_Data
def import_namespace():
namespaces_list = get_namespace()
for namespace in namespaces_list:
if namespace[0]!="kube-system":
Namespace_Data.objects.get_or_create(namespace=namespace)
def import_deployment():
deployment_list = get_deployments()
Schedule_Day_Always_off,Schedule_Day_Always_on = generate_default_day_schedule()
Schedule_Week_Always_off,Schedule_Week_Always_on = generate_default_week_schedule()
for deployment in deployment_list:
#if the replicas is originally 0 , it means it is disabled so put the schedule as always off
if deployment[2] == 0:
schedule_object = Schedule_Day_Always_off
else:
schedule_object = Schedule_Day_Always_on
if deployment[0]!="kube-system":
Deployment_Data.objects.get_or_create(namespace=deployment[0],name=deployment[1],defaults={"replicas":deployment[2],"actual_replica":deployment[2],"schedule_day":schedule_object,"schedule_week":Schedule_Week_Always_on})
def generate_default_day_schedule():
Always_off,status = Schedule_Day_Data.objects.update_or_create(name_schedule="Always_off",defaults={"state_at_0" : False ,"state_at_1" : False ,"state_at_2" : False ,"state_at_3" : False ,"state_at_4" : False ,"state_at_5" : False ,"state_at_6" : False ,"state_at_7" : False ,"state_at_8" : False ,"state_at_9" : False ,"state_at_10" : False ,"state_at_11" : False ,"state_at_12" : False ,"state_at_13" : False ,"state_at_14" : False ,"state_at_15" : False ,"state_at_16" : False ,"state_at_17" : False ,"state_at_18" : False ,"state_at_19" : False ,"state_at_20" : False ,"state_at_21" : False ,"state_at_22" : False ,"state_at_23" : False})
Always_on,status = Schedule_Day_Data.objects.update_or_create(name_schedule="Always_on",defaults={"state_at_0" : True ,"state_at_1" : True ,"state_at_2" : True ,"state_at_3" : True ,"state_at_4" : True ,"state_at_5" : True ,"state_at_6" : True ,"state_at_7" : True ,"state_at_8" : True ,"state_at_9" : True ,"state_at_10" : True ,"state_at_11" : True ,"state_at_12" : True ,"state_at_13" : True ,"state_at_14" : True ,"state_at_15" : True ,"state_at_16" : True ,"state_at_17" : True ,"state_at_18" : True ,"state_at_19" : True ,"state_at_20" : True ,"state_at_21" : True ,"state_at_22" : True ,"state_at_23" : True})
return Always_off,Always_on
def generate_default_week_schedule():
Always_off,status = Schedule_Week_Data.objects.update_or_create(name_schedule="Always_off",defaults={"state_Monday" : False , "state_Tuesday" : False , "state_Wednesday" : False , "state_Thursday" : False , "state_Friday" : False , "state_Saturday" : False , "state_Sunday" : False})
Always_on,status = Schedule_Week_Data.objects.update_or_create(name_schedule="Always_on",defaults={"state_Monday" : True , "state_Tuesday" : True , "state_Wednesday" : True , "state_Thursday" : True , "state_Friday" : True , "state_Saturday" : True , "state_Sunday" : True})
return Always_off,Always_on
def Give_current_weekday():
days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday', 'Sunday']
weekday = days[datetime.datetime.today().weekday()]
return weekday
def Give_current_hour():
now = datetime.datetime.now()
return now.hour
def get_current_replicas():
deployments_list = get_deployments()
for deployment in deployments_list:
if deployment[0]!="kube-system":
object,created = Deployment_Data.objects.update_or_create(namespace=deployment[0],name=deployment[1],defaults={"actual_replica":deployment[2]})
if created:
print("THIS DEPLOY: name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2])+" IS NEW !!!!!")
return 0
def Check_server_supposed_XXX(expected_status,verbose=False):
#just for testing
#expected_status = True
# Get week schedule
argument_week="state_"+str(Give_current_weekday())
query_week = {argument_week : expected_status}
schedules_week = Schedule_Week_Data.objects.filter(**query_week)
# Get day schedule
argument_day="state_at_"+str(Give_current_hour())
query_day = {argument_day : expected_status}
schedules_day = Schedule_Day_Data.objects.filter(**query_day)
if expected_status:
deployments = Deployment_Data.objects.filter(schedule_week__in=schedules_week, schedule_day__in=schedules_day)
else:
deployments = Deployment_Data.objects.filter(schedule_week__in=schedules_week) | Deployment_Data.objects.filter(schedule_day__in=schedules_day)
deployments_list = []
for deployment in deployments:
display_list = []
name = deployment.name
display_list.append(name)
if verbose : print("name: "+str(name))
namespace = deployment.namespace
display_list.append(namespace)
if verbose : print("namespace: "+str(namespace))
replicas = deployment.replicas
display_list.append(replicas)
if verbose : print("replicas: "+str(replicas))
#Adding the whole object as well for future use
display_list.append(deployment)
deployments_list.append(display_list)
return deployments_list
def retrieve_and_apply(verbose=False):
output = ""
output += str(Give_current_hour())
output += str("\n")
#Get current replica to compare with the replicas created at the start
get_current_replicas()
print("------------------------------------------")
print("-----------------UP-----------------------")
print("------------------------------------------")
servers_supposed_true = Check_server_supposed_XXX(True)
for server in servers_supposed_true:
#check if the expected replica (server[2]) match the current replica of the deployment (server[3].actual_replica)
if server[3].actual_replica == server[2]:
if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already UP")
elif server[3].do_not_touch_until > timezone.now():
if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" is in freeze period")
else:
echo = "Starting -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2])
output += str(echo)
output += "\n"
print(echo)
scale_up(namespace_name=server[1],deploy_name=server[0],replicas=server[2])
print("------------------------------------------")
print("----------------DOWN----------------------")
print("------------------------------------------")
servers_supposed_false = Check_server_supposed_XXX(False)
for server in servers_supposed_false:
#check if the current replica of the deployment (server[3].actual_replica) is already 0 meaning the server is already down
if server[3].actual_replica == 0:
if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" already DOWN")
elif server[3].do_not_touch_until > timezone.now():
if verbose : print("name: "+str(server[1])+" namespace: "+str(server[0])+" is in freeze period")
else:
echo = "Shutting down -> name: "+str(server[1])+" namespace: "+str(server[0])+" replicas: "+str(server[2])
output += str(echo)
output += str("\n")
print(echo)
scale_down(namespace_name=server[1],deploy_name=server[0])
print("------------------------------------------")
return output
+77
View File
@@ -0,0 +1,77 @@
from django.http import HttpResponse
from django.shortcuts import render
from datetime import timedelta
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from apps.import_aggregator.import_rest_framework import api_view, authentication_classes, permission_classes,TokenAuthentication,IsAuthenticated,Response,status
from .utils import import_namespace,retrieve_and_apply
from apps.kubernetes_connection.utils import scale_up,scale_down
from .models import Deployment_Data,Ingress_Data
def hello(request):
list_schedule = ['schedule1','schedule2']
list_servers_up = [['wiki', 'wikijs', 2], ['book', 'bookstack-db', 1]]
return render(request, 'cloudmanager/index.html', {'list_schedule':list_schedule,'list_servers_up':list_servers_up})
def import_namespace_view(request):
import_namespace()
return HttpResponse('<h1>Namespace imported!</h1>')
def retrieve_and_apply_view(request):
output = retrieve_and_apply()
return HttpResponse('<h1>'+output+'</h1>')
def scale_up_gui(request,namespace_name,deploy_name,replicas=1):
Deployment_Data.objects.filter(namespace=namespace_name,name=deploy_name).update(do_not_touch_until=timezone.now() + timedelta(hours=1))
scale_up(namespace_name=namespace_name,deploy_name=deploy_name,replicas=replicas)
return render(request, 'dashboard/start.html', {'namespace':namespace_name,'deployment': deploy_name, 'url': 'https://namespace.com'})
def scale_down_gui(request,namespace_name,deploy_name):
Deployment_Data.objects.filter(namespace=namespace_name,name=deploy_name).update(do_not_touch_until=timezone.now() + timedelta(hours=1))
scale_down(namespace_name=namespace_name,deploy_name=deploy_name)
return render(request, 'dashboard/shutdown.html',
{'namespace': namespace_name, 'deployment': deploy_name, 'url': 'https://namespace.com'})
@api_view(['POST'])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def add_ingress(request):
url = request.POST.get('url')
namespace = request.POST.get('namespace')
print("URL: "+str(url))
print("NS: "+str(namespace))
try:
Ingress_Data.objects.update_or_create(url=url,namespace=namespace)
except Exception as exception:
return JsonResponse({"status": "error","reason":str(exception)})
return JsonResponse({"status": "added","url":str(url),"namespace":str(namespace)})
@api_view(['POST'])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def delete_ingress(request):
url = request.POST.get('url')
namespace = request.POST.get('namespace')
print("URL: "+str(url))
print("NS: "+str(namespace))
try:
ingress_object = Ingress_Data.objects.filter(url=url,namespace=namespace)
except Exception as exception:
return JsonResponse({"status": "error","reason":str(exception)})
try:
ingress_object.delete()
except Exception as exception:
return JsonResponse({"status": "error","reason":str(exception)})
return JsonResponse({"status": "deleted","url":str(url),"namespace":str(namespace)})
+21
View File
@@ -0,0 +1,21 @@
from django.shortcuts import render
def home(request):
thislist = ["apple", "banana", "cherry"]
return render(request, 'dashboard/home.html',{'thislist': thislist})
def about(request):
thislist = ["apple", "banana", "cherry"]
return render(request, 'dashboard/about.html',{'thislist': thislist})
def success(request):
return render(request, 'dashboard/start.html',{'deployment': 'django','url':'https://google.com'})
def scale_up(request,namespace_name,deploy_name):
baseurl = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
return render(request, 'dashboard/start.html', {'namespace':namespace_name,'deployment': deploy_name, 'url': 'https://namespace.com','baseurl': baseurl})
def scale_down(request,namespace_name,deploy_name):
baseurl = "{0}://{1}{2}".format(request.scheme, request.get_host(), request.path)
return render(request, 'dashboard/shutdown.html', {'namespace':namespace_name,'deployment': deploy_name, 'url': 'https://namespace.com','baseurl': baseurl})
@@ -0,0 +1,6 @@
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status
+40
View File
@@ -0,0 +1,40 @@
from django.contrib import admin
from import_export import resources
from import_export.fields import Field
from .models import JobData
from django.utils.text import Truncator
from core.admin import UniversalModelAdmin
# Register your models here.
class JobResource(resources.ModelResource):
# Map 'csv_column_name' from the file to 'model_variable_name' in your DB
job_position = Field(attribute='job_position',column_name='Job Position')
company = Field(attribute='company',column_name='Company')
URL = Field(attribute='URL',column_name='URL')
status = Field(attribute='status',column_name='Status')
date_saved = Field(attribute='date_saved',column_name='Date Saved')
date_applied = Field(attribute='date_applied',column_name='Date Applied')
type = Field(attribute='type',column_name='Type')
resume = Field(attribute='resume',column_name='Resume')
#cover_letter = Field(attribute='cover_letter',column_name='Cover Letter')
location = Field(attribute='location',column_name='Location')
job_description = Field(attribute='job_description',column_name='Job Description')
salary = Field(attribute='salary',column_name='Salary')
contact = Field(attribute='contact',column_name='Contact')
source = Field(attribute='source',column_name='Source')
class Meta:
model = JobData
@admin.register(JobData)
class JobAdmin(UniversalModelAdmin):
list_display = ('job_position','company','URL','status','date_saved','date_applied','type','resume','location','short_description','salary','contact','source')
#fields = ['job_position','company','URL','status','date_saved','date_applied','type','resume','cover_letter','location','job_description','salary ','contact','source']
resource_classes = [JobResource]
def short_description(self, obj):
return Truncator(obj.job_description).words(10, truncate=' ...')
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class JobDashboardConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.job_dashboard'
label = 'job'
@@ -0,0 +1,36 @@
# Generated by Django 4.2.29 on 2026-06-22 20:21
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='JobData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('job_position', models.CharField(max_length=100, null=True)),
('company', models.CharField(max_length=100, null=True)),
('URL', models.URLField(max_length=1000, null=True)),
('status', models.CharField(choices=[('Rejected', 'Rejected'), ('Applied', 'Applied'), ('Negotiating', 'Negotiating'), ('Bookmarked', 'Bookmarked'), ('Accepted', 'Accepted')], max_length=100, null=True)),
('date_saved', models.CharField(max_length=100, null=True)),
('date_applied', models.CharField(max_length=100, null=True)),
('type', models.CharField(max_length=100, null=True)),
('resume', models.URLField(null=True)),
('location', models.CharField(max_length=100, null=True)),
('job_description', models.CharField(null=True)),
('salary', models.CharField(null=True)),
('contact', models.CharField(max_length=100, null=True)),
('source', models.CharField(max_length=100, null=True)),
],
options={
'db_table': 'job',
},
),
]
+29
View File
@@ -0,0 +1,29 @@
from django.db import models
status_CHOICES = (
('Rejected','Rejected'),
('Applied','Applied'),
('Negotiating','Negotiating'),
('Bookmarked','Bookmarked'),
('Accepted','Accepted')
)
class JobData(models.Model):
job_position = models.CharField(max_length=100, null=True)
company = models.CharField(max_length=100, null=True)
URL = models.URLField(max_length=1000,null=True)
status = models.CharField(max_length=100,choices=status_CHOICES, null=True)
date_saved = models.CharField(max_length=100, null=True)
date_applied = models.CharField(max_length=100, null=True)
type = models.CharField(max_length=100, null=True)
resume = models.URLField(max_length=200, null=True)
#cover_letter = models.URLField(max_length=200, null=True)
location = models.CharField(max_length=100, null=True)
job_description = models.CharField(null=True)
salary = models.CharField(null=True)
contact = models.CharField(max_length=100, null=True)
source = models.CharField(max_length=100, null=True)
class Meta:
db_table = 'job'
+22
View File
@@ -0,0 +1,22 @@
"""
URL configuration for django_code project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from django.contrib import admin
urlpatterns = [
path('', admin.site.urls),
]
+3
View File
@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.
@@ -14,27 +14,35 @@ import ruamel.yaml
import yaml
import urllib.request
def hello(request):
return HttpResponse('<h1>Hello k8s!</h1>')
def scale_up(request,namespace_name,deploy_name):
config.load_kube_config(config_file='/code/kubeconfig')
def echoHello():
print("hello from k8s")
return "returned from k8s"
def scale_up(request,namespace_name,deploy_name,replicas=1):
config.load_kube_config(config_file='/kubeconfig/config')
api = client.AppsV1Api()
deployment = api.read_namespaced_deployment(name=deploy_name, namespace=namespace_name)
deployment.spec.replicas = 2
deployment.spec.replicas = replicas
resp = api.patch_namespaced_deployment(
name=deploy_name, namespace=namespace_name, body=deployment);
return HttpResponse('<h1>Scaled up !</h1>')
name=deploy_name, namespace=namespace_name, body=deployment);
#return HttpResponse('<h1>Scaled up !</h1>')
return render(request, 'dashboard/start.html', {'namespace':namespace_name,'deployment': deploy_name, 'url': 'https://namespace.com'})
def scale_down(request,namespace_name,deploy_name):
config.load_kube_config(config_file='/code/kubeconfig')
config.load_kube_config(config_file='/kubeconfig/config')
api = client.AppsV1Api()
deployment = api.read_namespaced_deployment(name=deploy_name, namespace=namespace_name)
deployment.spec.replicas = 0
resp = api.patch_namespaced_deployment(
name=deploy_name, namespace=namespace_name, body=deployment);
return HttpResponse('<h1>Scaled down !</h1>')
name=deploy_name, namespace=namespace_name, body=deployment);
#return HttpResponse('<h1>Scaled down !</h1>')
return render(request, 'dashboard/shutdown.html',
{'namespace': namespace_name, 'deployment': deploy_name, 'url': 'https://namespace.com'})
def nodes(request):
config.load_kube_config(config_file='/code/kubeconfig')
@@ -111,15 +119,16 @@ def backup_job(request):
#help with yaml import
#https://github.com/kubernetes-client/python/issues/589
def backup_job_yaml(request):
def backup_job_yaml(request,sync_target):
config.load_kube_config(config_file='/code/kubeconfig')
v1 = client.BatchV1Api()
with urllib.request.urlopen(https://gitea.tryton.geeraert.eu/pi-ux-ce/Backup_kube/raw/branch/main/Infrequent_access/pod.yaml") as manifest_url:
yaml_location = {
"synology" : "https://gitea.tryton.geeraert.eu/pi-ux-ce/Backup_kube/raw/branch/main/Infrequent_access/synology_pod.yaml",
"openmediavault":"https://gitea.tryton.geeraert.eu/pi-ux-ce/Backup_kube/raw/branch/main/Infrequent_access/openmediavault_pod.yaml"
}
print(yaml_location[sync_target])
url_to_select=yaml_location[sync_target]
api_response = v1.create_namespaced_job(body=pod_manifest_job)
# with open('/code/pod.yaml') as :
job = yaml.safe_load(manifest_url)
v1.create_namespaced_job(
job['metadata']['namespace'], job, pretty=True
)
return HttpResponse(job['metadata']['namespace'])
return HttpResponse(api_response)
@@ -0,0 +1,29 @@
"""
URL configuration for django_code project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from apps.kubernetes_connection import apps as kubernetes_connection
urlpatterns = [
################## kubernetes_connection#####
path('hello/', kubernetes_connection.hello),
path('nodes/', kubernetes_connection.nodes),
path('backup_job/', kubernetes_connection.backup_job),
path('backup_job_yaml/', kubernetes_connection.backup_job_yaml),
path('scale_up/<str:namespace_name>/<str:deploy_name>', kubernetes_connection.scale_up),
path('scale_down/<str:namespace_name>/<str:deploy_name>', kubernetes_connection.scale_down),
]
@@ -0,0 +1,58 @@
from kubernetes import client, config
def scale_up(namespace_name,deploy_name,replicas=1):
config.load_kube_config(config_file='/kubeconfig/config')
api = client.AppsV1Api()
deployment = api.read_namespaced_deployment(name=deploy_name, namespace=namespace_name)
deployment.spec.replicas = replicas
resp = api.patch_namespaced_deployment(
name=deploy_name, namespace=namespace_name, body=deployment);
return 0
def scale_down(namespace_name,deploy_name):
config.load_kube_config(config_file='/kubeconfig/config')
api = client.AppsV1Api()
deployment = api.read_namespaced_deployment(name=deploy_name, namespace=namespace_name)
deployment.spec.replicas = 0
resp = api.patch_namespaced_deployment(
name=deploy_name, namespace=namespace_name, body=deployment);
return 0
def import_Deployments():
config.load_kube_config(config_file='/kubeconfig/config')
api = client.AppsV1Api()
deployment = api.list_deployment_for_all_namespaces()
for i in range(1,len(deployment.items)):
print(deployment.items[i].spec.template.spec.containers[0].name)
len(deployment.items) #list all deployment inside the namespace
test.items[0].spec.template.spec.containers[0].name # name the first deploy within the namespace
test.items[2].spec.template.spec.containers[0].name # name the third deploy within the namespace
return 0
def get_namespace(verbose=False):
config.load_kube_config(config_file='/kubeconfig/config')
core = client.CoreV1Api()
namespace = core.list_namespace()
namespace_list = []
for i in range(0,len(namespace.items)):
if verbose : print(namespace.items[i].metadata.name)
namespace_list.append(namespace.items[i].metadata.name)
return namespace_list
def get_deployments(verbose=False):
config.load_kube_config(config_file='/kubeconfig/config')
api = client.AppsV1Api()
namespaces_list = get_namespace()
deployments_list = []
for namespace in namespaces_list:
if verbose : print(namespace)
deployments = api.list_namespaced_deployment(namespace)
for deployment_index in range(0,len(deployments.items)):
deployment = deployments.items[deployment_index].metadata.name
replicas = deployments.items[deployment_index].spec.replicas
if verbose : print(" "+str(deployment)+" -- Replicas: "+str(replicas))
deployments_list.append([namespace,deployment,replicas])
return deployments_list
@@ -0,0 +1,12 @@
from django.contrib import admin
from import_export import resources
from django.utils.html import format_html
from .models import podcastData
from core.admin import UniversalModelAdmin
# Register your models here.
@admin.register(podcastData)
class PodcastAdmin(UniversalModelAdmin):
list_display = ('podcast_name','clickable_links','enabled')
link_field = 'podcast_url'
@@ -0,0 +1,7 @@
from django.apps import AppConfig
class PodcastAggregatorConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.podcast_aggregator'
label = 'podcast'
@@ -0,0 +1,25 @@
# Generated by Django 4.2.29 on 2026-06-30 22:05
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='podcastData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('podcast_name', models.CharField(max_length=100, null=True)),
('podcast_url', models.CharField(max_length=100, null=True)),
],
options={
'db_table': 'podcasts',
},
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.29 on 2026-06-30 22:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('podcast', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='podcastdata',
name='enabled',
field=models.BooleanField(default=True),
),
]
@@ -0,0 +1,8 @@
from django.db import models
class podcastData(models.Model):
podcast_name = models.CharField(max_length=100, null=True)
podcast_url = models.CharField(max_length=100, null=True)
enabled = models.BooleanField(default=True)
class Meta:
db_table = 'podcasts'
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
@@ -0,0 +1,24 @@
"""
URL configuration for django_code project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from apps.podcast_aggregator import views as podcast_views
urlpatterns = [
################### cloudmanager ###################
path('', podcast_views.execute_podcast),
]
@@ -0,0 +1,89 @@
import requests
import xmltodict
from urllib import request as urlrequest
import tempfile
#Django import
from apps.telegram_communication.utils import telegramUtils
from .models import podcastData
proxy_url = 'http://gluetun-svc.gluetun.svc:8888'
proxy = urlrequest.ProxyHandler({
'http': proxy_url,
'https': proxy_url # Add the handler for HTTPS
})
proxies = {
"http" : proxy_url,
"https" : proxy_url
}
def rss_to_dict(url):
response = requests.get(url)
data = xmltodict.parse(response.content)
print(data['rss'])
title = data['rss']['channel']['title']
#Get the keys if needed of debug
#print(data['rss'].keys())
#use first object as it's ordered in a chronological order
today_object = data['rss']['channel']['item']
if isinstance(today_object, list):
today_object = data['rss']['channel']['item'][0]
today_title = today_object['title']
today_podcast_url = today_object['enclosure']['@url']
return title,today_title,today_podcast_url
def download_news_mp3(url_mp3, filename):
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
print("Downloading : " + filename +" -- " + url_mp3)
try:
urlrequest.urlretrieve(url_mp3, filename)
except:
print("Can't download " + filename +" -- " + url_mp3 + " == Cancelling")
return 0
def pretty_filename(filename,extension=''):
filename = filename.replace(' ', '_')
pretty_filename = filename.replace('/', '_')
if extension != '':
extension = str('.'+extension)
return pretty_filename+extension
def podcasts():
telegram = telegramUtils()
#clear all expired messages before
telegram.clear_expired_messages()
podcasts = podcastData.objects.filter(enabled=True)
for podcast in podcasts:
url = podcast.podcast_url
today_podcast = rss_to_dict(url)
print(today_podcast)
pretty_file_name = pretty_filename(today_podcast[1],'mp3')
temp = tempfile.TemporaryDirectory()
temp_path = temp.name.replace("\\", "/")
file_path = temp_path+"/"+pretty_file_name
download_news_mp3(today_podcast[2],file_path)
print(file_path)
telegram.send_document(file_path,str(today_podcast[0])+" "+str(today_podcast[1]))
#main()
@@ -0,0 +1,7 @@
from django.http import HttpResponse
from .utils import podcasts
# Create your views here.
def execute_podcast(request):
podcasts()
return HttpResponse('<h1>Generating the podcast!</h1>')
+99
View File
@@ -0,0 +1,99 @@
from django.contrib import admin,messages
from django.utils.translation import ngettext
from django.utils import timezone
from prompt_toolkit.shortcuts import print_container
from import_export import resources
from .models import SimpsonsData,urlData
from .utils import mark_episode_watched,unwatch_all_episodes,generate_new_urls_for_episode
from core.admin import UniversalModelAdmin
# Register your models here.
DB = 'simpsons_db'
@admin.action(description="Mark episode as seen")
def make_seen(modeladmin, request, queryset):
updated = queryset.update(seen="True",modified_at=timezone.now())
for query in queryset.values():
print(query)
season_number = query.get('season')
episode_number = query.get('episode')
mark_episode_watched(season_number,episode_number,"watched")
modeladmin.message_user(
request,
ngettext(
"%d episode was successfully marked as seen.",
"%d episodes were successfully marked as seen.",
updated,
)
% updated,
messages.SUCCESS,
)
@admin.action(description="Mark episode as not seen")
def make_unseen(modeladmin, request, queryset):
updated = queryset.update(seen="False")
for query in queryset.values():
print(query)
season_number = query.get('season')
episode_number = query.get('episode')
mark_episode_watched(season_number,episode_number,"unwatched")
modeladmin.message_user(
request,
ngettext(
"%d episode was successfully marked as not seen.",
"%d episodes were successfully marked as not seen.",
updated,
)
% updated,
messages.SUCCESS,
)
@admin.action(description="mark all of them as unseen on betaserie")
def unseen_betaserie(modeladmin, request, queryset):
unwatch_all_episodes()
@admin.action(description="generate new urls for episode")
def generate_new_urls(modeladmin, request, queryset):
generate_new_urls_for_episode()
@admin.register(SimpsonsData)
class EpisodeAdmin(UniversalModelAdmin):
list_display = [field.name for field in SimpsonsData._meta.fields if field.name != 'id']
list_display += ['clickable_links']
list_filter = ['seen','modified_at']
#list_filter = ['seen']
fields = ['season', 'episode', 'url', 'seen']
actions = [make_seen,make_unseen,unseen_betaserie,generate_new_urls]
search_fields = ['season', 'episode', 'url', 'seen']
def get_queryset(self, request):
return super().get_queryset(request).using(DB)
def save_model(self, request, obj, form, change):
obj.save(using=DB)
def delete_model(self, request, obj):
obj.delete(using=DB)
def delete_queryset(self, request, queryset):
queryset.using(DB).delete()
@admin.register(urlData)
class urldataAdmin(UniversalModelAdmin):
list_display = ('url_example', 'prefix', 'infix', 'suffix','addedDate')
fieldsets = [
(
None,
{
'fields': (('prefix', 'infix', 'suffix'), 'url_example')
},
)
]
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class RandomSimpsonsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.random_simpsons'
label = 'simpsons'
@@ -0,0 +1,27 @@
# Generated by Django 4.2.29 on 2026-06-22 20:21
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='SimpsonsData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('season', models.IntegerField()),
('episode', models.IntegerField()),
('url', models.CharField(max_length=1000)),
('seen', models.BooleanField()),
],
options={
'db_table': 'episodes',
},
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.29 on 2026-07-05 13:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='simpsonsdata',
name='modified_at',
field=models.DateTimeField(auto_now=True),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.29 on 2026-07-05 13:40
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0002_simpsonsdata_modified_at'),
]
operations = [
migrations.AlterField(
model_name='simpsonsdata',
name='modified_at',
field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0)),
),
]
@@ -0,0 +1,17 @@
# Generated by Django 4.2.29 on 2026-07-05 13:43
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0003_alter_simpsonsdata_modified_at'),
]
operations = [
migrations.RemoveField(
model_name='simpsonsdata',
name='modified_at',
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-07-07 08:35
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0004_remove_simpsonsdata_modified_at'),
]
operations = [
migrations.AddField(
model_name='simpsonsdata',
name='modified_at',
field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0)),
),
]
@@ -0,0 +1,27 @@
# Generated by Django 4.2.30 on 2026-07-07 08:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0005_simpsonsdata_modified_at'),
]
operations = [
migrations.CreateModel(
name='urlData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url_example', models.CharField(max_length=1000)),
('prefix', models.CharField(max_length=1000)),
('infix', models.CharField(max_length=1000)),
('suffix', models.CharField(max_length=1000)),
('addedDate', models.DateField(auto_now_add=True, null=True, verbose_name='Published')),
],
options={
'db_table': 'redirectUrl',
},
),
]
@@ -0,0 +1,28 @@
# Generated by Django 4.2.30 on 2026-07-07 08:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0006_urldata'),
]
operations = [
migrations.AlterField(
model_name='urldata',
name='infix',
field=models.CharField(help_text='8&episode=', max_length=1000),
),
migrations.AlterField(
model_name='urldata',
name='prefix',
field=models.CharField(help_text='https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=', max_length=1000),
),
migrations.AlterField(
model_name='urldata',
name='url_example',
field=models.CharField(help_text='https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=18&episode=5', max_length=1000),
),
]
@@ -0,0 +1,34 @@
# Generated by Django 4.2.30 on 2026-07-07 09:28
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0007_alter_urldata_infix_alter_urldata_prefix_and_more'),
]
operations = [
migrations.AlterField(
model_name='simpsonsdata',
name='modified_at',
field=models.DateTimeField(default=datetime.datetime(1970, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)),
),
migrations.AlterField(
model_name='urldata',
name='infix',
field=models.CharField(blank=True, help_text='&episode=', max_length=1000, null=True),
),
migrations.AlterField(
model_name='urldata',
name='prefix',
field=models.CharField(blank=True, help_text='https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=', max_length=1000, null=True),
),
migrations.AlterField(
model_name='urldata',
name='suffix',
field=models.CharField(blank=True, max_length=1000, null=True),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.30 on 2026-09-17 21:26
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('simpsons', '0008_alter_simpsonsdata_modified_at_alter_urldata_infix_and_more'),
]
operations = [
migrations.AlterField(
model_name='simpsonsdata',
name='modified_at',
field=models.DateTimeField(default=datetime.datetime(1969, 12, 31, 23, 0, tzinfo=datetime.timezone.utc)),
),
]
@@ -0,0 +1,27 @@
from django.db import models
from datetime import datetime
from django.utils.timezone import make_aware
EPOCH = make_aware(datetime(1970, 1, 1))
class SimpsonsData(models.Model):
season = models.IntegerField()
episode = models.IntegerField()
url = models.CharField(max_length=1000)
seen = models.BooleanField()
modified_at = models.DateTimeField(default=EPOCH)
class Meta:
db_table = 'episodes'
class urlData(models.Model):
url_example = models.CharField(max_length=1000, help_text="https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=18&episode=5")
prefix = models.CharField(max_length=1000, help_text="https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=",blank=True, null=True)
infix = models.CharField(max_length=1000, help_text="&episode=",blank=True, null=True)
suffix = models.CharField(max_length=1000, help_text="" ,blank=True, null=True)
addedDate = models.DateField('Published', blank=True, null=True, auto_now_add=True)
class Meta:
db_table = 'redirectUrl'
simpsons_data_object = SimpsonsData.objects.using('simpsons_db')
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+25
View File
@@ -0,0 +1,25 @@
"""
URL configuration for django_code project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from apps.random_simpsons import views as random_simpsons
urlpatterns = [
################### Simpsons ###################
path('hello', random_simpsons.hello),
path('', random_simpsons.episode_generator),
path('download_file/', random_simpsons.download_file),
]
+88
View File
@@ -0,0 +1,88 @@
from django.db.models import Count
from django.core.exceptions import MultipleObjectsReturned
from celery.worker.state import active_requests
from requests.compat import str
from django.utils import timezone
from apps.betaserie.utils import betaserieUtils
from .models import simpsons_data_object,urlData
betaserie = betaserieUtils()
simpsons_id = 12
def mark_episode_watched(season,episode,action,verbose=False):
#mark episode as seen in DB
simpsons_data_object.filter(season=season, episode=episode).values('seen').update(seen=True,modified_at=timezone.now())
if verbose : print("season_number: "+str(season))
if verbose : print("episode_number: "+str(episode))
#mark episode as seen in betaserie
episode_number = "S"+str(season)+"E"+str(episode)
episode_id,episode_seen = betaserie.identify_episode(simpsons_id,episode_number)
if action == "watched":
betaserie.mark_episodes_watched(episode_id)
elif action == "unwatched":
betaserie.unmark_episodes_watched(episode_id)
else:
print("Parameter action not in range")
def unwatch_all_episodes():
maximum_number_of_seasons = simpsons_data_object.aggregate(unique_season=Count('season', distinct=True))['unique_season']
print("maximum_number_of_seasons: "+str(maximum_number_of_seasons))
for season in range(1,maximum_number_of_seasons+1):
maximum_number_of_episodes = simpsons_data_object.filter(season=season).count()
print("maximum_number_of_episodes for "+str(season)+": "+str(maximum_number_of_episodes))
for episode in range(1,maximum_number_of_episodes+1):
print("S"+str(season)+"E"+str(episode))
mark_episode_watched(season,episode,"unwatched")
def generate_new_urls_for_episode(verbose=False):
# kisscartoons didn't work anymore so moving to another website with the format:
# URL.com/simpsons/season=XX&episode=XX
# example
# https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=33&episode=18
seasons_information,maximum_number_season = betaserie.series_information(simpsons_id)
#for the simpsons, there is a season 0 which increase the count of seasons by 1
# we need to remove this entry ,
# so we cannot trust the maximum_number_season coming from simpsons_series_information
# edit 26/08/2026
# I updated the function betaserie.series_information to remove this season 0
for season in range(1,maximum_number_season+1):
# the list doesn't start with season 0 anymore so we cannot use the season number as index
# we need to add -1
number_episodes_in_season = int(seasons_information[season-1]['episodes'])
for episode in range(1,number_episodes_in_season+1):
if verbose : print("Season: "+str(season))
if verbose : print("episode: "+str(episode))
new_url_object = urlData.objects.all().order_by('-addedDate').first()
new_url = str(new_url_object.prefix)+str(season)+str(new_url_object.infix)+str(episode)+str(new_url_object.suffix)
if verbose : print(new_url)
try:
obj,created = simpsons_data_object.get_or_create(
season=season,
episode=episode,
defaults={"url":new_url,"seen":"False"}
)
obj.url=new_url
obj.save()
except MultipleObjectsReturned:
print("duplicated object for season: "+str(episode)+" episode: "+str(episode)+", ignoring")
return 0
+75
View File
@@ -0,0 +1,75 @@
from django.http import HttpResponse
from django.db.models import Count
from django.shortcuts import redirect
from .models import SimpsonsData,simpsons_data_object
from .utils import mark_episode_watched
import random
import threading
def hello(request):
return HttpResponse('<h1>Hello Simpsons view!</h1>')
def episode_generator(request):
boolean_restart = True;
simpsons_object = {}
while (boolean_restart):
maximum_number_of_seasons = simpsons_data_object.aggregate(unique_season=Count('season', distinct=True))['unique_season']
random_season = random.randint(1, maximum_number_of_seasons)
print("random season: " + str(random_season))
simpsons_object = simpsons_data_object.filter(season=random_season)
maximum_number_of_episodes = simpsons_object.count()
random_episode = random.randint(1, maximum_number_of_episodes)
print("random episode: " + str(random_episode))
simpsons_object = simpsons_object.filter(episode=random_episode)
episode_seen = simpsons_object.values('seen')[0]['seen']
if not(episode_seen):
boolean_restart = False
else:
print("episode "+str(random_episode)+" from season "+str(random_season)+" already seen")
#Set episode as seen
# It will still update an already seem episode but it works and I'm lazy
#Mark episode as seen on betaseries
thread = threading.Thread(
target=mark_episode_watched,
args=(random_season, random_episode, "watched"),
daemon=True,
)
thread.start()
random_url = simpsons_object.values('url')[0]['url']
return redirect(str(random_url))
def download_file(request):
# fill these variables with real values
fl_path = '/data/download/sonarr'
filename = 'The.Boys.2019.S04E05.2160p.HDR10Plus.WEBRip.6CH.x265.HEVC-PSA.mkv'
# fl = open(fl_path, 'r')
# mime_type, _ = mimetypes.guess_type(fl_path)
# response = HttpResponse(fl, content_type=mime_type)
# response['Content-Disposition'] = "attachment; filename=%s" % filename
some_file = open('/data/kubernetes/Backup/nextcloud/notes/2024-07-28/Course.md', "r")
django_file = File(some_file)
return HttpResponse("<h1>Hello download!</h1><h1><a href='{{ MEDIA_URL }}{{ django_file.relative_path }}'>{{ django_file.name }}</a></h1><h1>bye download!</h1>")
# return response
def download_mo(request,file):
path_to_file = os.path.realpath(file)
response = FileResponse(open(path_to_file, 'rb'))
file_name = file[5:]
response['Content-Disposition'] = 'inline; filename=' + file_name
return response
+276
View File
@@ -0,0 +1,276 @@
from django.apps import AppConfig
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect
from django.core.files import File
from kubernetes import client, config
from celery import shared_task
from lxml import html
import requests
import os
import json
import time
import random
import mimetypes
import ruamel.yaml
import yaml
from urllib import request as urlrequest
from urllib import parse as urlparse
proxy_url = 'http://gluetun-svc.gluetun.svc:8888'
proxy = urlrequest.ProxyHandler({
'http': proxy_url,
'https': proxy_url # Add the handler for HTTPS
})
proxies = {
"http" : proxy_url,
"https" : proxy_url
}
destination_folder = "/stash/"
def hello(request):
return HttpResponse('<h1>Hello stash!</h1>')
def form(request):
return render(request, 'stash/stash_form.html',{})
def album(request):
return render(request, 'stash/album_form.html',{})
def simple(request):
return render(request, 'stash/simple_form.html',{})
def check_and_create_destination_folder(name):
#check if the output directory exist and create if not
if not os.path.isdir(destination_folder):
os.makedirs(destination_folder)
#check if the named directory exist and create if not
destination_named_folder = os.path.join(destination_folder,name)
if not os.path.isdir(destination_named_folder):
os.makedirs(destination_named_folder)
return destination_named_folder
def album_form(request):
name = request.GET.get('name')
url = request.GET.get('url')
external_galleries = request.GET.get('external_galleries')
album_downloader.delay(name=name,url=url,external_galleries=external_galleries)
text_generated = "successfully sent to the album downloader"
return HttpResponse(text_generated, content_type="text/plain")
@shared_task()
def album_downloader(name,url,external_galleries):
print(name+" "+url+" "+external_galleries)
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
req = urlrequest.Request(url)
urlcurl = urlrequest.urlopen(req).read()
page = requests.get(url,proxies=proxies)
webpage = html.fromstring(page.content)
#create the prerequisites folder
destination_named_folder = check_and_create_destination_folder(name=name)
#get all URLs from the code source (searching for href tag on the code)
#https://stackoverflow.com/questions/21455349/xpath-query-get-attribute-href-from-a-tag
webpage_all_url = webpage.xpath('//a/@href')
#search for the href that contains the galleries
webpage_all_album_url = webpage.xpath("//a[contains(@href,'pornpics.com/galleries/')]/@href")
#print(webpage_all_album_url[3])
#print(webpage_all_album_url)
for album in webpage_all_album_url:
print("Album "+album)
print("")
page = requests.get(album,proxies=proxies)
webpage = html.fromstring(page.content)
images_list = webpage.xpath("//a[contains(@href,'cdni.pornpics.com/1280/')]/@href")
images_downloader.delay(name=name,images_url_list=images_list,destination_named_folder=destination_named_folder)
print(images_list)
return 0
@shared_task()
def images_downloader(name,images_url_list,destination_named_folder):
for image_url in images_url_list:
split = urlparse.urlsplit(image_url)
#filename = destination_folder + split.path.split("/")[-1]
filename = os.path.join(destination_named_folder,split.path.split("/")[-1])
print("downloading: "+filename+" -- "+image_url)
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
try:
urlrequest.urlretrieve(image_url, filename )
except:
print("Can't download "+filename+" -- "+image_url)
individual_image_downloader.delay(image_url=image_url, filename=filename)
return 0
@shared_task()
def individual_image_downloader(image_url, filename ):
print("Downloading again: "+filename+" -- "+image_url)
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
try:
urlrequest.urlretrieve(image_url, filename )
except:
print("Still Can't download "+filename+" -- "+image_url+" == Cancelling")
return 0
def simple_form(request):
name = request.GET.get('name')
reddit_downloader(username=name)
text_generated = "successfully sent to the reddit downloader"
return HttpResponse(text_generated, content_type="text/plain")
def reddit_downloader(username):
#create the prerequisites folder
destination_named_folder = check_and_create_destination_folder(name=username)
url = "https://www.reddit.com/user/"+username+"/submitted/.json?limit=1000"
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
req = urlrequest.Request(url)
urlcurl = urlrequest.urlopen(req).read()
data = json.loads(urlcurl)
picture_list=[]
for children in data['data']['children']:
print("adding to the list : "+children['data']['url'])
picture_list.append(children['data']['url'])
images_downloader.delay(name=username,images_url_list=picture_list,destination_named_folder=destination_named_folder)
return 0
def redgif_donloader(username):
#on te front page of the user , https://www.redgifs.com/users/princesspizookie
# F12 and search network , find something that start as api.redgifs.com
# and the file is search?order=new&count=40&type=g
# copy as curl and you got the bearer
#curl curl 'https://api.redgifs.com/v2/users/princesspizookie/search?order=new&count=40&type=g'
#and you get the URLS , needs to be parsedw
return 0
def incremental(request):
return render(request, 'stash/incremental_form.html',{})
def incremental_form(request):
name = request.GET.get('name')
url = request.GET.get('url')
url_suffix = request.GET.get('url_suffix')
maximum_increment = int(request.GET.get('maximum_increment'))
minimum_increment = request.GET.get('minimum_increment')
increment_and_download.delay(minimum_increment=minimum_increment,maximum_increment=maximum_increment,url=url,url_suffix=url_suffix,name=name)
text_generated = "successfully sent to celery"
return HttpResponse(text_generated, content_type="text/plain")
@shared_task()
def increment_and_download(minimum_increment,maximum_increment,url,url_suffix,name):
if minimum_increment == None:
minimum_increment = 1
text_generated = ""
minimum_increment = int(minimum_increment)
maximum_increment = int(maximum_increment)
#check if the output directory exist and create if not
if not os.path.isdir(destination_folder):
os.makedirs(destination_folder)
#check if the named directory exist and create if not
destination_named_folder = os.path.join(destination_folder,name)
if not os.path.isdir(destination_named_folder):
os.makedirs(destination_named_folder)
print("\n downloading for "+name+" "+url+"XXX"+url_suffix)
for increment in range(minimum_increment,maximum_increment):
print("increment : "+str(increment)+"/"+str(maximum_increment))
if len(str(increment)) == 3:
increment_generated ='0' + str(increment)
elif len(str(increment)) == 2:
increment_generated ='00' + str(increment)
elif len(str(increment)) == 1:
increment_generated ='000' + str(increment)
url_generated = url+increment_generated+url_suffix
print(url_generated)
destination_filename = increment_generated+url_suffix
destination_file = os.path.join(destination_named_folder,destination_filename)
print(destination_file)
opener = urlrequest.build_opener(proxy)
urlrequest.install_opener(opener)
urlrequest.urlretrieve(url_generated, destination_file )
text_generated = "\n downloading for "+name+" "+url+increment_generated+url_suffix
print("download completed for "+name+" of "+str(maximum_increment)+" images")
return text_generated
def handle_survey_form(request):
config.load_kube_config(config_file='/kubeconfig/config')
v1 = client.BatchV1Api()
name = request.GET.get('name')
url = request.GET.get('url')
external_galleries = str(request.GET.get('external_galleries'))
stash_folder = "/stash"
if external_galleries:
print("external_galleries is not null")
performer_external_galleries = stash_folder+"/"+name+"_external_galleries.txt"
with open(performer_external_galleries, "a") as f:
f.write(external_galleries)
skip_searching_gallery = True
else:
print("external_galleries is null")
skip_searching_gallery = False
with open('django_code/stash_management/templates/template.stash-pornpics-dowloader.job.yml', 'r') as file:
#get the manifest in a variable template_manifest from the manifest file
template_manifest = yaml.safe_load(file)
#edit the container name
template_manifest['metadata']['name'] ="stash-pornpics-dowloader-"+name
template_manifest['spec']['template']['spec']['containers'][0]['name'] ="stash-pornpics-dowloader-"+name
#edit the command based on the input
command=['bash', '/config/download.sh', '--http_proxy', 'http://gluetun-svc.gluetun.svc:8888', '--BASE_URL', url, '--pornstars', name]
template_manifest['spec']['template']['spec']['containers'][0]['command']=command
#execute based on the value
api_response = v1.create_namespaced_job(body=template_manifest,namespace='stash')
return HttpResponse(api_response)
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+33
View File
@@ -0,0 +1,33 @@
"""
URL configuration for django_code project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from apps.stash_management import apps as stashapp
from apps.stash_management import views as stashview
urlpatterns = [
################## stash #####
path('', stashview.home),
path('hello/', stashapp.hello),
path('form/', stashapp.form),
path('incremental/', stashapp.incremental),
path('album/', stashapp.album),
path('album-form/', stashapp.album_form, name='submit_form'),
path('simple/', stashapp.simple),
path('simple-form/', stashapp.simple_form, name='submit_form'),
path('submit-form/', stashapp.handle_survey_form, name='submit_form'),
path('incremental-form/', stashapp.incremental_form, name='submit_form'),
]
@@ -5,4 +5,8 @@ from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
return HttpResponse('<h1>Hello Django!</h1>')
return HttpResponse('<h1>Hello stash!</h1>')
def home(request):
return render(request, 'stash/listing.html')
+100
View File
@@ -0,0 +1,100 @@
from django.contrib import admin
from django.utils.html import format_html
from .models import StreamingSiteTestingData,StreamingRedirectData
from .utils import full_testing
from apps.website_redirection.utils import redirect_method
from urllib.parse import urlsplit, urlunsplit
from core.admin import UniversalModelAdmin
@admin.action(description="Add this show to streaming")
def re_redirect(modeladmin, request, queryset):
output_generated = ""
for query in queryset.values():
print(query)
key = "streaming"
value = query.get('url_display')
output_generated = output_generated + redirect_method(key,value)+";"
modeladmin.message_user(
request,
output_generated
)
@admin.action(description="check the URLs")
def check(modeladmin, request, queryset):
for query in queryset:
website_url = query.url
status=full_testing(website_url)[0]
result= full_testing(website_url)[1]
print(str(query.url)+": "+str(status)+" -> "+str(result))
query.status = status
query.result = result
query.save(update_fields=["status","result"])
@admin.action(description="cleaning the url")
def urlcleaning(modeladmin, request, queryset):
for query in queryset:
# Split the URL into components
parsed = urlsplit(query.url)
# Rebuild using only scheme and netloc, adding a trailing slash at the end
base_url = urlunsplit((parsed.scheme, parsed.netloc, "/", "", ""))
query.url = base_url
query.save(update_fields=["url"])
print("Cleaning :"+str(base_url))
return 0
@admin.register(StreamingSiteTestingData)
class streamingAdmin(UniversalModelAdmin):
list_display = ['clickable_links','result_colored','newstatus']
fields = ['url']
actions = [check,urlcleaning]
def result_colored(self, obj):
colors = {
'REACHABLE': 'green',
'VPN REQUIRED': 'yellow',
'UNREACHABLE': 'red',
}
return format_html(
'<b style="background:{};">{}</b>',
colors[obj.result],
obj.result,
)
def newstatus(self, obj):
if obj.status != '200':
return format_html('<div style="width:100%%; height:100%%; background-color:orange;">{}</div>', obj.status)
#return obj.status
@admin.register(StreamingRedirectData)
class StreamingRedirectAdmin(UniversalModelAdmin):
list_display = ['name','image_tag','season','episode','randomViewing','clickable_links','addedDate','alias']
actions = [re_redirect]
#fields = ['name','season','episode','url_example','prefix','infix','suffix','alias','randomViewing','seasonInformation']
fieldsets = (
(
'Serie', {
'fields': ('name', 'season', 'episode','randomViewing')
}),
(
'url', {
'fields': (('prefix','infix','suffix'))
}),
(
'Information', {
"classes": ["collapse"],
'fields': ('seasonInformation','alias','betaserieShowId','maximumNumberSeason','poster_url')
}),
)
link_field = 'url_display'
def image_tag(self,obj):
return format_html('<img src="{0}" style="width: 355px; height:200px;" />'.format(obj.poster_url))
+7
View File
@@ -0,0 +1,7 @@
from django.apps import AppConfig
class StreamingConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.streaming'
label = 'streaming'
@@ -0,0 +1,26 @@
# Generated by Django 4.2.30 on 2026-08-05 12:00
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='streamingData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url', models.CharField(max_length=1000)),
('addedDate', models.DateField(auto_now_add=True, null=True, verbose_name='Published')),
('status', models.CharField(blank=True, max_length=1000, null=True)),
],
options={
'db_table': 'streaming',
},
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.30 on 2026-08-05 13:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('streaming', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='streamingdata',
name='result',
field=models.CharField(blank=True, max_length=1000, null=True),
),
]
@@ -0,0 +1,29 @@
# Generated by Django 4.2.30 on 2026-08-07 13:13
import apps.streaming.models
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('streaming', '0002_streamingdata_result'),
]
operations = [
migrations.CreateModel(
name='StreamingRedirectData',
fields=[
('name', models.CharField(help_text='Name of the show', max_length=1000, primary_key=True, serialize=False)),
('url_example', models.CharField(help_text='https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=18&episode=5', max_length=1000)),
('prefix', models.CharField(blank=True, help_text='https://www.1shows.org/tv/456-the-simpsons?streaming=true&season=', max_length=1000, null=True)),
('infix', models.CharField(blank=True, help_text='&episode=', max_length=1000, null=True)),
('suffix', models.CharField(blank=True, max_length=1000, null=True)),
('addedDate', models.DateField(auto_now_add=True, null=True, verbose_name='Published')),
('alias', models.CharField(default=apps.streaming.models.StreamingRedirectData.sanitize, max_length=1000)),
],
options={
'db_table': 'StreamingRedirect',
},
),
]
@@ -0,0 +1,28 @@
# Generated by Django 4.2.30 on 2026-08-07 14:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('streaming', '0003_streamingredirectdata'),
]
operations = [
migrations.AddField(
model_name='streamingredirectdata',
name='episode_to_watch',
field=models.IntegerField(default=1),
),
migrations.AddField(
model_name='streamingredirectdata',
name='season_to_watch',
field=models.IntegerField(default=1),
),
migrations.AlterField(
model_name='streamingredirectdata',
name='alias',
field=models.CharField(blank=True, max_length=1000, null=True),
),
]

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