From b0b1f4db86076ac9027d7b432b7077996d637c39 Mon Sep 17 00:00:00 2001 From: Keannu Bernasol Date: Sun, 7 Jan 2024 02:28:14 +0800 Subject: [PATCH] Migrate to postgres, add memcache and vastly improve available equipment instance query time from 1min 30 seconds to 12 seconds --- .gitignore | 1 + Dockerfile | 11 +- Pipfile | 1 + Pipfile.lock | 727 +++++++++++++----- available_equipment_instances.txt | 0 docker-compose.yml | 26 +- .../__pycache__/0001_initial.cpython-311.pyc | Bin 3755 -> 4097 bytes equipment_tracker/config/settings.py | 26 +- ...alter_equipmentinstance_status_and_more.py | 23 + ...ent_name_alter_historicalequipment_name.py | 23 + .../__pycache__/0001_initial.cpython-311.pyc | Bin 5615 -> 5484 bytes equipment_tracker/equipments/models.py | 125 +-- equipment_tracker/equipments/serializers.py | 15 +- equipment_tracker/equipments/views.py | 40 +- .../media/Glassware-2nd Floor Chemlab.csv | 125 +++ .../media/Glassware-Dispensing Room.csv | 75 ++ .../media/Glassware-Main Stockroom.csv | 88 +++ .../media/Miscellaneous-2nd Floor Chemlab.csv | 49 ++ .../media/Miscellaneous-Dispensing Room.csv | 57 ++ .../media/Miscellaneous-Main Stockroom.csv | 49 ++ equipment_tracker/schema.yml | 14 +- ...02_alter_transaction_transaction_status.py | 18 + equipment_tracker/transactions/models.py | 7 +- requirements.txt | 45 +- 24 files changed, 1253 insertions(+), 292 deletions(-) create mode 100644 available_equipment_instances.txt create mode 100644 equipment_tracker/equipments/migrations/0002_alter_equipmentinstance_status_and_more.py create mode 100644 equipment_tracker/equipments/migrations/0003_alter_equipment_name_alter_historicalequipment_name.py create mode 100644 equipment_tracker/media/Glassware-2nd Floor Chemlab.csv create mode 100644 equipment_tracker/media/Glassware-Dispensing Room.csv create mode 100644 equipment_tracker/media/Glassware-Main Stockroom.csv create mode 100644 equipment_tracker/media/Miscellaneous-2nd Floor Chemlab.csv create mode 100644 equipment_tracker/media/Miscellaneous-Dispensing Room.csv create mode 100644 equipment_tracker/media/Miscellaneous-Main Stockroom.csv create mode 100644 equipment_tracker/transactions/migrations/0002_alter_transaction_transaction_status.py diff --git a/.gitignore b/.gitignore index 2fc88d2..2d1c640 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ equipment_tracker/db.sqlite3 equipment_tracker/.env equipment_tracker/static/* equipment_tracker/static/ +postgres_data/ # Flask stuff: instance/ diff --git a/Dockerfile b/Dockerfile index 1e253da..734cc11 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,16 +13,7 @@ WORKDIR /code ADD . /code/ # Install pipenv -RUN pip install --no-cache-dir -r requirements.txt - -# Make migrations -RUN python equipment_tracker/manage.py makemigrations - -# Run custom migrate -RUN python equipment_tracker/manage.py migrate - -# Generate DRF Spectacular Documentation -RUN python equipment_tracker/manage.py spectacular --color --file equipment_tracker/schema.yml +RUN pip install -r requirements.txt # Expose port 8000 for the web server EXPOSE 8000 diff --git a/Pipfile b/Pipfile index bd1aa02..4bb86be 100644 --- a/Pipfile +++ b/Pipfile @@ -16,6 +16,7 @@ pillow = "*" psycopg2 = "*" django-simple-history = "*" django-unfold = "*" +pymemcache = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 383503d..33dca3b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0dcfc730d5d2c4983b2e6db83e9eeb630ebe9a0146c582c00d4dc4f7e76d74b2" + "sha256": "190cc1ffee47d2b15e2ea2fff3a73415c30040f0f8f1c85b965c8f18fd28ea2d" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,14 @@ ] }, "default": { + "annotated-types": { + "hashes": [ + "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", + "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.0" + }, "asgiref": { "hashes": [ "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", @@ -26,11 +34,11 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "version": "==23.2.0" }, "certifi": { "hashes": [ @@ -194,6 +202,22 @@ "markers": "python_full_version >= '3.7.0'", "version": "==3.3.2" }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "colorama": { + "hashes": [ + "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + ], + "markers": "platform_system == 'Windows'", + "version": "==0.4.6" + }, "cryptography": { "hashes": [ "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", @@ -233,11 +257,11 @@ }, "django": { "hashes": [ - "sha256:8e0f1c2c2786b5c0e39fe1afce24c926040fad47c8ea8ad30aaf1188df29fc41", - "sha256:e1d37c51ad26186de355cbcec16613ebdabfa9689bbade9c538835205a8abbe9" + "sha256:8c8659665bc6e3a44fefe1ab0a291e5a3fb3979f9a8230be29de975e57e8f854", + "sha256:f47a37a90b9bbe2c8ec360235192c7fddfdc832206fcf618bb849b39256affc1" ], "index": "pypi", - "version": "==4.2.7" + "version": "==5.0.1" }, "django-cors-headers": { "hashes": [ @@ -271,11 +295,11 @@ }, "django-unfold": { "hashes": [ - "sha256:1863e7aea57812a29ed7230fc5c6fa338082b1e32d480720b426a20b4f23b8bd", - "sha256:27b170f1bf9e0c349d20bde53e5b90d9d02a73a8f786def86121c9d6c56dbe41" + "sha256:65b1fb44bdba851259d5e788ff699cf8617895aad6e60a6a3c922a64c08e02be", + "sha256:743e55950f6045780f1dade1c31fc250a6acf041d122371bdc493e100560e051" ], "index": "pypi", - "version": "==0.17.1" + "version": "==0.19.0" }, "djangorestframework": { "hashes": [ @@ -287,11 +311,11 @@ }, "djangorestframework-simplejwt": { "hashes": [ - "sha256:631d7ae2ed4365d7196a35d3cc0f6d382f7bd3361fb24c894f8f92b4da5db27d", - "sha256:8e4c5dfca8d11c0b8a66dfd8a4e3fc1c6aa7ea188d10907ff91c942f4b52ed66" + "sha256:381bc966aa46913905629d472cd72ad45faa265509764e20ffd440164c88d220", + "sha256:6c4bd37537440bc439564ebf7d6085e74c5411485197073f508ebdfa34bc9fae" ], - "markers": "python_version >= '3.7'", - "version": "==5.3.0" + "markers": "python_version >= '3.8'", + "version": "==5.3.1" }, "djoser": { "hashes": [ @@ -301,23 +325,47 @@ "index": "pypi", "version": "==2.2.2" }, + "dotty-dict": { + "hashes": [ + "sha256:4b016e03b8ae265539757a53eba24b9bfda506fb94fbce0bee843c6f05541a15", + "sha256:5022d234d9922f13aa711b4950372a06a6d64cb6d6db9ba43d0ba133ebfce31f" + ], + "markers": "python_version >= '3.5' and python_version < '4.0'", + "version": "==1.3.1" + }, "drf-spectacular": { "extras": [ "sidecar" ], "hashes": [ - "sha256:aee55330a774ba8a9cbdb125714d1c9ee05a8aafd3ce3be8bfd26527649aeb44", - "sha256:c0002a820b11771fdbf37853deb371947caf0159d1afeeffe7598e964bc1db94" + "sha256:18d7ae74b2b5d533fd31f1c591ebaa5cce1447e0976ced927401e3163040dea9", + "sha256:6ab2d20674244e8c940c2883f744b43c34fc68c70ea3aefa802f574108c9699b" ], "index": "pypi", - "version": "==0.26.5" + "version": "==0.27.0" }, "drf-spectacular-sidecar": { "hashes": [ - "sha256:3d042a6772512f4d238f0385d3430acf5f669f595fd0be2641fe6bbfb4c7b376", - "sha256:546a83c173589715e530fad211af60cbcda2db54eb9e0935d44251639332af6d" + "sha256:099ec58b6af6a90e851a9329b12a57aa1ee7daa6cef62fb504f2ed302f10da76", + "sha256:4b9e33b4dcfa43f84e3db2659d31766a018a2b98b02d8856d9cd69580a4911c9" ], - "version": "==2023.10.1" + "version": "==2024.1.1" + }, + "gitdb": { + "hashes": [ + "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4", + "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b" + ], + "markers": "python_version >= '3.7'", + "version": "==4.0.11" + }, + "gitpython": { + "hashes": [ + "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4", + "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.40" }, "idna": { "hashes": [ @@ -327,6 +375,14 @@ "markers": "python_version >= '3.5'", "version": "==3.6" }, + "importlib-resources": { + "hashes": [ + "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", + "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6" + ], + "markers": "python_version >= '3.8'", + "version": "==6.1.1" + }, "inflection": { "hashes": [ "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", @@ -335,6 +391,14 @@ "markers": "python_version >= '3.5'", "version": "==0.5.1" }, + "jinja2": { + "hashes": [ + "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", + "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.2" + }, "jsonschema": { "hashes": [ "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa", @@ -345,11 +409,93 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8", - "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93" + "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", + "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c" ], "markers": "python_version >= '3.8'", - "version": "==2023.11.2" + "version": "==2023.12.1" + }, + "markdown-it-py": { + "hashes": [ + "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.0" + }, + "markupsafe": { + "hashes": [ + "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", + "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", + "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", + "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", + "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", + "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", + "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", + "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", + "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", + "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", + "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", + "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", + "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", + "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", + "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", + "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", + "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", + "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", + "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", + "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", + "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", + "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", + "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", + "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", + "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", + "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", + "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", + "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", + "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", + "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", + "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", + "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", + "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", + "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", + "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", + "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", + "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", + "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", + "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", + "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", + "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", + "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", + "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", + "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", + "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", + "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", + "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", + "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.3" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" }, "oauthlib": { "hashes": [ @@ -361,63 +507,77 @@ }, "pillow": { "hashes": [ - "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d", - "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de", - "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616", - "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839", - "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099", - "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a", - "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219", - "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106", - "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b", - "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412", - "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b", - "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7", - "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2", - "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7", - "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14", - "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f", - "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27", - "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57", - "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262", - "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28", - "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610", - "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172", - "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273", - "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e", - "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d", - "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818", - "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f", - "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9", - "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01", - "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7", - "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651", - "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312", - "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80", - "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666", - "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061", - "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b", - "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992", - "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593", - "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4", - "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db", - "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba", - "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd", - "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e", - "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212", - "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb", - "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2", - "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34", - "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256", - "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f", - "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2", - "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38", - "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996", - "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a", - "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793" + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" ], "index": "pypi", - "version": "==10.1.0" + "version": "==10.2.0" }, "psycopg2": { "hashes": [ @@ -445,6 +605,133 @@ ], "version": "==2.21" }, + "pydantic": { + "hashes": [ + "sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a", + "sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4" + ], + "markers": "python_version >= '3.7'", + "version": "==2.5.3" + }, + "pydantic-core": { + "hashes": [ + "sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556", + "sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e", + "sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411", + "sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245", + "sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c", + "sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66", + "sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd", + "sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d", + "sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b", + "sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06", + "sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948", + "sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341", + "sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0", + "sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f", + "sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a", + "sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2", + "sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51", + "sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80", + "sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8", + "sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d", + "sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8", + "sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb", + "sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590", + "sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87", + "sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534", + "sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b", + "sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145", + "sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba", + "sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b", + "sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2", + "sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e", + "sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052", + "sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622", + "sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab", + "sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b", + "sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66", + "sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e", + "sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4", + "sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e", + "sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec", + "sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c", + "sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed", + "sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937", + "sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f", + "sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9", + "sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4", + "sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96", + "sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277", + "sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23", + "sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7", + "sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b", + "sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91", + "sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d", + "sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e", + "sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1", + "sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2", + "sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160", + "sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9", + "sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670", + "sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7", + "sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c", + "sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb", + "sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42", + "sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d", + "sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8", + "sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1", + "sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6", + "sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8", + "sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf", + "sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e", + "sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a", + "sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9", + "sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1", + "sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40", + "sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2", + "sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d", + "sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f", + "sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f", + "sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af", + "sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7", + "sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda", + "sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a", + "sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95", + "sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0", + "sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60", + "sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149", + "sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975", + "sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4", + "sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe", + "sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94", + "sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03", + "sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c", + "sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b", + "sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a", + "sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24", + "sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391", + "sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c", + "sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab", + "sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd", + "sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786", + "sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08", + "sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8", + "sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6", + "sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0", + "sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421" + ], + "markers": "python_version >= '3.7'", + "version": "==2.14.6" + }, + "pygments": { + "hashes": [ + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + ], + "markers": "python_version >= '3.7'", + "version": "==2.17.2" + }, "pyjwt": { "hashes": [ "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", @@ -453,6 +740,14 @@ "markers": "python_version >= '3.7'", "version": "==2.8.0" }, + "pymemcache": { + "hashes": [ + "sha256:27bf9bd1bbc1e20f83633208620d56de50f14185055e49504f4f5e94e94aff94", + "sha256:f507bc20e0dc8d562f8df9d872107a278df049fa496805c1431b926f3ddd0eab" + ], + "index": "pypi", + "version": "==4.0.0" + }, "python-dotenv": { "hashes": [ "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", @@ -461,6 +756,22 @@ "index": "pypi", "version": "==1.0.0" }, + "python-gitlab": { + "hashes": [ + "sha256:cc1dc49c562c02ffbad3656e668234c45ea6210688ade59865b284313f45000d", + "sha256:eb31d1f2bfd8653f74996f9d0bf84ce7afb0843f9122a257c9a93b0e027d1df0" + ], + "markers": "python_full_version >= '3.8.0'", + "version": "==4.3.0" + }, + "python-semantic-release": { + "hashes": [ + "sha256:6bbd11b1e8ac70e0946ed6d257094c851b2507edfbc393eef6093d0ed1dbe0b4", + "sha256:a016b1cf43a5f3667ce2cfddd8e30b6210a2d52b0e2f6b487aae1164f2540eaa" + ], + "markers": "python_version >= '3.7'", + "version": "==8.7.0" + }, "python3-openid": { "hashes": [ "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf", @@ -533,11 +844,11 @@ }, "referencing": { "hashes": [ - "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec", - "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d" + "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3", + "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554" ], "markers": "python_version >= '3.8'", - "version": "==0.31.1" + "version": "==0.32.1" }, "requests": { "hashes": [ @@ -555,110 +866,142 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.3.1" }, + "requests-toolbelt": { + "hashes": [ + "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.0.0" + }, + "rich": { + "hashes": [ + "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa", + "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==13.7.0" + }, "rpds-py": { "hashes": [ - "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276", - "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f", - "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60", - "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0", - "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d", - "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3", - "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2", - "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9", - "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb", - "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b", - "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a", - "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d", - "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1", - "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7", - "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9", - "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4", - "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53", - "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea", - "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66", - "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190", - "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3", - "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12", - "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824", - "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27", - "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e", - "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8", - "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8", - "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914", - "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211", - "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab", - "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468", - "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3", - "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff", - "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c", - "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d", - "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e", - "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a", - "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e", - "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a", - "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0", - "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1", - "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3", - "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42", - "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452", - "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198", - "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa", - "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b", - "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4", - "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1", - "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad", - "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c", - "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381", - "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0", - "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2", - "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3", - "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31", - "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74", - "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6", - "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff", - "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b", - "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca", - "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd", - "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a", - "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568", - "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1", - "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c", - "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad", - "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7", - "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d", - "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658", - "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1", - "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64", - "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815", - "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1", - "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac", - "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07", - "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e", - "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee", - "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45", - "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc", - "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41", - "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2", - "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083", - "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e", - "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266", - "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141", - "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b", - "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933", - "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21", - "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0", - "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7", - "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc", - "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba", - "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a", - "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57", - "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2", - "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007", - "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f", - "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f" + "sha256:0474df4ade9a3b4af96c3d36eb81856cb9462e4c6657d4caecfd840d2a13f3c9", + "sha256:071980663c273bf3d388fe5c794c547e6f35ba3335477072c713a3176bf14a60", + "sha256:07aab64e2808c3ebac2a44f67e9dc0543812b715126dfd6fe4264df527556cb6", + "sha256:088396c7c70e59872f67462fcac3ecbded5233385797021976a09ebd55961dfe", + "sha256:162d7cd9cd311c1b0ff1c55a024b8f38bd8aad1876b648821da08adc40e95734", + "sha256:19f00f57fdd38db4bb5ad09f9ead1b535332dbf624200e9029a45f1f35527ebb", + "sha256:1bdbc5fcb04a7309074de6b67fa9bc4b418ab3fc435fec1f2779a0eced688d04", + "sha256:1be2f033df1b8be8c3167ba3c29d5dca425592ee31e35eac52050623afba5772", + "sha256:24f7a2eb3866a9e91f4599851e0c8d39878a470044875c49bd528d2b9b88361c", + "sha256:290a81cfbe4673285cdf140ec5cd1658ffbf63ab359f2b352ebe172e7cfa5bf0", + "sha256:2946b120718eba9af2b4dd103affc1164a87b9e9ebff8c3e4c05d7b7a7e274e2", + "sha256:2bd82db36cd70b3628c0c57d81d2438e8dd4b7b32a6a9f25f24ab0e657cb6c4e", + "sha256:2ddef620e70eaffebed5932ce754d539c0930f676aae6212f8e16cd9743dd365", + "sha256:2e53b9b25cac9065328901713a7e9e3b12e4f57ef4280b370fbbf6fef2052eef", + "sha256:302bd4983bbd47063e452c38be66153760112f6d3635c7eeefc094299fa400a9", + "sha256:349cb40897fd529ca15317c22c0eab67f5ac5178b5bd2c6adc86172045210acc", + "sha256:358dafc89ce3894c7f486c615ba914609f38277ef67f566abc4c854d23b997fa", + "sha256:35953f4f2b3216421af86fd236b7c0c65935936a94ea83ddbd4904ba60757773", + "sha256:35ae5ece284cf36464eb160880018cf6088a9ac5ddc72292a6092b6ef3f4da53", + "sha256:3b811d182ad17ea294f2ec63c0621e7be92a1141e1012383461872cead87468f", + "sha256:3da5a4c56953bdbf6d04447c3410309616c54433146ccdb4a277b9cb499bc10e", + "sha256:3dc6a7620ba7639a3db6213da61312cb4aa9ac0ca6e00dc1cbbdc21c2aa6eb57", + "sha256:3f91df8e6dbb7360e176d1affd5fb0246d2b88d16aa5ebc7db94fd66b68b61da", + "sha256:4022b9dc620e14f30201a8a73898a873c8e910cb642bcd2f3411123bc527f6ac", + "sha256:413b9c17388bbd0d87a329d8e30c1a4c6e44e2bb25457f43725a8e6fe4161e9e", + "sha256:43d4dd5fb16eb3825742bad8339d454054261ab59fed2fbac84e1d84d5aae7ba", + "sha256:44627b6ca7308680a70766454db5249105fa6344853af6762eaad4158a2feebe", + "sha256:44a54e99a2b9693a37ebf245937fd6e9228b4cbd64b9cc961e1f3391ec6c7391", + "sha256:47713dc4fce213f5c74ca8a1f6a59b622fc1b90868deb8e8e4d993e421b4b39d", + "sha256:495a14b72bbe217f2695dcd9b5ab14d4f8066a00f5d209ed94f0aca307f85f6e", + "sha256:4c46ad6356e1561f2a54f08367d1d2e70a0a1bb2db2282d2c1972c1d38eafc3b", + "sha256:4d6a9f052e72d493efd92a77f861e45bab2f6be63e37fa8ecf0c6fd1a58fedb0", + "sha256:509b617ac787cd1149600e731db9274ebbef094503ca25158e6f23edaba1ca8f", + "sha256:5552f328eaef1a75ff129d4d0c437bf44e43f9436d3996e8eab623ea0f5fcf73", + "sha256:5a80e2f83391ad0808b4646732af2a7b67550b98f0cae056cb3b40622a83dbb3", + "sha256:5cf6af100ffb5c195beec11ffaa8cf8523057f123afa2944e6571d54da84cdc9", + "sha256:5e6caa3809e50690bd92fa490f5c38caa86082c8c3315aa438bce43786d5e90d", + "sha256:5ef00873303d678aaf8b0627e111fd434925ca01c657dbb2641410f1cdaef261", + "sha256:69ac7ea9897ec201ce68b48582f3eb34a3f9924488a5432a93f177bf76a82a7e", + "sha256:6a61226465bda9283686db8f17d02569a98e4b13c637be5a26d44aa1f1e361c2", + "sha256:6d904c5693e08bad240f16d79305edba78276be87061c872a4a15e2c301fa2c0", + "sha256:6dace7b26a13353e24613417ce2239491b40a6ad44e5776a18eaff7733488b44", + "sha256:6df15846ee3fb2e6397fe25d7ca6624af9f89587f3f259d177b556fed6bebe2c", + "sha256:703d95c75a72e902544fda08e965885525e297578317989fd15a6ce58414b41d", + "sha256:726ac36e8a3bb8daef2fd482534cabc5e17334052447008405daca7ca04a3108", + "sha256:781ef8bfc091b19960fc0142a23aedadafa826bc32b433fdfe6fd7f964d7ef44", + "sha256:80443fe2f7b3ea3934c5d75fb0e04a5dbb4a8e943e5ff2de0dec059202b70a8b", + "sha256:83640a5d7cd3bff694747d50436b8b541b5b9b9782b0c8c1688931d6ee1a1f2d", + "sha256:84c5a4d1f9dd7e2d2c44097fb09fffe728629bad31eb56caf97719e55575aa82", + "sha256:882ce6e25e585949c3d9f9abd29202367175e0aab3aba0c58c9abbb37d4982ff", + "sha256:888a97002e986eca10d8546e3c8b97da1d47ad8b69726dcfeb3e56348ebb28a3", + "sha256:8aad80645a011abae487d356e0ceb359f4938dfb6f7bcc410027ed7ae4f7bb8b", + "sha256:8cb6fe8ecdfffa0e711a75c931fb39f4ba382b4b3ccedeca43f18693864fe850", + "sha256:8d6b6937ae9eac6d6c0ca3c42774d89fa311f55adff3970fb364b34abde6ed3d", + "sha256:90123853fc8b1747f80b0d354be3d122b4365a93e50fc3aacc9fb4c2488845d6", + "sha256:96f957d6ab25a78b9e7fc9749d754b98eac825a112b4e666525ce89afcbd9ed5", + "sha256:981d135c7cdaf6cd8eadae1c950de43b976de8f09d8e800feed307140d3d6d00", + "sha256:9b32f742ce5b57201305f19c2ef7a184b52f6f9ba6871cc042c2a61f0d6b49b8", + "sha256:9f0350ef2fba5f34eb0c9000ea328e51b9572b403d2f7f3b19f24085f6f598e8", + "sha256:a297a4d08cc67c7466c873c78039d87840fb50d05473db0ec1b7b03d179bf322", + "sha256:a3d7e2ea25d3517c6d7e5a1cc3702cffa6bd18d9ef8d08d9af6717fc1c700eed", + "sha256:a4b682c5775d6a3d21e314c10124599976809455ee67020e8e72df1769b87bc3", + "sha256:a4ebb8b20bd09c5ce7884c8f0388801100f5e75e7f733b1b6613c713371feefc", + "sha256:a61f659665a39a4d17d699ab3593d7116d66e1e2e3f03ef3fb8f484e91908808", + "sha256:a9880b4656efe36ccad41edc66789e191e5ee19a1ea8811e0aed6f69851a82f4", + "sha256:ac08472f41ea77cd6a5dae36ae7d4ed3951d6602833af87532b556c1b4601d63", + "sha256:adc0c3d6fc6ae35fee3e4917628983f6ce630d513cbaad575b4517d47e81b4bb", + "sha256:af27423662f32d7501a00c5e7342f7dbd1e4a718aea7a239781357d15d437133", + "sha256:b2e75e17bd0bb66ee34a707da677e47c14ee51ccef78ed6a263a4cc965a072a1", + "sha256:b634c5ec0103c5cbebc24ebac4872b045cccb9456fc59efdcf6fe39775365bd2", + "sha256:b6f5549d6ed1da9bfe3631ca9483ae906f21410be2445b73443fa9f017601c6f", + "sha256:bd4b677d929cf1f6bac07ad76e0f2d5de367e6373351c01a9c0a39f6b21b4a8b", + "sha256:bf721ede3eb7b829e4a9b8142bd55db0bdc82902720548a703f7e601ee13bdc3", + "sha256:c647ca87fc0ebe808a41de912e9a1bfef9acb85257e5d63691364ac16b81c1f0", + "sha256:ca57468da2d9a660bcf8961637c85f2fbb2aa64d9bc3f9484e30c3f9f67b1dd7", + "sha256:cad0f59ee3dc35526039f4bc23642d52d5f6616b5f687d846bfc6d0d6d486db0", + "sha256:cc97f0640e91d7776530f06e6836c546c1c752a52de158720c4224c9e8053cad", + "sha256:ccd4e400309e1f34a5095bf9249d371f0fd60f8a3a5c4a791cad7b99ce1fd38d", + "sha256:cffa76b385dfe1e38527662a302b19ffb0e7f5cf7dd5e89186d2c94a22dd9d0c", + "sha256:d0dd7ed2f16df2e129496e7fbe59a34bc2d7fc8db443a606644d069eb69cbd45", + "sha256:d452817e0d9c749c431a1121d56a777bd7099b720b3d1c820f1725cb40928f58", + "sha256:d8dda2a806dfa4a9b795950c4f5cc56d6d6159f7d68080aedaff3bdc9b5032f5", + "sha256:dcbe1f8dd179e4d69b70b1f1d9bb6fd1e7e1bdc9c9aad345cdeb332e29d40748", + "sha256:e0441fb4fdd39a230477b2ca9be90868af64425bfe7b122b57e61e45737a653b", + "sha256:e04e56b4ca7a770593633556e8e9e46579d66ec2ada846b401252a2bdcf70a6d", + "sha256:e061de3b745fe611e23cd7318aec2c8b0e4153939c25c9202a5811ca911fd733", + "sha256:e93ec1b300acf89730cf27975ef574396bc04edecc358e9bd116fb387a123239", + "sha256:e9e557db6a177470316c82f023e5d571811c9a4422b5ea084c85da9aa3c035fc", + "sha256:eab36eae3f3e8e24b05748ec9acc66286662f5d25c52ad70cadab544e034536b", + "sha256:ec23fcad480e77ede06cf4127a25fc440f7489922e17fc058f426b5256ee0edb", + "sha256:ec2e1cf025b2c0f48ec17ff3e642661da7ee332d326f2e6619366ce8e221f018", + "sha256:ed99b4f7179d2111702020fd7d156e88acd533f5a7d3971353e568b6051d5c97", + "sha256:ee94cb58c0ba2c62ee108c2b7c9131b2c66a29e82746e8fa3aa1a1effbd3dcf1", + "sha256:f19afcfc0dd0dca35694df441e9b0f95bc231b512f51bded3c3d8ca32153ec19", + "sha256:f1b9d9260e06ea017feb7172976ab261e011c1dc2f8883c7c274f6b2aabfe01a", + "sha256:f28ac0e8e7242d140f99402a903a2c596ab71550272ae9247ad78f9a932b5698", + "sha256:f42e25c016927e2a6b1ce748112c3ab134261fc2ddc867e92d02006103e1b1b7", + "sha256:f4bd4578e44f26997e9e56c96dedc5f1af43cc9d16c4daa29c771a00b2a26851", + "sha256:f811771019f063bbd0aa7bb72c8a934bc13ebacb4672d712fc1639cfd314cccc" ], "markers": "python_version >= '3.8'", - "version": "==0.13.2" + "version": "==0.16.2" + }, + "shellingham": { + "hashes": [ + "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", + "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de" + ], + "markers": "python_version >= '3.7'", + "version": "==1.5.4" + }, + "smmap": { + "hashes": [ + "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62", + "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da" + ], + "markers": "python_version >= '3.7'", + "version": "==5.0.1" }, "social-auth-app-django": { "hashes": [ @@ -684,13 +1027,29 @@ "markers": "python_version >= '3.5'", "version": "==0.4.4" }, + "tomlkit": { + "hashes": [ + "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4", + "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.12.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + ], + "markers": "python_version >= '3.8'", + "version": "==4.9.0" + }, "tzdata": { "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", + "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" ], "markers": "sys_platform == 'win32'", - "version": "==2023.3" + "version": "==2023.4" }, "uritemplate": { "hashes": [ diff --git a/available_equipment_instances.txt b/available_equipment_instances.txt new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml index 6957158..49aedab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,17 +8,39 @@ services: dockerfile: Dockerfile image: csm_equipment_tracker:latest ports: - - "8092:8000" + - "8000:8000" environment: - PYTHONBUFFERED=1 command: [ "sh", "-c", - "python equipment_tracker/manage.py spectacular --color --file equipment_tracker/schema.yml && python equipment_tracker/manage.py collectstatic --noinput && python equipment_tracker/manage.py makemigrations && python equipment_tracker/manage.py migrate && python equipment_tracker/manage.py runserver 0.0.0.0:8000", + "python equipment_tracker/manage.py collectstatic --noinput && python equipment_tracker/manage.py spectacular --color --file equipment_tracker/schema.yml && python equipment_tracker/manage.py makemigrations && python equipment_tracker/manage.py migrate && python equipment_tracker/manage.py runserver 0.0.0.0:8000", ] volumes: - .:/code # For hotreloading + depends_on: + - memcached + - postgres + + memcached: + image: memcached + ports: + - "11211:11211" + entrypoint: + - memcached + - -m 64 + + postgres: + image: postgres + volumes: + - ./postgres_data:/var/lib/postgresql/data + environment: + - POSTGRES_DB=${DB_NAME} + - POSTGRES_USER=${DB_USER} + - POSTGRES_PASSWORD=${DB_PASSWORD} + ports: + - "5432:5432" volumes: csm_equipment_tracker: diff --git a/equipment_tracker/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc b/equipment_tracker/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc index 227be5b560bbd56699beb2367fdd466bc333f807..ebc54a5abc22a930098efe8d2c9e870e3e5f991c 100644 GIT binary patch delta 710 zcmZ22+o-^|oR^o20SF>*PES3|Gm&pGmkfvt1fTb9+?~NR`9G7Kz7`WhDti_uM4W*k zogqbg5o3x@if#(y8ogyK3=FG*7y{CmQuHUwF&ow!EMo$S12J6O5NwJhOeBRd#VEx% z#U#Zv#c++;GB%)UAcm_p$53qnR&AMLg{eAS5NM8d3TukZ9Oe|;RGuu}$%`0;CqHC1 zlC(p0Upixybc#+egQopv9Ts-xdalgk_>$Db1v#0iDGC7@mBpFK#YNf> zDG8u1*SxaKqWrwv)Vz|!9EITI%+$Q()FK@QB?bn+mo^}EEVtN`Gx9T&Q;Unlf&3yN z5FrXAHXE^bGj86;(aFeIyV-+Fk||O4g1pg;vMcgNJ4`RgJ6@D`ydv*-LBQ#TpyUN< z?HOiQq_saVFqq~tqmkvz)gU1c7B3bc7040_qGZBYK7z?FU=k=I7|t>|o@WD_vXBVh z2aU<1yyh0BvYcEW8GytW5b=RoUWl#13j~WIK&}Kun*eOBq~;VC z1x;?@Rbcd*yp%UoDjcK`tU40N`o&=bR8yLhYF89LS%fdvN}ZAI0|O>8f$NHZ%14mI J7c8=1^8n6}u=@Z2 delta 357 zcmZovSS`!9oR^o20SF4Sb5m2fC-N=kk^*so;B(H#-5E@iOPO^{wU#k4Fsue*2uNc} z(Pm;uWzUj?iKH;5=%nbT=%whVXs1e22-ELl+F*7F->7j zF`L7jVm^5uqxfWF79&ZEWh_9wKnwxtj8W1lmca~~R-5Zs*qJx0b96B>`fc9G*~!Q# zwb`0ml4NhnM)f=b8>xT01{t7#0O?sA+`oD5G)Fqyq8ag%?oJo zEvZTTA{@E-DXBTdMNX4{^My+J1BHtMKtv#r_{CuZlr7CkwJQproW&n&rOL?mfdP}4 Rz;#7H?hc>s`HQn~;D diff --git a/equipment_tracker/config/settings.py b/equipment_tracker/config/settings.py index 2f33d2d..0e55c22 100644 --- a/equipment_tracker/config/settings.py +++ b/equipment_tracker/config/settings.py @@ -28,9 +28,9 @@ BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = str(os.getenv('SECRET_KEY')) # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True -ALLOWED_HOSTS = ['*'] +ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '*'] CSRF_TRUSTED_ORIGINS = [ "https://csm-frontend.keannu1.duckdns.org", "https://csm-backend.keannu1.duckdns.org"] @@ -156,10 +156,21 @@ WSGI_APPLICATION = 'config.wsgi.application' # Database # https://docs.djangoproject.com/en/4.2/ref/settings/#databases +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': BASE_DIR / 'db.sqlite3', +# } +# } + DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': os.getenv('DB_NAME'), + 'USER': os.getenv('DB_USER'), + 'PASSWORD': os.getenv('DB_PASSWORD'), + 'HOST': os.getenv('DB_HOST', 'postgres'), + 'PORT': os.getenv('DB_PORT', '5432'), } } @@ -229,3 +240,10 @@ SESSION_CACHE_ALIAS = "default" CORS_ALLOW_ALL_ORIGINS = True CORS_ALLOW_CREDENTIALS = True + +CACHES = { + 'default': { + 'BACKEND': "django.core.cache.backends.memcached.PyMemcacheCache", + 'LOCATION': 'memcached:11211', + } +} diff --git a/equipment_tracker/equipments/migrations/0002_alter_equipmentinstance_status_and_more.py b/equipment_tracker/equipments/migrations/0002_alter_equipmentinstance_status_and_more.py new file mode 100644 index 0000000..8e00495 --- /dev/null +++ b/equipment_tracker/equipments/migrations/0002_alter_equipmentinstance_status_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.1 on 2024-01-06 16:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('equipments', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='equipmentinstance', + name='status', + field=models.CharField(choices=[('Available', 'Available'), ('Pending', 'Pending'), ('Broken', 'Broken'), ('Borrowed', 'Borrowed')], db_index=True, default='Available', max_length=20), + ), + migrations.AlterField( + model_name='historicalequipmentinstance', + name='status', + field=models.CharField(choices=[('Available', 'Available'), ('Pending', 'Pending'), ('Broken', 'Broken'), ('Borrowed', 'Borrowed')], db_index=True, default='Available', max_length=20), + ), + ] diff --git a/equipment_tracker/equipments/migrations/0003_alter_equipment_name_alter_historicalequipment_name.py b/equipment_tracker/equipments/migrations/0003_alter_equipment_name_alter_historicalequipment_name.py new file mode 100644 index 0000000..1c1b62d --- /dev/null +++ b/equipment_tracker/equipments/migrations/0003_alter_equipment_name_alter_historicalequipment_name.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.1 on 2024-01-06 18:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('equipments', '0002_alter_equipmentinstance_status_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='equipment', + name='name', + field=models.CharField(max_length=100), + ), + migrations.AlterField( + model_name='historicalequipment', + name='name', + field=models.CharField(max_length=100), + ), + ] diff --git a/equipment_tracker/equipments/migrations/__pycache__/0001_initial.cpython-311.pyc b/equipment_tracker/equipments/migrations/__pycache__/0001_initial.cpython-311.pyc index 1b91541faca7ebc72f9501efe276c2d57508f039..c4c6e3cb626f5f7333e1f83a1116a30f92ad81ca 100644 GIT binary patch delta 1945 zcmdT^+e;i*7@wIP_P%B}u4^`~W>Z(=x@)6pyhYO*3(>?#4T5P3(N6X|*^Z7g=IpLw zFOj_DA%uV&Xnia;Y#zFhhfoM40SWY}FB4coyYwF@6mlW>(5HT9WX1IYKGcUE_R zJKyiSoy+UQ->trfKA&5_arKWMh;!NZT>O6dx7ATESMdQJ@TMj3K~>>U-X;h?qil>D z68I&7xTk$(4Fo_e9L`HD4BTu`^ z7I1_ONMRDr%g941^WdoEd$WqP0ClS(M0TyBe*aa3_pE{?ZB0wTat0uRT!>a?j{Q2m zqv8*?R}77nnL}*Xo;FolVSUZ3VhBzYT6P4Dvo+f%wXKjSB=dG`6Ut_r+E_^LOSBUE zw4p9r@VYfcDt((XX}pMlZis__9M9S7N_Me8sN;h5btA?&bcLLO39M6 zK^Nmv$u*=YnaqMh39ZI(sPT=enH149MJGlsL-{4M;4l6ax0M{JuM9OsG9?F)8%j>g z(f}@$JU}ujs?KFqLstcSkmAzDf~@B>t>gxbIi&y)aNtTUQrNmP#$LE4CS2#{6;)HN zYlJrP7*feGMs!g1G>vWi+XtyJLv-4-@#`EkC^Z%c&}LLvq>_V@S%uDI(0P)47r zDIRCPx{tB9?!i!qE3Hgj~a3t!eZV5v4IiqjNLNmdHl-zizvF-y{d)rI6M*5CVkz3q1BKk(;zL(JVQ8SWUIbVzT%0=$~i7>SqT~z#VatJqV79qwHPqRP1xUNBohc b*Emdam_qo+**|MQP9q;v!iH;plKINNQL2*r delta 2062 zcmc&!%WoS+9NyVAyRn^(rp*fL|N1T0deZsfr4f@l4!}?cHQ- zD+M8?e*vh>B@!1@q;TloDx@Ajsw#2f;!2jNRzl)RRSA%|&;w$|kwY7o5aY}QkHETZJXsP+PN-&13td~-Hj76GqDEkhIJQk+)di|+8Pgg$sK;S zEbsEvPW!&SkLQqWy{}_|z;JZM_P2d{J3b{2I&T1Y1iB3Ou0ZqAzSq|Hl4uO<)%aBM zY#)U}JJi*2fS~=nV0d;dG?4aAAUxJp8!`mgy zaJz<^*o5)z$K~;L$us&SbNC_^@ujYOV^4Zf5y$ENUN$DWJSW?p108K3AT43W=4Dw826hT`oX~pr1D- zh}H^?N}XJ?j%}MgMY>kf@dtj9uJPG8K2Gz}p)IW}U&!RnCDU)wF{*FrxU6a=x?+jP zmshcO&&|5Hl1nF-S8|GJU2I@Ytv4{DPWG&lOJ?6za?$g7Izg1s6@&|w8cUE$=HsTE zQfvMqs#FRZ(i=5AN)!I%W?2PODqhjmBC26F$4(05nss$s>JXAH?6VPLxy(5wZHh6h zmyyOwr=rR9vXYLbWhjyHXgd%j4^7isoK$q#)C@%zr9=J52+YHN7<7mf>` z7Y^X6aEX~zq0C+*72(%5{?;A&RR{jK#YQb>; diff --git a/equipment_tracker/equipments/models.py b/equipment_tracker/equipments/models.py index 9aa7e1f..70c2dd5 100644 --- a/equipment_tracker/equipments/models.py +++ b/equipment_tracker/equipments/models.py @@ -4,6 +4,7 @@ from simple_history.models import HistoricalRecords from django.db.models.signals import post_migrate from django.dispatch import receiver from config import settings +from django.core.cache import cache import csv import os @@ -13,7 +14,7 @@ class Equipment(models.Model): ('Glassware', 'Glassware'), ('Miscellaneous', 'Miscellaneous') ) - name = models.CharField(max_length=40) + name = models.CharField(max_length=100) category = models.CharField( max_length=20, choices=EQUIPMENT_CATEGORY_CHOICES, default='Miscellaneous') description = models.TextField(max_length=512, null=True) @@ -24,6 +25,10 @@ class Equipment(models.Model): def __str__(self): return f'{self.name}' + def save(self, *args, **kwargs): + cache.delete('equipments') + return super().save(*args, **kwargs) + class EquipmentInstance(models.Model): EQUIPMENT_INSTANCE_STATUS_CHOICES = ( @@ -34,7 +39,7 @@ class EquipmentInstance(models.Model): ) equipment = models.ForeignKey(Equipment, on_delete=models.CASCADE) status = models.CharField( - max_length=20, choices=EQUIPMENT_INSTANCE_STATUS_CHOICES, default='Available') + max_length=20, choices=EQUIPMENT_INSTANCE_STATUS_CHOICES, default='Available', db_index=True) remarks = models.TextField(max_length=512, null=True) date_added = models.DateTimeField(default=now, editable=False) last_updated = models.DateTimeField(auto_now=True, editable=False) @@ -43,67 +48,77 @@ class EquipmentInstance(models.Model): def __str__(self): return f'{self.equipment.name}' + def save(self, *args, **kwargs): + cache.delete('equipments') + return super().save(*args, **kwargs) + + +seed_database = False + @receiver(post_migrate) def create_superuser(sender, **kwargs): if sender.name == 'equipments': - root_path = os.path.join(settings.MEDIA_ROOT, 'equipment_records') - csv_files = [f for f in os.listdir(root_path) if f.endswith('.csv')] - print('Warning: Postmigration script will migrate without checking for existing item instances') - for csv_file in csv_files: - csv_file_path = os.path.join(root_path, csv_file) - filename = os.path.splitext(csv_file)[0] - print('---', 'Adding Equipments from', filename, '---') - with open(csv_file_path, newline='') as csvfile: + if seed_database: + root_path = os.path.join(settings.MEDIA_ROOT, 'equipment_records') + csv_files = [f for f in os.listdir( + root_path) if f.endswith('.csv')] + print( + 'Warning: Postmigration script will migrate without checking for existing item instances') + for csv_file in csv_files: + csv_file_path = os.path.join(root_path, csv_file) + filename = os.path.splitext(csv_file)[0] + print('---', 'Adding Equipments from', filename, '---') + with open(csv_file_path, newline='') as csvfile: - reader = csv.reader(csvfile) - next(reader) # Skip the header row - for row in reader: - if not any(row): - continue + reader = csv.reader(csvfile) + next(reader) # Skip the header row + for row in reader: + if not any(row): + continue - # Get equipment information - category = filename.split('-')[0] - name = row[2] + ' ' + row[1] - # If quantity is missing, set value as 0 - if (row[3] == ''): - available = 0 - else: - available = int(row[3]) - # If quantity of broken instances is missing, set value as 0 - if (row[4] == ''): - broken = 0 - else: - available = available - int(row[4]) - broken = int(row[4]) + # Get equipment information + category = filename.split('-')[0] + name = row[2] + ' ' + row[1] + # If quantity is missing, set value as 0 + if (row[3] == ''): + available = 0 + else: + available = int(row[3]) + # If quantity of broken instances is missing, set value as 0 + if (row[4] == ''): + broken = 0 + else: + available = available - int(row[4]) + broken = int(row[4]) - def create_instances(a, b, c): - print('Adding', a, 'number of working', c.name) - # Add working equipments - if (a >= 1): - for i in range(a): - EquipmentInstance.objects.create( - equipment=c, status='Available') + def create_instances(a, b, c): + print('Adding', a, 'number of working', c.name) + # Add working equipments + if (a >= 1): + for i in range(a): + EquipmentInstance.objects.create( + equipment=c, status='Available') - if (b >= 1): - print('Adding', a, 'number of broken', c.name) - # Add broken equipments - for i in range(b): - EquipmentInstance.objects.create( - equipment=c, status='Broken') + if (b >= 1): + print('Adding', b, 'number of broken', c.name) + # Add broken equipments + for i in range(b): + EquipmentInstance.objects.create( + equipment=c, status='Broken') - EQUIPMENT = Equipment.objects.filter( - name=name, category=category).first() + EQUIPMENT = Equipment.objects.filter( + name=name, category=category).first() - # Check if equipment exists - if (EQUIPMENT): - # If so, add equipment instances - create_instances(available, broken, EQUIPMENT) + # Check if equipment exists + if (EQUIPMENT): + # If so, add equipment instances + create_instances(available, broken, EQUIPMENT) - # If not, create equipment - else: - # Create the equipment first - EQUIPMENT = Equipment.objects.create( - name=name, category=category) - # Then create the instances - create_instances(available, broken, EQUIPMENT) + # If not, create equipment + else: + # Create the equipment first + EQUIPMENT = Equipment.objects.create( + name=name, category=category) + # Then create the instances + create_instances(available, broken, EQUIPMENT) diff --git a/equipment_tracker/equipments/serializers.py b/equipment_tracker/equipments/serializers.py index 9b5d73f..f694335 100644 --- a/equipment_tracker/equipments/serializers.py +++ b/equipment_tracker/equipments/serializers.py @@ -155,7 +155,6 @@ class EquipmentInstanceSerializer(serializers.HyperlinkedModelSerializer): format="%m-%d-%Y %I:%M %p", read_only=True) last_updated = serializers.DateTimeField( format="%m-%d-%Y %I:%M %p", read_only=True) - last_updated_by = serializers.SerializerMethodField() status = serializers.ChoiceField( choices=EquipmentInstance.EQUIPMENT_INSTANCE_STATUS_CHOICES) @@ -221,19 +220,11 @@ class EquipmentInstanceSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = EquipmentInstance fields = ('id', 'equipment', 'equipment_name', 'category', 'status', 'remarks', - 'last_updated', 'last_updated_by', 'date_added') - read_only_fields = ('id', 'last_updated', 'equipment_name', 'category', - 'last_updated_by', 'date_added', 'equipment_name') + 'last_updated', 'date_added') + read_only_fields = ('id', 'last_upated', 'equipment_name', 'category', + 'date_added', 'equipment_name') extra_kwargs = {"remarks": {"required": False, "allow_null": True}} - @extend_schema_field(OpenApiTypes.STR) - def get_history_user(self, obj): - return obj.history_user.username if obj.history_user else None - - @extend_schema_field(OpenApiTypes.STR) - def get_last_updated_by(self, obj): - return obj.history.first().history_user.username if obj.history.first().history_user else None - class EquipmentInstanceLogsSerializer(serializers.HyperlinkedModelSerializer): history_date = serializers.DateTimeField( diff --git a/equipment_tracker/equipments/views.py b/equipment_tracker/equipments/views.py index 5c4e359..a43b907 100644 --- a/equipment_tracker/equipments/views.py +++ b/equipment_tracker/equipments/views.py @@ -6,7 +6,7 @@ from . import serializers from config.settings import DEBUG from accounts.permissions import IsTechnician from transactions.models import Transaction - +from django.core.cache import cache # -- Equipment Viewsets @@ -16,6 +16,15 @@ class EquipmentViewSet(viewsets.ModelViewSet): serializer_class = serializers.EquipmentSerializer queryset = Equipment.objects.all().order_by('id') + def get_queryset(self): + key = 'equipments' + + queryset = cache.get(key) + if not queryset: + queryset = super().get_queryset() + cache.set(key, queryset, timeout=60*60*24) + return queryset + # For viewing all logs for all equipments @@ -69,19 +78,28 @@ class AvailableEquipmentInstanceViewSet(generics.ListAPIView): This view should return a list of all the equipment instances that are not associated with a non-finalized transaction. """ - # Get all non-finalized transactions - non_finalized_transactions = Transaction.objects.filter( - ~Q(transaction_status__in=['Finalized', 'Rejected', 'Cancelled'])) + key = 'available_equipment_instances' - # Get all equipment instances associated with non-finalized transactions - non_finalized_equipments = EquipmentInstance.objects.filter( - transaction__in=non_finalized_transactions) + queryset = cache.get(key) + if not queryset: + # Get all non-finalized transactions + non_finalized_transactions = Transaction.objects.filter( + ~Q(transaction_status__in=[ + 'Finalized', 'Rejected', 'Cancelled']) + ).prefetch_related('equipments') - # Get all equipment instances which are not associated with non-finalized transactions - queryset = EquipmentInstance.objects.exclude( - id__in=non_finalized_equipments.values_list('id', flat=True)).order_by('id') + # Get all equipment instances associated with non-finalized transactions + non_finalized_equipments = EquipmentInstance.objects.filter( + transaction__in=non_finalized_transactions + ).prefetch_related('equipment') - return queryset + # Get all equipment instances which are not associated with non-finalized transactions + queryset = EquipmentInstance.objects.exclude( + id__in=non_finalized_equipments.values_list('id', flat=True) + ) + cache.set(key, list(queryset), timeout=60*60*24) + + return queryset.prefetch_related('equipment') # For viewing all equipment instance logs diff --git a/equipment_tracker/media/Glassware-2nd Floor Chemlab.csv b/equipment_tracker/media/Glassware-2nd Floor Chemlab.csv new file mode 100644 index 0000000..8adc48b --- /dev/null +++ b/equipment_tracker/media/Glassware-2nd Floor Chemlab.csv @@ -0,0 +1,125 @@ +,NAME,Brand/Supplier,Qty.,Breakages,Remarks +1,"Beaker, 1000mL",Pyrex,1,, +3,"Beaker, 100mL",Mars Lab,108,12, +5,"Beaker, 150mL",Pyrex,50,11, +8,"Beaker, 250mL",Pyrex,50,13, +11,"Beaker, 400mL",Pyrex,20,1, +14,"Beaker, 50mL",Mars Lab,44,13, +15,"Beaker, 600mL",Pyrex,15,1, +17,"Bell Jar, Micro, Bottom Plate, 1000ml",,1,,PKI donated +18,"Bell Jar, Micro, Bottom Plate, 200ml",,1,,PKI donated +19,"Bell Jar, Micro, Bottom Plate, 500ml",,1,,PKI donated +31,"Bottle, BOD, 300mL",,3,, +34,"Buret, Automatic Auto Refill, 50mL",Kimax,2,, +35,"Buret, Automatic Straight",,3,, +36,"Buret, Glass Stopcock, 50mL",Pyrex,2,, +39,"Buret, Teflon Stopcock, 10mL",Pyrex,1,, +40,"Buret, Teflon Stopcock, 25mL",Pyrex,2,, +41,"Buret, Teflon Stopcock, 50mL",Pyrex,4,, +42,"Buret, Teflon Stopcock, 50mL",Mars Lab,,, +46,"Column, Distilling, Drip Tip",,1,,PKI donated +47,"Column, Vigreux, Pattern-Multi",,1,,PKI donated +48,"Concentrator, 250mL",,1,,PKI donated +49,"Concentrator, 500mL",,1,,PKI donated +50,"Condenser, Allihn, 24/38",,1,,PKI donated +51,"Condenser, Allihn, 24/40, 300mm",,1,,PKI donated +52,"Condenser, Allihn, Drip – Tip",,1,,PKI donated +53,"Condenser, Allihn, Rotary Evaporator",,1,,PKI donated +54,"Condenser, Coiled-Distillation",,1,,PKI donated +55,"Condenser, Graham, Drip Tip, 19/38",,1,,PKI donated +56,"Condenser, Graham, TS-Joint, 55/50",,1,,PKI donated +57,"Condenser, Leibig, Drip – tip",,1,,PKI donated +58,"Condenser, Leibig, Drip tip, 24/40, 41x 300mm",,1,,PKI donated +59,"Condenser, West Drip Tip, 55/50",,1,,PKI donated +60,"Condenser, with Still Head",,1,,PKI donated +61,Connecting Bulb for Kjeldal,,1,,PKI donated +62,"Connecting Tube, Clasein, 24/29",,1,,PKI donated +63,"Cuvette, Glass, 3.5mL capacity",Mars Lab,8,, +64,"Cylinder, Graduated, 1000mL",Pyrex,1,, +66,"Cylinder, Graduated, 100mL",Mars Lab,52,4, +67,"Cylinder, Graduated, 10mL",Pyrex,7,, +69,"Cylinder, Graduated, 25mL",Pyrex,10,, +70,"Cylinder, Graduated, 50mL",Pyrex,5,, +72,"Cylinder, Graduated, 250mL",Mars Lab,10,, +72,"Cylinder, Graduated,Plastic 100mL",,1,, +73,"Dessicator, Glass, 10.4in.(O.D) x 8.11in.",,1,, +74,"Dessicator, Glass, 10.5in.(O.D) x 8.30in.",,1,, +75,"Dessicator, Glass, 10.5in.(O.D) x 9.23in.",,1,, +76,"Dessicator, Glass, 12.6in.(O.D) x 12.7in.",,1,, +77,"Dessicator, Glass, 6.63in.(O.D) x 6.00in.",,1,, +78,"Dessicator, Glass, 6.74in.(O.D) x 6.16in.",,1,, +79,"Dessicator, Glass, 7,500mL",Mars Lab,4,, +80,"Dessicator, Glass, 8.63in.(O.D) x 7.91in.",,1,, +81,"Dessicator, Glass, 8.67in.(O.D) x 7.61in.",,1,, +82,"Dessicator, Glass, 8.92in.(O.D) x 6.89in.",,1,, +83,"Dessicator, Glass, 8.93in.(O.D) x 9.10in.",,1,, +84,"Distillation Set up, Distilling Flask(1000mL) and Condenser",Mars Lab,3,, +85,"Distilling Flask, 1000mL",Pyrex,6,, +86,"Distilling Flask, Round Bottom, 100mL",,3,, +87,"Distilling Reciever, Dean Stark",,2,, +92,"Flask, Centrifuge, TS-Joint, 1000mL",,1,,PKI donated +93,"Flask, Centrifuge, TS-Joint, 1000mL",Vidrex,2,, +94,"Flask, Conical 500mL",Mars Lab,20,, +95,"Flask, Distilling, Round Bottom, 1000mL",,1,,PKI donated +96,"Flask, Distilling, Round Bottom, 1000mL",Pyrex,1,, +98,"Flask, Erlenmeyer, Low Actinic, 250mL",Pyrex,4,, +99,"Flask, Erlenmeyer, Narrowmouth, 1000mL",Pyrex,5,, +11,"Flask, Erlenmeyer, Narrowmouth, 125mL",Pyrex,11,, +103,"Flask, Erlenmeyer, Narrowmouth, 250mL",Pyrex,9,, +105,"Flask, Erlenmeyer, Narrowmouth, 300mL",Pyrex,3,, +63,"Flask, Erlenmeyer, Narrowmouth, 500mL",Pyrex,63,6, +116,"Flask, Kjeldal, 200mL",,8,, +117,"Flask, Kjeldal, 500mL",,1,, +118,"Flask, Kjeldal, 500mL",Mars Lab,33,, +119,"Flask, Pear Shape, Shortneck, 1000mL",Pyrex,4,, +120,"Flask, Pear Shape, Shortneck, 100mL",Pyrex,8,, +121,"Flask, Pear Shape, Shortneck, 500mL",Pyrex,5,, +122,"Flask, Pear Shape, Shortneck, 50mL",Pyrex,2,, +131,"Flask, Volumetric, 100mL",Pyrex,7,, +132,"Flask, Volumetric, 100mL",Mars Lab,4,, +134,"Flask, Volumetric, 200mL",Pyrex,4,, +136,"Flask, Volumetric, 250mL",Pyrex,15,, +139,"Flask, Volumetric, 500mL",Pyrex,1,, +141,"Flask, Volumetric, 50mL",Pyrex,1,, +142,"Flask, Volumetric, 50mL",Mars Lab,7,,flasks have a broken stoppers +143,"Funnel, Dropping, 1000mL",Pyrex,1,,PKI donated +145,"Funnel, Separatory, Pear Shape, 100mL",Vidrex,3,, +147,"Funnel, Separatory, Pear Shape, 250mL",Mars Lab,23,, +148,"Funnel, Separatory, Pear Shape, 500mL",Pyrex,11,, +149,"Funnel, Separatory, Pear Shape, 500mL",Pyrex,1,, +149,"Funnel, Separatory, Pear Shape, 50mL",Pyrex,1,, +150,"Funnel, Short Stem, 100mm",Pyrex,4,, +152,"Funnel, Short Stem, 60° angle",Mars Lab,23,, +171,"Pipet, Measuring, 10mL",Mars Lab,11,, +172,"Pipet, Measuring, 1mL",,3,, +174,"Pipet, Measuring, 25mL",,19,, +190,"Pycnometer, 25mL",Mars Lab,1,, +192,Recovery Bend w/ 2 Vertical Cones,,1,, +193,Retort,,3,2, +194,"Slide Glass, 100pcs. Per box",Matsunami,8,, +197,"Slide Glass, 72pcs. Per pack",Sail Brand,1,, +198,"Soxhlet Extraction Tube, TS-Joint, 34/28",Vidrex,4,, +199,"Soxhlet Extraction Tube, TS-Joint, Large",,12,, +200,Stirring Rod,,5,, +221,Tilting Dispense,,5,, +223,"Watch Glass, 100mm dia. ",Mars Lab,50,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, diff --git a/equipment_tracker/media/Glassware-Dispensing Room.csv b/equipment_tracker/media/Glassware-Dispensing Room.csv new file mode 100644 index 0000000..8638c80 --- /dev/null +++ b/equipment_tracker/media/Glassware-Dispensing Room.csv @@ -0,0 +1,75 @@ +,NAME,Brand/Supplier,Qty.,Breakages,Remarks +1,"Beaker, 1000mL",,2,, +3,"Beaker, 100mL",,148,3, +6,"Beaker, 150mL",,48,, +8,"Beaker, 250mL",,132,8, +11,"Beaker, 400mL",,26,, +14,"Beaker, 50mL",,122,3, +15,"Beaker, 500mL",,1,, +16,"Beaker, 600mL",,14,, +17,"Beaker, 800mL",,1,, +38,"Buret, Teflon Stopcock, 100mL",,13,, +40,"Buret, Teflon Stopcock, 25mL",,9,, +41,"Buret, Teflon Stopcock, 50mL",,11,, +64,"Cylinder, Graduated, 250mL",,7,, +65,"Cylinder, Graduated, 100mL",,38,2, +67,"Cylinder, Graduated, 10mL",,44,1, +69,"Cylinder, Graduated, 25mL",,16,1, +70,"Cylinder, Graduated, 50mL",,20,2, +84,"Distillation Set up, Distilling Flask(1000mL) and Condenser",,3,, +99,"Flask, Erlenmeyer, Narrowmouth, 1000mL",,18,, +100,"Flask, Erlenmeyer, Narrowmouth, 125mL",,37,2, +102,"Flask, Erlenmeyer, Narrowmouth, 2000mL",,2,, +103,"Flask, Erlenmeyer, Narrowmouth, 250mL",,52,4, +105,"Flask, Erlenmeyer, Narrowmouth, 300mL",,21,, +106,"Flask, Erlenmeyer, Narrowmouth, 500mL",,41,, +112,"Flask, Filtering 500mL",,11,2, +129,"Flask, Volumetric, 1000mL",,10,, +131,"Flask, Volumetric, 100mL",,,, +132,"Flask, Volumetric, 100mL",,38,, +134,"Flask, Volumetric, 200mL",,5,, +137,"Flask, Volumetric, 250mL",,10,, +139,"Flask, Volumetric, 500mL",,15,, +141,"Flask, Volumetric, 50mL",,11,, +146,"Funnel, Separatory, Pear Shape, 250mL",,13,1, +148,"Funnel, Separatory, Pear Shape, 500mL",,2,, +151,"Funnel, Short Stem, 50mm",,28,1, +163,"Petridish with cover, Glass, 100x15mm",,23,, +165,"Petridish without cover, Glass, 100x15mm",,3,, +166,"Petridish, with cover, Glass,140mmx17mm",,3,, +167,"Petridish, with cover, Glass,60mmx15mm",,5,, +168,"Petridish, without cover, Glass,140x17mm",,7,, +171,"Pipet, Measuring, 10mL",,15,, +172,"Pipet, Measuring, 1mL",,11,, +174,"Pipet, Measuring, 25mL",,12,, +176,"Pipet, Measuring, 2mL",,4,, +178,"Pipet, Measuring, 5mL",,5,, +179,"Pipet, Volumetric 15mL",,2,, +180,"Pipet, Volumetric, 10mL",,22,1, +181,"Pipet, Volumetric, 1mL",,2,, +182,"Pipet, Volumetric, 20mL",,1,, +186,"Pipet, Volumetric, 50mL",,2,, +187,"Pipet, Volumetric, 5mL",,4,, +189,"Pycnometer, 25mL",,8,, +200,Stirring Rod,,64,, +223,"Watch Glass, 100mm dia. ",,46,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, diff --git a/equipment_tracker/media/Glassware-Main Stockroom.csv b/equipment_tracker/media/Glassware-Main Stockroom.csv new file mode 100644 index 0000000..82d718d --- /dev/null +++ b/equipment_tracker/media/Glassware-Main Stockroom.csv @@ -0,0 +1,88 @@ +,NAME,Brand/Supplier,Qty.,Breakages,Remarks +3,"Beaker, 100mL",,27,, +6,"Beaker, 150mL",,2,, +8,"Beaker, 250mL",,116,, +11,"Beaker, 400mL",,185,, +15,"Beaker, 50mL",,30,, +20,"Bottle Reagent, Clear, NM, 1000mL",,6,, +21,"Bottle Reagent, Clear, NM, 1000mL",Mars Lab,15,, +22,"Bottle Reagent, Clear, NM, 100mL",,13,, +23,"Bottle Reagent, Clear, NM, 2000mL",,5,, +24,"Bottle Reagent, Clear, NM, 2500mL",,2,, +25,"Bottle Reagent, Clear, NM, 5000mL",,6,, +26,"Bottle Reagent, Clear, NM, 500mL",,32,, +27,"Bottle Reagent, Clear, WM, 250mL",,11,, +28,"Bottle Reagent, Clear, WM, 40mL",,3,, +29,"Bottle Reagent, Clear, WM, 500mL",,4,, +30,"Bottle, BOD, 100mL",,12,, +31,"Bottle, BOD, 300mL",,48,26, +32,"Bottle, Media, 250mL",,6,, +33,"Bottle, Media, 500mL",,2,, +,"Buret, Teflon Stopcock, 100mL",,5,, +41,"Buret, Teflon Stopcock, 50mL",,84,, +64,"Cylinder, Graduated, 100mL",,36,, +65,"Cylinder, Graduated, 10mL",,38,, +67,"Cylinder, Graduated, 250mL",,3,, +70,"Cylinder, Graduated, 50mL",,28,, +84,"Distillation Set up, Distilling Flask(1000mL) and Condenser",,5,, +99,"Flask, Erlenmeyer, Narrowmouth, 1000mL",,17,, +100,"Flask, Erlenmeyer, Narrowmouth, 125mL",,13,, +102,"Flask, Erlenmeyer, Narrowmouth, 2000mL",,7,, +103,"Flask, Erlenmeyer, Narrowmouth, 250mL",,68,, +105,"Flask, Erlenmeyer, Narrowmouth, 300mL",,1,, +106,"Flask, Erlenmeyer, Narrowmouth, 500mL",,9,, +112,"Flask, Filtering 500mL",,55,, +124,"Flask, Round Bottom, Longneck, 500mL",,19,, +132,"Flask, Volumetric, 100mL",,7,, +139,"Flask, Volumetric, 500mL",,20,, +146,"Funnel, Separatory, Pear Shape, 250mL",,23,, +162,Nitrogen Distillation Apparatus,,1,, +174,"Pipet, Measuring, 25mL",,37,, +189,"Pycnometer, 25mL",,19,, +200,Stirring Rod,,68,, +194,"Slide Glass, 100pcs. Per box",Matsunami,10,, +195,"Slide Glass, 100pcs. Per box",Mars Lab,18,, +196,"Slide Glass, 50pcs. Per pack",Toshinriko,1,, +197,"Slide Glass, 72pcs. Per pack",Sail Brand,1,, +198,"Soxhlet Extraction Tube, TS-Joint, 34/28",Vidrex,4,, +199,"Soxhlet Extraction Tube, TS-Joint, Large",,12,, +202,Test Tube with Stopper 10mL,Mars Lab,18,, +203,Test Tube with screw caps 30mL,Mars Lab,236,, +204,"Test Tube, 10mL",Mars Lab,1924,45, +205,"Test Tube, 12mm OD x 120mmL",Hach,400,42, +206,"Test Tube, 12mm OD x 7mmL",,60,, +207,"Test Tube, 13mm OD x 110mmL",,88,, +208,"Test Tube, 13mm OD x 75mmL",,5,, +209,"Test Tube, 15mm OD x 100mmL",,16,, +210,"Test Tube, 16mm OD x 100mmL",,65,, +211,"Test Tube, 16mm OD x 125mmL",,191,20, +212,"Test Tube, 16mm OD x 60mmL",,64,, +213,"Test Tube, 18mm OD x 165mmL",,98,, +214,"Test Tube, 18mm OD x 16mmL",,54,, +215,"Test Tube, 20mL",Mars Lab,237,, +216,"Test Tube, 25mm OD x 200mmL",,81,, +217,"Test Tube, 50mL",Mars Lab,90,, +218,"Test Tube, Borosilicate Glass, 10/15",,2,, +219,"Test Tube, Borosilicate Glass, 100mL",,34,, +220,"Test Tube, Borosilicate Glass, 50mL",,55,, +223,"Watch Glass, 100mm dia. ",,86,23, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, diff --git a/equipment_tracker/media/Miscellaneous-2nd Floor Chemlab.csv b/equipment_tracker/media/Miscellaneous-2nd Floor Chemlab.csv new file mode 100644 index 0000000..bd5d40a --- /dev/null +++ b/equipment_tracker/media/Miscellaneous-2nd Floor Chemlab.csv @@ -0,0 +1,49 @@ +,NAME,Brand/Supplier,Qty.,Breakages,Remarks +1,Alcohol Lamp,Mars Lab,20,, +2,"Basin, Plastic, 12inch Dia.",Mars Lab,1,, +3,"Bottle, Washing, Assorted, 500mL",Mars Lab,83,, +4,"Brush, Test Tube, Nylon, Regular",,12,, +5,Bunsen Burner,Mars Lab,53,, +6,"Clamp, Double Buret",Mars Lab,70,, +7,"Clamp, Extension",,268,, +8,"Clamp, Holder",Mars Lab,108,, +9,Conductivity Apparatus,Mars Lab,76,, +10,"Crucible Tong, 9 ¾cm",,68,, +11,"Crucible with cover,Porcelain 30mL",Mars Lab,76,, +14,"Iron Ring, 117mm I.D",Mars Lab,46,, +16,"Mortar & Pestle, Porcelain, 400mL Vol.",Mars Lab,20,, +17,"Spot Plate, Porcelain, 12 Crates",Mars Lab,92,, +18,Test Tube Holder,Mars Lab,244,, +19,"Test Tube Rack, Stainless, 50holes (ID)",,131,, +20,"Test Tube Rack, Stainless, 50holes (ID), Big",,16,, +21,"Thermometer, Alcohol -10° - 350°C",Mars Lab,119,, +22,"Thermometer, Mercury -10° - 350°C",Mars Lab,113,, +23,Triple Beam Balance,Mars Lab,28,, +24,Water Bath,Mars Lab,73,, +25,"Wire Gauze, Ceramic Centered, 5x5",Mars Lab,6,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, diff --git a/equipment_tracker/media/Miscellaneous-Dispensing Room.csv b/equipment_tracker/media/Miscellaneous-Dispensing Room.csv new file mode 100644 index 0000000..4bbaf4d --- /dev/null +++ b/equipment_tracker/media/Miscellaneous-Dispensing Room.csv @@ -0,0 +1,57 @@ +,NAME,Brand/Supplier,Qty.,Breakages,Remarks +1,Alcohol Lamp,Mars Lab,9,1, +2,"Basin, Plastic, 12inch Dia.",Mars Lab,4,, +3,"Bottle, Washing, Assorted, 500mL",Mars Lab,67,4, +4,"Brush, Test Tube, Nylon, Regular",,47,12, +5,"Bulb, Aspirator, Orange, Pointed Tip",,33,16, +6,Bunsen Burner,Mars Lab,15,4, +7,"Clamp, Double Buret",Mars Lab,26,, +8,"Clamp, Extension",,30,3, +9,"Crucible Tong, 9 ¾cm",,37,, +10,"Crucible with cover,Porcelain 30mL",Mars Lab,82,34, +11,"Crucible, Metal w/o cover, 30mL",,8,, +12,"Evaporating dish, 120mL",Mars Lab,22,15, +13,"Forceps, Stainless",Mars Lab,10,3, +14,Funnel Stand,,9,, +15,"Funnel, Buchner, 200mm",,5,, +16,"Hot Plate, Single Burner",Mars Lab,5,1, +17,"Hydrometer, range: 1.000 tp 1.070",Mars Lab,,, +18,"Iron Ring, 117mm I.D",Mars Lab,24,, +19,Iron Stand,Mars Lab,26,, +20,"Iron Wire Triangles, 3.8(1.5)cm(in.)",,9,4, +21,"Mortar & Pestle, Porcelain, 400mL Vol.",Mars Lab,28,, +22,"Spot Plate, Porcelain, 12 Crates",Mars Lab,19,, +23,"Spot Plate, Porcelain, 12 Holes, Plastic",,5,4, +24,Test Tube Holder,Mars Lab,31,, +25,"Test Tube Rack, Stainless, 50holes (ID), ",,34,, +26,"Thermometer, Alcohol -10° - 350°C",Mars Lab,44,12, +27,"Thermometer, Mercury -10° - 350°C",Mars Lab,29,11, +28,Triple Beam Balance,Mars Lab,11,, +29,Water Bath,Mars Lab,21,5, +30,"Wire Gauze, Ceramic Centered, 5x5",Mars Lab,60,45, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, diff --git a/equipment_tracker/media/Miscellaneous-Main Stockroom.csv b/equipment_tracker/media/Miscellaneous-Main Stockroom.csv new file mode 100644 index 0000000..bd5d40a --- /dev/null +++ b/equipment_tracker/media/Miscellaneous-Main Stockroom.csv @@ -0,0 +1,49 @@ +,NAME,Brand/Supplier,Qty.,Breakages,Remarks +1,Alcohol Lamp,Mars Lab,20,, +2,"Basin, Plastic, 12inch Dia.",Mars Lab,1,, +3,"Bottle, Washing, Assorted, 500mL",Mars Lab,83,, +4,"Brush, Test Tube, Nylon, Regular",,12,, +5,Bunsen Burner,Mars Lab,53,, +6,"Clamp, Double Buret",Mars Lab,70,, +7,"Clamp, Extension",,268,, +8,"Clamp, Holder",Mars Lab,108,, +9,Conductivity Apparatus,Mars Lab,76,, +10,"Crucible Tong, 9 ¾cm",,68,, +11,"Crucible with cover,Porcelain 30mL",Mars Lab,76,, +14,"Iron Ring, 117mm I.D",Mars Lab,46,, +16,"Mortar & Pestle, Porcelain, 400mL Vol.",Mars Lab,20,, +17,"Spot Plate, Porcelain, 12 Crates",Mars Lab,92,, +18,Test Tube Holder,Mars Lab,244,, +19,"Test Tube Rack, Stainless, 50holes (ID)",,131,, +20,"Test Tube Rack, Stainless, 50holes (ID), Big",,16,, +21,"Thermometer, Alcohol -10° - 350°C",Mars Lab,119,, +22,"Thermometer, Mercury -10° - 350°C",Mars Lab,113,, +23,Triple Beam Balance,Mars Lab,28,, +24,Water Bath,Mars Lab,73,, +25,"Wire Gauze, Ceramic Centered, 5x5",Mars Lab,6,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, +,,,,, diff --git a/equipment_tracker/schema.yml b/equipment_tracker/schema.yml index ff56ada..2e91902 100644 --- a/equipment_tracker/schema.yml +++ b/equipment_tracker/schema.yml @@ -1586,9 +1586,14 @@ components: remarks: type: string nullable: true - maxLength: 512 transaction_status: $ref: '#/components/schemas/TransactionStatusEnum' + additional_members: + type: string + nullable: true + consumables: + type: string + nullable: true timestamp: type: string format: date-time @@ -1697,9 +1702,14 @@ components: remarks: type: string nullable: true - maxLength: 512 transaction_status: $ref: '#/components/schemas/TransactionStatusEnum' + additional_members: + type: string + nullable: true + consumables: + type: string + nullable: true timestamp: type: string format: date-time diff --git a/equipment_tracker/transactions/migrations/0002_alter_transaction_transaction_status.py b/equipment_tracker/transactions/migrations/0002_alter_transaction_transaction_status.py new file mode 100644 index 0000000..a86786b --- /dev/null +++ b/equipment_tracker/transactions/migrations/0002_alter_transaction_transaction_status.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.1 on 2024-01-06 16:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('transactions', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='transaction', + name='transaction_status', + field=models.CharField(choices=[('Pending Approval', 'Pending Approval'), ('Approved', 'Approved'), ('Rejected', 'Rejected'), ('Cancelled', 'Cancelled'), ('Borrowed', 'Borrowed'), ('Returned: Pending Checking', 'Returned: Pending Checking'), ('With Breakages: Pending Resolution', 'With Breakages: Pending Resolution'), ('Finalized', 'Finalized')], db_index=True, default='Pending', max_length=40), + ), + ] diff --git a/equipment_tracker/transactions/models.py b/equipment_tracker/transactions/models.py index 1a8d12c..dd968de 100644 --- a/equipment_tracker/transactions/models.py +++ b/equipment_tracker/transactions/models.py @@ -2,6 +2,7 @@ from django.db import models from accounts.models import CustomUser from equipments.models import EquipmentInstance from django.utils.timezone import now +from django.core.cache import cache class Transaction(models.Model): @@ -34,9 +35,13 @@ class Transaction(models.Model): CustomUser, on_delete=models.SET_NULL, null=True, related_name='teacher_transactions') equipments = models.ManyToManyField(EquipmentInstance) transaction_status = models.CharField( - max_length=40, choices=TRANSACTION_STATUS_CHOICES, default='Pending') + max_length=40, choices=TRANSACTION_STATUS_CHOICES, default='Pending', db_index=True) subject = models.TextField(max_length=128) timestamp = models.DateTimeField(default=now, editable=False) def __str__(self): return f"Transaction #{self.id} under {self.teacher} by {self.borrower}" + + def save(self, *args, **kwargs): + cache.delete('non_finalized_transactions') + return super().save(*args, **kwargs) diff --git a/requirements.txt b/requirements.txt index 7e55fe0..24bc5a3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,43 +1,66 @@ -i https://pypi.org/simple +annotated-types==0.6.0; python_version >= '3.8' asgiref==3.7.2; python_version >= '3.7' -attrs==23.1.0; python_version >= '3.7' +attrs==23.2.0; python_version >= '3.7' certifi==2023.11.17; python_version >= '3.6' cffi==1.16.0; python_version >= '3.8' charset-normalizer==3.3.2; python_full_version >= '3.7.0' +click==8.1.7; python_version >= '3.7' +colorama==0.4.6; platform_system == 'Windows' cryptography==41.0.7; python_version >= '3.7' defusedxml==0.8.0rc2; python_version >= '3.6' -django==4.2.7 +django==5.0.1 django-cors-headers==4.3.1 django-extra-fields==3.0.2 django-simple-history==3.4.0 django-templated-mail==1.1.1 -django-unfold==0.17.1 +django-unfold==0.19.0 djangorestframework==3.14.0 -djangorestframework-simplejwt==5.3.0; python_version >= '3.7' +djangorestframework-simplejwt==5.3.1; python_version >= '3.8' djoser==2.2.2 -drf-spectacular[sidecar]==0.26.5 -drf-spectacular-sidecar==2023.10.1 +dotty-dict==1.3.1; python_version >= '3.5' and python_version < '4.0' +drf-spectacular[sidecar]==0.27.0 +drf-spectacular-sidecar==2024.1.1 +gitdb==4.0.11; python_version >= '3.7' +gitpython==3.1.40; python_version >= '3.7' idna==3.6; python_version >= '3.5' +importlib-resources==6.1.1; python_version >= '3.8' inflection==0.5.1; python_version >= '3.5' +jinja2==3.1.2; python_version >= '3.7' jsonschema==4.20.0; python_version >= '3.8' -jsonschema-specifications==2023.11.2; python_version >= '3.8' +jsonschema-specifications==2023.12.1; python_version >= '3.8' +markdown-it-py==3.0.0; python_version >= '3.8' +markupsafe==2.1.3; python_version >= '3.7' +mdurl==0.1.2; python_version >= '3.7' oauthlib==3.2.2; python_version >= '3.6' -pillow==10.1.0 +pillow==10.2.0 psycopg2==2.9.9 pycparser==2.21 +pydantic==2.5.3; python_version >= '3.7' +pydantic-core==2.14.6; python_version >= '3.7' +pygments==2.17.2; python_version >= '3.7' pyjwt==2.8.0; python_version >= '3.7' +pymemcache==4.0.0 python-dotenv==1.0.0 +python-gitlab==4.3.0; python_full_version >= '3.8.0' +python-semantic-release==8.7.0; python_version >= '3.7' python3-openid==3.2.0 pytz==2023.3.post1 pyyaml==6.0.1; python_version >= '3.6' -referencing==0.31.1; python_version >= '3.8' +referencing==0.32.1; python_version >= '3.8' requests==2.31.0; python_version >= '3.7' requests-oauthlib==1.3.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' -rpds-py==0.13.2; python_version >= '3.8' +requests-toolbelt==1.0.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' +rich==13.7.0; python_full_version >= '3.7.0' +rpds-py==0.16.2; python_version >= '3.8' +shellingham==1.5.4; python_version >= '3.7' +smmap==5.0.1; python_version >= '3.7' social-auth-app-django==5.4.0; python_version >= '3.8' social-auth-core==4.5.1; python_version >= '3.8' sqlparse==0.4.4; python_version >= '3.5' -tzdata==2023.3; sys_platform == 'win32' +tomlkit==0.12.3; python_version >= '3.7' +typing-extensions==4.9.0; python_version >= '3.8' +tzdata==2023.4; sys_platform == 'win32' uritemplate==4.1.1; python_version >= '3.6' urllib3==2.1.0; python_version >= '3.8' whitenoise==6.6.0