From 1ea18d7861192d12db35a57107b724dc42cb8bd6 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Mon, 10 Jun 2024 17:53:15 -0600 Subject: [PATCH 1/5] feat(app): adding models and admin for address lists --- api/Pipfile | 1 + api/Pipfile.lock | 692 +++++++++--------- api/registry/admin.py | 54 +- .../0033_addresslist_addresslistmember.py | 58 ++ api/registry/models.py | 22 +- api/scorer/settings/base.py | 3 + 6 files changed, 461 insertions(+), 369 deletions(-) create mode 100644 api/registry/migrations/0033_addresslist_addresslistmember.py diff --git a/api/Pipfile b/api/Pipfile index f768bea27..6f2009566 100644 --- a/api/Pipfile +++ b/api/Pipfile @@ -45,6 +45,7 @@ python-jose = "*" uvarint = "*" django-ace = "*" async-timeout = "*" +django-import-export = "*" [dev-packages] black = "*" diff --git a/api/Pipfile.lock b/api/Pipfile.lock index b8bec8d28..1deba6cc0 100644 --- a/api/Pipfile.lock +++ b/api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "282c4645611891ba434e5e861e53d8fc9f45fb155188c56766335dfe266d02fa" + "sha256": "d84ad4d76e8559e781c04a66fa4e38a2353a5e7a7e54d09964720fcaf4b180f6" }, "pipfile-spec": 6, "requires": { @@ -124,11 +124,11 @@ }, "anyio": { "hashes": [ - "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8", - "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" + "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94", + "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7" ], "markers": "python_version >= '3.8'", - "version": "==4.3.0" + "version": "==4.4.0" }, "asgiref": { "hashes": [ @@ -144,7 +144,6 @@ "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.0.3" }, "attrs": { @@ -316,20 +315,19 @@ }, "boto3": { "hashes": [ - "sha256:6f600b3fe0bda53476395c902d9af5a47294c93ec52a9cdc2b926a9dc705ce79", - "sha256:b54084d000483b578757df03ce39a819fbba47071c9aa98611beb8806bcecd45" + "sha256:42b140fc850cf261ee4b1e8ef527fa071b1f1592a6d6a68d34b29f37cc46b4dd", + "sha256:56bec52d485d5670ce96d53ae7b2cd4ae4e8a705fb2298a21093cdd77d642331" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.34.99" + "version": "==1.34.123" }, "botocore": { "hashes": [ - "sha256:18c68bdeb0ffb73290912b0c96204fc36d3128f00a00b5cdc35ac34d66225f1c", - "sha256:cafe569e2136cb33cb0e5dd32fb1c0e1503ddc1413d3be215df8ddf05e69137a" + "sha256:8c34ada2a708c82e7174bff700611643db7ce2cb18f1130c35045c24310d299d", + "sha256:a8577f6574600c4d159b5cd103ee05744a443d77f7778304e17307940b369c4f" ], "markers": "python_version >= '3.8'", - "version": "==1.34.99" + "version": "==1.34.123" }, "celery": { "extras": [ @@ -339,16 +337,16 @@ "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64", "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==5.4.0" }, "certifi": { "hashes": [ - "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", - "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" + "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" ], "markers": "python_version >= '3.6'", - "version": "==2024.2.2" + "version": "==2024.6.2" }, "cffi": { "hashes": [ @@ -545,41 +543,41 @@ }, "cryptography": { "hashes": [ - "sha256:02c0eee2d7133bdbbc5e24441258d5d2244beb31da5ed19fbb80315f4bbbff55", - "sha256:0d563795db98b4cd57742a78a288cdbdc9daedac29f2239793071fe114f13785", - "sha256:16268d46086bb8ad5bf0a2b5544d8a9ed87a0e33f5e77dd3c3301e63d941a83b", - "sha256:1a58839984d9cb34c855197043eaae2c187d930ca6d644612843b4fe8513c886", - "sha256:2954fccea107026512b15afb4aa664a5640cd0af630e2ee3962f2602693f0c82", - "sha256:2e47577f9b18723fa294b0ea9a17d5e53a227867a0a4904a1a076d1646d45ca1", - "sha256:31adb7d06fe4383226c3e963471f6837742889b3c4caa55aac20ad951bc8ffda", - "sha256:3577d029bc3f4827dd5bf8bf7710cac13527b470bbf1820a3f394adb38ed7d5f", - "sha256:36017400817987670037fbb0324d71489b6ead6231c9604f8fc1f7d008087c68", - "sha256:362e7197754c231797ec45ee081f3088a27a47c6c01eff2ac83f60f85a50fe60", - "sha256:3de9a45d3b2b7d8088c3fbf1ed4395dfeff79d07842217b38df14ef09ce1d8d7", - "sha256:4f698edacf9c9e0371112792558d2f705b5645076cc0aaae02f816a0171770fd", - "sha256:5482e789294854c28237bba77c4c83be698be740e31a3ae5e879ee5444166582", - "sha256:5e44507bf8d14b36b8389b226665d597bc0f18ea035d75b4e53c7b1ea84583cc", - "sha256:779245e13b9a6638df14641d029add5dc17edbef6ec915688f3acb9e720a5858", - "sha256:789caea816c6704f63f6241a519bfa347f72fbd67ba28d04636b7c6b7da94b0b", - "sha256:7f8b25fa616d8b846aef64b15c606bb0828dbc35faf90566eb139aa9cff67af2", - "sha256:8cb8ce7c3347fcf9446f201dc30e2d5a3c898d009126010cbd1f443f28b52678", - "sha256:93a3209f6bb2b33e725ed08ee0991b92976dfdcf4e8b38646540674fc7508e13", - "sha256:a3a5ac8b56fe37f3125e5b72b61dcde43283e5370827f5233893d461b7360cd4", - "sha256:a47787a5e3649008a1102d3df55424e86606c9bae6fb77ac59afe06d234605f8", - "sha256:a79165431551042cc9d1d90e6145d5d0d3ab0f2d66326c201d9b0e7f5bf43604", - "sha256:a987f840718078212fdf4504d0fd4c6effe34a7e4740378e59d47696e8dfb477", - "sha256:a9bc127cdc4ecf87a5ea22a2556cab6c7eda2923f84e4f3cc588e8470ce4e42e", - "sha256:bd13b5e9b543532453de08bcdc3cc7cebec6f9883e886fd20a92f26940fd3e7a", - "sha256:c65f96dad14f8528a447414125e1fc8feb2ad5a272b8f68477abbcc1ea7d94b9", - "sha256:d8e3098721b84392ee45af2dd554c947c32cc52f862b6a3ae982dbb90f577f14", - "sha256:e6b79d0adb01aae87e8a44c2b64bc3f3fe59515280e00fb6d57a7267a2583cda", - "sha256:e6b8f1881dac458c34778d0a424ae5769de30544fc678eac51c1c8bb2183e9da", - "sha256:e9b2a6309f14c0497f348d08a065d52f3020656f675819fc405fb63bbcd26562", - "sha256:ecbfbc00bf55888edda9868a4cf927205de8499e7fabe6c050322298382953f2", - "sha256:efd0bf5205240182e0f13bcaea41be4fdf5c22c5129fc7ced4a0282ac86998c9" + "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", + "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", + "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", + "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", + "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", + "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", + "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", + "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", + "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", + "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", + "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", + "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", + "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", + "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", + "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", + "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", + "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", + "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", + "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", + "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", + "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", + "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", + "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", + "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", + "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", + "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", + "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", + "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", + "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", + "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", + "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", + "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" ], "markers": "python_version >= '3.7'", - "version": "==42.0.7" + "version": "==42.0.8" }, "cytoolz": { "hashes": [ @@ -697,7 +695,6 @@ "sha256:e0d1c45427ed1fa21bbd103163d4b250f4ce9066337d6ffb976da1fac3a67454" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.3.3" }, "defusedxml": { @@ -750,16 +747,22 @@ "sha256:e882e4eb4900cc732ac6a4ddd4974adc41bff3eac98201ba9c76fe104edf48aa" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.3.2" }, + "diff-match-patch": { + "hashes": [ + "sha256:953019cdb9c9d2c9e47b5b12bcff3cf4746fc4598eb406076fa1fc27e6a1f15c", + "sha256:dce43505fb7b1b317de7195579388df0746d90db07015ed47a85e5e44930ef93" + ], + "markers": "python_version >= '3.7'", + "version": "==20230430" + }, "django": { "hashes": [ "sha256:08f41f468b63335aea0d904c5729e0250300f6a1907bf293a65499496cdbc68f", "sha256:a64d2487cdb00ad7461434320ccc38e60af9c404773a2f95ab0093b4453a3215" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.2.6" }, "django-ace": { @@ -776,7 +779,6 @@ "sha256:0bf65ef45e606aff1994d35503e6b677c0b26cafff6506f8fd7187f3be840207" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.3.1" }, "django-debug-toolbar": { @@ -785,7 +787,6 @@ "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.3.0" }, "django-environ": { @@ -794,7 +795,6 @@ "sha256:f32a87aa0899894c27d4e1776fa6b477e8164ed7f6b3e410a62a6d72caaf64be" ], "index": "pypi", - "markers": "python_version >= '3.6' and python_version < '4'", "version": "==0.11.2" }, "django-extensions": { @@ -803,7 +803,6 @@ "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.3" }, "django-filter": { @@ -812,16 +811,22 @@ "sha256:df2ee9857e18d38bed203c8745f62a803fa0f31688c9fe6f8e868120b1848e48" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.2" }, + "django-import-export": { + "hashes": [ + "sha256:173d165b85774a3f8327b58af89ed2d6d95547f668dba39b8c9eceb8870d32a4", + "sha256:63f0c8add728aafc82bcb7c53ec9f66528a9556c4786ef28f5f8b8eb662a7021" + ], + "index": "pypi", + "version": "==4.0.7" + }, "django-ipware": { "hashes": [ "sha256:d9ec43d2bf7cdf216fed8d494a084deb5761a54860a53b2e74346a4f384cff47", "sha256:db16bbee920f661ae7f678e4270460c85850f03c6761a4eaeb489bdc91f64709" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==7.0.1" }, "django-ninja": { @@ -830,7 +835,6 @@ "sha256:c53b098a8190f373ea2605c276a6061d48b2626500a9c6b9916c503e4b4a20eb" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.22.2" }, "django-ninja-extra": { @@ -839,7 +843,6 @@ "sha256:ce6a897eed41eb5f93bdf2ad59b329e73ec8221d1630f0fdb4cf925397ab300d" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.19.8" }, "django-ninja-jwt": { @@ -848,7 +851,6 @@ "sha256:e80d3d1b54363b97cf8c1fea02ae1d0a90ec5604bd0288acf90c97c3d38d2694" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==5.2.7" }, "django-ratelimit": { @@ -857,17 +859,15 @@ "sha256:d047a31cf94d83ef1465d7543ca66c6fc16695559b5f8d814d1b51df15110b92" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.1.0" }, "django-structlog": { "hashes": [ - "sha256:8431db72e9093850f4ec952a74768619667ff43987e1559526de39a82e5869a7", - "sha256:e439ae173d8d852b5f991ff7528d8ce5b0ae003cc6ea513215334b3204aee09c" + "sha256:0229b9a2efbd24a4e3500169788e53915c2429521e34e41dd58ccc56039bef3f", + "sha256:1072564bd6f36e8d3ba9893e7b31c1c46e94301189fedaecc0fb8a46525a3214" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==8.0.0" + "version": "==8.1.0" }, "djangorestframework-api-key": { "hashes": [ @@ -875,7 +875,6 @@ "sha256:eed94f383e96ca8f9f9e4182406fe28b5585629d0039f65cbb7e6e254778f674" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==2.3.0" }, "dnspython": { @@ -968,12 +967,11 @@ }, "faker": { "hashes": [ - "sha256:6737cc6d591cd83421fdc5e494f6e2c1a6e32266214f158b745aa9fa15687c98", - "sha256:c153505618801f1704807b258a6010ea8cabf91f66f4788939bfdba83b887e76" + "sha256:4c40b34a9c569018d4f9d6366d71a4da8a883d5ddf2b23197be5370f29b7e1b6", + "sha256:bdec5f2fb057d244ebef6e0ed318fea4dcbdf32c3a1a010766fc45f5d68fc68d" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==25.0.1" + "version": "==25.8.0" }, "frozenlist": { "hashes": [ @@ -1080,7 +1078,6 @@ "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==22.0.0" }, "h11": { @@ -1239,7 +1236,6 @@ "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.6" }, "morphys": { @@ -1366,7 +1362,6 @@ "sha256:3f7e2d40c1ff124778d56630cdd5c9243e9430c924c50e7fb353ea54494242f7" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.13.6" }, "numpy": { @@ -1421,11 +1416,11 @@ }, "packaging": { "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" ], - "markers": "python_version >= '3.7'", - "version": "==24.0" + "markers": "python_version >= '3.8'", + "version": "==24.1" }, "parsimonious": { "hashes": [ @@ -1436,28 +1431,28 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", - "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" + "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", + "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.43" + "version": "==3.0.47" }, "protobuf": { "hashes": [ - "sha256:38aa5f535721d5bb99861166c445c4105c4e285c765fbb2ac10f116e32dcd46d", - "sha256:3c388ea6ddfe735f8cf69e3f7dc7611e73107b60bdfcf5d0f024c3ccd3794e23", - "sha256:7ee014c2c87582e101d6b54260af03b6596728505c79f17c8586e7523aaa8f8c", - "sha256:8ca2a1d97c290ec7b16e4e5dff2e5ae150cc1582f55b5ab300d45cb0dfa90e51", - "sha256:9b557c317ebe6836835ec4ef74ec3e994ad0894ea424314ad3552bc6e8835b4e", - "sha256:b9ba3ca83c2e31219ffbeb9d76b63aad35a3eb1544170c55336993d7a18ae72c", - "sha256:d693d2504ca96750d92d9de8a103102dd648fda04540495535f0fec7577ed8fc", - "sha256:da612f2720c0183417194eeaa2523215c4fcc1a1949772dc65f05047e08d5932", - "sha256:e6039957449cb918f331d32ffafa8eb9255769c96aa0560d9a5bf0b4e00a2a33", - "sha256:f7417703f841167e5a27d48be13389d52ad705ec09eade63dfc3180a959215d7", - "sha256:fbfe61e7ee8c1860855696e3ac6cfd1b01af5498facc6834fcc345c9684fb2ca" + "sha256:25236b69ab4ce1bec413fd4b68a15ef8141794427e0b4dc173e9d5d9dffc3bcd", + "sha256:39309898b912ca6febb0084ea912e976482834f401be35840a008da12d189340", + "sha256:3adc15ec0ff35c5b2d0992f9345b04a540c1e73bfee3ff1643db43cc1d734333", + "sha256:4ac7249a1530a2ed50e24201d6630125ced04b30619262f06224616e0030b6cf", + "sha256:4e38fc29d7df32e01a41cf118b5a968b1efd46b9c41ff515234e794011c78b17", + "sha256:7a97b9c5aed86b9ca289eb5148df6c208ab5bb6906930590961e08f097258107", + "sha256:917ed03c3eb8a2d51c3496359f5b53b4e4b7e40edfbdd3d3f34336e0eef6825a", + "sha256:df5e5b8e39b7d1c25b186ffdf9f44f40f810bbcc9d2b71d9d3156fee5a9adf15", + "sha256:dfddb7537f789002cc4eb00752c92e67885badcc7005566f2c5de9d969d3282d", + "sha256:ee52874a9e69a30271649be88ecbe69d374232e8fd0b4e4b0aaaa87f429f1631", + "sha256:f6abd0f69968792da7460d3c2cfa7d94fd74e1c21df321eb6345b963f9ec3d8d" ], "markers": "python_version >= '3.8'", - "version": "==5.26.1" + "version": "==5.27.1" }, "psycopg2-binary": { "hashes": [ @@ -1535,7 +1530,6 @@ "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==2.9.9" }, "py-cid": { @@ -1569,46 +1563,45 @@ }, "pyarrow": { "hashes": [ - "sha256:00a1dcb22ad4ceb8af87f7bd30cc3354788776c417f493089e0a0af981bc8d80", - "sha256:1ab8b9050752b16a8b53fcd9853bf07d8daf19093533e990085168f40c64d978", - "sha256:20ce707d9aa390593ea93218b19d0eadab56390311cb87aad32c9a869b0e958c", - "sha256:22a1fdb1254e5095d629e29cd1ea98ed04b4bbfd8e42cc670a6b639ccc208b60", - "sha256:266ddb7e823f03733c15adc8b5078db2df6980f9aa93d6bb57ece615df4e0ba7", - "sha256:2a7abdee4a4a7cfa239e2e8d721224c4b34ffe69a0ca7981354fe03c1328789b", - "sha256:35692ce8ad0b8c666aa60f83950957096d92f2a9d8d7deda93fb835e6053307e", - "sha256:3c2f5e239db7ed43e0ad2baf46a6465f89c824cc703f38ef0fde927d8e0955f7", - "sha256:42e56557bc7c5c10d3e42c3b32f6cff649a29d637e8f4e8b311d334cc4326730", - "sha256:5448564754c154997bc09e95a44b81b9e31ae918a86c0fcb35c4aa4922756f55", - "sha256:56850a0afe9ef37249d5387355449c0f94d12ff7994af88f16803a26d38f2016", - "sha256:574a00260a4ed9d118a14770edbd440b848fcae5a3024128be9d0274dbcaf858", - "sha256:5823275c8addbbb50cd4e6a6839952682a33255b447277e37a6f518d6972f4e1", - "sha256:59bb1f1edbbf4114c72415f039f1359f1a57d166a331c3229788ccbfbb31689a", - "sha256:5cc23090224b6594f5a92d26ad47465af47c1d9c079dd4a0061ae39551889efe", - "sha256:705db70d3e2293c2f6f8e84874b5b775f690465798f66e94bb2c07bab0a6bb55", - "sha256:71d52561cd7aefd22cf52538f262850b0cc9e4ec50af2aaa601da3a16ef48877", - "sha256:729f7b262aa620c9df8b9967db96c1575e4cfc8c25d078a06968e527b8d6ec05", - "sha256:91d28f9a40f1264eab2af7905a4d95320ac2f287891e9c8b0035f264fe3c3a4b", - "sha256:99af421ee451a78884d7faea23816c429e263bd3618b22d38e7992c9ce2a7ad9", - "sha256:9dd3151d098e56f16a8389c1247137f9e4c22720b01c6f3aa6dec29a99b74d80", - "sha256:b93c9a50b965ee0bf4fef65e53b758a7e8dcc0c2d86cebcc037aaaf1b306ecc0", - "sha256:bd40467bdb3cbaf2044ed7a6f7f251c8f941c8b31275aaaf88e746c4f3ca4a7a", - "sha256:c0815d0ddb733b8c1b53a05827a91f1b8bde6240f3b20bf9ba5d650eb9b89cdf", - "sha256:cc8814310486f2a73c661ba8354540f17eef51e1b6dd090b93e3419d3a097b3a", - "sha256:d22d0941e6c7bafddf5f4c0662e46f2075850f1c044bf1a03150dd9e189427ce", - "sha256:d831690844706e374c455fba2fb8cfcb7b797bfe53ceda4b54334316e1ac4fa4", - "sha256:d91073d1e2fef2c121154680e2ba7e35ecf8d4969cc0af1fa6f14a8675858159", - "sha256:dd9334a07b6dc21afe0857aa31842365a62eca664e415a3f9536e3a8bb832c07", - "sha256:df0080339387b5d30de31e0a149c0c11a827a10c82f0c67d9afae3981d1aabb7", - "sha256:ed66e5217b4526fa3585b5e39b0b82f501b88a10d36bd0d2a4d8aa7b5a48e2df", - "sha256:edf38cce0bf0dcf726e074159c60516447e4474904c0033f018c1f33d7dac6c5", - "sha256:ef2f309b68396bcc5a354106741d333494d6a0d3e1951271849787109f0229a6", - "sha256:f293e92d1db251447cb028ae12f7bc47526e4649c3a9924c8376cab4ad6b98bd", - "sha256:fb8065dbc0d051bf2ae2453af0484d99a43135cadabacf0af588a3be81fbbb9b", - "sha256:fda9a7cebd1b1d46c97b511f60f73a5b766a6de4c5236f144f41a5d5afec1f35" + "sha256:06ebccb6f8cb7357de85f60d5da50e83507954af617d7b05f48af1621d331c9a", + "sha256:0d07de3ee730647a600037bc1d7b7994067ed64d0eba797ac74b2bc77384f4c2", + "sha256:0d27bf89dfc2576f6206e9cd6cf7a107c9c06dc13d53bbc25b0bd4556f19cf5f", + "sha256:0d32000693deff8dc5df444b032b5985a48592c0697cb6e3071a5d59888714e2", + "sha256:15fbb22ea96d11f0b5768504a3f961edab25eaf4197c341720c4a387f6c60315", + "sha256:17e23b9a65a70cc733d8b738baa6ad3722298fa0c81d88f63ff94bf25eaa77b9", + "sha256:185d121b50836379fe012753cf15c4ba9638bda9645183ab36246923875f8d1b", + "sha256:18da9b76a36a954665ccca8aa6bd9f46c1145f79c0bb8f4f244f5f8e799bca55", + "sha256:19741c4dbbbc986d38856ee7ddfdd6a00fc3b0fc2d928795b95410d38bb97d15", + "sha256:25233642583bf658f629eb230b9bb79d9af4d9f9229890b3c878699c82f7d11e", + "sha256:2e51ca1d6ed7f2e9d5c3c83decf27b0d17bb207a7dea986e8dc3e24f80ff7d6f", + "sha256:2e73cfc4a99e796727919c5541c65bb88b973377501e39b9842ea71401ca6c1c", + "sha256:31a1851751433d89a986616015841977e0a188662fcffd1a5677453f1df2de0a", + "sha256:3b20bd67c94b3a2ea0a749d2a5712fc845a69cb5d52e78e6449bbd295611f3aa", + "sha256:4740cc41e2ba5d641071d0ab5e9ef9b5e6e8c7611351a5cb7c1d175eaf43674a", + "sha256:48be160782c0556156d91adbdd5a4a7e719f8d407cb46ae3bb4eaee09b3111bd", + "sha256:8785bb10d5d6fd5e15d718ee1d1f914fe768bf8b4d1e5e9bf253de8a26cb1628", + "sha256:98100e0268d04e0eec47b73f20b39c45b4006f3c4233719c3848aa27a03c1aef", + "sha256:99f7549779b6e434467d2aa43ab2b7224dd9e41bdde486020bae198978c9e05e", + "sha256:9cf389d444b0f41d9fe1444b70650fea31e9d52cfcb5f818b7888b91b586efff", + "sha256:a33a64576fddfbec0a44112eaf844c20853647ca833e9a647bfae0582b2ff94b", + "sha256:a8914cd176f448e09746037b0c6b3a9d7688cef451ec5735094055116857580c", + "sha256:b04707f1979815f5e49824ce52d1dceb46e2f12909a48a6a753fe7cafbc44a0c", + "sha256:b5f5705ab977947a43ac83b52ade3b881eb6e95fcc02d76f501d549a210ba77f", + "sha256:ba8ac20693c0bb0bf4b238751d4409e62852004a8cf031c73b0e0962b03e45e3", + "sha256:bf9251264247ecfe93e5f5a0cd43b8ae834f1e61d1abca22da55b20c788417f6", + "sha256:d0ebea336b535b37eee9eee31761813086d33ed06de9ab6fc6aaa0bace7b250c", + "sha256:ddf5aace92d520d3d2a20031d8b0ec27b4395cab9f74e07cc95edf42a5cc0147", + "sha256:ddfe389a08ea374972bd4065d5f25d14e36b43ebc22fc75f7b951f24378bf0b5", + "sha256:e1369af39587b794873b8a307cc6623a3b1194e69399af0efd05bb202195a5a7", + "sha256:e6b6d3cd35fbb93b70ade1336022cc1147b95ec6af7d36906ca7fe432eb09710", + "sha256:f07fdffe4fd5b15f5ec15c8b64584868d063bc22b86b46c9695624ca3505b7b4", + "sha256:f2c5fb249caa17b94e2b9278b36a05ce03d3180e6da0c4c3b3ce5b2788f30eed", + "sha256:f68f409e7b283c085f2da014f9ef81e885d90dcd733bd648cfba3ef265961848", + "sha256:fbef391b63f708e103df99fbaa3acf9f671d77a183a07546ba2f2c297b361e83", + "sha256:febde33305f1498f6df85e8020bca496d0e9ebf2093bab9e0f65e2b4ae2b3444" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==16.0.0" + "version": "==16.1.0" }, "pyasn1": { "hashes": [ @@ -1664,9 +1657,7 @@ "version": "==3.20.0" }, "pydantic": { - "extras": [ - "email" - ], + "extras": [], "hashes": [ "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de", "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986", @@ -1709,9 +1700,7 @@ "version": "==1.10.15" }, "pyjwt": { - "extras": [ - "crypto" - ], + "extras": [], "hashes": [ "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" @@ -1733,7 +1722,6 @@ "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.5.0" }, "python-baseconv": { @@ -1835,15 +1823,14 @@ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==6.0.1" }, "redis": { "hashes": [ - "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91", - "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61" + "sha256:30b47d4ebb6b7a0b9b40c1275a19b87bb6f46b3bed82a89012cf56dea4024ada", + "sha256:3417688621acf6ee368dec4a04dd95881be24efd34c79f00d31f62bb528800ae" ], - "version": "==5.0.4" + "version": "==5.0.5" }, "referencing": { "hashes": [ @@ -1855,97 +1842,96 @@ }, "regex": { "hashes": [ - "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc", - "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5", - "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf", - "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94", - "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397", - "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82", - "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4", - "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae", - "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d", - "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db", - "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1", - "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b", - "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b", - "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666", - "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6", - "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c", - "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6", - "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c", - "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd", - "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636", - "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6", - "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962", - "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26", - "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e", - "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1", - "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b", - "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3", - "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a", - "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6", - "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257", - "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185", - "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e", - "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247", - "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31", - "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f", - "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec", - "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3", - "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b", - "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f", - "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150", - "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02", - "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17", - "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc", - "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4", - "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796", - "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f", - "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a", - "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d", - "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833", - "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f", - "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc", - "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d", - "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c", - "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10", - "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0", - "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb", - "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947", - "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae", - "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a", - "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f", - "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7", - "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925", - "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630", - "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61", - "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e", - "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58", - "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0", - "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8", - "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1", - "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1", - "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a", - "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662", - "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea", - "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1", - "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013", - "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90", - "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2", - "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e", - "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb" + "sha256:0721931ad5fe0dda45d07f9820b90b2148ccdd8e45bb9e9b42a146cb4f695649", + "sha256:10002e86e6068d9e1c91eae8295ef690f02f913c57db120b58fdd35a6bb1af35", + "sha256:10e4ce0dca9ae7a66e6089bb29355d4432caed736acae36fef0fdd7879f0b0cb", + "sha256:119af6e56dce35e8dfb5222573b50c89e5508d94d55713c75126b753f834de68", + "sha256:1337b7dbef9b2f71121cdbf1e97e40de33ff114801263b275aafd75303bd62b5", + "sha256:13cdaf31bed30a1e1c2453ef6015aa0983e1366fad2667657dbcac7b02f67133", + "sha256:1595f2d10dff3d805e054ebdc41c124753631b6a471b976963c7b28543cf13b0", + "sha256:16093f563098448ff6b1fa68170e4acbef94e6b6a4e25e10eae8598bb1694b5d", + "sha256:1878b8301ed011704aea4c806a3cadbd76f84dece1ec09cc9e4dc934cfa5d4da", + "sha256:19068a6a79cf99a19ccefa44610491e9ca02c2be3305c7760d3831d38a467a6f", + "sha256:19dfb1c504781a136a80ecd1fff9f16dddf5bb43cec6871778c8a907a085bb3d", + "sha256:1b5269484f6126eee5e687785e83c6b60aad7663dafe842b34691157e5083e53", + "sha256:1c1c174d6ec38d6c8a7504087358ce9213d4332f6293a94fbf5249992ba54efa", + "sha256:2431b9e263af1953c55abbd3e2efca67ca80a3de8a0437cb58e2421f8184717a", + "sha256:287eb7f54fc81546346207c533ad3c2c51a8d61075127d7f6d79aaf96cdee890", + "sha256:2b4c884767504c0e2401babe8b5b7aea9148680d2e157fa28f01529d1f7fcf67", + "sha256:35cb514e137cb3488bce23352af3e12fb0dbedd1ee6e60da053c69fb1b29cc6c", + "sha256:391d7f7f1e409d192dba8bcd42d3e4cf9e598f3979cdaed6ab11288da88cb9f2", + "sha256:3ad070b823ca5890cab606c940522d05d3d22395d432f4aaaf9d5b1653e47ced", + "sha256:3cd7874d57f13bf70078f1ff02b8b0aa48d5b9ed25fc48547516c6aba36f5741", + "sha256:3e507ff1e74373c4d3038195fdd2af30d297b4f0950eeda6f515ae3d84a1770f", + "sha256:455705d34b4154a80ead722f4f185b04c4237e8e8e33f265cd0798d0e44825fa", + "sha256:4a605586358893b483976cffc1723fb0f83e526e8f14c6e6614e75919d9862cf", + "sha256:4babf07ad476aaf7830d77000874d7611704a7fcf68c9c2ad151f5d94ae4bfc4", + "sha256:4eee78a04e6c67e8391edd4dad3279828dd66ac4b79570ec998e2155d2e59fd5", + "sha256:5397de3219a8b08ae9540c48f602996aa6b0b65d5a61683e233af8605c42b0f2", + "sha256:5b5467acbfc153847d5adb21e21e29847bcb5870e65c94c9206d20eb4e99a384", + "sha256:5eaa7ddaf517aa095fa8da0b5015c44d03da83f5bd49c87961e3c997daed0de7", + "sha256:632b01153e5248c134007209b5c6348a544ce96c46005d8456de1d552455b014", + "sha256:64c65783e96e563103d641760664125e91bd85d8e49566ee560ded4da0d3e704", + "sha256:64f18a9a3513a99c4bef0e3efd4c4a5b11228b48aa80743be822b71e132ae4f5", + "sha256:673b5a6da4557b975c6c90198588181029c60793835ce02f497ea817ff647cb2", + "sha256:68811ab14087b2f6e0fc0c2bae9ad689ea3584cad6917fc57be6a48bbd012c49", + "sha256:6e8d717bca3a6e2064fc3a08df5cbe366369f4b052dcd21b7416e6d71620dca1", + "sha256:71a455a3c584a88f654b64feccc1e25876066c4f5ef26cd6dd711308aa538694", + "sha256:72d7a99cd6b8f958e85fc6ca5b37c4303294954eac1376535b03c2a43eb72629", + "sha256:7b59138b219ffa8979013be7bc85bb60c6f7b7575df3d56dc1e403a438c7a3f6", + "sha256:7dbe2467273b875ea2de38ded4eba86cbcbc9a1a6d0aa11dcf7bd2e67859c435", + "sha256:833616ddc75ad595dee848ad984d067f2f31be645d603e4d158bba656bbf516c", + "sha256:87e2a9c29e672fc65523fb47a90d429b70ef72b901b4e4b1bd42387caf0d6835", + "sha256:8fe45aa3f4aa57faabbc9cb46a93363edd6197cbc43523daea044e9ff2fea83e", + "sha256:9e717956dcfd656f5055cc70996ee2cc82ac5149517fc8e1b60261b907740201", + "sha256:9efa1a32ad3a3ea112224897cdaeb6aa00381627f567179c0314f7b65d354c62", + "sha256:9ff11639a8d98969c863d4617595eb5425fd12f7c5ef6621a4b74b71ed8726d5", + "sha256:a094801d379ab20c2135529948cb84d417a2169b9bdceda2a36f5f10977ebc16", + "sha256:a0981022dccabca811e8171f913de05720590c915b033b7e601f35ce4ea7019f", + "sha256:a0bd000c6e266927cb7a1bc39d55be95c4b4f65c5be53e659537537e019232b1", + "sha256:a32b96f15c8ab2e7d27655969a23895eb799de3665fa94349f3b2fbfd547236f", + "sha256:a81e3cfbae20378d75185171587cbf756015ccb14840702944f014e0d93ea09f", + "sha256:ac394ff680fc46b97487941f5e6ae49a9f30ea41c6c6804832063f14b2a5a145", + "sha256:ada150c5adfa8fbcbf321c30c751dc67d2f12f15bd183ffe4ec7cde351d945b3", + "sha256:b2b6f1b3bb6f640c1a92be3bbfbcb18657b125b99ecf141fb3310b5282c7d4ed", + "sha256:b802512f3e1f480f41ab5f2cfc0e2f761f08a1f41092d6718868082fc0d27143", + "sha256:ba68168daedb2c0bab7fd7e00ced5ba90aebf91024dea3c88ad5063c2a562cca", + "sha256:bfc4f82cabe54f1e7f206fd3d30fda143f84a63fe7d64a81558d6e5f2e5aaba9", + "sha256:c0c18345010870e58238790a6779a1219b4d97bd2e77e1140e8ee5d14df071aa", + "sha256:c3bea0ba8b73b71b37ac833a7f3fd53825924165da6a924aec78c13032f20850", + "sha256:c486b4106066d502495b3025a0a7251bf37ea9540433940a23419461ab9f2a80", + "sha256:c49e15eac7c149f3670b3e27f1f28a2c1ddeccd3a2812cba953e01be2ab9b5fe", + "sha256:c6a2b494a76983df8e3d3feea9b9ffdd558b247e60b92f877f93a1ff43d26656", + "sha256:cab12877a9bdafde5500206d1020a584355a97884dfd388af3699e9137bf7388", + "sha256:cac27dcaa821ca271855a32188aa61d12decb6fe45ffe3e722401fe61e323cd1", + "sha256:cdd09d47c0b2efee9378679f8510ee6955d329424c659ab3c5e3a6edea696294", + "sha256:cf2430df4148b08fb4324b848672514b1385ae3807651f3567871f130a728cc3", + "sha256:d0a3d8d6acf0c78a1fff0e210d224b821081330b8524e3e2bc5a68ef6ab5803d", + "sha256:d0c0c0003c10f54a591d220997dd27d953cd9ccc1a7294b40a4be5312be8797b", + "sha256:d1f059a4d795e646e1c37665b9d06062c62d0e8cc3c511fe01315973a6542e40", + "sha256:d347a741ea871c2e278fde6c48f85136c96b8659b632fb57a7d1ce1872547600", + "sha256:d3ee02d9e5f482cc8309134a91eeaacbdd2261ba111b0fef3748eeb4913e6a2c", + "sha256:d99ceffa25ac45d150e30bd9ed14ec6039f2aad0ffa6bb87a5936f5782fc1569", + "sha256:e38a7d4e8f633a33b4c7350fbd8bad3b70bf81439ac67ac38916c4a86b465456", + "sha256:e4682f5ba31f475d58884045c1a97a860a007d44938c4c0895f41d64481edbc9", + "sha256:e5bb9425fe881d578aeca0b2b4b3d314ec88738706f66f219c194d67179337cb", + "sha256:e64198f6b856d48192bf921421fdd8ad8eb35e179086e99e99f711957ffedd6e", + "sha256:e6662686aeb633ad65be2a42b4cb00178b3fbf7b91878f9446075c404ada552f", + "sha256:ec54d5afa89c19c6dd8541a133be51ee1017a38b412b1321ccb8d6ddbeb4cf7d", + "sha256:f5b1dff3ad008dccf18e652283f5e5339d70bf8ba7c98bf848ac33db10f7bc7a", + "sha256:f8ec0c2fea1e886a19c3bee0cd19d862b3aa75dcdfb42ebe8ed30708df64687a", + "sha256:f9ebd0a36102fcad2f03696e8af4ae682793a5d30b46c647eaf280d6cfb32796" ], "markers": "python_version >= '3.8'", - "version": "==2024.4.28" + "version": "==2024.5.15" }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.31.0" + "version": "==2.32.3" }, "requests-oauthlib": { "hashes": [ @@ -1961,7 +1947,6 @@ "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.0.0" }, "rfc3987": { @@ -2105,7 +2090,6 @@ "sha256:f657d1710204f4c2037922070d55ef69c2b0165898a38d53033953ff0f5a67c9" ], "index": "pypi", - "markers": "python_version < '4.0' and python_full_version >= '3.7.2'", "version": "==2.2.0" }, "six": { @@ -2130,7 +2114,6 @@ "sha256:7519f186c63c50f2d364457b236f051338d194bcface55e318a6a705c5213477" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==5.4.1" }, "social-auth-core": { @@ -2151,12 +2134,19 @@ }, "structlog": { "hashes": [ - "sha256:3f6efe7d25fab6e86f277713c218044669906537bb717c1807a09d46bca0714d", - "sha256:41a09886e4d55df25bdcb9b5c9674bccfab723ff43e0a86a1b7b236be8e57b16" + "sha256:0e3fe74924a6d8857d3f612739efb94c72a7417d7c7c008d12276bca3b5bf13b", + "sha256:983bd49f70725c5e1e3867096c0c09665918936b3db27341b41d294283d7a48a" ], "index": "pypi", + "version": "==24.2.0" + }, + "tablib": { + "hashes": [ + "sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9", + "sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33" + ], "markers": "python_version >= '3.8'", - "version": "==24.1.0" + "version": "==3.5.0" }, "toolz": { "hashes": [ @@ -2172,16 +2162,15 @@ "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.66.4" }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.2" }, "typing-validation": { "hashes": [ @@ -2205,7 +2194,6 @@ "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==4.1.1" }, "urllib3": { @@ -2222,17 +2210,15 @@ "sha256:9dcc98ad92b642c57494bed9370c4f93479d2d36223b2c3702823f0aa8b1a9a3" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.2.0" }, "uvicorn": { "hashes": [ - "sha256:2c2aac7ff4f4365c206fd773a39bf4ebd1047c238f8b8268ad996829323473de", - "sha256:6a69214c0b6a087462412670b3ef21224fa48cae0e452b5883e8e8bdfdd11dd0" + "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81", + "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.29.0" + "version": "==0.30.1" }, "varint": { "hashes": [ @@ -2257,12 +2243,11 @@ }, "web3": { "hashes": [ - "sha256:2e626a4bf151171f5dc8ad7f30c373f0416dc2aca9d8d102a63578a2413efa26", - "sha256:86484a3d390a0a024002d1c1b79af27034488c470ea07693ff0f5bf109d3540b" + "sha256:d27fbd4ac5aa70d0e0c516bd3e3b802fbe74bc159b407c34052d9301b400f757", + "sha256:fb39683d6aa7586ce0ab0be4be392f8acb62c2503958079d61b59f2a0b883718" ], "index": "pypi", - "markers": "python_full_version >= '3.7.2'", - "version": "==6.18.0" + "version": "==6.19.0" }, "websockets": { "hashes": [ @@ -2348,7 +2333,6 @@ "sha256:b1f9db9bf67dc183484d760b99f4080185633136a273a03f6436034a41064146" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.6.0" }, "yarl": { @@ -2459,11 +2443,11 @@ }, "astroid": { "hashes": [ - "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819", - "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4" + "sha256:8ead48e31b92b2e217b6c9733a21afafe479d52d6e164dd25fb1a770c7c3cf94", + "sha256:e8a0083b4bb28fcffb6207a3bfc9e5d0a68be951dd7e336d5dcf639c682388c0" ], "markers": "python_full_version >= '3.8.0'", - "version": "==3.1.0" + "version": "==3.2.2" }, "black": { "hashes": [ @@ -2491,7 +2475,6 @@ "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.4.2" }, "cfgv": { @@ -2512,62 +2495,61 @@ }, "coverage": { "hashes": [ - "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de", - "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661", - "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26", - "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41", - "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d", - "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981", - "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2", - "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34", - "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f", - "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a", - "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35", - "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223", - "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1", - "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746", - "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90", - "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c", - "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca", - "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8", - "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596", - "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e", - "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd", - "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e", - "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3", - "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e", - "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312", - "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7", - "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572", - "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428", - "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f", - "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07", - "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e", - "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4", - "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136", - "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5", - "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8", - "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d", - "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228", - "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206", - "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa", - "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e", - "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be", - "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5", - "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668", - "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601", - "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057", - "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146", - "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f", - "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8", - "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7", - "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987", - "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19", - "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece" + "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523", + "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f", + "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d", + "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb", + "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0", + "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c", + "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98", + "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83", + "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8", + "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7", + "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac", + "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84", + "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb", + "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3", + "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884", + "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614", + "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd", + "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807", + "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd", + "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8", + "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc", + "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db", + "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0", + "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08", + "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232", + "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d", + "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a", + "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1", + "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286", + "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303", + "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341", + "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84", + "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45", + "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc", + "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec", + "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd", + "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155", + "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52", + "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d", + "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485", + "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31", + "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d", + "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d", + "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d", + "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85", + "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce", + "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb", + "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974", + "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24", + "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56", + "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9", + "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==7.5.1" + "version": "==7.5.3" }, "dill": { "hashes": [ @@ -2590,25 +2572,23 @@ "sha256:a64d2487cdb00ad7461434320ccc38e60af9c404773a2f95ab0093b4453a3215" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.2.6" }, "django-stubs": { "hashes": [ - "sha256:084484cbe16a6d388e80ec687e46f529d67a232f3befaf55c936b3b476be289d", - "sha256:b8a792bee526d6cab31e197cb414ee7fa218abd931a50948c66a80b3a2548621" + "sha256:236bc5606e5607cb968f92b648471f9edaa461a774bc013bf9e6bff8730f6bdf", + "sha256:cb0c506cb5c54c64612e4a2ee8d6b913c6178560ec168009fe847c09747c304b" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==5.0.0" + "version": "==5.0.2" }, "django-stubs-ext": { "hashes": [ - "sha256:5bacfbb498a206d5938454222b843d81da79ea8b6fcd1a59003f529e775bc115", - "sha256:8e1334fdf0c8bff87e25d593b33d4247487338aaed943037826244ff788b56a8" + "sha256:409c62585d7f996cef5c760e6e27ea3ff29f961c943747e67519c837422cad32", + "sha256:8d8efec5a86241266bec94a528fe21258ad90d78c67307f3ae5f36e81de97f12" ], "markers": "python_version >= '3.8'", - "version": "==5.0.0" + "version": "==5.0.2" }, "filelock": { "hashes": [ @@ -2644,11 +2624,11 @@ }, "mako": { "hashes": [ - "sha256:5324b88089a8978bf76d1629774fcc2f1c07b82acdf00f4c5dd8ceadfffc4b40", - "sha256:e16c01d9ab9c11f7290eef1cfefc093fb5a45ee4a3da09e2fec2e4d1bae54e73" + "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a", + "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc" ], "markers": "python_version >= '3.8'", - "version": "==1.3.3" + "version": "==1.3.5" }, "markupsafe": { "hashes": [ @@ -2734,11 +2714,11 @@ }, "nodeenv": { "hashes": [ - "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", - "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" + "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", + "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.8.0" + "version": "==1.9.1" }, "numpy": { "hashes": [ @@ -2784,11 +2764,11 @@ }, "packaging": { "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" ], - "markers": "python_version >= '3.7'", - "version": "==24.0" + "markers": "python_version >= '3.8'", + "version": "==24.1" }, "pandas": { "hashes": [ @@ -2823,7 +2803,6 @@ "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==2.2.2" }, "parse": { @@ -2851,11 +2830,11 @@ }, "platformdirs": { "hashes": [ - "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", - "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.2.1" + "version": "==4.2.2" }, "pluggy": { "hashes": [ @@ -2867,21 +2846,19 @@ }, "pre-commit": { "hashes": [ - "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab", - "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060" + "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", + "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.7.0" + "version": "==3.7.1" }, "pylint": { "hashes": [ - "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74", - "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23" + "sha256:02f6c562b215582386068d52a30f520d84fdbcf2a95fc7e855b816060d048b60", + "sha256:b3d7d2708a3e04b4679e02d99e72329a8b7ee8afb8d04110682278781f889fa8" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", - "version": "==3.1.0" + "version": "==3.2.3" }, "pylint-django": { "hashes": [ @@ -2889,7 +2866,6 @@ "sha256:5abd5c2228e0e5e2a4cb6d0b4fc1d1cef1e773d0be911412f4dd4fc1a1a440b7" ], "index": "pypi", - "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==2.5.5" }, "pylint-plugin-utils": { @@ -2902,20 +2878,19 @@ }, "pytest": { "hashes": [ - "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233", - "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f" + "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" ], "markers": "python_version >= '3.8'", - "version": "==8.2.0" + "version": "==8.2.2" }, "pytest-bdd": { "hashes": [ - "sha256:b992536360f49441ac25b687f092d02815582b60b2acb3f62fce16b7b6e7273d", - "sha256:fceca364711d91c195815f507b0ea8f28660203e40a0ead94751c57d04114c33" + "sha256:96e9dc5437100fe627596e366dbe60e02f105974134e9aee8fe83ed67c2404d6", + "sha256:c89996dc18b72033c471c40ef1281a0f77f5a7419bc53720c52e70c68c886e64" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==7.1.2" + "version": "==7.2.0" }, "pytest-django": { "hashes": [ @@ -2923,7 +2898,6 @@ "sha256:ca1ddd1e0e4c227cf9e3e40a6afc6d106b3e70868fd2ac5798a22501271cd0c7" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.8.0" }, "pytest-mock": { @@ -2932,7 +2906,6 @@ "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.14.0" }, "python-dateutil": { @@ -3005,17 +2978,8 @@ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==6.0.1" }, - "setuptools": { - "hashes": [ - "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", - "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" - ], - "markers": "python_version >= '3.8'", - "version": "==69.5.1" - }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", @@ -3034,11 +2998,11 @@ }, "tomlkit": { "hashes": [ - "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b", - "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3" + "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f", + "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c" ], "markers": "python_version >= '3.7'", - "version": "==0.12.4" + "version": "==0.12.5" }, "types-pyyaml": { "hashes": [ @@ -3050,11 +3014,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.2" }, "tzdata": { "hashes": [ @@ -3066,11 +3030,11 @@ }, "virtualenv": { "hashes": [ - "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b", - "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75" + "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c", + "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b" ], "markers": "python_version >= '3.7'", - "version": "==20.26.1" + "version": "==20.26.2" } } } diff --git a/api/registry/admin.py b/api/registry/admin.py index 385a91ddf..7ac7639bc 100644 --- a/api/registry/admin.py +++ b/api/registry/admin.py @@ -2,8 +2,19 @@ from django.contrib import admin, messages from registry.api.schema import SubmitPassportPayload from registry.api.v1 import ahandle_submit_passport -from registry.models import Event, GTCStakeEvent, HashScorerLink, Passport, Score, Stamp +from registry.models import ( + Event, + GTCStakeEvent, + HashScorerLink, + Passport, + Score, + Stamp, + AddressListMember, + AddressList, +) from scorer.scorer_admin import ScorerModelAdmin +from import_export.admin import ImportMixin, ImportForm +from django import forms @admin.action( @@ -24,7 +35,7 @@ def recalculate_user_score(modeladmin, request, queryset): ) async_to_sync(ahandle_submit_passport)(sp, c.account) rescored_ids.append(score.id) - except Exception as e: + except Exception: print(f"Error for {scorer_id} and {address}") failed_rescoring.append(score.id) @@ -141,3 +152,42 @@ class GTCStakeEventAdmin(ScorerModelAdmin): "staker", "event_type", ] + + +class AddressListMemberInline(admin.TabularInline): + model = AddressListMember + extra = 0 + + +class AddressListImportForm(ImportForm): + list = forms.ModelChoiceField(queryset=AddressList.objects.all(), required=True) + + +@admin.register(AddressListMember) +class AddressListMemberAdmin(ImportMixin, admin.ModelAdmin): + import_form_class = AddressListImportForm + + def get_import_data_kwargs(self, **kwargs): + """ + Prepare kwargs for import_data. + """ + print(kwargs, "gidk - KWARGS!!!!!!") + form = kwargs.get("form", None) + if form and hasattr(form, "cleaned_data"): + print(form.cleaned_data, "gidk - FORM.CLEANED_DATA!!!!!!") + kwargs.update({"list_id": form.cleaned_data.get("list", None)}) + return kwargs + + def after_init_instance(self, instance, new, row, **kwargs): + print(kwargs, "KWARGS!!!!!!") + if "list_id" in kwargs: + instance.list_id = kwargs["list_id"] + + +@admin.register(AddressList) +class AddressListAdmin(ScorerModelAdmin): + list_display = ["name", "address_count"] + inlines = [AddressListMemberInline] + + def address_count(self, obj): + return obj.addresses.count() diff --git a/api/registry/migrations/0033_addresslist_addresslistmember.py b/api/registry/migrations/0033_addresslist_addresslistmember.py new file mode 100644 index 000000000..0918a23c6 --- /dev/null +++ b/api/registry/migrations/0033_addresslist_addresslistmember.py @@ -0,0 +1,58 @@ +# Generated by Django 4.2.6 on 2024-06-10 22:21 + +import account.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("registry", "0032_delete_stake_delete_stakeevent"), + ] + + operations = [ + migrations.CreateModel( + name="AddressList", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(db_index=True, max_length=100)), + ], + ), + migrations.CreateModel( + name="AddressListMember", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "address", + account.models.EthAddressField(db_index=True, max_length=100), + ), + ( + "list", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="addresses", + to="registry.addresslist", + ), + ), + ], + options={ + "unique_together": {("address", "list")}, + }, + ), + ] diff --git a/api/registry/models.py b/api/registry/models.py index cd1636016..a3e81e2d6 100644 --- a/api/registry/models.py +++ b/api/registry/models.py @@ -1,5 +1,3 @@ -import json - from account.models import Community, EthAddressField from django.db import models from django.db.models.signals import pre_save @@ -89,7 +87,7 @@ def score_updated(sender, instance, **kwargs): address=instance.passport.address, community=instance.passport.community, data={ - "score": float(instance.score) if instance.score != None else 0, + "score": float(instance.score) if instance.score is not None else 0, "evidence": instance.evidence, }, ) @@ -192,3 +190,21 @@ class Meta: name="gtc_staking_index_by_staker", ), ] + + +class AddressList(models.Model): + name = models.CharField(max_length=100, db_index=True, unique=True) + + +class AddressListMember(models.Model): + address = EthAddressField(null=False, blank=False, max_length=100, db_index=True) + list = models.ForeignKey( + AddressList, + related_name="addresses", + on_delete=models.CASCADE, + null=False, + db_index=True, + ) + + class Meta: + unique_together = ["address", "list"] diff --git a/api/scorer/settings/base.py b/api/scorer/settings/base.py index f395204ba..9fe26ef41 100644 --- a/api/scorer/settings/base.py +++ b/api/scorer/settings/base.py @@ -78,6 +78,7 @@ "django.contrib.staticfiles", "django_extensions", "rest_framework_api_key", + "import_export", "registry", "scorer_apu", "scorer_weighted", @@ -448,3 +449,5 @@ "127.0.0.1", # ... ] + +IMPORT_EXPORT_SKIP_ADMIN_CONFIRM = True From c797741d5a9a0009c75d74839c4602385a5fddc8 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Tue, 11 Jun 2024 14:29:33 -0600 Subject: [PATCH 2/5] manual csv import --- api/registry/admin.py | 47 +++++++++++++++++++ .../address_list_csv_import_form.html | 14 ++++++ .../registry/addresslist_changelist.html | 11 +++++ 3 files changed, 72 insertions(+) create mode 100644 api/registry/templates/registry/address_list_csv_import_form.html create mode 100644 api/registry/templates/registry/addresslist_changelist.html diff --git a/api/registry/admin.py b/api/registry/admin.py index 7ac7639bc..1867c8868 100644 --- a/api/registry/admin.py +++ b/api/registry/admin.py @@ -1,5 +1,6 @@ from asgiref.sync import async_to_sync from django.contrib import admin, messages +from import_export.forms import ModelResource from registry.api.schema import SubmitPassportPayload from registry.api.v1 import ahandle_submit_passport from registry.models import ( @@ -15,6 +16,10 @@ from scorer.scorer_admin import ScorerModelAdmin from import_export.admin import ImportMixin, ImportForm from django import forms +from django.urls import path +from django.shortcuts import render, redirect +import csv +import codecs @admin.action( @@ -163,10 +168,31 @@ class AddressListImportForm(ImportForm): list = forms.ModelChoiceField(queryset=AddressList.objects.all(), required=True) +class AddressListMemberResource(ModelResource): + def __init__(self, **kwargs): + super().__init__() + print(kwargs, "ALMR init - KWARGS!!!!!!") + self.list_id = kwargs.get("list_id") + + class Meta: + model = AddressListMember + + +class AddressListCsvImportForm(forms.Form): + csv_file = forms.FileField() + list = forms.ModelChoiceField(queryset=AddressList.objects.all(), required=True) + + @admin.register(AddressListMember) class AddressListMemberAdmin(ImportMixin, admin.ModelAdmin): import_form_class = AddressListImportForm + def get_import_resource_kwargs(self, request, *args, **kwargs): + kwargs = super().get_resource_kwargs(request, *args, **kwargs) + print(kwargs, "girk - KWARGS!!!!!!") + # kwargs.update({"user": request.user}) + return kwargs + def get_import_data_kwargs(self, **kwargs): """ Prepare kwargs for import_data. @@ -188,6 +214,27 @@ def after_init_instance(self, instance, new, row, **kwargs): class AddressListAdmin(ScorerModelAdmin): list_display = ["name", "address_count"] inlines = [AddressListMemberInline] + change_list_template = "registry/addresslist_changelist.html" def address_count(self, obj): return obj.addresses.count() + + def get_urls(self): + return [ + path("import-csv/", self.import_csv), + ] + super().get_urls() + + def import_csv(self, request): + if request.method == "POST": + csv_file = request.FILES["csv_file"] + reader = csv.reader(codecs.iterdecode(csv_file, "utf-8")) + list_id = request.POST.get("list") + address_list = AddressList.objects.get(id=list_id) + for row in reader: + address = row[0].strip() + AddressListMember.objects.create(address=address, list=address_list) + self.message_user(request, "Your csv file has been imported") + return redirect("..") + form = AddressListCsvImportForm() + payload = {"form": form} + return render(request, "registry/address_list_csv_import_form.html", payload) diff --git a/api/registry/templates/registry/address_list_csv_import_form.html b/api/registry/templates/registry/address_list_csv_import_form.html new file mode 100644 index 000000000..b01f06f8c --- /dev/null +++ b/api/registry/templates/registry/address_list_csv_import_form.html @@ -0,0 +1,14 @@ +{% extends 'admin/base.html' %} + +{% block content %} +
+
+ {{ form.as_p }} + {% csrf_token %} + + +
+
+
+ +{% endblock %} diff --git a/api/registry/templates/registry/addresslist_changelist.html b/api/registry/templates/registry/addresslist_changelist.html new file mode 100644 index 000000000..fae6b4562 --- /dev/null +++ b/api/registry/templates/registry/addresslist_changelist.html @@ -0,0 +1,11 @@ +{% extends 'admin/change_list.html' %} + +{% block object-tools %} + + Import CSV 📁 + +
+
+{{ block.super }} +{% endblock %} From 7c02264f818f332b3ffe92c0546cb93c73378962 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Tue, 11 Jun 2024 16:58:24 -0600 Subject: [PATCH 3/5] feat(api): working csv import, moved to account --- api/Pipfile | 1 - api/Pipfile.lock | 122 +++++++----------- api/account/admin.py | 74 ++++++++++- .../0025_addresslist_addresslistmember.py} | 8 +- .../0026_alter_customization_scorer.py | 20 +++ api/account/migrations/0027_allowlist.py | 44 +++++++ api/account/models.py | 35 ++++- .../address_list_csv_import_form.html | 0 .../account}/addresslist_changelist.html | 0 api/registry/admin.py | 90 ------------- api/registry/models.py | 18 --- api/scorer/settings/base.py | 1 - 12 files changed, 222 insertions(+), 191 deletions(-) rename api/{registry/migrations/0033_addresslist_addresslistmember.py => account/migrations/0025_addresslist_addresslistmember.py} (89%) create mode 100644 api/account/migrations/0026_alter_customization_scorer.py create mode 100644 api/account/migrations/0027_allowlist.py rename api/{registry/templates/registry => account/templates/account}/address_list_csv_import_form.html (100%) rename api/{registry/templates/registry => account/templates/account}/addresslist_changelist.html (100%) diff --git a/api/Pipfile b/api/Pipfile index 6f2009566..f768bea27 100644 --- a/api/Pipfile +++ b/api/Pipfile @@ -45,7 +45,6 @@ python-jose = "*" uvarint = "*" django-ace = "*" async-timeout = "*" -django-import-export = "*" [dev-packages] black = "*" diff --git a/api/Pipfile.lock b/api/Pipfile.lock index 1deba6cc0..961416624 100644 --- a/api/Pipfile.lock +++ b/api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d84ad4d76e8559e781c04a66fa4e38a2353a5e7a7e54d09964720fcaf4b180f6" + "sha256": "282c4645611891ba434e5e861e53d8fc9f45fb155188c56766335dfe266d02fa" }, "pipfile-spec": 6, "requires": { @@ -315,19 +315,19 @@ }, "boto3": { "hashes": [ - "sha256:42b140fc850cf261ee4b1e8ef527fa071b1f1592a6d6a68d34b29f37cc46b4dd", - "sha256:56bec52d485d5670ce96d53ae7b2cd4ae4e8a705fb2298a21093cdd77d642331" + "sha256:549d9735bbb7cf8e1a2f4b3b676be32946717c59f33c47234586835dc904d04e", + "sha256:a91ee58fa54b170f17b2e144f038e155f92cf515f1c073ac2595e9ee45f125a8" ], "index": "pypi", - "version": "==1.34.123" + "version": "==1.34.124" }, "botocore": { "hashes": [ - "sha256:8c34ada2a708c82e7174bff700611643db7ce2cb18f1130c35045c24310d299d", - "sha256:a8577f6574600c4d159b5cd103ee05744a443d77f7778304e17307940b369c4f" + "sha256:3f0bf79c17d656acdfdb53581224f6a38867ff2829f7428c586198f67a90ea26", + "sha256:fede092c7f8f414f78f3e7991e47cb0cf2279d90c027606ad7cba79fa370b827" ], "markers": "python_version >= '3.8'", - "version": "==1.34.123" + "version": "==1.34.124" }, "celery": { "extras": [ @@ -749,14 +749,6 @@ "index": "pypi", "version": "==0.3.2" }, - "diff-match-patch": { - "hashes": [ - "sha256:953019cdb9c9d2c9e47b5b12bcff3cf4746fc4598eb406076fa1fc27e6a1f15c", - "sha256:dce43505fb7b1b317de7195579388df0746d90db07015ed47a85e5e44930ef93" - ], - "markers": "python_version >= '3.7'", - "version": "==20230430" - }, "django": { "hashes": [ "sha256:08f41f468b63335aea0d904c5729e0250300f6a1907bf293a65499496cdbc68f", @@ -813,14 +805,6 @@ "index": "pypi", "version": "==24.2" }, - "django-import-export": { - "hashes": [ - "sha256:173d165b85774a3f8327b58af89ed2d6d95547f668dba39b8c9eceb8870d32a4", - "sha256:63f0c8add728aafc82bcb7c53ec9f66528a9556c4786ef28f5f8b8eb662a7021" - ], - "index": "pypi", - "version": "==4.0.7" - }, "django-ipware": { "hashes": [ "sha256:d9ec43d2bf7cdf216fed8d494a084deb5761a54860a53b2e74346a4f384cff47", @@ -1657,50 +1641,48 @@ "version": "==3.20.0" }, "pydantic": { - "extras": [], - "hashes": [ - "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de", - "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986", - "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55", - "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4", - "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58", - "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3", - "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12", - "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d", - "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7", - "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53", - "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb", - "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51", - "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948", - "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022", - "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed", - "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383", - "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4", - "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b", - "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2", - "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528", - "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf", - "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8", - "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc", - "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f", - "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0", - "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7", - "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c", - "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44", - "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654", - "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0", - "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb", - "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00", - "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1", - "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c", - "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22", - "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0" + "hashes": [ + "sha256:067c2b5539f7839653ad8c3d1fc2f1343338da8677b7b2172abf3cd3fdc8f719", + "sha256:16cf23ed599ca5ca937e37ba50ab114e6b5c387eb43a6cc533701605ad1be611", + "sha256:18548b30ccebe71d380b0886cc44ea5d80afbcc155e3518792f13677ad06097d", + "sha256:1a539ac40551b01a85e899829aa43ca8036707474af8d74b48be288d4d2d2846", + "sha256:22dd265c77c3976a34be78409b128cb84629284dfd1b69d2fa1507a36f84dc8b", + "sha256:3895ddb26f22bdddee7e49741486aa7b389258c6f6771943e87fc00eabd79134", + "sha256:4660dd697de1ae2d4305a85161312611f64d5360663a9ba026cd6ad9e3fe14c3", + "sha256:4b7b99424cc0970ff08deccb549b5a6ec1040c0b449eab91723e64df2bd8fdca", + "sha256:4d1fc943583c046ecad0ff5d6281ee571b64e11b5503d9595febdce54f38b290", + "sha256:4e92292f9580fc5ea517618580fac24e9f6dc5657196e977c194a8e50e14f5a9", + "sha256:4fa86469fd46e732242c7acb83282d33f83591a7e06f840481327d5bf6d96112", + "sha256:55b945da2756b5cef93d792521ad0d457fdf2f69fd5a2d10a27513f5281717dd", + "sha256:5973843f1fa99ec6c3ac8d1a8698ac9340b35e45cca6c3e5beb5c3bd1ef15de6", + "sha256:5da8bc4bb4f85b8c97cc7f11141fddbbd29eb25e843672e5807e19cc3d7c1b7f", + "sha256:5f039881fb2ef86f6de6eacce6e71701b47500355738367413ccc1550b2a69cf", + "sha256:78e59fa919fa7a192f423d190d8660c35dd444efa9216662273f36826765424b", + "sha256:89c2783dc261726fe7a5ce1121bce29a2f7eb9b1e704c68df2b117604e3b346f", + "sha256:8a4fcc7b0b8038dbda2dda642cff024032dfae24a7960cc58e57a39eb1949b9b", + "sha256:8abaecf54dacc9d991dda93c3b880d41092a8924cde94eeb811d7d9ab55df7d8", + "sha256:8bb388f6244809af69ee384900b10b677a69f1980fdc655ea419710cffcb5610", + "sha256:8d23111f41d1e19334edd51438fd57933f3eee7d9d2fa8cc3f5eda515a272055", + "sha256:900a787c574f903a97d0bf52a43ff3b6cf4fa0119674bcfc0e5fd1056d388ad9", + "sha256:9d91f6866fd3e303c632207813ef6bc4d86055e21c5e5a0a311983a9ac5f0192", + "sha256:a04ee1ea34172b87707a6ecfcdb120d7656892206b7c4dbdb771a73e90179fcb", + "sha256:aa2774ba5412fd1c5cb890d08e8b0a3bb5765898913ba1f61a65a4810f03cf29", + "sha256:b73e6386b439b4881d79244e9fc1e32d1e31e8d784673f5d58a000550c94a6c0", + "sha256:b7e82a80068c77f4b074032e031e642530b6d45cb8121fc7c99faa31fb6c6b72", + "sha256:b9ded699bfd3b3912d796ff388b0c607e6d35d41053d37aaf8fd6082c660de9a", + "sha256:c6b8a7788a8528a558828fe4a48783cafdcf2612d13c491594a8161dc721629c", + "sha256:d30192a63e6d3334c3f0c0506dd6ae9f1dce7b2f8845518915291393a5707a22", + "sha256:d82d5956cee27a30e26a5b88d00a6a2a15a4855e13c9baf50175976de0dc282c", + "sha256:d8d3c71d14c8bd26d2350c081908dbf59d5a6a8f9596d9ef2b09cc1e61c8662b", + "sha256:d97a35e1ba59442775201657171f601a2879e63517a55862a51f8d67cdfc0017", + "sha256:daeb199814333e4426c5e86d7fb610f4e230289f28cab90eb4de27330bef93cf", + "sha256:ddc7b682fbd23f051edc419dc6977e11dd2dbdd0cef9d05f0e15d1387862d230", + "sha256:ef287b8d7fc0e86a8bd1f902c61aff6ba9479c50563242fe88ba39692e98e1e0" ], "markers": "python_version >= '3.7'", - "version": "==1.10.15" + "version": "==1.10.16" }, "pyjwt": { - "extras": [], "hashes": [ "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" @@ -2140,14 +2122,6 @@ "index": "pypi", "version": "==24.2.0" }, - "tablib": { - "hashes": [ - "sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9", - "sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33" - ], - "markers": "python_version >= '3.8'", - "version": "==3.5.0" - }, "toolz": { "hashes": [ "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", @@ -2807,10 +2781,10 @@ }, "parse": { "hashes": [ - "sha256:09002ca350ad42e76629995f71f7b518670bcf93548bdde3684fd55d2be51975", - "sha256:76ddd5214255ae711db4c512be636151fbabaa948c6f30115aecc440422ca82c" + "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558", + "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce" ], - "version": "==1.20.1" + "version": "==1.20.2" }, "parse-type": { "hashes": [ diff --git a/api/account/admin.py b/api/account/admin.py index d01a47aa7..6b9996f0b 100644 --- a/api/account/admin.py +++ b/api/account/admin.py @@ -9,8 +9,20 @@ from rest_framework_api_key.admin import APIKeyAdmin from scorer.scorer_admin import ScorerModelAdmin from scorer_weighted.models import Scorer - -from .models import Account, AccountAPIKey, Community, Customization +from django.urls import path +from django.shortcuts import render, redirect +import csv +import codecs + +from .models import ( + Account, + AccountAPIKey, + AllowList, + Community, + Customization, + AddressList, + AddressListMember, +) @admin.register(Account) @@ -193,10 +205,16 @@ class Meta: fields = "__all__" +class AllowListInline(admin.TabularInline): + model = AllowList + extra = 0 + + @admin.register(Customization) class CustomizationAdmin(ScorerModelAdmin): form = CustomizationForm raw_id_fields = ["scorer"] + inlines = [AllowListInline] fieldsets = [ ( None, @@ -254,3 +272,55 @@ def save_model(self, request, obj, form, change): # Perform some validation... pass super().save_model(request, obj, form, change) + + +class AddressListMemberInline(admin.TabularInline): + model = AddressListMember + extra = 0 + + +class AddressListCsvImportForm(forms.Form): + list = forms.ModelChoiceField(queryset=AddressList.objects.all(), required=True) + csv_file = forms.FileField() + + +@admin.register(AddressList) +class AddressListAdmin(ScorerModelAdmin): + list_display = ["name", "address_count"] + inlines = [AddressListMemberInline] + change_list_template = "account/addresslist_changelist.html" + + def address_count(self, obj): + return obj.addresses.count() + + def get_urls(self): + return [ + path("import-csv/", self.import_csv), + ] + super().get_urls() + + def import_csv(self, request): + if request.method == "POST": + csv_file = request.FILES["csv_file"] + reader = csv.reader(codecs.iterdecode(csv_file, "utf-8")) + list_id = request.POST.get("list") + address_list = AddressList.objects.get(id=list_id) + duplicate_count = 0 + success_count = 0 + for row in reader: + address = row[0].strip() + try: + AddressListMember.objects.create(address=address, list=address_list) + success_count += 1 + except Exception: + duplicate_count += 1 + continue + + self.message_user( + request, + "Imported %d addresses, skipped %d duplicates" + % (success_count, duplicate_count), + ) + return redirect("..") + form = AddressListCsvImportForm() + payload = {"form": form} + return render(request, "account/address_list_csv_import_form.html", payload) diff --git a/api/registry/migrations/0033_addresslist_addresslistmember.py b/api/account/migrations/0025_addresslist_addresslistmember.py similarity index 89% rename from api/registry/migrations/0033_addresslist_addresslistmember.py rename to api/account/migrations/0025_addresslist_addresslistmember.py index 0918a23c6..3607b2f56 100644 --- a/api/registry/migrations/0033_addresslist_addresslistmember.py +++ b/api/account/migrations/0025_addresslist_addresslistmember.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.6 on 2024-06-10 22:21 +# Generated by Django 4.2.6 on 2024-06-11 22:12 import account.models from django.db import migrations, models @@ -7,7 +7,7 @@ class Migration(migrations.Migration): dependencies = [ - ("registry", "0032_delete_stake_delete_stakeevent"), + ("account", "0024_customization_scorer_panel_text"), ] operations = [ @@ -23,7 +23,7 @@ class Migration(migrations.Migration): verbose_name="ID", ), ), - ("name", models.CharField(db_index=True, max_length=100)), + ("name", models.CharField(db_index=True, max_length=100, unique=True)), ], ), migrations.CreateModel( @@ -47,7 +47,7 @@ class Migration(migrations.Migration): models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="addresses", - to="registry.addresslist", + to="account.addresslist", ), ), ], diff --git a/api/account/migrations/0026_alter_customization_scorer.py b/api/account/migrations/0026_alter_customization_scorer.py new file mode 100644 index 000000000..2451f8e02 --- /dev/null +++ b/api/account/migrations/0026_alter_customization_scorer.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.6 on 2024-06-11 22:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("account", "0025_addresslist_addresslistmember"), + ] + + operations = [ + migrations.AlterField( + model_name="customization", + name="scorer", + field=models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, to="account.community" + ), + ), + ] diff --git a/api/account/migrations/0027_allowlist.py b/api/account/migrations/0027_allowlist.py new file mode 100644 index 000000000..e35bdb389 --- /dev/null +++ b/api/account/migrations/0027_allowlist.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2.6 on 2024-06-11 22:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("account", "0026_alter_customization_scorer"), + ] + + operations = [ + migrations.CreateModel( + name="AllowList", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("weight", models.FloatField(default=0.0)), + ( + "address_list", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="allow_lists", + to="account.addresslist", + ), + ), + ( + "customization", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="allow_lists", + to="account.customization", + ), + ), + ], + ), + ] diff --git a/api/account/models.py b/api/account/models.py index a511079da..fffd9b609 100644 --- a/api/account/models.py +++ b/api/account/models.py @@ -379,6 +379,27 @@ async def aget_scorer(self) -> Scorer: return await BinaryWeightedScorer.objects.aget(scorer_ptr_id=scorer.id) +class AddressList(models.Model): + name = models.CharField(max_length=100, db_index=True, unique=True) + + def __str__(self): + return f"AllowList - {self.name}" + + +class AddressListMember(models.Model): + address = EthAddressField(null=False, blank=False, max_length=100, db_index=True) + list = models.ForeignKey( + AddressList, + related_name="addresses", + on_delete=models.CASCADE, + null=False, + db_index=True, + ) + + class Meta: + unique_together = ["address", "list"] + + class Customization(models.Model): class CustomizationLogoBackgroundType(models.TextChoices): DOTS = "DOTS" @@ -405,7 +426,7 @@ class CustomizationLogoBackgroundType(models.TextChoices): blank=True, unique=False, ) - scorer = models.ForeignKey(Community, on_delete=models.PROTECT) + scorer = models.OneToOneField(Community, on_delete=models.PROTECT) use_custom_dashboard_panel = models.BooleanField(default=False) # CustomizationTheme @@ -452,3 +473,15 @@ class CustomizationLogoBackgroundType(models.TextChoices): blank=True, null=True, ) + + +class AllowList(models.Model): + address_list = models.ForeignKey( + AddressList, on_delete=models.PROTECT, related_name="allow_lists" + ) + + customization = models.ForeignKey( + Customization, on_delete=models.CASCADE, related_name="allow_lists" + ) + + weight = models.FloatField(default=0.0) diff --git a/api/registry/templates/registry/address_list_csv_import_form.html b/api/account/templates/account/address_list_csv_import_form.html similarity index 100% rename from api/registry/templates/registry/address_list_csv_import_form.html rename to api/account/templates/account/address_list_csv_import_form.html diff --git a/api/registry/templates/registry/addresslist_changelist.html b/api/account/templates/account/addresslist_changelist.html similarity index 100% rename from api/registry/templates/registry/addresslist_changelist.html rename to api/account/templates/account/addresslist_changelist.html diff --git a/api/registry/admin.py b/api/registry/admin.py index 1867c8868..e5fa24405 100644 --- a/api/registry/admin.py +++ b/api/registry/admin.py @@ -1,6 +1,5 @@ from asgiref.sync import async_to_sync from django.contrib import admin, messages -from import_export.forms import ModelResource from registry.api.schema import SubmitPassportPayload from registry.api.v1 import ahandle_submit_passport from registry.models import ( @@ -10,16 +9,8 @@ Passport, Score, Stamp, - AddressListMember, - AddressList, ) from scorer.scorer_admin import ScorerModelAdmin -from import_export.admin import ImportMixin, ImportForm -from django import forms -from django.urls import path -from django.shortcuts import render, redirect -import csv -import codecs @admin.action( @@ -157,84 +148,3 @@ class GTCStakeEventAdmin(ScorerModelAdmin): "staker", "event_type", ] - - -class AddressListMemberInline(admin.TabularInline): - model = AddressListMember - extra = 0 - - -class AddressListImportForm(ImportForm): - list = forms.ModelChoiceField(queryset=AddressList.objects.all(), required=True) - - -class AddressListMemberResource(ModelResource): - def __init__(self, **kwargs): - super().__init__() - print(kwargs, "ALMR init - KWARGS!!!!!!") - self.list_id = kwargs.get("list_id") - - class Meta: - model = AddressListMember - - -class AddressListCsvImportForm(forms.Form): - csv_file = forms.FileField() - list = forms.ModelChoiceField(queryset=AddressList.objects.all(), required=True) - - -@admin.register(AddressListMember) -class AddressListMemberAdmin(ImportMixin, admin.ModelAdmin): - import_form_class = AddressListImportForm - - def get_import_resource_kwargs(self, request, *args, **kwargs): - kwargs = super().get_resource_kwargs(request, *args, **kwargs) - print(kwargs, "girk - KWARGS!!!!!!") - # kwargs.update({"user": request.user}) - return kwargs - - def get_import_data_kwargs(self, **kwargs): - """ - Prepare kwargs for import_data. - """ - print(kwargs, "gidk - KWARGS!!!!!!") - form = kwargs.get("form", None) - if form and hasattr(form, "cleaned_data"): - print(form.cleaned_data, "gidk - FORM.CLEANED_DATA!!!!!!") - kwargs.update({"list_id": form.cleaned_data.get("list", None)}) - return kwargs - - def after_init_instance(self, instance, new, row, **kwargs): - print(kwargs, "KWARGS!!!!!!") - if "list_id" in kwargs: - instance.list_id = kwargs["list_id"] - - -@admin.register(AddressList) -class AddressListAdmin(ScorerModelAdmin): - list_display = ["name", "address_count"] - inlines = [AddressListMemberInline] - change_list_template = "registry/addresslist_changelist.html" - - def address_count(self, obj): - return obj.addresses.count() - - def get_urls(self): - return [ - path("import-csv/", self.import_csv), - ] + super().get_urls() - - def import_csv(self, request): - if request.method == "POST": - csv_file = request.FILES["csv_file"] - reader = csv.reader(codecs.iterdecode(csv_file, "utf-8")) - list_id = request.POST.get("list") - address_list = AddressList.objects.get(id=list_id) - for row in reader: - address = row[0].strip() - AddressListMember.objects.create(address=address, list=address_list) - self.message_user(request, "Your csv file has been imported") - return redirect("..") - form = AddressListCsvImportForm() - payload = {"form": form} - return render(request, "registry/address_list_csv_import_form.html", payload) diff --git a/api/registry/models.py b/api/registry/models.py index a3e81e2d6..2eef108cd 100644 --- a/api/registry/models.py +++ b/api/registry/models.py @@ -190,21 +190,3 @@ class Meta: name="gtc_staking_index_by_staker", ), ] - - -class AddressList(models.Model): - name = models.CharField(max_length=100, db_index=True, unique=True) - - -class AddressListMember(models.Model): - address = EthAddressField(null=False, blank=False, max_length=100, db_index=True) - list = models.ForeignKey( - AddressList, - related_name="addresses", - on_delete=models.CASCADE, - null=False, - db_index=True, - ) - - class Meta: - unique_together = ["address", "list"] diff --git a/api/scorer/settings/base.py b/api/scorer/settings/base.py index 9fe26ef41..58cbf77d9 100644 --- a/api/scorer/settings/base.py +++ b/api/scorer/settings/base.py @@ -78,7 +78,6 @@ "django.contrib.staticfiles", "django_extensions", "rest_framework_api_key", - "import_export", "registry", "scorer_apu", "scorer_weighted", From 1e19112fc6694bda570408153217f84e50ccb47b Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 12 Jun 2024 09:53:34 -0600 Subject: [PATCH 4/5] feat(api): added allowlists to customizaion weights --- api/account/api.py | 5 +++++ .../migrations/0028_alter_allowlist_weight.py | 17 +++++++++++++++++ api/account/models.py | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 api/account/migrations/0028_alter_allowlist_weight.py diff --git a/api/account/api.py b/api/account/api.py index 9cdfe8715..19f7fb8ef 100644 --- a/api/account/api.py +++ b/api/account/api.py @@ -597,6 +597,11 @@ def get_account_customization(request, dashboard_path: str): elif scorer and getattr(scorer, "binaryweightedscorer", None): weights = scorer.binaryweightedscorer.weights + for allow_list in customization.allow_lists.all(): + weights[f"AllowList#{allow_list.address_list.name}"] = str( + allow_list.weight + ) + return dict( key=customization.path, useCustomDashboardPanel=customization.use_custom_dashboard_panel, diff --git a/api/account/migrations/0028_alter_allowlist_weight.py b/api/account/migrations/0028_alter_allowlist_weight.py new file mode 100644 index 000000000..80e5792df --- /dev/null +++ b/api/account/migrations/0028_alter_allowlist_weight.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.6 on 2024-06-12 15:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("account", "0027_allowlist"), + ] + + operations = [ + migrations.AlterField( + model_name="allowlist", + name="weight", + field=models.DecimalField(decimal_places=4, default=0.0, max_digits=7), + ), + ] diff --git a/api/account/models.py b/api/account/models.py index fffd9b609..eb471ab6f 100644 --- a/api/account/models.py +++ b/api/account/models.py @@ -484,4 +484,4 @@ class AllowList(models.Model): Customization, on_delete=models.CASCADE, related_name="allow_lists" ) - weight = models.FloatField(default=0.0) + weight = models.DecimalField(default=0.0, max_digits=7, decimal_places=4) From d38014361815056dd004f7a3e7072fbed40b7424 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 12 Jun 2024 16:50:54 -0600 Subject: [PATCH 5/5] cleanup --- api/scorer/settings/base.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/scorer/settings/base.py b/api/scorer/settings/base.py index 58cbf77d9..f395204ba 100644 --- a/api/scorer/settings/base.py +++ b/api/scorer/settings/base.py @@ -448,5 +448,3 @@ "127.0.0.1", # ... ] - -IMPORT_EXPORT_SKIP_ADMIN_CONFIRM = True