diff --git a/Dockerfile b/Dockerfile index f70e68ee4..24f322adf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -89,8 +89,8 @@ ENV LANGUAGE=en_US.UTF-8 # Python runtime settings: # - unbuffered output for log visibility in containers # - add /app to PYTHONPATH for module resolution -ENV PYTHONUNBUFFERED 1 -ENV PYTHONPATH /app +ENV PYTHONUNBUFFERED=1 \ + PYTHONPATH=/app # Default Django settings module for container runtime (can be overridden). ENV DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE:-concordia.settings_docker} @@ -105,14 +105,27 @@ COPY . /app # Front-end build and asset pipeline: # - update npm to a known major version -# - install JS dependencies (production-only) and build assets via gulp -RUN npm install --silent --global npm@10 && npm install --silent --omit=dev && npx gulp build +# - Install all JS dependencies (including devDependencies for plugins) +RUN npm install --silent --global npm@10 && npm install --silent + # Additional JS build step for Vite. -RUN npm run build +# - Build legacy (gulp css...) and modern assets (Vite) +# - This populates concordia/static/dist with hashed and compressed files. +RUN npx gulp build && npm run build + +# Create Log Directory +# - Required for Django logging initialization when running collecstatic. +RUN mkdir -p /app/logs # Install Python dependencies into the system environment using Pipenv and -# remove Pipenv cache to reduce image size. -RUN pipenv install --system --dev --deploy && rm -rf ~/.cache/ +# - Bake static files into the image (Fast, no post-processing) +# - remove Pipenv cache to reduce image size. +RUN pipenv install --system --dev --deploy && \ + python manage.py collectstatic --no-input --no-post-process && \ + rm -rf ~/.cache/ + +# - Clean up node artifacts to reduce image size +RUN rm -rf node_modules && rm -rf ~/.cache/ # Container listens on port 80. EXPOSE 80 diff --git a/Pipfile b/Pipfile index feaf1c68c..976a7bb89 100644 --- a/Pipfile +++ b/Pipfile @@ -59,6 +59,7 @@ certifi = "==2025.7.14" websocket-client = "<1.8.0" django = "~=5.2.0" black = "*" +django-vite = "~=3.1.0" [dev-packages] invoke = "==2.2.0" diff --git a/Pipfile.lock b/Pipfile.lock index dba8bf781..38f304d60 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c1fb6c8941df9835252579198a0293a4d23f415eda80fe6974b5c1013fc9ab1b" + "sha256": "24f3b7689eec8579faa6a0d89d34a73f602eadd65cf860ee561281ec205a9954" }, "pipfile-spec": 6, "requires": { @@ -920,6 +920,14 @@ "markers": "python_version >= '3.8'", "version": "==4.1.0" }, + "django-vite": { + "hashes": [ + "sha256:4e46572bd6b1ce70784be129205dc2ffcbc7a3c19fea50bebfb72b327bbde5fc", + "sha256:8b4ffe4a9fa81ff568bfb195e74dde8694aaf13fd4b656ae60bf59cce08b85e8" + ], + "index": "pypi", + "version": "==3.1.0" + }, "et-xmlfile": { "hashes": [ "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", @@ -1085,146 +1093,146 @@ }, "geventhttpclient": { "hashes": [ - "sha256:0175078426fb0083881ee4a34d4a8adc9fdf558eb9165ecde5a3a8599730d26e", - "sha256:06c28d3d1aabddbaaf61721401a0e5852b216a1845ef2580f3819161e44e9b1c", - "sha256:089fb07dd8aec37d66deceb3b970b717ee37cdd563054f30edc817646463491b", - "sha256:0985fd1d24f41f0ba0c1f88785a932e1284d80f97fa3218d305d0a2937c335ab", - "sha256:09961922a68e97cf33b118130b16219da4a8c9c50f521fbf61d7769036e53d87", - "sha256:0b1564f10fd46bf4fce9bf8b1c6952e2f1c7b88c62c86f2c45f7866bd341ba4b", - "sha256:0da011dc9a3db67a63fc946d602321ea549d4e6967e808a2d92a80d1f2b26870", - "sha256:0daa0afff191d52740dbbba62f589a352eedd52d82a83e4944ec97a0337505fa", - "sha256:0e257c2bafa4ebca2f713860f867fe99e8563f43ea9ac2bc01415418ff9d7cff", - "sha256:120e84917627c64d8ff466ece79501f9080806eb07c6f1a8c1e6f042e87aa2a3", - "sha256:1235eef16cc51dc5d595948833f98bd0601f2497a31af489a34b4b6de7a7272e", - "sha256:12e7374a196aa82933b6577f41e7934177685e3d878b3c33ea0863105e01082f", - "sha256:138872f743518f18ebd13f7b522221292edeecebe67904b7bbbe870e62253213", - "sha256:1b45167d9d8169e7abe63df8707a6cf6b77cdb223e16389104a8c17e6ec12ed0", - "sha256:1d0695eab01ec2ce30c0b49e42b88b9d6ac3308325da7041ce5d12117cd5526b", - "sha256:264de1e0902c93d7911b3235430f297a8a551e1bc8dd29692f8620f606d4cecf", - "sha256:37ffa13c2a3b5311c92cd9355cb6ba077e74c2e5d34cd692e25b42549fa350d5", - "sha256:383d6f95683a2fe1009d6d4660631e1c8f04043876c48c06c2e0ad64e516db5d", - "sha256:3a6c3cd6e0583be68c18e33afa1fb6c86bc46b5fcce85fb7b4ef23f02bc4ee25", - "sha256:4085d23c5b86993cdcef6a00e788cea4bcf6fedb2f2eb7c22c057716a02dc343", - "sha256:414649cc6cb18d646865863a6d493e53d00f0f191acea8f3e74732cddcc370f4", - "sha256:46ef540dca5b29103e58e86876a647f2d5edcad52c0db3cb3daa0a293f892a09", - "sha256:51c19b5b2043d5fed8225aba7d6438f193ca7eb2c74693ee79d840e466c92d59", - "sha256:531dbf14baad90ad319db4d34afd91d01a3d14d947f26666b03f49c6c2082a8f", - "sha256:59537dc951ac4e10d68bfe9484f4e6b200012a737271e187cb6760dccba1875d", - "sha256:59745cc2b1bd1da99547761188e6c24387acc9f316f40b2dcfd53a8497eff866", - "sha256:5f9ef048b05c53085cfbd86277a00f18e99c614ce62b2b47ec3d85a76fdccb38", - "sha256:602de0f6e20e06078f87ca8011d658d80e07873b3c2c1aaa581cac5fc4d0762b", - "sha256:607b7a1c4d03a94ec1a2f4e7891039fde84fcd816f2d921a28c11759427f068f", - "sha256:63b616e6ad33f56c5c3a05685ce09b21cd68984d961cf85545b7e734920567a6", - "sha256:6d975972e95014f57642fc893c4b04f6009093306b3bdba45729062c892a6b6a", - "sha256:6fa0dae49bc6226510be2c714e78b10efa8c0e852628a1c0b345e463c81405ff", - "sha256:72ba8cd2248f4885744ef45a696b3d549b5df3b907d5b88f251e71a1a62f7206", - "sha256:73ee651ce1842d99059937efefdbc1fc68c3b355cd4be38b8e10e8e1f954d8e3", - "sha256:755bbf8b800bc8baf0ba764580cb4c1599c1b1ca30eb20afe1c9c8e8e47fac8c", - "sha256:7633377aac25e1aeb9f34a8e64e0688eaee3c47471e199489ae267bc399078b8", - "sha256:77a9ce7c4aaa5f6b0c2256ee8ee9c3bf3a1bc59a97422f0071869670704ec7f8", - "sha256:7b6157b5c875a19ad2547c226ec53d427e943f9fde6f6fe2e83b73edd0286df3", - "sha256:7b9a3a4938b5cc47f9330443e0bdd3fcdb850e6147147810fd88235b7bc5c4e8", - "sha256:80199b556a6e226283a909a82090ed22408aa0572c8bfaa5d3c90aafa5df0a8b", - "sha256:847df15b38330fe2c845390977100fde79e4e799b14a0e389a7c942f246e7ea1", - "sha256:84da5688f8f005334856d17ba210e24d9b58576c6428ab4809915b98175901e4", - "sha256:85884a27762145c3671b80e6dd6c6a0c33b65bed9fde22df8283b93cadac776c", - "sha256:86c0de875b0975168c1d4b8db74ccb3be200bfe5da699b1e564511eeec677336", - "sha256:877e2eae36cb735aab0a5b870c1fc3ce18012f1a267f6014a1fbd3d3cbca7041", - "sha256:88caf6ba4d69f433f5eddbbe6909d4f9c41a1974322fadce6ce1215cdabe9b58", - "sha256:899786c82751b5cb2eebc57642efa25095e8f9e362f1c6a761ca62fba1c0b3f1", - "sha256:8a5c641fde195078212979469e371290625c367666969fce0c53caea1fc65503", - "sha256:9537bc6ef21ba4d50d4a48ddbe12ac5168857ebf34ce1452d290ecf6d68d9e58", - "sha256:955cf67668498329f6b1c9ba10f484a0640391c27998c237c15c79bfd7e8ed18", - "sha256:9dbabbba1b18581cc11ebf0693b3a9a24eefa5cbec40955675c20e56dae65fa2", - "sha256:a64cd96a81c657c73da0fa62265ed81b044b3d8a1417b3ad408b31f12d5f50e7", - "sha256:ad06347ff320ba0072112c26c908b16451674d469b74d0758ac1a9a2f1e719e9", - "sha256:b013d45ad10a453b14bb7c398056519db427c3c92388baa10f022715fabc92cf", - "sha256:b1823f5b7bc82b2f657fc1a8c7d8c978faa9bb1703a40ab1e988facecf855cac", - "sha256:b95b6c133b6793792cca71a8c744fc6f7a5e9176d55485d6bf2fe0a7422f7905", - "sha256:c2ca897e5c6291fb713544c60c99761d7ebb1f1ee1f122da3b6e44d1a67943dc", - "sha256:c4905a3810fb59c62748bc867ea564641e8933dc4095504deb21ac355b501836", - "sha256:c6c2e5aa97a47f9222c698cb0682ce7e3e2b6895132b81638332080a233808ea", - "sha256:c98dadee94f5bbd29d44352f6a573a926238afa4c52b9eb6cf1a0d9497550727", - "sha256:c9beb5a9d9049223393148490274e8839a0bcb3c081a23c0136e23c1a5fbeb85", - "sha256:cc113343bdde7ba0688e55367e955e97310ef98f9fd11b3e7e29047b7af4b6b4", - "sha256:ceb81f286abb196f67922d76c879a6c79aa85b9447e3d3891143ba2e07d9e10e", - "sha256:cfcaf1ace1f82272061405e0f14b765883bc774071f0ab9364f93370f6968377", - "sha256:d3d834926f570ae19108f2c2ca5e964700d1e76e8e0ba878eb6e85efdbae7001", - "sha256:d448ce9de206dbd4a722e5c263c8f88319953fa4c97958c4403b7bbc3b813cf1", - "sha256:d5b1e82690c1266d75c20f034ad51d0703d6b1acb23d0c823a931998ea3b09d1", - "sha256:df22102bd2975f15ab7063cd329887d343c6ef1a848f58c0f57cbefb1b9dd07b", - "sha256:e525a2cfe8d73f62e94745613bbf29432ddb168c6eb1b57f5335198d43c97542", - "sha256:e86f5b6f555c7264b5c9b37fd7e697c665692b8615356f33b686edcea415847a", - "sha256:eb1283aff6cb409875491d777b88954744f87763b5a978ad95263c57dbb2a517", - "sha256:eb1838792a81cacccb5a11da268d5ae84061667234af5e6047324d882d49a7ce", - "sha256:ed0e7b83a80996540e0f42b855572834f3d7e338aafe88a55329b3c5fa58b82f", - "sha256:f1f7247ed6531134387c8173e2cfaa832c4a908adbf867e042c317a534ea363c", - "sha256:f3b83a13f3d275e0d066af3f503be3811b5bb32cd361740e8f754be69cfd2f3d", - "sha256:fb9b16ab166e985ff64c092836555fdffb972f73ec8dcaab5d7fdf791c8cef02", - "sha256:fbad11254abdecf5edab4dae22642824aca5cbd258a2d14a79d8d9ab72223f9e", - "sha256:ff9ab5a001d82e70a9368c24b6f1d1c7150aa0351a38d0fdeaf82e961a94ea78" + "sha256:01b6976040c595cccc16540db90738332729d44d1a6aad070d3fa756d24ef324", + "sha256:02fe731cf8cd9b0677ebc107c97bee49540b86fa3a2f7c9c833b0329d9594da8", + "sha256:09d91d6b8567d72408c3a00163b2f61c10f87549e782c904b8f0108cce49ae4e", + "sha256:09ee4ba836a8453d64e91e1e706d9d39ec01ce0700bddedd99432252b6e6f51f", + "sha256:0b430039848a1c223b2f645eed21540c39be50787bd2726c6d16890068410cd2", + "sha256:0c48798361d02d59d597b6db7c2524b23fc61a0083b52a6e196eea579c9d9013", + "sha256:111a556fd7c7433b2ce248c3edb2b97f01e062442d8d898f6eeb0a5261b0af00", + "sha256:143fc99cfde502f3d83e268e9baa47bff1ccb33730c2f5f1bd7ccf2552ad8bcb", + "sha256:1893c76fde909f884c61efd1696621e2351143d98c93665fae7519eda9e5888a", + "sha256:1e1d15cdfdd8974db808e8ef60fffe12eabb2a2505b3392a4419d19bac6bc059", + "sha256:1e7f1f88008b649aba8abad81de9701714128ab785661af80a1eb320667b8916", + "sha256:20b52ef5b200b9eb6eb481b87738af9a62594916f609fc28695eb0ae01d15db0", + "sha256:2177b5f0b087760b2fcc09bb66f8ef14ce871311823f9c28ac6ae36c7858df17", + "sha256:21f7634284d81684e426fd38bbabd455d3b06cb55928e197861fe33ab1a9a58f", + "sha256:2810bc84676e76b846e8775a5ad65dab0b52531792af609bab80b794d2b4f105", + "sha256:28e95ea810b3274b6fefa3b42a5627342f6b97fa7fae17c4a4b2f8509029c624", + "sha256:2e32b5600782895341895ee85cbd53afce37e8bd8c77f5028961055054272bc2", + "sha256:2ef73539521f9a55144f089351ec5f83c1c5ad11fab33af382de82745923cbd2", + "sha256:30c0fcdc5d90eac6ebc14206981ecfecda7dfca873b930e73c700c4d7ea3006d", + "sha256:33e8a93a79385a0c24a57b47602e973d7bdef1e5a4e1a08e3b84fef36da9e5b6", + "sha256:36f92541eab8802bef8435a717cb4e2e75094c7eb9cabed1792bfb0f6f17c098", + "sha256:379d9af296520f8ac195d5988709d888b3c456f85fc5f2c2dfda149ffd03cc41", + "sha256:39da3e44a92ee896bd78414023f547c3481861e90181d18e8a85ca030735b0d3", + "sha256:3c0e47224e933a91ae01089e5110b23fd256e6ac5e1b9eb3a09819f90d0336ca", + "sha256:3ca6b46878f6a52130c5d4657d9fba291052c0e43b9b356bbd06e900c8e1efb8", + "sha256:3f66bc547cf671832a68aa1a150fd3536a331225bcf1abffb3da293989db06cb", + "sha256:4f335f303b10e95945b05e56847f07774d6726e774186e7885efe3e314a0e1e9", + "sha256:5c856b1cceb01bd2bbddae4fb5769b7d2dc3252db3d4dd8f0ca6acc1ee323ccd", + "sha256:5e5f260c3f88adc8628abb6c14a2092bb384388706e46cdf634d677be8dcb8dc", + "sha256:5f678b53e71e4b66095ee6c8da49e29ef0a55cd35b28b8912f7c03cb3033bff8", + "sha256:697f9be188c03d4d642c87bdac6bf886eafa4e5e1ad45d6d85dac63b111ca6bb", + "sha256:6f3c9c254e0586f1698c20eb068f0922ed79be786897ba4dcece480f6cc487d7", + "sha256:705dc977748b0e3456ee357469436c86e570ba6b16cb3b7ac984c7e3acc006f8", + "sha256:745d429e9c78a3b2653ddda625380e4d614e80630ec2b180f3a6582936701668", + "sha256:7514fe1290f1e63498ed4e9bca49db37702a8d92bdcbf909131757153b97c0f6", + "sha256:7ab19f0cb8e2f269d823eea31e59ec8ddde937a5a5c6fd671eec191fce962761", + "sha256:7d06555313ad1694ddd0c32debf3a63f6c4ad58c00a5bb487d542fc79a500294", + "sha256:7f06be4b8d5fde080e813a4db75632a161eb5e2a0156be484915575906f8a01e", + "sha256:7fa38728eb42845fafe4c29c070d966fe7609e1c9b45270fd8f8f701654aebaa", + "sha256:81261dd7dff7cde330bf3c6c082b8f963d6b8d839a609d2b3f0b5ab73792ac43", + "sha256:8201d1722e57c6bda3733b7315b66fee28793ee931b5e54291afaeaa768ee187", + "sha256:87acbc14dfae5d5d969250a91e372758cbb87648f9b1cd9f5a21df7ab49ca6ac", + "sha256:89186f8cfb777b85fb0a7090e0809c4c24828926750eab3af26a6366a65d1a5f", + "sha256:894d0548734eed0f5b35f4d1edba77c07d87684227a72d86652499dd07bdb217", + "sha256:8a527620050be2a59bced0a221d7fe90c52fffd069589b7762a21f1a2d3f09c1", + "sha256:8b2dea6f4b769d570738c7f8b18b3c53c8a5a3bea70f91b60797567551553333", + "sha256:90a2b610c857e387969fadf185ae34accf655776d61ff3bfb4bd1437048ba721", + "sha256:92d8c8b14aa6f62467b28fc45e4a9cd661d96b176f88b515920bda31a9bf8cb1", + "sha256:93cc387ca3d6267410c1dfae8bc892d5465ea59b48042399667668ce3d96e079", + "sha256:93f95c45345d6ee22a26208617559ab811c47b294914f29751a8860992a45bd9", + "sha256:94a379b5c9d0e3f18b41fed23ecb3ae07cff051ed1cc4af02f97403e55d532d6", + "sha256:9982d1eb3d1ae563c044de75a9a25a9c84e4f72579cb7449cdb8bb3a1cb64f9d", + "sha256:9d0835440b9c2276742197b1c88734ab347ee8c2ae25a11c4ad6fadbfa025b1f", + "sha256:9e908de16ee1e0439c6ee4bb5ff4bafc17b769f5f74dbd9b52bda0b2027fddb1", + "sha256:a6cd539b3f3397d4835198026fc907e553ea47a4dae9b9be6618a16ec9fb7a32", + "sha256:a74e9be893bd79884298daecc3e2d8ecf4d5ebb41234f62e1f0cc17f81f74099", + "sha256:ab7bd317bfd2d68d3d112263b7fe0bb3374089f203df02321e2d795b1131e90a", + "sha256:ae0d15984708f925159f4ccb1016cb718abf1569ba2873485b6a78301f5d0ded", + "sha256:b32c4745799992e9461071b8a9e20418830beb2203c865162df0d6f3d2821d8d", + "sha256:b7d9cd2c967d6ecc6987f3fe8e1c7646074a74c7b192fdb8fcd12762ab6f45c5", + "sha256:b7de76657a8be048b23c9e712fa64ca217f7bf403de1b5391ee2c35d4ffe6d46", + "sha256:c286994666067e6cf41430e1935acbad72b08b76bcc2755e2224e4af1c343760", + "sha256:c6b558e7b0f501dcb37be8dfe2ce16542c21632658cdd0698bad6fb06d21aefe", + "sha256:c77a62391db49b16980e231694a313a94b3bd14ef71c391386d10e4abb6a1101", + "sha256:d075255305d6db5b730c67012fa67c7dd7fd9b46e702bf45eb7ab9e5cc3c7b3c", + "sha256:d302045fbd93d0045fff8aba8cc325fa9ba88b9b9c5c758cd894b39f2b9cf722", + "sha256:d3ba8e8c0d4f02730f0a623ac371b7621d1ca1f61cb320b7c5ecc8c71fd9d3d1", + "sha256:dc579da6c97d67b0478a92191c9e3172deb0520ebbe0ac0007674ab8b44010e3", + "sha256:deccbcbe36b942c20be13918ff24b8bdcc1585c59152597027f28832211802d1", + "sha256:e3848771ad9ea56d5f1765b58588258d519352f246c88f0e2afe31f699f6e3ce", + "sha256:e3e037042ee861e712ef967e1ba353b8052da911d12ecbbaf05df26b4f60c6b3", + "sha256:e539f951a183f3a56d589e33981706699dfd9e2444ae7446f11bba7ab3ed825d", + "sha256:ead7cd12f8ffcd5775f50abefe0bf821aca8edbdf9c9b3a080f6e0ede18013fa", + "sha256:ebce5d7901aea2174e671212dc7217fd701f37c1b2afce21e4e7f5f3c4b0cd8a", + "sha256:ed84bdf97460cf8019ab547d11a6cdbf9d3f110e8ac1c9960a7d7be8b65576c8", + "sha256:ef6d125bd0e0ff0a1f8113c0c294bc27083cf5b03fc29d898c2ae1b71ea87065", + "sha256:f66e88c08a0d861a61f74dc47118ccbef026ba39891edf7cccd5ff806760d913", + "sha256:fcfb5529aa1360149d22ceb022732a6101c531421c5990dcb2df494b112f39ce" ], "markers": "python_version >= '3.9'", - "version": "==2.3.7" + "version": "==2.3.8" }, "greenlet": { "hashes": [ - "sha256:02925a0bfffc41e542c70aa14c7eda3593e4d7e274bfcccca1827e6c0875902e", - "sha256:04bee4775f40ecefcdaa9d115ab44736cd4b9c5fba733575bfe9379419582e13", - "sha256:070472cd156f0656f86f92e954591644e158fd65aa415ffbe2d44ca77656a8f5", - "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd", - "sha256:1108b61b06b5224656121c3c8ee8876161c491cbe74e5c519e0634c837cf93d5", - "sha256:12184c61e5d64268a160226fb4818af4df02cfead8379d7f8b99a56c3a54ff3e", - "sha256:14194f5f4305800ff329cbf02c5fcc88f01886cadd29941b807668a45f0d2336", - "sha256:20fedaadd422fa02695f82093f9a98bad3dab5fcda793c658b945fcde2ab27ba", - "sha256:27289986f4e5b0edec7b5a91063c109f0276abb09a7e9bdab08437525977c946", - "sha256:2f080e028001c5273e0b42690eaf359aeef9cb1389da0f171ea51a5dc3c7608d", - "sha256:301860987846c24cb8964bdec0e31a96ad4a2a801b41b4ef40963c1b44f33451", - "sha256:32e4ca9777c5addcbf42ff3915d99030d8e00173a56f80001fb3875998fe410b", - "sha256:33a956fe78bbbda82bfc95e128d61129b32d66bcf0a20a1f0c08aa4839ffa951", - "sha256:34a729e2e4e4ffe9ae2408d5ecaf12f944853f40ad724929b7585bca808a9d6f", - "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2", - "sha256:3a300354f27dd86bae5fbf7002e6dd2b3255cd372e9242c933faf5e859b703fe", - "sha256:3e0f3878ca3a3ff63ab4ea478585942b53df66ddde327b59ecb191b19dbbd62d", - "sha256:3e63252943c921b90abb035ebe9de832c436401d9c45f262d80e2d06cc659242", - "sha256:41848f3230b58c08bb43dee542e74a2a2e34d3c59dc3076cec9151aeeedcae98", - "sha256:49f4ad195d45f4a66a0eb9c1ba4832bb380570d361912fa3554746830d332149", - "sha256:4b065d3284be43728dd280f6f9a13990b56470b81be20375a207cdc814a983f2", - "sha256:4b9721549a95db96689458a1e0ae32412ca18776ed004463df3a9299c1b257ab", - "sha256:50e1457f4fed12a50e427988a07f0f9df53cf0ee8da23fab16e6732c2ec909d4", - "sha256:59913f1e5ada20fde795ba906916aea25d442abcc0593fba7e26c92b7ad76249", - "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c", - "sha256:6423481193bbbe871313de5fd06a082f2649e7ce6e08015d2a76c1e9186ca5b3", - "sha256:65be2f026ca6a176f88fb935ee23c18333ccea97048076aef4db1ef5bc0713ac", - "sha256:67ea3fc73c8cd92f42467a72b75e8f05ed51a0e9b1d15398c913416f2dafd49f", - "sha256:71c767cf281a80d02b6c1bdc41c9468e1f5a494fb11bc8688c360524e273d7b1", - "sha256:76e39058e68eb125de10c92524573924e827927df5d3891fbc97bd55764a8774", - "sha256:7932f5f57609b6a3b82cc11877709aa7a98e3308983ed93552a1c377069b20c8", - "sha256:7a3ae05b3d225b4155bda56b072ceb09d05e974bc74be6c3fc15463cf69f33fd", - "sha256:7ab327905cabb0622adca5971e488064e35115430cec2c35a50fd36e72a315b3", - "sha256:7b2fe4150a0cf59f847a67db8c155ac36aed89080a6a639e9f16df5d6c6096f1", - "sha256:7e806ca53acf6d15a888405880766ec84721aa4181261cd11a457dfe9a7a4975", - "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f", - "sha256:92497c78adf3ac703b57f1e3813c2d874f27f71a178f9ea5887855da413cd6d2", - "sha256:96aff77af063b607f2489473484e39a0bbae730f2ea90c9e5606c9b73c44174a", - "sha256:aec9ab04e82918e623415947921dea15851b152b822661cce3f8e4393c3df683", - "sha256:b066e8b50e28b503f604fa538adc764a638b38cf8e81e025011d26e8a627fa79", - "sha256:b31c05dd84ef6871dd47120386aed35323c944d86c3d91a17c4b8d23df62f15b", - "sha256:bd59acd8529b372775cd0fcbc5f420ae20681c5b045ce25bd453ed8455ab99b5", - "sha256:bfb2d1763d777de5ee495c85309460f6fd8146e50ec9d0ae0183dbf6f0a829d1", - "sha256:c620051669fd04ac6b60ebc70478210119c56e2d5d5df848baec4312e260e4ca", - "sha256:c9f9d5e7a9310b7a2f416dd13d2e3fd8b42d803968ea580b7c0f322ccb389b97", - "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5", - "sha256:cc98b9c4e4870fa983436afa999d4eb16b12872fab7071423d5262fa7120d57a", - "sha256:d842c94b9155f1c9b3058036c24ffb8ff78b428414a19792b2380be9cecf4f36", - "sha256:da19609432f353fed186cc1b85e9440db93d489f198b4bdf42ae19cc9d9ac9b4", - "sha256:e0093bd1a06d899892427217f0ff2a3c8f306182b8c754336d32e2d587c131b4", - "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9", - "sha256:e84b51cbebf9ae573b5fbd15df88887815e3253fc000a7d0ff95170e8f7e9729", - "sha256:ed6b402bc74d6557a705e197d47f9063733091ed6357b3de33619d8a8d93ac53" + "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", + "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", + "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", + "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", + "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", + "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", + "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", + "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", + "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", + "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", + "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", + "sha256:4375a58e49522698d3e70cc0b801c19433021b5c37686f7ce9c65b0d5c8677d2", + "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", + "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", + "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", + "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", + "sha256:508c7f01f1791fbc8e011bd508f6794cb95397fdb198a46cb6635eb5b78d85a7", + "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e", + "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", + "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f", + "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", + "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", + "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", + "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", + "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca", + "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", + "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", + "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", + "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", + "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", + "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef", + "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", + "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", + "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55", + "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", + "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", + "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", + "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", + "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f", + "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", + "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", + "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13", + "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", + "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", + "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", + "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", + "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", + "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", + "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", + "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", + "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", + "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", + "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9" ], "markers": "python_version >= '3.10'", - "version": "==3.3.1" + "version": "==3.3.2" }, "grpcio": { "hashes": [ @@ -1918,11 +1926,11 @@ }, "platformdirs": { "hashes": [ - "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", - "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" + "sha256:9170634f126f8efdae22fb58ae8a0eaa86f38365bc57897a6c4f781d1f5875bd", + "sha256:9a33809944b9db043ad67ca0db94b14bf452cc6aeaac46a88ea55b26e2e9d291" ], "markers": "python_version >= '3.10'", - "version": "==4.5.1" + "version": "==4.9.2" }, "pluggy": { "hashes": [ @@ -2317,11 +2325,11 @@ }, "python-engineio": { "hashes": [ - "sha256:57b94eac094fa07b050c6da59f48b12250ab1cd920765f4849963e3d89ad9de3", - "sha256:f9c51a8754d2742ba832c24b46ed425fdd3064356914edd5a1e8ffde76ab7709" + "sha256:0a853fcef52f5b345425d8c2b921ac85023a04dfcf75d7b74696c61e940fd066", + "sha256:f32ad10589859c11053ad7d9bb3c9695cdf862113bfb0d20bc4d890198287399" ], "markers": "python_version >= '3.8'", - "version": "==4.13.0" + "version": "==4.13.1" }, "python-fsutil": { "hashes": [ @@ -2343,11 +2351,11 @@ "client" ], "hashes": [ - "sha256:d95802961e15c7bd54ecf884c6e7644f81be8460f0a02ee66b473df58088ee8a", - "sha256:f79403c7f1ba8b84460aa8fe4c671414c8145b21a501b46b676f3740286356fd" + "sha256:a3eb1702e92aa2f2b5d3ba00261b61f062cce51f1cfb6900bf3ab4d1934d2d35", + "sha256:f863f98eacce81ceea2e742f6388e10ca3cdd0764be21d30d5196470edf5ea89" ], "markers": "python_version >= '3.8'", - "version": "==5.16.0" + "version": "==5.16.1" }, "pytokens": { "hashes": [ @@ -2871,11 +2879,11 @@ }, "werkzeug": { "hashes": [ - "sha256:5111e36e91086ece91f93268bb39b4a35c1e6f1feac762c9c822ded0a4e322dc", - "sha256:6a548b0e88955dd07ccb25539d7d0cc97417ee9e179677d22c7041c8f078ce67" + "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25", + "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131" ], "markers": "python_version >= '3.9'", - "version": "==3.1.5" + "version": "==3.1.6" }, "whitenoise": { "hashes": [ diff --git a/concordia/settings_dev.py b/concordia/settings_dev.py index 49bc5ed08..f8ee3f55b 100644 --- a/concordia/settings_dev.py +++ b/concordia/settings_dev.py @@ -1,7 +1,7 @@ import os from .settings_template import * # NOQA ignore=F405 -from .settings_template import INSTALLED_APPS, LOGGING, MIDDLEWARE +from .settings_template import DJANGO_VITE, INSTALLED_APPS, LOGGING, MIDDLEWARE LOGGING["handlers"]["stream"]["level"] = "DEBUG" LOGGING["handlers"]["file"]["level"] = "DEBUG" @@ -31,6 +31,13 @@ DEBUG = True +# Toggle this to True only when you run 'npm run dev' - vite dev server +# Otherwise, it will look for the manifest.json in /dist/ +USE_VITE_DEV_SERVER = os.getenv("USE_VITE_DEV_SERVER", "false").lower() == "true" + +DJANGO_VITE["default"]["dev_mode"] = USE_VITE_DEV_SERVER +DJANGO_VITE["default"]["dev_server_port"] = 5173 + ALLOWED_HOSTS = ["127.0.0.1", "0.0.0.0", "*"] # nosec EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" diff --git a/concordia/settings_docker.py b/concordia/settings_docker.py index 7444be834..bbfebc158 100644 --- a/concordia/settings_docker.py +++ b/concordia/settings_docker.py @@ -1,7 +1,7 @@ import os from .settings_template import * # NOQA ignore=F405 -from .settings_template import INSTALLED_APPS +from .settings_template import INSTALLED_APPS, STATIC_URL DEBUG = os.getenv("DEBUG", "").lower() == "true" @@ -9,6 +9,17 @@ INSTALLED_APPS += ["django_opensearch_dsl"] + +def whitenoise_immutable_file_test(static_url): + """ + Determine if a file is immutable based on its URL. + Vite assets in the 'dist/' directory are hashed and safe to cache forever. + """ + return static_url.startswith(f"{STATIC_URL}dist/") + + +WHITENOISE_IMMUTABLE_FILE_TEST = whitenoise_immutable_file_test + # Globally disable auto-syncing OPENSEARCH_DSL_AUTOSYNC = os.getenv("OPENSEARCH_DSL_AUTOSYNC", False) diff --git a/concordia/settings_local_test.py b/concordia/settings_local_test.py index fab05f303..e90b72a03 100644 --- a/concordia/settings_local_test.py +++ b/concordia/settings_local_test.py @@ -8,7 +8,7 @@ DEBUG = False -DATABASES["default"]["PORT"] = "54323" +DATABASES["default"]["PORT"] = "5432" CHANNEL_LAYERS = { "default": { diff --git a/concordia/settings_template.py b/concordia/settings_template.py index a6336579f..1720e3549 100644 --- a/concordia/settings_template.py +++ b/concordia/settings_template.py @@ -53,7 +53,12 @@ ] STATICFILES_DIRS = [ + # Vite's new home (JS/Manifest) + os.path.join(SITE_ROOT_DIR, "concordia", "static", "dist"), + # Gulp's home (where base.css lives), based on gulpfile .dest('static/') os.path.join(SITE_ROOT_DIR, "static"), + # Standard Admin assets + os.path.join(SITE_ROOT_DIR, "concordia", "static", "admin"), ] NPM_FILE_PATTERNS = { @@ -129,6 +134,7 @@ "channels", "django_admin_multiple_choice_list_filter", "tinymce", + "django_vite", ] MIDDLEWARE = [ @@ -174,6 +180,7 @@ ], "libraries": { "staticfiles": "django.templatetags.static", + "django_vite": "django_vite.templatetags.django_vite", }, "loaders": [ "django.template.loaders.filesystem.Loader", @@ -422,7 +429,8 @@ "BACKEND": "django.core.files.storage.FileSystemStorage", }, "staticfiles": { - "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage", + # Use the basic Compressed backend because Vite handled hashing and compression. + "BACKEND": "whitenoise.storage.CompressedStaticFilesStorage", }, "assets": { "BACKEND": "django.core.files.storage.FileSystemStorage", @@ -431,7 +439,16 @@ "BACKEND": "django.core.files.storage.FileSystemStorage", }, } -WHITENOISE_ROOT = os.path.join(SITE_ROOT_DIR, "static") + +DJANGO_VITE = { + "default": { + "dev_mode": DEBUG, + "manifest_path": os.path.join( + SITE_ROOT_DIR, "concordia", "static", "dist", "manifest.json" + ), + "static_url_prefix": "", + } +} PASSWORD_RESET_TIMEOUT = 604800 ACCOUNT_ACTIVATION_DAYS = 7 diff --git a/concordia/templates/account/profile.html b/concordia/templates/account/profile.html index 68e470cfe..e598bf8e1 100644 --- a/concordia/templates/account/profile.html +++ b/concordia/templates/account/profile.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% load humanize %} -{% load staticfiles %} +{% load staticfiles django_vite %} {% load django_bootstrap5 %} {% block prefetch %} @@ -206,9 +206,5 @@