mirror of
https://expo.survex.com/repositories/troggle/.git
synced 2025-12-14 18:17:06 +00:00
Compare commits
2313 Commits
django-1.1
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 762d11b720 | |||
| 18a9bcc258 | |||
| 31d7c4a718 | |||
| 137b6bce7d | |||
| ced9a7b024 | |||
| 0e6a3e457d | |||
| 88833941b5 | |||
| e2c1bc3516 | |||
| 2807ed5c21 | |||
| 0a16a0bd9d | |||
| 76fe0c0379 | |||
| 7889162420 | |||
| f52eab842f | |||
| 8b00c441f5 | |||
| d4ec144434 | |||
| f378406893 | |||
| 90ae23fc05 | |||
| 8d5fa586ca | |||
| 7e5201edc6 | |||
| 7e599afd40 | |||
| 66834caffb | |||
| 7bbc413902 | |||
| c6647907e5 | |||
| 5b53264316 | |||
| e39037b333 | |||
| 0a5e779dfd | |||
| f573838e89 | |||
| 061738d56d | |||
| b2104e191b | |||
| 3fb310ed97 | |||
| f5c1c6a90e | |||
| c08d06d81f | |||
| 78699b934d | |||
| 28914916b6 | |||
| 179ba32c5a | |||
| 1968c099fe | |||
| d9953d8bbe | |||
| 6e5b893646 | |||
| 993005761c | |||
| 43b3d712a7 | |||
| ac50d28d36 | |||
| 7daef9f253 | |||
| 5e4ab5006f | |||
| 79ef45a99f | |||
| ed43ab4bcf | |||
| 4bbbdba571 | |||
| 6ccd16a508 | |||
| d25a2154af | |||
| e842ae1ca3 | |||
| 905d9af978 | |||
| 9806212395 | |||
| 76854a84d7 | |||
| 870dfb5129 | |||
| bba585acf1 | |||
|
|
305cb8a392 | ||
|
|
90141c4263 | ||
| deead77c08 | |||
| 4d3821f572 | |||
| ff739b9e24 | |||
| d455b9aee7 | |||
| 4138dd0671 | |||
| 400fd8430e | |||
| 1370524479 | |||
| 6025f0b1dc | |||
| 68621a4a92 | |||
| bc154c9016 | |||
| b1e518b3aa | |||
| a7ec46cb70 | |||
| 9df466de2f | |||
| ca9fd8ec55 | |||
| 64419ffb7c | |||
| 5b129fee8f | |||
| a32bee3c8c | |||
| 02fe1f9750 | |||
| 544cf0522a | |||
| 810f4a8af8 | |||
| a7152b591d | |||
| 19c3f02c2d | |||
| cc3203a31f | |||
| 4933515be6 | |||
| bab1736636 | |||
| b982a0a3ca | |||
| d24c992482 | |||
| eec9760b6c | |||
| 26332d86e7 | |||
| 1b82113f11 | |||
| 87fd355985 | |||
| 2a0001d994 | |||
| 8e147986ae | |||
| afe9190c97 | |||
| 0cf76e8c6b | |||
| 53e03d5462 | |||
| 8379f7b154 | |||
| ebfdc6c34c | |||
| ae88d279cb | |||
| e70dfec759 | |||
| 4dece336f2 | |||
| 9d235ff10a | |||
| b4f719d7bb | |||
| 6123c03ef4 | |||
| 579389589b | |||
| 0bbb0a5173 | |||
| 6ee06f0879 | |||
| 962263beb0 | |||
| 08e545f03a | |||
| c2c70e6a95 | |||
| f76fd8ab65 | |||
| 4075f43c5f | |||
| 7a9bcd02f7 | |||
| 959c358c09 | |||
| 7564ce4d27 | |||
| 5fa4e3f72a | |||
| cf566d4bc7 | |||
| 08577deeb5 | |||
|
|
2e26532837 | ||
| 9b0da4ef2f | |||
| 51c9fe8839 | |||
| 5f2791816d | |||
| 89e38397b9 | |||
| c82ed82aba | |||
| 1bae6c6cd1 | |||
| 57fb3a0078 | |||
| f0c5168067 | |||
| df0ea7ab30 | |||
| 786261fcfd | |||
| 751f677c44 | |||
| bbb769faab | |||
| 76f7b10777 | |||
| d6dcd7a39a | |||
| e3df02076c | |||
| bf09ee0054 | |||
| 4fa767585c | |||
| 5204e3cc68 | |||
| 29eae4e9b2 | |||
| 3032386852 | |||
| 07e702c458 | |||
| 2b5d3ecb01 | |||
| 6ffcae16a2 | |||
| ec4feaee8b | |||
| 6a6ec66a88 | |||
| 0135d47536 | |||
| 2f7354d556 | |||
| c1bf6e94aa | |||
| 8e9ae0dd92 | |||
| 9e9122da81 | |||
| 8cf85ca5ef | |||
| bb74b95aaf | |||
| 1ca7fd5a2c | |||
| 57b68fc7db | |||
| f9d8a2bea3 | |||
| 1d7603a7fe | |||
| b79523e4e4 | |||
| 226b13b136 | |||
| 67b366a2d0 | |||
| e983ac2f00 | |||
| a319863654 | |||
| 9409e27e1d | |||
| 833aeaeeba | |||
| 9a3651ed8b | |||
| b5540fd543 | |||
| 2039501672 | |||
| 1cfcbccf76 | |||
| 083de7fdd5 | |||
| 29840aabff | |||
| 5770a9b2e7 | |||
| 24079ab5fe | |||
| af22823e7a | |||
| 25e5f5ccde | |||
| 543d30c84a | |||
| 2aee915abc | |||
| b206d08b39 | |||
| d7bfe83039 | |||
| db5be84d77 | |||
| 17347850b3 | |||
|
|
93172f3b70 | ||
|
|
a2356d9559 | ||
| 14222dd3fc | |||
| b53f09bb8f | |||
| 5ea359561a | |||
| 7149b5d379 | |||
| 0c97c11d82 | |||
| ae6e8205a1 | |||
| 7d0155fea8 | |||
| f12f788248 | |||
| 51d8a50d90 | |||
| 15156aa79c | |||
| ea0a5b153f | |||
| 6cf7bbb7d9 | |||
| c2292038c4 | |||
| d19e60976e | |||
| 38744a1781 | |||
| 5f1b01bea7 | |||
| dbec098bba | |||
| 468634527f | |||
|
|
a9e687c7ce | ||
| 4b4ab973f8 | |||
| 6c962c0132 | |||
| 8d901efdfc | |||
| 823ef5b7e7 | |||
| 501692586d | |||
| fc427993e7 | |||
| c89e8cea90 | |||
| c29548db01 | |||
| a7966e714d | |||
| 19844cd94a | |||
| 3d12397d9a | |||
| 576e4a20f0 | |||
| 6e3279e585 | |||
| fdc656dbba | |||
| 7a95c6478c | |||
| 40fb066e2b | |||
| d8cdf7bc5a | |||
| e1d7b35015 | |||
| 40aeee9bf9 | |||
| 1bb950ec45 | |||
| c7df859d80 | |||
| 955baeb238 | |||
| 9ae9ca9ec3 | |||
| 06f9de360a | |||
| d06526846f | |||
| e0c87b167b | |||
| 63ff01700f | |||
| 85185c23b4 | |||
| da28aa7b22 | |||
| 38130c876b | |||
| 31c77fd89c | |||
| 2b010384f1 | |||
| 9a4916cc58 | |||
| ec3f513308 | |||
| ab8d527163 | |||
| 3bdf73ccad | |||
| 7fb42c926f | |||
| 06861144c3 | |||
| 71c3fb12ab | |||
| 4e9c766493 | |||
| 2f098b7333 | |||
| b1d10a41d5 | |||
| 54717a436c | |||
| c98f386c13 | |||
| 73812b41b1 | |||
| ddb90b3a39 | |||
| 3118b717a0 | |||
| e95cff5818 | |||
| 8a95b0609d | |||
| 81fba01d1e | |||
| 731095e2d9 | |||
| 6586c00a37 | |||
| 0ab0750511 | |||
| aeaf7cf57f | |||
| a950cc60d9 | |||
| cc06e2e1f4 | |||
| 95190324fb | |||
| c23e93d7a7 | |||
| 61c0f91088 | |||
| 6c30a9ffcb | |||
| 95878e630d | |||
| 6a5513e52b | |||
| dc83ae1bc6 | |||
| 9fd86dc0c4 | |||
| ae36f1a9ce | |||
| a976497b3a | |||
| 3fb99eb4be | |||
| 3a3e5765f9 | |||
| d05b6b9b5f | |||
| 096c3be4e5 | |||
| b8b2d52866 | |||
| c099bf8071 | |||
| 89afdded38 | |||
| 91d8d33e95 | |||
| f4afa0c672 | |||
| 1c07dc5a94 | |||
| 54c2e3c9c3 | |||
| 10352f2ccb | |||
| 0e2ccee678 | |||
| 79b2280cde | |||
| 60fcb831d1 | |||
| 441049b0f1 | |||
| c4f990f002 | |||
| 875145fc38 | |||
| a357f4cf5b | |||
| 06b81ea825 | |||
| 28d24e48de | |||
| 7c8253dcfc | |||
| c3eed61080 | |||
| ea77d4f3e4 | |||
| f757d7632c | |||
| 7b462a883b | |||
| f39e2c9bb5 | |||
| 3003b3c3c3 | |||
| a0243c030e | |||
| 859a1dd4a8 | |||
| e9e0050162 | |||
| 59599ecdbf | |||
| afa3727757 | |||
| 062ab3e5f8 | |||
| 43634fb475 | |||
| 49ea30cf06 | |||
| 4a0496b3b4 | |||
| e080610010 | |||
| 6d5c6c0d0b | |||
| 8073aca5d2 | |||
| d275211aa7 | |||
| 0084412258 | |||
| 3d1dbf2e0d | |||
| 2681127037 | |||
| 53865e64d8 | |||
| bb4df7d07f | |||
| cf89b1b67f | |||
| e39760590f | |||
| 798ffc248e | |||
| db1c1fec6c | |||
| 6e7f0d39cc | |||
| 1f0a4806a2 | |||
| 11cf61b0a3 | |||
| bac65b5897 | |||
| 98594a07e2 | |||
| 1825ed55fc | |||
| 6d25f70491 | |||
| f1682367ee | |||
| aef0de715d | |||
| ce508b0eb2 | |||
| 7fab42fa9e | |||
| 5a678dcb0e | |||
| 288ce80e07 | |||
| 3ad75d4439 | |||
| 4f1d808720 | |||
| 622dfc34e3 | |||
| d78345e335 | |||
| 1c3d2f7b73 | |||
| 2446758e6e | |||
| 95ea87233f | |||
| 0d105d40da | |||
| c479345b6c | |||
| 1e3a684c4b | |||
| a5bce14226 | |||
| 9c3a40dd98 | |||
| 8af4fc5b90 | |||
| 1502ffb0c4 | |||
| 27cc23fe3b | |||
| fedcc6d201 | |||
| 61722fd6c0 | |||
| 27a14d0a0f | |||
| 072a04487d | |||
| 2daad646e3 | |||
| a5d0ad3e4f | |||
| f842dab12a | |||
| 173ee2348f | |||
| a5341c4eb2 | |||
| 18517f5ec7 | |||
| c602587990 | |||
| c5357cab3d | |||
| a784ca8641 | |||
| d19b1e79ab | |||
| 157f1fcf27 | |||
| bb66c09498 | |||
| e632a0d918 | |||
| fd4a3bc015 | |||
| 8ac3791fcf | |||
| b59ab47bc2 | |||
| 65cdeb4994 | |||
| 01afb09a6e | |||
| b34ad3a82b | |||
| ba5987b674 | |||
| d79ffd8354 | |||
| 8d8bc47e79 | |||
| 650cee4b0e | |||
| 7769fa868e | |||
| 1fcb2c5203 | |||
| 960958c922 | |||
| e37165f136 | |||
| df52ee9251 | |||
| 4f9468ec66 | |||
| 0201281e38 | |||
| b9f9cba672 | |||
| 3351d949d9 | |||
| 4d49eefccb | |||
| 79cf342d33 | |||
| a4957df557 | |||
| 551e849a0f | |||
| d903f883eb | |||
| ba4851fe80 | |||
| 1678dedf08 | |||
| b94ea8eb22 | |||
| 54566ef092 | |||
| c4eb14148a | |||
| d21278c5de | |||
| d49d2eecee | |||
| 05c687b253 | |||
|
|
919e02cee9 | ||
| 6cfb6f3373 | |||
| 8ce5db9175 | |||
|
|
219cc2870a | ||
| 1a044759c6 | |||
| a6a0db3c8f | |||
| 0c7fafd07f | |||
|
|
999d3fd02b | ||
| abb32e6b5d | |||
|
|
fe9589039e | ||
| ea2f4526e8 | |||
| 9331d7e1db | |||
| d1ca37f00e | |||
| 4116b32c33 | |||
| 3353b4e1fc | |||
| 12499f423d | |||
| afd2b7cc18 | |||
| d2fade5a3d | |||
| eb22047c08 | |||
| f4fe681524 | |||
| 3df9b1a3d6 | |||
| 8db340fd62 | |||
| c5b08ce80f | |||
| f3bd9024cf | |||
| 21d69994e7 | |||
| d603bef64e | |||
| d31777dc8d | |||
| 49c0c0fe3a | |||
| 486a50f876 | |||
| 219b8b792e | |||
| 5b97cd83dd | |||
| 4435836313 | |||
| f5441e4c6b | |||
| f73f1b50fe | |||
| 1ddd4da27b | |||
| 2623af92c4 | |||
| 52600df2f2 | |||
| f2a43558f9 | |||
| e3a9498656 | |||
| a3c7f165b9 | |||
| ace2325773 | |||
| 6d2484376a | |||
| 13c5d14a9f | |||
| dac3e6e288 | |||
| e7444d20a4 | |||
| ecd187e88e | |||
| 09a16fed3b | |||
| 9274600f1e | |||
| 6cdf883ad7 | |||
| b71bb05fcd | |||
| 4652d83b49 | |||
| 8dbad16ece | |||
| 60d24dc48e | |||
| dccd465354 | |||
| 2e62f3c7d4 | |||
| 2b97c8f783 | |||
| 5ee26af02a | |||
| 42b978197c | |||
| 90ecdda407 | |||
| 1b6333fdef | |||
| 011e6777c9 | |||
| 19bbb00dcc | |||
| 151cba336b | |||
| d8ab17217f | |||
| f560cce348 | |||
| 407e97f91c | |||
| e532b15c1d | |||
| a836dd2619 | |||
| b541e258ec | |||
| 4677ac8b2c | |||
| 30760654b7 | |||
| eb74940ca8 | |||
| 5475a0b853 | |||
| 492f2b00b0 | |||
| 8eb248bb13 | |||
| 3b5ead22f2 | |||
| 36bb964845 | |||
| f04aa7d067 | |||
| 1d3b8d44b4 | |||
| cfc7a4b9f6 | |||
| 7730b2535f | |||
| 321f912083 | |||
| 58c9dd7d09 | |||
| bbdd2cc58f | |||
| 1ffc971285 | |||
| c401af7bfc | |||
| f3235f8b76 | |||
| 8b6a8be2c8 | |||
| eb07a36eaf | |||
| 54a069df84 | |||
| 2bebc781a1 | |||
| 8c91d2f47d | |||
| 555cb63be3 | |||
| 8c56a45e7c | |||
| 700512c008 | |||
| 26eff0172b | |||
| aa164e9d81 | |||
| cb9bfbf5d2 | |||
| d3042264b3 | |||
| 2598126879 | |||
| 29a7b984da | |||
| 7e92ee2084 | |||
| e6601e1bf7 | |||
| 2787b6c4ec | |||
| b6fc5f3d32 | |||
| fd189c68b3 | |||
| c7f0061605 | |||
| 005e1c132a | |||
| 9063e54e6c | |||
| 3e198fc410 | |||
| fc145648e6 | |||
| 6e1c83ec6e | |||
| d57e49b5b2 | |||
| aaabcafcfe | |||
| 74ce8894d2 | |||
| e64cb212c1 | |||
| 581f0259e2 | |||
| f99141b0cb | |||
| 89ef1afbe8 | |||
| 1203b51530 | |||
| 517d27458c | |||
| 7dbaea5d24 | |||
| 859d9a5b22 | |||
| beb83e93f4 | |||
| e97d60a1c4 | |||
| 3bfb082e83 | |||
| 5e6aa0a175 | |||
| 490fb61571 | |||
| c1f9a26f5b | |||
| 62320e9f7e | |||
| 526d0ad904 | |||
| 9166b6ed74 | |||
| 245486666c | |||
| 6ec90b4665 | |||
| 7c36fd5d2b | |||
| f590d0c12c | |||
| 219637e215 | |||
| 957f78b1a3 | |||
| ca103fde22 | |||
| a2f4591f72 | |||
| 07fc372b41 | |||
| feaf38aa39 | |||
| c01f0e1dff | |||
| 48f2407a06 | |||
| 2de4ad2a2f | |||
| baf58a5433 | |||
| 41fff1f3dd | |||
| bca1123d4d | |||
| 83e22f828c | |||
| c95d861516 | |||
| afa8ff4f66 | |||
| c25a4b47de | |||
| 78bc7323e9 | |||
| 210174b901 | |||
| c27a4f0ddc | |||
| 5740a6b0d6 | |||
| ff08e05485 | |||
| 0ce2ae4d1c | |||
| 5a4d874b9f | |||
| 41893b81e8 | |||
| 3ba1454f15 | |||
| 12fa55f537 | |||
| 6729698d7b | |||
| 00f5ffa1b6 | |||
| a6ca40becd | |||
| 5b23b2df8a | |||
| ceb20f8565 | |||
| 1365190330 | |||
| b907dcc993 | |||
| 2cb665e141 | |||
| 11756fa0bb | |||
| ee5b36a33c | |||
| 35b04d096e | |||
| f4c25ba163 | |||
| 1a5e6167fd | |||
| f874bdc55e | |||
| cef872d038 | |||
| fca95ce539 | |||
| 24c5ba9711 | |||
| a4783d2332 | |||
| 7908257d63 | |||
| f5f3adf7da | |||
| 63ef8c9fb1 | |||
| a8c9f8b899 | |||
| a68ef27284 | |||
| 35e6bbe1ac | |||
| cb854696c9 | |||
| 5ffe8230b1 | |||
| 8b2ec54676 | |||
| f36f10d903 | |||
| 69ce1d91f3 | |||
| 57bab53cec | |||
| b28b590b60 | |||
| 0ae1315f59 | |||
| 3ba9f9d5c7 | |||
| 8732641cfd | |||
| 1c8c36c82f | |||
| b6ffcb63bf | |||
| cb81a066db | |||
| 704ff8335d | |||
| c58f2716b0 | |||
| e4d3e33dec | |||
| 208c0ffa1f | |||
| 0f754694ed | |||
| c3b08c85ef | |||
| a6730b1b3a | |||
| c51f76ed83 | |||
| e432098f6a | |||
| 8e1cf1021d | |||
| 6789d4f627 | |||
| 24a97b9dbd | |||
| 897cdf9aee | |||
| 313d4bde30 | |||
| d1e853ef47 | |||
|
|
b93ff5552b | ||
| a6c47b2654 | |||
| 87d67f5820 | |||
| 6d16f8f7ca | |||
|
|
09dbe5b14b | ||
| 70bdb50ae7 | |||
| 03fa36576b | |||
|
|
5fff060487 | ||
| c18ebeb992 | |||
| 36ef9f961d | |||
| f156b89f32 | |||
| efbb5b1b97 | |||
| 76f5ca3f45 | |||
| 1874a755a9 | |||
|
|
b8d5ce2542 | ||
|
|
77fafc378e | ||
| af414396d6 | |||
| dfdf21459a | |||
| b73ac24a3b | |||
| 65f0c1e29f | |||
|
|
2743be281e | ||
| 8bafe9be98 | |||
| a0ef426cdb | |||
| 5dfaa893ad | |||
| 5523c7a484 | |||
| e2d7ab4416 | |||
| dbfe72071e | |||
| d970942f04 | |||
| e1eb85969a | |||
| 4c8a88d20c | |||
| b3490aa52d | |||
| 7325d934f9 | |||
| 83920e4d83 | |||
| e9255a2cb5 | |||
| abfa5b2757 | |||
| 5948db2555 | |||
| a61751e1fb | |||
| 422d2324e8 | |||
| 957002507c | |||
| 18a8fcbfb5 | |||
| 478f8b9ea1 | |||
| 974b91d939 | |||
| e46cbe5d41 | |||
| f26c9d1ff2 | |||
| c518fbc5af | |||
| 1b44bc2867 | |||
| 00ce42c1cf | |||
| c72efe1326 | |||
| 1e00e56522 | |||
| 1c19211c33 | |||
| 96b034d026 | |||
| ebfab4da45 | |||
| 8fd09bef92 | |||
| 521fd20e37 | |||
| 480b98a704 | |||
| 3158bfb746 | |||
| 857b4c5809 | |||
| 32e487eca6 | |||
| a63f04d194 | |||
| 80c19864ad | |||
|
|
c0e35e964b | ||
|
|
e1945feef5 | ||
|
|
b191678570 | ||
|
|
ab1212dd8a | ||
| bd81bd0b01 | |||
| 740a5a4fa8 | |||
| 7c7c0812e8 | |||
| 7a61bc47ea | |||
| 76688695b8 | |||
| 688a1795e7 | |||
| 026d959aeb | |||
| d333ebe88e | |||
| ddf88d5394 | |||
| 41e64a217c | |||
| 5961175193 | |||
| e1c9de14ca | |||
| 7b67eb52dc | |||
| 680477d2d5 | |||
| 6bc0884d43 | |||
| d2ee32d3e6 | |||
| 699c19245a | |||
| 7fb0f0734d | |||
| 2761fb5867 | |||
| 0c1601e1b0 | |||
| 08c56644eb | |||
| ca289afe68 | |||
| 717ef2fad9 | |||
| d5900b6b7a | |||
|
|
29e16b66b7 | ||
|
|
51cf09ece7 | ||
| dec7acaf14 | |||
| 9bc94f59b5 | |||
| 2215464cfa | |||
| b5cc66a576 | |||
| 1e8a5bea6e | |||
| 1ba37665b5 | |||
| 3f94955883 | |||
| 5652b9b66a | |||
| 07d9365747 | |||
| bd0a9332df | |||
| df79bdb711 | |||
| c0687615a4 | |||
| 2c67351424 | |||
| d524f94c47 | |||
| 3c62defdfd | |||
| a63275f913 | |||
| 55bbccb4ca | |||
| 70c629f455 | |||
| 6630877b02 | |||
| 99b87f808c | |||
| f78c719fd7 | |||
| fc60bde3ec | |||
| c7cb8ece2e | |||
| 685131a4c1 | |||
| c95e6e8097 | |||
| cc4a7f04da | |||
| 742ccb5f0b | |||
| 62de8095d8 | |||
| 84e0b4fe3f | |||
| f706bd814e | |||
| 97bb1a3ad1 | |||
| 788de853dc | |||
| 7672de2dd1 | |||
| 87d9804864 | |||
| f14bd984f8 | |||
| 0843a27966 | |||
| 33477f2b40 | |||
| b522899216 | |||
| c8c21fbe04 | |||
| 1694d01536 | |||
| 2b96086535 | |||
| 54ffab3e93 | |||
| 8f87e4f77a | |||
| 1641dfe5f1 | |||
| e7a0c57330 | |||
| 24029be7d3 | |||
| 850e87b97a | |||
| dfd8f4a453 | |||
| 8c7d4f8ebb | |||
| 423347dbe5 | |||
| a823a7b2d8 | |||
| 0874ca38f4 | |||
| c4da7f6fa7 | |||
| 9b96c4c745 | |||
| c1d14ea49d | |||
| c0e4bee26b | |||
| 1cbbdad1b3 | |||
| de298748e3 | |||
| 0762d53c18 | |||
| bf8bf7b3d2 | |||
| 6b94829315 | |||
| d88ae2f78c | |||
| a786f4813f | |||
| c51c2326fe | |||
| 5d383e0445 | |||
| 5cfc237448 | |||
| bf8d881770 | |||
| 246fb29193 | |||
| d3a7a9823a | |||
| 3b1fd56fe4 | |||
| a2bddaeb89 | |||
| 0cd527761e | |||
| 7e1c8797b8 | |||
| 2452fe5752 | |||
| d34c2c50d7 | |||
| d6a3006444 | |||
| 973f9bedd5 | |||
| 12293e4513 | |||
| 67136e9881 | |||
| eed031cf71 | |||
| 0151626c0b | |||
| 31461531fc | |||
| 152156227d | |||
| 7c0187c75b | |||
| 5f67af35f0 | |||
| c3642f1ae4 | |||
| 2f3827d60e | |||
| dfdbba6550 | |||
| 0a72e50c90 | |||
| 207513b8b5 | |||
| ed993761a1 | |||
| fcfa59cdf7 | |||
| eae919e5b2 | |||
| 6950fc1d1d | |||
| adbc8f7955 | |||
| da10605d75 | |||
| bc621efc36 | |||
| 9f4306e367 | |||
| 21e0700b8d | |||
| ad2d25ed00 | |||
| f161ed3cf4 | |||
| d8aad0ba2b | |||
| 7b8703dadc | |||
| 16d3ee9f92 | |||
| fd94909ee7 | |||
| c80db1a55f | |||
| c884156889 | |||
| 8dcae6437e | |||
| 904b6309cf | |||
| a67a97b9fc | |||
| e98c63f51c | |||
| 7f9f598f11 | |||
| 421b47c137 | |||
| 0d5297f08c | |||
| 9aad95bfd0 | |||
| 505eb6475e | |||
| 51dbf5e9e6 | |||
| 98e7cf6d1b | |||
| d6eadeffd6 | |||
| cf6ba7568f | |||
| d4cf76da40 | |||
| f10db6d73d | |||
| 18e1775cff | |||
| 85dba41601 | |||
| 9c05cb6af0 | |||
| 017f916ef9 | |||
| a85f859f88 | |||
| 81b5198cd1 | |||
| 9db0b2a191 | |||
| a8d4b05617 | |||
| 3390f17aa4 | |||
| 29879fdde2 | |||
| 7ddf7fe373 | |||
| 1effc10e3f | |||
| 85487efee3 | |||
| db3d1ff4ef | |||
| 1085a14b92 | |||
| 0295fce110 | |||
| 724989f985 | |||
| 70dd61b2ba | |||
| 33a485d207 | |||
| af136d3432 | |||
| d323ff2700 | |||
| 47db19f1a2 | |||
| 9d6552ea22 | |||
| 2f6017d6d3 | |||
| ab79a43afa | |||
| ad272fab3b | |||
| 327b1923b0 | |||
| 54136721b8 | |||
| 5a191ee554 | |||
| 7779544c0c | |||
| 28d1092956 | |||
| 5fc5c1285a | |||
| e1aabc84e8 | |||
| 8b76cad15a | |||
| 1631111a7f | |||
| 335ffb360d | |||
| 6d5cee7f6a | |||
| 6b64149131 | |||
| 2c5ebde308 | |||
| 69340db438 | |||
| 1ddb8248df | |||
| 0dc0e27519 | |||
| 3c6cae20ed | |||
| 83d058221d | |||
| 38d0e855c9 | |||
| cc9f425fb5 | |||
| 8c721e905a | |||
| 8e2990ca7a | |||
| 220e1327d7 | |||
| 0ea8fadaeb | |||
| f3d5a389eb | |||
| 2506517e17 | |||
| ac128705f6 | |||
| d3ac321d38 | |||
| a5dc78b04d | |||
| a2e30b29ef | |||
| f53b551d5a | |||
| 3a04a8490e | |||
| 2c89cdc1b9 | |||
| 101910a957 | |||
| eb7a1efea5 | |||
| a4f676fd32 | |||
| 1a8bc17f80 | |||
| c9729c046c | |||
| 34064972e9 | |||
| 5a7eda0968 | |||
| 98bc6007a5 | |||
| 33a08bed4f | |||
| 98412c140d | |||
| 1cf02afec9 | |||
| 9380f751b2 | |||
| e209a9bb37 | |||
| 2dc8faee35 | |||
| c29c12ea76 | |||
| bbb821e2f9 | |||
| 069a1d57c9 | |||
| df86103407 | |||
| d48163f167 | |||
| f23ea0ce4b | |||
| d08a6aa204 | |||
| 93397a774f | |||
| f2a76da7e2 | |||
| 3d51588cc1 | |||
| c44dea4d2b | |||
| 24b5018c8d | |||
| d3c1736119 | |||
| da8e22c856 | |||
| 741754e676 | |||
| c2ae586e5b | |||
| a4f84f0812 | |||
| 9e9c24ad44 | |||
| b1a5251768 | |||
| 0b7a9cf03e | |||
| eec0426612 | |||
| 65936bdce5 | |||
| f949d3732e | |||
| 9269d1ec52 | |||
| 1baf528d0a | |||
| 99ff7c741b | |||
| 12aa6ced86 | |||
| ee5a2c9ef8 | |||
| 126aaa0633 | |||
| 68409c70fd | |||
| 33026ca9ea | |||
| 7df2d44748 | |||
| b709dd2f1b | |||
| 51298786c3 | |||
| 1375b34cbe | |||
| 2c74a7317d | |||
| c8430d1ff7 | |||
| 3b9a2b990d | |||
| 2c509d085e | |||
| bed663a031 | |||
| e101f4ed2f | |||
| 0dfe9d94b2 | |||
| 0efdfe66d5 | |||
| a0f85454f8 | |||
| c76c09fced | |||
| efa40b47ca | |||
| 6bca75b877 | |||
| 585eb534a9 | |||
| 7fc058b1da | |||
| 8d9b320d89 | |||
| 89c1c65340 | |||
| 5f07f234ef | |||
| af6081e406 | |||
| 1165b10fe4 | |||
| 4a7c14f8dc | |||
| 955fe9661a | |||
| d93133c338 | |||
|
|
a86f251423 | ||
| 6482aa697f | |||
| 0706d5dc77 | |||
| cdac10fdcf | |||
| 1f656b2101 | |||
| fab7adf079 | |||
| 72a6b091e6 | |||
| af552a3d62 | |||
| 5ce21564fc | |||
| 7d4ca5dae2 | |||
| 3c78ab79ca | |||
| 748cb91a20 | |||
|
|
8463f8947e | ||
|
|
380565c6f5 | ||
| 31c815eeb0 | |||
| c31615b1ff | |||
| 3bd7684d4b | |||
| 64fa602a07 | |||
| 9f2b77bf1d | |||
| 9473b22bd9 | |||
| 3ea014ec57 | |||
| 3ffb07371d | |||
| f76c22e843 | |||
| 33d279b95a | |||
| f8faf6c2ba | |||
| 6e452b2ee9 | |||
| dc06744444 | |||
| 26e96839e4 | |||
| 4e4824546a | |||
| 387bdf4f91 | |||
| b650095588 | |||
| 761a71930b | |||
| 127002d736 | |||
| a062e9ea44 | |||
|
|
380fe8cc32 | ||
|
|
bdb5e3208b | ||
|
|
c119c99308 | ||
|
|
2af4f4b10e | ||
|
|
a5968121a0 | ||
| 5eb6ef4d31 | |||
|
|
5f6359694d | ||
|
|
90a6eaa26d | ||
|
|
67361fa66c | ||
|
|
b27852c1f3 | ||
|
|
8ff438942d | ||
|
|
b3e2f34960 | ||
|
|
d0ccc46260 | ||
|
|
5a7f197bcb | ||
|
|
389fb6c409 | ||
|
|
4d48dd4386 | ||
|
|
086537cb56 | ||
|
|
beab42323b | ||
|
|
3d43c0ec12 | ||
| b1c5b03104 | |||
|
|
68724a0504 | ||
|
|
3359889d97 | ||
| 2f24a7f7bb | |||
|
|
66ee96cd63 | ||
|
|
ad37a82713 | ||
|
|
ffed6e3ba6 | ||
|
|
7b8e93cdb5 | ||
|
|
4158f5ba63 | ||
|
|
a70cf6cad3 | ||
|
|
63599cb27a | ||
|
|
a0fcb78e95 | ||
|
|
745ccd7f88 | ||
|
|
2b30b7b624 | ||
|
|
410a285085 | ||
|
|
d2bcef6e36 | ||
|
|
067fcd9892 | ||
|
|
c4095eb336 | ||
|
|
020a083afa | ||
|
|
fd9f21de2e | ||
|
|
7268eb4f30 | ||
|
|
910e0e3123 | ||
|
|
7db17154ad | ||
|
|
ebcc0db665 | ||
|
|
73675ca1b9 | ||
|
|
973d05f9fb | ||
|
|
52299fb6fd | ||
|
|
01964e7cf6 | ||
|
|
929f6732d0 | ||
|
|
b91223da66 | ||
| a04d9ef056 | |||
|
|
e4fe5eaf5d | ||
|
|
c7494fe379 | ||
|
|
e4112431be | ||
|
|
65eec8e91d | ||
|
|
0b0f2f07e1 | ||
|
|
ee34f87563 | ||
|
|
e42f0569fd | ||
|
|
d242a8bb1d | ||
|
|
0cd32d6a15 | ||
|
|
fc9977952e | ||
|
|
56e9273047 | ||
|
|
12cee59605 | ||
|
|
90862e9a89 | ||
|
|
ec3ebe8499 | ||
|
|
1ef636ca6f | ||
|
|
174d7bfe13 | ||
|
|
4e34ae0530 | ||
|
|
f477507d27 | ||
| 969ed6cce5 | |||
| 2e6b8d44f1 | |||
| 93201ab458 | |||
|
|
43724f1cf6 | ||
|
|
7d140af87a | ||
|
|
77ed1b444c | ||
|
|
f7fca58c57 | ||
|
|
ea7c29a54e | ||
|
|
0052385333 | ||
| 7f0e7d8fa3 | |||
|
|
ef467ad481 | ||
|
|
175307773b | ||
|
|
8e982bd6be | ||
|
|
783154d24a | ||
|
|
40126f6e2f | ||
|
|
1ccd9c418b | ||
|
|
896af43994 | ||
|
|
2ee63a9804 | ||
|
|
c7b3e8aff0 | ||
|
|
c50236575f | ||
|
|
e8d1265ee4 | ||
|
|
10ff8a5aab | ||
|
|
941100a8a3 | ||
|
|
374caa0d9a | ||
|
|
82aaa2b523 | ||
|
|
31a60ce85c | ||
|
|
0a3a6934c4 | ||
|
|
ed9f7b03bf | ||
|
|
fc8584775e | ||
|
|
b7ec4f2efe | ||
|
|
0b566575f3 | ||
|
|
73af227fb3 | ||
| 8aec40f951 | |||
| c5a9bdc724 | |||
| 30ef427b90 | |||
| 275adc8efa | |||
| 02e46ed723 | |||
| 94b8b357fb | |||
| 2ed66fe3d0 | |||
| 116cfc7c6e | |||
| f15555a3bd | |||
| dcfff1ede7 | |||
| 0f76422d85 | |||
| d3d983eedb | |||
| 2541766dd5 | |||
| e002a634ff | |||
| 489dd157b6 | |||
| 0a76acd664 | |||
| 4d8cb82ef9 | |||
| 9ffe3f690b | |||
| e7d9e9402a | |||
| 3ef5c1aa0b | |||
| 9a28e93ac6 | |||
| 5738da8566 | |||
| bbc13c4eb9 | |||
| 6ca5d5bfa8 | |||
| 2091eb8e8b | |||
| 860ce6b065 | |||
| 8b5887a87a | |||
| 770edd6391 | |||
| 562ef48f19 | |||
| 70d6d9eb77 | |||
| 2332bfdc57 | |||
| 1db7c5ffea | |||
| 838b358a4a | |||
| dd32114698 | |||
| 5f46d8fdc5 | |||
| ad48851118 | |||
| ead3f8dc8b | |||
| 6b3cb9f02e | |||
| 435f3cf00b | |||
| 7caf1690c6 | |||
| 4ae79a642e | |||
| 9489b9209d | |||
| 5a90e7b727 | |||
| d64948749e | |||
| 7345e3a328 | |||
| de54576d11 | |||
| 12c7b9b5d1 | |||
| c40b56844f | |||
| 09f5741b71 | |||
| 17fa306b09 | |||
| 3011e7b114 | |||
| 98066591da | |||
| 56c78611fb | |||
| a7660c8ec7 | |||
| 934a19b879 | |||
| c247636c4c | |||
| 85fab88ac9 | |||
| b428a87f1a | |||
| d0a05af9c6 | |||
| 83dc9e6c09 | |||
| 7aeffff00c | |||
| 94dd0fe1fd | |||
| 45fcaac47d | |||
| 35e9eb558d | |||
| b88b142332 | |||
| 870b290726 | |||
| 7b10aa0bdf | |||
| 4d66548920 | |||
| 7c923842ca | |||
| 02970512c1 | |||
| 2c36666d41 | |||
| b3d9eeecd2 | |||
| 301fa1fce1 | |||
| e71939fe00 | |||
| 859a28b4ee | |||
| 432759bfc1 | |||
| 94e145adce | |||
| ccfc44a423 | |||
| 8f3b329552 | |||
| 63dde36389 | |||
| 8fc25de794 | |||
| d5887e8f99 | |||
| b086348d38 | |||
| 4a2106183a | |||
| 06ac840dd0 | |||
| 6ab7a340e2 | |||
| 1cb81cbb09 | |||
| e8c824a396 | |||
| dc03016dbe | |||
| 5067ef2c8c | |||
| 5c3927c25d | |||
| 154722f765 | |||
| 6387de038b | |||
| 6de4fa66a2 | |||
| 394d94d5d6 | |||
| a3fc9a17ed | |||
| 3d38611e4f | |||
| d1dac92034 | |||
| bc9306fc1b | |||
| 4358e6440a | |||
| 6b5f048b4b | |||
| 709b720be9 | |||
| 19d9942676 | |||
| 0740f9ea5a | |||
| 28f87e82e9 | |||
| 175e71facf | |||
| c1231ff451 | |||
| e70d51e52b | |||
| 7f5bd2c17e | |||
| f7d91b5929 | |||
| e94a24bbd4 | |||
| e0a198bac5 | |||
| 25e00e02b7 | |||
| 13f0c6f988 | |||
| 9abfcdd091 | |||
| 18541de371 | |||
| 578f02db2d | |||
| 3b9695b4f3 | |||
| b55bfb8868 | |||
| 3a348d5d1a | |||
| 5ed91e1c15 | |||
| 8aa5a601e7 | |||
| 9d1c0ac395 | |||
| c7d88077ec | |||
| 5798e8dcd5 | |||
| 5ae37eef82 | |||
| 587ccff501 | |||
| 8e51f3aff8 | |||
| e38d29f33d | |||
| 3c7661836c | |||
| 1f5b56a593 | |||
| 57930b7aa5 | |||
| 76ed801077 | |||
| 241dde3a84 | |||
| b98d7d246c | |||
| 3aca0d0c76 | |||
| e35fccea5d | |||
| 7808005498 | |||
| d06dd3d166 | |||
| a12f666e96 | |||
| ebe86d73d4 | |||
| b29ff61871 | |||
| 58f7cf72d4 | |||
| 3742e0f367 | |||
| 7d98980121 | |||
| 89d0e1723e | |||
| 226cbb6b5c | |||
| a1c34f488d | |||
| 79bccade02 | |||
| 5639435058 | |||
| 432be660a4 | |||
| f73640522b | |||
| d9d4181dda | |||
| 071f68080c | |||
| 03fa5f5548 | |||
| 0d9d307490 | |||
| e6fd1f0ec5 | |||
| 2704fc42d4 | |||
| d9a4069662 | |||
| 9e71be8169 | |||
| db0504057b | |||
| e4c804b305 | |||
| e01bd39609 | |||
| 6565b3f9c4 | |||
| 2fee216e80 | |||
| 75834902f2 | |||
| 719e0fe918 | |||
| a321625f35 | |||
| 0c4ce6dc3c | |||
| 733765802e | |||
| 1be3a3892c | |||
| 89b0c0862e | |||
| ba2ae6cd82 | |||
| 0f8fe0e290 | |||
| be9fcc522a | |||
| 939d3970aa | |||
| e5a9330a91 | |||
| 1b70ccea3e | |||
| 822965ebe5 | |||
| 7738b2836e | |||
| 1ab7528f7b | |||
| de74cd4867 | |||
| 9dc1853e10 | |||
| 78740a1fc0 | |||
| b131e567b5 | |||
| 5bbb363f12 | |||
| 0e29cdd48c | |||
| 8374500da5 | |||
| 194470841e | |||
| a71c616afd | |||
| 9c39c9dcff | |||
| a72c2bd96a | |||
| f23764c486 | |||
| a7a126dd55 | |||
| d06af5b0ec | |||
| ec040824f6 | |||
| 517da57a0c | |||
| 5ee3ebad3e | |||
| 05df2e084c | |||
| dc3a61addd | |||
| 9169abdb05 | |||
| 81e95291e8 | |||
| f24f283a07 | |||
| bb14c94ab1 | |||
| 7e9bb73777 | |||
| 43a98b4421 | |||
| f1d5df9933 | |||
| 8ce86aabee | |||
| d1b94763b4 | |||
| 73b710d53f | |||
| 0a4471e039 | |||
| f80e4efed8 | |||
| 5e9fd7fd77 | |||
| 5cc6c26606 | |||
| cb50528e2d | |||
| 6dd8e5a75c | |||
| 0e47909704 | |||
| cabcada0b8 | |||
| 17b2b7b89c | |||
| 1eab261b30 | |||
|
|
b06d1dae42 | ||
|
|
45a640dfe9 | ||
|
|
ca9a3b5c7b | ||
|
|
0b32d51ba3 | ||
|
|
1a9e17a7e8 | ||
|
|
995df16bec | ||
|
|
259f85742a | ||
|
|
a795707552 | ||
|
|
bcb61f9cd9 | ||
|
|
4260b0f092 | ||
|
|
4514eda311 | ||
|
|
725c5ad0cd | ||
|
|
0b89979418 | ||
|
|
96281c33e8 | ||
|
|
43bf2620f1 | ||
| 5b3f91d3e5 | |||
| 73e57a19df | |||
| 275ce87e30 | |||
|
|
d9ed90b729 | ||
|
|
d82c521f4f | ||
|
|
2cafa32c7e | ||
|
|
830150ade6 | ||
|
|
55ac98ebe1 | ||
|
|
454c2c2830 | ||
|
|
2fa298cae9 | ||
|
|
3b106a3803 | ||
|
|
da09bc7968 | ||
|
|
e0ac09d5ec | ||
|
|
45f06293f5 | ||
|
|
004a3e2db1 | ||
|
|
b81b4ef2ef | ||
|
|
52c0ab213a | ||
|
|
c3bfd50cf1 | ||
|
|
39683cc413 | ||
|
|
47e2c6e214 | ||
|
|
ff8eaa241e | ||
|
|
52a035e4cf | ||
|
|
8c8b6966a7 | ||
|
|
861980a8e9 | ||
|
|
3c31c333f2 | ||
|
|
235bd86af3 | ||
|
|
e6ca20b1ed | ||
|
|
b470ab66e2 | ||
|
|
e9790e70d6 | ||
|
|
55bc042798 | ||
|
|
4e9680a3ad | ||
|
|
bec262bb2d | ||
|
|
74b3147076 | ||
|
|
f51d1e114e | ||
|
|
c76cd38d76 | ||
|
|
b4c4f2aefc | ||
|
|
d16226c879 | ||
|
|
1f70b77735 | ||
|
|
4a34986598 | ||
|
|
70709c505c | ||
|
|
8d08a67302 | ||
|
|
29c5c82337 | ||
|
|
7e47fe1f30 | ||
|
|
9e5bdace2c | ||
|
|
a6e60c0bf7 | ||
|
|
c8163ab0cd | ||
|
|
4495be2083 | ||
|
|
fe28d9ba39 | ||
|
|
b60e1f2493 | ||
|
|
78a62a1551 | ||
|
|
f0195682f2 | ||
|
|
2f64e2d4c1 | ||
|
|
829e18baef | ||
|
|
760dbc588a | ||
|
|
f3ecdd6d87 | ||
|
|
6e3fdd35c1 | ||
|
|
c3672b476c | ||
|
|
9d56e467cd | ||
|
|
97b0ce8c96 | ||
|
|
aa20692ad6 | ||
|
|
af88cb4d0f | ||
|
|
b4cf2bac95 | ||
|
|
5c0835e076 | ||
|
|
e2b280ccdc | ||
|
|
1971f51b52 | ||
|
|
11b1d41a55 | ||
|
|
86ea33bbce | ||
|
|
71bd07e70e | ||
|
|
94b49adc4e | ||
|
|
36995ec051 | ||
|
|
61f9863a06 | ||
|
|
47878d264b | ||
|
|
0611c3f00f | ||
|
|
13b57d2bb6 | ||
|
|
2648bada30 | ||
|
|
d2c6c4d7fb | ||
|
|
b5f8c5294e | ||
|
|
9cd009f8ba | ||
|
|
68865a80ef | ||
|
|
ddfc677a1e | ||
|
|
0ab3a4ff44 | ||
|
|
f12d0bd580 | ||
|
|
e28f04a51c | ||
|
|
9410dda69e | ||
|
|
04696b7b80 | ||
|
|
a41cd8eb24 | ||
|
|
29dc99c21f | ||
|
|
dfc903208e | ||
|
|
beecb4b0ac | ||
|
|
182df351b9 | ||
|
|
fd57071411 | ||
|
|
785845598f | ||
|
|
6452a7beed | ||
|
|
5c667c1826 | ||
|
|
dc2b8ad431 | ||
|
|
3af1112847 | ||
|
|
0853bbdd19 | ||
|
|
6daa96b69e | ||
|
|
9aaadafc13 | ||
|
|
6c384492be | ||
|
|
ab184bccf3 | ||
|
|
79672dd4b3 | ||
|
|
760abe1a9e | ||
|
|
8f03e590cc | ||
|
|
57c4732566 | ||
|
|
17bbbd6eab | ||
|
|
7e9fd0f353 | ||
|
|
8ca50d8fd4 | ||
|
|
43b6b590e8 | ||
|
|
e98ffced98 | ||
|
|
d37bacb91a | ||
|
|
96b2c6c9ed | ||
|
|
b8cd8c4785 | ||
|
|
a30a2b9ef9 | ||
|
|
e195497829 | ||
|
|
03cda8a897 | ||
|
|
13e3da8d26 | ||
|
|
ee7e3b6d41 | ||
|
|
d05294adaf | ||
|
|
f1aa6a9794 | ||
|
|
41c68aef26 | ||
|
|
e94dc6eb6f | ||
|
|
aaba4fd2a9 | ||
|
|
1a49e5347f | ||
|
|
51f5261bfc | ||
|
|
b2d8b21822 | ||
|
|
b2a26be8c8 | ||
|
|
dcc36f3286 | ||
|
|
3c13f62bd1 | ||
|
|
284e044a03 | ||
|
|
b093d00ff4 | ||
|
|
8e93680146 | ||
|
|
8fa25c815a | ||
|
|
edfba8d355 | ||
|
|
1eadc931cb | ||
| f3002a694d | |||
|
|
5149cf1ece | ||
|
|
1bbfd1e517 | ||
|
|
e35616a611 | ||
|
|
a0a1927437 | ||
|
|
3607b9f140 | ||
|
|
25c425cff8 | ||
|
|
7f335e082c | ||
|
|
9220dbf2e6 | ||
|
|
f33c6cc057 | ||
|
|
186eb20fb3 | ||
|
|
ac22a984ee | ||
|
|
61c04a1fb9 | ||
|
|
0fd3cf43e8 | ||
|
|
c1aaf07885 | ||
|
|
f491264b9e | ||
|
|
eed35d01a8 | ||
|
|
df42b1ccb3 | ||
|
|
129ea3cc5b | ||
|
|
fa6758b9a0 | ||
|
|
5da1fce41f | ||
|
|
a2a5e9200e | ||
|
|
94252a94fe | ||
|
|
c1ba6a39a5 | ||
|
|
724234949f | ||
|
|
bc3da1182b | ||
|
|
7872e98cb2 | ||
|
|
c29e240c2b | ||
|
|
93622b111f | ||
|
|
9a461c31a8 | ||
|
|
fea69c0371 | ||
|
|
dd0fcc28dd | ||
|
|
3d7cb78e47 | ||
|
|
1468c49723 | ||
|
|
c39fb30707 | ||
|
|
91568b7151 | ||
|
|
7090bab632 | ||
|
|
039792e320 | ||
|
|
cddcb0e321 | ||
|
|
f9a7ba7927 | ||
|
|
7785843597 | ||
|
|
c5b9cd57f2 | ||
|
|
3577d8cb68 | ||
|
|
9c090f0383 | ||
|
|
476ee482fa | ||
|
|
25d5361da4 | ||
|
|
de7388bdc5 | ||
|
|
5007393536 | ||
|
|
a1e538e93a | ||
|
|
7288bd9da3 | ||
|
|
f194126fb5 | ||
|
|
3b1b96c4c8 | ||
|
|
31b912f3ca | ||
|
|
38eb65ac0e | ||
|
|
796dbf1438 | ||
|
|
f46942fadf | ||
|
|
3a52d790f0 | ||
|
|
ce7dfd6510 | ||
|
|
312ecdcfe1 | ||
|
|
c747664a26 | ||
|
|
931c33cfdb | ||
|
|
f895a7e44c | ||
|
|
5161fce32e | ||
|
|
8245ee103e | ||
|
|
3e869ae76a | ||
|
|
dd0a448f90 | ||
|
|
3ab8a5d1ad | ||
|
|
83bbda7c40 | ||
|
|
d058942084 | ||
|
|
0a158db97d | ||
|
|
de37eea167 | ||
|
|
a215ebd62c | ||
|
|
549c1649b4 | ||
|
|
2a7f1506c9 | ||
|
|
9a395eafef | ||
|
|
2e14be61a2 | ||
|
|
6883ff49a0 | ||
|
|
d9d75b3aee | ||
|
|
1395ac76e9 | ||
|
|
b79eb9a969 | ||
|
|
23462df49c | ||
|
|
3db9c16082 | ||
|
|
6ec7071ffc | ||
|
|
4efeefe6c9 | ||
|
|
5b7c105c5f | ||
|
|
dd00ff69aa | ||
|
|
ee9b808461 | ||
|
|
8484f26ee9 | ||
|
|
deec330990 | ||
|
|
145540caf5 | ||
|
|
b7035f1574 | ||
|
|
6efbec7750 | ||
|
|
037a50cf47 | ||
|
|
bb65ffaee6 | ||
|
|
b20e6c5a58 | ||
|
|
7c82c2d97c | ||
|
|
810e058c07 | ||
|
|
8aab01c126 | ||
|
|
73e9ae54fa | ||
|
|
d4c213e0b3 | ||
|
|
3748840e23 | ||
|
|
02cf9b1c22 | ||
|
|
ef27901125 | ||
|
|
a1560c60c6 | ||
|
|
b8355cbf8d | ||
|
|
86a18c3ebc | ||
|
|
5582d545a1 | ||
|
|
c416de6e1e | ||
|
|
91c9cf0c31 | ||
|
|
278a84a485 | ||
|
|
8d31ab763d | ||
|
|
a4b1c7b142 | ||
|
|
776f9f7833 | ||
|
|
9803ebe2e8 | ||
|
|
ca5586fc42 | ||
|
|
d3572e18c3 | ||
|
|
7dc3cc3b91 | ||
|
|
ee4237b14c | ||
|
|
848043f7f4 | ||
|
|
da4d7d6d5e | ||
|
|
0ea3ed1ef2 | ||
|
|
2bd617b543 | ||
|
|
96101252bd | ||
|
|
9d4a97fc19 | ||
|
|
c9a33a4010 | ||
|
|
87fd260051 | ||
|
|
5d7d2b82b2 | ||
|
|
779afc2f2a | ||
|
|
33eb91346c | ||
|
|
a11541eb58 | ||
|
|
dbe6d10fff | ||
|
|
2af88353f3 | ||
|
|
82fe350493 | ||
|
|
47d1662033 | ||
|
|
4e5d8d1d76 | ||
|
|
f1fcef2a6f | ||
|
|
8f0ea8ed82 | ||
|
|
5fbe0b31c2 | ||
|
|
24a016e76a | ||
|
|
5de88ce92d | ||
|
|
20583b04c0 | ||
|
|
2f1ba9cb54 | ||
|
|
451326789b | ||
|
|
859ae9d825 | ||
|
|
364a636fa0 | ||
|
|
293eb10ffd | ||
|
|
b3d9e81499 | ||
|
|
74a5125cf9 | ||
|
|
d607b30953 | ||
|
|
abdea22899 | ||
|
|
48f82aaaca | ||
|
|
5ac2e24cc2 | ||
|
|
d6db942626 | ||
|
|
7db7c67065 | ||
|
|
54f47c58db | ||
|
|
ceb6d2fef1 | ||
|
|
b38412b145 | ||
|
|
ef68db080a | ||
|
|
97a9f2aae6 | ||
|
|
2f42f488ab | ||
|
|
f1e800d8bf | ||
|
|
16c6aed65f | ||
|
|
77cf3455a6 | ||
|
|
4fa8d18621 | ||
|
|
6de9181390 | ||
|
|
bd8d450542 | ||
|
|
7b0d90182b | ||
|
|
b5f2d0641d | ||
|
|
4662d10c4e | ||
|
|
13a63b64d4 | ||
|
|
4d8125a2fd | ||
|
|
ea880915b0 | ||
|
|
836387057a | ||
|
|
f0a9c33795 | ||
|
|
843bfa8ba6 | ||
|
|
654f8e8c6c | ||
|
|
c6272e4103 | ||
|
|
3420422f29 | ||
|
|
a664e8ce8c | ||
|
|
491fba7d64 | ||
|
|
3d35cf713f | ||
|
|
b75a91ed70 | ||
|
|
02a3d6a359 | ||
|
|
8372d9d85c | ||
|
|
945373df67 | ||
|
|
26e952154e | ||
|
|
e33ce724c0 | ||
|
|
86b24c9dfe | ||
|
|
3465e9bd16 | ||
|
|
c9d7931ccb | ||
|
|
aad6b70736 | ||
|
|
d560b17ab6 | ||
|
|
18dbb847e3 | ||
|
|
84693b6524 | ||
|
|
5ac6bfd49a | ||
|
|
5666f1e9a7 | ||
|
|
b39a57786d | ||
|
|
4fe306d35f | ||
|
|
60b2e5e8c7 | ||
|
|
18a58c1042 | ||
|
|
d9cfbc19ed | ||
|
|
372c7e0804 | ||
|
|
5f34a78d94 | ||
|
|
f0cfed2ef6 | ||
|
|
59a45871fd | ||
|
|
328347f8af | ||
|
|
845e70465e | ||
|
|
6bcf70bb8b | ||
|
|
41dfe08d2a | ||
|
|
38d23fd76b | ||
|
|
bf6c6e56a6 | ||
|
|
b259e43de2 | ||
|
|
1556ccd7f6 | ||
|
|
a7baf4f3e6 | ||
|
|
f0634ff164 | ||
|
|
322d454d41 | ||
|
|
cafde67c02 | ||
|
|
362aedc2ac | ||
|
|
b3b10b0db7 | ||
|
|
3528587890 | ||
|
|
3bd308effa | ||
|
|
fbffbf0909 | ||
|
|
f05e885517 | ||
|
|
9ead6b00f9 | ||
|
|
00eb978f5f | ||
|
|
c9931fd45e | ||
|
|
3813b21dcf | ||
|
|
ccd386ff4e | ||
|
|
d29f3030a4 | ||
|
|
fe53b08f35 | ||
|
|
5a64d9d3d0 | ||
|
|
4b1012cbb4 | ||
|
|
c0c4fb72ca | ||
|
|
ed71fa48f1 | ||
|
|
18c2892967 | ||
|
|
71ed0815cc | ||
|
|
41b2bcee4f | ||
| 1f3f60a6a3 | |||
| a9ef96f84e | |||
| 3390a62020 | |||
| 9461eed380 | |||
| aeb210bd30 | |||
| d7246cbb98 | |||
| 785500241e | |||
|
|
dddb9b1f57 | ||
| 7f16bca7f7 | |||
|
|
efeb0efd1e | ||
|
|
406259a8a2 | ||
|
|
7fd9497d5c | ||
|
|
3617f9b6d9 | ||
|
|
1589188988 | ||
|
|
a514355e5e | ||
|
|
be410d4d9d | ||
|
|
13ffe1fcc6 | ||
|
|
9ccf5912d4 | ||
|
|
4c7deadb9a | ||
|
|
42b615d16b | ||
|
|
70efb10ece | ||
|
|
8fd4f818b5 | ||
|
|
f1b206ad34 | ||
|
|
48171ae824 | ||
|
|
28fb4d1e94 | ||
|
|
1d504e4066 | ||
|
|
6a18511dd0 | ||
|
|
6f32364675 | ||
|
|
3b997a32bf | ||
|
|
8b889ade5f | ||
|
|
af7fc8f243 | ||
|
|
e4ee4abce8 | ||
|
|
2544bc5f3d | ||
|
|
19d017a457 | ||
|
|
e34f162688 | ||
|
|
60fc66cdf5 | ||
|
|
d3ddcba313 | ||
|
|
251e3bf844 | ||
|
|
6bdd9be092 | ||
|
|
3390f51049 | ||
|
|
fac748d2e2 | ||
|
|
ad1283662d | ||
|
|
bb8a92fff1 | ||
|
|
b65639df05 | ||
|
|
f99ebf84e9 | ||
|
|
8e78dd4a2e | ||
|
|
822f8a1699 | ||
|
|
488ce46d73 | ||
|
|
f32df567f2 | ||
|
|
d6cc32ee9a | ||
|
|
3ac617431f | ||
|
|
7a58aac08e | ||
|
|
a3a65524b8 | ||
|
|
88f5df0f19 | ||
|
|
5fe436e76a | ||
|
|
d7fd6b00ae | ||
|
|
32377f4e6c | ||
|
|
1b9fccc2a4 | ||
|
|
dc4374cb9e | ||
|
|
7f41017ce3 | ||
|
|
02d58d440e | ||
|
|
73b26ec206 | ||
|
|
601fc2cffc | ||
|
|
af50d4912d | ||
|
|
8bd20f9600 | ||
|
|
6d435ee473 | ||
|
|
7f542b8936 | ||
|
|
2c13c1b5f3 | ||
|
|
29c929aba4 | ||
|
|
a87ef54492 | ||
|
|
32e6d5f891 | ||
|
|
ab8813e389 | ||
|
|
21ad6ecffb | ||
|
|
b359937eab | ||
|
|
c0545b8777 | ||
|
|
4470c5abbd | ||
|
|
c3a54858d5 | ||
|
|
0a3037f077 | ||
|
|
84e165b8fc | ||
|
|
5bad82b4f0 | ||
|
|
d1e6125d15 | ||
|
|
26454bf6c6 | ||
|
|
1da2be03e6 | ||
|
|
5aac280618 | ||
|
|
928c451040 | ||
| 9b44ba3ef2 | |||
|
|
02e475642a | ||
|
|
406b4590a9 | ||
|
|
b3aa99f008 | ||
|
|
bb97b7c862 | ||
|
|
1aef81dccc | ||
| 8a43cf7dfb | |||
| 2391b5a504 | |||
| e61bc7416e | |||
| 64f89be6a9 | |||
| b72706356d | |||
| 73ffb509f7 | |||
| 5723f57fc5 | |||
| c38aa357b7 | |||
| df43aae33d | |||
| b461b87df6 | |||
| 7575e8c16f | |||
| 2869f228d4 | |||
| 252fcc4716 | |||
| 36f92c5c9c | |||
| f13a98e53b | |||
| 3f6fb260a4 | |||
| bf5d0556fc | |||
| c774b14e04 | |||
| b6bbec235c | |||
| 5533029072 | |||
| 5807e4a873 | |||
| f9e8cf60bc | |||
| 9294c8c2f1 | |||
| 0d7cbbea37 | |||
| 0fb6f1e4ed | |||
| 9130160bd6 | |||
| 6410cc1090 | |||
| ac11c56ca0 | |||
| 515a639fd0 | |||
| 4503751907 | |||
|
|
3cc9fe4dd9 | ||
|
|
e42cb582c7 | ||
|
|
39cd616c90 | ||
|
|
8c5fdf5021 | ||
|
|
1ff723554c | ||
|
|
41ed15f47f | ||
|
|
d916d4125c | ||
|
|
4877a7ddc4 | ||
|
|
c6bcb5fde9 | ||
|
|
4cd7367a7e | ||
|
|
47d9d7d242 | ||
|
|
c3c222e045 | ||
|
|
d374779c47 | ||
|
|
44b6770b6a | ||
|
|
1638f97d0c | ||
|
|
b3fcd7765e | ||
|
|
dc3379c186 | ||
|
|
b4abd7b6bc | ||
|
|
6d341a3cfe | ||
|
|
1d9d96f467 | ||
|
|
56c3517328 | ||
|
|
90bb0759a0 | ||
|
|
9ae2e18fe6 | ||
|
|
8ad791c594 | ||
|
|
e6adced39d | ||
|
|
fd95bb8198 | ||
|
|
9b9f6720e0 | ||
|
|
254b465755 | ||
|
|
5a085ba7ba | ||
|
|
4782f3b184 | ||
|
|
51da26564f | ||
|
|
a9ffae9b87 | ||
|
|
3393db0fbc | ||
|
|
100209ea16 | ||
|
|
425b534c30 | ||
|
|
63640db81f | ||
|
|
03160f3863 | ||
|
|
7368942488 | ||
|
|
9a69ce50f9 | ||
|
|
b545f8ed40 | ||
|
|
be0148d146 | ||
|
|
8f1d6e2cc2 | ||
|
|
fde30685a8 | ||
|
|
bdf535fcbf | ||
|
|
03a5f5989e | ||
|
|
e5cf1b5289 | ||
|
|
62799d196b | ||
|
|
cb6619a90a | ||
|
|
b9fad1f4fb | ||
|
|
5e478c7eb0 | ||
|
|
821aaa1f66 | ||
|
|
942cbdd4b2 | ||
|
|
13f3057185 | ||
|
|
81d58f1275 | ||
|
|
e236e792ec | ||
|
|
9e7414e0e0 | ||
|
|
e6eeaf1674 | ||
|
|
49b9225b6e | ||
|
|
7f64670f36 | ||
|
|
7dd5840353 | ||
|
|
72df5d5213 | ||
|
|
d43ce1bdb2 | ||
|
|
bd647b99ec | ||
|
|
0997fd0901 | ||
|
|
dc840c9bc7 | ||
|
|
37403a7234 | ||
|
|
f0d291f527 | ||
|
|
b8803c8e5b | ||
|
|
9e11c0814e | ||
|
|
72fa8a5883 | ||
|
|
a656ada67a | ||
|
|
20c42b14bf | ||
|
|
4e59c8791f | ||
|
|
8128870d57 | ||
|
|
b979bdb560 | ||
|
|
b7659a477c | ||
|
|
343d6cf350 | ||
|
|
dbd186e299 | ||
|
|
1a4be0f02e | ||
|
|
8f89b022c7 | ||
|
|
74403d28e9 | ||
|
|
1968db62ad | ||
|
|
bcdb3572fa | ||
|
|
18938c9fca | ||
|
|
8f0e7435d6 | ||
|
|
bad5484d12 | ||
|
|
b4ba3c40eb | ||
|
|
3b0c6ef2ea | ||
|
|
7a6578e205 | ||
|
|
a2083c5310 | ||
|
|
879f6c288e | ||
|
|
e17a21defd | ||
|
|
eea74406c9 | ||
|
|
d4317b5fd3 | ||
|
|
25b8fc2e1d | ||
|
|
f8b613e0aa | ||
|
|
4ad7033285 | ||
|
|
eca0bcc6d8 | ||
|
|
fa1df39923 | ||
|
|
49277216ba | ||
|
|
16ef4fa9fb | ||
|
|
9695e49024 | ||
|
|
540ce7c076 | ||
|
|
27491c933a | ||
|
|
7124d978d3 | ||
|
|
0fee2bb165 | ||
|
|
3e50d0edca | ||
|
|
38a63641bc | ||
|
|
5c4a33873f | ||
|
|
c2c7de4c59 | ||
|
|
d598a6d0f5 | ||
|
|
db3addc819 | ||
|
|
d8b1d59b12 | ||
|
|
54d98f58f3 | ||
|
|
4a13232467 | ||
|
|
ba0f573618 | ||
|
|
2f03f77ce4 | ||
|
|
daf58e9e45 | ||
|
|
2467065ac3 | ||
|
|
0820d7c0dc | ||
|
|
267741fa8b | ||
|
|
7bc73d1ca8 | ||
|
|
957169d9aa | ||
|
|
5b3b0e67e9 | ||
|
|
304bbd230a | ||
|
|
ca1df94be5 | ||
|
|
2a1710596a | ||
|
|
b602f3ae13 | ||
|
|
5024abc812 | ||
|
|
dbd9b1a095 | ||
|
|
f6f83c6f70 | ||
|
|
bc9b4f508b | ||
|
|
7f5ac93cc6 | ||
|
|
5d4ad93c51 | ||
|
|
a7e59b2bb0 | ||
|
|
876868506f | ||
|
|
6dc54adec8 | ||
|
|
16a6e05849 | ||
|
|
f16d9a5848 | ||
|
|
cb5b80353d | ||
|
|
b7d54111ba | ||
|
|
bf74913486 | ||
|
|
e3a341eb22 | ||
|
|
785d6360cd | ||
|
|
05ed8af158 | ||
|
|
d1cd72c5f8 | ||
|
|
6d6bec35f2 | ||
|
|
9db1a8490c | ||
|
|
409037bdf3 | ||
|
|
53fef14024 | ||
|
|
c08356876d | ||
|
|
4d7e3d6866 | ||
|
|
ab5512e9d6 | ||
|
|
f6ae46e352 | ||
|
|
7ee7a05ea1 | ||
|
|
e559a1dabd | ||
|
|
8707e4a819 | ||
|
|
912e447200 | ||
|
|
52c1dabd0e | ||
|
|
bd8d59b343 | ||
|
|
ea221281a3 | ||
|
|
cc5b4fa650 | ||
|
|
663d4a2a02 | ||
|
|
371542fb1e | ||
|
|
b71f2c4ebb | ||
|
|
d841faa057 | ||
|
|
c8cc1673e0 | ||
|
|
d6409b22c2 | ||
|
|
35697b9af5 | ||
|
|
7374244806 | ||
|
|
391790d648 | ||
|
|
f752f934b6 | ||
|
|
573dba4712 | ||
|
|
51de825189 | ||
|
|
4c0ad53b3a | ||
|
|
8f790309ce | ||
|
|
2690203912 | ||
|
|
9d8a44696b | ||
|
|
7cccf4daf1 | ||
|
|
e1cf43c260 | ||
|
|
a6ed0a964e | ||
|
|
3452c2c5d4 | ||
|
|
577bd51613 | ||
|
|
b3b2356a7e | ||
|
|
b75baffdcf | ||
|
|
cacae6a9cd | ||
|
|
0f024b27f0 | ||
|
|
c81f17c24b | ||
|
|
623483f3b1 | ||
|
|
0ecaa9b8ee | ||
|
|
a99020078c | ||
|
|
a4c892b696 | ||
|
|
c4cd2178f7 | ||
|
|
c7475cda83 | ||
|
|
ffaaea497c | ||
|
|
e7947069a2 | ||
|
|
0abd8aedff | ||
|
|
dba0fd8b20 | ||
|
|
ec83c1ff12 | ||
|
|
1c7e99e91b | ||
|
|
f5e799d632 | ||
|
|
2e068d3fbb | ||
|
|
713db304e2 | ||
|
|
3487c22da3 | ||
|
|
65c3cb31d7 | ||
|
|
80874887cc | ||
|
|
8723d62add | ||
|
|
213ada4ae9 | ||
|
|
70684a29c6 | ||
|
|
06c4d026f8 | ||
|
|
65be64c756 | ||
|
|
2fe2c0515f | ||
|
|
ecbef84c37 | ||
|
|
39194704f5 | ||
|
|
9a91487375 | ||
|
|
7f37327bcd | ||
|
|
a9fa251fee | ||
|
|
4e00645851 | ||
|
|
87b30741fc | ||
|
|
a0f504d1e2 | ||
|
|
24bab23508 | ||
|
|
a0c3ef8ea1 | ||
|
|
b4b343b578 | ||
|
|
18b570d750 | ||
|
|
314f600523 | ||
|
|
6ac65cf893 | ||
|
|
5836c6ff90 | ||
|
|
a4d7183260 | ||
|
|
d61c2b20c8 | ||
|
|
3dcc8883cd | ||
|
|
3574dd4b1e | ||
|
|
95b9daca80 | ||
|
|
42456e8e98 | ||
|
|
0094cf7054 | ||
|
|
d4c79ab66b | ||
|
|
57b8242f7e | ||
|
|
a624cc8a68 | ||
|
|
b5b0e4191a | ||
|
|
0403c68429 | ||
|
|
f1ceb38f5f | ||
|
|
0cf3b869af | ||
|
|
69b843a824 | ||
|
|
924c5a3bf8 | ||
|
|
809633bdd3 | ||
|
|
64727e0d3a | ||
|
|
2a0aee5bf5 | ||
|
|
c65544a377 | ||
|
|
a6ed0997e8 | ||
|
|
721341604c | ||
|
|
3e3cae507c | ||
|
|
1ef5924f0c | ||
|
|
070157eacb | ||
|
|
fbf5daff0e | ||
|
|
427afa9ebd | ||
|
|
190514597b | ||
|
|
92de606bc6 | ||
|
|
5aed96c5a6 | ||
|
|
5bc2c132fa | ||
|
|
f7db908cb2 | ||
|
|
1bc82dea15 | ||
|
|
f131509c56 | ||
|
|
8e77a70ad6 | ||
|
|
867486e72e | ||
|
|
28130de9cb | ||
|
|
1523586b37 | ||
|
|
d7838e2a42 | ||
|
|
eb923af44f | ||
|
|
edd5a3efd9 | ||
|
|
90dfa516da | ||
|
|
37620b4dbc | ||
|
|
71b5383090 | ||
|
|
52afb9f466 | ||
|
|
efc43b0863 | ||
|
|
ff3cdb10dc | ||
|
|
d27a74c97b | ||
|
|
d2833d26cc | ||
|
|
8530b0643d | ||
|
|
3f9971d2ee | ||
|
|
5be41c8163 | ||
|
|
51d0daafdd | ||
|
|
5ed6271c08 | ||
|
|
abbe8d467b | ||
|
|
fd6f0b0a35 | ||
|
|
67f66b72e8 | ||
|
|
e54436e818 | ||
|
|
9a514e7d3f | ||
|
|
6cd660982c | ||
|
|
df434cd399 | ||
|
|
8cc768e5b6 | ||
|
|
5feb07e3f6 | ||
|
|
514887d19f | ||
|
|
ae892a07d4 | ||
|
|
f76e0d3a16 | ||
|
|
0a57ac3132 | ||
|
|
6b0275d035 | ||
|
|
be2b17ea85 | ||
|
|
c4e2ae2395 | ||
|
|
39f042240d | ||
|
|
a60a495c83 | ||
|
|
459ed11b58 | ||
|
|
bf1c683fd0 | ||
|
|
122cdd7fc8 | ||
|
|
899ba13df4 | ||
|
|
467baec7da | ||
|
|
4716eaa4b6 | ||
|
|
c55716df08 | ||
|
|
ca6f7ed587 | ||
|
|
e2713cfe2d | ||
|
|
030c49ff7c | ||
|
|
d3654266ee | ||
|
|
04f14c91f0 | ||
|
|
664c18ebbe | ||
|
|
3645c98685 | ||
|
|
45bbfce4d3 | ||
|
|
bb69cc073a | ||
|
|
dc5a53376d | ||
|
|
6bf762b72f | ||
|
|
d6c4ffca5a | ||
|
|
c91aa4be47 | ||
|
|
9cd70b31ac | ||
|
|
b64c779a58 | ||
|
|
2e7cf188af | ||
|
|
674cea629d | ||
|
|
8199e67b79 | ||
|
|
7b260006bf | ||
|
|
f3232cc5df | ||
|
|
477a289c2e | ||
|
|
77c80d1a69 | ||
|
|
f608fc186e | ||
|
|
e697466557 | ||
|
|
b35a0b0d26 | ||
|
|
2c469718f6 | ||
|
|
4a51de95c4 | ||
|
|
ee1d4bb600 | ||
|
|
d9c6986a89 | ||
|
|
bd6490631f | ||
|
|
640e1e3b5e | ||
|
|
f4231456e7 | ||
|
|
222d85f052 | ||
|
|
ee92182163 | ||
|
|
55dd577275 | ||
|
|
4941d230e2 | ||
|
|
660479d692 | ||
|
|
b153fafa9f | ||
|
|
adc43324f3 | ||
|
|
f6bd08029f | ||
|
|
94e5a06a15 | ||
|
|
8fc0ba136f | ||
|
|
9f5e779b5e | ||
|
|
1b693da5ed | ||
|
|
4c44a504ed | ||
|
|
453af2851b | ||
|
|
30e560d808 | ||
|
|
277f60e3e2 | ||
|
|
77ca2d8830 | ||
|
|
d4deea2019 | ||
|
|
38fa552c00 | ||
|
|
f8fa426adb | ||
|
|
38beb34a38 | ||
|
|
fb0438d352 | ||
|
|
44fe6a8b89 | ||
|
|
269b8840ad | ||
|
|
b9a223c049 | ||
|
|
db37710b90 | ||
|
|
092c8bb913 | ||
|
|
d807e3de7d | ||
|
|
8c965015f3 | ||
|
|
538a3b6ca8 | ||
|
|
9237a6262e | ||
|
|
fcfda644d3 | ||
|
|
75bac01f3a | ||
|
|
72fd57ef76 | ||
|
|
fda50ed570 | ||
|
|
f8a3c8f5bc | ||
|
|
681bfcb4c4 | ||
|
|
27816724f8 | ||
|
|
ac9ac5e397 | ||
|
|
43c6e2f2e1 | ||
|
|
b7fea2042f | ||
|
|
c6d68749e0 | ||
|
|
ae89a707ec | ||
|
|
973c6f4ef8 | ||
|
|
4dd0a5ddf2 | ||
|
|
90dc3dac3b | ||
|
|
8c4c2ad1cf | ||
|
|
f949bb8dc0 | ||
|
|
c863bf6e1d | ||
|
|
5d89cf9474 | ||
|
|
09aedecc3b | ||
|
|
fe515e9f01 | ||
|
|
69d2c0887c | ||
|
|
8e577022b2 | ||
|
|
3088727fd4 | ||
|
|
b33ad5833e | ||
|
|
3264b6edef | ||
|
|
58c2650162 | ||
|
|
01e098339e | ||
|
|
d857cc9084 | ||
|
|
4205821bac | ||
|
|
0776978c9c | ||
|
|
6568cb8900 | ||
|
|
6a755598b2 | ||
|
|
df3917a677 | ||
|
|
d2192ffd21 | ||
|
|
cb4128436c | ||
|
|
6cc578435c | ||
|
|
73637ba53d | ||
|
|
c9657aeb8c | ||
|
|
dfb7cc88cd | ||
|
|
227120fd57 | ||
|
|
8b74ff4bb6 | ||
|
|
f4099c6929 | ||
|
|
6ae5c0d912 | ||
|
|
44d190e91c | ||
|
|
0a864c7f87 | ||
|
|
50d753a87b | ||
|
|
35f85c55f1 | ||
|
|
b69bdcd126 | ||
|
|
49d5857b36 | ||
|
|
40ad04b79f | ||
|
|
a3e564855a | ||
|
|
15d0d05185 | ||
|
|
819eca5dea | ||
|
|
edbe793c68 | ||
|
|
e017c6effc | ||
|
|
d4ac28af18 | ||
|
|
931aa4e3cb | ||
|
|
cc4017e481 | ||
|
|
38adb9a52f | ||
|
|
ccc5813b3f | ||
|
|
314d0e8b71 | ||
|
|
0338889905 | ||
|
|
876cd8909f | ||
|
|
ac7cb45f61 | ||
|
|
f326bf9148 | ||
|
|
b1596c0ac4 | ||
|
|
13d3f37f05 | ||
|
|
e4290c4ab0 | ||
|
|
2918b4b92c | ||
|
|
39c622d5bf | ||
|
|
76a6b501f3 | ||
|
|
ecf92e2079 | ||
|
|
b4c0c4d219 | ||
|
|
4be8c81291 | ||
|
|
a8460065a4 | ||
|
|
2b39dec560 | ||
| 0b85a9d330 | |||
| b123f6ada7 | |||
| e5c288c764 | |||
| 9db7d8e589 | |||
| 5e48687347 | |||
| 09bbf81915 | |||
| 78f8ea2b5b | |||
| e08b4275a9 | |||
| ac9f3cf061 | |||
| 98fd314a62 | |||
| 79a31a41f9 | |||
| 6aae9083c3 | |||
| d71e31417b | |||
| fbe6c0c859 | |||
| 53b797fb53 | |||
| 98eb9173ee | |||
| ecfa95310d | |||
| 0e75a9163b | |||
|
|
59633d94f5 | ||
| 53206ad1d7 | |||
| 9aa91bf3e2 | |||
| 867479e05d | |||
| bb1f69dd90 | |||
| d219f7b966 | |||
| 3f812e5275 | |||
| cdef395f89 | |||
|
|
66f6a9ce90 | ||
|
|
b07c888c7a | ||
|
|
d170a3c36e | ||
| 429c21a8e9 | |||
|
|
8c10908353 | ||
|
|
e0963a1c39 | ||
|
|
e77aa9fb84 | ||
|
|
f5fe2d9e33 | ||
|
|
5006342b7b | ||
|
|
3ce8b67b4f | ||
|
|
52cec290d9 | ||
|
|
a559151c57 | ||
|
|
2fc60f9f74 | ||
|
|
3b1fcb7feb | ||
|
|
2838f540d1 | ||
|
|
f5ec5a61a9 | ||
|
|
44caf35fd8 | ||
|
|
c5055e7f34 | ||
|
|
de14ecea22 | ||
|
|
f5174a3248 | ||
|
|
f0889ce0f8 | ||
|
|
b6dc711c14 | ||
|
|
04fb2e8701 | ||
|
|
c1439bed8d | ||
|
|
a88f326ee6 | ||
| 56618dbe65 | |||
|
|
71ef710d09 | ||
|
|
c74852b60b | ||
| 2d7892e3b1 | |||
|
|
8edeb2f622 | ||
|
|
d157a081b1 | ||
|
|
fcc57cf365 | ||
| 12c8ab41bf | |||
| 9a7a1728a4 | |||
| 240c7eff10 |
75
.gitignore
vendored
75
.gitignore
vendored
@@ -1,16 +1,69 @@
|
||||
# use glob syntax
|
||||
syntax: glob
|
||||
# Virtual environments
|
||||
.venv
|
||||
|
||||
__pycache__/
|
||||
*.py[oc]
|
||||
build/
|
||||
dist/
|
||||
wheels/
|
||||
*.egg-info
|
||||
|
||||
*.pyc
|
||||
db*
|
||||
localsettings.py
|
||||
*~
|
||||
parsing_log.txt
|
||||
troggle
|
||||
troggle_log.txt
|
||||
.idea/*
|
||||
*.orig
|
||||
media/images/*
|
||||
.vscode/*
|
||||
*.sql
|
||||
*.sqlite
|
||||
*.prof
|
||||
*~
|
||||
.idea/*
|
||||
.swp
|
||||
imagekit-off/
|
||||
.vscode/*
|
||||
_1623.3d
|
||||
_1623.err
|
||||
_1623.pos
|
||||
_1623.svx
|
||||
_16230.svx
|
||||
_troggle_import_root.svx
|
||||
troggle_import_root.log
|
||||
cave-lookup.json
|
||||
core/migrations/*
|
||||
db*
|
||||
desktop.ini
|
||||
diffsettings.txt
|
||||
ignored-files.log
|
||||
import_profile.json
|
||||
lines-of-python.txt
|
||||
lines-of-templates.txt
|
||||
loadlogbk.log
|
||||
loadsurvexblks.log
|
||||
logbktrips.shelve
|
||||
memdump.sql
|
||||
parsing_log.txt
|
||||
svxblks.log
|
||||
svxlinear.log
|
||||
troggle
|
||||
troggle-inspectdb.py
|
||||
troggle-sqlite.sql
|
||||
troggle.log
|
||||
troggle.sqlite
|
||||
troggle.sqlite-journal
|
||||
troggle_log.txt
|
||||
tunnel-import.log
|
||||
|
||||
secret_credentials.py
|
||||
localsettings.py
|
||||
|
||||
media/jslib/*
|
||||
!media/jslib/readme.txt
|
||||
|
||||
_test_response.html
|
||||
therionrefs.log
|
||||
_1623-and-1626.svx
|
||||
_1623-and-1626-no-schoenberg-hs.svx
|
||||
troggle.sqlite-journal - Shortcut.lnk
|
||||
troggle.sqlite - Shortcut.lnk
|
||||
|
||||
javascript
|
||||
|
||||
|
||||
mvscript.sh
|
||||
|
||||
16
.hgignore
16
.hgignore
@@ -1,16 +0,0 @@
|
||||
# use glob syntax
|
||||
syntax: glob
|
||||
|
||||
*.pyc
|
||||
db*
|
||||
localsettings.py
|
||||
*~
|
||||
parsing_log.txt
|
||||
troggle
|
||||
troggle_log.txt
|
||||
.idea/*
|
||||
*.orig
|
||||
media/images/*
|
||||
.vscode/*
|
||||
.swp
|
||||
imagekit-off/
|
||||
807
1623-renaming-script.txt
Normal file
807
1623-renaming-script.txt
Normal file
@@ -0,0 +1,807 @@
|
||||
cd /home/philip/expo/expoweb/1623
|
||||
mkdir -p 2023-ASH-06/i
|
||||
mkdir -p 2023-ASH-06/l
|
||||
mkdir -p 2023-ASH-06/t
|
||||
mkdir -p 307/i
|
||||
mkdir -p 307/l
|
||||
mkdir -p 307/t
|
||||
mkdir -p 2023-ASH-13/i
|
||||
mkdir -p 2023-ASH-13/l
|
||||
mkdir -p 2023-ASH-13/t
|
||||
mkdir -p 2018-pf-03/i
|
||||
mkdir -p 2018-pf-03/l
|
||||
mkdir -p 2018-pf-03/t
|
||||
mkdir -p 2023-ASH-07/i
|
||||
mkdir -p 2023-ASH-07/l
|
||||
mkdir -p 2023-ASH-07/t
|
||||
mkdir -p 2013-BL-01/i
|
||||
mkdir -p 2013-BL-01/l
|
||||
mkdir -p 2013-BL-01/t
|
||||
mkdir -p 2023-ASH-03/i
|
||||
mkdir -p 2023-ASH-03/l
|
||||
mkdir -p 2023-ASH-03/t
|
||||
mkdir -p 2017-AA-01/i
|
||||
mkdir -p 2017-AA-01/l
|
||||
mkdir -p 2017-AA-01/t
|
||||
mkdir -p 2023-ASH-02/i
|
||||
mkdir -p 2023-ASH-02/l
|
||||
mkdir -p 2023-ASH-02/t
|
||||
mkdir -p 306/i
|
||||
mkdir -p 306/l
|
||||
mkdir -p 306/t
|
||||
mkdir -p 2012-sw-01/i
|
||||
mkdir -p 2012-sw-01/l
|
||||
mkdir -p 2012-sw-01/t
|
||||
mkdir -p 315/i
|
||||
mkdir -p 315/l
|
||||
mkdir -p 315/t
|
||||
mkdir -p 2018-NTU-01/i
|
||||
mkdir -p 2018-NTU-01/l
|
||||
mkdir -p 2018-NTU-01/t
|
||||
mkdir -p 303/i
|
||||
mkdir -p 303/l
|
||||
mkdir -p 303/t
|
||||
mkdir -p 2023-ASH-12/i
|
||||
mkdir -p 2023-ASH-12/l
|
||||
mkdir -p 2023-ASH-12/t
|
||||
mkdir -p 2023-ASH-11/i
|
||||
mkdir -p 2023-ASH-11/l
|
||||
mkdir -p 2023-ASH-11/t
|
||||
mkdir -p 311/i
|
||||
mkdir -p 311/l
|
||||
mkdir -p 311/t
|
||||
mkdir -p 2017-AMS-02/i
|
||||
mkdir -p 2017-AMS-02/l
|
||||
mkdir -p 2017-AMS-02/t
|
||||
mkdir -p 2013-06/i
|
||||
mkdir -p 2013-06/l
|
||||
mkdir -p 2013-06/t
|
||||
mkdir -p 2023-ASH-01/i
|
||||
mkdir -p 2023-ASH-01/l
|
||||
mkdir -p 2023-ASH-01/t
|
||||
mkdir -p 2017-NR-01/i
|
||||
mkdir -p 2017-NR-01/l
|
||||
mkdir -p 2017-NR-01/t
|
||||
mkdir -p 308/i
|
||||
mkdir -p 308/l
|
||||
mkdir -p 308/t
|
||||
mkdir -p 2012-sw-03/i
|
||||
mkdir -p 2012-sw-03/l
|
||||
mkdir -p 2012-sw-03/t
|
||||
mkdir -p 2023-ASH-04/i
|
||||
mkdir -p 2023-ASH-04/l
|
||||
mkdir -p 2023-ASH-04/t
|
||||
mkdir -p 2023-BL-11/i
|
||||
mkdir -p 2023-BL-11/l
|
||||
mkdir -p 2023-BL-11/t
|
||||
mkdir -p 2023-ASH-14/i
|
||||
mkdir -p 2023-ASH-14/l
|
||||
mkdir -p 2023-ASH-14/t
|
||||
mkdir -p 309/i
|
||||
mkdir -p 309/l
|
||||
mkdir -p 309/t
|
||||
mkdir -p 2023-ASH-10/i
|
||||
mkdir -p 2023-ASH-10/l
|
||||
mkdir -p 2023-ASH-10/t
|
||||
cd /home/philip/expo/expoweb/1623
|
||||
mv l/"2012-sw-01_i1.html" 2012-sw-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2012-sw-01/i/|g' 2012-sw-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2012-sw-01/i/|g" 2012-sw-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2012-sw-01/i/|g' ../entrance_data/'1623-2012-sw-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2012-sw-01/i/|g" ../entrance_data/'1623-2012-sw-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2012-sw-01/l/|g' ../entrance_data/'1623-2012-sw-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2012-sw-01/l/|g" ../entrance_data/'1623-2012-sw-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2012-sw-01/t/|g' ../entrance_data/'1623-2012-sw-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2012-sw-01/t/|g" ../entrance_data/'1623-2012-sw-01.html'
|
||||
mv t/"2012-sw-01_i1.jpg" 2012-sw-01/t
|
||||
mv i/"2012-sw-01_i1.jpg" 2012-sw-01/i
|
||||
mv l/"2012-sw-03_i2.html" 2012-sw-03/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2012-sw-03/i/|g' 2012-sw-03/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2012-sw-03/i/|g" 2012-sw-03/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2012-sw-03/i/|g' ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2012-sw-03/i/|g" ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2012-sw-03/l/|g' ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2012-sw-03/l/|g" ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2012-sw-03/t/|g' ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2012-sw-03/t/|g" ../entrance_data/'1623-2012-sw-03.html'
|
||||
mv l/"2012-sw-03_i1.html" 2012-sw-03/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2012-sw-03/i/|g' 2012-sw-03/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2012-sw-03/i/|g" 2012-sw-03/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2012-sw-03/i/|g' ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2012-sw-03/i/|g" ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2012-sw-03/l/|g' ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2012-sw-03/l/|g" ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2012-sw-03/t/|g' ../entrance_data/'1623-2012-sw-03.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2012-sw-03/t/|g" ../entrance_data/'1623-2012-sw-03.html'
|
||||
mv t/"2012-sw-03_i1.jpg" 2012-sw-03/t
|
||||
mv i/"2012-sw-03_i1.jpg" 2012-sw-03/i
|
||||
mv t/"2012-sw-03_i2.jpg" 2012-sw-03/t
|
||||
mv i/"2012-sw-03_i2.jpg" 2012-sw-03/i
|
||||
mv i/"2013wallet23.jpg" 2013-06/i
|
||||
mv l/"2013wallet23.html" 2013-06/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2013-06/i/|g' 2013-06/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2013-06/i/|g" 2013-06/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2013-06/i/|g' ../cave_data/'1623-2013-06.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2013-06/i/|g" ../cave_data/'1623-2013-06.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2013-06/l/|g' ../cave_data/'1623-2013-06.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2013-06/l/|g" ../cave_data/'1623-2013-06.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2013-06/t/|g' ../cave_data/'1623-2013-06.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2013-06/t/|g" ../cave_data/'1623-2013-06.html'
|
||||
mv l/"2013-BL-01.html" 2013-BL-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2013-BL-01/i/|g' 2013-BL-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2013-BL-01/i/|g" 2013-BL-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2013-BL-01/i/|g' ../cave_data/'1623-2013-BL-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2013-BL-01/i/|g" ../cave_data/'1623-2013-BL-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2013-BL-01/l/|g' ../cave_data/'1623-2013-BL-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2013-BL-01/l/|g" ../cave_data/'1623-2013-BL-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2013-BL-01/t/|g' ../cave_data/'1623-2013-BL-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2013-BL-01/t/|g" ../cave_data/'1623-2013-BL-01.html'
|
||||
mv t/"2013-BL-01.jpg" 2013-BL-01/t
|
||||
mv i/"2013-BL-01.jpg" 2013-BL-01/i
|
||||
mv l/"aa-1-2017_with-tag.html" 2017-AA-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AA-01/i/|g' 2017-AA-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AA-01/i/|g" 2017-AA-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AA-01/i/|g' ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AA-01/i/|g" ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2017-AA-01/l/|g' ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2017-AA-01/l/|g" ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2017-AA-01/t/|g' ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2017-AA-01/t/|g" ../entrance_data/'1623-2017-AA-01.html'
|
||||
mv t/"aa-1-2017_with-tag.jpg" 2017-AA-01/t
|
||||
mv i/"aa-1-2017_with-tag.jpg" 2017-AA-01/i
|
||||
mv l/"aa-1-2017_looking-down.html" 2017-AA-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AA-01/i/|g' 2017-AA-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AA-01/i/|g" 2017-AA-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AA-01/i/|g' ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AA-01/i/|g" ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2017-AA-01/l/|g' ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2017-AA-01/l/|g" ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2017-AA-01/t/|g' ../entrance_data/'1623-2017-AA-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2017-AA-01/t/|g" ../entrance_data/'1623-2017-AA-01.html'
|
||||
mv t/"aa-1-2017_looking-down.jpg" 2017-AA-01/t
|
||||
mv i/"aa-1-2017_looking-down.jpg" 2017-AA-01/i
|
||||
mv t/"ent081-20170807.jpg" 2017-AMS-02/t
|
||||
mv i/"ent081-20170807.jpg" 2017-AMS-02/i
|
||||
mv l/"near-ent-2017-ams-02.html" 2017-AMS-02/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AMS-02/i/|g' 2017-AMS-02/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AMS-02/i/|g" 2017-AMS-02/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AMS-02/i/|g' ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AMS-02/i/|g" ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2017-AMS-02/l/|g' ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2017-AMS-02/l/|g" ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2017-AMS-02/t/|g' ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2017-AMS-02/t/|g" ../entrance_data/'1623-2017-AMS-02.html'
|
||||
mv t/"near-ent-2017-ams-02.jpg" 2017-AMS-02/t
|
||||
mv i/"near-ent-2017-ams-02.jpg" 2017-AMS-02/i
|
||||
mv l/"ent081-20170807.html" 2017-AMS-02/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AMS-02/i/|g' 2017-AMS-02/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AMS-02/i/|g" 2017-AMS-02/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-AMS-02/i/|g' ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-AMS-02/i/|g" ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2017-AMS-02/l/|g' ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2017-AMS-02/l/|g" ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2017-AMS-02/t/|g' ../entrance_data/'1623-2017-AMS-02.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2017-AMS-02/t/|g" ../entrance_data/'1623-2017-AMS-02.html'
|
||||
mv l/"2017-NR-01_03.html" 2017-NR-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-NR-01/i/|g' 2017-NR-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-NR-01/i/|g" 2017-NR-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-NR-01/i/|g' ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-NR-01/i/|g" ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2017-NR-01/l/|g' ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2017-NR-01/l/|g" ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2017-NR-01/t/|g' ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2017-NR-01/t/|g" ../entrance_data/'1623-2017-NR-01.html'
|
||||
mv t/"2017-NR-01_03.jpg" 2017-NR-01/t
|
||||
mv i/"2017-NR-01_03.jpg" 2017-NR-01/i
|
||||
mv t/"2017-NR-01_04.jpg" 2017-NR-01/t
|
||||
mv i/"2017-NR-01_04.jpg" 2017-NR-01/i
|
||||
mv l/"2017-NR-01_04.html" 2017-NR-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-NR-01/i/|g' 2017-NR-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-NR-01/i/|g" 2017-NR-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2017-NR-01/i/|g' ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2017-NR-01/i/|g" ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2017-NR-01/l/|g' ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2017-NR-01/l/|g" ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2017-NR-01/t/|g' ../entrance_data/'1623-2017-NR-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2017-NR-01/t/|g" ../entrance_data/'1623-2017-NR-01.html'
|
||||
mv t/"2018-ntu-01_looking_down_shaft-and-rift.jpg" 2018-NTU-01/t
|
||||
mv i/"2018-ntu-01_looking_down_shaft-and-rift.jpg" 2018-NTU-01/i
|
||||
mv t/"2018-ntu-01_tag_arrows.jpg" 2018-NTU-01/t
|
||||
mv i/"2018-ntu-01_tag_arrows.jpg" 2018-NTU-01/i
|
||||
mv t/"2018-ntu-01_neil_view_west.jpg" 2018-NTU-01/t
|
||||
mv i/"2018-ntu-01_neil_view_west.jpg" 2018-NTU-01/i
|
||||
mv l/"2018-ntu-01_looking_down_shaft-and-rift.html" 2018-NTU-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-NTU-01/i/|g' 2018-NTU-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-NTU-01/i/|g" 2018-NTU-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-NTU-01/i/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-NTU-01/i/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2018-NTU-01/l/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2018-NTU-01/l/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2018-NTU-01/t/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2018-NTU-01/t/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
mv l/"2018-ntu-01_tag_arrows.html" 2018-NTU-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-NTU-01/i/|g' 2018-NTU-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-NTU-01/i/|g" 2018-NTU-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-NTU-01/i/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-NTU-01/i/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2018-NTU-01/l/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2018-NTU-01/l/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2018-NTU-01/t/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2018-NTU-01/t/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
mv l/"2018-ntu-01_neil_view_west.html" 2018-NTU-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-NTU-01/i/|g' 2018-NTU-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-NTU-01/i/|g" 2018-NTU-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-NTU-01/i/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-NTU-01/i/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2018-NTU-01/l/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2018-NTU-01/l/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2018-NTU-01/t/|g' ../entrance_data/'1623-2018-NTU-01.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2018-NTU-01/t/|g" ../entrance_data/'1623-2018-NTU-01.html'
|
||||
mv t/"2018-pf-03_and_pf-02_arrows.jpg" 2018-pf-03/t
|
||||
mv i/"2018-pf-03_and_pf-02_arrows.jpg" 2018-pf-03/i
|
||||
mv l/"2018-pf-03_and_pf-02_arrows.html" 2018-pf-03/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-pf-03/i/|g' 2018-pf-03/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-pf-03/i/|g" 2018-pf-03/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2018-pf-03/i/|g' ../entrance_data/'1623-2018-pf-03.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2018-pf-03/i/|g" ../entrance_data/'1623-2018-pf-03.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2018-pf-03/l/|g' ../entrance_data/'1623-2018-pf-03.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2018-pf-03/l/|g" ../entrance_data/'1623-2018-pf-03.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2018-pf-03/t/|g' ../entrance_data/'1623-2018-pf-03.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2018-pf-03/t/|g" ../entrance_data/'1623-2018-pf-03.html'
|
||||
mv l/"2023-ASH-01-entrance1.html" 2023-ASH-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-01/i/|g' 2023-ASH-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-01/i/|g" 2023-ASH-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-01/i/|g' ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-01/i/|g" ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-01/l/|g' ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-01/l/|g" ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-01/t/|g' ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-01/t/|g" ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
mv l/"2023-ASH-01-entrance2.html" 2023-ASH-01/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-01/i/|g' 2023-ASH-01/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-01/i/|g" 2023-ASH-01/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-01/i/|g' ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-01/i/|g" ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-01/l/|g' ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-01/l/|g" ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-01/t/|g' ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-01/t/|g" ../entrance_data/'1623-2023-ASH-01a.html'
|
||||
mv t/"2023-ASH-01-entrance2.jpg" 2023-ASH-01/t
|
||||
mv i/"2023-ASH-01-entrance2.jpg" 2023-ASH-01/i
|
||||
mv t/"2023-ASH-01-entrance1.jpg" 2023-ASH-01/t
|
||||
mv i/"2023-ASH-01-entrance1.jpg" 2023-ASH-01/i
|
||||
mv l/"2023-ASH-02-entrance1.html" 2023-ASH-02/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-02/i/|g' 2023-ASH-02/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-02/i/|g" 2023-ASH-02/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-02/i/|g' ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-02/i/|g" ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-02/l/|g' ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-02/l/|g" ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-02/t/|g' ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-02/t/|g" ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
mv t/"2023-ASH-02-entrance1.jpg" 2023-ASH-02/t
|
||||
mv i/"2023-ASH-02-entrance1.jpg" 2023-ASH-02/i
|
||||
mv l/"2023-ASH-02-entrance2.html" 2023-ASH-02/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-02/i/|g' 2023-ASH-02/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-02/i/|g" 2023-ASH-02/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-02/i/|g' ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-02/i/|g" ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-02/l/|g' ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-02/l/|g" ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-02/t/|g' ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-02/t/|g" ../entrance_data/'1623-2023-ASH-02a.html'
|
||||
mv t/"2023-ASH-02-entrance2.jpg" 2023-ASH-02/t
|
||||
mv i/"2023-ASH-02-entrance2.jpg" 2023-ASH-02/i
|
||||
mv l/"2023-ASH-03-entrance2.html" 2023-ASH-03/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-03/i/|g' 2023-ASH-03/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-03/i/|g" 2023-ASH-03/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-03/i/|g' ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-03/i/|g" ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-03/l/|g' ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-03/l/|g" ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-03/t/|g' ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-03/t/|g" ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
mv t/"2023-ASH-03-entrance2.jpg" 2023-ASH-03/t
|
||||
mv i/"2023-ASH-03-entrance2.jpg" 2023-ASH-03/i
|
||||
mv l/"2023-ASH-03-entrance1.html" 2023-ASH-03/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-03/i/|g' 2023-ASH-03/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-03/i/|g" 2023-ASH-03/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-03/i/|g' ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-03/i/|g" ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-03/l/|g' ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-03/l/|g" ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-03/t/|g' ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-03/t/|g" ../entrance_data/'1623-2023-ASH-03a.html'
|
||||
mv t/"2023-ASH-03-entrance1.jpg" 2023-ASH-03/t
|
||||
mv i/"2023-ASH-03-entrance1.jpg" 2023-ASH-03/i
|
||||
mv t/"2023-ASH-04-entrance2.jpg" 2023-ASH-04/t
|
||||
mv i/"2023-ASH-04-entrance2.jpg" 2023-ASH-04/i
|
||||
mv t/"2023-ASH-04-entrance1.jpg" 2023-ASH-04/t
|
||||
mv i/"2023-ASH-04-entrance1.jpg" 2023-ASH-04/i
|
||||
mv l/"2023-ASH-04-entrance1.html" 2023-ASH-04/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-04/i/|g' 2023-ASH-04/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-04/i/|g" 2023-ASH-04/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-04/i/|g' ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-04/i/|g" ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-04/l/|g' ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-04/l/|g" ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-04/t/|g' ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-04/t/|g" ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
mv l/"2023-ASH-04-entrance2.html" 2023-ASH-04/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-04/i/|g' 2023-ASH-04/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-04/i/|g" 2023-ASH-04/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-04/i/|g' ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-04/i/|g" ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-04/l/|g' ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-04/l/|g" ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-04/t/|g' ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-04/t/|g" ../entrance_data/'1623-2023-ASH-04a.html'
|
||||
mv t/"2023-ASH-06-entrance2.jpg" 2023-ASH-06/t
|
||||
mv i/"2023-ASH-06-entrance2.jpg" 2023-ASH-06/i
|
||||
mv l/"2023-ASH-06-entrance1.html" 2023-ASH-06/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-06/i/|g' 2023-ASH-06/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-06/i/|g" 2023-ASH-06/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-06/i/|g' ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-06/i/|g" ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-06/l/|g' ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-06/l/|g" ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-06/t/|g' ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-06/t/|g" ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
mv l/"2023-ASH-06-entrance2.html" 2023-ASH-06/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-06/i/|g' 2023-ASH-06/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-06/i/|g" 2023-ASH-06/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-06/i/|g' ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-06/i/|g" ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-06/l/|g' ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-06/l/|g" ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-06/t/|g' ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-06/t/|g" ../entrance_data/'1623-2023-ASH-06a.html'
|
||||
mv t/"2023-ASH-06-entrance1.jpg" 2023-ASH-06/t
|
||||
mv i/"2023-ASH-06-entrance1.jpg" 2023-ASH-06/i
|
||||
mv l/"2023-ASH-07-entrance1.html" 2023-ASH-07/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-07/i/|g' 2023-ASH-07/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-07/i/|g" 2023-ASH-07/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-07/i/|g' ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-07/i/|g" ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-07/l/|g' ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-07/l/|g" ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-07/t/|g' ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-07/t/|g" ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
mv t/"2023-ASH-07-entrance1.jpg" 2023-ASH-07/t
|
||||
mv i/"2023-ASH-07-entrance1.jpg" 2023-ASH-07/i
|
||||
mv t/"2023-ASH-07-entrance2.jpg" 2023-ASH-07/t
|
||||
mv i/"2023-ASH-07-entrance2.jpg" 2023-ASH-07/i
|
||||
mv l/"2023-ASH-07-entrance2.html" 2023-ASH-07/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-07/i/|g' 2023-ASH-07/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-07/i/|g" 2023-ASH-07/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-07/i/|g' ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-07/i/|g" ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-07/l/|g' ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-07/l/|g" ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-07/t/|g' ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-07/t/|g" ../entrance_data/'1623-2023-ASH-07a.html'
|
||||
mv l/"2023-ASH-10-entrance2.html" 2023-ASH-10/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-10/i/|g' 2023-ASH-10/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-10/i/|g" 2023-ASH-10/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-10/i/|g' ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-10/i/|g" ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-10/l/|g' ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-10/l/|g" ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-10/t/|g' ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-10/t/|g" ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
mv t/"2023-ASH-10-entrance1.jpg" 2023-ASH-10/t
|
||||
mv i/"2023-ASH-10-entrance1.jpg" 2023-ASH-10/i
|
||||
mv t/"2023-ASH-10-entrance2.jpg" 2023-ASH-10/t
|
||||
mv i/"2023-ASH-10-entrance2.jpg" 2023-ASH-10/i
|
||||
mv l/"2023-ASH-10-entrance1.html" 2023-ASH-10/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-10/i/|g' 2023-ASH-10/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-10/i/|g" 2023-ASH-10/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-10/i/|g' ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-10/i/|g" ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-10/l/|g' ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-10/l/|g" ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-10/t/|g' ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-10/t/|g" ../entrance_data/'1623-2023-ASH-10a.html'
|
||||
mv t/"2023-ASH-11-entrance2.jpg" 2023-ASH-11/t
|
||||
mv i/"2023-ASH-11-entrance2.jpg" 2023-ASH-11/i
|
||||
mv l/"2023-ASH-11-entrance2.html" 2023-ASH-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' 2023-ASH-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" 2023-ASH-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-11/l/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-11/l/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-11/t/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-11/t/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
mv l/"2023-ASH-11-entrance4.html" 2023-ASH-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' 2023-ASH-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" 2023-ASH-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-11/l/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-11/l/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-11/t/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-11/t/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
mv l/"2023-ASH-11-entrance3.html" 2023-ASH-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' 2023-ASH-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" 2023-ASH-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-11/l/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-11/l/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-11/t/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-11/t/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
mv l/"2023-ASH-11-entrance1.html" 2023-ASH-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' 2023-ASH-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" 2023-ASH-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-11/i/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-11/i/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-11/l/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-11/l/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-11/t/|g' ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-11/t/|g" ../entrance_data/'1623-2023-ASH-11a.html'
|
||||
mv t/"2023-ASH-11-entrance1.jpg" 2023-ASH-11/t
|
||||
mv i/"2023-ASH-11-entrance1.jpg" 2023-ASH-11/i
|
||||
mv t/"2023-ASH-11-entrance3.jpg" 2023-ASH-11/t
|
||||
mv i/"2023-ASH-11-entrance3.jpg" 2023-ASH-11/i
|
||||
mv t/"2023-ASH-11-entrance4.jpg" 2023-ASH-11/t
|
||||
mv i/"2023-ASH-11-entrance4.jpg" 2023-ASH-11/i
|
||||
mv l/"2023-ASH-12-entrance1.html" 2023-ASH-12/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-12/i/|g' 2023-ASH-12/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-12/i/|g" 2023-ASH-12/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-12/i/|g' ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-12/i/|g" ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-12/l/|g' ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-12/l/|g" ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-12/t/|g' ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-12/t/|g" ../entrance_data/'1623-2023-ASH-12.html'
|
||||
mv t/"2023-ASH-12-entrance1.jpg" 2023-ASH-12/t
|
||||
mv i/"2023-ASH-12-entrance1.jpg" 2023-ASH-12/i
|
||||
mv t/"2023-ASH-12-entrance2.jpg" 2023-ASH-12/t
|
||||
mv i/"2023-ASH-12-entrance2.jpg" 2023-ASH-12/i
|
||||
mv l/"2023-ASH-12-entrance2.html" 2023-ASH-12/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-12/i/|g' 2023-ASH-12/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-12/i/|g" 2023-ASH-12/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-12/i/|g' ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-12/i/|g" ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-12/l/|g' ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-12/l/|g" ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-12/t/|g' ../entrance_data/'1623-2023-ASH-12.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-12/t/|g" ../entrance_data/'1623-2023-ASH-12.html'
|
||||
mv l/"2023-ASH-13-entrance1.html" 2023-ASH-13/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-13/i/|g' 2023-ASH-13/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-13/i/|g" 2023-ASH-13/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-13/i/|g' ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-13/i/|g" ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-13/l/|g' ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-13/l/|g" ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-13/t/|g' ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-13/t/|g" ../entrance_data/'1623-2023-ASH-13.html'
|
||||
mv l/"2023-ASH-13-entrance2.html" 2023-ASH-13/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-13/i/|g' 2023-ASH-13/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-13/i/|g" 2023-ASH-13/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-13/i/|g' ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-13/i/|g" ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-13/l/|g' ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-13/l/|g" ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-13/t/|g' ../entrance_data/'1623-2023-ASH-13.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-13/t/|g" ../entrance_data/'1623-2023-ASH-13.html'
|
||||
mv t/"2023-ASH-13-entrance2.jpg" 2023-ASH-13/t
|
||||
mv i/"2023-ASH-13-entrance2.jpg" 2023-ASH-13/i
|
||||
mv t/"2023-ASH-13-entrance1.jpg" 2023-ASH-13/t
|
||||
mv i/"2023-ASH-13-entrance1.jpg" 2023-ASH-13/i
|
||||
mv l/"2023-ASH-13and14-entrances.html" 2023-ASH-14/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-14/i/|g' 2023-ASH-14/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-14/i/|g" 2023-ASH-14/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-14/i/|g' ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-14/i/|g" ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-14/l/|g' ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-14/l/|g" ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-14/t/|g' ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-14/t/|g" ../entrance_data/'1623-2023-ASH-14.html'
|
||||
mv t/"2023-ASH-14-entrance1.jpg" 2023-ASH-14/t
|
||||
mv i/"2023-ASH-14-entrance1.jpg" 2023-ASH-14/i
|
||||
mv l/"2023-ASH-14-entrance1.html" 2023-ASH-14/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-14/i/|g' 2023-ASH-14/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-14/i/|g" 2023-ASH-14/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-ASH-14/i/|g' ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-ASH-14/i/|g" ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-ASH-14/l/|g' ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-ASH-14/l/|g" ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-ASH-14/t/|g' ../entrance_data/'1623-2023-ASH-14.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-ASH-14/t/|g" ../entrance_data/'1623-2023-ASH-14.html'
|
||||
mv t/"2023-ASH-13and14-entrances.jpg" 2023-ASH-14/t
|
||||
mv i/"2023-ASH-13and14-entrances.jpg" 2023-ASH-14/i
|
||||
mv t/"2023-BL-11-sketch.jpg" 2023-BL-11/t
|
||||
mv i/"2023-BL-11-sketch.jpg" 2023-BL-11/i
|
||||
mv t/"20230802_165708.jpg" 2023-BL-11/t
|
||||
mv i/"20230802_165708.jpg" 2023-BL-11/i
|
||||
mv t/"20230802_165823.jpg" 2023-BL-11/t
|
||||
mv i/"20230802_165823.jpg" 2023-BL-11/i
|
||||
mv l/"20230802_165708.html" 2023-BL-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-BL-11/i/|g' 2023-BL-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-BL-11/i/|g" 2023-BL-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-BL-11/i/|g' ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-BL-11/i/|g" ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-BL-11/l/|g' ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-BL-11/l/|g" ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-BL-11/t/|g' ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-BL-11/t/|g" ../entrance_data/'1623-2023-BL-11.html'
|
||||
mv l/"2023-BL-11-sketch.html" 2023-BL-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-BL-11/i/|g' 2023-BL-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-BL-11/i/|g" 2023-BL-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-BL-11/i/|g' ../cave_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-BL-11/i/|g" ../cave_data/'1623-2023-BL-11.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-BL-11/l/|g' ../cave_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-BL-11/l/|g" ../cave_data/'1623-2023-BL-11.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-BL-11/t/|g' ../cave_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-BL-11/t/|g" ../cave_data/'1623-2023-BL-11.html'
|
||||
mv l/"20230802_165823.html" 2023-BL-11/l
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-BL-11/i/|g' 2023-BL-11/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-BL-11/i/|g" 2023-BL-11/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/2023-BL-11/i/|g' ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/2023-BL-11/i/|g" ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/2023-BL-11/l/|g' ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/2023-BL-11/l/|g" ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/2023-BL-11/t/|g' ../entrance_data/'1623-2023-BL-11.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/2023-BL-11/t/|g" ../entrance_data/'1623-2023-BL-11.html'
|
||||
mv t/"2023-ASH-15-entrance3.jpg" 303/t
|
||||
mv i/"2023-ASH-15-entrance3.jpg" 303/i
|
||||
mv l/"2023-ASH-15-entrance3.html" 303/l
|
||||
sed -i 's|\/1623\/i\/|/1623/303/i/|g' 303/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/303/i/|g" 303/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/303/i/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/303/i/|g" ../entrance_data/'1623-303.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/303/l/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/303/l/|g" ../entrance_data/'1623-303.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/303/t/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/303/t/|g" ../entrance_data/'1623-303.html'
|
||||
mv t/"2023-ASH-15-entrance1.jpg" 303/t
|
||||
mv i/"2023-ASH-15-entrance1.jpg" 303/i
|
||||
mv l/"2023-ASH-15-entrance2.html" 303/l
|
||||
sed -i 's|\/1623\/i\/|/1623/303/i/|g' 303/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/303/i/|g" 303/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/303/i/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/303/i/|g" ../entrance_data/'1623-303.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/303/l/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/303/l/|g" ../entrance_data/'1623-303.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/303/t/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/303/t/|g" ../entrance_data/'1623-303.html'
|
||||
mv l/"2023-ASH-15-entrance1.html" 303/l
|
||||
sed -i 's|\/1623\/i\/|/1623/303/i/|g' 303/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/303/i/|g" 303/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/303/i/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/303/i/|g" ../entrance_data/'1623-303.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/303/l/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/303/l/|g" ../entrance_data/'1623-303.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/303/t/|g' ../entrance_data/'1623-303.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/303/t/|g" ../entrance_data/'1623-303.html'
|
||||
mv t/"2023-ASH-15-entrance2.jpg" 303/t
|
||||
mv i/"2023-ASH-15-entrance2.jpg" 303/i
|
||||
mv l/"2023-ASH-17-bothentrances.html" 306/l
|
||||
sed -i 's|\/1623\/i\/|/1623/306/i/|g' 306/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/306/i/|g" 306/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/306/i/|g' ../entrance_data/'1623-306b.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/306/i/|g" ../entrance_data/'1623-306b.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/306/l/|g' ../entrance_data/'1623-306b.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/306/l/|g" ../entrance_data/'1623-306b.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/306/t/|g' ../entrance_data/'1623-306b.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/306/t/|g" ../entrance_data/'1623-306b.html'
|
||||
mv l/"2023-ASH-17-bothentrances.html" 306/l
|
||||
sed -i 's|\/1623\/i\/|/1623/306/i/|g' 306/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/306/i/|g" 306/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/306/i/|g' ../entrance_data/'1623-306a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/306/i/|g" ../entrance_data/'1623-306a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/306/l/|g' ../entrance_data/'1623-306a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/306/l/|g" ../entrance_data/'1623-306a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/306/t/|g' ../entrance_data/'1623-306a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/306/t/|g" ../entrance_data/'1623-306a.html'
|
||||
mv i/"2023-ASH-17-sketch.jpg" 306/i
|
||||
mv l/"2023-ASH-17-sketch.html" 306/l
|
||||
sed -i 's|\/1623\/i\/|/1623/306/i/|g' 306/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/306/i/|g" 306/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/306/i/|g' ../cave_data/'1623-306.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/306/i/|g" ../cave_data/'1623-306.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/306/l/|g' ../cave_data/'1623-306.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/306/l/|g" ../cave_data/'1623-306.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/306/t/|g' ../cave_data/'1623-306.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/306/t/|g" ../cave_data/'1623-306.html'
|
||||
mv t/"2023-ASH-17-bothentrances.jpg" 306/t
|
||||
mv i/"2023-ASH-17-bothentrances.jpg" 306/i
|
||||
mv t/"2023-ASH-17-bothentrances.jpg" 306/t
|
||||
mv i/"2023-ASH-17-bothentrances.jpg" 306/i
|
||||
mv l/"2023-ASH-05-entrance-b1.html" 307/l
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' 307/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" 307/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' ../entrance_data/'1623-307b.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" ../entrance_data/'1623-307b.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/307/l/|g' ../entrance_data/'1623-307b.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/307/l/|g" ../entrance_data/'1623-307b.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/307/t/|g' ../entrance_data/'1623-307b.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/307/t/|g" ../entrance_data/'1623-307b.html'
|
||||
mv l/"2023-ASH-05-entrance-a1.html" 307/l
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' 307/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" 307/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' ../entrance_data/'1623-307a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" ../entrance_data/'1623-307a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/307/l/|g' ../entrance_data/'1623-307a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/307/l/|g" ../entrance_data/'1623-307a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/307/t/|g' ../entrance_data/'1623-307a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/307/t/|g" ../entrance_data/'1623-307a.html'
|
||||
mv t/"2023-ASH-05-entrance-a3.jpg" 307/t
|
||||
mv i/"2023-ASH-05-entrance-a3.jpg" 307/i
|
||||
mv l/"2023-ASH-05-entrance-a2.html" 307/l
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' 307/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" 307/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' ../entrance_data/'1623-307a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" ../entrance_data/'1623-307a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/307/l/|g' ../entrance_data/'1623-307a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/307/l/|g" ../entrance_data/'1623-307a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/307/t/|g' ../entrance_data/'1623-307a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/307/t/|g" ../entrance_data/'1623-307a.html'
|
||||
mv t/"2023-ASH-05-entrance-a2.jpg" 307/t
|
||||
mv i/"2023-ASH-05-entrance-a2.jpg" 307/i
|
||||
mv i/"2023-ASH-05-sketch.jpg" 307/i
|
||||
mv t/"2023-ASH-05-entrance-a1.jpg" 307/t
|
||||
mv i/"2023-ASH-05-entrance-a1.jpg" 307/i
|
||||
mv l/"2023-ASH-05-sketch.html" 307/l
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' 307/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" 307/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' ../cave_data/'1623-307.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" ../cave_data/'1623-307.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/307/l/|g' ../cave_data/'1623-307.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/307/l/|g" ../cave_data/'1623-307.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/307/t/|g' ../cave_data/'1623-307.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/307/t/|g" ../cave_data/'1623-307.html'
|
||||
mv l/"2023-ASH-05-entrance-a3.html" 307/l
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' 307/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" 307/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/307/i/|g' ../cave_data/'1623-307.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/307/i/|g" ../cave_data/'1623-307.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/307/l/|g' ../cave_data/'1623-307.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/307/l/|g" ../cave_data/'1623-307.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/307/t/|g' ../cave_data/'1623-307.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/307/t/|g" ../cave_data/'1623-307.html'
|
||||
mv t/"2023-ASH-05-entrance-b1.jpg" 307/t
|
||||
mv i/"2023-ASH-05-entrance-b1.jpg" 307/i
|
||||
mv l/"2023-ASH-08-entrance-a3.html" 308/l
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' 308/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" 308/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' ../cave_data/'1623-308.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" ../cave_data/'1623-308.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/308/l/|g' ../cave_data/'1623-308.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/308/l/|g" ../cave_data/'1623-308.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/308/t/|g' ../cave_data/'1623-308.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/308/t/|g" ../cave_data/'1623-308.html'
|
||||
mv l/"2023-ASH-08-sketch.html" 308/l
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' 308/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" 308/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' ../cave_data/'1623-308.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" ../cave_data/'1623-308.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/308/l/|g' ../cave_data/'1623-308.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/308/l/|g" ../cave_data/'1623-308.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/308/t/|g' ../cave_data/'1623-308.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/308/t/|g" ../cave_data/'1623-308.html'
|
||||
mv l/"2023-ASH-08-entrance-a1.html" 308/l
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' 308/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" 308/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' ../entrance_data/'1623-308a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" ../entrance_data/'1623-308a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/308/l/|g' ../entrance_data/'1623-308a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/308/l/|g" ../entrance_data/'1623-308a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/308/t/|g' ../entrance_data/'1623-308a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/308/t/|g" ../entrance_data/'1623-308a.html'
|
||||
mv t/"2023-ASH-08-entrance-b1.jpg" 308/t
|
||||
mv i/"2023-ASH-08-entrance-b1.jpg" 308/i
|
||||
mv l/"2023-ASH-08-entrance-b1.html" 308/l
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' 308/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" 308/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' ../entrance_data/'1623-308b.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" ../entrance_data/'1623-308b.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/308/l/|g' ../entrance_data/'1623-308b.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/308/l/|g" ../entrance_data/'1623-308b.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/308/t/|g' ../entrance_data/'1623-308b.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/308/t/|g" ../entrance_data/'1623-308b.html'
|
||||
mv t/"2023-ASH-08-entrance-a1.jpg" 308/t
|
||||
mv i/"2023-ASH-08-entrance-a1.jpg" 308/i
|
||||
mv t/"2023-ASH-08-entrance-a2.jpg" 308/t
|
||||
mv i/"2023-ASH-08-entrance-a2.jpg" 308/i
|
||||
mv i/"2023-ASH-08-sketch.jpg" 308/i
|
||||
mv l/"2023-ASH-08-entrance-a2.html" 308/l
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' 308/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" 308/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/308/i/|g' ../entrance_data/'1623-308a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/308/i/|g" ../entrance_data/'1623-308a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/308/l/|g' ../entrance_data/'1623-308a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/308/l/|g" ../entrance_data/'1623-308a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/308/t/|g' ../entrance_data/'1623-308a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/308/t/|g" ../entrance_data/'1623-308a.html'
|
||||
mv t/"2023-ASH-08-entrance-a3.jpg" 308/t
|
||||
mv i/"2023-ASH-08-entrance-a3.jpg" 308/i
|
||||
mv l/"2023-ASH-09-plan.html" 309/l
|
||||
sed -i 's|\/1623\/i\/|/1623/309/i/|g' 309/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/309/i/|g" 309/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/309/i/|g' ../cave_data/'1623-309.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/309/i/|g" ../cave_data/'1623-309.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/309/l/|g' ../cave_data/'1623-309.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/309/l/|g" ../cave_data/'1623-309.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/309/t/|g' ../cave_data/'1623-309.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/309/t/|g" ../cave_data/'1623-309.html'
|
||||
mv l/"2023-ASH-09-entrance2.html" 309/l
|
||||
sed -i 's|\/1623\/i\/|/1623/309/i/|g' 309/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/309/i/|g" 309/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/309/i/|g' ../entrance_data/'1623-309a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/309/i/|g" ../entrance_data/'1623-309a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/309/l/|g' ../entrance_data/'1623-309a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/309/l/|g" ../entrance_data/'1623-309a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/309/t/|g' ../entrance_data/'1623-309a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/309/t/|g" ../entrance_data/'1623-309a.html'
|
||||
mv i/"2023-ASH-09-plan.jpg" 309/i
|
||||
mv t/"2023-ASH-09-entrance1.jpg" 309/t
|
||||
mv i/"2023-ASH-09-entrance1.jpg" 309/i
|
||||
mv t/"2023-ASH-09-entrance2.jpg" 309/t
|
||||
mv i/"2023-ASH-09-entrance2.jpg" 309/i
|
||||
mv l/"2023-ASH-09-entrance1.html" 309/l
|
||||
sed -i 's|\/1623\/i\/|/1623/309/i/|g' 309/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/309/i/|g" 309/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/309/i/|g' ../entrance_data/'1623-309a.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/309/i/|g" ../entrance_data/'1623-309a.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/309/l/|g' ../entrance_data/'1623-309a.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/309/l/|g" ../entrance_data/'1623-309a.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/309/t/|g' ../entrance_data/'1623-309a.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/309/t/|g" ../entrance_data/'1623-309a.html'
|
||||
mv l/"2023-ASH-16-entrance2.html" 311/l
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' 311/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" 311/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" ../entrance_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/311/l/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/311/l/|g" ../entrance_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/311/t/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/311/t/|g" ../entrance_data/'1623-311.html'
|
||||
mv t/"2023-ASH-16-entrance3.jpg" 311/t
|
||||
mv i/"2023-ASH-16-entrance3.jpg" 311/i
|
||||
mv l/"2023-ASH-16-entrance3.html" 311/l
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' 311/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" 311/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" ../entrance_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/311/l/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/311/l/|g" ../entrance_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/311/t/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/311/t/|g" ../entrance_data/'1623-311.html'
|
||||
mv t/"2023-ASH-16-entrance2.jpg" 311/t
|
||||
mv i/"2023-ASH-16-entrance2.jpg" 311/i
|
||||
mv l/"2023-ASH-16-entrance1.html" 311/l
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' 311/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" 311/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" ../entrance_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/311/l/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/311/l/|g" ../entrance_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/311/t/|g' ../entrance_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/311/t/|g" ../entrance_data/'1623-311.html'
|
||||
mv i/"2023-ASH-16-sketch.jpg" 311/i
|
||||
mv l/"2023-ASH-16-sketch.html" 311/l
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' 311/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" 311/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/311/i/|g' ../cave_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/311/i/|g" ../cave_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/311/l/|g' ../cave_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/311/l/|g" ../cave_data/'1623-311.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/311/t/|g' ../cave_data/'1623-311.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/311/t/|g" ../cave_data/'1623-311.html'
|
||||
mv t/"2023-ASH-16-entrance1.jpg" 311/t
|
||||
mv i/"2023-ASH-16-entrance1.jpg" 311/i
|
||||
mv t/"photo_2023-10-30_22-07-43.jpg" 315/t
|
||||
mv i/"photo_2023-10-30_22-07-43.jpg" 315/i
|
||||
mv l/"photo_2023-10-30_22-07-43.html" 315/l
|
||||
sed -i 's|\/1623\/i\/|/1623/315/i/|g' 315/l/*.html
|
||||
sed -i "s|\/1623\/i\/|/1623/315/i/|g" 315/l/*.html
|
||||
sed -i 's|\/1623\/i\/|/1623/315/i/|g' ../cave_data/'1623-315.html'
|
||||
sed -i "s|\/1623\/i\/|/1623/315/i/|g" ../cave_data/'1623-315.html'
|
||||
sed -i 's|\/1623\/l\/|/1623/315/l/|g' ../cave_data/'1623-315.html'
|
||||
sed -i "s|\/1623\/l\/|/1623/315/l/|g" ../cave_data/'1623-315.html'
|
||||
sed -i 's|\/1623\/t\/|/1623/315/t/|g' ../cave_data/'1623-315.html'
|
||||
sed -i "s|\/1623\/t\/|/1623/315/t/|g" ../cave_data/'1623-315.html'
|
||||
|
||||
141
1623-renaming.txt
Normal file
141
1623-renaming.txt
Normal file
@@ -0,0 +1,141 @@
|
||||
range(303, 316) 312
|
||||
2023-RAWDB-02 312
|
||||
range(303, 316) 313
|
||||
2023-RAWDB-01 313
|
||||
range(303, 316) 314
|
||||
2023-KT-02 314
|
||||
range(303, 316) 315
|
||||
2023-JSS-01 315
|
||||
('c', 'i', '2013-06', '1623-2013-06.html', '2013wallet23.jpg')
|
||||
('c', 'l', '2013-06', '1623-2013-06.html', '2013wallet23.html')
|
||||
('c', 'l', '2013-BL-01', '1623-2013-BL-01.html', '2013-BL-01.html')
|
||||
('c', 't', '2013-BL-01', '1623-2013-BL-01.html', '2013-BL-01.jpg')
|
||||
('c', 't', '2023-BL-11', '1623-2023-BL-11.html', '2023-BL-11-sketch.jpg')
|
||||
('c', 'l', '2023-BL-11', '1623-2023-BL-11.html', '2023-BL-11-sketch.html')
|
||||
('c', 'i', '306', '1623-306.html', '2023-ASH-17-sketch.jpg')
|
||||
('c', 'l', '306', '1623-306.html', '2023-ASH-17-sketch.html')
|
||||
('c', 't', '307', '1623-307.html', '2023-ASH-05-entrance-a3.jpg')
|
||||
('c', 'i', '307', '1623-307.html', '2023-ASH-05-sketch.jpg')
|
||||
('c', 'l', '307', '1623-307.html', '2023-ASH-05-sketch.html')
|
||||
('c', 'l', '307', '1623-307.html', '2023-ASH-05-entrance-a3.html')
|
||||
('c', 'l', '308', '1623-308.html', '2023-ASH-08-entrance-a3.html')
|
||||
('c', 'l', '308', '1623-308.html', '2023-ASH-08-sketch.html')
|
||||
('c', 'i', '308', '1623-308.html', '2023-ASH-08-sketch.jpg')
|
||||
('c', 't', '308', '1623-308.html', '2023-ASH-08-entrance-a3.jpg')
|
||||
('c', 'l', '309', '1623-309.html', '2023-ASH-09-plan.html')
|
||||
('c', 'i', '309', '1623-309.html', '2023-ASH-09-plan.jpg')
|
||||
('c', 'i', '311', '1623-311.html', '2023-ASH-16-sketch.jpg')
|
||||
('c', 'l', '311', '1623-311.html', '2023-ASH-16-sketch.html')
|
||||
('c', 't', '315', '1623-315.html', 'photo_2023-10-30_22-07-43.jpg')
|
||||
('c', 'l', '315', '1623-315.html', 'photo_2023-10-30_22-07-43.html')
|
||||
|
||||
('e', 'l', '2012-sw-01', '1623-2012-sw-01.html', '2012-sw-01_i1.html')
|
||||
('e', 't', '2012-sw-01', '1623-2012-sw-01.html', '2012-sw-01_i1.jpg')
|
||||
('e', 'l', '2012-sw-03', '1623-2012-sw-03.html', '2012-sw-03_i2.html')
|
||||
('e', 'l', '2012-sw-03', '1623-2012-sw-03.html', '2012-sw-03_i1.html')
|
||||
('e', 't', '2012-sw-03', '1623-2012-sw-03.html', '2012-sw-03_i1.jpg')
|
||||
('e', 't', '2012-sw-03', '1623-2012-sw-03.html', '2012-sw-03_i2.jpg')
|
||||
('e', 'l', '2017-AA-01', '1623-2017-AA-01.html', 'aa-1-2017_with-tag.html')
|
||||
('e', 't', '2017-AA-01', '1623-2017-AA-01.html', 'aa-1-2017_with-tag.jpg')
|
||||
('e', 'l', '2017-AA-01', '1623-2017-AA-01.html', 'aa-1-2017_looking-down.html')
|
||||
('e', 't', '2017-AA-01', '1623-2017-AA-01.html', 'aa-1-2017_looking-down.jpg')
|
||||
('e', 't', '2017-AMS-02', '1623-2017-AMS-02.html', 'ent081-20170807.jpg')
|
||||
('e', 'l', '2017-AMS-02', '1623-2017-AMS-02.html', 'near-ent-2017-ams-02.html')
|
||||
('e', 't', '2017-AMS-02', '1623-2017-AMS-02.html', 'near-ent-2017-ams-02.jpg')
|
||||
('e', 'l', '2017-AMS-02', '1623-2017-AMS-02.html', 'ent081-20170807.html')
|
||||
('e', 'l', '2017-NR-01', '1623-2017-NR-01.html', '2017-NR-01_03.html')
|
||||
('e', 't', '2017-NR-01', '1623-2017-NR-01.html', '2017-NR-01_03.jpg')
|
||||
('e', 't', '2017-NR-01', '1623-2017-NR-01.html', '2017-NR-01_04.jpg')
|
||||
('e', 'l', '2017-NR-01', '1623-2017-NR-01.html', '2017-NR-01_04.html')
|
||||
('e', 't', '2018-NTU-01', '1623-2018-NTU-01.html', '2018-ntu-01_looking_down_shaft-and-rift.jpg')
|
||||
('e', 't', '2018-NTU-01', '1623-2018-NTU-01.html', '2018-ntu-01_tag_arrows.jpg')
|
||||
('e', 't', '2018-NTU-01', '1623-2018-NTU-01.html', '2018-ntu-01_neil_view_west.jpg')
|
||||
('e', 'l', '2018-NTU-01', '1623-2018-NTU-01.html', '2018-ntu-01_looking_down_shaft-and-rift.html')
|
||||
('e', 'l', '2018-NTU-01', '1623-2018-NTU-01.html', '2018-ntu-01_tag_arrows.html')
|
||||
('e', 'l', '2018-NTU-01', '1623-2018-NTU-01.html', '2018-ntu-01_neil_view_west.html')
|
||||
('e', 't', '2018-pf-03', '1623-2018-pf-03.html', '2018-pf-03_and_pf-02_arrows.jpg')
|
||||
('e', 'l', '2018-pf-03', '1623-2018-pf-03.html', '2018-pf-03_and_pf-02_arrows.html')
|
||||
('e', 'l', '2023-ASH-01', '1623-2023-ASH-01a.html', '2023-ASH-01-entrance1.html')
|
||||
('e', 'l', '2023-ASH-01', '1623-2023-ASH-01a.html', '2023-ASH-01-entrance2.html')
|
||||
('e', 't', '2023-ASH-01', '1623-2023-ASH-01a.html', '2023-ASH-01-entrance2.jpg')
|
||||
('e', 't', '2023-ASH-01', '1623-2023-ASH-01a.html', '2023-ASH-01-entrance1.jpg')
|
||||
('e', 'l', '2023-ASH-02', '1623-2023-ASH-02a.html', '2023-ASH-02-entrance1.html')
|
||||
('e', 't', '2023-ASH-02', '1623-2023-ASH-02a.html', '2023-ASH-02-entrance1.jpg')
|
||||
('e', 'l', '2023-ASH-02', '1623-2023-ASH-02a.html', '2023-ASH-02-entrance2.html')
|
||||
('e', 't', '2023-ASH-02', '1623-2023-ASH-02a.html', '2023-ASH-02-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-03', '1623-2023-ASH-03a.html', '2023-ASH-03-entrance2.html')
|
||||
('e', 't', '2023-ASH-03', '1623-2023-ASH-03a.html', '2023-ASH-03-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-03', '1623-2023-ASH-03a.html', '2023-ASH-03-entrance1.html')
|
||||
('e', 't', '2023-ASH-03', '1623-2023-ASH-03a.html', '2023-ASH-03-entrance1.jpg')
|
||||
('e', 't', '2023-ASH-04', '1623-2023-ASH-04a.html', '2023-ASH-04-entrance2.jpg')
|
||||
('e', 't', '2023-ASH-04', '1623-2023-ASH-04a.html', '2023-ASH-04-entrance1.jpg')
|
||||
('e', 'l', '2023-ASH-04', '1623-2023-ASH-04a.html', '2023-ASH-04-entrance1.html')
|
||||
('e', 'l', '2023-ASH-04', '1623-2023-ASH-04a.html', '2023-ASH-04-entrance2.html')
|
||||
('e', 't', '2023-ASH-06', '1623-2023-ASH-06a.html', '2023-ASH-06-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-06', '1623-2023-ASH-06a.html', '2023-ASH-06-entrance1.html')
|
||||
('e', 'l', '2023-ASH-06', '1623-2023-ASH-06a.html', '2023-ASH-06-entrance2.html')
|
||||
('e', 't', '2023-ASH-06', '1623-2023-ASH-06a.html', '2023-ASH-06-entrance1.jpg')
|
||||
('e', 'l', '2023-ASH-07', '1623-2023-ASH-07a.html', '2023-ASH-07-entrance1.html')
|
||||
('e', 't', '2023-ASH-07', '1623-2023-ASH-07a.html', '2023-ASH-07-entrance1.jpg')
|
||||
('e', 't', '2023-ASH-07', '1623-2023-ASH-07a.html', '2023-ASH-07-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-07', '1623-2023-ASH-07a.html', '2023-ASH-07-entrance2.html')
|
||||
('e', 'l', '2023-ASH-10', '1623-2023-ASH-10a.html', '2023-ASH-10-entrance2.html')
|
||||
('e', 't', '2023-ASH-10', '1623-2023-ASH-10a.html', '2023-ASH-10-entrance1.jpg')
|
||||
('e', 't', '2023-ASH-10', '1623-2023-ASH-10a.html', '2023-ASH-10-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-10', '1623-2023-ASH-10a.html', '2023-ASH-10-entrance1.html')
|
||||
('e', 't', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance2.html')
|
||||
('e', 'l', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance4.html')
|
||||
('e', 'l', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance3.html')
|
||||
('e', 'l', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance1.html')
|
||||
('e', 't', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance1.jpg')
|
||||
('e', 't', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance3.jpg')
|
||||
('e', 't', '2023-ASH-11', '1623-2023-ASH-11a.html', '2023-ASH-11-entrance4.jpg')
|
||||
('e', 'l', '2023-ASH-12', '1623-2023-ASH-12.html', '2023-ASH-12-entrance1.html')
|
||||
('e', 't', '2023-ASH-12', '1623-2023-ASH-12.html', '2023-ASH-12-entrance1.jpg')
|
||||
('e', 't', '2023-ASH-12', '1623-2023-ASH-12.html', '2023-ASH-12-entrance2.jpg')
|
||||
('e', 'l', '2023-ASH-12', '1623-2023-ASH-12.html', '2023-ASH-12-entrance2.html')
|
||||
('e', 'l', '2023-ASH-13', '1623-2023-ASH-13.html', '2023-ASH-13-entrance1.html')
|
||||
('e', 'l', '2023-ASH-13', '1623-2023-ASH-13.html', '2023-ASH-13-entrance2.html')
|
||||
('e', 't', '2023-ASH-13', '1623-2023-ASH-13.html', '2023-ASH-13-entrance2.jpg')
|
||||
('e', 't', '2023-ASH-13', '1623-2023-ASH-13.html', '2023-ASH-13-entrance1.jpg')
|
||||
('e', 'l', '2023-ASH-14', '1623-2023-ASH-14.html', '2023-ASH-13and14-entrances.html')
|
||||
('e', 't', '2023-ASH-14', '1623-2023-ASH-14.html', '2023-ASH-14-entrance1.jpg')
|
||||
('e', 'l', '2023-ASH-14', '1623-2023-ASH-14.html', '2023-ASH-14-entrance1.html')
|
||||
('e', 't', '2023-ASH-14', '1623-2023-ASH-14.html', '2023-ASH-13and14-entrances.jpg')
|
||||
('e', 't', '2023-BL-11', '1623-2023-BL-11.html', '20230802_165708.jpg')
|
||||
('e', 't', '2023-BL-11', '1623-2023-BL-11.html', '20230802_165823.jpg')
|
||||
('e', 'l', '2023-BL-11', '1623-2023-BL-11.html', '20230802_165708.html')
|
||||
('e', 'l', '2023-BL-11', '1623-2023-BL-11.html', '20230802_165823.html')
|
||||
('e', 't', '303', '1623-303.html', '2023-ASH-15-entrance3.jpg')
|
||||
('e', 'l', '303', '1623-303.html', '2023-ASH-15-entrance3.html')
|
||||
('e', 't', '303', '1623-303.html', '2023-ASH-15-entrance1.jpg')
|
||||
('e', 'l', '303', '1623-303.html', '2023-ASH-15-entrance2.html')
|
||||
('e', 'l', '303', '1623-303.html', '2023-ASH-15-entrance1.html')
|
||||
('e', 't', '303', '1623-303.html', '2023-ASH-15-entrance2.jpg')
|
||||
('e', 'l', '306', '1623-306b.html', '2023-ASH-17-bothentrances.html')
|
||||
('e', 'l', '306', '1623-306a.html', '2023-ASH-17-bothentrances.html')
|
||||
('e', 't', '306', '1623-306a.html', '2023-ASH-17-bothentrances.jpg')
|
||||
('e', 't', '306', '1623-306b.html', '2023-ASH-17-bothentrances.jpg')
|
||||
('e', 'l', '307', '1623-307b.html', '2023-ASH-05-entrance-b1.html')
|
||||
('e', 'l', '307', '1623-307a.html', '2023-ASH-05-entrance-a1.html')
|
||||
('e', 'l', '307', '1623-307a.html', '2023-ASH-05-entrance-a2.html')
|
||||
('e', 't', '307', '1623-307a.html', '2023-ASH-05-entrance-a2.jpg')
|
||||
('e', 't', '307', '1623-307a.html', '2023-ASH-05-entrance-a1.jpg')
|
||||
('e', 't', '307', '1623-307b.html', '2023-ASH-05-entrance-b1.jpg')
|
||||
('e', 'l', '308', '1623-308a.html', '2023-ASH-08-entrance-a1.html')
|
||||
('e', 't', '308', '1623-308b.html', '2023-ASH-08-entrance-b1.jpg')
|
||||
('e', 'l', '308', '1623-308b.html', '2023-ASH-08-entrance-b1.html')
|
||||
('e', 't', '308', '1623-308a.html', '2023-ASH-08-entrance-a1.jpg')
|
||||
('e', 't', '308', '1623-308a.html', '2023-ASH-08-entrance-a2.jpg')
|
||||
('e', 'l', '308', '1623-308a.html', '2023-ASH-08-entrance-a2.html')
|
||||
('e', 'l', '309', '1623-309a.html', '2023-ASH-09-entrance2.html')
|
||||
('e', 't', '309', '1623-309a.html', '2023-ASH-09-entrance1.jpg')
|
||||
('e', 't', '309', '1623-309a.html', '2023-ASH-09-entrance2.jpg')
|
||||
('e', 'l', '309', '1623-309a.html', '2023-ASH-09-entrance1.html')
|
||||
('e', 'l', '311', '1623-311.html', '2023-ASH-16-entrance2.html')
|
||||
('e', 't', '311', '1623-311.html', '2023-ASH-16-entrance3.jpg')
|
||||
('e', 'l', '311', '1623-311.html', '2023-ASH-16-entrance3.html')
|
||||
('e', 't', '311', '1623-311.html', '2023-ASH-16-entrance2.jpg')
|
||||
('e', 'l', '311', '1623-311.html', '2023-ASH-16-entrance1.html')
|
||||
('e', 't', '311', '1623-311.html', '2023-ASH-16-entrance1.jpg')
|
||||
84
1626-renaming.txt
Normal file
84
1626-renaming.txt
Normal file
@@ -0,0 +1,84 @@
|
||||
---------- 1626 fixing i/l/t folders for these caves and entrances
|
||||
1626-2018-AD-02
|
||||
1626-2018-AD-02 1626-2018-AD-02.html
|
||||
1626-2018-DM-01
|
||||
1626-2018-DM-01 1626-2018-DM-01.html
|
||||
1626-2018-DM-02
|
||||
1626-2018-DM-02 1626-2018-DM-02.html
|
||||
1626-2018-DM-03
|
||||
1626-2018-DM-03 1626-2018-DM-03.html
|
||||
1626-2018-DM-05
|
||||
1626-2018-DM-05 1626-2018-DM-05.html
|
||||
1626-2018-DM-06
|
||||
1626-2018-DM-06 1626-2018-DM-06.html
|
||||
1626-2018-ms-02
|
||||
1626-2018-ms-02 1626-2018-ms-02.html
|
||||
1626-2018-ms-03
|
||||
1626-2018-ms-03 1626-2018-ms-03.html
|
||||
1626-2018-ms-04
|
||||
1626-2018-ms-04 1626-2018-ms-04.html
|
||||
1626-2018-pw-01
|
||||
1626-2018-pw-01 1626-2018-pw-01.html
|
||||
1626-2018-pw-02
|
||||
1626-2018-pw-02 1626-2018-pw-02.html
|
||||
1626-2018-pw-03
|
||||
1626-2018-pw-03 1626-2018-pw-03.html
|
||||
1626-2018-tk-01
|
||||
1626-2018-tk-01 1626-2018-tk-01.html
|
||||
1626-2018-tk-02
|
||||
1626-2018-tk-02 1626-2018-tk-02.html
|
||||
1626-2019-HT-01
|
||||
1626-2019-HT-01 1626-2019-HT-01.html
|
||||
1626-2019-HT-02
|
||||
1626-2019-HT-02 1626-2019-HT-02.html
|
||||
1626-2019-rh-01
|
||||
1626-2019-rh-01 1626-2019-rh-01.html
|
||||
1626-2019-rh-02
|
||||
1626-2019-rh-02 1626-2019-rh-02.html
|
||||
1626-2023-BL-01
|
||||
1626-2023-BL-01 1626-2023-BL-01.html
|
||||
1626-2023-BL-03
|
||||
1626-2023-BL-03 1626-2023-BL-03.html
|
||||
1626-2023-BL-04
|
||||
1626-2023-BL-04a 1626-2023-BL-04a.html
|
||||
1626-2023-BL-04b 1626-2023-BL-04b.html
|
||||
1626-2023-BL-05
|
||||
1626-2023-BL-05 1626-2023-BL-05.html
|
||||
1626-2023-BL-06
|
||||
1626-2023-BL-06 1626-2023-BL-06.html
|
||||
1626-2023-BL-07
|
||||
1626-2023-BL-07 1626-2023-BL-07.html
|
||||
1626-2023-BL-09
|
||||
1626-2023-BL-09 1626-2023-BL-09.html
|
||||
1626-2023-BZ-01
|
||||
1626-2023-BZ-01 1626-2023-BZ-01.html
|
||||
1626-2023-ww-01
|
||||
1626-2023-ww-01 1626-2023-ww-01.html
|
||||
1626-2024-pb-01
|
||||
1626-2024-pb-01 1626-2024-pb-01.html
|
||||
1626-361
|
||||
1626-361 1626-361.html
|
||||
1626-E02
|
||||
1626-E02 1626-E02.html
|
||||
1626-E09
|
||||
1626-E09 1626-E09.html
|
||||
1626-E16
|
||||
1626-E16 1626-E16.html
|
||||
1626-E28
|
||||
1626-E28 1626-E28.html
|
||||
1626-casino-01
|
||||
1626-casino-01 1626-casino-01.html
|
||||
1626-loutoti-01
|
||||
1626-loutoti-01 1626-loutoti-01.html
|
||||
1626-upside-down-01
|
||||
1626-upside-down-01 1626-upside-down-01.html
|
||||
1626-2018-ad-03
|
||||
1626-2018-ad-03 1626-2018-ad-03.html
|
||||
1626-2023-BL-08
|
||||
1626-2023-BL-08 1626-2023-BL-08.html
|
||||
1626-LA11
|
||||
1626-LA11 1626-LA11.html
|
||||
1626-LA34
|
||||
1626-LA34 1626-LA34.html
|
||||
1626-LA12
|
||||
1626-LA12 1626-LA12.html
|
||||
77
Containerfile
Normal file
77
Containerfile
Normal file
@@ -0,0 +1,77 @@
|
||||
|
||||
# create an oci container image with
|
||||
# cd /home/expo && podman build -t expo:dev --rm -f troggle/Containerfile
|
||||
|
||||
#
|
||||
FROM docker.io/library/debian:bookworm
|
||||
|
||||
WORKDIR /home/expo2
|
||||
|
||||
RUN apt update && \
|
||||
apt install -y postgresql apache2 survex rsync git cgit proftpd \
|
||||
python3 python3-django python3-pil python3-piexif \
|
||||
python3-bs4 python3-unidecode python3-cryptography \
|
||||
libjs-codemirror
|
||||
|
||||
# do we need libjs-leaflet? libjs-sizzle? libjs-mgrs?
|
||||
|
||||
# Install non-packaged dependencies
|
||||
# apt install CaveView bins libjs-proj4 ufraw from local repo/backports?
|
||||
# bins - photo processing
|
||||
# ufraw - raw inages in photo collection do we need ufraw-batch? bring sin libtiff5 libgtkimageview0 libexiv2-14 libwebp6
|
||||
# kanboard - kanboard organiser
|
||||
# caveview.js - rotating cave on each page. brings in libjs-proj4 which brings in linjs-mgrs . We should update.
|
||||
# tonymce (html editor)
|
||||
# we also have host and rssh. probably not needed?
|
||||
# Copy only the dependency files first
|
||||
#wget troggle/pyproject.toml troggle/uv.lock
|
||||
#RUN wget troggle/pyproject.toml && uv sync --frozen
|
||||
|
||||
RUN useradd -m expo -G sudo -s /bin/bash
|
||||
|
||||
# Optional:install and configure BoE
|
||||
|
||||
#add apache config, enable modules
|
||||
#configure postgres
|
||||
|
||||
|
||||
#Start up services for apache, proftpd, postgresql, cron?
|
||||
|
||||
#end of system stage
|
||||
|
||||
|
||||
# User files - separate layer?
|
||||
RUN chown expo:expo .
|
||||
USER expo
|
||||
|
||||
RUN mkdir -p repositories/git && cd repositories/git && \
|
||||
git clone http://expo.survex.com/repositories/troggle/.git && \
|
||||
git clone http://expo.survex.com/repositories/expoweb/.git && \
|
||||
git clone http://expo.survex.com/repositories/loser/.git && \
|
||||
git clone http://expo.survex.com/repositories/drawings/.git
|
||||
RUN ln -s repositories/git/troggle troggle && \
|
||||
ln -s repositories/git/troggle expoweb && \
|
||||
ln -s repositories/git/troggle loser && \
|
||||
ln -s repositories/git/troggle drawings
|
||||
|
||||
RUN git config --global user.email "expo@potato.hut"
|
||||
RUN git config --global user.name "expo"
|
||||
RUN git config --global pull.rebase true
|
||||
|
||||
#rsync -az expo.survex.com:expofiles expofiles
|
||||
#demo short version
|
||||
#rsync -az expo.survex.com:expofiles/surveyscans/2018 expofiles/surveyscans/2018
|
||||
#rsync -az expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
|
||||
|
||||
#/bin/sh is missing at this point - why?
|
||||
RUN cd troggle && run databaseReset.py reset INIT
|
||||
|
||||
EXPOSE 8080
|
||||
#Run postres process
|
||||
CMD ["uv", "run", "python", "troggle/manage.py", "runserver", "0.0.0.0:8080"]
|
||||
CMD ["bash"]
|
||||
|
||||
# move this file to the directory above troggle, loser etc before running the podman image build command.
|
||||
|
||||
# used image with:
|
||||
# podman run -it --network=host --rm expo:dev
|
||||
557
ERROR.txt
Normal file
557
ERROR.txt
Normal file
@@ -0,0 +1,557 @@
|
||||
Creating test database for alias 'default' ('file:memorydb_default?mode=memory&cache=shared')...
|
||||
test_fix_cave_bare_url115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_bare_url115)
|
||||
Expect to get Page Not Found and status 404 ... ok
|
||||
test_fix_cave_slug115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_slug115)
|
||||
Expect to get Page Not Found and status 404 ... ok
|
||||
test_fix_cave_url115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url115) ... ERROR
|
||||
test_fix_cave_url284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url284) ... ERROR
|
||||
test_fix_caves284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_caves284) ... ERROR
|
||||
test_fix_expedition (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_expedition) ... ERROR
|
||||
test_fix_person (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_person) ... ok
|
||||
test_fix_personexped (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_personexped) ... ok
|
||||
test_fix_cave_loaded115 (troggle.core.TESTS.test_caves.FixtureTests.test_fix_cave_loaded115) ... ok
|
||||
test_fix_cave_loaded284 (troggle.core.TESTS.test_caves.FixtureTests.test_fix_cave_loaded284) ... ok
|
||||
test_fix_person_loaded (troggle.core.TESTS.test_caves.FixtureTests.test_fix_person_loaded) ... ok
|
||||
test_page_personexpedition (troggle.core.TESTS.test_caves.FixtureTests.test_page_personexpedition) ... ok
|
||||
test_logbook_exists (troggle.core.TESTS.test_imports.ImportTest.test_logbook_exists) ... ok
|
||||
test_installs (troggle.core.TESTS.test_imports.SubprocessTest.test_installs)
|
||||
Expects external software installed: cavern, survexport, git ... ok
|
||||
test_loser_survex_status (troggle.core.TESTS.test_imports.SubprocessTest.test_loser_survex_status)
|
||||
Expects no failures of survex files ... FAIL
|
||||
test_repos_git_status (troggle.core.TESTS.test_imports.SubprocessTest.test_repos_git_status)
|
||||
Expects clean git repos with no added files and no merge failures ... FAIL
|
||||
test_utf8 (troggle.core.TESTS.test_imports.SubprocessTest.test_utf8)
|
||||
Expects that utf8 is the default encoding when opening files ... ok
|
||||
test_admin_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_admin_login) ... ok
|
||||
test_authentication_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_authentication_login) ... ok
|
||||
test_noinfo_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_noinfo_login) ... ok
|
||||
test_ordinary_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_ordinary_login) ... ok
|
||||
test_user_force (troggle.core.TESTS.test_logins.ComplexLoginTests.test_user_force) ... ok
|
||||
test_fix_admin_login_fail (troggle.core.TESTS.test_logins.FixturePageTests.test_fix_admin_login_fail) ... ok
|
||||
test_dwg_upload_drawing (troggle.core.TESTS.test_logins.PostTests.test_dwg_upload_drawing)
|
||||
Expect no-suffix file to upload ... ok
|
||||
test_dwg_upload_txt (troggle.core.TESTS.test_logins.PostTests.test_dwg_upload_txt)
|
||||
Expect .pdf file to be refused upload ... ok
|
||||
test_file_permissions (troggle.core.TESTS.test_logins.PostTests.test_file_permissions)
|
||||
Expect to be allowed to write to SCANS_ROOT, DRAWINGS_DATA, SURVEX_DATA, EXPOWEB ... ok
|
||||
test_photo_folder_create (troggle.core.TESTS.test_logins.PostTests.test_photo_folder_create)
|
||||
Create folder for new user ... ERROR
|
||||
test_photo_upload (troggle.core.TESTS.test_logins.PostTests.test_photo_upload)
|
||||
Expect photo upload to work on any file (contrary to msg on screen) ... ERROR
|
||||
test_photo_upload_rename (troggle.core.TESTS.test_logins.PostTests.test_photo_upload_rename)
|
||||
Expect photo upload to work on any file (contrary to msg on screen) ... ERROR
|
||||
test_scan_upload (troggle.core.TESTS.test_logins.PostTests.test_scan_upload)
|
||||
Expect scan upload to wallet to work on any file ... ok
|
||||
test_aliases (troggle.core.TESTS.test_parsers.ImportTest.test_aliases) ... ok
|
||||
test_lbe (troggle.core.TESTS.test_parsers.ImportTest.test_lbe) ... ok
|
||||
test_lbe_edit (troggle.core.TESTS.test_parsers.ImportTest.test_lbe_edit)
|
||||
This page requires the user to be logged in first, hence the extra shenanigans ... ok
|
||||
test_lbe_new (troggle.core.TESTS.test_parsers.ImportTest.test_lbe_new)
|
||||
This page requires the user to be logged in first, hence the extra shenanigans ... ERROR
|
||||
test_logbook_exists (troggle.core.TESTS.test_parsers.ImportTest.test_logbook_exists) ... ok
|
||||
test_logbook_parse_issues (troggle.core.TESTS.test_parsers.ImportTest.test_logbook_parse_issues)
|
||||
This is just testing the db not the web page ... ok
|
||||
test_people (troggle.core.TESTS.test_parsers.ImportTest.test_people) ... ok
|
||||
test_survexfiles (troggle.core.TESTS.test_parsers.ImportTest.test_survexfiles) ... ERROR
|
||||
test_statistics (troggle.core.TESTS.test_urls.URLTests.test_statistics) ... ok
|
||||
test_stats (troggle.core.TESTS.test_urls.URLTests.test_stats) ... ok
|
||||
test_url_allscans (troggle.core.TESTS.test_urls.URLTests.test_url_allscans)
|
||||
Test the {% url "allscans" %} reverse resolution ... ok
|
||||
test_url_stats (troggle.core.TESTS.test_urls.URLTests.test_url_stats)
|
||||
Test the {% url "stats" %} reverse resolution ... ok
|
||||
test_url_survexcaveslist (troggle.core.TESTS.test_urls.URLTests.test_url_survexcaveslist)
|
||||
Test the {% url "allscans" %} reverse resolution ... ok
|
||||
test_url_threed (troggle.core.TESTS.test_urls.URLTests.test_url_threed)
|
||||
Test the {% url "threed" %} reverse resolution ... ok
|
||||
test_cave_kataster_not_found (troggle.core.TESTS.tests.PageTests.test_cave_kataster_not_found) ... ok
|
||||
test_caves_page (troggle.core.TESTS.tests.PageTests.test_caves_page) ... ok
|
||||
test_caves_page_kataster_not_found (troggle.core.TESTS.tests.PageTests.test_caves_page_kataster_not_found) ... ok
|
||||
test_dataissues (troggle.core.TESTS.tests.PageTests.test_dataissues) ... ok
|
||||
test_expoweb_dir (troggle.core.TESTS.tests.PageTests.test_expoweb_dir) ... ok
|
||||
test_expoweb_dir_no_index (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_no_index) ... ok
|
||||
test_expoweb_dir_with_index2 (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_with_index2) ... ok
|
||||
test_expoweb_dir_with_index_htm (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_with_index_htm) ... ok
|
||||
test_expoweb_dir_with_index_html (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_with_index_html) ... ok
|
||||
test_expoweb_dirslash (troggle.core.TESTS.tests.PageTests.test_expoweb_dirslash) ... ok
|
||||
test_expoweb_htm (troggle.core.TESTS.tests.PageTests.test_expoweb_htm) ... ok
|
||||
test_expoweb_no_dir (troggle.core.TESTS.tests.PageTests.test_expoweb_no_dir) ... ok
|
||||
test_expoweb_notfound (troggle.core.TESTS.tests.PageTests.test_expoweb_notfound) ... ok
|
||||
test_expoweb_paths (troggle.core.TESTS.tests.PageTests.test_expoweb_paths) ... ok
|
||||
test_expoweb_root (troggle.core.TESTS.tests.PageTests.test_expoweb_root) ... ok
|
||||
test_expoweb_root_slash (troggle.core.TESTS.tests.PageTests.test_expoweb_root_slash) ... ok
|
||||
test_expoweb_troggle_default (troggle.core.TESTS.tests.PageTests.test_expoweb_troggle_default) ... ok
|
||||
test_expoweb_troggle_default_slash (troggle.core.TESTS.tests.PageTests.test_expoweb_troggle_default_slash) ... ok
|
||||
test_expoweb_via_areaid (troggle.core.TESTS.tests.PageTests.test_expoweb_via_areaid) ... ok
|
||||
test_not_found_survexfile_cave (troggle.core.TESTS.tests.PageTests.test_not_found_survexfile_cave) ... ok
|
||||
test_page_admin (troggle.core.TESTS.tests.PageTests.test_page_admin) ... ok
|
||||
test_page_admindocs_exped (troggle.core.TESTS.tests.PageTests.test_page_admindocs_exped) ... ok
|
||||
test_page_dwgallfiles_empty (troggle.core.TESTS.tests.PageTests.test_page_dwgallfiles_empty) ... ok
|
||||
test_page_dwgallfiles_empty_slash (troggle.core.TESTS.tests.PageTests.test_page_dwgallfiles_empty_slash) ... ok
|
||||
test_page_dwgdataraw_empty (troggle.core.TESTS.tests.PageTests.test_page_dwgdataraw_empty) ... ok
|
||||
test_page_expofile_document_loeffler_pdf (troggle.core.TESTS.tests.PageTests.test_page_expofile_document_loeffler_pdf) ... ok
|
||||
test_page_expofile_document_png (troggle.core.TESTS.tests.PageTests.test_page_expofile_document_png) ... ok
|
||||
test_page_expofile_document_rope_pdf (troggle.core.TESTS.tests.PageTests.test_page_expofile_document_rope_pdf) ... ok
|
||||
test_page_expofile_documents (troggle.core.TESTS.tests.PageTests.test_page_expofile_documents) ... ok
|
||||
test_page_expofile_documents_slash (troggle.core.TESTS.tests.PageTests.test_page_expofile_documents_slash) ... ok
|
||||
test_page_expofile_writeup (troggle.core.TESTS.tests.PageTests.test_page_expofile_writeup) ... ok
|
||||
test_page_expofiles_badness (troggle.core.TESTS.tests.PageTests.test_page_expofiles_badness) ... ok
|
||||
test_page_expofiles_docs_dir (troggle.core.TESTS.tests.PageTests.test_page_expofiles_docs_dir) ... ok
|
||||
test_page_expofiles_root_dir (troggle.core.TESTS.tests.PageTests.test_page_expofiles_root_dir) ... ok
|
||||
test_page_expofiles_root_slash_dir (troggle.core.TESTS.tests.PageTests.test_page_expofiles_root_slash_dir) ... ok
|
||||
test_page_folk (troggle.core.TESTS.tests.PageTests.test_page_folk) ... ok
|
||||
test_page_photos_dir (troggle.core.TESTS.tests.PageTests.test_page_photos_dir) ... ok
|
||||
test_page_photos_not_ok (troggle.core.TESTS.tests.PageTests.test_page_photos_not_ok) ... ok
|
||||
test_page_photos_ok (troggle.core.TESTS.tests.PageTests.test_page_photos_ok) ... ok
|
||||
test_page_site_media_css (troggle.core.TESTS.tests.PageTests.test_page_site_media_css) ... ok
|
||||
test_page_site_media_ok (troggle.core.TESTS.tests.PageTests.test_page_site_media_ok) ... ok
|
||||
test_page_slash_empty (troggle.core.TESTS.tests.PageTests.test_page_slash_empty) ... ok
|
||||
test_page_ss (troggle.core.TESTS.tests.PageTests.test_page_ss) ... ok
|
||||
test_page_survey_scans_dir (troggle.core.TESTS.tests.PageTests.test_page_survey_scans_dir) ... ok
|
||||
test_page_survey_scans_empty (troggle.core.TESTS.tests.PageTests.test_page_survey_scans_empty) ... ok
|
||||
test_stations (troggle.core.TESTS.tests.PageTests.test_stations) ... ok
|
||||
test_survexdebug (troggle.core.TESTS.tests.PageTests.test_survexdebug) ... ok
|
||||
test_surveximport (troggle.core.TESTS.tests.PageTests.test_surveximport) ... ok
|
||||
test_therionissues (troggle.core.TESTS.tests.PageTests.test_therionissues) ... ok
|
||||
test_allscans_view (troggle.core.TESTS.tests_copilot.TestSurveyScansView.test_allscans_view) ... ok
|
||||
test_walletslistyear_view (troggle.core.TESTS.tests_copilot.TestSurveyScansView.test_walletslistyear_view) ... ok
|
||||
test_import_Cave (troggle.core.TESTS.test_imports.SimpleTest.test_import_Cave) ... ok
|
||||
test_import_TroggleModel (troggle.core.TESTS.test_imports.SimpleTest.test_import_TroggleModel) ... ok
|
||||
test_import_core_views_caves (troggle.core.TESTS.test_imports.SimpleTest.test_import_core_views_caves) ... ok
|
||||
test_import_imports (troggle.core.TESTS.test_imports.SimpleTest.test_import_imports) ... ok
|
||||
test_import_parsers_QMs (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_QMs) ... ok
|
||||
test_import_parsers_logbooks (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_logbooks) ... ok
|
||||
test_import_parsers_mix (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_mix) ... ok
|
||||
test_import_parsers_people (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_people) ... ok
|
||||
test_import_parsers_survex (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_survex) ... ok
|
||||
test_import_parsers_surveys (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_surveys) ... ok
|
||||
test_import_urls (troggle.core.TESTS.test_imports.SimpleTest.test_import_urls) ... ok
|
||||
test_import_views_uploads (troggle.core.TESTS.test_imports.SimpleTest.test_import_views_uploads) ... ok
|
||||
test_import_views_walletedit (troggle.core.TESTS.test_imports.SimpleTest.test_import_views_walletedit) ... ok
|
||||
test_test_setting (troggle.core.TESTS.test_imports.SimpleTest.test_test_setting) ... ok
|
||||
|
||||
======================================================================
|
||||
ERROR: test_fix_cave_url115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url115)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_caves.py", line 140, in test_fix_cave_url115
|
||||
response = self.client.get("/1623/115.url") # yes this is intentional, see the inserted data above & fixture
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
|
||||
response = super().get(path, data=data, secure=secure, headers=headers, **extra)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/caves.py", line 353, in cavepage
|
||||
return rendercave(request, cave, cave.slug())
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/caves.py", line 301, in rendercave
|
||||
"year": current_expo()
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_fix_cave_url284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url284)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_caves.py", line 148, in test_fix_cave_url284
|
||||
response = self.client.get("/1623/284/284.html")
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
|
||||
response = super().get(path, data=data, secure=secure, headers=headers, **extra)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/caves.py", line 353, in cavepage
|
||||
return rendercave(request, cave, cave.slug())
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/caves.py", line 301, in rendercave
|
||||
"year": current_expo()
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_fix_caves284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_caves284)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_caves.py", line 190, in test_fix_caves284
|
||||
response = self.client.get("/caves")
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
|
||||
response = super().get(path, data=data, secure=secure, headers=headers, **extra)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/caves.py", line 156, in caveindex
|
||||
"cavepage": True, "year": current_expo()},
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_fix_expedition (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_expedition)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_caves.py", line 103, in test_fix_expedition
|
||||
response = self.client.get("/expedition/2019")
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
|
||||
response = super().get(path, data=data, secure=secure, headers=headers, **extra)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/logbooks.py", line 69, in expedition
|
||||
current = current_expo() # creates new expo after 31st Dec.
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_photo_folder_create (troggle.core.TESTS.test_logins.PostTests.test_photo_folder_create)
|
||||
Create folder for new user
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_logins.py", line 259, in test_photo_folder_create
|
||||
response = self.client.post("/photoupload/", data={"photographer": "GussieFinkNottle"})
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1070, in post
|
||||
response = super().post(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 490, in post
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
|
||||
return self.f(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
|
||||
return view_func(request, *args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/uploads.py", line 611, in photoupload
|
||||
year = current_expo()
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_photo_upload (troggle.core.TESTS.test_logins.PostTests.test_photo_upload)
|
||||
Expect photo upload to work on any file (contrary to msg on screen)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_logins.py", line 189, in test_photo_upload
|
||||
response = self.client.post(
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1070, in post
|
||||
response = super().post(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 490, in post
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
|
||||
return self.f(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
|
||||
return view_func(request, *args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/uploads.py", line 611, in photoupload
|
||||
year = current_expo()
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_photo_upload_rename (troggle.core.TESTS.test_logins.PostTests.test_photo_upload_rename)
|
||||
Expect photo upload to work on any file (contrary to msg on screen)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_logins.py", line 228, in test_photo_upload_rename
|
||||
response = self.client.post(
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1070, in post
|
||||
response = super().post(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 490, in post
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
|
||||
return self.f(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
|
||||
return view_func(request, *args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/uploads.py", line 611, in photoupload
|
||||
year = current_expo()
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_lbe_new (troggle.core.TESTS.test_parsers.ImportTest.test_lbe_new)
|
||||
This page requires the user to be logged in first, hence the extra shenanigans
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_parsers.py", line 141, in test_lbe_new
|
||||
response = self.client.get(f"/logbookedit/")
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
|
||||
response = super().get(path, data=data, secure=secure, headers=headers, **extra)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
|
||||
return self.f(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
|
||||
return view_func(request, *args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/uploads.py", line 192, in logbookedit
|
||||
year = current_expo()
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
ERROR: test_survexfiles (troggle.core.TESTS.test_parsers.ImportTest.test_survexfiles)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_parsers.py", line 195, in test_survexfiles
|
||||
response = self.client.get("/survexfile/caves/")
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
|
||||
response = super().get(path, data=data, secure=secure, headers=headers, **extra)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
|
||||
return self.generic(
|
||||
^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
|
||||
return self.request(**r)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
|
||||
self.check_exception(response)
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
|
||||
raise exc_value
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
|
||||
response = get_response(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
|
||||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/views/survex.py", line 655, in survexcaveslist
|
||||
"year": current_expo(),
|
||||
^^^^^^^^^^^^^^
|
||||
File "/home/philip/troggle/core/utils.py", line 126, in current_expo
|
||||
make_new_expo(str(y))
|
||||
File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
|
||||
u = User.objects.get(username='expo')
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
|
||||
return getattr(self.get_queryset(), name)(*args, **kwargs)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
|
||||
raise self.model.DoesNotExist(
|
||||
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
|
||||
|
||||
======================================================================
|
||||
FAIL: test_loser_survex_status (troggle.core.TESTS.test_imports.SubprocessTest.test_loser_survex_status)
|
||||
Expects no failures of survex files
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_imports.py", line 261, in test_loser_survex_status
|
||||
self.assertTrue(sp.returncode == 0, f"{cwd} - survex is unhappy")
|
||||
AssertionError: False is not true : /home/philip/loser - survex is unhappy
|
||||
|
||||
======================================================================
|
||||
FAIL: test_repos_git_status (troggle.core.TESTS.test_imports.SubprocessTest.test_repos_git_status)
|
||||
Expects clean git repos with no added files and no merge failures
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/philip/troggle/core/TESTS/test_imports.py", line 233, in test_repos_git_status
|
||||
self.assertIsNotNone(phmatch, msg)
|
||||
AssertionError: unexpectedly None : /home/philip/troggle - Failed to find expected git output: "nothing to commit, working tree clean"
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 109 tests in 13.383s
|
||||
|
||||
FAILED (failures=2, errors=9)
|
||||
Destroying test database for alias 'default' ('file:memorydb_default?mode=memory&cache=shared')...
|
||||
221
README.txt
221
README.txt
@@ -1,48 +1,217 @@
|
||||
Troggle is an application for caving expedition data management, originally created for use on Cambridge University Caving Club (CUCC)expeditions and licensed under the GNU Lesser General Public License.
|
||||
Updated 2 May 2023
|
||||
|
||||
Troggle has been forked into two projects. The original one is maintained by Aron Curtis and is used for Erebus caves. The CUCC variant uses files as the definitive data, not the database and lives at expo.survex.com/troggle.
|
||||
Troggle is an application for caving expedition data management,
|
||||
originally created for use on Cambridge University Caving Club (CUCC)expeditions
|
||||
and licensed under the GNU Lesser General Public License.
|
||||
|
||||
Troggle has been forked into two projects. The original one is maintained by Aaron Curtis
|
||||
and was used for Erebus caves in Antarctica.
|
||||
The CUCC variant uses files as the definitive data, not the database, and lives at http://expo.survex.com/repositories/troggle/.git/
|
||||
|
||||
The versions have diverged markedly, not just in the software but also in the implicit convnetions of how the directory structures of the survex files, the drawings and
|
||||
the scans are arranged.
|
||||
|
||||
For the server setup, see /_deploy/debian/wookey-exposerver-recipe.txt
|
||||
and see http://expo.survex.com/handbook/troggle/serverconfig.html
|
||||
|
||||
Much material which was in this file has been moved to
|
||||
http://expo.survex.com/handbook/troggle/serverconfig.html
|
||||
|
||||
See copyright notices in
|
||||
http://expo.survex.com/handbook/computing/contribute.html
|
||||
and for context see
|
||||
http://expo.survex.com/handbook/computing/onlinesystems.html
|
||||
|
||||
Troggle setup
|
||||
==========
|
||||
=============
|
||||
0. read the very extensive online documentation and stop reading this README...
|
||||
well, come back to this README after you have read the HTML pages. Not everything has been transferred.
|
||||
|
||||
Python, Django, and Database setup
|
||||
http://expo.survex.com/handbook/troggle/troglaptop.html
|
||||
http://expo.survex.com/handbook/troggle/serverconfig.html
|
||||
http://expo.survex.com/handbook/troggle/trogdangoup.html
|
||||
and at troggle/debian/serversetup
|
||||
1. set up the ssh key-exchange with the git server so you can clone troggle
|
||||
http://expo.survex.com/handbook/computing/keyexchange.html
|
||||
|
||||
Setting up directories
|
||||
----------------------
|
||||
see http://expo.survex.com/handbook/troggle/troglaptop.html and
|
||||
http://expo.survex.com/handbook/troggle/serverconfig.html
|
||||
|
||||
Next, you need to fill in your local settings. Copy _deploy/WSL/localsettingsWSL.py
|
||||
to a new file called localsettings.py and edit it and settings.py to match
|
||||
your machine's file locations.
|
||||
Follow the instructions contained in the file to fill out your settings.
|
||||
|
||||
{ in _deploy/old/ we have these which are all very out of date:
|
||||
localsettings-expo-live.py is the python2.7 settings for the server.
|
||||
localsettingsubuntu.py
|
||||
localsettingsdocker.py
|
||||
localsettingswindows.py
|
||||
localsettingspotatohut.py
|
||||
}
|
||||
|
||||
Python3, Django, and Database setup
|
||||
-----------------------------------
|
||||
Troggle requires Django 1.4 or greater, and any version of Python that works with it.
|
||||
Install Django with the following command:
|
||||
We are now using Django 3.2 and will move to 4.2 in 2024
|
||||
We are installing with python 3.11 (the server is running 3.9)
|
||||
|
||||
apt-get install python-django (on debian/ubuntu)
|
||||
Install Django using pip, not with apt, on your test system in a venv.
|
||||
Conventionally on our main master expo server we install everything that we can as debian packages, not using pip.
|
||||
|
||||
If you want to use MySQL or Postgresql, download and install them. However, you can also use Django with Sqlite3, which is included in Python and thus requires no extra installation.
|
||||
[installation instructions removed - now in http://expo.survex.com/handbook/troggle/troglaptop.html ]
|
||||
|
||||
[venv description removed - read it in http://expo.survex.com/handbook/troggle/troglaptop.html ]
|
||||
|
||||
READ the os-trog.sh script !
|
||||
READ the venv-trog.sh script !
|
||||
|
||||
|
||||
Automatic Provisioning and Configuration
|
||||
----------------------------------------
|
||||
We don't do this - yet.
|
||||
|
||||
Troggle itself
|
||||
-------------
|
||||
Choose a directory where you will keep troggle, and git clone Troggle into it using the following command:
|
||||
The most appropriate configuration tools today (2021) appear to be Bolt or Ansible
|
||||
https://puppet.com/docs/bolt/latest/bolt.html (declarative, local)
|
||||
https://docs.ansible.com/ansible/latest/user_guide/intro_getting_started.html (procedural, remote)
|
||||
https://puppet.com/blog/automating-from-zero-to-something/
|
||||
|
||||
git clone git://expo.survex.com/troggle
|
||||
or more reliably
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
We don't need anything for the deploy server itself, but we could do with something for setting
|
||||
up test servers quickly to help get newbie developers up to speed faster. But learning a new tool
|
||||
creates a barrier in itself. This is one reason most of us don't use Docker.
|
||||
|
||||
CSS and media files
|
||||
-------------------
|
||||
We are not using the STATICFILES capability.
|
||||
We are serving css files from troggle/media/.. (see urls.py)
|
||||
|
||||
Plain CSS pages
|
||||
---------------
|
||||
When running the test server
|
||||
manage.py runserver 0.0.0.0:8000
|
||||
and without Apache running, we are serving CSS using using this Django 'view':
|
||||
view_surveys.cssfilessingle
|
||||
i.e.
|
||||
cssfilessingle() in core/view_surveys.py
|
||||
|
||||
Setting up survex
|
||||
-----------------
|
||||
You need to have survex installed as the command line tools 'cavern' is
|
||||
used as part of the survex import process.
|
||||
$ sudo apt install survex
|
||||
|
||||
Setting up tables and importing survey data
|
||||
-------------------------------------------
|
||||
Run
|
||||
$ sudo python databaseReset.py
|
||||
from the troggle directory will give you instructions.
|
||||
|
||||
[ NB Adding a new year/expedition requires adding a column to the
|
||||
folk/folk.csv table - a year doesn't exist until that is done.]
|
||||
|
||||
|
||||
If you want to work on the source code and be able to commit, your account will need to be added to the troggle project members list. Contact wookey at wookware dot org to get this set up.
|
||||
MariaDB database
|
||||
----------------
|
||||
Start it up with
|
||||
$ sudo mysql -u -p
|
||||
when it will prompt you to type in the password. Get this by reading the settings.py file in use on the server.
|
||||
then
|
||||
> CREATE DATABASE troggle;
|
||||
> use troggle;
|
||||
> exit;
|
||||
|
||||
Next, you need to fill in your local settings. Copy either localsettingsubuntu.py or localsettingsserver.py to a new file called localsettings.py. Follow the instructions contained in the file to fill out your settings.
|
||||
Note the semicolons.
|
||||
|
||||
You can check the status of the db service:
|
||||
$ sudo systemctl status mysql
|
||||
|
||||
You can start and stop the db service with
|
||||
$ sudo systemctl restart mysql.service
|
||||
$ sudo systemctl stop mysql.service
|
||||
$ sudo systemctl start mysql.service
|
||||
|
||||
While logged in at a terminal session as expo on expo.survex.,com
|
||||
|
||||
$ mysql -h localhost -u expo -p<password>
|
||||
will get you the MariasDb command prompt: https://www.hostwinds.com/guide/how-to-use-mysql-mariadb-from-command-line/
|
||||
|
||||
then (Note the SEMICOLONS !):
|
||||
>drop database troggle;
|
||||
>create database troggle;
|
||||
>quit
|
||||
Somewhere I have notes for the GRANT PRIVS type runes...
|
||||
|
||||
Ah yes:
|
||||
CREATE DATABASE troggle;
|
||||
GRANT ALL PRIVILEGES ON troggle.* TO 'expo'@'localhost' IDENTIFIED BY 'somepassword'; FLUSH PRIVILEGES; (at mysql root prompt)
|
||||
|
||||
(explained on https://chartio.com/resources/tutorials/how-to-grant-all-privileges-on-a-database-in-mysql/)
|
||||
(but you need to create the database too)
|
||||
|
||||
The GRANT ALL PRIVILEGES bit requires you to logon in to MariaDB as root. sudo doesn't cut it.
|
||||
these permissions are set in a different 'info' database which usually is untouched even if database troggle gets creamed.
|
||||
|
||||
The 'somepassword' is specified int he localsettings.py file.
|
||||
|
||||
|
||||
Setting up tables and importing legacy data
|
||||
------------------------------------------
|
||||
Run "python databaseReset.py reset" from the troggle directory.
|
||||
PERMISSIONS
|
||||
https://linuxize.com/post/usermod-command-in-linux/
|
||||
|
||||
Once troggle is running, you can also log in and then go to "Import / export" data under "admin" on the menu.
|
||||
THIS MAY BE OUT OF DATE - from 2022 we are running Apache as user 'expo' not 'www-data'
|
||||
|
||||
Adding a new year/expedition requires adding a column to the
|
||||
folk/folk.csv table - a year doesn't exist until that is done.
|
||||
so that the online editing system for SVX files works.
|
||||
The same goes for /expoweb/ files, so that "edit this page" works and the New Cave
|
||||
and New Entrance forms work.
|
||||
|
||||
sudo usermod -a expo expocvs
|
||||
the expocvs group is used for git
|
||||
|
||||
all the users should be in this group
|
||||
|
||||
|
||||
Running a Troggle server
|
||||
------------------------
|
||||
For high volume use, Troggle should be run using a web server like apache. However, a quick way to get started is to use the development server built into Django.
|
||||
Running a Troggle server with Apache
|
||||
------------------------------------
|
||||
Troggle also needs these aliases to be configured. These are set in
|
||||
/home/expo/config/apache/expo.conf
|
||||
on the expo server.
|
||||
|
||||
To do this, run "python manage.py runserver" from the troggle directory.
|
||||
At least these need setting:
|
||||
DocumentRoot /home/expo/expoweb
|
||||
WSGIScriptAlias / /home/expo/troggle/wsgi.py
|
||||
<Directory /home/expo/troggle>
|
||||
<Files wsgi.py>
|
||||
Require all granted
|
||||
</Files>
|
||||
</Directory>
|
||||
|
||||
the instructions for apache Alias commands are in comments at the end of
|
||||
the urls.py file.
|
||||
|
||||
Unlike the django "manage.py runserver" method, apache requires a restart before it will use
|
||||
any changed files:
|
||||
|
||||
sudo service apache2 restart
|
||||
|
||||
Olly's comments 20 July 2020:
|
||||
olly: looking at /lib/systemd/system/apache2.service suggests so
|
||||
|
||||
olly: ExecStart=/usr/sbin/apachectl start
|
||||
olly: ExecStop=/usr/sbin/apachectl stop
|
||||
olly: ExecReload=/usr/sbin/apachectl graceful
|
||||
|
||||
Additions
|
||||
---------
|
||||
The python code has been manually cleaned using the 'black' and 'ruff' lint tools,
|
||||
and the 'deptry' dependency checker. This needs doing every year or so.
|
||||
See dependencies-check-deptry.txt
|
||||
|
||||
See troggle/pyproject.toml for configurations
|
||||
|
||||
Experimental additions
|
||||
----------------------
|
||||
These are untried tools which may help us document how troggle works in future.
|
||||
|
||||
pip install pygraphviz
|
||||
pip install pyparsing pydot # installs fine
|
||||
django extension graph_models # https://django-extensions.readthedocs.io/en/latest/graph_models.html
|
||||
27
README/index.html
Normal file
27
README/index.html
Normal file
@@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Troggle - Coding Documentation</title>
|
||||
<link rel="stylesheet" type="text/css" href="..media/css/main2.css" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Troggle Code - README</h1>
|
||||
<h2>Contents of README.txt file</h2>
|
||||
|
||||
<iframe name="erriframe" width="70%" height="500"
|
||||
src="../README.txt" frameborder="1" ></iframe>
|
||||
|
||||
<h2>Troggle documentation in the Expo Handbook</h2>
|
||||
<ul>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogintro.html">Intro</a>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogindex.html">Troggle manual INDEX</a>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogarch.html">Troggle data model</a>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogimport.html">Troggle importing data</a>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogdesign.html">Troggle design decisions</a>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogdesignx.html">Troggle future architectures</a>
|
||||
<li><a href="http://expo.survex.com/handbook/troggle/trogsimpler.html">a kinder simpler Troggle?</a>
|
||||
|
||||
</ul>
|
||||
<hr />
|
||||
</body></html>
|
||||
BIN
README/troggle2020.docx
Normal file
BIN
README/troggle2020.docx
Normal file
Binary file not shown.
BIN
README/troggle2020.odt
Normal file
BIN
README/troggle2020.odt
Normal file
Binary file not shown.
BIN
README/troggle2020.pdf
Normal file
BIN
README/troggle2020.pdf
Normal file
Binary file not shown.
344
_cave_caves284.html
Normal file
344
_cave_caves284.html
Normal file
@@ -0,0 +1,344 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- cavebase.html - this text visible because this template has been included -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<script>document.interestCohort = null;</script> <!-- Turn off Google FLoC -->
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>
|
||||
</title>
|
||||
<link rel="stylesheet" type="text/css" href="/css/main2.css" />
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
|
||||
<!-- the year now as used in header text -->
|
||||
<br />
|
||||
<style>
|
||||
.toolbarlinks
|
||||
{
|
||||
padding:5px;
|
||||
background-color:#9ff;
|
||||
text-align:center;
|
||||
font-weight:bold;
|
||||
|
||||
|
||||
}
|
||||
.toolbarlinkslocal
|
||||
{
|
||||
padding:5px;
|
||||
background-color:#f9f;
|
||||
text-align:center;
|
||||
font-weight:bold;
|
||||
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="toolbarlinkslocal">
|
||||
|
||||
<a href="/logbookedit/">Logbook Entry</a> |
|
||||
<a id="cavesLink" href="/caves_recent">Caves</a> |
|
||||
<a id="qmsLink" href="/cave/qms/1623-290">QMs</a> |
|
||||
<a href="/survexfile">Survex</a> |
|
||||
<a href="/survexfile/caves">All Survex</a> |
|
||||
<a href="/survey_scans">Scans</a> |
|
||||
<a href="/walletedit">Upload Scans</a> |
|
||||
<a href="/dwgfiles">Drawings</a> |
|
||||
<a href="/dwgupload">Upload Drawings</a> |
|
||||
<a href="/photoupload">Upload Photos</a> |
|
||||
<a href="/gpxupload">Upload GPX</a> |
|
||||
|
||||
<br>
|
||||
|
||||
<a href="/dataissues">Data Issues</a> |
|
||||
|
||||
<a id="entsLink" href="/entrances">Entrances</a> |
|
||||
<a id="entsLink" href="/stations">Stations</a> |
|
||||
<a id="folklink" href="/folk">expoers</a> |
|
||||
<a id="caversLink" href="/people">survey lengths</a> |
|
||||
<a href="/stats">statistics</a> |
|
||||
|
||||
<a href="/wallets/year/2025">Wallets(2025)</a> |
|
||||
<a href="/logreport/2025">Logbook(2025)</a> |
|
||||
<a href="/expedition/2025">Expo(2025)</a> |
|
||||
<a href="/controlpanel">Control panel</a>
|
||||
|
||||
</div>
|
||||
<p>
|
||||
|
||||
|
||||
<h1>Cave Index</h1>
|
||||
<h3>Notable caves</h3>
|
||||
<ul>
|
||||
|
||||
<li> 1623 <a href="/None">
|
||||
|
||||
290 <em></em></a>
|
||||
|
||||
|
||||
|
||||
<li> 1623 <a href="/None">
|
||||
|
||||
264 <em></em></a>
|
||||
|
||||
|
||||
|
||||
<li> 1623 <a href="/None">
|
||||
|
||||
161 <em></em></a>
|
||||
|
||||
|
||||
|
||||
<li> 1623 <a href="/None">
|
||||
|
||||
204 <em></em></a>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
|
||||
Red star <span style="color: red">✱</span> against a name indicates that no survex file is explicitly associated with the cave<br />
|
||||
Blue star <span style="color: blue">✱</span> against a name indicates that no survex file is explicitly associated with the cave but it is marked as 'fully explored'<br />
|
||||
Blue triangle <span style="color: #43C6DB">▼</span> against a name indicates that the cave is 'pending' creation properly.<br />
|
||||
Orange triangle <span style="color: orange">▲</span> against a name indicates that the cave has no Entrance (and is not 'pending').<br />
|
||||
Black triangle <span style="color: black">▲</span> against a name indicates that the cave has an Entrance, but no entrances have valid located survey stations.<br />
|
||||
Red triangle <span style="color: red">▼</span> against a name indicates that the cave has unticked QMs<br />
|
||||
<span style="color:mediumvioletred">Cavename in this colour</span> means that the cave is undescended/unexplored.
|
||||
|
||||
<p>See <em><a href="/caves_undropped">Undropped Caves</a></em> for all unexplored caves<br />
|
||||
See <em> <a href="/enttags">Lost Caves</a></em> for caves we have mislaid.<br />
|
||||
See <em> <a href="/caves_recent">Recent Caves</a></em> for a shorter list of recent caves.
|
||||
|
||||
<p style="text-align:right">
|
||||
<a href="/newcave/">New Cave</a><br>
|
||||
<a href="/noinfo/cave-number-index">Cave Number Index - kept updated</a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<h3>This year's caves</h3>
|
||||
<div style="column-count: 3;">
|
||||
<table class="searchable">
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<h3>1623</h3>
|
||||
<div style="column-count: 3;">
|
||||
<table class="searchable">
|
||||
|
||||
<a href="/1623/115.url">
|
||||
|
||||
<span style="color:mediumvioletred" title="The cave is marked as unexplored/undescended">
|
||||
|
||||
|
||||
115 <em>Schnellzughöhle</em></a>
|
||||
|
||||
(40m)
|
||||
|
||||
|
||||
|
||||
<span title="the cave has no Entrance (and is not 'pending')" style="color: orange">▲</span>
|
||||
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
<br />
|
||||
|
||||
|
||||
<a href="/None">
|
||||
|
||||
<span style="color:mediumvioletred" title="The cave is marked as unexplored/undescended">
|
||||
|
||||
|
||||
161 <em></em></a>
|
||||
|
||||
|
||||
<span title="the cave is 'pending' creation properly" style="color: #43C6DB">▼</span>
|
||||
|
||||
|
||||
|
||||
<span title="no survex file is explicitly associated with the cave" style="color: red">✱</span>
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
<br />
|
||||
|
||||
|
||||
<a href="/None">
|
||||
|
||||
<span style="color:mediumvioletred" title="The cave is marked as unexplored/undescended">
|
||||
|
||||
|
||||
204 <em></em></a>
|
||||
|
||||
|
||||
<span title="the cave is 'pending' creation properly" style="color: #43C6DB">▼</span>
|
||||
|
||||
|
||||
|
||||
<span title="no survex file is explicitly associated with the cave" style="color: red">✱</span>
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
<br />
|
||||
|
||||
|
||||
<a href="/None">
|
||||
|
||||
<span style="color:mediumvioletred" title="The cave is marked as unexplored/undescended">
|
||||
|
||||
|
||||
264 <em></em></a>
|
||||
|
||||
|
||||
<span title="the cave is 'pending' creation properly" style="color: #43C6DB">▼</span>
|
||||
|
||||
|
||||
|
||||
<span title="no survex file is explicitly associated with the cave" style="color: red">✱</span>
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
<br />
|
||||
|
||||
|
||||
<a href="/1623/284/284.html">
|
||||
|
||||
<span style="color:mediumvioletred" title="The cave is marked as unexplored/undescended">
|
||||
|
||||
|
||||
284 <em>Seetrichter (Lake bottom)</em></a>
|
||||
|
||||
|
||||
|
||||
<span title="the cave has no Entrance (and is not 'pending')" style="color: orange">▲</span>
|
||||
|
||||
|
||||
|
||||
|
||||
<span title="no survex file is explicitly associated with the cave" style="color: red">✱</span>
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
<br />
|
||||
|
||||
|
||||
<a href="/None">
|
||||
|
||||
<span style="color:mediumvioletred" title="The cave is marked as unexplored/undescended">
|
||||
|
||||
|
||||
290 <em></em></a>
|
||||
|
||||
|
||||
<span title="the cave is 'pending' creation properly" style="color: #43C6DB">▼</span>
|
||||
|
||||
|
||||
|
||||
<span title="no survex file is explicitly associated with the cave" style="color: red">✱</span>
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
<br />
|
||||
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p style="text-align:right">
|
||||
<a href="/newcave/">New Cave</a><br>
|
||||
<a href="/noinfo/cave-number-index">Cave Number Index - kept updated</a>
|
||||
</p>
|
||||
|
||||
<h3>1626</h3>
|
||||
<div style="column-count: 3;">
|
||||
<table class="searchable">
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p style="text-align:right">
|
||||
<a href="/newcave/">New Cave</a><br>
|
||||
<a href="/noinfo/cave-number-index">Cave Number Index - kept updated</a>
|
||||
</p>
|
||||
|
||||
|
||||
<h3>1627</h3>
|
||||
<div style="column-count: 3;">
|
||||
<table class="searchable">
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p style="text-align:right">
|
||||
<a href="/newcave/">New Cave</a><br>
|
||||
<a href="/noinfo/cave-number-index">Cave Number Index - kept updated</a>
|
||||
</p>
|
||||
|
||||
<h3>1624</h3>
|
||||
<div style="column-count: 3;">
|
||||
<table class="searchable">
|
||||
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<p style="text-align:right">
|
||||
<a href="/newcave/">New Cave</a><br>
|
||||
<a href="/noinfo/cave-number-index">Cave Number Index - kept updated</a>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div id="menu">
|
||||
<ul id="menulinks">
|
||||
<li><a href="/index.htm">Home</a></li>
|
||||
<li><a href="/handbook/index.htm">Handbook</a>
|
||||
</li>
|
||||
<li><a href="/handbook/computing/onlinesystems.html">Online systems</a></li>
|
||||
<li><a href="/handbook/logbooks.html#form">Make Logbook Entry</a></li>
|
||||
|
||||
|
||||
<li><a href="/caves_recent">Caves</a>
|
||||
</li>
|
||||
<li><a href="/infodx.htm">Site index</a></li>
|
||||
<li><a href="/pubs.htm">Reports</a></li>
|
||||
|
||||
<ul><li><a href="/years/2025">2025</a></li></ul>
|
||||
|
||||
|
||||
<li><a href="https://expo.survex.com/kanboard/board/2">Kanboard</a></li>
|
||||
|
||||
<li><a href="/handbook/troggle/training/trogbegin.html">Troggle</a></li>
|
||||
|
||||
<li><form name=P method=get
|
||||
|
||||
action="https://expo.survex.com/search"
|
||||
|
||||
|
||||
target="_top">
|
||||
<input id="omega-autofocus" type=search name=P size=8 autofocus>
|
||||
<input type=submit value="Search"></form></li>
|
||||
|
||||
|
||||
|
||||
<li> <b style="color:red">RUNNING ON LOCALSERVER</b> <br>slug:<br>newslug:<br>url:
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
179
_deploy/SnowWhite/localsettings-SnowWhite.py
Normal file
179
_deploy/SnowWhite/localsettings-SnowWhite.py
Normal file
@@ -0,0 +1,179 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
from secret_credentials import *
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
# MARIADB_SERVER_PASSWORD =
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
|
||||
# default values, real secrets will be imported from credentials.py
|
||||
|
||||
#SQLITEFILE = "/home/philip/expo/troggle.sqlite" # can be ':memory:'
|
||||
SQLITEFILE = str(Path(__file__).parent.parent / "troggle.sqlite") # can be ':memory:'
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'), # only on dev
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent # folder above troggle, expoweb, drawings, loser
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles" # sometimes on a different filesystem
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos" # sometimes on a different filesystem
|
||||
PHOTOS_YEAR = "2025"
|
||||
|
||||
KMZ_ICONS_PATH = REPOS_ROOT_PATH / "troggle" / "kmz_icons" # Google Earth export in /caves/
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT.
|
||||
# Note that MEDIA_URL and PHOTOS_URL are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
URL_ROOT = "/"
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
179
_deploy/SnowWhite/localsettings-SnowWhite.py.bak
Normal file
179
_deploy/SnowWhite/localsettings-SnowWhite.py.bak
Normal file
@@ -0,0 +1,179 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
from secret_credentials import *
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
# MARIADB_SERVER_PASSWORD =
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
|
||||
# default values, real secrets will be imported from credentials.py
|
||||
|
||||
#SQLITEFILE = "/home/philip/expo/troggle.sqlite" # can be ':memory:'
|
||||
SQLITEFILE = str(Path(__file__).parent.parent / "troggle.sqlite") # can be ':memory:'
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'), # only on dev
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent # folder above troggle, expoweb, drawings, loser
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles" # sometimes on a different filesystem
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos" # sometimes on a different filesystem
|
||||
PHOTOS_YEAR = "2025"
|
||||
|
||||
KMZ_ICONS_PATH = REPOS_ROOT_PATH / "troggle" / "kmz_icons" # Google Earth export in /caves/
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT.
|
||||
# Note that MEDIA_URL and PHOTOS_URL are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
URL_ROOT = "/"
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
22
_deploy/SnowWhite/os-survey.sh
Normal file
22
_deploy/SnowWhite/os-survey.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal : 'bash os-survey.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
sudo apt install survex-aven -y
|
||||
sudo apt install gpsprune qgis -y
|
||||
|
||||
|
||||
cd ~/expo
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
92
_deploy/SnowWhite/os-trog24.04.sh
Normal file
92
_deploy/SnowWhite/os-trog24.04.sh
Normal file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
# sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
ssh -V
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
|
||||
|
||||
# Already in Ubuntu 24.04 on WSL:
|
||||
# sudo apt install git -y
|
||||
# sudo apt install wget gpg
|
||||
# sudo apt install sftp -y
|
||||
# sudo apt install openssh-client -y
|
||||
# sudo apt install rsync
|
||||
|
||||
# Now using uv not pip:
|
||||
# sudo apt install python3-pip -y
|
||||
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install gedit -y
|
||||
sudo apt install tig gitg meld -y
|
||||
|
||||
# python formatting https://docs.astral.sh/ruff/
|
||||
sudo snap install ruff
|
||||
|
||||
# # do not actually use this any more
|
||||
# sudo useradd expo
|
||||
# sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
# sudo apt install python3-distutils -y
|
||||
|
||||
# install uv
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
|
||||
# We don't install the later version or the earlier versions of python - for dev and "sever mimic" environments
|
||||
# we leave that to uv to install now.
|
||||
|
||||
# In Dec.2024, the server is running 3.11 but dev work will be using 3.13
|
||||
# The setup of the virtual environment is done by troggle/_deploy/wsl/venv-trog.sh
|
||||
|
||||
# install VS code - but ONLY on a native ubuntu install, NOT in WSL
|
||||
# sudo apt install software-properties-common apt-transport-https
|
||||
# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||||
# sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||||
# sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||||
# sudo apt update
|
||||
# sudo apt install code
|
||||
|
||||
|
||||
mkdir ~/expo
|
||||
cd ~/expo
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
echo '### because you can't clone the repos without a key
|
||||
|
||||
git config --global user.email "philip.sargent@gmail.com"
|
||||
git config --global user.name "Philip Sargent"
|
||||
git config --global pull.rebase true
|
||||
|
||||
#Change this to clone using https?? at least for troggle?
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
git clone ssh://expo@expo.survex.com/home/expo/loser
|
||||
git clone ssh://expo@expo.survex.com/home/expo/expoweb
|
||||
git clone ssh://expo@expo.survex.com/home/expo/drawings
|
||||
|
||||
mkdir expofiles
|
||||
rsync -azv --delete-after --prune-empty-dirs expo@expo.survex.com:expofiles/surveyscans/ expofiles/surveyscans
|
||||
rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
|
||||
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
67
_deploy/SnowWhite/pre-push.sh
Executable file
67
_deploy/SnowWhite/pre-push.sh
Executable file
@@ -0,0 +1,67 @@
|
||||
#! /bin/bash
|
||||
# create and sanitise files for pushing to repo
|
||||
# catatrophically forgot to sanitize localsettingsWSL.py - oops.
|
||||
|
||||
#Make sure you have the WSL permissions system working, or you will push unsanitized files as this will fail
|
||||
# Philip Sargent 2022/04/12
|
||||
|
||||
HOSTNAME=`hostname`
|
||||
echo "** This copies file to _deploy/${HOSTNAME}/ !"
|
||||
cd ..
|
||||
|
||||
cd troggle
|
||||
echo `pwd`
|
||||
echo deprecations.
|
||||
|
||||
PYTHON="uv run"
|
||||
|
||||
source .venv/bin/activate
|
||||
python3 -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
|
||||
deactivate
|
||||
echo diffsettings.
|
||||
rm diffsettings.txt
|
||||
if test -f "diffsettings.txt"; then
|
||||
echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
|
||||
exit
|
||||
fi
|
||||
$PYTHON manage.py diffsettings | grep "###" > diffsettings.txt
|
||||
|
||||
echo inspectdb.
|
||||
# this next line requires database setting to be troggle.sqlite:
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
#egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo remove passwords.
|
||||
cp localsettings.py localsettings-${HOSTNAME}.py
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
|
||||
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
|
||||
|
||||
mkdir -p _deploy/${HOSTNAME}
|
||||
mv _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py.bak
|
||||
mv localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}
|
||||
cp uv.lock _deploy/${HOSTNAME}
|
||||
cp *.sh _deploy/${HOSTNAME}
|
||||
|
||||
ls -tlr *.toml
|
||||
uv tree
|
||||
|
||||
#
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# in ./pre-run.sh
|
||||
# $PYTHON reset-django.py
|
||||
# $PYTHON manage.py makemigrations
|
||||
# $PYTHON manage.py test
|
||||
# $PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -i "unable|error" troggle-inspectdb.py
|
||||
36
_deploy/SnowWhite/pre-run.sh
Executable file
36
_deploy/SnowWhite/pre-run.sh
Executable file
@@ -0,0 +1,36 @@
|
||||
#! /bin/bash
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# Changed to use uv not pip, requires manage.py to have uv structured uv comment in it.
|
||||
PYTHON="uv run"
|
||||
|
||||
echo "** Run inspectdb:"
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo ""
|
||||
# count non-blank lines of python and template HTML code
|
||||
# includes all variants of settings.py files
|
||||
|
||||
# fix this as core/utils.py has 28,000 lines of numbers.
|
||||
find . -name \*.html -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-templates.txt
|
||||
|
||||
find . -name \*.py -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | grep -v "/migrations/" |grep -v "troggle-inspectdb.py"| awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-python.txt
|
||||
|
||||
echo "** Run reset-django.py - which deletes the database"
|
||||
# This deletes the database so must run after generating troggle-inspectdb.py
|
||||
$PYTHON reset-django.py
|
||||
echo "** After cleanup deletion, remake all migrations."
|
||||
$PYTHON manage.py makemigrations >/dev/null
|
||||
$PYTHON manage.py migrate
|
||||
|
||||
echo "** Now running self check"
|
||||
$PYTHON manage.py check -v 3 --deploy 2>security-warnings.txt >/dev/null
|
||||
$PYTHON manage.py check -v 3 --deploy
|
||||
|
||||
echo "** Now running test suite"
|
||||
# $PYTHON manage.py test -v 1
|
||||
|
||||
echo ""
|
||||
echo `tail -1 lines-of-python.txt` non-comment lines of python.
|
||||
echo `tail -1 lines-of-templates.txt` non-comment lines of HTML templates.
|
||||
|
||||
echo '** If you have an error running manage.py, maybe you are not in an activated venv ? or your manage.py is not managed by uv properly ?'
|
||||
235
_deploy/SnowWhite/uv.lock
generated
Normal file
235
_deploy/SnowWhite/uv.lock
generated
Normal file
@@ -0,0 +1,235 @@
|
||||
version = 1
|
||||
requires-python = ">=3.13"
|
||||
|
||||
[[package]]
|
||||
name = "asgiref"
|
||||
version = "3.9.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", hash = "sha256:a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142", size = 36870 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", hash = "sha256:f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c", size = 23790 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "beautifulsoup4"
|
||||
version = "4.13.5"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "soupsieve" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/85/2e/3e5079847e653b1f6dc647aa24549d68c6addb4c595cc0d902d1b19308ad/beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695", size = 622954 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/04/eb/f4151e0c7377a6e08a38108609ba5cede57986802757848688aeedd1b9e8/beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a", size = 105113 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "coverage"
|
||||
version = "7.10.5"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/61/83/153f54356c7c200013a752ce1ed5448573dca546ce125801afca9e1ac1a4/coverage-7.10.5.tar.gz", hash = "sha256:f2e57716a78bc3ae80b2207be0709a3b2b63b9f2dcf9740ee6ac03588a2015b6", size = 821662 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/9f/08/4166ecfb60ba011444f38a5a6107814b80c34c717bc7a23be0d22e92ca09/coverage-7.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ef3b83594d933020f54cf65ea1f4405d1f4e41a009c46df629dd964fcb6e907c", size = 217106 },
|
||||
{ url = "https://files.pythonhosted.org/packages/25/d7/b71022408adbf040a680b8c64bf6ead3be37b553e5844f7465643979f7ca/coverage-7.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2b96bfdf7c0ea9faebce088a3ecb2382819da4fbc05c7b80040dbc428df6af44", size = 217353 },
|
||||
{ url = "https://files.pythonhosted.org/packages/74/68/21e0d254dbf8972bb8dd95e3fe7038f4be037ff04ba47d6d1b12b37510ba/coverage-7.10.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:63df1fdaffa42d914d5c4d293e838937638bf75c794cf20bee12978fc8c4e3bc", size = 248350 },
|
||||
{ url = "https://files.pythonhosted.org/packages/90/65/28752c3a896566ec93e0219fc4f47ff71bd2b745f51554c93e8dcb659796/coverage-7.10.5-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8002dc6a049aac0e81ecec97abfb08c01ef0c1fbf962d0c98da3950ace89b869", size = 250955 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a5/eb/ca6b7967f57f6fef31da8749ea20417790bb6723593c8cd98a987be20423/coverage-7.10.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63d4bb2966d6f5f705a6b0c6784c8969c468dbc4bcf9d9ded8bff1c7e092451f", size = 252230 },
|
||||
{ url = "https://files.pythonhosted.org/packages/bc/29/17a411b2a2a18f8b8c952aa01c00f9284a1fbc677c68a0003b772ea89104/coverage-7.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1f672efc0731a6846b157389b6e6d5d5e9e59d1d1a23a5c66a99fd58339914d5", size = 250387 },
|
||||
{ url = "https://files.pythonhosted.org/packages/c7/89/97a9e271188c2fbb3db82235c33980bcbc733da7da6065afbaa1d685a169/coverage-7.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3f39cef43d08049e8afc1fde4a5da8510fc6be843f8dea350ee46e2a26b2f54c", size = 248280 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d1/c6/0ad7d0137257553eb4706b4ad6180bec0a1b6a648b092c5bbda48d0e5b2c/coverage-7.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2968647e3ed5a6c019a419264386b013979ff1fb67dd11f5c9886c43d6a31fc2", size = 249894 },
|
||||
{ url = "https://files.pythonhosted.org/packages/84/56/fb3aba936addb4c9e5ea14f5979393f1c2466b4c89d10591fd05f2d6b2aa/coverage-7.10.5-cp313-cp313-win32.whl", hash = "sha256:0d511dda38595b2b6934c2b730a1fd57a3635c6aa2a04cb74714cdfdd53846f4", size = 219536 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fc/54/baacb8f2f74431e3b175a9a2881feaa8feb6e2f187a0e7e3046f3c7742b2/coverage-7.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:9a86281794a393513cf117177fd39c796b3f8e3759bb2764259a2abba5cce54b", size = 220330 },
|
||||
{ url = "https://files.pythonhosted.org/packages/64/8a/82a3788f8e31dee51d350835b23d480548ea8621f3effd7c3ba3f7e5c006/coverage-7.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:cebd8e906eb98bb09c10d1feed16096700b1198d482267f8bf0474e63a7b8d84", size = 218961 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d8/a1/590154e6eae07beee3b111cc1f907c30da6fc8ce0a83ef756c72f3c7c748/coverage-7.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0520dff502da5e09d0d20781df74d8189ab334a1e40d5bafe2efaa4158e2d9e7", size = 217819 },
|
||||
{ url = "https://files.pythonhosted.org/packages/0d/ff/436ffa3cfc7741f0973c5c89405307fe39b78dcf201565b934e6616fc4ad/coverage-7.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d9cd64aca68f503ed3f1f18c7c9174cbb797baba02ca8ab5112f9d1c0328cd4b", size = 218040 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a0/ca/5787fb3d7820e66273913affe8209c534ca11241eb34ee8c4fd2aaa9dd87/coverage-7.10.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0913dd1613a33b13c4f84aa6e3f4198c1a21ee28ccb4f674985c1f22109f0aae", size = 259374 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b5/89/21af956843896adc2e64fc075eae3c1cadb97ee0a6960733e65e696f32dd/coverage-7.10.5-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1b7181c0feeb06ed8a02da02792f42f829a7b29990fef52eff257fef0885d760", size = 261551 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e1/96/390a69244ab837e0ac137989277879a084c786cf036c3c4a3b9637d43a89/coverage-7.10.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36d42b7396b605f774d4372dd9c49bed71cbabce4ae1ccd074d155709dd8f235", size = 263776 },
|
||||
{ url = "https://files.pythonhosted.org/packages/00/32/cfd6ae1da0a521723349f3129b2455832fc27d3f8882c07e5b6fefdd0da2/coverage-7.10.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b4fdc777e05c4940b297bf47bf7eedd56a39a61dc23ba798e4b830d585486ca5", size = 261326 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4c/c4/bf8d459fb4ce2201e9243ce6c015936ad283a668774430a3755f467b39d1/coverage-7.10.5-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:42144e8e346de44a6f1dbd0a56575dd8ab8dfa7e9007da02ea5b1c30ab33a7db", size = 259090 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f4/5d/a234f7409896468e5539d42234016045e4015e857488b0b5b5f3f3fa5f2b/coverage-7.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:66c644cbd7aed8fe266d5917e2c9f65458a51cfe5eeff9c05f15b335f697066e", size = 260217 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f3/ad/87560f036099f46c2ddd235be6476dd5c1d6be6bb57569a9348d43eeecea/coverage-7.10.5-cp313-cp313t-win32.whl", hash = "sha256:2d1b73023854068c44b0c554578a4e1ef1b050ed07cf8b431549e624a29a66ee", size = 220194 },
|
||||
{ url = "https://files.pythonhosted.org/packages/36/a8/04a482594fdd83dc677d4a6c7e2d62135fff5a1573059806b8383fad9071/coverage-7.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:54a1532c8a642d8cc0bd5a9a51f5a9dcc440294fd06e9dda55e743c5ec1a8f14", size = 221258 },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/ad/7da28594ab66fe2bc720f1bc9b131e62e9b4c6e39f044d9a48d18429cc21/coverage-7.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:74d5b63fe3f5f5d372253a4ef92492c11a4305f3550631beaa432fc9df16fcff", size = 219521 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d3/7f/c8b6e4e664b8a95254c35a6c8dd0bf4db201ec681c169aae2f1256e05c85/coverage-7.10.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:68c5e0bc5f44f68053369fa0d94459c84548a77660a5f2561c5e5f1e3bed7031", size = 217090 },
|
||||
{ url = "https://files.pythonhosted.org/packages/44/74/3ee14ede30a6e10a94a104d1d0522d5fb909a7c7cac2643d2a79891ff3b9/coverage-7.10.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cf33134ffae93865e32e1e37df043bef15a5e857d8caebc0099d225c579b0fa3", size = 217365 },
|
||||
{ url = "https://files.pythonhosted.org/packages/41/5f/06ac21bf87dfb7620d1f870dfa3c2cae1186ccbcdc50b8b36e27a0d52f50/coverage-7.10.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ad8fa9d5193bafcf668231294241302b5e683a0518bf1e33a9a0dfb142ec3031", size = 248413 },
|
||||
{ url = "https://files.pythonhosted.org/packages/21/bc/cc5bed6e985d3a14228539631573f3863be6a2587381e8bc5fdf786377a1/coverage-7.10.5-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:146fa1531973d38ab4b689bc764592fe6c2f913e7e80a39e7eeafd11f0ef6db2", size = 250943 },
|
||||
{ url = "https://files.pythonhosted.org/packages/8d/43/6a9fc323c2c75cd80b18d58db4a25dc8487f86dd9070f9592e43e3967363/coverage-7.10.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6013a37b8a4854c478d3219ee8bc2392dea51602dd0803a12d6f6182a0061762", size = 252301 },
|
||||
{ url = "https://files.pythonhosted.org/packages/69/7c/3e791b8845f4cd515275743e3775adb86273576596dc9f02dca37357b4f2/coverage-7.10.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:eb90fe20db9c3d930fa2ad7a308207ab5b86bf6a76f54ab6a40be4012d88fcae", size = 250302 },
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/bc/5099c1e1cb0c9ac6491b281babea6ebbf999d949bf4aa8cdf4f2b53505e8/coverage-7.10.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:384b34482272e960c438703cafe63316dfbea124ac62006a455c8410bf2a2262", size = 248237 },
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/51/d346eb750a0b2f1e77f391498b753ea906fde69cc11e4b38dca28c10c88c/coverage-7.10.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:467dc74bd0a1a7de2bedf8deaf6811f43602cb532bd34d81ffd6038d6d8abe99", size = 249726 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a3/85/eebcaa0edafe427e93286b94f56ea7e1280f2c49da0a776a6f37e04481f9/coverage-7.10.5-cp314-cp314-win32.whl", hash = "sha256:556d23d4e6393ca898b2e63a5bca91e9ac2d5fb13299ec286cd69a09a7187fde", size = 219825 },
|
||||
{ url = "https://files.pythonhosted.org/packages/3c/f7/6d43e037820742603f1e855feb23463979bf40bd27d0cde1f761dcc66a3e/coverage-7.10.5-cp314-cp314-win_amd64.whl", hash = "sha256:f4446a9547681533c8fa3e3c6cf62121eeee616e6a92bd9201c6edd91beffe13", size = 220618 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4a/b0/ed9432e41424c51509d1da603b0393404b828906236fb87e2c8482a93468/coverage-7.10.5-cp314-cp314-win_arm64.whl", hash = "sha256:5e78bd9cf65da4c303bf663de0d73bf69f81e878bf72a94e9af67137c69b9fe9", size = 219199 },
|
||||
{ url = "https://files.pythonhosted.org/packages/2f/54/5a7ecfa77910f22b659c820f67c16fc1e149ed132ad7117f0364679a8fa9/coverage-7.10.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5661bf987d91ec756a47c7e5df4fbcb949f39e32f9334ccd3f43233bbb65e508", size = 217833 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4e/0e/25672d917cc57857d40edf38f0b867fb9627115294e4f92c8fcbbc18598d/coverage-7.10.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a46473129244db42a720439a26984f8c6f834762fc4573616c1f37f13994b357", size = 218048 },
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/7c/0b2b4f1c6f71885d4d4b2b8608dcfc79057adb7da4143eb17d6260389e42/coverage-7.10.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1f64b8d3415d60f24b058b58d859e9512624bdfa57a2d1f8aff93c1ec45c429b", size = 259549 },
|
||||
{ url = "https://files.pythonhosted.org/packages/94/73/abb8dab1609abec7308d83c6aec547944070526578ee6c833d2da9a0ad42/coverage-7.10.5-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:44d43de99a9d90b20e0163f9770542357f58860a26e24dc1d924643bd6aa7cb4", size = 261715 },
|
||||
{ url = "https://files.pythonhosted.org/packages/0b/d1/abf31de21ec92731445606b8d5e6fa5144653c2788758fcf1f47adb7159a/coverage-7.10.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a931a87e5ddb6b6404e65443b742cb1c14959622777f2a4efd81fba84f5d91ba", size = 263969 },
|
||||
{ url = "https://files.pythonhosted.org/packages/9c/b3/ef274927f4ebede96056173b620db649cc9cb746c61ffc467946b9d0bc67/coverage-7.10.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9559b906a100029274448f4c8b8b0a127daa4dade5661dfd821b8c188058842", size = 261408 },
|
||||
{ url = "https://files.pythonhosted.org/packages/20/fc/83ca2812be616d69b4cdd4e0c62a7bc526d56875e68fd0f79d47c7923584/coverage-7.10.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b08801e25e3b4526ef9ced1aa29344131a8f5213c60c03c18fe4c6170ffa2874", size = 259168 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fc/4f/e0779e5716f72d5c9962e709d09815d02b3b54724e38567308304c3fc9df/coverage-7.10.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ed9749bb8eda35f8b636fb7632f1c62f735a236a5d4edadd8bbcc5ea0542e732", size = 260317 },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/fe/4247e732f2234bb5eb9984a0888a70980d681f03cbf433ba7b48f08ca5d5/coverage-7.10.5-cp314-cp314t-win32.whl", hash = "sha256:609b60d123fc2cc63ccee6d17e4676699075db72d14ac3c107cc4976d516f2df", size = 220600 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a7/a0/f294cff6d1034b87839987e5b6ac7385bec599c44d08e0857ac7f164ad0c/coverage-7.10.5-cp314-cp314t-win_amd64.whl", hash = "sha256:0666cf3d2c1626b5a3463fd5b05f5e21f99e6aec40a3192eee4d07a15970b07f", size = 221714 },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/18/fa1afdc60b5528d17416df440bcbd8fd12da12bfea9da5b6ae0f7a37d0f7/coverage-7.10.5-cp314-cp314t-win_arm64.whl", hash = "sha256:bc85eb2d35e760120540afddd3044a5bf69118a91a296a8b3940dfc4fdcfe1e2", size = 219735 },
|
||||
{ url = "https://files.pythonhosted.org/packages/08/b6/fff6609354deba9aeec466e4bcaeb9d1ed3e5d60b14b57df2a36fb2273f2/coverage-7.10.5-py3-none-any.whl", hash = "sha256:0be24d35e4db1d23d0db5c0f6a74a962e2ec83c426b5cac09f4234aadef38e4a", size = 208736 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "django"
|
||||
version = "5.2.6"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "asgiref" },
|
||||
{ name = "sqlparse" },
|
||||
{ name = "tzdata", marker = "sys_platform == 'win32'" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/4c/8c/2a21594337250a171d45dda926caa96309d5136becd1f48017247f9cdea0/django-5.2.6.tar.gz", hash = "sha256:da5e00372763193d73cecbf71084a3848458cecf4cee36b9a1e8d318d114a87b", size = 10858861 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f5/af/6593f6d21404e842007b40fdeb81e73c20b6649b82d020bb0801b270174c/django-5.2.6-py3-none-any.whl", hash = "sha256:60549579b1174a304b77e24a93d8d9fafe6b6c03ac16311f3e25918ea5a20058", size = 8303111 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "piexif"
|
||||
version = "1.1.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/fa/84/a3f25cec7d0922bf60be8000c9739d28d24b6896717f44cc4cfb843b1487/piexif-1.1.3.zip", hash = "sha256:83cb35c606bf3a1ea1a8f0a25cb42cf17e24353fd82e87ae3884e74a302a5f1b", size = 1011134 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/d8/6f63147dd73373d051c5eb049ecd841207f898f50a5a1d4378594178f6cf/piexif-1.1.3-py2.py3-none-any.whl", hash = "sha256:3bc435d171720150b81b15d27e05e54b8abbde7b4242cddd81ef160d283108b6", size = 20691 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pillow"
|
||||
version = "11.3.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 },
|
||||
{ url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 },
|
||||
{ url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 },
|
||||
{ url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 },
|
||||
{ url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 },
|
||||
{ url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 },
|
||||
{ url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 },
|
||||
{ url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 },
|
||||
{ url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 },
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 },
|
||||
{ url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 },
|
||||
{ url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 },
|
||||
{ url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 },
|
||||
{ url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 },
|
||||
{ url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 },
|
||||
{ url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520 },
|
||||
{ url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116 },
|
||||
{ url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597 },
|
||||
{ url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246 },
|
||||
{ url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336 },
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699 },
|
||||
{ url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789 },
|
||||
{ url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911 },
|
||||
{ url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383 },
|
||||
{ url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385 },
|
||||
{ url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129 },
|
||||
{ url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580 },
|
||||
{ url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860 },
|
||||
{ url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694 },
|
||||
{ url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888 },
|
||||
{ url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330 },
|
||||
{ url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089 },
|
||||
{ url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370 },
|
||||
{ url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500 },
|
||||
{ url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyaes"
|
||||
version = "1.6.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/44/66/2c17bae31c906613795711fc78045c285048168919ace2220daa372c7d72/pyaes-1.6.1.tar.gz", hash = "sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f", size = 28536 }
|
||||
|
||||
[[package]]
|
||||
name = "soupsieve"
|
||||
version = "2.8"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/6d/e6/21ccce3262dd4889aa3332e5a119a3491a95e8f60939870a3a035aabac0d/soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f", size = 103472 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/14/a0/bb38d3b76b8cae341dad93a2dd83ab7462e6dbcdd84d43f54ee60a8dc167/soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c", size = 36679 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlparse"
|
||||
version = "0.5.3"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/e5/40/edede8dd6977b0d3da179a342c198ed100dd2aba4be081861ee5911e4da4/sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272", size = 84999 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca", size = 44415 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "troggle"
|
||||
version = "2025.9.26"
|
||||
source = { virtual = "." }
|
||||
|
||||
[package.dev-dependencies]
|
||||
dev = [
|
||||
{ name = "beautifulsoup4" },
|
||||
{ name = "coverage" },
|
||||
{ name = "django" },
|
||||
{ name = "piexif" },
|
||||
{ name = "pillow" },
|
||||
{ name = "pyaes" },
|
||||
{ name = "unidecode" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
|
||||
[package.metadata.requires-dev]
|
||||
dev = [
|
||||
{ name = "beautifulsoup4", specifier = ">=4.12.3" },
|
||||
{ name = "coverage", specifier = ">=7.6.9" },
|
||||
{ name = "django", specifier = ">=5.2.3" },
|
||||
{ name = "piexif", specifier = ">=1.1.3" },
|
||||
{ name = "pillow", specifier = ">=11.0.0" },
|
||||
{ name = "pyaes", specifier = ">=1.6.1" },
|
||||
{ name = "unidecode", specifier = ">=1.3.8" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typing-extensions"
|
||||
version = "4.15.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tzdata"
|
||||
version = "2025.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unidecode"
|
||||
version = "1.4.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/94/7d/a8a765761bbc0c836e397a2e48d498305a865b70a8600fd7a942e85dcf63/Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23", size = 200149 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/8f/b7/559f59d57d18b44c6d1250d2eeaa676e028b9c527431f5d0736478a73ba1/Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021", size = 235837 },
|
||||
]
|
||||
53
_deploy/SnowWhite/venv-trog.sh
Normal file
53
_deploy/SnowWhite/venv-trog.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# now using uv, unbelieveably simpler.
|
||||
# Run this in a terminal in ~/expo above the troggle directory: 'bash ~/expo/venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the directory above the troggle directory: "bash ~/expo/venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 24.04 with all the gubbins already installed
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog24.04.sh runniing it in /home/username/
|
||||
python3 --version
|
||||
cd ~/expo/troggle
|
||||
echo "-- EXPO folder [current directory]: `pwd`"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder: ${TROGDIR}"
|
||||
|
||||
cp dev.toml pyproject.toml
|
||||
cp ~/expo/troggle/_deploy/wsl/localsettingsWSL.py ~/expo/troggle/localsettings.py
|
||||
|
||||
uv self update
|
||||
uv sync
|
||||
|
||||
|
||||
# fudge for philip's laptop prior to M2 SSD upgrade
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
uv pip list
|
||||
|
||||
echo "Django version:`uv run django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/expo/troggle'
|
||||
'uv run django-admin'
|
||||
'uv run manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
|
||||
'uv run manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'uv run databaseReset.py reset INIT'
|
||||
'uv run manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
200
_deploy/anathema/localsettings-anathema.py
Normal file
200
_deploy/anathema/localsettings-anathema.py
Normal file
@@ -0,0 +1,200 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
from secret_credentials import *
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
# default values, real secrets will be imported from credentials.py in future
|
||||
|
||||
SQLITEFILE = "/home/expo/troggle.sqlite" # can be ':memory:'
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'),
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
# FILES = Path('/mnt/d/expofiles/')
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles"
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos"
|
||||
PHOTOS_YEAR = "2025"
|
||||
NOTABLECAVESHREFS = ["290", "291", "264", "258", "204", "359", "76", "107"]
|
||||
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH / "troggle"
|
||||
LOGFILE = PYTHON_PATH / "troggle.log"
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||
# trailing slash if there is a path component (optional in other cases).
|
||||
MEDIA_URL = "/site-media/"
|
||||
|
||||
DIR_ROOT = Path("") # this should end in / if a value is given
|
||||
URL_ROOT = "/"
|
||||
# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
|
||||
|
||||
# Note that these constants are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
# executables:
|
||||
CAVERN = "cavern" # for parsing .svx files and producing .3d files
|
||||
SURVEXPORT = "survexport" # for parsing .3d files and producing .pos files
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# EXPOWEB_URL = "" # defunct, removed.
|
||||
# SCANS_URL = '/survey_scans/' # defunct, removed.
|
||||
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
sys.path.append(str(PYTHON_PATH))
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
|
||||
# TEST_RUNNER = "django.test.runner.DiscoverRunner"
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
22
_deploy/anathema/os-survey.sh
Normal file
22
_deploy/anathema/os-survey.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal : 'bash os-survey.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
sudo apt install survex-aven -y
|
||||
sudo apt install gpsprune qgis -y
|
||||
|
||||
|
||||
cd ~/expo
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
92
_deploy/anathema/os-trog24.04.sh
Normal file
92
_deploy/anathema/os-trog24.04.sh
Normal file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
# sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
ssh -V
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
|
||||
|
||||
# Already in Ubuntu 24.04 on WSL:
|
||||
# sudo apt install git -y
|
||||
# sudo apt install wget gpg
|
||||
# sudo apt install sftp -y
|
||||
# sudo apt install openssh-client -y
|
||||
# sudo apt install rsync
|
||||
|
||||
# Now using uv not pip:
|
||||
# sudo apt install python3-pip -y
|
||||
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install gedit -y
|
||||
sudo apt install tig gitg meld -y
|
||||
|
||||
# python formatting https://docs.astral.sh/ruff/
|
||||
sudo snap install ruff
|
||||
|
||||
# # do not actually use this any more
|
||||
# sudo useradd expo
|
||||
# sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
# sudo apt install python3-distutils -y
|
||||
|
||||
# install uv
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
|
||||
# We don't install the later version or the earlier versions of python - for dev and "sever mimic" environments
|
||||
# we leave that to uv to install now.
|
||||
|
||||
# In Dec.2024, the server is running 3.11 but dev work will be using 3.13
|
||||
# The setup of the virtual environment is done by troggle/_deploy/wsl/venv-trog.sh
|
||||
|
||||
# install VS code - but ONLY on a native ubuntu install, NOT in WSL
|
||||
# sudo apt install software-properties-common apt-transport-https
|
||||
# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||||
# sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||||
# sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||||
# sudo apt update
|
||||
# sudo apt install code
|
||||
|
||||
|
||||
mkdir ~/expo
|
||||
cd ~/expo
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
echo '### because you can't clone the repos without a key
|
||||
|
||||
git config --global user.email "philip.sargent@gmail.com"
|
||||
git config --global user.name "Philip Sargent"
|
||||
git config --global pull.rebase true
|
||||
|
||||
#Change this to clone using https?? at least for troggle?
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
git clone ssh://expo@expo.survex.com/home/expo/loser
|
||||
git clone ssh://expo@expo.survex.com/home/expo/expoweb
|
||||
git clone ssh://expo@expo.survex.com/home/expo/drawings
|
||||
|
||||
mkdir expofiles
|
||||
rsync -azv --delete-after --prune-empty-dirs expo@expo.survex.com:expofiles/surveyscans/ expofiles/surveyscans
|
||||
rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
|
||||
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
63
_deploy/anathema/pre-push.sh
Executable file
63
_deploy/anathema/pre-push.sh
Executable file
@@ -0,0 +1,63 @@
|
||||
#! /bin/bash
|
||||
# create and sanitise files for pushing to repo
|
||||
# catatrophically forgot to sanitize localsettingsWSL.py - oops.
|
||||
|
||||
#Make sure you have the WSL permissions system working, or you will push unsanitized files as this will fail
|
||||
# Philip Sargent 2022/04/12
|
||||
|
||||
HOSTNAME=`hostname`
|
||||
echo "** This copies file to _deploy/${HOSTNAME}/ !"
|
||||
cd ..
|
||||
|
||||
cd troggle
|
||||
echo `pwd`
|
||||
echo deprecations.
|
||||
|
||||
PYTHON="uv run"
|
||||
|
||||
source .venv/bin/activate
|
||||
python3 -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
|
||||
deactivate
|
||||
echo diffsettings.
|
||||
rm diffsettings.txt
|
||||
if test -f "diffsettings.txt"; then
|
||||
echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
|
||||
exit
|
||||
fi
|
||||
$PYTHON manage.py diffsettings | grep "###" > diffsettings.txt
|
||||
|
||||
echo inspectdb.
|
||||
# this next line requires database setting to be troggle.sqlite:
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
#egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo remove passwords.
|
||||
cp localsettings.py localsettings-${HOSTNAME}.py
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
|
||||
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
|
||||
|
||||
mkdir -p _deploy/${HOSTNAME}
|
||||
mv _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py.bak
|
||||
mv localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}
|
||||
cp *.sh _deploy/${HOSTNAME}
|
||||
|
||||
#
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# in ./pre-run.sh
|
||||
# $PYTHON reset-django.py
|
||||
# $PYTHON manage.py makemigrations
|
||||
# $PYTHON manage.py test
|
||||
# $PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -i "unable|error" troggle-inspectdb.py
|
||||
36
_deploy/anathema/pre-run.sh
Executable file
36
_deploy/anathema/pre-run.sh
Executable file
@@ -0,0 +1,36 @@
|
||||
#! /bin/bash
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# Changed to use uv not pip, requires manage.py to have uv structured uv comment in it.
|
||||
PYTHON="uv run"
|
||||
|
||||
echo "** Run inspectdb:"
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo ""
|
||||
# count non-blank lines of python and template HTML code
|
||||
# includes all variants of settings.py files
|
||||
|
||||
# fix this as core/utils.py has 28,000 lines of numbers.
|
||||
find . -name \*.html -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-templates.txt
|
||||
|
||||
find . -name \*.py -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | grep -v "/migrations/" |grep -v "troggle-inspectdb.py"| awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-python.txt
|
||||
|
||||
echo "** Run reset-django.py - which deletes the database"
|
||||
# This deletes the database so must run after generating troggle-inspectdb.py
|
||||
$PYTHON reset-django.py
|
||||
echo "** After cleanup deletion, remake all migrations."
|
||||
$PYTHON manage.py makemigrations >/dev/null
|
||||
$PYTHON manage.py migrate
|
||||
|
||||
echo "** Now running self check"
|
||||
$PYTHON manage.py check -v 3 --deploy 2>security-warnings.txt >/dev/null
|
||||
$PYTHON manage.py check -v 3 --deploy
|
||||
|
||||
echo "** Now running test suite"
|
||||
# $PYTHON manage.py test -v 1
|
||||
|
||||
echo ""
|
||||
echo `tail -1 lines-of-python.txt` non-comment lines of python.
|
||||
echo `tail -1 lines-of-templates.txt` non-comment lines of HTML templates.
|
||||
|
||||
echo '** If you have an error running manage.py, maybe you are not in an activated venv ? or your manage.py is not managed by uv properly ?'
|
||||
53
_deploy/anathema/venv-trog.sh
Normal file
53
_deploy/anathema/venv-trog.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# now using uv, unbelieveably simpler.
|
||||
# Run this in a terminal in ~/expo above the troggle directory: 'bash ~/expo/venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the directory above the troggle directory: "bash ~/expo/venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 24.04 with all the gubbins already installed
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog24.04.sh runniing it in /home/username/
|
||||
python3 --version
|
||||
cd ~/expo/troggle
|
||||
echo "-- EXPO folder [current directory]: `pwd`"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder: ${TROGDIR}"
|
||||
|
||||
cp dev.toml pyproject.toml
|
||||
cp ~/expo/troggle/_deploy/wsl/localsettingsWSL.py ~/expo/troggle/localsettings.py
|
||||
|
||||
uv self update
|
||||
uv sync
|
||||
|
||||
|
||||
# fudge for philip's laptop prior to M2 SSD upgrade
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
uv pip list
|
||||
|
||||
echo "Django version:`uv run django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/expo/troggle'
|
||||
'uv run django-admin'
|
||||
'uv run manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
|
||||
'uv run manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'uv run databaseReset.py reset INIT'
|
||||
'uv run manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
160
_deploy/debian-laptops/localsettings2023-04-05-cleansed.py
Normal file
160
_deploy/debian-laptops/localsettings2023-04-05-cleansed.py
Normal file
@@ -0,0 +1,160 @@
|
||||
import os
|
||||
import sys
|
||||
import urllib.parse
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
NOTE this file is vastly out of sync with troggle/_deploy/wsl/localsettings.py
|
||||
which is the most recent version used in active maintenance. There should be
|
||||
essential differences, but there and many, many non-essential differences which
|
||||
should be eliminated for clarity and to use modern idioms. 8 March 2023.
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
# DO NOT check this file into the git repo - it contains real passwords.
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : '123456789012345', # Not used with sqlite3. Not a real password.
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOUSERPASS = 'Not a real password'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOADMINUSERPASS = 'Not a real password'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
REPOS_ROOT_PATH = '/home/expo/'
|
||||
sys.path.append(REPOS_ROOT_PATH)
|
||||
sys.path.append(REPOS_ROOT_PATH + 'troggle')
|
||||
# Define the path to the django app (troggle in this case)
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
|
||||
|
||||
PHOTOS_YEAR = "2023"
|
||||
# add in 358 when they don't make it crash horribly
|
||||
NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [
|
||||
PYTHON_PATH + "templates"
|
||||
],
|
||||
'OPTIONS': {
|
||||
'debug': 'DEBUG',
|
||||
'context_processors': [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
|
||||
'core.context.troggle_context', # in core/troggle.py
|
||||
'django.template.context_processors.debug',
|
||||
#'django.template.context_processors.request', # copy of current request, added in trying to make csrf work
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media', # includes a variable MEDIA_URL
|
||||
'django.template.context_processors.static', # includes a variable STATIC_URL
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader', #For each app, inc admin, in INSTALLED_APPS, loader looks for /templates
|
||||
# insert your own TEMPLATE_LOADERS here
|
||||
]
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
PUBLIC_SITE = True
|
||||
|
||||
# This should be False for normal running
|
||||
DEBUG = False
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
|
||||
# executables:
|
||||
CAVERN = 'cavern' # for parsing .svx files and producing .3d files
|
||||
SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
LIBDIR = Path(REPOS_ROOT_PATH) / 'lib' / PV
|
||||
|
||||
EXPOWEB = Path(REPOS_ROOT_PATH + 'expoweb/')
|
||||
SURVEYS = REPOS_ROOT_PATH
|
||||
SURVEY_SCANS = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
|
||||
FILES = REPOS_ROOT_PATH + 'expofiles'
|
||||
PHOTOS_ROOT = REPOS_ROOT_PATH + 'expofiles/photos/'
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / 'templates'
|
||||
MEDIA_ROOT = TROGGLE_PATH / 'media'
|
||||
JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
|
||||
|
||||
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
|
||||
|
||||
#URL_ROOT = 'http://expo.survex.com/'
|
||||
URL_ROOT = '/'
|
||||
DIR_ROOT = Path("") #this should end in / if a value is given
|
||||
EXPOWEB_URL = '/'
|
||||
SURVEYS_URL = '/survey_scans/'
|
||||
|
||||
REPOS_ROOT_PATH = Path(REPOS_ROOT_PATH)
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles"
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos"
|
||||
|
||||
#EXPOFILES = urllib.parse.urljoin(REPOS_ROOT_PATH, 'expofiles/')
|
||||
PHOTOS_URL = urllib.parse.urljoin(URL_ROOT, '/photos/')
|
||||
|
||||
# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views_surveys.py
|
||||
MEDIA_URL = '/site_media/'
|
||||
|
||||
|
||||
STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = urllib.parse.urljoin(URL_ROOT , '/javascript/') # always fails, try to revive it ?
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
LOGFILE = '/var/log/troggle/troggle.log'
|
||||
IMPORTLOGFILE = '/var/log/troggle/import.log'
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
164
_deploy/debian-laptops/localsettingsserver2023-01-cleansed.py
Normal file
164
_deploy/debian-laptops/localsettingsserver2023-01-cleansed.py
Normal file
@@ -0,0 +1,164 @@
|
||||
import os
|
||||
import sys
|
||||
import urllib.parse
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
# DO NOT check this file into the git repo - it contains real passwords.
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : '123456789012345', # Not used with sqlite3.Not the real password
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
SECRET_KEY = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
|
||||
EXPOUSERPASS = "nope"
|
||||
EXPOADMINUSERPASS = "nope"
|
||||
EMAIL_HOST_PASSWORD = "nope"
|
||||
|
||||
REPOS_ROOT_PATH = '/home/expo/'
|
||||
sys.path.append(REPOS_ROOT_PATH)
|
||||
sys.path.append(REPOS_ROOT_PATH + 'troggle')
|
||||
# Define the path to the django app (troggle in this case)
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
PHOTOS_YEAR = "2022"
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [
|
||||
PYTHON_PATH + "templates"
|
||||
],
|
||||
'OPTIONS': {
|
||||
'debug': 'DEBUG',
|
||||
'context_processors': [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
|
||||
'core.context.troggle_context', # in core/troggle.py
|
||||
'django.template.context_processors.debug',
|
||||
#'django.template.context_processors.request', # copy of current request, added in trying to make csrf work
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media', # includes a variable MEDIA_URL
|
||||
'django.template.context_processors.static', # includes a variable STATIC_URL
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader', #For each app, inc admin, in INSTALLED_APPS, loader looks for /templates
|
||||
# insert your own TEMPLATE_LOADERS here
|
||||
]
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
PUBLIC_SITE = True
|
||||
|
||||
# This should be False for normal running
|
||||
DEBUG = True
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH + 'loser/'
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH + 'drawings/'
|
||||
|
||||
# executables:
|
||||
CAVERN = 'cavern' # for parsing .svx files and producing .3d files
|
||||
SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
|
||||
|
||||
EXPOWEB = REPOS_ROOT_PATH + 'expoweb/'
|
||||
#SURVEYS = REPOS_ROOT_PATH
|
||||
SCANS_ROOT = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
|
||||
FILES = REPOS_ROOT_PATH + 'expofiles'
|
||||
PHOTOS_ROOT = REPOS_ROOT_PATH + 'expofiles/photos/'
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / 'templates'
|
||||
MEDIA_ROOT = TROGGLE_PATH / 'media'
|
||||
JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
|
||||
|
||||
|
||||
CAVEDESCRIPTIONS = os.path.join(EXPOWEB, "cave_data")
|
||||
ENTRANCEDESCRIPTIONS = os.path.join(EXPOWEB, "entrance_data")
|
||||
|
||||
# CACHEDIR = REPOS_ROOT_PATH + 'expowebcache/'
|
||||
# THREEDCACHEDIR = CACHEDIR + '3d/'
|
||||
# THUMBNAILCACHE = CACHEDIR + 'thumbs'
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
LIBDIR = Path(REPOS_ROOT_PATH) / 'lib' / PV
|
||||
|
||||
#Note that all these *_URL constants are not actually used in urls.py, they should be..
|
||||
#URL_ROOT = 'http://expo.survex.com/'
|
||||
URL_ROOT = '/'
|
||||
DIR_ROOT = ''#this should end in / if a value is given
|
||||
EXPOWEB_URL = '/'
|
||||
SCANS_URL = '/survey_scans/'
|
||||
EXPOFILES = urllib.parse.urljoin(REPOS_ROOT_PATH, 'expofiles/')
|
||||
PHOTOS_URL = urllib.parse.urljoin(URL_ROOT, '/photos/')
|
||||
|
||||
# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views_surveys.py
|
||||
MEDIA_URL = '/site_media/'
|
||||
|
||||
|
||||
STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = urllib.parse.urljoin(URL_ROOT , '/javascript/') # always fails, try to revive it ?
|
||||
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
LOGFILE = '/var/log/troggle/troggle.log'
|
||||
IMPORTLOGFILE = '/var/log/troggle/import.log'
|
||||
|
||||
# add in 358 when they don't make it crash horribly
|
||||
NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
|
||||
|
||||
# Sanitise these to be strings as all other code is expecting strings
|
||||
# and we have not made the change to pathlib Path type in the other localsettings-* variants yet.
|
||||
CAVEDESCRIPTIONS = os.fspath(CAVEDESCRIPTIONS)
|
||||
ENTRANCEDESCRIPTIONS = os.fspath(ENTRANCEDESCRIPTIONS)
|
||||
LOGFILE = os.fspath(LOGFILE)
|
||||
#SURVEYS = os.fspath(SURVEYS)
|
||||
EXPOWEB = os.fspath(EXPOWEB)
|
||||
DRAWINGS_DATA = os.fspath(DRAWINGS_DATA)
|
||||
SURVEX_DATA = os.fspath(SURVEX_DATA)
|
||||
REPOS_ROOT_PATH = os.fspath(REPOS_ROOT_PATH)
|
||||
TEMPLATE_PATH = os.fspath(TROGGLE_PATH)
|
||||
MEDIA_ROOT = os.fspath(MEDIA_ROOT)
|
||||
JSLIB_ROOT = os.fspath(JSLIB_ROOT)
|
||||
SCANS_ROOT = os.fspath(SCANS_ROOT)
|
||||
LIBDIR = os.fspath(LIBDIR)
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
70
_deploy/debian-laptops/os-trog.sh
Normal file
70
_deploy/debian-laptops/os-trog.sh
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in the troggle directory: "bash venv-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 22.04 relatively clean install.
|
||||
|
||||
sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install python3-pip -y
|
||||
|
||||
# this installs a shed-load of other stuff: binutils etc.sudo apt install survex-aven
|
||||
sudo apt install git openssh-client -y
|
||||
# On a clean debian 11 (bullseye) installation with Xfce & ssh,
|
||||
|
||||
#on ubuntu 20.04:
|
||||
#Package sftp is not available, but is referred to by another package.
|
||||
#This may mean that the package is missing, has been obsoleted, or
|
||||
#is only available from another source
|
||||
#E: Package 'sftp' has no installation candidate
|
||||
|
||||
|
||||
# On Ubuntu 20.04, with python10, the pip install fails.
|
||||
# So you need to get the pip from source
|
||||
# sudo curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
|
||||
# but really you should be using 22.04
|
||||
# and also, isf using debian,
|
||||
# sudo python3.10 -m pip install -U virtualenv
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo useradd expo
|
||||
sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
|
||||
# default since 22.04
|
||||
# sudo apt install python3.10
|
||||
sudo apt install python3.11-venv -y
|
||||
sudo apt install python3.11-dev -y
|
||||
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
sudo python -m pip install --upgrade pip
|
||||
|
||||
sudo apt install sftp -y
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
git config --global user.email "you@example.com"
|
||||
git config --global user.name "Your Name"
|
||||
|
||||
echo '###'
|
||||
echo '### Currently set version of python'
|
||||
python --version
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
|
||||
147
_deploy/debian-laptops/settings2023-02-10.py
Normal file
147
_deploy/debian-laptops/settings2023-02-10.py
Normal file
@@ -0,0 +1,147 @@
|
||||
"""
|
||||
Django settings for troggle project.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/dev/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/dev/ref/settings/
|
||||
"""
|
||||
# Imports should be grouped in the following order:
|
||||
|
||||
# 1.Standard library imports.
|
||||
# 2.Related third party imports.
|
||||
# 3.Local application/library specific imports.
|
||||
# 4.You should put a blank line between each group of imports.
|
||||
|
||||
|
||||
|
||||
print("* importing troggle/settings.py")
|
||||
|
||||
# default value, then gets overwritten by real secrets
|
||||
SECRET_KEY = "not-the-real-secret-key-a#vaeozn0---^fj!355qki*vj2"
|
||||
|
||||
GIT = "git" # command for running git
|
||||
|
||||
# Note that this builds upon the django system installed
|
||||
# global settings in
|
||||
# django/conf/global_settings.py which is automatically loaded first.
|
||||
# read https://docs.djangoproject.com/en/dev/topics/settings/
|
||||
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
# BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
||||
|
||||
# Django settings for troggle project.
|
||||
|
||||
ALLOWED_HOSTS = ["*", "expo.survex.com", ".survex.com", "localhost", "127.0.0.1", "192.168.0.5"]
|
||||
|
||||
ADMINS = (
|
||||
# ('Your Name', 'your_email@domain.com'),
|
||||
)
|
||||
MANAGERS = ADMINS
|
||||
|
||||
# LOGIN_URL = '/accounts/login/' # this is the default value so does not need to be set
|
||||
|
||||
# Local time zone for this installation. Choices can be found here:
|
||||
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||
# although not all choices may be available on all operating systems.
|
||||
# If running in a Windows environment this must be set to the same as your
|
||||
# system time zone.
|
||||
USE_TZ = True
|
||||
TIME_ZONE = "Europe/London"
|
||||
|
||||
# Language code for this installation. All choices can be found here:
|
||||
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||
LANGUAGE_CODE = "en-uk"
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
# If you set this to False, Django will make some optimizations so as not
|
||||
# to load the internationalization machinery.
|
||||
USE_I18N = True
|
||||
USE_L10N = True
|
||||
|
||||
FIX_PERMISSIONS = []
|
||||
|
||||
# top-level survex file basename (without .svx)
|
||||
SURVEX_TOPNAME = "1623-and-1626-no-schoenberg-hs"
|
||||
|
||||
|
||||
# Caves for which survex files exist, but are not otherwise registered
|
||||
# replaced (?) by expoweb/cave_data/pendingcaves.txt
|
||||
# PENDING = ["1626-361", "2007-06", "2009-02",
|
||||
# "2012-ns-01", "2012-ns-02", "2010-04", "2012-ns-05", "2012-ns-06",
|
||||
# "2012-ns-07", "2012-ns-08", "2012-ns-12", "2012-ns-14", "2012-ns-15", "2014-bl888",
|
||||
# "2018-pf-01", "2018-pf-02"]
|
||||
|
||||
APPEND_SLASH = (
|
||||
False # never relevant because we have urls that match unknown files and produce an 'edit this page' response
|
||||
)
|
||||
SMART_APPEND_SLASH = True # not eorking as middleware different after Dj2.0
|
||||
|
||||
|
||||
LOGIN_REDIRECT_URL = "/" # does not seem to have any effect
|
||||
|
||||
SECURE_CONTENT_TYPE_NOSNIFF = True
|
||||
SECURE_BROWSER_XSS_FILTER = True
|
||||
# SESSION_COOKIE_SECURE = True # if enabled, cannot login to Django control panel, bug elsewhere?
|
||||
# CSRF_COOKIE_SECURE = True # if enabled only sends cookies over SSL
|
||||
X_FRAME_OPTIONS = "DENY" # changed to "DENY" after I eliminated all the iframes e.g. /xmlvalid.html
|
||||
|
||||
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # from Django 3.2
|
||||
|
||||
INSTALLED_APPS = (
|
||||
"django.contrib.admin",
|
||||
"django.contrib.auth", # includes the url redirections for login, logout
|
||||
"django.contrib.contenttypes",
|
||||
"django.contrib.sessions",
|
||||
"django.contrib.messages",
|
||||
"django.contrib.admindocs",
|
||||
"django.forms", # Required to customise widget templates
|
||||
# 'django.contrib.staticfiles', # We put our CSS etc explicitly in the right place so do not need this
|
||||
"troggle.core",
|
||||
)
|
||||
|
||||
FORM_RENDERER = "django.forms.renderers.TemplatesSetting" # Required to customise widget templates
|
||||
|
||||
# See the recommended order of these in https://docs.djangoproject.com/en/dev/ref/middleware/
|
||||
# Note that this is a radically different onion architecture from earlier versions though it looks the same,
|
||||
# see https://docs.djangoproject.com/en/dev/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware
|
||||
# Seriously, read this: https://www.webforefront.com/django/middlewaredjango.html which is MUCH BETTER than the docs
|
||||
MIDDLEWARE = [
|
||||
#'django.middleware.security.SecurityMiddleware', # SECURE_SSL_REDIRECT and SECURE_SSL_HOST # we don't use this
|
||||
"django.middleware.gzip.GZipMiddleware", # not needed when expofiles and photos served by apache
|
||||
"django.contrib.sessions.middleware.SessionMiddleware", # Manages sessions, if CSRF_USE_SESSIONS then it needs to be early
|
||||
"django.middleware.common.CommonMiddleware", # DISALLOWED_USER_AGENTS, APPEND_SLASH and PREPEND_WWW
|
||||
"django.middleware.csrf.CsrfViewMiddleware", # Cross Site Request Forgeries by adding hidden form fields to POST
|
||||
"django.contrib.auth.middleware.AuthenticationMiddleware", # Adds the user attribute, representing the currently-logged-in user
|
||||
"django.contrib.admindocs.middleware.XViewMiddleware", # this and docutils needed by admindocs
|
||||
"django.contrib.messages.middleware.MessageMiddleware", # Cookie-based and session-based message support. Needed by admin system
|
||||
"django.middleware.clickjacking.XFrameOptionsMiddleware", # clickjacking protection via the X-Frame-Options header
|
||||
#'django.middleware.security.SecurityMiddleware', # SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, SECURE_BROWSER_XSS_FILTER, SECURE_REFERRER_POLICY, and SECURE_SSL_REDIRECT
|
||||
#'troggle.core.middleware.SmartAppendSlashMiddleware' # needs adapting after Dj2.0
|
||||
]
|
||||
|
||||
ROOT_URLCONF = "troggle.urls"
|
||||
|
||||
WSGI_APPLICATION = "troggle.wsgi.application" # change to asgi as soon as we upgrade to Django 3.0
|
||||
|
||||
ACCOUNT_ACTIVATION_DAYS = 3
|
||||
|
||||
# AUTH_PROFILE_MODULE = 'core.person' # used by removed profiles app ?
|
||||
|
||||
QM_PATTERN = "\[\[\s*[Qq][Mm]:([ABC]?)(\d{4})-(\d*)-(\d*)\]\]"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
|
||||
TEST_RUNNER = "django.test.runner.DiscoverRunner"
|
||||
|
||||
from localsettings import *
|
||||
|
||||
# localsettings needs to take precedence. Call it to override any existing vars.
|
||||
147
_deploy/debian-laptops/settings2023-04-23.py
Normal file
147
_deploy/debian-laptops/settings2023-04-23.py
Normal file
@@ -0,0 +1,147 @@
|
||||
"""
|
||||
Django settings for troggle project.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/dev/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/dev/ref/settings/
|
||||
"""
|
||||
# Imports should be grouped in the following order:
|
||||
|
||||
# 1.Standard library imports.
|
||||
# 2.Related third party imports.
|
||||
# 3.Local application/library specific imports.
|
||||
# 4.You should put a blank line between each group of imports.
|
||||
|
||||
|
||||
|
||||
print("* importing troggle/settings.py")
|
||||
|
||||
# default value, then gets overwritten by real secrets
|
||||
SECRET_KEY = "not-the-real-secret-key-a#vaeozn0---^fj!355qki*vj2"
|
||||
|
||||
GIT = "git" # command for running git
|
||||
|
||||
# Note that this builds upon the django system installed
|
||||
# global settings in
|
||||
# django/conf/global_settings.py which is automatically loaded first.
|
||||
# read https://docs.djangoproject.com/en/dev/topics/settings/
|
||||
|
||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||
# BASE_DIR = os.path.dirname(os.path.dirname(__file__))
|
||||
|
||||
# Django settings for troggle project.
|
||||
|
||||
ALLOWED_HOSTS = ["*", "expo.survex.com", ".survex.com", "localhost", "127.0.0.1", "192.168.0.5"]
|
||||
|
||||
ADMINS = (
|
||||
# ('Your Name', 'your_email@domain.com'),
|
||||
)
|
||||
MANAGERS = ADMINS
|
||||
|
||||
# LOGIN_URL = '/accounts/login/' # this is the default value so does not need to be set
|
||||
|
||||
# Local time zone for this installation. Choices can be found here:
|
||||
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||
# although not all choices may be available on all operating systems.
|
||||
# If running in a Windows environment this must be set to the same as your
|
||||
# system time zone.
|
||||
USE_TZ = True
|
||||
TIME_ZONE = "Europe/London"
|
||||
|
||||
# Language code for this installation. All choices can be found here:
|
||||
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||
LANGUAGE_CODE = "en-uk"
|
||||
|
||||
SITE_ID = 1
|
||||
|
||||
# If you set this to False, Django will make some optimizations so as not
|
||||
# to load the internationalization machinery.
|
||||
USE_I18N = True
|
||||
USE_L10N = True
|
||||
|
||||
FIX_PERMISSIONS = []
|
||||
|
||||
# top-level survex file basename (without .svx)
|
||||
SURVEX_TOPNAME = "1623-and-1626-no-schoenberg-hs"
|
||||
|
||||
|
||||
# Caves for which survex files exist, but are not otherwise registered
|
||||
# replaced (?) by expoweb/cave_data/pendingcaves.txt
|
||||
# PENDING = ["1626-361", "2007-06", "2009-02",
|
||||
# "2012-ns-01", "2012-ns-02", "2010-04", "2012-ns-05", "2012-ns-06",
|
||||
# "2012-ns-07", "2012-ns-08", "2012-ns-12", "2012-ns-14", "2012-ns-15", "2014-bl888",
|
||||
# "2018-pf-01", "2018-pf-02"]
|
||||
|
||||
APPEND_SLASH = (
|
||||
False # never relevant because we have urls that match unknown files and produce an 'edit this page' response
|
||||
)
|
||||
SMART_APPEND_SLASH = True # not eorking as middleware different after Dj2.0
|
||||
|
||||
|
||||
LOGIN_REDIRECT_URL = "/" # does not seem to have any effect
|
||||
|
||||
SECURE_CONTENT_TYPE_NOSNIFF = True
|
||||
SECURE_BROWSER_XSS_FILTER = True
|
||||
# SESSION_COOKIE_SECURE = True # if enabled, cannot login to Django control panel, bug elsewhere?
|
||||
# CSRF_COOKIE_SECURE = True # if enabled only sends cookies over SSL
|
||||
X_FRAME_OPTIONS = "DENY" # changed to "DENY" after I eliminated all the iframes e.g. /xmlvalid.html
|
||||
|
||||
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # from Django 3.2
|
||||
|
||||
INSTALLED_APPS = (
|
||||
"django.contrib.admin",
|
||||
"django.contrib.auth", # includes the url redirections for login, logout
|
||||
"django.contrib.contenttypes",
|
||||
"django.contrib.sessions",
|
||||
"django.contrib.messages",
|
||||
"django.contrib.admindocs",
|
||||
"django.forms", # Required to customise widget templates
|
||||
# 'django.contrib.staticfiles', # We put our CSS etc explicitly in the right place so do not need this
|
||||
"troggle.core",
|
||||
)
|
||||
|
||||
FORM_RENDERER = "django.forms.renderers.TemplatesSetting" # Required to customise widget templates
|
||||
|
||||
# See the recommended order of these in https://docs.djangoproject.com/en/dev/ref/middleware/
|
||||
# Note that this is a radically different onion architecture from earlier versions though it looks the same,
|
||||
# see https://docs.djangoproject.com/en/dev/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware
|
||||
# Seriously, read this: https://www.webforefront.com/django/middlewaredjango.html which is MUCH BETTER than the docs
|
||||
MIDDLEWARE = [
|
||||
#'django.middleware.security.SecurityMiddleware', # SECURE_SSL_REDIRECT and SECURE_SSL_HOST # we don't use this
|
||||
"django.middleware.gzip.GZipMiddleware", # not needed when expofiles and photos served by apache
|
||||
"django.contrib.sessions.middleware.SessionMiddleware", # Manages sessions, if CSRF_USE_SESSIONS then it needs to be early
|
||||
"django.middleware.common.CommonMiddleware", # DISALLOWED_USER_AGENTS, APPEND_SLASH and PREPEND_WWW
|
||||
"django.middleware.csrf.CsrfViewMiddleware", # Cross Site Request Forgeries by adding hidden form fields to POST
|
||||
"django.contrib.auth.middleware.AuthenticationMiddleware", # Adds the user attribute, representing the currently-logged-in user
|
||||
"django.contrib.admindocs.middleware.XViewMiddleware", # this and docutils needed by admindocs
|
||||
"django.contrib.messages.middleware.MessageMiddleware", # Cookie-based and session-based message support. Needed by admin system
|
||||
"django.middleware.clickjacking.XFrameOptionsMiddleware", # clickjacking protection via the X-Frame-Options header
|
||||
#'django.middleware.security.SecurityMiddleware', # SECURE_HSTS_SECONDS, SECURE_CONTENT_TYPE_NOSNIFF, SECURE_BROWSER_XSS_FILTER, SECURE_REFERRER_POLICY, and SECURE_SSL_REDIRECT
|
||||
#'troggle.core.middleware.SmartAppendSlashMiddleware' # needs adapting after Dj2.0
|
||||
]
|
||||
|
||||
ROOT_URLCONF = "troggle.urls"
|
||||
|
||||
WSGI_APPLICATION = "troggle.wsgi.application" # change to asgi as soon as we upgrade to Django 3.0
|
||||
|
||||
ACCOUNT_ACTIVATION_DAYS = 3
|
||||
|
||||
# AUTH_PROFILE_MODULE = 'core.person' # used by removed profiles app ?
|
||||
|
||||
QM_PATTERN = "\[\[\s*[Qq][Mm]:([ABC]?)(\d{4})-(\d*)-(\d*)\]\]"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
|
||||
TEST_RUNNER = "django.test.runner.DiscoverRunner"
|
||||
|
||||
from localsettings import *
|
||||
|
||||
# localsettings needs to take precedence. Call it to override any existing vars.
|
||||
173
_deploy/debian-laptops/venv-trog-crowley.sh
Normal file
173
_deploy/debian-laptops/venv-trog-crowley.sh
Normal file
@@ -0,0 +1,173 @@
|
||||
#!/bin/bash
|
||||
# Crowley has python 3.9.2
|
||||
# Taken from: footled lots to make this work with python 3.10 & 3.11 and WSL1 and WSL2 on Ubuntu 22.04
|
||||
# Run this in a terminal in the troggle directory: 'bash venv-trog-crowley.sh'
|
||||
echo '-- DONT RUN THIS - messes up permissions!'
|
||||
|
||||
|
||||
echo '-- Run this in a terminal in the real troggle directory: "bash venv-trog-crowley.sh"'
|
||||
# use the script os-trog-crowley.sh
|
||||
|
||||
# If you are using Debian, then stick with the default version of python
|
||||
# If you are using Ubuntu, then it is easy to use a later version of python, e.g. 3.11
|
||||
|
||||
|
||||
# NOW we set up troggle
|
||||
PYTHON=python3.9
|
||||
VENAME=p9d4 # python3.x and django 4
|
||||
echo "** You are logged in as `id -u -n`"
|
||||
echo "The 50MB pip cache will be in /home/`id -u -n`/.cache/"
|
||||
echo "The 150MB venv will created in /home/`id -u -n`/$VENAME/"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder (this script location): ${TROGDIR}"
|
||||
|
||||
if [ -d requirements.txt ]; then
|
||||
echo "-- No requirements.txt found. Copy it from your most recent installation."
|
||||
exit 1
|
||||
fi
|
||||
echo ## Using requirements.txt :
|
||||
cat requirements.txt
|
||||
echo ##
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
|
||||
# NOTE that when using a later or earlier verison of python, you MUST also
|
||||
# use the allowed version of Pillow, see https://pillow.readthedocs.io/en/latest/installation.html
|
||||
|
||||
# NOW set up link from expo user folder
|
||||
# needed for WSL2
|
||||
echo Creating links from Linux filesystem user
|
||||
# These links only need making once, for many venv
|
||||
cd ~
|
||||
|
||||
if [ ! -d $VENAME ]; then
|
||||
echo "## Creating venv $VENAME. (If this fails with a pip error, you need to ensure you have python3.11-venv installed and/or use a Ubuntu window)"
|
||||
$PYTHON -m venv $VENAME
|
||||
else
|
||||
echo "## /$VENAME/ already exists ! Delete it first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Activate the virtual env and see what the default packages are
|
||||
echo "### Activating $VENAME"
|
||||
|
||||
cd $VENAME
|
||||
echo "-- now in: ${PWD}"
|
||||
source bin/activate
|
||||
echo "### Activated."
|
||||
# update local version of pip, more recent than OS version
|
||||
# debian bullseye installs pip 20.3.4 which barfs, we want >22.0.3
|
||||
|
||||
# update local version of setuptools, more recent than OS version, needed for packages without wheels
|
||||
|
||||
echo "### installing later version of pip inside $VENAME"
|
||||
$PYTHON -m pip install --upgrade pip
|
||||
$PYTHON -m pip install --upgrade setuptools
|
||||
|
||||
PIP=pip
|
||||
|
||||
$PIP list > original-pip.list
|
||||
$PIP freeze >original.txt
|
||||
|
||||
# we are in /home/$USER/$VENAME/
|
||||
ln -s ${TROGDIR} troggle
|
||||
ln -s ${TROGDIR}/../expoweb expoweb
|
||||
ln -s ${TROGDIR}/../loser loser
|
||||
ln -s ${TROGDIR}/../drawings drawings
|
||||
|
||||
# fudge for philip's machine
|
||||
if [ -d ${TROGDIR}/../expofiles ]; then
|
||||
ln -s ${TROGDIR}/../expofiles expofiles
|
||||
else
|
||||
if [ ! -d /mnt/f/expofiles ]; then
|
||||
sudo mkdir /mnt/f
|
||||
sudo mount -t drvfs F: /mnt/f
|
||||
else
|
||||
ln -s /mnt/f/expofiles expofiles
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "### Setting file permissions.. may take a while.."
|
||||
git config --global --add safe.directory '*'
|
||||
#sudo chmod -R 0777 *
|
||||
|
||||
echo "### links to expoweb, troggle etc. complete:"
|
||||
ls -tla
|
||||
|
||||
echo "###"
|
||||
echo "### now installing ${TROGDIR}/requirements.txt"
|
||||
echo "###"
|
||||
|
||||
# NOW THERE IS A PERMISSIONS FAILURE THAT DIDN'T HAPPEN BEFORE
|
||||
# seen on wsl2 as well as wsl1
|
||||
# which ALSO ruins EXISTING permissions !
|
||||
# Guessing it is to do with pip not liking non-standard py 3.11 installation on Ubuntu 22.04
|
||||
|
||||
$PIP install -r ${TROGDIR}/requirements.txt
|
||||
echo '### install from requirements.txt completed.'
|
||||
echo '### '
|
||||
|
||||
$PIP freeze > requirements.txt
|
||||
# so that we can track requirements more easily with git
|
||||
# because we do not install these with pip, but they are listed by the freeze command
|
||||
# Now find out what we actually installed by subtracting the stuff venv installed anyway
|
||||
sort original.txt > 1
|
||||
sort requirements.txt >2
|
||||
comm -3 1 2 --check-order | awk '{ print $1}'>fresh-requirements.txt
|
||||
rm 1
|
||||
rm 2
|
||||
|
||||
cp requirements.txt requirements-$VENAME.txt
|
||||
cp requirements-$VENAME.txt troggle/requirements-$VENAME.txt
|
||||
|
||||
$PIP list > installed-pip.list
|
||||
$PIP list -o > installed-pip-o.list
|
||||
|
||||
REQ=installation-record
|
||||
mkdir $REQ
|
||||
mv requirements-$VENAME.txt $REQ
|
||||
mv original.txt $REQ
|
||||
mv requirements.txt $REQ
|
||||
mv original-pip.list $REQ
|
||||
mv installed-pip.list $REQ
|
||||
mv installed-pip-o.list $REQ
|
||||
cp fresh-requirements.txt ../requirements.txt
|
||||
mv fresh-requirements.txt $REQ
|
||||
cp troggle/`basename "$0"` $REQ
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
python --version
|
||||
echo "Django version:`django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/$VENAME'
|
||||
'source bin/activate'
|
||||
'cd troggle'
|
||||
'django-admin'
|
||||
'python manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
## the tests may ALSO fail because of ssh and permissions errors
|
||||
# Ran 85 tests in 83.492s
|
||||
# FAILED (failures=5)
|
||||
## So you will need to run
|
||||
#$sudo chown -Rhv philip:philip ~/$VENAME (if your username is philip)
|
||||
# and then REBOOT (or at least, exit WSL and terminate and restart WSL)
|
||||
# because this chmod only takes effect then.
|
||||
|
||||
'./pre-run.sh' (runs the migrations and then the tests)
|
||||
|
||||
'python databaseReset.py reset $VENAME'
|
||||
'python manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
if [ ! -d /mnt/f/expofiles ]; then
|
||||
echo '### No valid expofiles directory. Fix this before any tests will work.
|
||||
fi
|
||||
227
_deploy/debian-server/apache2.conf
Normal file
227
_deploy/debian-server/apache2.conf
Normal file
@@ -0,0 +1,227 @@
|
||||
# This is the main Apache server configuration file. It contains the
|
||||
# configuration directives that give the server its instructions.
|
||||
# See http://httpd.apache.org/docs/2.4/ for detailed information about
|
||||
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
|
||||
# hints.
|
||||
#
|
||||
#
|
||||
# Summary of how the Apache 2 configuration works in Debian:
|
||||
# The Apache 2 web server configuration in Debian is quite different to
|
||||
# upstream's suggested way to configure the web server. This is because Debian's
|
||||
# default Apache2 installation attempts to make adding and removing modules,
|
||||
# virtual hosts, and extra configuration directives as flexible as possible, in
|
||||
# order to make automating the changes and administering the server as easy as
|
||||
# possible.
|
||||
|
||||
# It is split into several files forming the configuration hierarchy outlined
|
||||
# below, all located in the /etc/apache2/ directory:
|
||||
#
|
||||
# /etc/apache2/
|
||||
# |-- apache2.conf
|
||||
# | `-- ports.conf
|
||||
# |-- mods-enabled
|
||||
# | |-- *.load
|
||||
# | `-- *.conf
|
||||
# |-- conf-enabled
|
||||
# | `-- *.conf
|
||||
# `-- sites-enabled
|
||||
# `-- *.conf
|
||||
#
|
||||
#
|
||||
# * apache2.conf is the main configuration file (this file). It puts the pieces
|
||||
# together by including all remaining configuration files when starting up the
|
||||
# web server.
|
||||
#
|
||||
# * ports.conf is always included from the main configuration file. It is
|
||||
# supposed to determine listening ports for incoming connections which can be
|
||||
# customized anytime.
|
||||
#
|
||||
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
|
||||
# directories contain particular configuration snippets which manage modules,
|
||||
# global configuration fragments, or virtual host configurations,
|
||||
# respectively.
|
||||
#
|
||||
# They are activated by symlinking available configuration files from their
|
||||
# respective *-available/ counterparts. These should be managed by using our
|
||||
# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
|
||||
# their respective man pages for detailed information.
|
||||
#
|
||||
# * The binary is called apache2. Due to the use of environment variables, in
|
||||
# the default configuration, apache2 needs to be started/stopped with
|
||||
# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
|
||||
# work with the default configuration.
|
||||
|
||||
|
||||
# Global configuration
|
||||
#
|
||||
|
||||
#
|
||||
# ServerRoot: The top of the directory tree under which the server's
|
||||
# configuration, error, and log files are kept.
|
||||
#
|
||||
# NOTE! If you intend to place this on an NFS (or otherwise network)
|
||||
# mounted filesystem then please read the Mutex documentation (available
|
||||
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
|
||||
# you will save yourself a lot of trouble.
|
||||
#
|
||||
# Do NOT add a slash at the end of the directory path.
|
||||
#
|
||||
#ServerRoot "/etc/apache2"
|
||||
|
||||
#
|
||||
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
|
||||
#
|
||||
#Mutex file:${APACHE_LOCK_DIR} default
|
||||
|
||||
#
|
||||
# The directory where shm and other runtime files will be stored.
|
||||
#
|
||||
|
||||
DefaultRuntimeDir ${APACHE_RUN_DIR}
|
||||
|
||||
#
|
||||
# PidFile: The file in which the server should record its process
|
||||
# identification number when it starts.
|
||||
# This needs to be set in /etc/apache2/envvars
|
||||
#
|
||||
PidFile ${APACHE_PID_FILE}
|
||||
|
||||
#
|
||||
# Timeout: The number of seconds before receives and sends time out.
|
||||
#
|
||||
Timeout 300
|
||||
|
||||
#
|
||||
# KeepAlive: Whether or not to allow persistent connections (more than
|
||||
# one request per connection). Set to "Off" to deactivate.
|
||||
#
|
||||
KeepAlive On
|
||||
|
||||
#
|
||||
# MaxKeepAliveRequests: The maximum number of requests to allow
|
||||
# during a persistent connection. Set to 0 to allow an unlimited amount.
|
||||
# We recommend you leave this number high, for maximum performance.
|
||||
#
|
||||
MaxKeepAliveRequests 100
|
||||
|
||||
#
|
||||
# KeepAliveTimeout: Number of seconds to wait for the next request from the
|
||||
# same client on the same connection.
|
||||
#
|
||||
KeepAliveTimeout 5
|
||||
|
||||
|
||||
# These need to be set in /etc/apache2/envvars
|
||||
User ${APACHE_RUN_USER}
|
||||
Group ${APACHE_RUN_GROUP}
|
||||
|
||||
#
|
||||
# HostnameLookups: Log the names of clients or just their IP addresses
|
||||
# e.g., www.apache.org (on) or 204.62.129.132 (off).
|
||||
# The default is off because it'd be overall better for the net if people
|
||||
# had to knowingly turn this feature on, since enabling it means that
|
||||
# each client request will result in AT LEAST one lookup request to the
|
||||
# nameserver.
|
||||
#
|
||||
HostnameLookups Off
|
||||
|
||||
# ErrorLog: The location of the error log file.
|
||||
# If you do not specify an ErrorLog directive within a <VirtualHost>
|
||||
# container, error messages relating to that virtual host will be
|
||||
# logged here. If you *do* define an error logfile for a <VirtualHost>
|
||||
# container, that host's errors will be logged there and not here.
|
||||
#
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
|
||||
#
|
||||
# LogLevel: Control the severity of messages logged to the error_log.
|
||||
# Available values: trace8, ..., trace1, debug, info, notice, warn,
|
||||
# error, crit, alert, emerg.
|
||||
# It is also possible to configure the log level for particular modules, e.g.
|
||||
# "LogLevel info ssl:warn"
|
||||
#
|
||||
LogLevel warn
|
||||
|
||||
# Include module configuration:
|
||||
IncludeOptional mods-enabled/*.load
|
||||
IncludeOptional mods-enabled/*.conf
|
||||
|
||||
# Include list of ports to listen on
|
||||
Include ports.conf
|
||||
|
||||
|
||||
# Sets the default security model of the Apache2 HTTPD server. It does
|
||||
# not allow access to the root filesystem outside of /usr/share and /var/www.
|
||||
# The former is used by web applications packaged in Debian,
|
||||
# the latter may be used for local directories served by the web server. If
|
||||
# your system is serving content from a sub-directory in /srv you must allow
|
||||
# access here, or in any related virtual host.
|
||||
<Directory />
|
||||
Options FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all denied
|
||||
</Directory>
|
||||
|
||||
<Directory /usr/share>
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
<Directory /var/www/>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
#<Directory /srv/>
|
||||
# Options Indexes FollowSymLinks
|
||||
# AllowOverride None
|
||||
# Require all granted
|
||||
#</Directory>
|
||||
|
||||
|
||||
|
||||
|
||||
# AccessFileName: The name of the file to look for in each directory
|
||||
# for additional configuration directives. See also the AllowOverride
|
||||
# directive.
|
||||
#
|
||||
AccessFileName .htaccess
|
||||
|
||||
#
|
||||
# The following lines prevent .htaccess and .htpasswd files from being
|
||||
# viewed by Web clients.
|
||||
#
|
||||
<FilesMatch "^\.ht">
|
||||
Require all denied
|
||||
</FilesMatch>
|
||||
|
||||
|
||||
#
|
||||
# The following directives define some format nicknames for use with
|
||||
# a CustomLog directive.
|
||||
#
|
||||
# These deviate from the Common Log Format definitions in that they use %O
|
||||
# (the actual bytes sent including headers) instead of %b (the size of the
|
||||
# requested file), because the latter makes it impossible to detect partial
|
||||
# requests.
|
||||
#
|
||||
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
|
||||
# Use mod_remoteip instead.
|
||||
#
|
||||
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
|
||||
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
|
||||
LogFormat "%h %l %u %t \"%r\" %>s %O" common
|
||||
LogFormat "%{Referer}i -> %U" referer
|
||||
LogFormat "%{User-agent}i" agent
|
||||
|
||||
# Include of directories ignores editors' and dpkg's backup files,
|
||||
# see README.Debian for details.
|
||||
|
||||
# Include generic snippets of statements
|
||||
IncludeOptional conf-enabled/*.conf
|
||||
|
||||
# Include the virtual host configurations:
|
||||
IncludeOptional sites-enabled/*.conf
|
||||
|
||||
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
|
||||
22
_deploy/debian-server/credentials.py
Normal file
22
_deploy/debian-server/credentials.py
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
from secret_credentials import *
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4", # To permit emojis in logbook entries and elsewhere
|
||||
}, 'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : MARIADB_SERVER_PASSWORD, # Not used with sqlite3.
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
47
_deploy/debian-server/envvars
Normal file
47
_deploy/debian-server/envvars
Normal file
@@ -0,0 +1,47 @@
|
||||
# envvars - default environment variables for apache2ctl
|
||||
|
||||
# this won't be correct after changing uid
|
||||
unset HOME
|
||||
|
||||
# for supporting multiple apache2 instances
|
||||
if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
|
||||
SUFFIX="-${APACHE_CONFDIR##/etc/apache2-}"
|
||||
else
|
||||
SUFFIX=
|
||||
fi
|
||||
|
||||
# Since there is no sane way to get the parsed apache2 config in scripts, some
|
||||
# settings are defined via environment variables and then used in apache2ctl,
|
||||
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
|
||||
export APACHE_RUN_USER=expo
|
||||
export APACHE_RUN_GROUP=expo
|
||||
# temporary state file location. This might be changed to /run in Wheezy+1
|
||||
export APACHE_PID_FILE=/var/run/apache2$SUFFIX/apache2.pid
|
||||
export APACHE_RUN_DIR=/var/run/apache2$SUFFIX
|
||||
export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
|
||||
# Only /var/log/apache2 is handled by /etc/logrotate.d/apache2.
|
||||
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
|
||||
|
||||
## The locale used by some modules like mod_dav
|
||||
#export LANG=C
|
||||
## Uncomment the following line to use the system default locale instead:
|
||||
. /etc/default/locale
|
||||
|
||||
export LANG
|
||||
|
||||
## The command to get the status for 'apache2ctl status'.
|
||||
## Some packages providing 'www-browser' need '--dump' instead of '-dump'.
|
||||
#export APACHE_LYNX='www-browser -dump'
|
||||
|
||||
## If you need a higher file descriptor limit, uncomment and adjust the
|
||||
## following line (default is 8192):
|
||||
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'
|
||||
|
||||
## If you would like to pass arguments to the web server, add them below
|
||||
## to the APACHE_ARGUMENTS environment.
|
||||
#export APACHE_ARGUMENTS=''
|
||||
|
||||
## Enable the debug mode for maintainer scripts.
|
||||
## This will produce a verbose output on package installations of web server modules and web application
|
||||
## installations which interact with Apache
|
||||
#export APACHE2_MAINTSCRIPT_DEBUG=1
|
||||
179
_deploy/debian-server/localsettings-expo-live.py
Normal file
179
_deploy/debian-server/localsettings-expo-live.py
Normal file
@@ -0,0 +1,179 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
NOTE this file is out of sync with troggle/_deploy/wsl/localsettings.py
|
||||
which is the most recent version used in active maintenance. There should be
|
||||
essential differences, but there and many, many non-essential differences which
|
||||
should be eliminated for clarity and to use modern idioms.
|
||||
Edited 31/12/2024
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
from secret_credentials import *
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.net" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "django-test@klebos.net"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4", # To permit emojis in logbook entries and elsewhere
|
||||
}, 'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : MARIADB_SERVER_PASSWORD, # Not used with sqlite3.
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
REPOS_ROOT_PATH = '/home/expo/'
|
||||
sys.path.append(REPOS_ROOT_PATH)
|
||||
sys.path.append(REPOS_ROOT_PATH + 'troggle')
|
||||
# Define the path to the django app (troggle in this case)
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
|
||||
|
||||
PHOTOS_YEAR = "2024"
|
||||
# add in 358 when they don't make it crash horribly
|
||||
NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [
|
||||
PYTHON_PATH + "templates"
|
||||
],
|
||||
'OPTIONS': {
|
||||
'debug': 'DEBUG',
|
||||
'context_processors': [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
|
||||
'core.context.troggle_context', # in core/troggle.py
|
||||
'django.template.context_processors.debug',
|
||||
#'django.template.context_processors.request', # copy of current request, added in trying to make csrf work
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media', # includes a variable MEDIA_URL
|
||||
'django.template.context_processors.static', # includes a variable STATIC_URL
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader', #For each app, inc admin, in INSTALLED_APPS, loader looks for /templates
|
||||
# insert your own TEMPLATE_LOADERS here
|
||||
]
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
PUBLIC_SITE = True
|
||||
|
||||
# This should be False for normal running
|
||||
DEBUG = True
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
|
||||
# executables:
|
||||
CAVERN = 'cavern' # for parsing .svx files and producing .2d files
|
||||
SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
LIBDIR = Path(REPOS_ROOT_PATH) / 'lib' / PV
|
||||
|
||||
EXPOWEB = Path(REPOS_ROOT_PATH + 'expoweb/')
|
||||
SURVEYS = REPOS_ROOT_PATH
|
||||
SURVEY_SCANS = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
|
||||
FILES = REPOS_ROOT_PATH + 'expofiles'
|
||||
PHOTOS_ROOT = REPOS_ROOT_PATH + 'expofiles/photos/'
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / 'templates'
|
||||
MEDIA_ROOT = TROGGLE_PATH / 'media'
|
||||
JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
|
||||
|
||||
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
|
||||
|
||||
#URL_ROOT = 'http://expo.survex.com/'
|
||||
URL_ROOT = '/'
|
||||
DIR_ROOT = Path("") #this should end in / if a value is given
|
||||
EXPOWEB_URL = '/'
|
||||
SURVEYS_URL = '/survey_scans/'
|
||||
|
||||
REPOS_ROOT_PATH = Path(REPOS_ROOT_PATH)
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles"
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos"
|
||||
|
||||
#EXPOFILES = urllib.parse.urljoin(REPOS_ROOT_PATH, 'expofiles/')
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
#PHOTOS_URL = urllib.parse.urljoin(URL_ROOT, '/photos/')
|
||||
|
||||
# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views_surveys.py
|
||||
MEDIA_URL = '/site_media/'
|
||||
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
LOGFILE = '/var/log/troggle/troggle.log' # hmm. Not used since 2022
|
||||
IMPORTLOGFILE = '/var/log/troggle/import.log' # hmm. Not used since 2022
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
164
_deploy/debian-server/localsettings.py
Normal file
164
_deploy/debian-server/localsettings.py
Normal file
@@ -0,0 +1,164 @@
|
||||
import os
|
||||
import sys
|
||||
import urllib.parse
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
NOTE this file is out of sync with troggle/_deploy/wsl/localsettings.py
|
||||
which is the most recent version used in active maintenance. There should be
|
||||
essential differences, but there and many, many non-essential differences which
|
||||
should be eliminated for clarity and to use modern idioms.
|
||||
Edited 31/12/2024
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
# DO NOT check this file into the git repo - it contains real passwords.
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4", # To permit emojis in logbook entries and elsewhere
|
||||
},
|
||||
'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : 'not-the-real-password', # Not used with sqlite3.
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOUSERPASS = 'not-the-real-password'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOADMINUSERPASS = 'not-the-real-password'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
REPOS_ROOT_PATH = '/home/expo/'
|
||||
sys.path.append(REPOS_ROOT_PATH)
|
||||
sys.path.append(REPOS_ROOT_PATH + 'troggle')
|
||||
# Define the path to the django app (troggle in this case)
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
|
||||
|
||||
PHOTOS_YEAR = "2024"
|
||||
# add in 358 when they don't make it crash horribly
|
||||
NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [
|
||||
PYTHON_PATH + "templates"
|
||||
],
|
||||
'OPTIONS': {
|
||||
'debug': 'DEBUG',
|
||||
'context_processors': [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
|
||||
'core.context.troggle_context', # in core/troggle.py
|
||||
'django.template.context_processors.debug',
|
||||
#'django.template.context_processors.request', # copy of current request, added in trying to make csrf work
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media', # includes a variable MEDIA_URL
|
||||
'django.template.context_processors.static', # includes a variable STATIC_URL
|
||||
'django.template.context_processors.tz',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader',
|
||||
'django.template.loaders.app_directories.Loader', #For each app, inc admin, in INSTALLED_APPS, loader looks for /templates
|
||||
# insert your own TEMPLATE_LOADERS here
|
||||
]
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
PUBLIC_SITE = True
|
||||
|
||||
# This should be False for normal running
|
||||
DEBUG = True
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
|
||||
# executables:
|
||||
CAVERN = 'cavern' # for parsing .svx files and producing .2d files
|
||||
SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
LIBDIR = Path(REPOS_ROOT_PATH) / 'lib' / PV
|
||||
|
||||
EXPOWEB = Path(REPOS_ROOT_PATH + 'expoweb/')
|
||||
SURVEYS = REPOS_ROOT_PATH
|
||||
SURVEY_SCANS = REPOS_ROOT_PATH + 'expofiles/surveyscans/'
|
||||
FILES = REPOS_ROOT_PATH + 'expofiles'
|
||||
PHOTOS_ROOT = REPOS_ROOT_PATH + 'expofiles/photos/'
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / 'templates'
|
||||
MEDIA_ROOT = TROGGLE_PATH / 'media'
|
||||
JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
|
||||
|
||||
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH + 'troggle/'
|
||||
|
||||
|
||||
#URL_ROOT = 'http://expo.survex.com/'
|
||||
URL_ROOT = '/'
|
||||
DIR_ROOT = Path("") #this should end in / if a value is given
|
||||
EXPOWEB_URL = '/'
|
||||
SURVEYS_URL = '/survey_scans/'
|
||||
|
||||
REPOS_ROOT_PATH = Path(REPOS_ROOT_PATH)
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles"
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos"
|
||||
|
||||
#EXPOFILES = urllib.parse.urljoin(REPOS_ROOT_PATH, 'expofiles/')
|
||||
PHOTOS_URL = urllib.parse.urljoin(URL_ROOT, '/photos/')
|
||||
|
||||
# MEDIA_URL is used by urls.py in a regex. See urls.py & core/views_surveys.py
|
||||
MEDIA_URL = '/site_media/'
|
||||
|
||||
|
||||
STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = urllib.parse.urljoin(URL_ROOT , '/javascript/') # always fails, try to revive it ?
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
LOGFILE = '/var/log/troggle/troggle.log'
|
||||
IMPORTLOGFILE = '/var/log/troggle/import.log'
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
#STATIC_URL = str(STATIC_URL) + "/"
|
||||
#MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
190
_deploy/debian-server/serversetup
Normal file
190
_deploy/debian-server/serversetup
Normal file
@@ -0,0 +1,190 @@
|
||||
Instructions for setting up new expo debian server/VM
|
||||
|
||||
W says: Tue, Apr 23, 2024
|
||||
Javascript gets installed in /usr/share/javascript. You can find that out by asking dpkg: dpkg -S openlayers (or reading debian wiki for javascript packaging)
|
||||
If you use npm it just puts packages 'here' (i.e. in a node_packages dir in the current directory). I've been avoiding that so far.
|
||||
openlayers wasn't in the old prospecting map - that was just JPEGs. It was in the slippy map I never really got working properly. It's also in martin's map-app.
|
||||
But they were just examples of javascript packages.
|
||||
|
||||
|
||||
|
||||
=======
|
||||
See also http://expo.survex.com/handbook/troggle/serverconfig.html
|
||||
and troggle/README.txt
|
||||
|
||||
For Debian Bullseye (Debian 11) June 2022
|
||||
adduser expo
|
||||
apt install openssh-server mosh tmux mc zile emacs-nox mc most ncdu
|
||||
apt install python-django apache2 certbot mysql-server survex make rsync
|
||||
apt install libjs-openlayers
|
||||
apt install git mercurial
|
||||
(certbot does https certs)
|
||||
|
||||
for boe:
|
||||
apt install libcgi-session-perl libcrypt-passwdmd5-perl libfile-slurp-perl libgit-wrapper-perl libhtml-template-perl libhtml-template-pro-perl libmime-lite-perl libtext-password-pronounceable-perl libtime-parsedate-perl libuuid-tiny-perl libcrypt-cracklib-perl
|
||||
|
||||
setup apache configs for cucc and expo
|
||||
#disable default website
|
||||
a2dissite 000-default
|
||||
a2ensite cucc-ssl
|
||||
a2ensite expo-ssl
|
||||
#a2enmod cgid
|
||||
|
||||
Boe config:
|
||||
Alias /boe /home/expo/boe/boc/boc.pl
|
||||
<Directory /home/expo/boe/boc>
|
||||
AddHandler cgi-script .pl
|
||||
SetHandler cgi-script
|
||||
Options +ExecCGI
|
||||
Require all granted
|
||||
</Directory>
|
||||
And remember to set both program and data dir to be
|
||||
www-data:www-data
|
||||
(optionally make file group read/write by treasurer account)
|
||||
create empty repo by clicking create in boe interface
|
||||
then set names in 'settings'
|
||||
|
||||
Set up mysql (as root)
|
||||
mysql -p
|
||||
CREATE DATABASE troggle;
|
||||
GRANT ALL PRIVILEGES ON troggle.* TO 'expo'@'localhost' IDENTIFIED BY 'somepassword';
|
||||
|
||||
install django:
|
||||
sudo apt install python3-django python3-django-registration python3-django-imagekit python3-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi-py3
|
||||
|
||||
python-django-imagekit comes from https://salsa.debian.org/python-team/modules/python-django-imagekit
|
||||
python-django-tinymce comes from https://salsa.debian.org/python-team/modules/python-django-tinymce
|
||||
(both modified for stretch/python2). packages under /home/wookey/packages/
|
||||
|
||||
need fonts-freefont-ttf (to have truetype freesans available for troggle via PIL)
|
||||
need libapache2-mod-wsgi for apache wsgi support.
|
||||
|
||||
To keep bots from overloading server use mpm_event intead of mpm_worker
|
||||
sudo a2dismod mpm_prefork
|
||||
sudo a2enmod mpm_event
|
||||
|
||||
Also adjust the numbers in the config file (~/config/apache/mods-available/mpm_event.conf)
|
||||
for our tiddly server:
|
||||
StartServers 1
|
||||
MinSpareThreads 2
|
||||
MaxSpareThreads 15
|
||||
ThreadLimit 25
|
||||
ThreadsPerChild 5
|
||||
MaxRequestWorkers 25
|
||||
MaxConnectionsPerChild 500
|
||||
|
||||
Kanboard:
|
||||
debian python3-kanboard is a bit too simple, so use http://kanboard.org/ instead
|
||||
unpack release files into /home/expo/kanboard
|
||||
add this stanza to ~/config/apache/expo.conf
|
||||
Alias /kanboard /home/expo/kanboard
|
||||
<Directory /home/expo/kanboard>
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
Dependencies are php and php-bcmath
|
||||
php with mpm_worker and cgi is simple, but we are not using
|
||||
mpm_worker any more so this is not possible anyway.
|
||||
|
||||
php with mpm_event needs fpm mechanism and apache proxy_fcgi enabled
|
||||
This mechanism is a lot more efficient on the server.
|
||||
Good docs here: https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04
|
||||
|
||||
apt install php-fpm libapache2-mod-fcgid
|
||||
sudo a2dismod php7.4 (this normal config works via mpm_worker)
|
||||
sudo a2enconf php7.4-fpm (this one works with mpm_event via proxy magic)
|
||||
sudo a2enmod proxy
|
||||
sudo a2enmod proxy_fcgi
|
||||
|
||||
apt install php-bcmath (for kanboard)
|
||||
|
||||
|
||||
------------------------------
|
||||
For Debian Stretch, June 2019.
|
||||
-----------------------------
|
||||
adduser expo
|
||||
apt install openssh-server mosh tmux mc zile emacs-nox mc most ncdu
|
||||
apt install python-django apache2 mysql-server survex make rsync
|
||||
apt install libjs-openlayers make
|
||||
apt install git mercurial mercurial-server?
|
||||
|
||||
for boe:
|
||||
apt install libcgi-session-perl libcrypt-passwdmd5-perl libfile-slurp-perl libgit-wrapper-perl libhtml-template-perl libhtml-template-pro-perl libmime-lite-perl libtext-password-pronounceable-perl libtime-parsedate-perl libuuid-tiny-perl libcrypt-cracklib-perl
|
||||
|
||||
obsolete-packages:
|
||||
bins (move to jigl?) (for photos)
|
||||
python-django 1.7
|
||||
backports: survex therion
|
||||
not-packaged: caveview
|
||||
|
||||
make these dirs available at top documentroot:
|
||||
cuccfiles
|
||||
expofiles
|
||||
loser (link to repo)
|
||||
tunneldata (link to repo)
|
||||
troggle (link to repo)
|
||||
expoweb (link to repo)
|
||||
boc/boe
|
||||
|
||||
|
||||
config
|
||||
containing:
|
||||
|
||||
setup apache configs for cucc and expo
|
||||
#disable default website
|
||||
a2dissite 000-default
|
||||
a2ensite cucc
|
||||
a2ensite expo
|
||||
a2enmod cgid
|
||||
|
||||
|
||||
Boe config:
|
||||
Alias /boe /home/expo/boe/boc/boc.pl
|
||||
<Directory /home/expo/boe/boc>
|
||||
AddHandler cgi-script .pl
|
||||
SetHandler cgi-script
|
||||
Options +ExecCGI
|
||||
Require all granted
|
||||
</Directory>
|
||||
And remember to set both program and data dir to be
|
||||
www-data:www-data
|
||||
(optionally make file group read/write by treasurer account)
|
||||
create empty repo by clicking create in boe interface
|
||||
then set names in 'settings'
|
||||
|
||||
Set up mysql (as root)
|
||||
mysql -p
|
||||
CREATE DATABASE troggle;
|
||||
GRANT ALL PRIVILEGES ON troggle.* TO 'expo'@'localhost' IDENTIFIED BY 'somepassword';
|
||||
|
||||
install django:
|
||||
NO!
|
||||
This was:sudo apt install python-django python-django-registration python-django-imagekit python-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi
|
||||
Should be ?
|
||||
sudo apt install python-django python-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi
|
||||
|
||||
CHeck if this is correct:
|
||||
python-django-tinymce comes from https://salsa.debian.org/python-team/modules/python-django-tinymce
|
||||
(both modified for stretch/python2). packages under /home/wookey/packages/
|
||||
|
||||
need fonts-freefont-ttf (to have truetype freesans available for troggle via PIL)
|
||||
need libapache2-mod-wsgi for apache wsgi support.
|
||||
|
||||
On stretch the django 1.10 is no use so get rid of that:
|
||||
apt remove python3-django python-django python-django-common python-django-doc
|
||||
|
||||
Then replace with django 1.7 (Needs to be built for stretch)
|
||||
apt install python-django python-django-common python-django-doc
|
||||
apt install python-django-registration python-django-imagekit python-django-tinymce
|
||||
|
||||
then hold them to stop them being upgraded by unattended upgrades:
|
||||
echo "python-django hold" | sudo dpkg --set-selections
|
||||
echo "python-django-common hold" | sudo dpkg --set-selections
|
||||
echo "python-django-doc hold" | sudo dpkg --set-selections
|
||||
|
||||
#troggle has to have a writable logfile otherwise the website explodes
|
||||
# 500 error on the server, and apache error log has non-rentrant errors
|
||||
create /var/log/troggle/troggle.log
|
||||
chown www-data:adm /var/log/troggle/troggle.log
|
||||
chmod 660 /var/log/troggle/troggle.log
|
||||
7
_deploy/debian-server/sitecustomize.py
Normal file
7
_deploy/debian-server/sitecustomize.py
Normal file
@@ -0,0 +1,7 @@
|
||||
# install the apport exception handler if available
|
||||
try:
|
||||
import apport_python_hook
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
apport_python_hook.install()
|
||||
@@ -0,0 +1 @@
|
||||
see .gitignore for those files which DO contain the secret passwords
|
||||
@@ -1,5 +1,8 @@
|
||||
Instructions for setting up new expo debian server/VM
|
||||
For Debian Stretch, June 2019.
|
||||
W says: Tue, Apr 23, 2024
|
||||
Javascript gets installed in /usr/share/javascript. You can find that out by asking dpkg: dpkg -S openlayers (or reading debian wiki for javascript packaging)
|
||||
If you use npm it just puts packages 'here' (i.e. in a node_packages dir in the current directory). I've been avoiding that so far.
|
||||
openlayers wasn't in the old prospecting map - that was just JPEGs. It was in the slippy map I never really got working properly. It's also in martin's map-app.
|
||||
But they were just examples of javascript packages.
|
||||
|
||||
adduser expo
|
||||
apt install openssh-server mosh tmux mc zile emacs-nox mc most ncdu
|
||||
@@ -10,22 +13,25 @@ apt install git mercurial mercurial-server?
|
||||
for boe:
|
||||
apt install libcgi-session-perl libcrypt-passwdmd5-perl libfile-slurp-perl libgit-wrapper-perl libhtml-template-perl libhtml-template-pro-perl libmime-lite-perl libtext-password-pronounceable-perl libtime-parsedate-perl libuuid-tiny-perl libcrypt-cracklib-perl
|
||||
|
||||
obsolete-packages:
|
||||
bins (move to jigl?) (for photos)
|
||||
python-django 1.7
|
||||
apt install ufraw for PEF image decoding.
|
||||
sudo apt install python-django python-django-registration e fonts-freefont-ttf libapache2-mod-wsgi python3-gdbm
|
||||
# sudo apt install python-django-imagekit python-django-tinymc
|
||||
|
||||
obsolete-packages: bins (move to jigl?)
|
||||
older python-django?
|
||||
backports: survex therion
|
||||
not-packaged: caveview
|
||||
|
||||
|
||||
make these dirs available at top documentroot:
|
||||
cuccfiles
|
||||
expofiles
|
||||
loser (link to repo)
|
||||
tunneldata (link to repo)
|
||||
troggle (link to repo)
|
||||
expoweb (link to repo)
|
||||
loser
|
||||
tunneldata
|
||||
troggle
|
||||
expoweb
|
||||
boc/boe
|
||||
|
||||
|
||||
config
|
||||
containing:
|
||||
|
||||
@@ -55,13 +61,20 @@ Set up mysql (as root)
|
||||
mysql -p
|
||||
CREATE DATABASE troggle;
|
||||
GRANT ALL PRIVILEGES ON troggle.* TO 'expo'@'localhost' IDENTIFIED BY 'somepassword';
|
||||
Ctrl-D to exit
|
||||
|
||||
somepassword is set in localsettings.py
|
||||
sudo service mariadb stop
|
||||
sudo service mariadb start
|
||||
|
||||
to delete the database, it is
|
||||
DROP DATABASE troggle;
|
||||
|
||||
install django:
|
||||
sudo apt install python-django python-django-registration python-django-imagekit python-django-tinymce fonts-freefont-ttf libapache2-mod-wsgi
|
||||
|
||||
python-django-imagekit comes from https://salsa.debian.org/python-team/modules/python-django-imagekit
|
||||
python-django-tinymce comes from https://salsa.debian.org/python-team/modules/python-django-tinymce
|
||||
(both modified for stretch/python2). packages under /home/wookey/packages/
|
||||
|
||||
need fonts-freefont-ttf (to have truetype freesans available for troggle via PIL)
|
||||
need libapache2-mod-wsgi for apache wsgi support.
|
||||
@@ -78,8 +91,19 @@ echo "python-django hold" | sudo dpkg --set-selections
|
||||
echo "python-django-common hold" | sudo dpkg --set-selections
|
||||
echo "python-django-doc hold" | sudo dpkg --set-selections
|
||||
|
||||
#troggle has to have a writable logfile otherwise the website explodes
|
||||
# 500 error on the server, and apache error log has non-rentrant errors
|
||||
create /var/log/troggle/troggle.log
|
||||
chown www-data:adm /var/log/troggle/troggle.log
|
||||
chmod 660 /var/log/troggle/troggle.log
|
||||
Optimizing server
|
||||
I've tweaked the apache and mysql settings to make them a bit more suitable for a small machine. Seems to have shaved 200MB or so off the idling footprint.
|
||||
https://www.narga.net/optimizing-apachephpmysql-low-memory-server/
|
||||
|
||||
(just discovered 'ab' for running apache performance tests - handy).
|
||||
|
||||
Do the edit to site-packages/django/db/backends/base.py
|
||||
to comment out the requirement for mysqlclient >1.3.13
|
||||
as we run perfectly happily with Django 2.2.19 & mysqlite 1.3.10
|
||||
:
|
||||
|
||||
version = Database.version_info
|
||||
#test nobbled by Wookey 2021-04-08 as 1.3.13 is not available on stable
|
||||
#if version < (1, 3, 13):
|
||||
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
# Running troggle on Docker
|
||||
|
||||
These notes written by Sam Wenham in Feb., 2019.
|
||||
These all pre-date the move to python3, later versions of Django (1.11.+) and debian.
|
||||
|
||||
## Install
|
||||
First you need to install
|
||||
- [docker-ce](https://docs.docker.com/install/)
|
||||
@@ -1,4 +1,5 @@
|
||||
import sys
|
||||
|
||||
# This is the local settings for use with the docker compose dev setup. It is imported automatically
|
||||
|
||||
DATABASES = {
|
||||
@@ -13,7 +14,7 @@ DATABASES = {
|
||||
}
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOUSERPASS = 'somepasshere'
|
||||
EXPOUSERPASS = "nnn:gggggg"
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
REPOS_ROOT_PATH = '/expo/'
|
||||
@@ -23,7 +24,7 @@ sys.path.append(REPOS_ROOT_PATH + 'troggle')
|
||||
PUBLIC_SITE = False
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH + 'loser/'
|
||||
TUNNEL_DATA = REPOS_ROOT_PATH + 'tunneldata/'
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH + 'drawings/'
|
||||
|
||||
CAVERN = 'cavern'
|
||||
THREEDTOPOS = '3dtopos'
|
||||
9
_deploy/docker/requirements.txt
Normal file
9
_deploy/docker/requirements.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
Django==1.7.11
|
||||
django-registration==2.1.2
|
||||
mysql
|
||||
#imagekit
|
||||
django-imagekit
|
||||
Image
|
||||
django-tinymce==2.7.0
|
||||
smartencoding
|
||||
unidecode
|
||||
@@ -6,3 +6,4 @@ django-imagekit
|
||||
Image
|
||||
django-tinymce==2.7.0
|
||||
smartencoding
|
||||
unidecode
|
||||
200
_deploy/okchai/localsettings-okchai.py
Normal file
200
_deploy/okchai/localsettings-okchai.py
Normal file
@@ -0,0 +1,200 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
from secret_credentials import *
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
# default values, real secrets will be imported from credentials.py in future
|
||||
|
||||
SQLITEFILE = "/home/philip/expo/troggle.sqlite" # can be ':memory:'
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'),
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
# FILES = Path('/mnt/d/expofiles/')
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles"
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos"
|
||||
PHOTOS_YEAR = "2023"
|
||||
NOTABLECAVESHREFS = ["290", "291", "264", "258", "204", "359", "76", "107"]
|
||||
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH / "troggle"
|
||||
LOGFILE = PYTHON_PATH / "troggle.log"
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||
# trailing slash if there is a path component (optional in other cases).
|
||||
MEDIA_URL = "/site-media/"
|
||||
|
||||
DIR_ROOT = Path("") # this should end in / if a value is given
|
||||
URL_ROOT = "/"
|
||||
# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
|
||||
|
||||
# Note that these constants are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
# executables:
|
||||
CAVERN = "cavern" # for parsing .svx files and producing .3d files
|
||||
SURVEXPORT = "survexport" # for parsing .3d files and producing .pos files
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# EXPOWEB_URL = "" # defunct, removed.
|
||||
# SCANS_URL = '/survey_scans/' # defunct, removed.
|
||||
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
sys.path.append(str(PYTHON_PATH))
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
|
||||
# TEST_RUNNER = "django.test.runner.DiscoverRunner"
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
22
_deploy/okchai/os-survey.sh
Normal file
22
_deploy/okchai/os-survey.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal : 'bash os-survey.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
sudo apt install survex-aven -y
|
||||
sudo apt install gpsprune qgis -y
|
||||
|
||||
|
||||
cd ~/expo
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
92
_deploy/okchai/os-trog24.04.sh
Normal file
92
_deploy/okchai/os-trog24.04.sh
Normal file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
# sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
ssh -V
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
|
||||
|
||||
# Already in Ubuntu 24.04 on WSL:
|
||||
# sudo apt install git -y
|
||||
# sudo apt install wget gpg
|
||||
# sudo apt install sftp -y
|
||||
# sudo apt install openssh-client -y
|
||||
# sudo apt install rsync
|
||||
|
||||
# Now using uv not pip:
|
||||
# sudo apt install python3-pip -y
|
||||
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install gedit -y
|
||||
sudo apt install tig gitg meld -y
|
||||
|
||||
# python formatting https://docs.astral.sh/ruff/
|
||||
sudo snap install ruff
|
||||
|
||||
# # do not actually use this any more
|
||||
# sudo useradd expo
|
||||
# sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
# sudo apt install python3-distutils -y
|
||||
|
||||
# install uv
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
|
||||
# We don't install the later version or the earlier versions of python - for dev and "sever mimic" environments
|
||||
# we leave that to uv to install now.
|
||||
|
||||
# In Dec.2024, the server is running 3.11 but dev work will be using 3.13
|
||||
# The setup of the virtual environment is done by troggle/_deploy/wsl/venv-trog.sh
|
||||
|
||||
# install VS code - but ONLY on a native ubuntu install, NOT in WSL
|
||||
# sudo apt install software-properties-common apt-transport-https
|
||||
# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||||
# sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||||
# sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||||
# sudo apt update
|
||||
# sudo apt install code
|
||||
|
||||
|
||||
mkdir ~/expo
|
||||
cd ~/expo
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
echo '### because you can't clone the repos without a key
|
||||
|
||||
git config --global user.email "philip.sargent@gmail.com"
|
||||
git config --global user.name "Philip Sargent"
|
||||
git config --global pull.rebase true
|
||||
|
||||
#Change this to clone using https?? at least for troggle?
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
git clone ssh://expo@expo.survex.com/home/expo/loser
|
||||
git clone ssh://expo@expo.survex.com/home/expo/expoweb
|
||||
git clone ssh://expo@expo.survex.com/home/expo/drawings
|
||||
|
||||
mkdir expofiles
|
||||
rsync -azv --delete-after --prune-empty-dirs expo@expo.survex.com:expofiles/surveyscans/ expofiles/surveyscans
|
||||
rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
|
||||
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
63
_deploy/okchai/pre-push.sh
Executable file
63
_deploy/okchai/pre-push.sh
Executable file
@@ -0,0 +1,63 @@
|
||||
#! /bin/bash
|
||||
# create and sanitise files for pushing to repo
|
||||
# catatrophically forgot to sanitize localsettingsWSL.py - oops.
|
||||
|
||||
#Make sure you have the WSL permissions system working, or you will push unsanitized files as this will fail
|
||||
# Philip Sargent 2022/04/12
|
||||
|
||||
HOSTNAME=`hostname`
|
||||
echo "** This copies file to _deploy/${HOSTNAME}/ !"
|
||||
cd ..
|
||||
|
||||
cd troggle
|
||||
echo `pwd`
|
||||
echo deprecations.
|
||||
|
||||
PYTHON="uv run"
|
||||
|
||||
source .venv/bin/activate
|
||||
python3 -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
|
||||
deactivate
|
||||
echo diffsettings.
|
||||
rm diffsettings.txt
|
||||
if test -f "diffsettings.txt"; then
|
||||
echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
|
||||
exit
|
||||
fi
|
||||
$PYTHON manage.py diffsettings | grep "###" > diffsettings.txt
|
||||
|
||||
echo inspectdb.
|
||||
# this next line requires database setting to be troggle.sqlite:
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
#egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo remove passwords.
|
||||
cp localsettings.py localsettings-${HOSTNAME}.py
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
|
||||
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
|
||||
|
||||
mkdir -p _deploy/${HOSTNAME}
|
||||
mv _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py.bak
|
||||
mv localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}
|
||||
cp *.sh _deploy/${HOSTNAME}
|
||||
|
||||
#
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# in ./pre-run.sh
|
||||
# $PYTHON reset-django.py
|
||||
# $PYTHON manage.py makemigrations
|
||||
# $PYTHON manage.py test
|
||||
# $PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -i "unable|error" troggle-inspectdb.py
|
||||
36
_deploy/okchai/pre-run.sh
Executable file
36
_deploy/okchai/pre-run.sh
Executable file
@@ -0,0 +1,36 @@
|
||||
#! /bin/bash
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# Need to be in an ALREADY activated venv
|
||||
PYTHON="python"
|
||||
|
||||
echo "** Run inspectdb:"
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo ""
|
||||
# count non-blank lines of python and template HTML code
|
||||
# includes all variants of settings.py files
|
||||
|
||||
# fix this as core/utils.py has 28,000 lines of numbers.
|
||||
find . -name \*.html -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-templates.txt
|
||||
|
||||
find . -name \*.py -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | grep -v "/migrations/" |grep -v "troggle-inspectdb.py"| awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-python.txt
|
||||
|
||||
echo "** Run reset-django.py - which deletes the database"
|
||||
# This deletes the database so must run after generating troggle-inspectdb.py
|
||||
$PYTHON reset-django.py
|
||||
echo "** After cleanup deletion, remake all migrations."
|
||||
$PYTHON manage.py makemigrations >/dev/null
|
||||
$PYTHON manage.py migrate
|
||||
|
||||
echo "** Now running self check"
|
||||
$PYTHON manage.py check -v 3 --deploy 2>security-warnings.txt >/dev/null
|
||||
$PYTHON manage.py check -v 3 --deploy
|
||||
|
||||
echo "** Now running test suite"
|
||||
# $PYTHON manage.py test -v 1
|
||||
|
||||
echo ""
|
||||
echo `tail -1 lines-of-python.txt` non-comment lines of python. But core/utils.py has 28,000 lines of numbers.
|
||||
echo `tail -1 lines-of-templates.txt` non-comment lines of HTML templates.
|
||||
|
||||
echo '** If you have an error running manage.py, maybe you are not in an activated venv ?'
|
||||
53
_deploy/okchai/venv-trog.sh
Normal file
53
_deploy/okchai/venv-trog.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# now using uv, unbelieveably simpler.
|
||||
# Run this in a terminal in ~/expo above the troggle directory: 'bash ~/expo/venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the directory above the troggle directory: "bash ~/expo/venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 24.04 with all the gubbins already installed
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog24.04.sh runniing it in /home/username/
|
||||
python3 --version
|
||||
cd ~/expo/troggle
|
||||
echo "-- EXPO folder [current directory]: `pwd`"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder: ${TROGDIR}"
|
||||
|
||||
cp dev.toml pyproject.toml
|
||||
cp ~/expo/troggle/_deploy/wsl/localsettingsWSL.py ~/expo/troggle/localsettings.py
|
||||
|
||||
uv self update
|
||||
uv sync
|
||||
|
||||
|
||||
# fudge for philip's laptop prior to M2 SSD upgrade
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
uv pip list
|
||||
|
||||
echo "Django version:`uv run django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/expo/troggle'
|
||||
'uv run django-admin'
|
||||
'uv run manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
|
||||
'uv run manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'uv run databaseReset.py reset INIT'
|
||||
'uv run manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
183
_deploy/pulsifer/localsettings-pulsifer.py
Normal file
183
_deploy/pulsifer/localsettings-pulsifer.py
Normal file
@@ -0,0 +1,183 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
from secret_credentials import *
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
# MARIADB_SERVER_PASSWORD =
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
# default values, real secrets will be imported from credentials.py in future
|
||||
|
||||
SQLITEFILE = str(Path(__file__).parent.parent / "troggle.sqlite") # can be ':memory:'
|
||||
print(f"SQLITEFILE is {SQLITEFILE}")
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'), # only on dev
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent # folder above troggle, expoweb, drawings, loser
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles" # sometimes on a different filesystem
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos" # sometimes on a different filesystem
|
||||
PHOTOS_YEAR = "2025"
|
||||
|
||||
KMZ_ICONS_PATH = REPOS_ROOT_PATH / "troggle" / "kmz_icons" # Google Earth export in /caves/
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT.
|
||||
# Note that MEDIA_URL and PHOTOS_URL are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
URL_ROOT = "/"
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
183
_deploy/pulsifer/localsettings-pulsifer.py.bak
Normal file
183
_deploy/pulsifer/localsettings-pulsifer.py.bak
Normal file
@@ -0,0 +1,183 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
from secret_credentials import *
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
# MARIADB_SERVER_PASSWORD =
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
# default values, real secrets will be imported from credentials.py in future
|
||||
|
||||
SQLITEFILE = str(Path(__file__).parent.parent / "troggle.sqlite") # can be ':memory:'
|
||||
print(f"SQLITEFILE is {SQLITEFILE}")
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'), # only on dev
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent # folder above troggle, expoweb, drawings, loser
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles" # sometimes on a different filesystem
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos" # sometimes on a different filesystem
|
||||
PHOTOS_YEAR = "2025"
|
||||
|
||||
KMZ_ICONS_PATH = REPOS_ROOT_PATH / "troggle" / "kmz_icons" # Google Earth export in /caves/
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT.
|
||||
# Note that MEDIA_URL and PHOTOS_URL are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
URL_ROOT = "/"
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
22
_deploy/pulsifer/os-survey.sh
Normal file
22
_deploy/pulsifer/os-survey.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal : 'bash os-survey.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
sudo apt install survex-aven -y
|
||||
sudo apt install gpsprune qgis -y
|
||||
|
||||
|
||||
cd ~/expo
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
92
_deploy/pulsifer/os-trog24.04.sh
Normal file
92
_deploy/pulsifer/os-trog24.04.sh
Normal file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
# sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
ssh -V
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
|
||||
|
||||
# Already in Ubuntu 24.04 on WSL:
|
||||
# sudo apt install git -y
|
||||
# sudo apt install wget gpg
|
||||
# sudo apt install sftp -y
|
||||
# sudo apt install openssh-client -y
|
||||
# sudo apt install rsync
|
||||
|
||||
# Now using uv not pip:
|
||||
# sudo apt install python3-pip -y
|
||||
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install gedit -y
|
||||
sudo apt install tig gitg meld -y
|
||||
|
||||
# python formatting https://docs.astral.sh/ruff/
|
||||
sudo snap install ruff
|
||||
|
||||
# # do not actually use this any more
|
||||
# sudo useradd expo
|
||||
# sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
# sudo apt install python3-distutils -y
|
||||
|
||||
# install uv
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
|
||||
# We don't install the later version or the earlier versions of python - for dev and "sever mimic" environments
|
||||
# we leave that to uv to install now.
|
||||
|
||||
# In Dec.2024, the server is running 3.11 but dev work will be using 3.13
|
||||
# The setup of the virtual environment is done by troggle/_deploy/wsl/venv-trog.sh
|
||||
|
||||
# install VS code - but ONLY on a native ubuntu install, NOT in WSL
|
||||
# sudo apt install software-properties-common apt-transport-https
|
||||
# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||||
# sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||||
# sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||||
# sudo apt update
|
||||
# sudo apt install code
|
||||
|
||||
|
||||
mkdir ~/expo
|
||||
cd ~/expo
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
echo '### because you can't clone the repos without a key
|
||||
|
||||
git config --global user.email "philip.sargent@gmail.com"
|
||||
git config --global user.name "Philip Sargent"
|
||||
git config --global pull.rebase true
|
||||
|
||||
#Change this to clone using https?? at least for troggle?
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
git clone ssh://expo@expo.survex.com/home/expo/loser
|
||||
git clone ssh://expo@expo.survex.com/home/expo/expoweb
|
||||
git clone ssh://expo@expo.survex.com/home/expo/drawings
|
||||
|
||||
mkdir expofiles
|
||||
rsync -azv --delete-after --prune-empty-dirs expo@expo.survex.com:expofiles/surveyscans/ expofiles/surveyscans
|
||||
rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
|
||||
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
63
_deploy/pulsifer/pre-push.sh
Executable file
63
_deploy/pulsifer/pre-push.sh
Executable file
@@ -0,0 +1,63 @@
|
||||
#! /bin/bash
|
||||
# create and sanitise files for pushing to repo
|
||||
# catatrophically forgot to sanitize localsettingsWSL.py - oops.
|
||||
|
||||
#Make sure you have the WSL permissions system working, or you will push unsanitized files as this will fail
|
||||
# Philip Sargent 2022/04/12
|
||||
|
||||
HOSTNAME=`hostname`
|
||||
echo "** This copies file to _deploy/${HOSTNAME}/ !"
|
||||
cd ..
|
||||
|
||||
cd troggle
|
||||
echo `pwd`
|
||||
echo deprecations.
|
||||
|
||||
PYTHON="uv run"
|
||||
|
||||
source .venv/bin/activate
|
||||
python3 -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
|
||||
deactivate
|
||||
echo diffsettings.
|
||||
rm diffsettings.txt
|
||||
if test -f "diffsettings.txt"; then
|
||||
echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
|
||||
exit
|
||||
fi
|
||||
$PYTHON manage.py diffsettings | grep "###" > diffsettings.txt
|
||||
|
||||
echo inspectdb.
|
||||
# this next line requires database setting to be troggle.sqlite:
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
#egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo remove passwords.
|
||||
cp localsettings.py localsettings-${HOSTNAME}.py
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
|
||||
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
|
||||
echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
|
||||
|
||||
mkdir -p _deploy/${HOSTNAME}
|
||||
mv _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py.bak
|
||||
mv localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}
|
||||
cp *.sh _deploy/${HOSTNAME}
|
||||
|
||||
#
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# in ./pre-run.sh
|
||||
# $PYTHON reset-django.py
|
||||
# $PYTHON manage.py makemigrations
|
||||
# $PYTHON manage.py test
|
||||
# $PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -i "unable|error" troggle-inspectdb.py
|
||||
36
_deploy/pulsifer/pre-run.sh
Executable file
36
_deploy/pulsifer/pre-run.sh
Executable file
@@ -0,0 +1,36 @@
|
||||
#! /bin/bash
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# Changed to use uv not pip, requires manage.py to have uv structured uv comment in it.
|
||||
PYTHON="uv run"
|
||||
|
||||
echo "** Run inspectdb:"
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo ""
|
||||
# count non-blank lines of python and template HTML code
|
||||
# includes all variants of settings.py files
|
||||
|
||||
# fix this as core/utils.py has 28,000 lines of numbers.
|
||||
find . -name \*.html -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-templates.txt
|
||||
|
||||
find . -name \*.py -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | grep -v "/migrations/" |grep -v "troggle-inspectdb.py"| awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-python.txt
|
||||
|
||||
echo "** Run reset-django.py - which deletes the database"
|
||||
# This deletes the database so must run after generating troggle-inspectdb.py
|
||||
$PYTHON reset-django.py
|
||||
echo "** After cleanup deletion, remake all migrations."
|
||||
$PYTHON manage.py makemigrations >/dev/null
|
||||
$PYTHON manage.py migrate
|
||||
|
||||
echo "** Now running self check"
|
||||
$PYTHON manage.py check -v 3 --deploy 2>security-warnings.txt >/dev/null
|
||||
$PYTHON manage.py check -v 3 --deploy
|
||||
|
||||
echo "** Now running test suite"
|
||||
# $PYTHON manage.py test -v 1
|
||||
|
||||
echo ""
|
||||
echo `tail -1 lines-of-python.txt` non-comment lines of python.
|
||||
echo `tail -1 lines-of-templates.txt` non-comment lines of HTML templates.
|
||||
|
||||
echo '** If you have an error running manage.py, maybe you are not in an activated venv ? or your manage.py is not managed by uv properly ?'
|
||||
53
_deploy/pulsifer/venv-trog.sh
Normal file
53
_deploy/pulsifer/venv-trog.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# now using uv, unbelieveably simpler.
|
||||
# Run this in a terminal in ~/expo above the troggle directory: 'bash ~/expo/venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the directory above the troggle directory: "bash ~/expo/venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 24.04 with all the gubbins already installed
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog24.04.sh runniing it in /home/username/
|
||||
python3 --version
|
||||
cd ~/expo/troggle
|
||||
echo "-- EXPO folder [current directory]: `pwd`"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder: ${TROGDIR}"
|
||||
|
||||
cp dev.toml pyproject.toml
|
||||
cp ~/expo/troggle/_deploy/wsl/localsettingsWSL.py ~/expo/troggle/localsettings.py
|
||||
|
||||
uv self update
|
||||
uv sync
|
||||
|
||||
|
||||
# fudge for philip's laptop prior to M2 SSD upgrade
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
uv pip list
|
||||
|
||||
echo "Django version:`uv run django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/expo/troggle'
|
||||
'uv run django-admin'
|
||||
'uv run manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
|
||||
'uv run manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'uv run databaseReset.py reset INIT'
|
||||
'uv run manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
24
_deploy/readme.txt
Normal file
24
_deploy/readme.txt
Normal file
@@ -0,0 +1,24 @@
|
||||
2024-12-15 Philip Sargent
|
||||
You will need your own localsettings.py but they are all out of date in these
|
||||
subdirectories except for /wsl/ . So copy that to /troggle/ and make your own
|
||||
edits to make it work with your own machine and file whereabouts.
|
||||
|
||||
- settings.py
|
||||
is common to all configurations,
|
||||
but these are different:
|
||||
- localsettings.py
|
||||
- dev.toml
|
||||
|
||||
2023-07-17 Philip Sargent
|
||||
|
||||
Trying to sort out configurations as we got into a bit of a mess on
|
||||
Expo in the last couple of weeks with two (notionally identical Debian
|
||||
Bullseye) expo laptops Crowley (which has local troggle installed and
|
||||
can run locally) and Aziraphale (has local copy of troggle repo but is
|
||||
not configured to run locally), Martin Green's laptop (Ubuntu 22.04.2),
|
||||
Philip's Barbie laptop Ubuntu 22.04.3). And of course the server itself
|
||||
expo.survex.com which is running Debian Bullseye. But most development
|
||||
recently had been done on Philip's two other machines, desktop and PC,
|
||||
both running Ubuntu on WSL on Windows and both using venv environments,
|
||||
which Crowley also does.
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import sys
|
||||
|
||||
# link localsettings to this file for use on expo computer in austria
|
||||
|
||||
# This will ALL NEED TO BE CHANGED to match localsettingsWSL / python3 / Django v2.2
|
||||
# This WILL NOT WORK as it is for an earlier version of Django
|
||||
# consult localsettingsWSL for updates required.
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
@@ -13,7 +18,7 @@ DATABASES = {
|
||||
}
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOUSERPASS = 'realpasshere'
|
||||
EXPOUSERPASS = "nnn:gggggg"
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
REPOS_ROOT_PATH = '/home/expo/expofiles/'
|
||||
@@ -24,7 +29,7 @@ sys.path.append(REPOS_ROOT_PATH + 'troggle')
|
||||
PUBLIC_SITE = False
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH + 'loser/'
|
||||
TUNNEL_DATA = REPOS_ROOT_PATH + 'tunneldata/'
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH + 'drawings/'
|
||||
THREEDCACHEDIR = REPOS_ROOT_PATH + 'expowebcache/3d/'
|
||||
|
||||
CAVERN = 'cavern'
|
||||
@@ -0,0 +1,3 @@
|
||||
The copy in this /_deploy/ folder may not be the latest if active development
|
||||
has been going on in the parent folder. Check there for a later copy of
|
||||
the localsettingsWSL file.
|
||||
18
_deploy/wsl/gitpull.sh
Executable file
18
_deploy/wsl/gitpull.sh
Executable file
@@ -0,0 +1,18 @@
|
||||
#! /bin/bash
|
||||
echo troggle
|
||||
cd ~/expo/troggle
|
||||
git pull
|
||||
|
||||
echo expoweb
|
||||
cd ../expoweb
|
||||
git pull
|
||||
|
||||
echo drawings
|
||||
cd ../drawings
|
||||
git pull
|
||||
|
||||
cd ../loser
|
||||
echo loser
|
||||
git pull
|
||||
|
||||
cd ../troggle
|
||||
182
_deploy/wsl/localsettingsWSL.py
Normal file
182
_deploy/wsl/localsettingsWSL.py
Normal file
@@ -0,0 +1,182 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
from secret_credentials import *
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
# MARIADB_SERVER_PASSWORD =
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
# default values, real secrets will be imported from credentials.py in future
|
||||
|
||||
SQLITEFILE = "/home/philip/expo/troggle.sqlite" # can be ':memory:'
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'), # only on dev
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent # folder above troggle, expoweb, drawings, loser
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles" # sometimes on a different filesystem
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos" # sometimes on a different filesystem
|
||||
PHOTOS_YEAR = "2025"
|
||||
|
||||
KMZ_ICONS_PATH = REPOS_ROOT_PATH / "troggle" / "kmz_icons" # Google Earth export in /caves/
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT.
|
||||
# Note that MEDIA_URL and PHOTOS_URL are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
URL_ROOT = "/"
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
182
_deploy/wsl/localsettingsWSL.py.bak
Normal file
182
_deploy/wsl/localsettingsWSL.py.bak
Normal file
@@ -0,0 +1,182 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOUSER_EMAIL = 'wookey@wookware.org'
|
||||
EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
|
||||
|
||||
from secret_credentials import *
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
# MARIADB_SERVER_PASSWORD =
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
|
||||
# -----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that secret_credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
# -----------------------------------------------------------------
|
||||
# default values, real secrets will be imported from credentials.py in future
|
||||
|
||||
SQLITEFILE = "/home/philip/expo/troggle.sqlite" # can be ':memory:'
|
||||
|
||||
PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
|
||||
# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
SERVERPORT = "8000" # not needed as it is the default
|
||||
|
||||
ADMINS = (
|
||||
('Philip', 'philip.sargent@klebos.eu'), # only on dev
|
||||
)
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent # folder above troggle, expoweb, drawings, loser
|
||||
LIBDIR = REPOS_ROOT_PATH / "lib" / PV
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / "templates"
|
||||
MEDIA_ROOT = TROGGLE_PATH / "media"
|
||||
JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
|
||||
|
||||
EXPOFILES = REPOS_ROOT_PATH / "expofiles" # sometimes on a different filesystem
|
||||
|
||||
SCANS_ROOT = EXPOFILES / "surveyscans"
|
||||
PHOTOS_ROOT = EXPOFILES / "photos" # sometimes on a different filesystem
|
||||
PHOTOS_YEAR = "2025"
|
||||
|
||||
KMZ_ICONS_PATH = REPOS_ROOT_PATH / "troggle" / "kmz_icons" # Google Earth export in /caves/
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT.
|
||||
# Note that MEDIA_URL and PHOTOS_URL are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
URL_ROOT = "/"
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
DBSQLITE = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"NAME": SQLITEFILE,
|
||||
# 'NAME' : ':memory:',
|
||||
"USER": "expo", # Not used with sqlite3.
|
||||
"PASSWORD": "sekrit", # Not used with sqlite3.
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
"OPTIONS": {
|
||||
"charset": "utf8mb4",
|
||||
},
|
||||
"NAME": "troggle", # Or path to database file if using sqlite3.
|
||||
"USER": "expo",
|
||||
"PASSWORD": MARIADB_SERVER_PASSWORD,
|
||||
"HOST": "", # Set to empty string for localhost. Not used with sqlite3.
|
||||
"PORT": "", # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
"OPTIONS": {
|
||||
"debug": "DEBUG",
|
||||
"context_processors": [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
"django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
|
||||
"core.context.troggle_context", # in core/context.py - only used in expedition.html
|
||||
"django.template.context_processors.debug",
|
||||
"django.template.context_processors.i18n",
|
||||
"django.template.context_processors.media", # includes a variable MEDIA_URL
|
||||
"django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
|
||||
"django.template.context_processors.tz",
|
||||
"django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
],
|
||||
"loaders": [
|
||||
"django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
|
||||
"django.template.loaders.app_directories.Loader", # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
|
||||
# TINYMCE_DEFAULT_CONFIG = {
|
||||
# 'plugins': "table,spellchecker,paste,searchreplace",
|
||||
# 'theme': "advanced",
|
||||
# }
|
||||
# TINYMCE_SPELLCHECKER = False
|
||||
# TINYMCE_COMPRESSOR = True
|
||||
#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
|
||||
|
||||
print(" + finished importing troggle/localsettings.py")
|
||||
22
_deploy/wsl/os-survey.sh
Normal file
22
_deploy/wsl/os-survey.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal : 'bash os-survey.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
sudo apt install survex-aven -y
|
||||
sudo apt install gpsprune qgis -y
|
||||
|
||||
|
||||
cd ~/expo
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
92
_deploy/wsl/os-trog24.04.sh
Executable file
92
_deploy/wsl/os-trog24.04.sh
Executable file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 24.04 relatively clean install.
|
||||
# 24.04 has python 3.12
|
||||
|
||||
# sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
ssh -V
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
|
||||
|
||||
# Already in Ubuntu 24.04 on WSL:
|
||||
# sudo apt install git -y
|
||||
# sudo apt install wget gpg
|
||||
# sudo apt install sftp -y
|
||||
# sudo apt install openssh-client -y
|
||||
# sudo apt install rsync
|
||||
|
||||
# Now using uv not pip:
|
||||
# sudo apt install python3-pip -y
|
||||
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install gedit -y
|
||||
sudo apt install tig gitg meld -y
|
||||
|
||||
# python formatting https://docs.astral.sh/ruff/
|
||||
sudo snap install ruff
|
||||
|
||||
# # do not actually use this any more
|
||||
# sudo useradd expo
|
||||
# sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
# sudo apt install python3-distutils -y
|
||||
|
||||
# install uv
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
|
||||
# We don't install the later version or the earlier versions of python - for dev and "sever mimic" environments
|
||||
# we leave that to uv to install now.
|
||||
|
||||
# In Dec.2024, the server is running 3.11 but dev work will be using 3.13
|
||||
# The setup of the virtual environment is done by troggle/_deploy/wsl/venv-trog.sh
|
||||
|
||||
# install VS code - but ONLY on a native ubuntu install, NOT in WSL
|
||||
# sudo apt install software-properties-common apt-transport-https
|
||||
# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||||
# sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||||
# sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||||
# sudo apt update
|
||||
# sudo apt install code
|
||||
|
||||
|
||||
mkdir ~/expo
|
||||
cd ~/expo
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
echo '### because you can't clone the repos without a key
|
||||
|
||||
git config --global user.email "philip.sargent@gmail.com"
|
||||
git config --global user.name "Philip Sargent"
|
||||
git config --global pull.rebase true
|
||||
|
||||
#Change this to clone using https?? at least for troggle?
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
git clone ssh://expo@expo.survex.com/home/expo/loser
|
||||
git clone ssh://expo@expo.survex.com/home/expo/expoweb
|
||||
git clone ssh://expo@expo.survex.com/home/expo/drawings
|
||||
|
||||
mkdir expofiles
|
||||
rsync -azv --delete-after --prune-empty-dirs expo@expo.survex.com:expofiles/surveyscans/ expofiles/surveyscans
|
||||
rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
|
||||
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
|
||||
# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
62
_deploy/wsl/pre-push.sh
Normal file
62
_deploy/wsl/pre-push.sh
Normal file
@@ -0,0 +1,62 @@
|
||||
#! /bin/bash
|
||||
# create and sanitise files for pushing to repo
|
||||
# catatrophically forgot to sanitize localsettingsWSL.py - oops.
|
||||
|
||||
#Make sure you have the WSL permissions system working, or you will push unsanitized files as this will fail
|
||||
# Philip Sargent 2022/04/12
|
||||
echo "** This copies file to _deploy/wsl/ !"
|
||||
HOSTNAME=`hostname`
|
||||
echo "** This copies file to _deploy/${HOSTNAME}/ !"
|
||||
cd ..
|
||||
|
||||
cd troggle
|
||||
echo `pwd`
|
||||
echo deprecations.
|
||||
|
||||
PYTHON="uv run"
|
||||
|
||||
source .venv/bin/activate
|
||||
python3 -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
|
||||
deactivate
|
||||
echo diffsettings.
|
||||
rm diffsettings.txt
|
||||
if test -f "diffsettings.txt"; then
|
||||
echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
|
||||
exit
|
||||
fi
|
||||
$PYTHON manage.py diffsettings | grep "###" > diffsettings.txt
|
||||
|
||||
echo inspectdb.
|
||||
# this next line requires database setting to be troggle.sqlite:
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
#egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo remove passwords.
|
||||
cp localsettings.py localsettingsWSL.py
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettingsWSL.py
|
||||
echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettingsWSL.py
|
||||
echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
|
||||
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettingsWSL.py
|
||||
echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
|
||||
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
|
||||
sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettingsWSL.py
|
||||
echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
|
||||
|
||||
mv _deploy/wsl/localsettingsWSL.py _deploy/wsl/localsettingsWSL.py.bak
|
||||
mv localsettingsWSL.py _deploy/wsl
|
||||
cp *.sh _deploy/wsl
|
||||
|
||||
#
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# in ./pre-run.sh
|
||||
# $PYTHON reset-django.py
|
||||
# $PYTHON manage.py makemigrations
|
||||
# $PYTHON manage.py test
|
||||
# $PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -i "unable|error" troggle-inspectdb.py
|
||||
36
_deploy/wsl/pre-run.sh
Normal file
36
_deploy/wsl/pre-run.sh
Normal file
@@ -0,0 +1,36 @@
|
||||
#! /bin/bash
|
||||
# Do these before final testing, *not* just before pushing:
|
||||
# Need to be in an ALREADY activated venv
|
||||
PYTHON="python"
|
||||
|
||||
echo "** Run inspectdb:"
|
||||
$PYTHON manage.py inspectdb > troggle-inspectdb.py
|
||||
# egrep -in "unable|error" troggle-inspectdb.py
|
||||
echo ""
|
||||
# count non-blank lines of python and template HTML code
|
||||
# includes all variants of settings.py files
|
||||
|
||||
# fix this as core/utils.py has 28,000 lines of numbers.
|
||||
find . -name \*.html -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-templates.txt
|
||||
|
||||
find . -name \*.py -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | grep -v "/migrations/" |grep -v "troggle-inspectdb.py"| awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-python.txt
|
||||
|
||||
echo "** Run reset-django.py - which deletes the database"
|
||||
# This deletes the database so must run after generating troggle-inspectdb.py
|
||||
$PYTHON reset-django.py
|
||||
echo "** After cleanup deletion, remake all migrations."
|
||||
$PYTHON manage.py makemigrations >/dev/null
|
||||
$PYTHON manage.py migrate
|
||||
|
||||
echo "** Now running self check"
|
||||
$PYTHON manage.py check -v 3 --deploy 2>security-warnings.txt >/dev/null
|
||||
$PYTHON manage.py check -v 3 --deploy
|
||||
|
||||
echo "** Now running test suite"
|
||||
# $PYTHON manage.py test -v 1
|
||||
|
||||
echo ""
|
||||
echo `tail -1 lines-of-python.txt` non-comment lines of python. But core/utils.py has 28,000 lines of numbers.
|
||||
echo `tail -1 lines-of-templates.txt` non-comment lines of HTML templates.
|
||||
|
||||
echo '** If you have an error running manage.py, maybe you are not in an activated venv ?'
|
||||
12
_deploy/wsl/using-pip/requirements-Dj3.2Bullseye.txt
Normal file
12
_deploy/wsl/using-pip/requirements-Dj3.2Bullseye.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
asgiref==3.3.4
|
||||
confusable-homoglyphs==3.2.0
|
||||
coverage==5.5
|
||||
Django==3.2.12
|
||||
docutils==0.14
|
||||
gunicorn==20.1.0
|
||||
Pillow==9.0.1
|
||||
pytz==2019.1
|
||||
reportlab==3.6.8
|
||||
sqlparse==0.2.4
|
||||
typing-extensions==3.7.4.3
|
||||
Unidecode==1.0.23
|
||||
20
_deploy/wsl/using-pip/requirements-devupgrade.txt
Normal file
20
_deploy/wsl/using-pip/requirements-devupgrade.txt
Normal file
@@ -0,0 +1,20 @@
|
||||
# Philip bleeding edge config
|
||||
asgiref==3.6.0
|
||||
beautifulsoup4==4.12.2
|
||||
black==23.1.0
|
||||
click==8.1.3
|
||||
coverage==7.1.0
|
||||
Django==4.2
|
||||
docutils==0.19
|
||||
isort==5.12.0
|
||||
mypy-extensions==1.0.0
|
||||
packaging==23.0
|
||||
pathspec==0.11.0
|
||||
Pillow==9.4.0
|
||||
platformdirs==3.0.0
|
||||
pytz==2022.7
|
||||
ruff==0.0.245
|
||||
soupsieve==2.4.1
|
||||
sqlparse==0.4.3
|
||||
Unidecode==1.3.6
|
||||
piexif==1.1.3
|
||||
44
_deploy/wsl/using-pip/requirements-keep.txt
Executable file
44
_deploy/wsl/using-pip/requirements-keep.txt
Executable file
@@ -0,0 +1,44 @@
|
||||
For debian bullseye (10)
|
||||
python3-django (3.2.12)
|
||||
tinymce (from where?)
|
||||
mariadb-server
|
||||
apache2
|
||||
libapache2-mod-wsgi-py3
|
||||
|
||||
|
||||
python3-django-registration ?
|
||||
Django==1.7
|
||||
django-extensions==2.2.9
|
||||
django-registration==2.0
|
||||
django-tinymce==2.0.1
|
||||
six==1.14.0
|
||||
Unidecode==1.1.1 python3-unidecode
|
||||
Pillow==7.1.2 python3-willow
|
||||
|
||||
asgiref==3.7.2
|
||||
attrs==22.2.0
|
||||
beautifulsoup4==4.12.2
|
||||
black==23.11.0
|
||||
bs4==0.0.1
|
||||
click==8.1.3
|
||||
colorama==0.4.6
|
||||
coverage==6.5.0
|
||||
Django==5.0
|
||||
docutils==0.20
|
||||
interrogate==1.5.0
|
||||
isort==5.11.4
|
||||
mypy-extensions==0.4.3
|
||||
packaging==23.2
|
||||
pathspec==0.10.3
|
||||
piexif==1.1.3
|
||||
Pillow==10.1.0
|
||||
platformdirs==2.6.2
|
||||
py==1.11.0
|
||||
pytz==2022.6
|
||||
ruff==0.1.0
|
||||
soupsieve==2.5
|
||||
sqlparse==0.4.0
|
||||
tabulate==0.9.0
|
||||
toml==0.10.2
|
||||
typing_extensions==4.4.0
|
||||
Unidecode==1.3.6
|
||||
17
_deploy/wsl/using-pip/requirements-p10d4.txt
Normal file
17
_deploy/wsl/using-pip/requirements-p10d4.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
asgiref==3.6.0
|
||||
black==23.1.0
|
||||
click==8.1.3
|
||||
coverage==7.1.0
|
||||
Django==4.2
|
||||
docutils==0.19
|
||||
isort==5.12.0
|
||||
mypy-extensions==1.0.0
|
||||
packaging==23.0
|
||||
pathspec==0.11.0
|
||||
Pillow==9.4.0
|
||||
platformdirs==3.0.0
|
||||
pytz==2022.7
|
||||
ruff==0.0.245
|
||||
sqlparse==0.4.3
|
||||
tomli==2.0.1
|
||||
Unidecode==1.3.6
|
||||
9
_deploy/wsl/using-pip/requirements-p10d5.txt
Normal file
9
_deploy/wsl/using-pip/requirements-p10d5.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
asgiref==3.5.2
|
||||
coverage==6.5.0
|
||||
Django==3.2.16
|
||||
docutils==0.19
|
||||
Pillow==9.3.0
|
||||
pytz==2022.6
|
||||
sqlparse==0.4.3
|
||||
typing_extensions==4.4.0
|
||||
Unidecode==1.3.6
|
||||
3
_deploy/wsl/using-pip/requirements-p11d32.txt
Normal file
3
_deploy/wsl/using-pip/requirements-p11d32.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
asgiref==3.8.1
|
||||
Django==5.1b1
|
||||
sqlparse==0.5.1
|
||||
21
_deploy/wsl/using-pip/requirements-p11d42.txt
Normal file
21
_deploy/wsl/using-pip/requirements-p11d42.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
asgiref==3.6.0
|
||||
beautifulsoup4==4.12.0
|
||||
black==23.1.0
|
||||
chardet==5.1.0
|
||||
click==8.1.0
|
||||
coverage==7.1.0
|
||||
deptry==0.12.0
|
||||
Django==4.2
|
||||
docutils==0.19
|
||||
isort==5.12.0
|
||||
mypy-extensions==1.0.0
|
||||
packaging==23.0
|
||||
pathspec==0.11.0
|
||||
piexif==1.1.3
|
||||
Pillow==9.4.0
|
||||
platformdirs==3.0.0
|
||||
pytz==2022.7
|
||||
ruff==0.0.245
|
||||
soupsieve==2.5
|
||||
sqlparse==0.4.0
|
||||
Unidecode==1.3.0
|
||||
21
_deploy/wsl/using-pip/requirements-p11d5.txt
Normal file
21
_deploy/wsl/using-pip/requirements-p11d5.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
# to be used with pre-release Djangi install which installs other stuff too
|
||||
beautifulsoup4==4.12
|
||||
piexif==1.1
|
||||
black==23.1
|
||||
chardet==5.1
|
||||
click==8.1
|
||||
coverage==7.1
|
||||
deptry==0.12
|
||||
docutils==0.19
|
||||
isort==5.12
|
||||
mypy-extensions==1.0
|
||||
packaging==23.0
|
||||
pathspec==0.11
|
||||
Pillow==9.4.0
|
||||
platformdirs==3.0
|
||||
pytz==2022.7
|
||||
ruff==0.0.245
|
||||
setuptools==67.7
|
||||
soupsieve==2.5
|
||||
Unidecode==1.3
|
||||
piexif==1.1
|
||||
20
_deploy/wsl/using-pip/requirements-p12d5.txt
Executable file
20
_deploy/wsl/using-pip/requirements-p12d5.txt
Executable file
@@ -0,0 +1,20 @@
|
||||
Pillow==10.2
|
||||
Unidecode==1.3.8
|
||||
asgiref==3.6
|
||||
beautifulsoup4==4.12
|
||||
black==24.2
|
||||
chardet==5.2
|
||||
click==8.1
|
||||
coverage==7
|
||||
deptry==0.12.0
|
||||
docutils==0.20
|
||||
isort==5
|
||||
mypy-extensions==1.0
|
||||
packaging==23
|
||||
pathspec==0.12
|
||||
platformdirs==4
|
||||
pytz==2024.1
|
||||
ruff==0.2
|
||||
soupsieve==2.5
|
||||
sqlparse
|
||||
piexif
|
||||
21
_deploy/wsl/using-pip/requirements-p9d4.txt
Executable file
21
_deploy/wsl/using-pip/requirements-p9d4.txt
Executable file
@@ -0,0 +1,21 @@
|
||||
asgiref==3.7.0
|
||||
beautifulsoup4==4.12.0
|
||||
black==23.3.0
|
||||
click==8.1.3
|
||||
coverage==7.2.0
|
||||
Django==4.2
|
||||
docutils==0.20
|
||||
isort==5.12.0
|
||||
mypy-extensions==1.0.0
|
||||
packaging==23.0
|
||||
pathspec==0.11.0
|
||||
Pillow==10.0.0
|
||||
pkg_resources==0.0.0
|
||||
platformdirs==3.8.0
|
||||
pytz==2023.3
|
||||
ruff==0.0.245
|
||||
soupsieve==2.4.1
|
||||
sqlparse==0.4.0
|
||||
tomli==2.0.1
|
||||
typing_extensions==4.7.1
|
||||
Unidecode==1.3.6
|
||||
17
_deploy/wsl/using-pip/requirements3.2.txt
Normal file
17
_deploy/wsl/using-pip/requirements3.2.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
asgiref==3.3.4
|
||||
confusable-homoglyphs==3.2.0
|
||||
Django==3.2
|
||||
docutils==0.14
|
||||
gunicorn==20.1.0
|
||||
Pillow==5.4.1
|
||||
sqlparse==0.2.4
|
||||
typing-extensions==3.7.4.3
|
||||
Unidecode==1.0.23
|
||||
mariadb==1.0.11
|
||||
mysql-connector-python==8.0.29
|
||||
mysqlclient==2.1.0
|
||||
Pillow==9.1.0
|
||||
pytz==2022.5
|
||||
asgiref==3.5.0
|
||||
gunicorn==20.1.0
|
||||
|
||||
184
_deploy/wsl/using-pip/venv-trog-d3.sh
Normal file
184
_deploy/wsl/using-pip/venv-trog-d3.sh
Normal file
@@ -0,0 +1,184 @@
|
||||
#!/bin/bash
|
||||
# footled lots to make this work with python 3.10 & 3.11 and WSL1 and WSL2 on Ubuntu 22.04
|
||||
# Run this in a terminal in the troggle directory: 'bash venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the real troggle directory: "bash venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 22.04 (or 20.04) relatively clean install.
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog.sh
|
||||
|
||||
# If you are using Debian, then stick with the default version of python
|
||||
# If you are using Ubuntu, then it is easy to use a later version of python, e.g. 3.11
|
||||
|
||||
# NOW we set up troggle
|
||||
PYTHON=python3.11
|
||||
VENAME=p11d32 # python3.x and django 4.2
|
||||
echo "** You are logged in as `id -u -n`"
|
||||
echo "The 50MB pip cache will be in /home/`id -u -n`/.cache/"
|
||||
echo "The 150MB venv will created in /home/`id -u -n`/$VENAME/"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder (this script location): ${TROGDIR}"
|
||||
|
||||
REQUIRE=requirements-$VENAME.txt
|
||||
|
||||
if [ -d $REQUIRE ]; then
|
||||
echo "-- No ${REQUIRE} found. You should be in the /troggle/ folder. Copy it from your most recent installation."
|
||||
exit 1
|
||||
fi
|
||||
echo ## Using $REQUIRE :
|
||||
cat $REQUIRE
|
||||
echo ##
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
|
||||
# NOTE that when using a later or earlier verison of python, you MUST also
|
||||
# use the allowed version of Pillow, see https://pillow.readthedocs.io/en/latest/installation.html
|
||||
|
||||
# NOW set up link from expo user folder
|
||||
# needed for WSL2
|
||||
echo Creating links from Linux filesystem user
|
||||
# These links only need making once, for many venv
|
||||
cd ~
|
||||
|
||||
if [ ! -d $VENAME ]; then
|
||||
echo "## Creating venv $VENAME. (If this fails with a pip error, you need to ensure you have python3.11-venv installed and/or use a Ubuntu window)"
|
||||
$PYTHON -m venv $VENAME
|
||||
else
|
||||
echo "## /$VENAME/ already exists ! Delete it first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Activate the virtual env and see what the default packages are
|
||||
echo "### Activating $VENAME"
|
||||
|
||||
cd $VENAME
|
||||
echo "-- now in: ${PWD}"
|
||||
ls -tlarg
|
||||
source bin/activate
|
||||
echo $VIRTUAL_ENV
|
||||
if [ -d ~/$VENAME/bin ]; then
|
||||
echo "### Activating."
|
||||
else
|
||||
echo "## ~/$VENAME/bin does not exist. FAILed to create venv properly."
|
||||
exit 1
|
||||
fi
|
||||
# update local version of pip, more recent than OS version
|
||||
# debian bullseye installs pip 20.3.4 which barfs, we want >22.0.3
|
||||
|
||||
# update local version of setuptools, more recent than OS version, needed for packages without wheels
|
||||
|
||||
echo "### installing later version of pip inside $VENAME"
|
||||
$PYTHON -m pip install --upgrade pip
|
||||
$PYTHON -m pip install --upgrade setuptools
|
||||
|
||||
PIP=pip
|
||||
|
||||
$PIP list > original-pip.list
|
||||
$PIP freeze >original.txt
|
||||
|
||||
# we are in /home/$USER/$VENAME/
|
||||
ln -s ${TROGDIR} troggle
|
||||
ln -s ${TROGDIR}/../expoweb expoweb
|
||||
ln -s ${TROGDIR}/../loser loser
|
||||
ln -s ${TROGDIR}/../drawings drawings
|
||||
#ln -s ${TROGDIR}/../expofiles expofiles
|
||||
|
||||
# fudge for philip's machine
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
if [ -d ${TROGDIR}/../expofiles ]; then
|
||||
ln -s ${TROGDIR}/../expofiles expofiles
|
||||
else
|
||||
ln -s /mnt/d/EXPO/expofiles expofiles
|
||||
fi
|
||||
|
||||
echo "### Setting file permissions.. may take a while.."
|
||||
git config --global --add safe.directory '*'
|
||||
sudo chmod -R 777 *
|
||||
|
||||
echo "### links to expoweb, troggle etc. complete:"
|
||||
ls -tla
|
||||
echo "###"
|
||||
echo "### now installing ${TROGDIR}/${REQUIRE}"
|
||||
echo "###"
|
||||
cat ${TROGDIR}/${REQUIRE}
|
||||
|
||||
# NOW THERE IS A PERMISSIONS FAILURE THAT DIDN'T HAPPEN BEFORE
|
||||
# seen on wsl2 as well as wsl1
|
||||
# which ALSO ruins EXISTING permissions !
|
||||
# Guessing it is to do with pip not liking non-standard py 3.11 installation on Ubuntu 22.04
|
||||
|
||||
read -p "Press any key to resume ..."
|
||||
$PIP install -r ${TROGDIR}/${REQUIRE}
|
||||
echo "### install from ${TROGDIR}/${REQUIRE} completed."
|
||||
echo '### '
|
||||
|
||||
$PIP install --pre django
|
||||
|
||||
$PIP freeze > $REQUIRE
|
||||
# so that we can track requirements more easily with git
|
||||
# because we do not install these with pip, but they are listed by the freeze command
|
||||
# Now find out what we actually installed by subtracting the stuff venv installed anyway
|
||||
sort original.txt > 1
|
||||
sort $REQUIRE >2
|
||||
comm -3 1 2 --check-order | awk '{ print $1}'>fresh-$REQUIRE
|
||||
rm 1
|
||||
rm 2
|
||||
|
||||
# cp $REQUIRE requirements-$VENAME.txt
|
||||
cp $REQUIRE troggle/$REQUIRE
|
||||
|
||||
$PIP list > installed-pip.list
|
||||
$PIP list -o > installed-pip-o.list
|
||||
|
||||
REQ=installation-record
|
||||
mkdir $REQ
|
||||
|
||||
mv original.txt $REQ
|
||||
mv $REQUIRE $REQ
|
||||
mv original-pip.list $REQ
|
||||
mv installed-pip.list $REQ
|
||||
mv installed-pip-o.list $REQ
|
||||
cp fresh-$REQUIRE ../$REQUIRE
|
||||
mv fresh-$REQUIRE $REQ
|
||||
cp troggle/`basename "$0"` $REQ
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
python --version
|
||||
echo "Django version:`django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/$VENAME'
|
||||
'source bin/activate'
|
||||
'cd troggle'
|
||||
'django-admin'
|
||||
'python manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
## the tests may ALSO fail because of ssh and permissions errors
|
||||
|
||||
## So you will need to run
|
||||
$sudo chown -Rhv philip:philip ~/$VENAME (if your username is philip)
|
||||
# and then REBOOT (or at least, exit WSL and terminate and restart WSL)
|
||||
# because this chmod only takes effect then.
|
||||
|
||||
'python manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'python databaseReset.py reset $VENAME'
|
||||
'python manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
184
_deploy/wsl/using-pip/venv-trog-d4.sh
Normal file
184
_deploy/wsl/using-pip/venv-trog-d4.sh
Normal file
@@ -0,0 +1,184 @@
|
||||
#!/bin/bash
|
||||
# footled lots to make this work with python 3.10 & 3.11 and WSL1 and WSL2 on Ubuntu 22.04
|
||||
# Run this in a terminal in the troggle directory: 'bash venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the real troggle directory: "bash venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 22.04 (or 20.04) relatively clean install.
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog.sh
|
||||
|
||||
# If you are using Debian, then stick with the default version of python
|
||||
# If you are using Ubuntu, then it is easy to use a later version of python, e.g. 3.11
|
||||
|
||||
# NOW we set up troggle
|
||||
PYTHON=python3.11
|
||||
VENAME=p11d42 # python3.x and django 4.2
|
||||
echo "** You are logged in as `id -u -n`"
|
||||
echo "The 50MB pip cache will be in /home/`id -u -n`/.cache/"
|
||||
echo "The 150MB venv will created in /home/`id -u -n`/$VENAME/"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder (this script location): ${TROGDIR}"
|
||||
|
||||
REQUIRE=requirements-$VENAME.txt
|
||||
|
||||
if [ -d $REQUIRE ]; then
|
||||
echo "-- No ${REQUIRE} found. You should be in the /troggle/ folder. Copy it from your most recent installation."
|
||||
exit 1
|
||||
fi
|
||||
echo ## Using $REQUIRE :
|
||||
cat $REQUIRE
|
||||
echo ##
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
|
||||
# NOTE that when using a later or earlier verison of python, you MUST also
|
||||
# use the allowed version of Pillow, see https://pillow.readthedocs.io/en/latest/installation.html
|
||||
|
||||
# NOW set up link from expo user folder
|
||||
# needed for WSL2
|
||||
echo Creating links from Linux filesystem user
|
||||
# These links only need making once, for many venv
|
||||
cd ~
|
||||
|
||||
if [ ! -d $VENAME ]; then
|
||||
echo "## Creating venv $VENAME. (If this fails with a pip error, you need to ensure you have python3.11-venv installed and/or use a Ubuntu window)"
|
||||
$PYTHON -m venv $VENAME
|
||||
else
|
||||
echo "## /$VENAME/ already exists ! Delete it first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Activate the virtual env and see what the default packages are
|
||||
echo "### Activating $VENAME"
|
||||
|
||||
cd $VENAME
|
||||
echo "-- now in: ${PWD}"
|
||||
ls -tlarg
|
||||
source bin/activate
|
||||
echo $VIRTUAL_ENV
|
||||
if [ -d ~/$VENAME/bin ]; then
|
||||
echo "### Activating."
|
||||
else
|
||||
echo "## ~/$VENAME/bin does not exist. FAILed to create venv properly."
|
||||
exit 1
|
||||
fi
|
||||
# update local version of pip, more recent than OS version
|
||||
# debian bullseye installs pip 20.3.4 which barfs, we want >22.0.3
|
||||
|
||||
# update local version of setuptools, more recent than OS version, needed for packages without wheels
|
||||
|
||||
echo "### installing later version of pip inside $VENAME"
|
||||
$PYTHON -m pip install --upgrade pip
|
||||
$PYTHON -m pip install --upgrade setuptools
|
||||
|
||||
PIP=pip
|
||||
|
||||
$PIP list > original-pip.list
|
||||
$PIP freeze >original.txt
|
||||
|
||||
# we are in /home/$USER/$VENAME/
|
||||
ln -s ${TROGDIR} troggle
|
||||
ln -s ${TROGDIR}/../expoweb expoweb
|
||||
ln -s ${TROGDIR}/../loser loser
|
||||
ln -s ${TROGDIR}/../drawings drawings
|
||||
#ln -s ${TROGDIR}/../expofiles expofiles
|
||||
|
||||
# fudge for philip's machine
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
if [ -d ${TROGDIR}/../expofiles ]; then
|
||||
ln -s ${TROGDIR}/../expofiles expofiles
|
||||
else
|
||||
ln -s /mnt/d/EXPO/expofiles expofiles
|
||||
fi
|
||||
|
||||
echo "### Setting file permissions.. may take a while.."
|
||||
git config --global --add safe.directory '*'
|
||||
sudo chmod -R 777 *
|
||||
|
||||
echo "### links to expoweb, troggle etc. complete:"
|
||||
ls -tla
|
||||
echo "###"
|
||||
echo "### now installing ${TROGDIR}/${REQUIRE}"
|
||||
echo "###"
|
||||
cat ${TROGDIR}/${REQUIRE}
|
||||
|
||||
# NOW THERE IS A PERMISSIONS FAILURE THAT DIDN'T HAPPEN BEFORE
|
||||
# seen on wsl2 as well as wsl1
|
||||
# which ALSO ruins EXISTING permissions !
|
||||
# Guessing it is to do with pip not liking non-standard py 3.11 installation on Ubuntu 22.04
|
||||
|
||||
read -p "Press any key to resume ..."
|
||||
$PIP install -r ${TROGDIR}/${REQUIRE}
|
||||
echo "### install from ${TROGDIR}/${REQUIRE} completed."
|
||||
echo '### '
|
||||
|
||||
$PIP install --pre django
|
||||
|
||||
$PIP freeze > $REQUIRE
|
||||
# so that we can track requirements more easily with git
|
||||
# because we do not install these with pip, but they are listed by the freeze command
|
||||
# Now find out what we actually installed by subtracting the stuff venv installed anyway
|
||||
sort original.txt > 1
|
||||
sort $REQUIRE >2
|
||||
comm -3 1 2 --check-order | awk '{ print $1}'>fresh-$REQUIRE
|
||||
rm 1
|
||||
rm 2
|
||||
|
||||
# cp $REQUIRE requirements-$VENAME.txt
|
||||
cp $REQUIRE troggle/$REQUIRE
|
||||
|
||||
$PIP list > installed-pip.list
|
||||
$PIP list -o > installed-pip-o.list
|
||||
|
||||
REQ=installation-record
|
||||
mkdir $REQ
|
||||
|
||||
mv original.txt $REQ
|
||||
mv $REQUIRE $REQ
|
||||
mv original-pip.list $REQ
|
||||
mv installed-pip.list $REQ
|
||||
mv installed-pip-o.list $REQ
|
||||
cp fresh-$REQUIRE ../$REQUIRE
|
||||
mv fresh-$REQUIRE $REQ
|
||||
cp troggle/`basename "$0"` $REQ
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
python --version
|
||||
echo "Django version:`django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/$VENAME'
|
||||
'source bin/activate'
|
||||
'cd troggle'
|
||||
'django-admin'
|
||||
'python manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
## the tests may ALSO fail because of ssh and permissions errors
|
||||
|
||||
## So you will need to run
|
||||
$sudo chown -Rhv philip:philip ~/$VENAME (if your username is philip)
|
||||
# and then REBOOT (or at least, exit WSL and terminate and restart WSL)
|
||||
# because this chmod only takes effect then.
|
||||
|
||||
'python manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'python databaseReset.py reset $VENAME'
|
||||
'python manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
190
_deploy/wsl/using-pip/venv-trog-d5.sh
Executable file
190
_deploy/wsl/using-pip/venv-trog-d5.sh
Executable file
@@ -0,0 +1,190 @@
|
||||
#!/bin/bash
|
||||
# footled lots to make this work with python 3.10 & 3.11 and WSL1 and WSL2 on Ubuntu 22.04
|
||||
# Run this in a terminal in the troggle directory: 'bash venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the real troggle directory: "bash venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 22.04 (or 20.04) relatively clean install.
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog.sh
|
||||
|
||||
# If you are using Debian, then stick with the default version of python
|
||||
# If you are using Ubuntu, then it is easy to use a later version of python, e.g. 3.12
|
||||
|
||||
# NOW we set up troggle
|
||||
PYTHON=python3.12
|
||||
VENAME=p12d5 # python3.x and django version
|
||||
echo "** You are logged in as `id -u -n`"
|
||||
echo "The 50MB pip cache will be in /home/`id -u -n`/.cache/"
|
||||
echo "The 150MB venv will created in /home/`id -u -n`/$VENAME/"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder (this script location): ${TROGDIR}"
|
||||
|
||||
if [[ "${VENAME:(-1)}" == 5 ]]; then
|
||||
echo "The variable '$VENAME' ends in 5."
|
||||
else
|
||||
echo "The variable '$VENAME' does not end in 5."
|
||||
fi
|
||||
|
||||
REQUIRE=requirements-$VENAME.txt
|
||||
|
||||
if [ -d $REQUIRE ]; then
|
||||
echo "-- No ${REQUIRE} found. You should be in the /troggle/ folder. Copy it from your most recent installation."
|
||||
exit 1
|
||||
fi
|
||||
echo ## Using $REQUIRE :
|
||||
cat $REQUIRE
|
||||
echo ##
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
|
||||
# NOTE that when using a later or earlier verison of python, you MUST also
|
||||
# use the allowed version of Pillow, see https://pillow.readthedocs.io/en/latest/installation.html
|
||||
|
||||
# NOW set up link from expo user folder
|
||||
# needed for WSL2
|
||||
echo Creating links from Linux filesystem user
|
||||
# These links only need making once, for many venv
|
||||
cd ~
|
||||
|
||||
if [ ! -d $VENAME ]; then
|
||||
echo "## Creating venv $VENAME. (If this fails with a pip error, you need to ensure you have python3.12-venv installed and/or use a Ubuntu window)"
|
||||
$PYTHON -m venv $VENAME
|
||||
else
|
||||
echo "## /$VENAME/ already exists ! Delete it first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Activate the virtual env and see what the default packages are
|
||||
echo "### Activating $VENAME"
|
||||
|
||||
cd $VENAME
|
||||
echo "-- now in: ${PWD}"
|
||||
ls -tlarg
|
||||
source bin/activate
|
||||
echo $VIRTUAL_ENV
|
||||
if [ -d ~/$VENAME/bin ]; then
|
||||
echo "### Activating."
|
||||
else
|
||||
echo "## ~/$VENAME/bin does not exist. FAILed to create venv properly."
|
||||
exit 1
|
||||
fi
|
||||
# update local version of pip, more recent than OS version
|
||||
# debian bullseye installs pip 20.3.4 which barfs, we want >22.0.3
|
||||
|
||||
# update local version of setuptools, more recent than OS version, needed for packages without wheels
|
||||
|
||||
echo "### installing later version of pip inside $VENAME"
|
||||
$PYTHON -m pip install --upgrade pip
|
||||
$PYTHON -m pip install --upgrade setuptools
|
||||
|
||||
$PYTHON -m pip list > original-pip.list
|
||||
$PYTHON -m pip freeze >original.txt
|
||||
|
||||
# we are in /home/$USER/$VENAME/
|
||||
ln -s ${TROGDIR} troggle
|
||||
ln -s ${TROGDIR}/../expoweb expoweb
|
||||
ln -s ${TROGDIR}/../loser loser
|
||||
ln -s ${TROGDIR}/../drawings drawings
|
||||
#ln -s ${TROGDIR}/../expofiles expofiles
|
||||
|
||||
# fudge for philip's machine
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
if [ -d ${TROGDIR}/../expofiles ]; then
|
||||
ln -s ${TROGDIR}/../expofiles expofiles
|
||||
else
|
||||
ln -s /mnt/d/EXPO/expofiles expofiles
|
||||
fi
|
||||
|
||||
echo "### Setting file permissions.. may take a while.."
|
||||
git config --global --add safe.directory '*'
|
||||
sudo chmod -R 777 *
|
||||
|
||||
echo "### links to expoweb, troggle etc. complete:"
|
||||
ls -tla
|
||||
echo "###"
|
||||
echo "### now installing ${TROGDIR}/${REQUIRE}"
|
||||
echo "###"
|
||||
cat ${TROGDIR}/${REQUIRE}
|
||||
cp -f ${TROGDIR}/${REQUIRE} ${TROGDIR}/${REQUIRE}.orig
|
||||
|
||||
read -p "Press any key to resume ..."
|
||||
$PYTHON -m pip install -r ${TROGDIR}/${REQUIRE}
|
||||
echo "### install from ${TROGDIR}/${REQUIRE} completed."
|
||||
echo '### '
|
||||
|
||||
# this installs pre-release django 5.0
|
||||
if [[ "${VENAME:(-1)}" == 5 ]]; then
|
||||
echo "### Installing pre-release version of Django"
|
||||
$PYTHON -m pip install --pre django
|
||||
fi
|
||||
|
||||
$PYTHON -m pip freeze > $REQUIRE.freeze
|
||||
# so that we can track requirements more easily with git
|
||||
# because we do not install these with pip, but they are listed by the freeze command
|
||||
# Now find out what we actually installed by subtracting the stuff venv installed anyway
|
||||
sort original.txt > 1
|
||||
sort $REQUIRE.freeze >2
|
||||
comm -3 1 2 --check-order | awk '{ print $1}'>fresh-$REQUIRE
|
||||
rm 1
|
||||
rm 2
|
||||
|
||||
# cp $REQUIRE requirements-$VENAME.txt
|
||||
cp $REQUIRE troggle/$REQUIRE
|
||||
|
||||
$PYTHON -m pip list > installed-pip.list
|
||||
$PYTHON -m pip list -o > installed-pip-o.list
|
||||
|
||||
REQ=installation-record
|
||||
mkdir $REQ
|
||||
|
||||
mv $REQUIRE.freeze $REQ
|
||||
mv original.txt $REQ
|
||||
mv $REQUIRE $REQ
|
||||
mv original-pip.list $REQ
|
||||
mv installed-pip.list $REQ
|
||||
mv installed-pip-o.list $REQ
|
||||
# cp fresh-$REQUIRE ../$REQUIRE
|
||||
mv fresh-$REQUIRE $REQ
|
||||
cp troggle/`basename "$0"` $REQ
|
||||
|
||||
|
||||
|
||||
$PYTHON --version
|
||||
python --version
|
||||
echo "Django version:`django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/$VENAME'
|
||||
'source bin/activate'
|
||||
'cd troggle'
|
||||
'django-admin'
|
||||
'python manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
## the tests may ALSO fail because of ssh and permissions errors
|
||||
|
||||
## So you will need to run
|
||||
$sudo chown -Rhv philip:philip ~/$VENAME (if your username is philip)
|
||||
# and then REBOOT (or at least, exit WSL and terminate and restart WSL)
|
||||
# because this chmod only takes effect then.
|
||||
|
||||
'python manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'python databaseReset.py reset $VENAME'
|
||||
'python manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
53
_deploy/wsl/venv-trog.sh
Normal file
53
_deploy/wsl/venv-trog.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# now using uv, unbelieveably simpler.
|
||||
# Run this in a terminal in ~/expo above the troggle directory: 'bash ~/expo/venv-trog.sh'
|
||||
echo '-- Run this in a terminal in the directory above the troggle directory: "bash ~/expo/venv-trog.sh"'
|
||||
|
||||
# Expects an Ubuntu 24.04 with all the gubbins already installed
|
||||
# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
|
||||
# use the script os-trog24.04.sh runniing it in /home/username/
|
||||
python3 --version
|
||||
cd ~/expo/troggle
|
||||
echo "-- EXPO folder [current directory]: `pwd`"
|
||||
TROGDIR=$(cd $(dirname $0) && pwd)
|
||||
echo "-- Troggle folder: ${TROGDIR}"
|
||||
|
||||
cp dev.toml pyproject.toml
|
||||
cp ~/expo/troggle/_deploy/wsl/localsettingsWSL.py ~/expo/troggle/localsettings.py
|
||||
|
||||
uv self update
|
||||
uv sync
|
||||
|
||||
|
||||
# fudge for philip's laptop prior to M2 SSD upgrade
|
||||
if [ ! -d /mnt/d/EXPO ]; then
|
||||
sudo mkdir /mnt/d
|
||||
sudo mount -t drvfs D: /mnt/d
|
||||
fi
|
||||
|
||||
uv pip list
|
||||
|
||||
echo "Django version:`uv run django-admin --version`"
|
||||
|
||||
echo "### Now do
|
||||
'[sudo service mysql start]'
|
||||
'[sudo service mariadb restart]'
|
||||
'[sudo mysql_secure_installation]'
|
||||
'cd ~/expo/troggle'
|
||||
'uv run django-admin'
|
||||
'uv run manage.py check'
|
||||
## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
|
||||
## you need to follow the Linux instructions.
|
||||
'ssh expo@expo.survex.com'
|
||||
|
||||
## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
|
||||
|
||||
'uv run manage.py test -v 2'
|
||||
'./pre-run.sh' (runs the tests again)
|
||||
|
||||
'uv run databaseReset.py reset INIT'
|
||||
'uv run manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
|
||||
"
|
||||
# if [ ! -d /mnt/d/expofiles ]; then
|
||||
# echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
|
||||
# fi
|
||||
181
_deploy/xubuntu/localsettingsXubuntu.py
Normal file
181
_deploy/xubuntu/localsettingsXubuntu.py
Normal file
@@ -0,0 +1,181 @@
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
#-----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
#-----------------------------------------------------------------
|
||||
# default values, real secrets imported from credentials.py
|
||||
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever. Tests are then less accurate.
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
SERVERPORT = '8000' # not needed
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent
|
||||
LIBDIR = REPOS_ROOT_PATH / 'lib' / PV
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / 'templates'
|
||||
MEDIA_ROOT = TROGGLE_PATH / 'media'
|
||||
JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
|
||||
|
||||
# EXPOFILES = REPOS_ROOT_PATH / "expofiles"
|
||||
EXPOFILES = Path('/media/philip/sd-huge1/cucc-expo/expofiles/')
|
||||
|
||||
SCANS_ROOT = EXPOFILES / 'surveyscans'
|
||||
PHOTOS_ROOT = EXPOFILES / 'photos'
|
||||
PHOTOS_YEAR = "2023"
|
||||
|
||||
NOTABLECAVESHREFS = ["290", "291", "264", "258", "204", "359", "76", "107"]
|
||||
|
||||
# PYTHON_PATH = os.fspath(PYTHON_PATH)
|
||||
PYTHON_PATH = REPOS_ROOT_PATH / "troggle"
|
||||
LOGFILE = PYTHON_PATH / "troggle.log"
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||
# trailing slash if there is a path component (optional in other cases).
|
||||
MEDIA_URL = '/site-media/'
|
||||
|
||||
DIR_ROOT = Path("") #this should end in / if a value is given
|
||||
URL_ROOT = '/'
|
||||
# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
|
||||
|
||||
# Note that these constants are not actually used in urls.py, they should be..
|
||||
# and they all need to end with / so using 'Path' doesn't work..
|
||||
MEDIA_URL = Path(URL_ROOT, "/site_media/")
|
||||
PHOTOS_URL = Path(URL_ROOT, "/photos/")
|
||||
|
||||
STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
|
||||
|
||||
# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
# executables:
|
||||
CAVERN = 'cavern' # for parsing .svx files and producing .3d files
|
||||
SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
|
||||
|
||||
DBSQLITE = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME' : 'troggle.sqlite',
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : 'sekrit', # Not used with sqlite3.
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo',
|
||||
'PASSWORD' : 'my-secret-password-schwatzmooskogel',
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
"DIRS": [TEMPLATE_PATH],
|
||||
'OPTIONS': {
|
||||
'debug': 'DEBUG',
|
||||
'context_processors': [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
|
||||
'core.context.troggle_context', # in core/troggle.py - only used in expedition.html
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media', # includes a variable MEDIA_URL
|
||||
'django.template.context_processors.static', # includes a variable STATIC_URL used by admin pages
|
||||
'django.template.context_processors.tz',
|
||||
'django.template.context_processors.request', # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader', # default lcation is troggle/templates/
|
||||
'django.template.loaders.app_directories.Loader', # needed for admin 'app'
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
EXPOUSER = "expo"
|
||||
EXPOUSER_EMAIL = "philip.sargent@gmail.com"
|
||||
EXPOADMINUSER = "expoadmin"
|
||||
EXPOADMINUSER_EMAIL = "philip.sargent@gmail.com"
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.net" # Philip Sargent really
|
||||
EMAIL_PORT = 587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = "django-test@klebos.net"
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
|
||||
EXPOWEB_URL = ''
|
||||
# SCANS_URL = '/survey_scans/' # defunct, removed.
|
||||
|
||||
sys.path.append(str(REPOS_ROOT_PATH))
|
||||
sys.path.append(str(PYTHON_PATH))
|
||||
|
||||
# Sanitise these to be strings as all other code is expecting strings
|
||||
# and we have not made the change to pathlib Path type in the other localsettings-* variants yet.
|
||||
#CAVEDESCRIPTIONS = os.fspath(CAVEDESCRIPTIONS)
|
||||
#ENTRANCEDESCRIPTIONS = os.fspath(ENTRANCEDESCRIPTIONS)
|
||||
|
||||
STATIC_URL = str(STATIC_URL) + "/"
|
||||
MEDIA_URL = str(MEDIA_URL) + "/"
|
||||
|
||||
196
_deploy/xubuntu/localsettingsXubuntu.py.bak
Normal file
196
_deploy/xubuntu/localsettingsXubuntu.py.bak
Normal file
@@ -0,0 +1,196 @@
|
||||
import sys
|
||||
import os
|
||||
import urllib.parse
|
||||
from pathlib import Path
|
||||
"""Settings for a troggle installation which may vary among different
|
||||
installations: for development or deployment, in a docker image or
|
||||
python virtual environment (venv), on ubuntu, debian or in Windows
|
||||
System for Linux (WSL), on the main server or in the potato hut,
|
||||
using SQLite or mariaDB.
|
||||
|
||||
It sets the directory locations for the major parts of the system so
|
||||
that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
|
||||
a system-wide location rather than just a local directory.
|
||||
|
||||
This file is included at the end of the main troggle/settings.py file so that
|
||||
it overwrites defaults in that file.
|
||||
|
||||
Read https://realpython.com/python-pathlib/
|
||||
Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
|
||||
"""
|
||||
|
||||
print(" * importing troggle/localsettings.py")
|
||||
|
||||
#-----------------------------------------------------------------
|
||||
# THINK before you push this to a repo
|
||||
# - have you checked that credentials.py is in .gitignore ?
|
||||
# - we don't want to have to change the expo system password !
|
||||
#-----------------------------------------------------------------
|
||||
# default values, real secrets imported from credentials.py
|
||||
|
||||
SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
|
||||
EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote sever. Tests are then less accurate.
|
||||
#SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
|
||||
|
||||
SERVERPORT = '8000' # not needed
|
||||
|
||||
PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
|
||||
|
||||
# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
|
||||
# so we use pathlib which has been standard since python 3.4
|
||||
# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
|
||||
|
||||
# --------------------- MEDIA redirections BEGIN ---------------------
|
||||
REPOS_ROOT_PATH = Path(__file__).parent.parent
|
||||
LIBDIR = REPOS_ROOT_PATH / 'lib' / PV
|
||||
#LIBDIR = REPOS_ROOT_PATH / 'lib' / 'python3.9' # should be finding this automatically: python --version etc.
|
||||
|
||||
TROGGLE_PATH = Path(__file__).parent
|
||||
TEMPLATE_PATH = TROGGLE_PATH / 'templates'
|
||||
MEDIA_ROOT = TROGGLE_PATH / 'media'
|
||||
JSLIB_ROOT = TROGGLE_PATH / 'media' / 'jslib' # used for CaveViewer JS utility
|
||||
|
||||
#FILES = Path('/mnt/d/expofiles/')
|
||||
EXPOFILES = Path('/media/philip/sd-huge1/cucc-expo/expofiles/')
|
||||
SCANS_ROOT = EXPOFILES / 'surveyscans'
|
||||
PHOTOS_ROOT = EXPOFILES / 'photos'
|
||||
PHOTOS_YEAR = "2022"
|
||||
|
||||
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||
# trailing slash if there is a path component (optional in other cases).
|
||||
MEDIA_URL = '/site-media/'
|
||||
|
||||
DIR_ROOT = ''#this should end in / if a value is given
|
||||
URL_ROOT = '/'
|
||||
# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
|
||||
|
||||
#Note that these constants are not actually used in urls.py, they should be..
|
||||
MEDIA_URL = urllib.parse.urljoin(URL_ROOT , '/site_media/')
|
||||
SCANS_URL = urllib.parse.urljoin(URL_ROOT , '/survey_scans/')
|
||||
PHOTOS_URL = urllib.parse.urljoin(URL_ROOT , '/photos/')
|
||||
SVX_URL = urllib.parse.urljoin(URL_ROOT , '/survex/')
|
||||
|
||||
|
||||
STATIC_URL = urllib.parse.urljoin(URL_ROOT , '/static/') # used by Django admin pages. Do not delete.
|
||||
JSLIB_URL = urllib.parse.urljoin(URL_ROOT , '/javascript/') # used for CaveViewer JS utility
|
||||
|
||||
#STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
|
||||
# --------------------- MEDIA redirections END ---------------------
|
||||
|
||||
PUBLIC_SITE = True
|
||||
DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
|
||||
CACHEDPAGES = True # experimental page cache for a handful of page types
|
||||
|
||||
# executables:
|
||||
CAVERN = 'cavern' # for parsing .svx files and producing .3d files
|
||||
SURVEXPORT = 'survexport' # for parsing .3d files and producing .pos files
|
||||
|
||||
DBSQLITE = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME' : 'troggle.sqlite',
|
||||
# 'NAME' : ':memory:',
|
||||
'USER' : 'expo', # Not used with sqlite3.
|
||||
'PASSWORD' : 'sekrit', # Not used with sqlite3.
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
DBMARIADB = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql', # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
|
||||
'NAME' : 'troggle', # Or path to database file if using sqlite3.
|
||||
'USER' : 'expo',
|
||||
'PASSWORD' : 'my-secret-password-schwatzmooskogel',
|
||||
'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.
|
||||
'PORT' : '', # Set to empty string for default. Not used with sqlite3.
|
||||
}
|
||||
}
|
||||
|
||||
# default database for me is squlite
|
||||
DBSWITCH = "sqlite"
|
||||
|
||||
if DBSWITCH == "sqlite":
|
||||
DATABASES = DBSQLITE
|
||||
if DBSWITCH == "mariadb":
|
||||
DATABASES = DBMARIADB
|
||||
|
||||
NOTABLECAVESHREFS = [ "290", "291", "359", "264", "258", "204", "76", "107"]
|
||||
|
||||
PYTHON_PATH = REPOS_ROOT_PATH / 'troggle'
|
||||
sys.path.append(os.fspath(REPOS_ROOT_PATH))
|
||||
sys.path.append(os.fspath(PYTHON_PATH))
|
||||
|
||||
LOGFILE = PYTHON_PATH / 'troggle.log'
|
||||
PYTHON_PATH = os.fspath(PYTHON_PATH)
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [
|
||||
TEMPLATE_PATH
|
||||
],
|
||||
'OPTIONS': {
|
||||
'debug': 'DEBUG',
|
||||
'context_processors': [
|
||||
# django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
|
||||
'django.contrib.auth.context_processors.auth', # knowledge of logged-on user & permissions
|
||||
'core.context.troggle_context', # in core/troggle.py - only used in expedition.html
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.i18n',
|
||||
'django.template.context_processors.media', # includes a variable MEDIA_URL
|
||||
'django.template.context_processors.static', # includes a variable STATIC_URL used by admin pages
|
||||
'django.template.context_processors.tz',
|
||||
'django.template.context_processors.request', # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
'loaders': [
|
||||
'django.template.loaders.filesystem.Loader', # default lcation is troggle/templates/
|
||||
'django.template.loaders.app_directories.Loader', # needed for admin 'app'
|
||||
]
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"
|
||||
EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"
|
||||
|
||||
EXPOUSER = 'expo'
|
||||
EXPOUSER_EMAIL = 'philip.sargent@gmail.com'
|
||||
EXPOADMINUSER = 'expoadmin'
|
||||
EXPOADMINUSER_EMAIL = 'philip.sargent@gmail.com'
|
||||
|
||||
EMAIL_HOST = "smtp-auth.mythic-beasts.com"
|
||||
EMAIL_HOST_USER = "django-test@klebos.net" # Philip Sargent really
|
||||
EMAIL_PORT=587
|
||||
EMAIL_USE_TLS = True
|
||||
DEFAULT_FROM_EMAIL = 'django-test@klebos.net'
|
||||
|
||||
SURVEX_DATA = REPOS_ROOT_PATH / "loser"
|
||||
DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
|
||||
|
||||
EXPOWEB = REPOS_ROOT_PATH / "expoweb"
|
||||
#SURVEYS = REPOS_ROOT_PATH
|
||||
CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
|
||||
ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
|
||||
EXPOWEB_URL = ''
|
||||
# SCANS_URL = '/survey_scans/' # defunct, removed.
|
||||
|
||||
# Sanitise these to be strings as all other code is expecting strings
|
||||
# and we have not made the change to pathlib Path type in the other localsettings-* variants yet.
|
||||
CAVEDESCRIPTIONS = os.fspath(CAVEDESCRIPTIONS)
|
||||
ENTRANCEDESCRIPTIONS = os.fspath(ENTRANCEDESCRIPTIONS)
|
||||
LOGFILE = os.fspath(LOGFILE)
|
||||
#SURVEYS = os.fspath(SURVEYS)
|
||||
EXPOWEB = os.fspath(EXPOWEB)
|
||||
DRAWINGS_DATA = os.fspath(DRAWINGS_DATA)
|
||||
SURVEX_DATA = os.fspath(SURVEX_DATA)
|
||||
REPOS_ROOT_PATH = os.fspath(REPOS_ROOT_PATH)
|
||||
TEMPLATE_PATH = os.fspath(TROGGLE_PATH)
|
||||
MEDIA_ROOT = os.fspath(MEDIA_ROOT)
|
||||
JSLIB_ROOT = os.fspath(JSLIB_ROOT)
|
||||
SCANS_ROOT = os.fspath(SCANS_ROOT)
|
||||
112
_deploy/xubuntu/os-trog.sh
Executable file
112
_deploy/xubuntu/os-trog.sh
Executable file
@@ -0,0 +1,112 @@
|
||||
#!/bin/bash
|
||||
# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
|
||||
# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
|
||||
# 'Open Linux shell here'
|
||||
echo 'Run this in a terminal in the troggle directory: "bash venv-trog.sh"'
|
||||
cat /etc/os-release
|
||||
# Expects an Ubuntu 22.04 relatively clean install.
|
||||
|
||||
sudo apt install python-is-python3 -y
|
||||
python --version : ensure python is an alias for python3 not python2.7
|
||||
sudo apt update -y
|
||||
sudo apt dist-upgrade -y
|
||||
sudo apt autoremove -y
|
||||
sudo apt install sqlite3 -y
|
||||
sudo apt install python3-pip -y
|
||||
|
||||
# this installs a shed-load of other stuff: binutils etc.sudo apt install survex-aven
|
||||
sudo apt install git openssh-client -y
|
||||
# On a clean debian 11 (bullseye) installation with Xfce & ssh,
|
||||
|
||||
#on ubuntu 20.04:
|
||||
#Package sftp is not available, but is referred to by another package.
|
||||
#This may mean that the package is missing, has been obsoleted, or
|
||||
#is only available from another source
|
||||
#E: Package 'sftp' has no installation candidate
|
||||
|
||||
|
||||
# On Ubuntu 20.04, with python10, the pip install fails.
|
||||
# So you need to get the pip from source
|
||||
# sudo curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10
|
||||
# but really you should be using 22.04
|
||||
# and also, isf using debian,
|
||||
# sudo python3.10 -m pip install -U virtualenv
|
||||
|
||||
# do not actually use this any more
|
||||
sudo useradd expo
|
||||
sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
|
||||
|
||||
# as debian does not install everything that ubuntu does, you need:
|
||||
sudo apt install python3-venv -y
|
||||
sudo apt install python3-dev -y
|
||||
|
||||
# default since 22.04
|
||||
# sudo apt install python3.10
|
||||
sudo apt install python3.11-venv -y
|
||||
sudo apt install python3.11-dev -y
|
||||
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.11 1
|
||||
|
||||
sudo apt install mariadb-server -y
|
||||
sudo apt install libmariadb-dev -y
|
||||
|
||||
sudo python -m pip install --upgrade pip
|
||||
|
||||
sudo apt install sftp -y
|
||||
echo '###'
|
||||
echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
|
||||
echo '###'
|
||||
sudo apt install tunnelx therion -y
|
||||
sudo apt install gedit
|
||||
|
||||
# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
|
||||
# sudo service mysql start
|
||||
|
||||
echo "### python 3.12"
|
||||
sudo add-apt-repository ppa:deadsnakes/ppa -y
|
||||
sudo apt update
|
||||
sudo apt install python3.12-full -y
|
||||
sudo apt install python3.12-distutils -y
|
||||
sudo apt install python3.12-venv -y
|
||||
|
||||
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.12 7
|
||||
sudo update-alternatives --config python
|
||||
sudo rm /usr/bin/python3
|
||||
sudo ln -s /etc/alternatives/python /usr/bin/python3
|
||||
sudo apt dist-upgrade
|
||||
|
||||
|
||||
# install VS code - but ONLY on a native ubuntu install, NOT in WSL
|
||||
sudo apt install software-properties-common apt-transport-https wget gpg
|
||||
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
|
||||
sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
|
||||
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
|
||||
sudo apt update
|
||||
sudo apt install code
|
||||
|
||||
#this next crashes, why?
|
||||
#sudo python -m pip install --upgrade pip
|
||||
|
||||
sudo apt install gpsprune qgis gedit tig gitg meld rsync
|
||||
|
||||
git config --global user.email "you@example.com"
|
||||
git config --global user.name "Your Name"
|
||||
git config --global pull.rebase true
|
||||
|
||||
echo '###'
|
||||
echo '### Currently set version of python'
|
||||
python --version
|
||||
|
||||
echo '###'
|
||||
echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
|
||||
echo '### because you can't clone the repos without a key
|
||||
# cd ~/expo
|
||||
|
||||
git clone ssh://expo@expo.survex.com/home/expo/troggle
|
||||
git clone ssh://expo@expo.survex.com/home/expo/loser
|
||||
git clone ssh://expo@expo.survex.com/home/expo/expoweb
|
||||
git clone ssh://expo@expo.survex.com/home/expo/drawings
|
||||
|
||||
mkdir expofiles
|
||||
rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" expo@expo.survex.com:expofiles/ expofiles
|
||||
rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.s^Cvex.com:expofiles/photos/ expofiles/photos
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user