├── .containerignore
├── .flake8
├── .gitignore
├── LICENSE
├── Makefile
├── README.md
├── k8s
├── scripts
│ └── create-secrets.sh
├── web-deployment.yaml
├── web-ingress.yaml
└── web-service.yaml
├── reciperadar
├── __init__.py
├── api
│ ├── autosuggest.py
│ ├── feedback.py
│ ├── recipes.py
│ └── redirect.py
├── models
│ ├── base.py
│ ├── feedback.py
│ └── recipes
│ │ ├── __init__.py
│ │ ├── ingredient.py
│ │ ├── nutrition.py
│ │ ├── product.py
│ │ └── recipe.py
├── search
│ ├── base.py
│ ├── equipment.py
│ ├── ingredients.py
│ └── recipes.py
├── templates
│ └── problem-report
│ │ ├── correction.html
│ │ ├── removal_request.html
│ │ └── unsafe_content.html
├── utils
│ └── bots.py
└── workers
│ ├── __init__.py
│ ├── broker.py
│ ├── events.py
│ ├── recipes.py
│ └── searches.py
├── requirements-dev.in
├── requirements-dev.txt
├── requirements.in
├── requirements.txt
└── tests
├── __init__.py
├── api
├── test_autosuggest.py
├── test_feedback.py
├── test_recipes.py
└── test_redirect.py
├── conftest.py
├── models
├── recipes
│ └── test_recipe.py
└── test_feedback_model.py
└── search
└── test_base.py
/.containerignore:
--------------------------------------------------------------------------------
1 | **/*.pyc
2 | **/__pycache__
3 |
--------------------------------------------------------------------------------
/.flake8:
--------------------------------------------------------------------------------
1 | [flake8]
2 | max-line-length=88
3 | per-file-ignores=
4 | reciperadar/ __init__.py:E402,F401
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | *.swp
3 | venv
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU AFFERO GENERAL PUBLIC LICENSE
2 | Version 3, 19 November 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc. {description} A possible correction has been reported for {{ recipe.title }}. Please inspect the recipe and determine whether the problem is from the origin recipe webpage or whether we have processed the data incorrectly. File a data bugreport if the issue relates to the way we have processed the recipe. A recipe removal request has been received for {{ recipe.title }}. If in doubt, verify the identity of the requestor by contacting them. The reporter has provided a content usage policy covering the recipe. Confirm that the recipe to be removed is covered by the policy. The reporter also indicates that there is an HTML "
53 | for k, v in issue.items():
54 | html += "
"
55 | html += f" "
58 | html += f"{k} "
56 | html += f"{v} "
57 | html += "
5 |
8 | noindex
directive that indicates that the content should not be included in search engine indices.
If you believe that the recipe should indeed be removed, delete it from the search engine index, database, and backups.
18 | 19 | {% if report.content_owner_email %} 20 |Contact the content owner to confirm that their content has been removed.
21 | {% endif %} 22 | 23 | 24 | -------------------------------------------------------------------------------- /reciperadar/templates/problem-report/unsafe_content.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |Unsafe content has been reported for {{ recipe.title }}.
4 |Please remove the recipe from our search engine index, database, and backups.
5 |If the problem occurs for all recipe webpages on {{ recipe.domain }}, then disable indexing for that domain, and remove all recipes from our search engine index, database and backups.
6 | 7 | 8 | -------------------------------------------------------------------------------- /reciperadar/utils/bots.py: -------------------------------------------------------------------------------- 1 | from user_agents import parse as ua_parser 2 | 3 | 4 | def is_suspected_bot(user_agent): 5 | user_agent = user_agent or "" 6 | # ref: https://github.com/ua-parser/uap-core/issues/554 7 | if "HeadlessChrome" in user_agent: 8 | return True 9 | return ua_parser(user_agent).is_bot 10 | -------------------------------------------------------------------------------- /reciperadar/workers/__init__.py: -------------------------------------------------------------------------------- 1 | from reciperadar.workers.broker import celery 2 | import reciperadar.workers.events 3 | import reciperadar.workers.recipes 4 | import reciperadar.workers.searches 5 | -------------------------------------------------------------------------------- /reciperadar/workers/broker.py: -------------------------------------------------------------------------------- 1 | from celery import Celery 2 | 3 | celery = Celery("reciperadar", broker="pyamqp://guest@rabbitmq") 4 | -------------------------------------------------------------------------------- /reciperadar/workers/events.py: -------------------------------------------------------------------------------- 1 | from reciperadar.workers.broker import celery 2 | 3 | 4 | @celery.task 5 | def store_event(event_table, event_data): 6 | pass 7 | -------------------------------------------------------------------------------- /reciperadar/workers/recipes.py: -------------------------------------------------------------------------------- 1 | from reciperadar.workers.broker import celery 2 | 3 | 4 | @celery.task(queue="index_recipe") 5 | def index_recipe(recipe_id): 6 | pass 7 | 8 | 9 | @celery.task(queue="crawl_recipe") 10 | def crawl_recipe(url): 11 | pass 12 | 13 | 14 | @celery.task(queue="crawl_url") 15 | def crawl_url(url): 16 | pass 17 | -------------------------------------------------------------------------------- /reciperadar/workers/searches.py: -------------------------------------------------------------------------------- 1 | from reciperadar.workers.broker import celery 2 | 3 | 4 | @celery.task(queue="recrawl_search") 5 | def recrawl_search(include, exclude, equipment, dietary_properties, offset): 6 | pass 7 | -------------------------------------------------------------------------------- /requirements-dev.in: -------------------------------------------------------------------------------- 1 | black 2 | flake8 3 | pytest 4 | -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | amqp==5.3.1 \ 2 | --hash=sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2 \ 3 | --hash=sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432 4 | # via kombu 5 | billiard==4.2.1 \ 6 | --hash=sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f \ 7 | --hash=sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb 8 | # via celery 9 | black==25.1.0 \ 10 | --hash=sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171 \ 11 | --hash=sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7 \ 12 | --hash=sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da \ 13 | --hash=sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2 \ 14 | --hash=sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc \ 15 | --hash=sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666 \ 16 | --hash=sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f \ 17 | --hash=sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b \ 18 | --hash=sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32 \ 19 | --hash=sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f \ 20 | --hash=sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717 \ 21 | --hash=sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299 \ 22 | --hash=sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0 \ 23 | --hash=sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18 \ 24 | --hash=sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0 \ 25 | --hash=sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3 \ 26 | --hash=sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355 \ 27 | --hash=sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096 \ 28 | --hash=sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e \ 29 | --hash=sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9 \ 30 | --hash=sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba \ 31 | --hash=sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f 32 | # via -r requirements-dev.in 33 | blinker==1.9.0 \ 34 | --hash=sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf \ 35 | --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc 36 | # via 37 | # flask 38 | # flask-mail 39 | celery==5.5.2 \ 40 | --hash=sha256:4d6930f354f9d29295425d7a37261245c74a32807c45d764bedc286afd0e724e \ 41 | --hash=sha256:54425a067afdc88b57cd8d94ed4af2ffaf13ab8c7680041ac2c4ac44357bdf4c 42 | # via -r requirements.in 43 | certifi==2025.4.26 \ 44 | --hash=sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6 \ 45 | --hash=sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3 46 | # via 47 | # opensearch-py 48 | # requests 49 | charset-normalizer==3.4.2 \ 50 | --hash=sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4 \ 51 | --hash=sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45 \ 52 | --hash=sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7 \ 53 | --hash=sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0 \ 54 | --hash=sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7 \ 55 | --hash=sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d \ 56 | --hash=sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d \ 57 | --hash=sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0 \ 58 | --hash=sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184 \ 59 | --hash=sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db \ 60 | --hash=sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b \ 61 | --hash=sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64 \ 62 | --hash=sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b \ 63 | --hash=sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8 \ 64 | --hash=sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff \ 65 | --hash=sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344 \ 66 | --hash=sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58 \ 67 | --hash=sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e \ 68 | --hash=sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471 \ 69 | --hash=sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148 \ 70 | --hash=sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a \ 71 | --hash=sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836 \ 72 | --hash=sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e \ 73 | --hash=sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63 \ 74 | --hash=sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c \ 75 | --hash=sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1 \ 76 | --hash=sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01 \ 77 | --hash=sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366 \ 78 | --hash=sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58 \ 79 | --hash=sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5 \ 80 | --hash=sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c \ 81 | --hash=sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2 \ 82 | --hash=sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a \ 83 | --hash=sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597 \ 84 | --hash=sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b \ 85 | --hash=sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5 \ 86 | --hash=sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb \ 87 | --hash=sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f \ 88 | --hash=sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0 \ 89 | --hash=sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941 \ 90 | --hash=sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0 \ 91 | --hash=sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86 \ 92 | --hash=sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7 \ 93 | --hash=sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7 \ 94 | --hash=sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455 \ 95 | --hash=sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6 \ 96 | --hash=sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4 \ 97 | --hash=sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0 \ 98 | --hash=sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3 \ 99 | --hash=sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1 \ 100 | --hash=sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6 \ 101 | --hash=sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981 \ 102 | --hash=sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c \ 103 | --hash=sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980 \ 104 | --hash=sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645 \ 105 | --hash=sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7 \ 106 | --hash=sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12 \ 107 | --hash=sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa \ 108 | --hash=sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd \ 109 | --hash=sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef \ 110 | --hash=sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f \ 111 | --hash=sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2 \ 112 | --hash=sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d \ 113 | --hash=sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5 \ 114 | --hash=sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02 \ 115 | --hash=sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3 \ 116 | --hash=sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd \ 117 | --hash=sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e \ 118 | --hash=sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214 \ 119 | --hash=sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd \ 120 | --hash=sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a \ 121 | --hash=sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c \ 122 | --hash=sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681 \ 123 | --hash=sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba \ 124 | --hash=sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f \ 125 | --hash=sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a \ 126 | --hash=sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28 \ 127 | --hash=sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691 \ 128 | --hash=sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82 \ 129 | --hash=sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a \ 130 | --hash=sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027 \ 131 | --hash=sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7 \ 132 | --hash=sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518 \ 133 | --hash=sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf \ 134 | --hash=sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b \ 135 | --hash=sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9 \ 136 | --hash=sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544 \ 137 | --hash=sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da \ 138 | --hash=sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509 \ 139 | --hash=sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f \ 140 | --hash=sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a \ 141 | --hash=sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f 142 | # via requests 143 | click==8.1.8 \ 144 | --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 \ 145 | --hash=sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a 146 | # via 147 | # black 148 | # celery 149 | # click-didyoumean 150 | # click-plugins 151 | # click-repl 152 | # flask 153 | click-didyoumean==0.3.1 \ 154 | --hash=sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463 \ 155 | --hash=sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c 156 | # via celery 157 | click-plugins==1.1.1 \ 158 | --hash=sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b \ 159 | --hash=sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8 160 | # via celery 161 | click-repl==0.3.0 \ 162 | --hash=sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9 \ 163 | --hash=sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812 164 | # via celery 165 | events==0.5 \ 166 | --hash=sha256:a7286af378ba3e46640ac9825156c93bdba7502174dd696090fdfcd4d80a1abd 167 | # via opensearch-py 168 | flake8==7.2.0 \ 169 | --hash=sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343 \ 170 | --hash=sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426 171 | # via -r requirements-dev.in 172 | flask==3.1.1 \ 173 | --hash=sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c \ 174 | --hash=sha256:284c7b8f2f58cb737f0cf1c30fd7eaf0ccfcde196099d24ecede3fc2005aa59e 175 | # via 176 | # -r requirements.in 177 | # flask-mail 178 | # flask-sqlalchemy 179 | flask-mail==0.10.0 \ 180 | --hash=sha256:44083e7b02bbcce792209c06252f8569dd5a325a7aaa76afe7330422bd97881d \ 181 | --hash=sha256:a451e490931bb3441d9b11ebab6812a16bfa81855792ae1bf9c1e1e22c4e51e7 182 | # via -r requirements.in 183 | flask-sqlalchemy==3.1.1 \ 184 | --hash=sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0 \ 185 | --hash=sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312 186 | # via -r requirements.in 187 | greenlet==3.2.1 \ 188 | --hash=sha256:04b4ec7f65f0e4a1500ac475c9343f6cc022b2363ebfb6e94f416085e40dea15 \ 189 | --hash=sha256:05a7490f74e8aabc5f29256765a99577ffde979920a2db1f3676d265a3adba41 \ 190 | --hash=sha256:063bcf7f8ee28eb91e7f7a8148c65a43b73fbdc0064ab693e024b5a940070145 \ 191 | --hash=sha256:0ba2811509a30e5f943be048895a983a8daf0b9aa0ac0ead526dfb5d987d80ea \ 192 | --hash=sha256:0c68bbc639359493420282d2f34fa114e992a8724481d700da0b10d10a7611b8 \ 193 | --hash=sha256:0ddda0197c5b46eedb5628d33dad034c455ae77708c7bf192686e760e26d6a0c \ 194 | --hash=sha256:175d583f7d5ee57845591fc30d852b75b144eb44b05f38b67966ed6df05c8526 \ 195 | --hash=sha256:17964c246d4f6e1327edd95e2008988a8995ae3a7732be2f9fc1efed1f1cdf8c \ 196 | --hash=sha256:1a750f1046994b9e038b45ae237d68153c29a3a783075211fb1414a180c8324b \ 197 | --hash=sha256:1c472adfca310f849903295c351d297559462067f618944ce2650a1878b84123 \ 198 | --hash=sha256:2273586879affca2d1f414709bb1f61f0770adcabf9eda8ef48fd90b36f15d12 \ 199 | --hash=sha256:24a496479bc8bd01c39aa6516a43c717b4cee7196573c47b1f8e1011f7c12495 \ 200 | --hash=sha256:2530bfb0abcd451ea81068e6d0a1aac6dabf3f4c23c8bd8e2a8f579c2dd60d95 \ 201 | --hash=sha256:3059c6f286b53ea4711745146ffe5a5c5ff801f62f6c56949446e0f6461f8157 \ 202 | --hash=sha256:3227c6ec1149d4520bc99edac3b9bc8358d0034825f3ca7572165cb502d8f29a \ 203 | --hash=sha256:374ffebaa5fbd10919cd599e5cf8ee18bae70c11f9d61e73db79826c8c93d6f9 \ 204 | --hash=sha256:3ecc9d33ca9428e4536ea53e79d781792cee114d2fa2695b173092bdbd8cd6d5 \ 205 | --hash=sha256:3f56382ac4df3860ebed8ed838f268f03ddf4e459b954415534130062b16bc32 \ 206 | --hash=sha256:4245246e72352b150a1588d43ddc8ab5e306bef924c26571aafafa5d1aaae4e8 \ 207 | --hash=sha256:4339b202ac20a89ccd5bde0663b4d00dc62dd25cb3fb14f7f3034dec1b0d9ece \ 208 | --hash=sha256:4818116e75a0dd52cdcf40ca4b419e8ce5cb6669630cb4f13a6c384307c9543f \ 209 | --hash=sha256:5193135b3a8d0017cb438de0d49e92bf2f6c1c770331d24aa7500866f4db4017 \ 210 | --hash=sha256:51a2f49da08cff79ee42eb22f1658a2aed60c72792f0a0a95f5f0ca6d101b1fb \ 211 | --hash=sha256:5c12f0d17a88664757e81a6e3fc7c2452568cf460a2f8fb44f90536b2614000b \ 212 | --hash=sha256:6079ae990bbf944cf66bea64a09dcb56085815630955109ffa98984810d71565 \ 213 | --hash=sha256:639a94d001fe874675b553f28a9d44faed90f9864dc57ba0afef3f8d76a18b04 \ 214 | --hash=sha256:64a4d0052de53ab3ad83ba86de5ada6aeea8f099b4e6c9ccce70fb29bc02c6a2 \ 215 | --hash=sha256:6dcc6d604a6575c6225ac0da39df9335cc0c6ac50725063fa90f104f3dbdb2c9 \ 216 | --hash=sha256:7132e024ebeeeabbe661cf8878aac5d2e643975c4feae833142592ec2f03263d \ 217 | --hash=sha256:72c9b668454e816b5ece25daac1a42c94d1c116d5401399a11b77ce8d883110c \ 218 | --hash=sha256:777c1281aa7c786738683e302db0f55eb4b0077c20f1dc53db8852ffaea0a6b0 \ 219 | --hash=sha256:7abc0545d8e880779f0c7ce665a1afc3f72f0ca0d5815e2b006cafc4c1cc5840 \ 220 | --hash=sha256:7b0f3a0a67786facf3b907a25db80efe74310f9d63cc30869e49c79ee3fcef7e \ 221 | --hash=sha256:852ef432919830022f71a040ff7ba3f25ceb9fe8f3ab784befd747856ee58530 \ 222 | --hash=sha256:8b89e5d44f55372efc6072f59ced5ed1efb7b44213dab5ad7e0caba0232c6545 \ 223 | --hash=sha256:8fe303381e7e909e42fb23e191fc69659910909fdcd056b92f6473f80ef18543 \ 224 | --hash=sha256:9afa05fe6557bce1642d8131f87ae9462e2a8e8c46f7ed7929360616088a3975 \ 225 | --hash=sha256:9f4dd4b4946b14bb3bf038f81e1d2e535b7d94f1b2a59fdba1293cd9c1a0a4d7 \ 226 | --hash=sha256:aa30066fd6862e1153eaae9b51b449a6356dcdb505169647f69e6ce315b9468b \ 227 | --hash=sha256:b38d53cf268da963869aa25a6e4cc84c1c69afc1ae3391738b2603d110749d01 \ 228 | --hash=sha256:b7503d6b8bbdac6bbacf5a8c094f18eab7553481a1830975799042f26c9e101b \ 229 | --hash=sha256:c07a0c01010df42f1f058b3973decc69c4d82e036a951c3deaf89ab114054c07 \ 230 | --hash=sha256:cb5ee928ce5fedf9a4b0ccdc547f7887136c4af6109d8f2fe8e00f90c0db47f5 \ 231 | --hash=sha256:cc45a7189c91c0f89aaf9d69da428ce8301b0fd66c914a499199cfb0c28420fc \ 232 | --hash=sha256:d6668caf15f181c1b82fb6406f3911696975cc4c37d782e19cb7ba499e556189 \ 233 | --hash=sha256:dbb4e1aa2000852937dd8f4357fb73e3911da426df8ca9b8df5db231922da474 \ 234 | --hash=sha256:de62b542e5dcf0b6116c310dec17b82bb06ef2ceb696156ff7bf74a7a498d982 \ 235 | --hash=sha256:e1967882f0c42eaf42282a87579685c8673c51153b845fde1ee81be720ae27ac \ 236 | --hash=sha256:e1a40a17e2c7348f5eee5d8e1b4fa6a937f0587eba89411885a36a8e1fc29bd2 \ 237 | --hash=sha256:e63cd2035f49376a23611fbb1643f78f8246e9d4dfd607534ec81b175ce582c2 \ 238 | --hash=sha256:e775176b5c203a1fa4be19f91da00fd3bff536868b77b237da3f4daa5971ae5d \ 239 | --hash=sha256:e77ae69032a95640a5fe8c857ec7bee569a0997e809570f4c92048691ce4b437 \ 240 | --hash=sha256:e934591a7a4084fa10ee5ef50eb9d2ac8c4075d5c9cf91128116b5dca49d43b1 \ 241 | --hash=sha256:e98328b8b8f160925d6b1c5b1879d8e64f6bd8cf11472b7127d579da575b77d9 \ 242 | --hash=sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22 243 | # via sqlalchemy 244 | gunicorn==23.0.0 \ 245 | --hash=sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d \ 246 | --hash=sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec 247 | # via -r requirements.in 248 | idna==3.10 \ 249 | --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ 250 | --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 251 | # via requests 252 | iniconfig==2.1.0 \ 253 | --hash=sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7 \ 254 | --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 255 | # via pytest 256 | itsdangerous==2.2.0 \ 257 | --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef \ 258 | --hash=sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173 259 | # via flask 260 | jinja2==3.1.6 \ 261 | --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ 262 | --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 263 | # via 264 | # -r requirements.in 265 | # flask 266 | kombu==5.5.3 \ 267 | --hash=sha256:021a0e11fcfcd9b0260ef1fb64088c0e92beb976eb59c1dfca7ddd4ad4562ea2 \ 268 | --hash=sha256:5b0dbceb4edee50aa464f59469d34b97864be09111338cfb224a10b6a163909b 269 | # via celery 270 | markupsafe==3.0.2 \ 271 | --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \ 272 | --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \ 273 | --hash=sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0 \ 274 | --hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \ 275 | --hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \ 276 | --hash=sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13 \ 277 | --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \ 278 | --hash=sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca \ 279 | --hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \ 280 | --hash=sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 \ 281 | --hash=sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0 \ 282 | --hash=sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b \ 283 | --hash=sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579 \ 284 | --hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \ 285 | --hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \ 286 | --hash=sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff \ 287 | --hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \ 288 | --hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \ 289 | --hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \ 290 | --hash=sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb \ 291 | --hash=sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e \ 292 | --hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \ 293 | --hash=sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a \ 294 | --hash=sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d \ 295 | --hash=sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a \ 296 | --hash=sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b \ 297 | --hash=sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8 \ 298 | --hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \ 299 | --hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \ 300 | --hash=sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144 \ 301 | --hash=sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f \ 302 | --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \ 303 | --hash=sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d \ 304 | --hash=sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 \ 305 | --hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \ 306 | --hash=sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158 \ 307 | --hash=sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 \ 308 | --hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \ 309 | --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \ 310 | --hash=sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171 \ 311 | --hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \ 312 | --hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \ 313 | --hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \ 314 | --hash=sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d \ 315 | --hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \ 316 | --hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \ 317 | --hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \ 318 | --hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \ 319 | --hash=sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29 \ 320 | --hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \ 321 | --hash=sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798 \ 322 | --hash=sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c \ 323 | --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \ 324 | --hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \ 325 | --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \ 326 | --hash=sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a \ 327 | --hash=sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178 \ 328 | --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \ 329 | --hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \ 330 | --hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \ 331 | --hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50 332 | # via 333 | # flask 334 | # jinja2 335 | # werkzeug 336 | mccabe==0.7.0 \ 337 | --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ 338 | --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e 339 | # via flake8 340 | mypy-extensions==1.1.0 \ 341 | --hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 \ 342 | --hash=sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558 343 | # via black 344 | opensearch-py==2.8.0 \ 345 | --hash=sha256:52c60fdb5d4dcf6cce3ee746c13b194529b0161e0f41268b98ab8f1624abe2fa \ 346 | --hash=sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda 347 | # via -r requirements.in 348 | packaging==25.0 \ 349 | --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ 350 | --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f 351 | # via 352 | # black 353 | # gunicorn 354 | # pytest 355 | pathspec==0.12.1 \ 356 | --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ 357 | --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 358 | # via black 359 | platformdirs==4.3.8 \ 360 | --hash=sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc \ 361 | --hash=sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4 362 | # via black 363 | pluggy==1.5.0 \ 364 | --hash=sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1 \ 365 | --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 366 | # via pytest 367 | prompt-toolkit==3.0.51 \ 368 | --hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 \ 369 | --hash=sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed 370 | # via click-repl 371 | pycodestyle==2.13.0 \ 372 | --hash=sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9 \ 373 | --hash=sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae 374 | # via flake8 375 | pyflakes==3.3.2 \ 376 | --hash=sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a \ 377 | --hash=sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b 378 | # via flake8 379 | pytest==8.3.5 \ 380 | --hash=sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 \ 381 | --hash=sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845 382 | # via -r requirements-dev.in 383 | python-dateutil==2.9.0.post0 \ 384 | --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ 385 | --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 386 | # via 387 | # celery 388 | # opensearch-py 389 | requests==2.32.3 \ 390 | --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ 391 | --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 392 | # via opensearch-py 393 | six==1.17.0 \ 394 | --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ 395 | --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 396 | # via python-dateutil 397 | sqlalchemy==2.0.40 \ 398 | --hash=sha256:00a494ea6f42a44c326477b5bee4e0fc75f6a80c01570a32b57e89cf0fbef85a \ 399 | --hash=sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d \ 400 | --hash=sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2 \ 401 | --hash=sha256:15d08d5ef1b779af6a0909b97be6c1fd4298057504eb6461be88bd1696cb438e \ 402 | --hash=sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26 \ 403 | --hash=sha256:1abb387710283fc5983d8a1209d9696a4eae9db8d7ac94b402981fe2fe2e39ad \ 404 | --hash=sha256:1ffdf9c91428e59744f8e6f98190516f8e1d05eec90e936eb08b257332c5e870 \ 405 | --hash=sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0 \ 406 | --hash=sha256:2cbafc8d39ff1abdfdda96435f38fab141892dc759a2165947d1a8fffa7ef596 \ 407 | --hash=sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a \ 408 | --hash=sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a \ 409 | --hash=sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4 \ 410 | --hash=sha256:37a5c21ab099a83d669ebb251fddf8f5cee4d75ea40a5a1653d9c43d60e20867 \ 411 | --hash=sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a \ 412 | --hash=sha256:46628ebcec4f23a1584fb52f2abe12ddb00f3bb3b7b337618b80fc1b51177aff \ 413 | --hash=sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705 \ 414 | --hash=sha256:4aeb939bcac234b88e2d25d5381655e8353fe06b4e50b1c55ecffe56951d18c2 \ 415 | --hash=sha256:50f5885bbed261fc97e2e66c5156244f9704083a674b8d17f24c72217d29baf5 \ 416 | --hash=sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51 \ 417 | --hash=sha256:5434223b795be5c5ef8244e5ac98056e290d3a99bdcc539b916e282b160dda00 \ 418 | --hash=sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364 \ 419 | --hash=sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011 \ 420 | --hash=sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4 \ 421 | --hash=sha256:5cfa124eda500ba4b0d3afc3e91ea27ed4754e727c7f025f293a22f512bcd4c9 \ 422 | --hash=sha256:5ea9181284754d37db15156eb7be09c86e16e50fbe77610e9e7bee09291771a1 \ 423 | --hash=sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad \ 424 | --hash=sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1 \ 425 | --hash=sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716 \ 426 | --hash=sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0 \ 427 | --hash=sha256:7e0505719939e52a7b0c65d20e84a6044eb3712bb6f239c6b1db77ba8e173a37 \ 428 | --hash=sha256:8b6b28d303b9d57c17a5164eb1fd2d5119bb6ff4413d5894e74873280483eeb5 \ 429 | --hash=sha256:8bb131ffd2165fae48162c7bbd0d97c84ab961deea9b8bab16366543deeab625 \ 430 | --hash=sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01 \ 431 | --hash=sha256:9408fd453d5f8990405cc9def9af46bfbe3183e6110401b407c2d073c3388f47 \ 432 | --hash=sha256:957f8d85d5e834397ef78a6109550aeb0d27a53b5032f7a57f2451e1adc37e98 \ 433 | --hash=sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1 \ 434 | --hash=sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d \ 435 | --hash=sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500 \ 436 | --hash=sha256:a8aae085ea549a1eddbc9298b113cffb75e514eadbb542133dd2b99b5fb3b6af \ 437 | --hash=sha256:ae9597cab738e7cc823f04a704fb754a9249f0b6695a6aeb63b74055cd417a96 \ 438 | --hash=sha256:afe63b208153f3a7a2d1a5b9df452b0673082588933e54e7c8aac457cf35e758 \ 439 | --hash=sha256:b5a5bbe29c10c5bfd63893747a1bf6f8049df607638c786252cb9243b86b6706 \ 440 | --hash=sha256:baf7cee56bd552385c1ee39af360772fbfc2f43be005c78d1140204ad6148438 \ 441 | --hash=sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db \ 442 | --hash=sha256:bece9527f5a98466d67fb5d34dc560c4da964240d8b09024bb21c1246545e04e \ 443 | --hash=sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b \ 444 | --hash=sha256:c268b5100cfeaa222c40f55e169d484efa1384b44bf9ca415eae6d556f02cb08 \ 445 | --hash=sha256:c7b927155112ac858357ccf9d255dd8c044fd9ad2dc6ce4c4149527c901fa4c3 \ 446 | --hash=sha256:c884de19528e0fcd9dc34ee94c810581dd6e74aef75437ff17e696c2bfefae3e \ 447 | --hash=sha256:cd2f75598ae70bcfca9117d9e51a3b06fe29edd972fdd7fd57cc97b4dbf3b08a \ 448 | --hash=sha256:cf0e99cdb600eabcd1d65cdba0d3c91418fee21c4aa1d28db47d095b1064a7d8 \ 449 | --hash=sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00 \ 450 | --hash=sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191 \ 451 | --hash=sha256:f0fda83e113bb0fb27dc003685f32a5dcb99c9c4f41f4fa0838ac35265c23b5c \ 452 | --hash=sha256:f1ea21bef99c703f44444ad29c2c1b6bd55d202750b6de8e06a955380f4725d7 \ 453 | --hash=sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e \ 454 | --hash=sha256:fe147fcd85aaed53ce90645c91ed5fca0cc88a797314c70dfd9d35925bd5d106 455 | # via 456 | # -r requirements.in 457 | # flask-sqlalchemy 458 | typing-extensions==4.13.2 \ 459 | --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c \ 460 | --hash=sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef 461 | # via sqlalchemy 462 | tzdata==2025.2 \ 463 | --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ 464 | --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 465 | # via kombu 466 | ua-parser==1.0.1 \ 467 | --hash=sha256:b059f2cb0935addea7e551251cbbf42e9a8872f86134163bc1a4f79e0945ffea \ 468 | --hash=sha256:f9d92bf19d4329019cef91707aecc23c6d65143ad7e29a233f0580fb0d15547d 469 | # via user-agents 470 | ua-parser-builtins==0.18.0.post1 \ 471 | --hash=sha256:eb4f93504040c3a990a6b0742a2afd540d87d7f9f05fd66e94c101db1564674d 472 | # via ua-parser 473 | urllib3==2.4.0 \ 474 | --hash=sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466 \ 475 | --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 476 | # via 477 | # opensearch-py 478 | # requests 479 | user-agents==2.2.0 \ 480 | --hash=sha256:a98c4dc72ecbc64812c4534108806fb0a0b3a11ec3fd1eafe807cee5b0a942e7 \ 481 | --hash=sha256:d36d25178db65308d1458c5fa4ab39c9b2619377010130329f3955e7626ead26 482 | # via -r requirements.in 483 | vine==5.1.0 \ 484 | --hash=sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc \ 485 | --hash=sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0 486 | # via 487 | # amqp 488 | # celery 489 | # kombu 490 | wcwidth==0.2.13 \ 491 | --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 \ 492 | --hash=sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5 493 | # via prompt-toolkit 494 | werkzeug==3.1.3 \ 495 | --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e \ 496 | --hash=sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746 497 | # via flask 498 | -------------------------------------------------------------------------------- /requirements.in: -------------------------------------------------------------------------------- 1 | celery==5.5.2 2 | flask==3.1.1 3 | flask-mail==0.10.0 4 | flask-sqlalchemy==3.1.1 5 | gunicorn==23.0.0 6 | jinja2==3.1.6 7 | opensearch-py==2.8.0 8 | sqlalchemy==2.0.40 9 | user-agents==2.2.0 10 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | amqp==5.3.1 \ 2 | --hash=sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2 \ 3 | --hash=sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432 4 | # via kombu 5 | billiard==4.2.1 \ 6 | --hash=sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f \ 7 | --hash=sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb 8 | # via celery 9 | blinker==1.9.0 \ 10 | --hash=sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf \ 11 | --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc 12 | # via 13 | # flask 14 | # flask-mail 15 | celery==5.5.2 \ 16 | --hash=sha256:4d6930f354f9d29295425d7a37261245c74a32807c45d764bedc286afd0e724e \ 17 | --hash=sha256:54425a067afdc88b57cd8d94ed4af2ffaf13ab8c7680041ac2c4ac44357bdf4c 18 | # via -r requirements.in 19 | certifi==2025.4.26 \ 20 | --hash=sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6 \ 21 | --hash=sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3 22 | # via 23 | # opensearch-py 24 | # requests 25 | charset-normalizer==3.4.2 \ 26 | --hash=sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4 \ 27 | --hash=sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45 \ 28 | --hash=sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7 \ 29 | --hash=sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0 \ 30 | --hash=sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7 \ 31 | --hash=sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d \ 32 | --hash=sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d \ 33 | --hash=sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0 \ 34 | --hash=sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184 \ 35 | --hash=sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db \ 36 | --hash=sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b \ 37 | --hash=sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64 \ 38 | --hash=sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b \ 39 | --hash=sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8 \ 40 | --hash=sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff \ 41 | --hash=sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344 \ 42 | --hash=sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58 \ 43 | --hash=sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e \ 44 | --hash=sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471 \ 45 | --hash=sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148 \ 46 | --hash=sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a \ 47 | --hash=sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836 \ 48 | --hash=sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e \ 49 | --hash=sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63 \ 50 | --hash=sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c \ 51 | --hash=sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1 \ 52 | --hash=sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01 \ 53 | --hash=sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366 \ 54 | --hash=sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58 \ 55 | --hash=sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5 \ 56 | --hash=sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c \ 57 | --hash=sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2 \ 58 | --hash=sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a \ 59 | --hash=sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597 \ 60 | --hash=sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b \ 61 | --hash=sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5 \ 62 | --hash=sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb \ 63 | --hash=sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f \ 64 | --hash=sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0 \ 65 | --hash=sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941 \ 66 | --hash=sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0 \ 67 | --hash=sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86 \ 68 | --hash=sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7 \ 69 | --hash=sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7 \ 70 | --hash=sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455 \ 71 | --hash=sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6 \ 72 | --hash=sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4 \ 73 | --hash=sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0 \ 74 | --hash=sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3 \ 75 | --hash=sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1 \ 76 | --hash=sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6 \ 77 | --hash=sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981 \ 78 | --hash=sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c \ 79 | --hash=sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980 \ 80 | --hash=sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645 \ 81 | --hash=sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7 \ 82 | --hash=sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12 \ 83 | --hash=sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa \ 84 | --hash=sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd \ 85 | --hash=sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef \ 86 | --hash=sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f \ 87 | --hash=sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2 \ 88 | --hash=sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d \ 89 | --hash=sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5 \ 90 | --hash=sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02 \ 91 | --hash=sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3 \ 92 | --hash=sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd \ 93 | --hash=sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e \ 94 | --hash=sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214 \ 95 | --hash=sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd \ 96 | --hash=sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a \ 97 | --hash=sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c \ 98 | --hash=sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681 \ 99 | --hash=sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba \ 100 | --hash=sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f \ 101 | --hash=sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a \ 102 | --hash=sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28 \ 103 | --hash=sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691 \ 104 | --hash=sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82 \ 105 | --hash=sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a \ 106 | --hash=sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027 \ 107 | --hash=sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7 \ 108 | --hash=sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518 \ 109 | --hash=sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf \ 110 | --hash=sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b \ 111 | --hash=sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9 \ 112 | --hash=sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544 \ 113 | --hash=sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da \ 114 | --hash=sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509 \ 115 | --hash=sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f \ 116 | --hash=sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a \ 117 | --hash=sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f 118 | # via requests 119 | click==8.1.8 \ 120 | --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 \ 121 | --hash=sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a 122 | # via 123 | # celery 124 | # click-didyoumean 125 | # click-plugins 126 | # click-repl 127 | # flask 128 | click-didyoumean==0.3.1 \ 129 | --hash=sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463 \ 130 | --hash=sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c 131 | # via celery 132 | click-plugins==1.1.1 \ 133 | --hash=sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b \ 134 | --hash=sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8 135 | # via celery 136 | click-repl==0.3.0 \ 137 | --hash=sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9 \ 138 | --hash=sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812 139 | # via celery 140 | events==0.5 \ 141 | --hash=sha256:a7286af378ba3e46640ac9825156c93bdba7502174dd696090fdfcd4d80a1abd 142 | # via opensearch-py 143 | flask==3.1.1 \ 144 | --hash=sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c \ 145 | --hash=sha256:284c7b8f2f58cb737f0cf1c30fd7eaf0ccfcde196099d24ecede3fc2005aa59e 146 | # via 147 | # -r requirements.in 148 | # flask-mail 149 | # flask-sqlalchemy 150 | flask-mail==0.10.0 \ 151 | --hash=sha256:44083e7b02bbcce792209c06252f8569dd5a325a7aaa76afe7330422bd97881d \ 152 | --hash=sha256:a451e490931bb3441d9b11ebab6812a16bfa81855792ae1bf9c1e1e22c4e51e7 153 | # via -r requirements.in 154 | flask-sqlalchemy==3.1.1 \ 155 | --hash=sha256:4ba4be7f419dc72f4efd8802d69974803c37259dd42f3913b0dcf75c9447e0a0 \ 156 | --hash=sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312 157 | # via -r requirements.in 158 | greenlet==3.2.1 \ 159 | --hash=sha256:04b4ec7f65f0e4a1500ac475c9343f6cc022b2363ebfb6e94f416085e40dea15 \ 160 | --hash=sha256:05a7490f74e8aabc5f29256765a99577ffde979920a2db1f3676d265a3adba41 \ 161 | --hash=sha256:063bcf7f8ee28eb91e7f7a8148c65a43b73fbdc0064ab693e024b5a940070145 \ 162 | --hash=sha256:0ba2811509a30e5f943be048895a983a8daf0b9aa0ac0ead526dfb5d987d80ea \ 163 | --hash=sha256:0c68bbc639359493420282d2f34fa114e992a8724481d700da0b10d10a7611b8 \ 164 | --hash=sha256:0ddda0197c5b46eedb5628d33dad034c455ae77708c7bf192686e760e26d6a0c \ 165 | --hash=sha256:175d583f7d5ee57845591fc30d852b75b144eb44b05f38b67966ed6df05c8526 \ 166 | --hash=sha256:17964c246d4f6e1327edd95e2008988a8995ae3a7732be2f9fc1efed1f1cdf8c \ 167 | --hash=sha256:1a750f1046994b9e038b45ae237d68153c29a3a783075211fb1414a180c8324b \ 168 | --hash=sha256:1c472adfca310f849903295c351d297559462067f618944ce2650a1878b84123 \ 169 | --hash=sha256:2273586879affca2d1f414709bb1f61f0770adcabf9eda8ef48fd90b36f15d12 \ 170 | --hash=sha256:24a496479bc8bd01c39aa6516a43c717b4cee7196573c47b1f8e1011f7c12495 \ 171 | --hash=sha256:2530bfb0abcd451ea81068e6d0a1aac6dabf3f4c23c8bd8e2a8f579c2dd60d95 \ 172 | --hash=sha256:3059c6f286b53ea4711745146ffe5a5c5ff801f62f6c56949446e0f6461f8157 \ 173 | --hash=sha256:3227c6ec1149d4520bc99edac3b9bc8358d0034825f3ca7572165cb502d8f29a \ 174 | --hash=sha256:374ffebaa5fbd10919cd599e5cf8ee18bae70c11f9d61e73db79826c8c93d6f9 \ 175 | --hash=sha256:3ecc9d33ca9428e4536ea53e79d781792cee114d2fa2695b173092bdbd8cd6d5 \ 176 | --hash=sha256:3f56382ac4df3860ebed8ed838f268f03ddf4e459b954415534130062b16bc32 \ 177 | --hash=sha256:4245246e72352b150a1588d43ddc8ab5e306bef924c26571aafafa5d1aaae4e8 \ 178 | --hash=sha256:4339b202ac20a89ccd5bde0663b4d00dc62dd25cb3fb14f7f3034dec1b0d9ece \ 179 | --hash=sha256:4818116e75a0dd52cdcf40ca4b419e8ce5cb6669630cb4f13a6c384307c9543f \ 180 | --hash=sha256:5193135b3a8d0017cb438de0d49e92bf2f6c1c770331d24aa7500866f4db4017 \ 181 | --hash=sha256:51a2f49da08cff79ee42eb22f1658a2aed60c72792f0a0a95f5f0ca6d101b1fb \ 182 | --hash=sha256:5c12f0d17a88664757e81a6e3fc7c2452568cf460a2f8fb44f90536b2614000b \ 183 | --hash=sha256:6079ae990bbf944cf66bea64a09dcb56085815630955109ffa98984810d71565 \ 184 | --hash=sha256:639a94d001fe874675b553f28a9d44faed90f9864dc57ba0afef3f8d76a18b04 \ 185 | --hash=sha256:64a4d0052de53ab3ad83ba86de5ada6aeea8f099b4e6c9ccce70fb29bc02c6a2 \ 186 | --hash=sha256:6dcc6d604a6575c6225ac0da39df9335cc0c6ac50725063fa90f104f3dbdb2c9 \ 187 | --hash=sha256:7132e024ebeeeabbe661cf8878aac5d2e643975c4feae833142592ec2f03263d \ 188 | --hash=sha256:72c9b668454e816b5ece25daac1a42c94d1c116d5401399a11b77ce8d883110c \ 189 | --hash=sha256:777c1281aa7c786738683e302db0f55eb4b0077c20f1dc53db8852ffaea0a6b0 \ 190 | --hash=sha256:7abc0545d8e880779f0c7ce665a1afc3f72f0ca0d5815e2b006cafc4c1cc5840 \ 191 | --hash=sha256:7b0f3a0a67786facf3b907a25db80efe74310f9d63cc30869e49c79ee3fcef7e \ 192 | --hash=sha256:852ef432919830022f71a040ff7ba3f25ceb9fe8f3ab784befd747856ee58530 \ 193 | --hash=sha256:8b89e5d44f55372efc6072f59ced5ed1efb7b44213dab5ad7e0caba0232c6545 \ 194 | --hash=sha256:8fe303381e7e909e42fb23e191fc69659910909fdcd056b92f6473f80ef18543 \ 195 | --hash=sha256:9afa05fe6557bce1642d8131f87ae9462e2a8e8c46f7ed7929360616088a3975 \ 196 | --hash=sha256:9f4dd4b4946b14bb3bf038f81e1d2e535b7d94f1b2a59fdba1293cd9c1a0a4d7 \ 197 | --hash=sha256:aa30066fd6862e1153eaae9b51b449a6356dcdb505169647f69e6ce315b9468b \ 198 | --hash=sha256:b38d53cf268da963869aa25a6e4cc84c1c69afc1ae3391738b2603d110749d01 \ 199 | --hash=sha256:b7503d6b8bbdac6bbacf5a8c094f18eab7553481a1830975799042f26c9e101b \ 200 | --hash=sha256:c07a0c01010df42f1f058b3973decc69c4d82e036a951c3deaf89ab114054c07 \ 201 | --hash=sha256:cb5ee928ce5fedf9a4b0ccdc547f7887136c4af6109d8f2fe8e00f90c0db47f5 \ 202 | --hash=sha256:cc45a7189c91c0f89aaf9d69da428ce8301b0fd66c914a499199cfb0c28420fc \ 203 | --hash=sha256:d6668caf15f181c1b82fb6406f3911696975cc4c37d782e19cb7ba499e556189 \ 204 | --hash=sha256:dbb4e1aa2000852937dd8f4357fb73e3911da426df8ca9b8df5db231922da474 \ 205 | --hash=sha256:de62b542e5dcf0b6116c310dec17b82bb06ef2ceb696156ff7bf74a7a498d982 \ 206 | --hash=sha256:e1967882f0c42eaf42282a87579685c8673c51153b845fde1ee81be720ae27ac \ 207 | --hash=sha256:e1a40a17e2c7348f5eee5d8e1b4fa6a937f0587eba89411885a36a8e1fc29bd2 \ 208 | --hash=sha256:e63cd2035f49376a23611fbb1643f78f8246e9d4dfd607534ec81b175ce582c2 \ 209 | --hash=sha256:e775176b5c203a1fa4be19f91da00fd3bff536868b77b237da3f4daa5971ae5d \ 210 | --hash=sha256:e77ae69032a95640a5fe8c857ec7bee569a0997e809570f4c92048691ce4b437 \ 211 | --hash=sha256:e934591a7a4084fa10ee5ef50eb9d2ac8c4075d5c9cf91128116b5dca49d43b1 \ 212 | --hash=sha256:e98328b8b8f160925d6b1c5b1879d8e64f6bd8cf11472b7127d579da575b77d9 \ 213 | --hash=sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22 214 | # via sqlalchemy 215 | gunicorn==23.0.0 \ 216 | --hash=sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d \ 217 | --hash=sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec 218 | # via -r requirements.in 219 | idna==3.10 \ 220 | --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ 221 | --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 222 | # via requests 223 | itsdangerous==2.2.0 \ 224 | --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef \ 225 | --hash=sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173 226 | # via flask 227 | jinja2==3.1.6 \ 228 | --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ 229 | --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 230 | # via 231 | # -r requirements.in 232 | # flask 233 | kombu==5.5.3 \ 234 | --hash=sha256:021a0e11fcfcd9b0260ef1fb64088c0e92beb976eb59c1dfca7ddd4ad4562ea2 \ 235 | --hash=sha256:5b0dbceb4edee50aa464f59469d34b97864be09111338cfb224a10b6a163909b 236 | # via celery 237 | markupsafe==3.0.2 \ 238 | --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \ 239 | --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \ 240 | --hash=sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0 \ 241 | --hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \ 242 | --hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \ 243 | --hash=sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13 \ 244 | --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \ 245 | --hash=sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca \ 246 | --hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \ 247 | --hash=sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 \ 248 | --hash=sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0 \ 249 | --hash=sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b \ 250 | --hash=sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579 \ 251 | --hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \ 252 | --hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \ 253 | --hash=sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff \ 254 | --hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \ 255 | --hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \ 256 | --hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \ 257 | --hash=sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb \ 258 | --hash=sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e \ 259 | --hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \ 260 | --hash=sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a \ 261 | --hash=sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d \ 262 | --hash=sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a \ 263 | --hash=sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b \ 264 | --hash=sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8 \ 265 | --hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \ 266 | --hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \ 267 | --hash=sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144 \ 268 | --hash=sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f \ 269 | --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \ 270 | --hash=sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d \ 271 | --hash=sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 \ 272 | --hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \ 273 | --hash=sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158 \ 274 | --hash=sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 \ 275 | --hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \ 276 | --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \ 277 | --hash=sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171 \ 278 | --hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \ 279 | --hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \ 280 | --hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \ 281 | --hash=sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d \ 282 | --hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \ 283 | --hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \ 284 | --hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \ 285 | --hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \ 286 | --hash=sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29 \ 287 | --hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \ 288 | --hash=sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798 \ 289 | --hash=sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c \ 290 | --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \ 291 | --hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \ 292 | --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \ 293 | --hash=sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a \ 294 | --hash=sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178 \ 295 | --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \ 296 | --hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \ 297 | --hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \ 298 | --hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50 299 | # via 300 | # flask 301 | # jinja2 302 | # werkzeug 303 | opensearch-py==2.8.0 \ 304 | --hash=sha256:52c60fdb5d4dcf6cce3ee746c13b194529b0161e0f41268b98ab8f1624abe2fa \ 305 | --hash=sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda 306 | # via -r requirements.in 307 | packaging==25.0 \ 308 | --hash=sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484 \ 309 | --hash=sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f 310 | # via gunicorn 311 | prompt-toolkit==3.0.51 \ 312 | --hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 \ 313 | --hash=sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed 314 | # via click-repl 315 | python-dateutil==2.9.0.post0 \ 316 | --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ 317 | --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 318 | # via 319 | # celery 320 | # opensearch-py 321 | requests==2.32.3 \ 322 | --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ 323 | --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 324 | # via opensearch-py 325 | six==1.17.0 \ 326 | --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ 327 | --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 328 | # via python-dateutil 329 | sqlalchemy==2.0.40 \ 330 | --hash=sha256:00a494ea6f42a44c326477b5bee4e0fc75f6a80c01570a32b57e89cf0fbef85a \ 331 | --hash=sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d \ 332 | --hash=sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2 \ 333 | --hash=sha256:15d08d5ef1b779af6a0909b97be6c1fd4298057504eb6461be88bd1696cb438e \ 334 | --hash=sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26 \ 335 | --hash=sha256:1abb387710283fc5983d8a1209d9696a4eae9db8d7ac94b402981fe2fe2e39ad \ 336 | --hash=sha256:1ffdf9c91428e59744f8e6f98190516f8e1d05eec90e936eb08b257332c5e870 \ 337 | --hash=sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0 \ 338 | --hash=sha256:2cbafc8d39ff1abdfdda96435f38fab141892dc759a2165947d1a8fffa7ef596 \ 339 | --hash=sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a \ 340 | --hash=sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a \ 341 | --hash=sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4 \ 342 | --hash=sha256:37a5c21ab099a83d669ebb251fddf8f5cee4d75ea40a5a1653d9c43d60e20867 \ 343 | --hash=sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a \ 344 | --hash=sha256:46628ebcec4f23a1584fb52f2abe12ddb00f3bb3b7b337618b80fc1b51177aff \ 345 | --hash=sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705 \ 346 | --hash=sha256:4aeb939bcac234b88e2d25d5381655e8353fe06b4e50b1c55ecffe56951d18c2 \ 347 | --hash=sha256:50f5885bbed261fc97e2e66c5156244f9704083a674b8d17f24c72217d29baf5 \ 348 | --hash=sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51 \ 349 | --hash=sha256:5434223b795be5c5ef8244e5ac98056e290d3a99bdcc539b916e282b160dda00 \ 350 | --hash=sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364 \ 351 | --hash=sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011 \ 352 | --hash=sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4 \ 353 | --hash=sha256:5cfa124eda500ba4b0d3afc3e91ea27ed4754e727c7f025f293a22f512bcd4c9 \ 354 | --hash=sha256:5ea9181284754d37db15156eb7be09c86e16e50fbe77610e9e7bee09291771a1 \ 355 | --hash=sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad \ 356 | --hash=sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1 \ 357 | --hash=sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716 \ 358 | --hash=sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0 \ 359 | --hash=sha256:7e0505719939e52a7b0c65d20e84a6044eb3712bb6f239c6b1db77ba8e173a37 \ 360 | --hash=sha256:8b6b28d303b9d57c17a5164eb1fd2d5119bb6ff4413d5894e74873280483eeb5 \ 361 | --hash=sha256:8bb131ffd2165fae48162c7bbd0d97c84ab961deea9b8bab16366543deeab625 \ 362 | --hash=sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01 \ 363 | --hash=sha256:9408fd453d5f8990405cc9def9af46bfbe3183e6110401b407c2d073c3388f47 \ 364 | --hash=sha256:957f8d85d5e834397ef78a6109550aeb0d27a53b5032f7a57f2451e1adc37e98 \ 365 | --hash=sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1 \ 366 | --hash=sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d \ 367 | --hash=sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500 \ 368 | --hash=sha256:a8aae085ea549a1eddbc9298b113cffb75e514eadbb542133dd2b99b5fb3b6af \ 369 | --hash=sha256:ae9597cab738e7cc823f04a704fb754a9249f0b6695a6aeb63b74055cd417a96 \ 370 | --hash=sha256:afe63b208153f3a7a2d1a5b9df452b0673082588933e54e7c8aac457cf35e758 \ 371 | --hash=sha256:b5a5bbe29c10c5bfd63893747a1bf6f8049df607638c786252cb9243b86b6706 \ 372 | --hash=sha256:baf7cee56bd552385c1ee39af360772fbfc2f43be005c78d1140204ad6148438 \ 373 | --hash=sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db \ 374 | --hash=sha256:bece9527f5a98466d67fb5d34dc560c4da964240d8b09024bb21c1246545e04e \ 375 | --hash=sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b \ 376 | --hash=sha256:c268b5100cfeaa222c40f55e169d484efa1384b44bf9ca415eae6d556f02cb08 \ 377 | --hash=sha256:c7b927155112ac858357ccf9d255dd8c044fd9ad2dc6ce4c4149527c901fa4c3 \ 378 | --hash=sha256:c884de19528e0fcd9dc34ee94c810581dd6e74aef75437ff17e696c2bfefae3e \ 379 | --hash=sha256:cd2f75598ae70bcfca9117d9e51a3b06fe29edd972fdd7fd57cc97b4dbf3b08a \ 380 | --hash=sha256:cf0e99cdb600eabcd1d65cdba0d3c91418fee21c4aa1d28db47d095b1064a7d8 \ 381 | --hash=sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00 \ 382 | --hash=sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191 \ 383 | --hash=sha256:f0fda83e113bb0fb27dc003685f32a5dcb99c9c4f41f4fa0838ac35265c23b5c \ 384 | --hash=sha256:f1ea21bef99c703f44444ad29c2c1b6bd55d202750b6de8e06a955380f4725d7 \ 385 | --hash=sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e \ 386 | --hash=sha256:fe147fcd85aaed53ce90645c91ed5fca0cc88a797314c70dfd9d35925bd5d106 387 | # via 388 | # -r requirements.in 389 | # flask-sqlalchemy 390 | typing-extensions==4.13.2 \ 391 | --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c \ 392 | --hash=sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef 393 | # via sqlalchemy 394 | tzdata==2025.2 \ 395 | --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 \ 396 | --hash=sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9 397 | # via kombu 398 | ua-parser==1.0.1 \ 399 | --hash=sha256:b059f2cb0935addea7e551251cbbf42e9a8872f86134163bc1a4f79e0945ffea \ 400 | --hash=sha256:f9d92bf19d4329019cef91707aecc23c6d65143ad7e29a233f0580fb0d15547d 401 | # via user-agents 402 | ua-parser-builtins==0.18.0.post1 \ 403 | --hash=sha256:eb4f93504040c3a990a6b0742a2afd540d87d7f9f05fd66e94c101db1564674d 404 | # via ua-parser 405 | urllib3==2.4.0 \ 406 | --hash=sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466 \ 407 | --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 408 | # via 409 | # opensearch-py 410 | # requests 411 | user-agents==2.2.0 \ 412 | --hash=sha256:a98c4dc72ecbc64812c4534108806fb0a0b3a11ec3fd1eafe807cee5b0a942e7 \ 413 | --hash=sha256:d36d25178db65308d1458c5fa4ab39c9b2619377010130329f3955e7626ead26 414 | # via -r requirements.in 415 | vine==5.1.0 \ 416 | --hash=sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc \ 417 | --hash=sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0 418 | # via 419 | # amqp 420 | # celery 421 | # kombu 422 | wcwidth==0.2.13 \ 423 | --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 \ 424 | --hash=sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5 425 | # via prompt-toolkit 426 | werkzeug==3.1.3 \ 427 | --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e \ 428 | --hash=sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746 429 | # via flask 430 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openculinary/api/71c2adadc094f6e91ff19bc0d9341eb685dd3760/tests/__init__.py -------------------------------------------------------------------------------- /tests/api/test_autosuggest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | 4 | @pytest.mark.parametrize( 5 | "prefix", 6 | [ 7 | None, 8 | "", 9 | "a", 10 | "0", 11 | "1", 12 | "test" * 25, 13 | ], 14 | ) 15 | def test_autosuggest_equipment_invalid_prefix(client, prefix): 16 | url = "/autosuggest/equipment" + (f"?pre={prefix}" if prefix else "") 17 | response = client.get(url) 18 | assert response.status_code == 400 19 | 20 | 21 | @pytest.mark.parametrize( 22 | "prefix", 23 | [ 24 | None, 25 | "", 26 | "a", 27 | "0", 28 | "1", 29 | "test" * 25, 30 | ], 31 | ) 32 | def test_autosuggest_ingredients_invalid_prefix(client, prefix): 33 | url = "/autosuggest/ingredients" + (f"?pre={prefix}" if prefix else "") 34 | response = client.get(url) 35 | assert response.status_code == 400 36 | -------------------------------------------------------------------------------- /tests/api/test_feedback.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import patch 2 | 3 | from reciperadar.models.feedback import Feedback 4 | 5 | 6 | @patch.object(Feedback, "distribute") 7 | def test_feedback(distribute, client): 8 | response = client.post( 9 | path="/feedback", 10 | json=[ 11 | {}, 12 | "data:image/png;base64,", 13 | ], 14 | ) 15 | 16 | assert response.status_code == 200 17 | assert distribute.call_arg 18 | 19 | 20 | @patch.object(Feedback, "distribute") 21 | def test_feedback_invalid_uri(distribute, client): 22 | response = client.post( 23 | path="/feedback", 24 | json=[ 25 | {}, 26 | "http://example.test", 27 | ], 28 | ) 29 | 30 | assert response.status_code == 400 31 | assert not distribute.called 32 | -------------------------------------------------------------------------------- /tests/api/test_recipes.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import patch 2 | 3 | import pytest 4 | 5 | from reciperadar.api.recipes import Feedback 6 | from reciperadar.models.recipes import Recipe 7 | from reciperadar.search.recipes import RecipeSearch 8 | from reciperadar.search.base import EntityClause 9 | 10 | 11 | @patch.object(RecipeSearch, "query") 12 | def test_search_invalid_sort(query, client): 13 | response = client.get( 14 | path="/recipes/search", 15 | query_string={"sort": "invalid"}, 16 | ) 17 | 18 | assert response.status_code == 400 19 | assert not query.called 20 | 21 | 22 | @patch("reciperadar.api.recipes.recrawl_search.delay") 23 | @patch("reciperadar.api.recipes.store_event") 24 | @patch("reciperadar.search.recipes.load_ingredient_synonyms") 25 | @patch("reciperadar.search.base.QueryRepository.es.search") 26 | def test_search_empty_query(search, synonyms, store, recrawl, client, raw_recipe_hit): 27 | hits = [raw_recipe_hit] 28 | total = len(hits) 29 | search.return_value = { 30 | "hits": {"hits": hits, "total": {"value": total}}, 31 | "aggregations": { 32 | "prefilter": { 33 | "doc_count": 0, 34 | "domains": {"buckets": []}, 35 | } 36 | }, 37 | } 38 | synonyms.return_value = {} 39 | 40 | response = client.get("/recipes/search") 41 | 42 | assert response.status_code == 200 43 | assert "refinements" in response.json 44 | assert "empty_query" in response.json["refinements"] 45 | assert "domains" in response.json["facets"] 46 | 47 | 48 | @patch("reciperadar.api.recipes.recrawl_search.delay") 49 | @patch("reciperadar.api.recipes.store_event") 50 | @patch("reciperadar.search.recipes.load_ingredient_synonyms") 51 | @patch("reciperadar.search.recipes.RecipeSearch.query") 52 | def test_search_simple_query(query, synonyms, store, recrawl, client, raw_recipe_hit): 53 | query.return_value = { 54 | "authority": "api", 55 | "total": 0, 56 | "results": [], 57 | "facets": {"domains": []}, 58 | "refinements": [], 59 | } 60 | synonyms.return_value = {} 61 | 62 | response = client.get("/recipes/search?ingredients[]=tomato&ingredients[]=-tomato") 63 | 64 | assert response.status_code == 200 65 | assert "refinements" in response.json 66 | assert "domains" in response.json["facets"] 67 | 68 | expected_clauses = [ 69 | EntityClause(term="tomato", positive=True), 70 | EntityClause(term="tomato", positive=False), 71 | ] 72 | assert query.call_args[1]["ingredients"] == expected_clauses 73 | 74 | 75 | @patch("werkzeug.datastructures.Headers.get") 76 | @patch("reciperadar.api.recipes.recrawl_search.delay") 77 | @patch("reciperadar.api.recipes.store_event") 78 | @patch.object(RecipeSearch, "query") 79 | def test_search_user_agent_optional(query, store, recrawl, get, client): 80 | query.return_value = {"results": [], "total": 0} 81 | get.return_value = None 82 | 83 | response = client.get("/recipes/search", headers={"user-agent": None}) 84 | 85 | assert response.status_code == 200 86 | 87 | 88 | @patch("reciperadar.api.recipes.recrawl_search.delay") 89 | @patch("reciperadar.api.recipes.store_event") 90 | @patch.object(RecipeSearch, "query") 91 | def test_search_recrawling(query, store, recrawl, client): 92 | query.return_value = {"results": [], "total": 0} 93 | 94 | response = client.get("/recipes/search", headers={"user-agent": None}) 95 | 96 | assert response.status_code == 200 97 | assert recrawl.called is True 98 | 99 | 100 | @patch("reciperadar.api.recipes.recrawl_search.delay") 101 | @patch("reciperadar.api.recipes.store_event.delay") 102 | @patch.object(RecipeSearch, "query") 103 | def test_bot_search(query, store, recrawl, client): 104 | query.return_value = {"results": [], "total": 0} 105 | 106 | user_agent = ( 107 | "Mozilla/5.0+", 108 | "(compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)", 109 | ) 110 | client.get("/recipes/search", headers={"user-agent": user_agent}) 111 | 112 | assert store.called 113 | assert store.call_args[1]["event_data"]["suspected_bot"] is True 114 | 115 | 116 | @patch.object(Feedback, "register_report") 117 | @patch.object(Recipe, "get_by_id") 118 | @pytest.mark.parametrize( 119 | "report_data", 120 | [ 121 | # missing report type 122 | {"recipe-id": "recipe_id_0", "result-index": 0}, 123 | # non-integer index 124 | { 125 | "recipe-id": "recipe_id_0", 126 | "report-type": "unsafe-content", 127 | "result-index": "", 128 | }, 129 | # invalid report type 130 | {"recipe-id": "recipe_id_0", "report-type": "invalid", "result-index": 0}, 131 | ], 132 | ) 133 | def test_invalid_problem_report(get_recipe_by_id, report, client, report_data): 134 | recipe = Recipe(id="example_id", domain="example.test", dst="http://example.test") 135 | get_recipe_by_id.return_value = recipe 136 | 137 | response = client.post( 138 | path="/recipes/report", 139 | headers={"Content-Type": "application/json"}, 140 | data=report_data, 141 | ) 142 | 143 | assert not report.called 144 | assert response.status_code == 400 145 | 146 | 147 | @patch.object(Feedback, "register_report") 148 | @patch.object(Recipe, "get_by_id") 149 | def test_unsafe_content_report(get_recipe_by_id, register_report, client): 150 | recipe = Recipe(id="example_id", domain="example.test", dst="http://example.test") 151 | get_recipe_by_id.return_value = recipe 152 | 153 | report_data = { 154 | "recipe-id": "test_recipe_id", 155 | "report-type": "unsafe-content", 156 | "result-index": 0, 157 | } 158 | response = client.post( 159 | path="/recipes/report", 160 | data=report_data, 161 | ) 162 | 163 | assert register_report.called 164 | assert response.status_code == 200 165 | -------------------------------------------------------------------------------- /tests/api/test_redirect.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import call, patch 2 | 3 | from reciperadar.models.recipes import Recipe 4 | 5 | 6 | def _expected_redirect_call(recipe, suspected_bot=False): 7 | return call( 8 | event_table="redirects", 9 | event_data={ 10 | "suspected_bot": suspected_bot, 11 | "recipe_id": recipe.id, 12 | "domain": recipe.domain, 13 | "dst": recipe.dst, 14 | }, 15 | ) 16 | 17 | 18 | @patch("reciperadar.api.recipes.store_event.delay") 19 | @patch.object(Recipe, "get_by_id") 20 | def test_redirect_retrieval(get_recipe_by_id, store_event, client): 21 | recipe = Recipe(id="example_id", domain="example.test", dst="http://example.test") 22 | get_recipe_by_id.return_value = recipe 23 | 24 | response = client.get( 25 | path="/redirect/recipe/example_id", 26 | headers={"Referer": "http://example.test/origin"}, 27 | ) 28 | 29 | assert response.status_code == 301 30 | assert response.location == recipe.dst 31 | assert store_event.call_args == _expected_redirect_call(recipe, suspected_bot=True) 32 | 33 | 34 | @patch("reciperadar.api.recipes.is_suspected_bot") 35 | @patch("reciperadar.api.recipes.store_event.delay") 36 | @patch.object(Recipe, "get_by_id") 37 | def test_redirect_ping(get_recipe_by_id, store_event, is_suspected_bot, client): 38 | recipe = Recipe(id="example_id", domain="example.test", dst="http://example.test") 39 | get_recipe_by_id.return_value = recipe 40 | is_suspected_bot.return_value = False 41 | 42 | response = client.post( 43 | path="/redirect/recipe/example_id", 44 | data={ 45 | "Ping-From": "http://example.test/origin", 46 | "Ping-To": recipe.dst, 47 | }, 48 | ) 49 | 50 | assert response.status_code == 200 51 | assert store_event.call_args == _expected_redirect_call(recipe) 52 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | from reciperadar import app 4 | 5 | 6 | @pytest.fixture 7 | def client(): 8 | yield app.test_client() 9 | 10 | 11 | @pytest.fixture 12 | def raw_recipe_hit(): 13 | return { 14 | "_index": "recipes", 15 | "_type": "recipe", 16 | "_id": "random-id", 17 | "_score": 10.04635, 18 | "_source": { 19 | "id": "recipe_id_0", 20 | "title": "Test Recipe", 21 | "directions": [ 22 | { 23 | "id": "direction_id_0", 24 | "index": 0, 25 | "description": "place each skewer in the oven", 26 | "markup": ( 27 | "place each " 28 | # "skewer in the " 29 | # "oven" 30 | "skewer in the " 31 | "oven" 32 | ), 33 | } 34 | ], 35 | "ingredients": [ 36 | { 37 | "id": "ingredient_id_0", 38 | "index": 0, 39 | "description": "1 unit of test ingredient one", 40 | "product": { 41 | "singular": "one", 42 | "plural": "ones", 43 | "contents": [ 44 | "ancestor-of-one", 45 | "content-of-one", 46 | "one", 47 | ], 48 | }, 49 | "product_is_plural": False, 50 | "product_name": "one", 51 | "nutrition": { 52 | "id": "nutrition_id_0", 53 | "carbohydrates": 0, 54 | "carbohydrates_units": "g", 55 | "energy": 0, 56 | "energy_units": "cal", 57 | "fat": 0.01, 58 | "fat_units": "g", 59 | "fibre": 0.65, 60 | "fibre_units": "g", 61 | "protein": 0.05, 62 | "protein_units": "g", 63 | }, 64 | }, 65 | { 66 | "id": "ingredient_id_1", 67 | "index": 1, 68 | "description": "two units of test ingredient two", 69 | "product": {"singular": "two"}, 70 | "product_is_plural": False, 71 | "product_name": "two", 72 | }, 73 | ], 74 | "author": "example", 75 | "time": 30, 76 | "src": "http://www.example.test/recipes/test", 77 | "dst": "https://www.example.test/recipes/test", 78 | "domain": "example.test", 79 | "servings": 2, 80 | "rating": 4.5, 81 | "indexed_at": "1970-01-01T01:02:03.456789", 82 | "nutrition": { 83 | "carbohydrates": 0, 84 | "carbohydrates_units": "g", 85 | "energy": 0, 86 | "energy_units": "cal", 87 | "fat": 0.01, 88 | "fat_units": "g", 89 | "fibre": 0.65, 90 | "fibre_units": "g", 91 | "protein": 0.05, 92 | "protein_units": "g", 93 | }, 94 | "is_vegetarian": True, 95 | }, 96 | "inner_hits": {"ingredients": {"hits": {"hits": []}}}, 97 | } 98 | -------------------------------------------------------------------------------- /tests/models/recipes/test_recipe.py: -------------------------------------------------------------------------------- 1 | from reciperadar.models.recipes import Recipe 2 | 3 | 4 | def test_recipe_from_doc(raw_recipe_hit): 5 | recipe = Recipe().from_doc(raw_recipe_hit["_source"]) 6 | assert recipe.author == "example" 7 | assert recipe.is_vegetarian 8 | 9 | # assert recipe.directions[0].appliances[0].appliance == "oven" 10 | # assert recipe.directions[0].utensils[0].utensil == "skewer" 11 | 12 | assert recipe.ingredients[0].product.singular == "one" 13 | expected_contents = ["one", "content-of-one", "ancestor-of-one"] 14 | actual_contents = recipe.ingredients[0].product.contents 15 | 16 | assert all([content in actual_contents for content in expected_contents]) 17 | 18 | assert recipe.nutrition.carbohydrates == 0 19 | assert recipe.nutrition.fibre == 0.65 20 | 21 | assert "nutrition" not in recipe.ingredients[0].to_dict() 22 | assert "is_vegetarian" in recipe.to_dict() 23 | 24 | assert recipe.nutrition.to_dict() == { 25 | "carbohydrates": {"magnitude": 0, "units": "g"}, 26 | "energy": {"magnitude": 0, "units": "cal"}, 27 | "fat": {"magnitude": 0.01, "units": "g"}, 28 | "fibre": {"magnitude": 0.65, "units": "g"}, 29 | "protein": {"magnitude": 0.05, "units": "g"}, 30 | } 31 | 32 | assert not recipe.is_gluten_free 33 | assert not recipe.is_vegan 34 | assert recipe.is_vegetarian 35 | 36 | 37 | def test_nutrition_source(raw_recipe_hit): 38 | recipe = Recipe().from_doc(raw_recipe_hit["_source"]) 39 | doc = recipe.to_dict() 40 | 41 | assert recipe.nutrition is not None 42 | assert "nutrition" in doc 43 | assert doc["nutrition"] is None 44 | -------------------------------------------------------------------------------- /tests/models/test_feedback_model.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import MagicMock, patch 2 | 3 | import pytest 4 | 5 | from reciperadar.models.feedback import Correction, Feedback, RemovalRequest 6 | from reciperadar.models.recipes import Recipe 7 | 8 | 9 | @pytest.fixture 10 | def reported_recipe(): 11 | return Recipe( 12 | id="test_recipe_id", 13 | title="marvellous recipe", 14 | domain="example.test", 15 | dst="http://example.test", 16 | ) 17 | 18 | 19 | @patch.object(Feedback, "_construct") 20 | def test_feedback(construct, reported_recipe): 21 | construct.return_value = MagicMock() 22 | report = RemovalRequest( 23 | recipe_id=reported_recipe.id, 24 | report_type="removal_request", 25 | result_index=0, 26 | content_owner_email="webmaster@example.test", 27 | ) 28 | Feedback.register_report(reported_recipe, report) 29 | 30 | subject, sender, recipients, html = ( 31 | construct.call_args.kwargs.get(field) 32 | for field in ("subject", "sender", "recipients", "html") 33 | ) 34 | assert subject == "Content report: removal_request: test_recipe_id" 35 | assert sender == "contact@reciperadar.com" 36 | assert recipients == ["content-reports@reciperadar.com"] 37 | assert "recipe removal request" in html 38 | assert "https://www.reciperadar.com/#action=view&id=test_recipe_id" in html 39 | assert '' in html 40 | 41 | 42 | @patch.object(Feedback, "_construct") 43 | def test_feedback_html_escaping(construct, reported_recipe): 44 | construct.return_value = MagicMock() 45 | report = Correction( 46 | recipe_id=reported_recipe.id, 47 | report_type="correction", 48 | result_index=0, 49 | content_expected="", 50 | content_found="", 51 | ) 52 | Feedback.register_report(reported_recipe, report) 53 | 54 | subject, sender, recipients, html = ( 55 | construct.call_args.kwargs.get(field) 56 | for field in ("subject", "sender", "recipients", "html") 57 | ) 58 | assert subject == "Content report: correction: test_recipe_id" 59 | assert sender == "contact@reciperadar.com" 60 | assert recipients == ["content-reports@reciperadar.com"] 61 | assert "