Migrate to postgres, add memcache and vastly improve available equipment instance query time from 1min 30 seconds to 12 seconds

This commit is contained in:
Keannu Bernasol 2024-01-07 02:28:14 +08:00
parent 0af8efa793
commit b0b1f4db86
24 changed files with 1253 additions and 292 deletions

1
.gitignore vendored
View file

@ -69,6 +69,7 @@ equipment_tracker/db.sqlite3
equipment_tracker/.env
equipment_tracker/static/*
equipment_tracker/static/
postgres_data/
# Flask stuff:
instance/

View file

@ -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

View file

@ -16,6 +16,7 @@ pillow = "*"
psycopg2 = "*"
django-simple-history = "*"
django-unfold = "*"
pymemcache = "*"
[dev-packages]

727
Pipfile.lock generated
View file

@ -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": [

View file

View file

@ -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:

View file

@ -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',
}
}

View file

@ -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),
),
]

View file

@ -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),
),
]

View file

@ -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)

View file

@ -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(

View file

@ -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

View file

@ -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,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
1 NAME Brand/Supplier Qty. Breakages Remarks
2 1 Beaker, 1000mL Pyrex 1
3 3 Beaker, 100mL Mars Lab 108 12
4 5 Beaker, 150mL Pyrex 50 11
5 8 Beaker, 250mL Pyrex 50 13
6 11 Beaker, 400mL Pyrex 20 1
7 14 Beaker, 50mL Mars Lab 44 13
8 15 Beaker, 600mL Pyrex 15 1
9 17 Bell Jar, Micro, Bottom Plate, 1000ml 1 PKI donated
10 18 Bell Jar, Micro, Bottom Plate, 200ml 1 PKI donated
11 19 Bell Jar, Micro, Bottom Plate, 500ml 1 PKI donated
12 31 Bottle, BOD, 300mL 3
13 34 Buret, Automatic Auto Refill, 50mL Kimax 2
14 35 Buret, Automatic Straight 3
15 36 Buret, Glass Stopcock, 50mL Pyrex 2
16 39 Buret, Teflon Stopcock, 10mL Pyrex 1
17 40 Buret, Teflon Stopcock, 25mL Pyrex 2
18 41 Buret, Teflon Stopcock, 50mL Pyrex 4
19 42 Buret, Teflon Stopcock, 50mL Mars Lab
20 46 Column, Distilling, Drip Tip 1 PKI donated
21 47 Column, Vigreux, Pattern-Multi 1 PKI donated
22 48 Concentrator, 250mL 1 PKI donated
23 49 Concentrator, 500mL 1 PKI donated
24 50 Condenser, Allihn, 24/38 1 PKI donated
25 51 Condenser, Allihn, 24/40, 300mm 1 PKI donated
26 52 Condenser, Allihn, Drip – Tip 1 PKI donated
27 53 Condenser, Allihn, Rotary Evaporator 1 PKI donated
28 54 Condenser, Coiled-Distillation 1 PKI donated
29 55 Condenser, Graham, Drip Tip, 19/38 1 PKI donated
30 56 Condenser, Graham, TS-Joint, 55/50 1 PKI donated
31 57 Condenser, Leibig, Drip – tip 1 PKI donated
32 58 Condenser, Leibig, Drip tip, 24/40, 41x 300mm 1 PKI donated
33 59 Condenser, West Drip Tip, 55/50 1 PKI donated
34 60 Condenser, with Still Head 1 PKI donated
35 61 Connecting Bulb for Kjeldal 1 PKI donated
36 62 Connecting Tube, Clasein, 24/29 1 PKI donated
37 63 Cuvette, Glass, 3.5mL capacity Mars Lab 8
38 64 Cylinder, Graduated, 1000mL Pyrex 1
39 66 Cylinder, Graduated, 100mL Mars Lab 52 4
40 67 Cylinder, Graduated, 10mL Pyrex 7
41 69 Cylinder, Graduated, 25mL Pyrex 10
42 70 Cylinder, Graduated, 50mL Pyrex 5
43 72 Cylinder, Graduated, 250mL Mars Lab 10
44 72 Cylinder, Graduated,Plastic 100mL 1
45 73 Dessicator, Glass, 10.4in.(O.D) x 8.11in. 1
46 74 Dessicator, Glass, 10.5in.(O.D) x 8.30in. 1
47 75 Dessicator, Glass, 10.5in.(O.D) x 9.23in. 1
48 76 Dessicator, Glass, 12.6in.(O.D) x 12.7in. 1
49 77 Dessicator, Glass, 6.63in.(O.D) x 6.00in. 1
50 78 Dessicator, Glass, 6.74in.(O.D) x 6.16in. 1
51 79 Dessicator, Glass, 7,500mL Mars Lab 4
52 80 Dessicator, Glass, 8.63in.(O.D) x 7.91in. 1
53 81 Dessicator, Glass, 8.67in.(O.D) x 7.61in. 1
54 82 Dessicator, Glass, 8.92in.(O.D) x 6.89in. 1
55 83 Dessicator, Glass, 8.93in.(O.D) x 9.10in. 1
56 84 Distillation Set up, Distilling Flask(1000mL) and Condenser Mars Lab 3
57 85 Distilling Flask, 1000mL Pyrex 6
58 86 Distilling Flask, Round Bottom, 100mL 3
59 87 Distilling Reciever, Dean Stark 2
60 92 Flask, Centrifuge, TS-Joint, 1000mL 1 PKI donated
61 93 Flask, Centrifuge, TS-Joint, 1000mL Vidrex 2
62 94 Flask, Conical 500mL Mars Lab 20
63 95 Flask, Distilling, Round Bottom, 1000mL 1 PKI donated
64 96 Flask, Distilling, Round Bottom, 1000mL Pyrex 1
65 98 Flask, Erlenmeyer, Low Actinic, 250mL Pyrex 4
66 99 Flask, Erlenmeyer, Narrowmouth, 1000mL Pyrex 5
67 11 Flask, Erlenmeyer, Narrowmouth, 125mL Pyrex 11
68 103 Flask, Erlenmeyer, Narrowmouth, 250mL Pyrex 9
69 105 Flask, Erlenmeyer, Narrowmouth, 300mL Pyrex 3
70 63 Flask, Erlenmeyer, Narrowmouth, 500mL Pyrex 63 6
71 116 Flask, Kjeldal, 200mL 8
72 117 Flask, Kjeldal, 500mL 1
73 118 Flask, Kjeldal, 500mL Mars Lab 33
74 119 Flask, Pear Shape, Shortneck, 1000mL Pyrex 4
75 120 Flask, Pear Shape, Shortneck, 100mL Pyrex 8
76 121 Flask, Pear Shape, Shortneck, 500mL Pyrex 5
77 122 Flask, Pear Shape, Shortneck, 50mL Pyrex 2
78 131 Flask, Volumetric, 100mL Pyrex 7
79 132 Flask, Volumetric, 100mL Mars Lab 4
80 134 Flask, Volumetric, 200mL Pyrex 4
81 136 Flask, Volumetric, 250mL Pyrex 15
82 139 Flask, Volumetric, 500mL Pyrex 1
83 141 Flask, Volumetric, 50mL Pyrex 1
84 142 Flask, Volumetric, 50mL Mars Lab 7 flasks have a broken stoppers
85 143 Funnel, Dropping, 1000mL Pyrex 1 PKI donated
86 145 Funnel, Separatory, Pear Shape, 100mL Vidrex 3
87 147 Funnel, Separatory, Pear Shape, 250mL Mars Lab 23
88 148 Funnel, Separatory, Pear Shape, 500mL Pyrex 11
89 149 Funnel, Separatory, Pear Shape, 500mL Pyrex 1
90 149 Funnel, Separatory, Pear Shape, 50mL Pyrex 1
91 150 Funnel, Short Stem, 100mm Pyrex 4
92 152 Funnel, Short Stem, 60° angle Mars Lab 23
93 171 Pipet, Measuring, 10mL Mars Lab 11
94 172 Pipet, Measuring, 1mL 3
95 174 Pipet, Measuring, 25mL 19
96 190 Pycnometer, 25mL Mars Lab 1
97 192 Recovery Bend w/ 2 Vertical Cones 1
98 193 Retort 3 2
99 194 Slide Glass, 100pcs. Per box Matsunami 8
100 197 Slide Glass, 72pcs. Per pack Sail Brand 1
101 198 Soxhlet Extraction Tube, TS-Joint, 34/28 Vidrex 4
102 199 Soxhlet Extraction Tube, TS-Joint, Large 12
103 200 Stirring Rod 5
104 221 Tilting Dispense 5
105 223 Watch Glass, 100mm dia. Mars Lab 50
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125

View file

@ -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,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
1 NAME Brand/Supplier Qty. Breakages Remarks
2 1 Beaker, 1000mL 2
3 3 Beaker, 100mL 148 3
4 6 Beaker, 150mL 48
5 8 Beaker, 250mL 132 8
6 11 Beaker, 400mL 26
7 14 Beaker, 50mL 122 3
8 15 Beaker, 500mL 1
9 16 Beaker, 600mL 14
10 17 Beaker, 800mL 1
11 38 Buret, Teflon Stopcock, 100mL 13
12 40 Buret, Teflon Stopcock, 25mL 9
13 41 Buret, Teflon Stopcock, 50mL 11
14 64 Cylinder, Graduated, 250mL 7
15 65 Cylinder, Graduated, 100mL 38 2
16 67 Cylinder, Graduated, 10mL 44 1
17 69 Cylinder, Graduated, 25mL 16 1
18 70 Cylinder, Graduated, 50mL 20 2
19 84 Distillation Set up, Distilling Flask(1000mL) and Condenser 3
20 99 Flask, Erlenmeyer, Narrowmouth, 1000mL 18
21 100 Flask, Erlenmeyer, Narrowmouth, 125mL 37 2
22 102 Flask, Erlenmeyer, Narrowmouth, 2000mL 2
23 103 Flask, Erlenmeyer, Narrowmouth, 250mL 52 4
24 105 Flask, Erlenmeyer, Narrowmouth, 300mL 21
25 106 Flask, Erlenmeyer, Narrowmouth, 500mL 41
26 112 Flask, Filtering 500mL 11 2
27 129 Flask, Volumetric, 1000mL 10
28 131 Flask, Volumetric, 100mL
29 132 Flask, Volumetric, 100mL 38
30 134 Flask, Volumetric, 200mL 5
31 137 Flask, Volumetric, 250mL 10
32 139 Flask, Volumetric, 500mL 15
33 141 Flask, Volumetric, 50mL 11
34 146 Funnel, Separatory, Pear Shape, 250mL 13 1
35 148 Funnel, Separatory, Pear Shape, 500mL 2
36 151 Funnel, Short Stem, 50mm 28 1
37 163 Petridish with cover, Glass, 100x15mm 23
38 165 Petridish without cover, Glass, 100x15mm 3
39 166 Petridish, with cover, Glass,140mmx17mm 3
40 167 Petridish, with cover, Glass,60mmx15mm 5
41 168 Petridish, without cover, Glass,140x17mm 7
42 171 Pipet, Measuring, 10mL 15
43 172 Pipet, Measuring, 1mL 11
44 174 Pipet, Measuring, 25mL 12
45 176 Pipet, Measuring, 2mL 4
46 178 Pipet, Measuring, 5mL 5
47 179 Pipet, Volumetric 15mL 2
48 180 Pipet, Volumetric, 10mL 22 1
49 181 Pipet, Volumetric, 1mL 2
50 182 Pipet, Volumetric, 20mL 1
51 186 Pipet, Volumetric, 50mL 2
52 187 Pipet, Volumetric, 5mL 4
53 189 Pycnometer, 25mL 8
54 200 Stirring Rod 64
55 223 Watch Glass, 100mm dia. 46
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

View file

@ -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,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
1 NAME Brand/Supplier Qty. Breakages Remarks
2 3 Beaker, 100mL 27
3 6 Beaker, 150mL 2
4 8 Beaker, 250mL 116
5 11 Beaker, 400mL 185
6 15 Beaker, 50mL 30
7 20 Bottle Reagent, Clear, NM, 1000mL 6
8 21 Bottle Reagent, Clear, NM, 1000mL Mars Lab 15
9 22 Bottle Reagent, Clear, NM, 100mL 13
10 23 Bottle Reagent, Clear, NM, 2000mL 5
11 24 Bottle Reagent, Clear, NM, 2500mL 2
12 25 Bottle Reagent, Clear, NM, 5000mL 6
13 26 Bottle Reagent, Clear, NM, 500mL 32
14 27 Bottle Reagent, Clear, WM, 250mL 11
15 28 Bottle Reagent, Clear, WM, 40mL 3
16 29 Bottle Reagent, Clear, WM, 500mL 4
17 30 Bottle, BOD, 100mL 12
18 31 Bottle, BOD, 300mL 48 26
19 32 Bottle, Media, 250mL 6
20 33 Bottle, Media, 500mL 2
21 Buret, Teflon Stopcock, 100mL 5
22 41 Buret, Teflon Stopcock, 50mL 84
23 64 Cylinder, Graduated, 100mL 36
24 65 Cylinder, Graduated, 10mL 38
25 67 Cylinder, Graduated, 250mL 3
26 70 Cylinder, Graduated, 50mL 28
27 84 Distillation Set up, Distilling Flask(1000mL) and Condenser 5
28 99 Flask, Erlenmeyer, Narrowmouth, 1000mL 17
29 100 Flask, Erlenmeyer, Narrowmouth, 125mL 13
30 102 Flask, Erlenmeyer, Narrowmouth, 2000mL 7
31 103 Flask, Erlenmeyer, Narrowmouth, 250mL 68
32 105 Flask, Erlenmeyer, Narrowmouth, 300mL 1
33 106 Flask, Erlenmeyer, Narrowmouth, 500mL 9
34 112 Flask, Filtering 500mL 55
35 124 Flask, Round Bottom, Longneck, 500mL 19
36 132 Flask, Volumetric, 100mL 7
37 139 Flask, Volumetric, 500mL 20
38 146 Funnel, Separatory, Pear Shape, 250mL 23
39 162 Nitrogen Distillation Apparatus 1
40 174 Pipet, Measuring, 25mL 37
41 189 Pycnometer, 25mL 19
42 200 Stirring Rod 68
43 194 Slide Glass, 100pcs. Per box Matsunami 10
44 195 Slide Glass, 100pcs. Per box Mars Lab 18
45 196 Slide Glass, 50pcs. Per pack Toshinriko 1
46 197 Slide Glass, 72pcs. Per pack Sail Brand 1
47 198 Soxhlet Extraction Tube, TS-Joint, 34/28 Vidrex 4
48 199 Soxhlet Extraction Tube, TS-Joint, Large 12
49 202 Test Tube with Stopper 10mL Mars Lab 18
50 203 Test Tube with screw caps 30mL Mars Lab 236
51 204 Test Tube, 10mL Mars Lab 1924 45
52 205 Test Tube, 12mm OD x 120mmL Hach 400 42
53 206 Test Tube, 12mm OD x 7mmL 60
54 207 Test Tube, 13mm OD x 110mmL 88
55 208 Test Tube, 13mm OD x 75mmL 5
56 209 Test Tube, 15mm OD x 100mmL 16
57 210 Test Tube, 16mm OD x 100mmL 65
58 211 Test Tube, 16mm OD x 125mmL 191 20
59 212 Test Tube, 16mm OD x 60mmL 64
60 213 Test Tube, 18mm OD x 165mmL 98
61 214 Test Tube, 18mm OD x 16mmL 54
62 215 Test Tube, 20mL Mars Lab 237
63 216 Test Tube, 25mm OD x 200mmL 81
64 217 Test Tube, 50mL Mars Lab 90
65 218 Test Tube, Borosilicate Glass, 10/15 2
66 219 Test Tube, Borosilicate Glass, 100mL 34
67 220 Test Tube, Borosilicate Glass, 50mL 55
68 223 Watch Glass, 100mm dia. 86 23
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

View file

@ -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,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
1 NAME Brand/Supplier Qty. Breakages Remarks
2 1 Alcohol Lamp Mars Lab 20
3 2 Basin, Plastic, 12inch Dia. Mars Lab 1
4 3 Bottle, Washing, Assorted, 500mL Mars Lab 83
5 4 Brush, Test Tube, Nylon, Regular 12
6 5 Bunsen Burner Mars Lab 53
7 6 Clamp, Double Buret Mars Lab 70
8 7 Clamp, Extension 268
9 8 Clamp, Holder Mars Lab 108
10 9 Conductivity Apparatus Mars Lab 76
11 10 Crucible Tong, 9 ¾cm 68
12 11 Crucible with cover,Porcelain 30mL Mars Lab 76
13 14 Iron Ring, 117mm I.D Mars Lab 46
14 16 Mortar & Pestle, Porcelain, 400mL Vol. Mars Lab 20
15 17 Spot Plate, Porcelain, 12 Crates Mars Lab 92
16 18 Test Tube Holder Mars Lab 244
17 19 Test Tube Rack, Stainless, 50holes (ID) 131
18 20 Test Tube Rack, Stainless, 50holes (ID), Big 16
19 21 Thermometer, Alcohol -10° - 350°C Mars Lab 119
20 22 Thermometer, Mercury -10° - 350°C Mars Lab 113
21 23 Triple Beam Balance Mars Lab 28
22 24 Water Bath Mars Lab 73
23 25 Wire Gauze, Ceramic Centered, 5x5 Mars Lab 6
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

View file

@ -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,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
1 NAME Brand/Supplier Qty. Breakages Remarks
2 1 Alcohol Lamp Mars Lab 9 1
3 2 Basin, Plastic, 12inch Dia. Mars Lab 4
4 3 Bottle, Washing, Assorted, 500mL Mars Lab 67 4
5 4 Brush, Test Tube, Nylon, Regular 47 12
6 5 Bulb, Aspirator, Orange, Pointed Tip 33 16
7 6 Bunsen Burner Mars Lab 15 4
8 7 Clamp, Double Buret Mars Lab 26
9 8 Clamp, Extension 30 3
10 9 Crucible Tong, 9 ¾cm 37
11 10 Crucible with cover,Porcelain 30mL Mars Lab 82 34
12 11 Crucible, Metal w/o cover, 30mL 8
13 12 Evaporating dish, 120mL Mars Lab 22 15
14 13 Forceps, Stainless Mars Lab 10 3
15 14 Funnel Stand 9
16 15 Funnel, Buchner, 200mm 5
17 16 Hot Plate, Single Burner Mars Lab 5 1
18 17 Hydrometer, range: 1.000 tp 1.070 Mars Lab
19 18 Iron Ring, 117mm I.D Mars Lab 24
20 19 Iron Stand Mars Lab 26
21 20 Iron Wire Triangles, 3.8(1.5)cm(in.) 9 4
22 21 Mortar & Pestle, Porcelain, 400mL Vol. Mars Lab 28
23 22 Spot Plate, Porcelain, 12 Crates Mars Lab 19
24 23 Spot Plate, Porcelain, 12 Holes, Plastic 5 4
25 24 Test Tube Holder Mars Lab 31
26 25 Test Tube Rack, Stainless, 50holes (ID), 34
27 26 Thermometer, Alcohol -10° - 350°C Mars Lab 44 12
28 27 Thermometer, Mercury -10° - 350°C Mars Lab 29 11
29 28 Triple Beam Balance Mars Lab 11
30 29 Water Bath Mars Lab 21 5
31 30 Wire Gauze, Ceramic Centered, 5x5 Mars Lab 60 45
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

View file

@ -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,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
,,,,,
1 NAME Brand/Supplier Qty. Breakages Remarks
2 1 Alcohol Lamp Mars Lab 20
3 2 Basin, Plastic, 12inch Dia. Mars Lab 1
4 3 Bottle, Washing, Assorted, 500mL Mars Lab 83
5 4 Brush, Test Tube, Nylon, Regular 12
6 5 Bunsen Burner Mars Lab 53
7 6 Clamp, Double Buret Mars Lab 70
8 7 Clamp, Extension 268
9 8 Clamp, Holder Mars Lab 108
10 9 Conductivity Apparatus Mars Lab 76
11 10 Crucible Tong, 9 ¾cm 68
12 11 Crucible with cover,Porcelain 30mL Mars Lab 76
13 14 Iron Ring, 117mm I.D Mars Lab 46
14 16 Mortar & Pestle, Porcelain, 400mL Vol. Mars Lab 20
15 17 Spot Plate, Porcelain, 12 Crates Mars Lab 92
16 18 Test Tube Holder Mars Lab 244
17 19 Test Tube Rack, Stainless, 50holes (ID) 131
18 20 Test Tube Rack, Stainless, 50holes (ID), Big 16
19 21 Thermometer, Alcohol -10° - 350°C Mars Lab 119
20 22 Thermometer, Mercury -10° - 350°C Mars Lab 113
21 23 Triple Beam Balance Mars Lab 28
22 24 Water Bath Mars Lab 73
23 25 Wire Gauze, Ceramic Centered, 5x5 Mars Lab 6
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

View file

@ -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

View file

@ -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),
),
]

View file

@ -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)

View file

@ -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