From 1f276e515c5cd848c76a8f9cb1618325dfdbaae4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:44:00 +0000 Subject: [PATCH 001/113] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/commitizen-tools/commitizen: v3.29.0 → v3.29.1](https://github.com/commitizen-tools/commitizen/compare/v3.29.0...v3.29.1) - [github.com/astral-sh/ruff-pre-commit: v0.6.7 → v0.6.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.6.7...v0.6.8) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 84de2c11..8c51c413 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -79,7 +79,7 @@ repos: # Versioning: Commit messages & changelog - repo: https://github.com/commitizen-tools/commitizen - rev: v3.29.0 + rev: v3.29.1 hooks: - id: commitizen stages: [commit-msg] @@ -87,7 +87,7 @@ repos: # Lint / autoformat: Python code - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: "v0.6.7" + rev: "v0.6.8" hooks: # Run the linter - id: ruff From 62ce7cee5d11191b18b283457afc000ec2504455 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 09:35:40 +0545 Subject: [PATCH 002/113] feat: added updated at field in task events table --- src/backend/app/db/db_models.py | 1 + .../app/migrations/versions/b4338a93f7bb_.py | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/backend/app/migrations/versions/b4338a93f7bb_.py diff --git a/src/backend/app/db/db_models.py b/src/backend/app/db/db_models.py index ac2ddb9a..009e6de4 100644 --- a/src/backend/app/db/db_models.py +++ b/src/backend/app/db/db_models.py @@ -217,6 +217,7 @@ class TaskEvent(Base): Index("idx_task_event_composite", "task_id", "project_id"), Index("idx_task_event_project_id_user_id", "user_id", "project_id"), ) + updated_at = cast(datetime, Column(DateTime, nullable=True )) class Drone(Base): diff --git a/src/backend/app/migrations/versions/b4338a93f7bb_.py b/src/backend/app/migrations/versions/b4338a93f7bb_.py new file mode 100644 index 00000000..4de361f3 --- /dev/null +++ b/src/backend/app/migrations/versions/b4338a93f7bb_.py @@ -0,0 +1,30 @@ +""" + +Revision ID: b4338a93f7bb +Revises: aec0d408df01 +Create Date: 2024-10-01 03:44:03.666090 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'b4338a93f7bb' +down_revision: Union[str, None] = 'aec0d408df01' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('task_events', sa.Column('updated_at', sa.DateTime(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('task_events', 'updated_at') + # ### end Alembic commands ### From fb5c465aa5d9cdb36e2ad976afb834f3c51d8346 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 10:06:55 +0545 Subject: [PATCH 003/113] fix: handle exception if project not found in db --- src/backend/app/db/db_models.py | 2 +- .../app/migrations/versions/b4338a93f7bb_.py | 9 +++++---- src/backend/app/projects/project_routes.py | 9 +++++---- src/backend/app/projects/project_schemas.py | 20 +++++++++++++------ src/backend/app/users/user_schemas.py | 1 + 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/backend/app/db/db_models.py b/src/backend/app/db/db_models.py index 009e6de4..8a38d19f 100644 --- a/src/backend/app/db/db_models.py +++ b/src/backend/app/db/db_models.py @@ -217,7 +217,7 @@ class TaskEvent(Base): Index("idx_task_event_composite", "task_id", "project_id"), Index("idx_task_event_project_id_user_id", "user_id", "project_id"), ) - updated_at = cast(datetime, Column(DateTime, nullable=True )) + updated_at = cast(datetime, Column(DateTime, nullable=True)) class Drone(Base): diff --git a/src/backend/app/migrations/versions/b4338a93f7bb_.py b/src/backend/app/migrations/versions/b4338a93f7bb_.py index 4de361f3..82ff6244 100644 --- a/src/backend/app/migrations/versions/b4338a93f7bb_.py +++ b/src/backend/app/migrations/versions/b4338a93f7bb_.py @@ -5,6 +5,7 @@ Create Date: 2024-10-01 03:44:03.666090 """ + from typing import Sequence, Union from alembic import op @@ -12,19 +13,19 @@ # revision identifiers, used by Alembic. -revision: str = 'b4338a93f7bb' -down_revision: Union[str, None] = 'aec0d408df01' +revision: str = "b4338a93f7bb" +down_revision: Union[str, None] = "aec0d408df01" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.add_column('task_events', sa.Column('updated_at', sa.DateTime(), nullable=True)) + op.add_column("task_events", sa.Column("updated_at", sa.DateTime(), nullable=True)) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('task_events', 'updated_at') + op.drop_column("task_events", "updated_at") # ### end Alembic commands ### diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index f6f4e0cc..dbef209f 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -152,13 +152,14 @@ async def delete_project_by_id( HTTPException: If the project is not found. """ user_id = user_data.id - project_id = await project_schemas.DbProject.delete(db, project.id, user_id) - if not project_id: + + # Allow deletion if the user is the project creator or a superuser + if project.author_id != user_id and not user_data.is_superuser: raise HTTPException( status_code=HTTPStatus.FORBIDDEN, - detail="Project not found or user not authorized to delete it.", + detail="User not authorized to delete this project.", ) - + project_id = await project_schemas.DbProject.delete(db, project.id) return {"message": f"Project successfully deleted {project_id}"} diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index b06b4dc6..219eca16 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -204,6 +204,12 @@ async def one(db: Connection, project_id: uuid.UUID): ) project_record = await cur.fetchone() + if not project_record: + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, + detail=f"Project with ID {project_id} not found.", + ) + async with db.cursor(row_factory=class_row(TaskOut)) as cur: await cur.execute( """ @@ -395,12 +401,12 @@ async def create(db: Connection, project: ProjectIn, user_id: str) -> uuid.UUID: return new_project_id[0] @staticmethod - async def delete(db: Connection, project_id: uuid.UUID, user_id: str) -> uuid.UUID: - """Delete a single project.""" + async def delete(db: Connection, project_id: uuid.UUID) -> uuid.UUID: + """Delete a single project if the user is the author or a superuser.""" sql = """ WITH deleted_project AS ( DELETE FROM projects - WHERE id = %(project_id)s AND author_id = %(user_id)s + WHERE id = %(project_id)s RETURNING id ), deleted_tasks AS ( DELETE FROM tasks @@ -415,13 +421,15 @@ async def delete(db: Connection, project_id: uuid.UUID, user_id: str) -> uuid.UU """ async with db.cursor() as cur: - await cur.execute(sql, {"project_id": project_id, "user_id": user_id}) + await cur.execute(sql, {"project_id": project_id}) deleted_project_id = await cur.fetchone() if not deleted_project_id: log.warning(f"Failed to delete project ({project_id})") - raise HTTPException(status_code=HTTPStatus.NOT_FOUND) - + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, + detail="User not authorized to delete it.", + ) return deleted_project_id[0] diff --git a/src/backend/app/users/user_schemas.py b/src/backend/app/users/user_schemas.py index 63c26df9..676cf601 100644 --- a/src/backend/app/users/user_schemas.py +++ b/src/backend/app/users/user_schemas.py @@ -20,6 +20,7 @@ class AuthUser(BaseModel): email: EmailStr name: str profile_img: Optional[str] = None + is_superuser: bool = False class UserBase(BaseModel): From b9a78af80dc6f7a460c13b1fa7c126ae05d717bc Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 10:13:35 +0545 Subject: [PATCH 004/113] feat(user-profile): pass watch on form props --- src/frontend/src/views/UserProfile/index.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/views/UserProfile/index.tsx b/src/frontend/src/views/UserProfile/index.tsx index b634306e..41ca6bbf 100644 --- a/src/frontend/src/views/UserProfile/index.tsx +++ b/src/frontend/src/views/UserProfile/index.tsx @@ -78,15 +78,17 @@ const UserProfile = () => { role: isDroneOperator ? 2 : 1, }; - const { register, setValue, handleSubmit, formState, control } = useForm({ - defaultValues: initialState, - }); + const { register, setValue, handleSubmit, formState, control, watch } = + useForm({ + defaultValues: initialState, + }); const formProps = { register, setValue, formState, control, + watch, }; const { mutate: updateUserProfile } = useMutation({ From d259bce7ecfecc31e788eb487bbc205bd7884188 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 10:15:47 +0545 Subject: [PATCH 005/113] fix(user-profile)-#209: able to submit if the password and confirm password not matched --- .../UserProfile/FormContents/Password/index.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/UserProfile/FormContents/Password/index.tsx b/src/frontend/src/components/UserProfile/FormContents/Password/index.tsx index d9537971..2bf16355 100644 --- a/src/frontend/src/components/UserProfile/FormContents/Password/index.tsx +++ b/src/frontend/src/components/UserProfile/FormContents/Password/index.tsx @@ -3,7 +3,9 @@ import { FormControl, Input, Label } from '@Components/common/FormUI'; import { Flex, FlexColumn } from '@Components/common/Layouts'; export default function PasswordSection({ formProps }: { formProps: any }) { - const { register, formState } = formProps; + const { register, formState, watch } = formProps; + + const password = watch('password'); return (
@@ -33,7 +35,9 @@ export default function PasswordSection({ formProps }: { formProps: any }) { className="naxatw-mt-1" placeholder="Enter confirm Password" {...register('confirm_password', { - required: 'Confirm Password is Required', + validate: (value: string) => + value === password || 'The passwords do not match', + // required: 'Confirm Password is Required', })} /> From 9b6f57c86ee7fc3e2ad508e5e5e57681a70931b4 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 10:22:40 +0545 Subject: [PATCH 006/113] fix(user-profile)-#208: validation issue --- .../UserProfile/FormContents/BasicDetails/index.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/frontend/src/components/UserProfile/FormContents/BasicDetails/index.tsx b/src/frontend/src/components/UserProfile/FormContents/BasicDetails/index.tsx index dcbe178b..8e9b0973 100644 --- a/src/frontend/src/components/UserProfile/FormContents/BasicDetails/index.tsx +++ b/src/frontend/src/components/UserProfile/FormContents/BasicDetails/index.tsx @@ -59,6 +59,7 @@ export default function BasicDetails({ formProps }: { formProps: any }) { placeholder="Enter City" className="naxatw-mt-1" {...register('city', { + setValueAs: (value: string) => value.trim(), required: 'City is Required', })} /> @@ -80,6 +81,10 @@ export default function BasicDetails({ formProps }: { formProps: any }) { type="number" {...register('phone_number', { required: 'Phone Number is Required', + minLength: { + value: 5, + message: 'Invalid Phone Number', + }, })} /> From e77a20fb80070a2e1a9c3c6a767d25d3a72406b5 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 10:36:37 +0545 Subject: [PATCH 007/113] feat: added updated_at field when user request, lock, unlock task --- src/backend/app/tasks/task_logic.py | 12 +++++++++--- src/backend/app/tasks/task_routes.py | 9 +++++++++ src/backend/app/tasks/task_schemas.py | 3 +++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/backend/app/tasks/task_logic.py b/src/backend/app/tasks/task_logic.py index e8bff3da..398a67b2 100644 --- a/src/backend/app/tasks/task_logic.py +++ b/src/backend/app/tasks/task_logic.py @@ -4,6 +4,7 @@ from app.models.enums import HTTPStatus, State from fastapi import HTTPException from psycopg.rows import dict_row +from datetime import datetime async def update_take_off_point_in_db( @@ -88,6 +89,7 @@ async def update_task_state( comment: str, initial_state: State, final_state: State, + updated_at: datetime, ): async with db.cursor(row_factory=dict_row) as cur: await cur.execute( @@ -104,8 +106,8 @@ async def update_task_state( FROM last WHERE user_id = %(user_id)s AND state = %(initial_state)s ) - INSERT INTO task_events(event_id, project_id, task_id, user_id, state, comment, created_at) - SELECT gen_random_uuid(), project_id, task_id, user_id, %(final_state)s, %(comment)s, now() + INSERT INTO task_events(event_id, project_id, task_id, user_id, state, comment, updated_at, created_at) + SELECT gen_random_uuid(), project_id, task_id, user_id, %(final_state)s, %(comment)s, %(updated_at)s, now() FROM last WHERE user_id = %(user_id)s RETURNING project_id, task_id, comment; @@ -117,6 +119,7 @@ async def update_task_state( "comment": comment, "initial_state": initial_state.name, "final_state": final_state.name, + "updated_at": updated_at, }, ) result = await cur.fetchone() @@ -131,6 +134,7 @@ async def request_mapping( comment: str, initial_state: State, final_state: State, + updated_at: datetime, ): async with db.cursor(row_factory=dict_row) as cur: await cur.execute( @@ -147,7 +151,7 @@ async def request_mapping( FROM task_events WHERE project_id= %(project_id)s AND task_id= %(task_id)s AND state = %(unlocked_to_map_state)s ) - INSERT INTO task_events (event_id, project_id, task_id, user_id, comment, state, created_at) + INSERT INTO task_events (event_id, project_id, task_id, user_id, comment, state, updated_at, created_at) SELECT gen_random_uuid(), @@ -156,6 +160,7 @@ async def request_mapping( %(user_id)s, %(comment)s, %(request_for_map_state)s, + %(updated_at)s, now() FROM last RIGHT JOIN released ON true @@ -169,6 +174,7 @@ async def request_mapping( "comment": comment, "unlocked_to_map_state": initial_state.name, "request_for_map_state": final_state.name, + "updated_at": updated_at, }, ) result = await cur.fetchone() diff --git a/src/backend/app/tasks/task_routes.py b/src/backend/app/tasks/task_routes.py index aca4e1fb..75b4bb60 100644 --- a/src/backend/app/tasks/task_routes.py +++ b/src/backend/app/tasks/task_routes.py @@ -199,6 +199,7 @@ async def new_event( message, State.UNLOCKED_TO_MAP, state_after, + detail.updated_at, ) # Send email notification if approval is required if state_after == State.REQUEST_FOR_MAPPING: @@ -272,6 +273,7 @@ async def new_event( "Request accepted for mapping", State.REQUEST_FOR_MAPPING, State.LOCKED_FOR_MAPPING, + detail.updated_at, ) case EventType.REJECTED: @@ -318,6 +320,7 @@ async def new_event( "Request for mapping rejected", State.REQUEST_FOR_MAPPING, State.UNLOCKED_TO_MAP, + detail.updated_at, ) case EventType.FINISH: return await task_logic.update_task_state( @@ -328,6 +331,7 @@ async def new_event( "Done: unlocked to validate", State.LOCKED_FOR_MAPPING, State.UNLOCKED_TO_VALIDATE, + detail.updated_at, ) case EventType.VALIDATE: return task_logic.update_task_state( @@ -338,6 +342,7 @@ async def new_event( "Done: locked for validation", State.UNLOCKED_TO_VALIDATE, State.LOCKED_FOR_VALIDATION, + detail.updated_at, ) case EventType.GOOD: return await task_logic.update_task_state( @@ -348,6 +353,7 @@ async def new_event( "Done: Task is Good", State.LOCKED_FOR_VALIDATION, State.UNLOCKED_DONE, + detail.updated_at, ) case EventType.BAD: @@ -359,6 +365,7 @@ async def new_event( "Done: needs to redo", State.LOCKED_FOR_VALIDATION, State.UNLOCKED_TO_MAP, + detail.updated_at, ) case EventType.COMMENT: return await task_logic.update_task_state( @@ -369,6 +376,7 @@ async def new_event( detail.comment, State.LOCKED_FOR_MAPPING, State.UNFLYABLE_TASK, + detail.updated_at, ) case EventType.UNLOCK: @@ -401,6 +409,7 @@ async def new_event( f"Task has been unlock by user {user_data.name}.", State.LOCKED_FOR_MAPPING, State.UNLOCKED_TO_MAP, + detail.updated_at, ) return True diff --git a/src/backend/app/tasks/task_schemas.py b/src/backend/app/tasks/task_schemas.py index 596e75b0..3d1ae17a 100644 --- a/src/backend/app/tasks/task_schemas.py +++ b/src/backend/app/tasks/task_schemas.py @@ -12,6 +12,7 @@ class NewEvent(BaseModel): event: EventType comment: Optional[str] = None + updated_at: Optional[datetime] = None class Task(BaseModel): @@ -150,6 +151,7 @@ class UserTasksStatsOut(BaseModel): project_id: uuid.UUID project_task_index: int project_name: str + updated_at: Optional[datetime] @staticmethod async def get_tasks_by_user( @@ -164,6 +166,7 @@ async def get_tasks_by_user( projects.name AS project_name, ST_Area(ST_Transform(tasks.outline, 3857)) / 1000000 AS task_area, task_events.created_at, + task_events.updated_at, CASE WHEN task_events.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' WHEN task_events.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' From 002ee20ea168712b2f14a25377fc449c5788a9ed Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 10:55:07 +0545 Subject: [PATCH 008/113] feat: added updated_at in task details endpoint --- src/backend/app/tasks/task_routes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/app/tasks/task_routes.py b/src/backend/app/tasks/task_routes.py index 75b4bb60..6c59b8ff 100644 --- a/src/backend/app/tasks/task_routes.py +++ b/src/backend/app/tasks/task_routes.py @@ -34,6 +34,7 @@ async def read_task( SELECT ST_Area(ST_Transform(tasks.outline, 3857)) / 1000000 AS task_area, task_events.created_at, + task_events.updated_at, projects.name AS project_name, project_task_index, projects.front_overlap AS front_overlap, From 9d0766f574016c29e713dadb6c073f0690576cad Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 11:21:58 +0545 Subject: [PATCH 009/113] fix: get superuser from user table instead of access token --- src/backend/app/projects/project_routes.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index dbef209f..a10b7fb7 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -31,6 +31,7 @@ from app.users.user_schemas import AuthUser from app.tasks import task_schemas from app.utils import geojson_to_kml +from app.users import user_schemas router = APIRouter( @@ -152,9 +153,9 @@ async def delete_project_by_id( HTTPException: If the project is not found. """ user_id = user_data.id - + user = await user_schemas.DbUser.get_user_by_id(db, user_id) # Allow deletion if the user is the project creator or a superuser - if project.author_id != user_id and not user_data.is_superuser: + if project.author_id != user_id and not user.get("is_superuser"): raise HTTPException( status_code=HTTPStatus.FORBIDDEN, detail="User not authorized to delete this project.", From 24167c12f186357ed6a3d68a45665231c27245e1 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 11:22:47 +0545 Subject: [PATCH 010/113] feat: update file and folder structure and rename `UserProfile` to `Complete UserProfile` --- .../FormContents/BasicDetails/index.tsx | 0 .../FormContents/OrganizationDetails/index.tsx | 0 .../FormContents/OtherDetails/index.tsx | 0 .../FormContents/Password/index.tsx | 0 .../FormContents/index.tsx | 0 .../UserProfileHeader/index.tsx | 0 .../{UserProfile => CompleteUserProfile}/index.tsx | 0 .../views/{UserProfile => CompleteUserProfile}/index.tsx | 8 ++++---- 8 files changed, 4 insertions(+), 4 deletions(-) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/FormContents/BasicDetails/index.tsx (100%) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/FormContents/OrganizationDetails/index.tsx (100%) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/FormContents/OtherDetails/index.tsx (100%) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/FormContents/Password/index.tsx (100%) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/FormContents/index.tsx (100%) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/UserProfileHeader/index.tsx (100%) rename src/frontend/src/components/{UserProfile => CompleteUserProfile}/index.tsx (100%) rename src/frontend/src/views/{UserProfile => CompleteUserProfile}/index.tsx (96%) diff --git a/src/frontend/src/components/UserProfile/FormContents/BasicDetails/index.tsx b/src/frontend/src/components/CompleteUserProfile/FormContents/BasicDetails/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/FormContents/BasicDetails/index.tsx rename to src/frontend/src/components/CompleteUserProfile/FormContents/BasicDetails/index.tsx diff --git a/src/frontend/src/components/UserProfile/FormContents/OrganizationDetails/index.tsx b/src/frontend/src/components/CompleteUserProfile/FormContents/OrganizationDetails/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/FormContents/OrganizationDetails/index.tsx rename to src/frontend/src/components/CompleteUserProfile/FormContents/OrganizationDetails/index.tsx diff --git a/src/frontend/src/components/UserProfile/FormContents/OtherDetails/index.tsx b/src/frontend/src/components/CompleteUserProfile/FormContents/OtherDetails/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/FormContents/OtherDetails/index.tsx rename to src/frontend/src/components/CompleteUserProfile/FormContents/OtherDetails/index.tsx diff --git a/src/frontend/src/components/UserProfile/FormContents/Password/index.tsx b/src/frontend/src/components/CompleteUserProfile/FormContents/Password/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/FormContents/Password/index.tsx rename to src/frontend/src/components/CompleteUserProfile/FormContents/Password/index.tsx diff --git a/src/frontend/src/components/UserProfile/FormContents/index.tsx b/src/frontend/src/components/CompleteUserProfile/FormContents/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/FormContents/index.tsx rename to src/frontend/src/components/CompleteUserProfile/FormContents/index.tsx diff --git a/src/frontend/src/components/UserProfile/UserProfileHeader/index.tsx b/src/frontend/src/components/CompleteUserProfile/UserProfileHeader/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/UserProfileHeader/index.tsx rename to src/frontend/src/components/CompleteUserProfile/UserProfileHeader/index.tsx diff --git a/src/frontend/src/components/UserProfile/index.tsx b/src/frontend/src/components/CompleteUserProfile/index.tsx similarity index 100% rename from src/frontend/src/components/UserProfile/index.tsx rename to src/frontend/src/components/CompleteUserProfile/index.tsx diff --git a/src/frontend/src/views/UserProfile/index.tsx b/src/frontend/src/views/CompleteUserProfile/index.tsx similarity index 96% rename from src/frontend/src/views/UserProfile/index.tsx rename to src/frontend/src/views/CompleteUserProfile/index.tsx index 41ca6bbf..bf0149de 100644 --- a/src/frontend/src/views/UserProfile/index.tsx +++ b/src/frontend/src/views/CompleteUserProfile/index.tsx @@ -1,13 +1,13 @@ import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; import { useNavigate } from 'react-router-dom'; -import { UserProfileHeader } from '@Components/UserProfile'; +import { UserProfileHeader } from '@Components/CompleteUserProfile'; import { useForm } from 'react-hook-form'; import { BasicDetails, OrganizationDetails, OtherDetails, PasswordSection, -} from '@Components/UserProfile/FormContents'; +} from '@Components/CompleteUserProfile/FormContents'; import { tabOptions, projectCreatorKeys, @@ -45,7 +45,7 @@ const getActiveFormContent = ( } }; -const UserProfile = () => { +const CompleteUserProfile = () => { const dispatch = useTypedDispatch(); const navigate = useNavigate(); const { width } = useWindowDimensions(); @@ -168,4 +168,4 @@ const UserProfile = () => { ); }; -export default hasErrorBoundary(UserProfile); +export default hasErrorBoundary(CompleteUserProfile); From 74b794d3d8a1b7863e746b08054d68b5cebbcea5 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 11:36:46 +0545 Subject: [PATCH 011/113] refac: remove super user from AuthUser Schemas --- src/backend/app/users/user_schemas.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backend/app/users/user_schemas.py b/src/backend/app/users/user_schemas.py index 676cf601..63c26df9 100644 --- a/src/backend/app/users/user_schemas.py +++ b/src/backend/app/users/user_schemas.py @@ -20,7 +20,6 @@ class AuthUser(BaseModel): email: EmailStr name: str profile_img: Optional[str] = None - is_superuser: bool = False class UserBase(BaseModel): From 23dd28935ff0de532d9883b1de24cf887270d0e8 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 13:49:02 +0545 Subject: [PATCH 012/113] feat: add Breadcrumb component --- .../components/common/Breadcrumb/index.tsx | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/frontend/src/components/common/Breadcrumb/index.tsx diff --git a/src/frontend/src/components/common/Breadcrumb/index.tsx b/src/frontend/src/components/common/Breadcrumb/index.tsx new file mode 100644 index 00000000..760ab399 --- /dev/null +++ b/src/frontend/src/components/common/Breadcrumb/index.tsx @@ -0,0 +1,38 @@ +import { useNavigate } from 'react-router-dom'; + +export interface IBreadCrumbItem { + name: string; + navLink: string; +} + +interface IBreadCrumbProps { + data: IBreadCrumbItem[]; +} + +const BreadCrumb = ({ data }: IBreadCrumbProps) => { + const navigate = useNavigate(); + return ( +
+ {data.map((breadCrumbItem, index) => ( + <> +
+ index < data.length - 1 + ? navigate(breadCrumbItem.navLink) + : () => {} + } + onKeyDown={() => {}} + tabIndex={0} + role="button" + className={`${index === data.length - 1 ? 'naxatw-cursor-default naxatw-font-semibold' : 'naxatw-cursor-pointer hover:naxatw-underline'}`} + > + {breadCrumbItem?.name} +
+ {index < data.length - 1 &&
/
} + + ))} +
+ ); +}; + +export default BreadCrumb; From aa3dc3349a8a3f56279c1811823dfdf247ffe1c8 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 13:51:48 +0545 Subject: [PATCH 013/113] feat: replace user-profile layout component and and add new route called complete-profile --- src/frontend/src/routes/appRoutes.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/routes/appRoutes.ts b/src/frontend/src/routes/appRoutes.ts index 3f936f2f..20676376 100644 --- a/src/frontend/src/routes/appRoutes.ts +++ b/src/frontend/src/routes/appRoutes.ts @@ -1,12 +1,13 @@ import Projects from '@Views/Projects'; import Dashboard from '@Views/Dashboard'; -import UserProfile from '@Views/UserProfile'; +import CompleteUserProfile from '@Views/CompleteUserProfile'; import CreateProject from '@Components/CreateProject'; import GoogleAuth from '@Components/GoogleAuth'; import userRoutes from '@UserModule/routes'; import LandingPage from '@Views/LandingPage'; import IndividualProject from '@Views/IndividualProject'; import TaskDescription from '@Views/TaskDescription'; +import UpdateUserProfile from '@Views/UpdateUserProfile'; import { IRoute } from './types'; const appRoutes: IRoute[] = [ @@ -48,9 +49,9 @@ const appRoutes: IRoute[] = [ authenticated: true, }, { - path: '/user-profile', - name: 'User Profile', - component: UserProfile, + path: '/complete-profile', + name: 'Complete Profile', + component: CompleteUserProfile, authenticated: true, }, { @@ -59,6 +60,13 @@ const appRoutes: IRoute[] = [ component: TaskDescription, authenticated: true, }, + + { + path: '/user-profile', + name: 'User Profile', + component: UpdateUserProfile, + authenticated: true, + }, ]; export default appRoutes; From 52a418da2fb88e6b6c0c78b139347491e73d0105 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 1 Oct 2024 13:59:54 +0545 Subject: [PATCH 014/113] feat: added two new enums such as IMAGE_UPLOADED & IMAGE_PROCESSED --- .../app/migrations/versions/5235ef4afa9c_.py | 60 +++++++++++++++++++ src/backend/app/models/enums.py | 2 + 2 files changed, 62 insertions(+) create mode 100644 src/backend/app/migrations/versions/5235ef4afa9c_.py diff --git a/src/backend/app/migrations/versions/5235ef4afa9c_.py b/src/backend/app/migrations/versions/5235ef4afa9c_.py new file mode 100644 index 00000000..ebd2cbc1 --- /dev/null +++ b/src/backend/app/migrations/versions/5235ef4afa9c_.py @@ -0,0 +1,60 @@ +""" + +Revision ID: 5235ef4afa9c +Revises: b4338a93f7bb +Create Date: 2024-10-01 07:50:13.553835 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '5235ef4afa9c' +down_revision: Union[str, None] = 'b4338a93f7bb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +# Define the new enum type +new_state_enum = sa.Enum( + "UNLOCKED_TO_MAP", + "LOCKED_FOR_MAPPING", + "UNLOCKED_TO_VALIDATE", + "LOCKED_FOR_VALIDATION", + "UNLOCKED_DONE", + "REQUEST_FOR_MAPPING", + "UNFLYABLE_TASK", + "IMAGE_UPLOADED", + "IMAGE_PROCESSED", + name="state", +) + +old_state_enum = sa.Enum( + "UNLOCKED_TO_MAP", + "LOCKED_FOR_MAPPING", + "UNLOCKED_TO_VALIDATE", + "LOCKED_FOR_VALIDATION", + "UNLOCKED_DONE", + "REQUEST_FOR_MAPPING", + "UNFLYABLE_TASK", + name="state", +) + +def upgrade() -> None: + op.execute("ALTER TYPE state ADD VALUE 'IMAGE_UPLOADED'") + op.execute("ALTER TYPE state ADD VALUE 'IMAGE_PROCESSED'") + + +def downgrade() -> None: + # Rename the enum type + op.execute("ALTER TYPE state RENAME TO state_old") + # Recreate the old enum type + old_state_enum.create(op.get_bind(), checkfirst=False) + # Alter the column to use the old enum type + op.execute("ALTER TABLE task_events ALTER COLUMN state TYPE state_old USING state::state_old") + # Drop the old enum type + op.execute("DROP TYPE state_old") + \ No newline at end of file diff --git a/src/backend/app/models/enums.py b/src/backend/app/models/enums.py index 2282f5ca..0fb271f5 100644 --- a/src/backend/app/models/enums.py +++ b/src/backend/app/models/enums.py @@ -142,6 +142,8 @@ class State(int, Enum): LOCKED_FOR_VALIDATION = 3 UNLOCKED_DONE = 4 UNFLYABLE_TASK = 5 + IMAGE_UPLOADED = 6 + IMAGE_PROCESSED = 7 class EventType(str, Enum): From 4045d4301e749ceb1dbaa9f2640b3b4bdd82da0b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 08:18:56 +0000 Subject: [PATCH 015/113] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../app/migrations/versions/5235ef4afa9c_.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/backend/app/migrations/versions/5235ef4afa9c_.py b/src/backend/app/migrations/versions/5235ef4afa9c_.py index ebd2cbc1..2946109b 100644 --- a/src/backend/app/migrations/versions/5235ef4afa9c_.py +++ b/src/backend/app/migrations/versions/5235ef4afa9c_.py @@ -5,6 +5,7 @@ Create Date: 2024-10-01 07:50:13.553835 """ + from typing import Sequence, Union from alembic import op @@ -12,8 +13,8 @@ # revision identifiers, used by Alembic. -revision: str = '5235ef4afa9c' -down_revision: Union[str, None] = 'b4338a93f7bb' +revision: str = "5235ef4afa9c" +down_revision: Union[str, None] = "b4338a93f7bb" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -43,10 +44,11 @@ name="state", ) + def upgrade() -> None: op.execute("ALTER TYPE state ADD VALUE 'IMAGE_UPLOADED'") op.execute("ALTER TYPE state ADD VALUE 'IMAGE_PROCESSED'") - + def downgrade() -> None: # Rename the enum type @@ -54,7 +56,8 @@ def downgrade() -> None: # Recreate the old enum type old_state_enum.create(op.get_bind(), checkfirst=False) # Alter the column to use the old enum type - op.execute("ALTER TABLE task_events ALTER COLUMN state TYPE state_old USING state::state_old") + op.execute( + "ALTER TABLE task_events ALTER COLUMN state TYPE state_old USING state::state_old" + ) # Drop the old enum type op.execute("DROP TYPE state_old") - \ No newline at end of file From e3a423cec78af4d4d4b573818a45db329455b9ae Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 1 Oct 2024 17:34:10 +0545 Subject: [PATCH 016/113] fix(task-description): Remove BLOB middleware for processing result downloads --- .../DescriptionBox/index.tsx | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx b/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx index e589125b..2adc0918 100644 --- a/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx +++ b/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx @@ -99,27 +99,38 @@ const DescriptionBox = () => { const handleDownloadResult = () => { if (!taskAssetsInformation?.assets_url) return; - fetch(`${taskAssetsInformation?.assets_url}`, { method: 'GET' }) - .then(response => { - if (!response.ok) { - throw new Error(`Network response was ${response.statusText}`); - } - return response.blob(); - }) - .then(blob => { - const url = window.URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = url; - link.download = 'assets.zip'; - document.body.appendChild(link); - link.click(); - link.remove(); - window.URL.revokeObjectURL(url); - }) - .catch(error => - toast.error(`There wan an error while downloading file - ${error}`), - ); + // fetch(`${taskAssetsInformation?.assets_url}`, { method: 'GET' }) + // .then(response => { + // if (!response.ok) { + // throw new Error(`Network response was ${response.statusText}`); + // } + // return response.blob(); + // }) + // .then(blob => { + // const url = window.URL.createObjectURL(blob); + // const link = document.createElement('a'); + // link.href = url; + // link.download = 'assets.zip'; + // document.body.appendChild(link); + // link.click(); + // link.remove(); + // window.URL.revokeObjectURL(url); + // }) + // .catch(error => + // toast.error(`There wan an error while downloading file + // ${error}`), + // ); + + try { + const link = document.createElement('a'); + link.href = taskAssetsInformation?.assets_url; + link.download = 'assets.zip'; + document.body.appendChild(link); + link.click(); + link.remove(); + } catch (error) { + toast.error(`There wan an error while downloading file ${error}`); + } }; return ( From 4297042d2419b3e09c4901e088c8dbfd53e9db2e Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 2 Oct 2024 09:58:09 +0545 Subject: [PATCH 017/113] fix: issues reslove on updated date --- src/backend/app/tasks/task_routes.py | 27 +++++++++++++++++---------- src/backend/app/users/user_routes.py | 12 +++++++++++- src/backend/app/users/user_schemas.py | 1 + 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/backend/app/tasks/task_routes.py b/src/backend/app/tasks/task_routes.py index 6c59b8ff..97e21d9f 100644 --- a/src/backend/app/tasks/task_routes.py +++ b/src/backend/app/tasks/task_routes.py @@ -33,25 +33,32 @@ async def read_task( """ SELECT ST_Area(ST_Transform(tasks.outline, 3857)) / 1000000 AS task_area, - task_events.created_at, - task_events.updated_at, + te.created_at, + te.updated_at, projects.name AS project_name, - project_task_index, + tasks.project_task_index, projects.front_overlap AS front_overlap, projects.side_overlap AS side_overlap, projects.gsd_cm_px AS gsd_cm_px, projects.gimble_angles_degrees AS gimble_angles_degrees - FROM - task_events - JOIN - tasks ON task_events.task_id = tasks.id - JOIN - projects ON task_events.project_id = projects.id - WHERE task_events.task_id = %(task_id)s""", + FROM ( + SELECT DISTINCT ON (te.task_id) + te.task_id, + te.created_at, + te.updated_at + FROM task_events te + WHERE te.task_id = %(task_id)s + ORDER BY te.task_id, te.created_at DESC + ) AS te + JOIN tasks ON te.task_id = tasks.id + JOIN projects ON tasks.project_id = projects.id + WHERE te.task_id = %(task_id)s; + """, {"task_id": task_id}, ) records = await cur.fetchone() return records + except Exception as e: raise HTTPException( status_code=HTTPStatus.INTERNAL_SERVER_ERROR, diff --git a/src/backend/app/users/user_routes.py b/src/backend/app/users/user_routes.py index a3fcb185..7d4bfcc2 100644 --- a/src/backend/app/users/user_routes.py +++ b/src/backend/app/users/user_routes.py @@ -76,6 +76,7 @@ async def update_user_profile( profile_update: UserProfileIn, db: Annotated[Connection, Depends(database.get_db)], user_data: Annotated[AuthUser, Depends(login_required)], + request: Request, ): """ Update user profile based on provided user_id and profile_update data. @@ -89,7 +90,6 @@ async def update_user_profile( """ user = await user_schemas.DbUser.get_user_by_id(db, user_id) - if user_data.id != user_id: raise HTTPException( status_code=HTTPStatus.FORBIDDEN, @@ -98,6 +98,16 @@ async def update_user_profile( if not user: raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="User not found") + + if request.method == "PATCH": + if not user_logic.verify_password( + profile_update.old_password, user.get("password") + ): + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail="Old password is incorrect", + ) + user = await user_schemas.DbUserProfile.update(db, user_id, profile_update) return JSONResponse( status_code=HTTPStatus.OK, diff --git a/src/backend/app/users/user_schemas.py b/src/backend/app/users/user_schemas.py index 63c26df9..227dae98 100644 --- a/src/backend/app/users/user_schemas.py +++ b/src/backend/app/users/user_schemas.py @@ -114,6 +114,7 @@ def srting_role_to_integer(cls, value: UserRole) -> str: class UserProfileIn(BaseUserProfile): password: Optional[str] = None + old_password: Optional[str] = None class DbUserProfile(BaseUserProfile): From e85338ebf874bcdd86b5c7f233c8880671fdc302 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 2 Oct 2024 10:06:51 +0545 Subject: [PATCH 018/113] feat: added change password based on old and new password --- src/backend/app/users/user_schemas.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend/app/users/user_schemas.py b/src/backend/app/users/user_schemas.py index 227dae98..0ff79814 100644 --- a/src/backend/app/users/user_schemas.py +++ b/src/backend/app/users/user_schemas.py @@ -127,7 +127,9 @@ async def update(db: Connection, user_id: int, profile_update: UserProfileIn): """Update or insert a user profile.""" # Prepare data for insert or update - model_dump = profile_update.model_dump(exclude_none=True, exclude=["password"]) + model_dump = profile_update.model_dump( + exclude_none=True, exclude=["password", "old_password"] + ) columns = ", ".join(model_dump.keys()) value_placeholders = ", ".join(f"%({key})s" for key in model_dump.keys()) sql = f""" From 13d8ae80c9816d582b450703e35f4f14ceeb6118 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 10:11:00 +0545 Subject: [PATCH 019/113] feat(individual-project): post date with other data on task lock/unlock --- .../src/components/IndividualProject/MapSection/index.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/IndividualProject/MapSection/index.tsx b/src/frontend/src/components/IndividualProject/MapSection/index.tsx index 7e907844..3f196cc0 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/index.tsx @@ -158,7 +158,7 @@ const MapSection = () => { lockTask({ projectId: id, taskId: selectedTaskId, - data: { event: 'request' }, + data: { event: 'request', updated_at: new Date().toISOString() }, }); }; @@ -166,7 +166,7 @@ const MapSection = () => { unLockTask({ projectId: id, taskId: selectedTaskId, - data: { event: 'unlock' }, + data: { event: 'unlock', updated_at: new Date().toISOString() }, }); }; @@ -181,7 +181,6 @@ const MapSection = () => { > - {projectArea && ( Date: Wed, 2 Oct 2024 10:14:25 +0545 Subject: [PATCH 020/113] feat(task-description): show task locked date --- .../DescriptionSection/DescriptionBox/index.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx b/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx index 2adc0918..b196e389 100644 --- a/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx +++ b/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx @@ -44,6 +44,12 @@ const DescriptionBox = () => { ? taskData?.created_at?.slice(0, 10) || '-' : null, }, + { + name: 'TAsk locked date', + value: taskData?.updated_at + ? taskData?.updated_at?.slice(0, 10) || '-' + : null, + }, { name: 'Total task area', value: taskData?.task_area From f364c43330947ede911d0f2a7df6b4b1d0b726e0 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:32:50 +0545 Subject: [PATCH 021/113] feat(update-profile): add BasicDetails component --- .../BasicDetails.tsx/index.tsx | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx diff --git a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx new file mode 100644 index 00000000..5624860f --- /dev/null +++ b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx @@ -0,0 +1,123 @@ +import { Controller, useForm } from 'react-hook-form'; +import { FormControl, Input, Label, Select } from '@Components/common/FormUI'; +import { Flex, FlexColumn } from '@Components/common/Layouts'; +import { countriesWithPhoneCodes } from '@Constants/countryCode'; +import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; +import ErrorMessage from '@Components/common/ErrorMessage'; +import { Button } from '@Components/RadixComponents/Button'; + +const BasicDetails = () => { + const userProfile = getLocalStorageValue('userprofile'); + const initialState = { + name: userProfile?.name, + country: userProfile?.country || null, + city: userProfile?.city || null, + password: null, + phone_number: userProfile?.phone_number || null, + }; + + const { register, handleSubmit, formState, control } = useForm({ + defaultValues: initialState, + }); + + return ( +
+ +

Basic Details

+
+ + + profilepic + + + + + + + + + ( + value.trim(), + required: 'City is Required', + })} + /> + + + + +
+ {/* */} + +
+ +
+
+
+ +
+
+ ); +}; + +export default BasicDetails; From 39dd3cc6d1eaf6d7ef5b4c82a728681a1fc39335 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:33:16 +0545 Subject: [PATCH 022/113] feat(update-profile): add Header component --- .../UpdateUserDetails/Header/index.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/frontend/src/components/UpdateUserDetails/Header/index.tsx diff --git a/src/frontend/src/components/UpdateUserDetails/Header/index.tsx b/src/frontend/src/components/UpdateUserDetails/Header/index.tsx new file mode 100644 index 00000000..bc13bb8a --- /dev/null +++ b/src/frontend/src/components/UpdateUserDetails/Header/index.tsx @@ -0,0 +1,16 @@ +import BreadCrumb from '@Components/common/Breadcrumb'; + +const Header = () => { + return ( +
+ +
+ ); +}; + +export default Header; From ae7fba71b8fd0368b56a073257c30723ae737117 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:34:12 +0545 Subject: [PATCH 023/113] feat(update-profile): add OrganizationDetail component --- .../OrganizationDetails/index.tsx | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx diff --git a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx new file mode 100644 index 00000000..2376b9ed --- /dev/null +++ b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx @@ -0,0 +1,84 @@ +import ErrorMessage from '@Components/common/ErrorMessage'; +import { FormControl, Input, Label } from '@Components/common/FormUI'; +import { Flex, FlexColumn } from '@Components/common/Layouts'; +import { Button } from '@Components/RadixComponents/Button'; +import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; +import { useForm } from 'react-hook-form'; + +const OrganizationDetails = () => { + const userProfile = getLocalStorageValue('userprofile'); + + const initialState = { + organization_name: userProfile?.organization_name || null, + organization_address: userProfile?.organization_address || null, + job_title: userProfile?.job_title || null, + }; + + const { register, handleSubmit, formState } = useForm({ + defaultValues: initialState, + }); + + return ( +
+ +

+ Organization Details +

+
+ + + + + + + + + + + + + + + + + +
+ +
+
+ ); +}; + +export default OrganizationDetails; From 6c555ed29b8c735c5bed7a2f25feaad628375ba3 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:34:33 +0545 Subject: [PATCH 024/113] feat(update-profile): add Password component --- .../UpdateUserDetails/Password/index.tsx | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/frontend/src/components/UpdateUserDetails/Password/index.tsx diff --git a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx new file mode 100644 index 00000000..5533d8d8 --- /dev/null +++ b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx @@ -0,0 +1,86 @@ +import ErrorMessage from '@Components/common/ErrorMessage'; +import { FormControl, Input, Label } from '@Components/common/FormUI'; +import { Flex, FlexColumn } from '@Components/common/Layouts'; +import { Button } from '@Components/RadixComponents/Button'; +import { useForm } from 'react-hook-form'; + +const Password = () => { + const initialState = { + old_password: '', + password: '', + confirm_password: '', + }; + const { register, handleSubmit, formState, watch } = useForm({ + defaultValues: initialState, + }); + + const password = watch('password'); + + return ( +
+ +

+ Change Password +

+
+ + + + + + + + + + + + + + + value === password || 'The passwords do not match', + // required: 'Confirm Password is Required', + })} + /> + + + + +
+ +
+
+ ); +}; + +export default Password; From fb5cc92a86bf9428005657da167dc41f60fec13e Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:34:58 +0545 Subject: [PATCH 025/113] feat(update-profile): add OtherDetails component --- .../UpdateUserDetails/OtherDetails/index.tsx | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx diff --git a/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx new file mode 100644 index 00000000..b60b37b6 --- /dev/null +++ b/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx @@ -0,0 +1,115 @@ +import { useForm } from 'react-hook-form'; +import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; +import { Flex, FlexColumn } from '@Components/common/Layouts'; +import { FormControl, Input, Label } from '@Components/common/FormUI'; +import ErrorMessage from '@Components/common/ErrorMessage'; +import RadioButton from '@Components/common/RadioButton'; +import FileUpload from '@Components/common/UploadArea'; +import { droneOperatorOptions } from '@Constants/index'; +import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; +import { setCommonState } from '@Store/actions/common'; + +const OtherDetails = () => { + const userProfile = getLocalStorageValue('userprofile'); + const dispatch = useTypedDispatch(); + const isCertifiedDroneOperator = useTypedSelector( + state => state.common.isCertifiedDroneUser, + ); + + const initialState = { + // for drone operators + notify_for_projects_within_km: + userProfile?.notify_for_projects_within_km || null, + experience_years: userProfile?.experience_years || null, + certified_drone_operator: userProfile?.certified_drone_operator || false, + drone_you_own: userProfile?.drone_you_own || null, + }; + + const { register, handleSubmit, setValue, formState } = useForm({ + defaultValues: initialState, + }); + + return ( +
+ +

+ Other Details +

+
+ + + + + + + + + + + + + + + + + + { + dispatch(setCommonState({ isCertifiedDroneUser: val })); + setValue('certified_drone_operator', val === 'yes'); + }} + value={isCertifiedDroneOperator} + /> + + + {}} + onChange={() => {}} + setValue={() => {}} + placeholder="*The supported file formats are pdf, .jpeg, .png" + /> + +
+ ); +}; + +export default OtherDetails; From 99da3b2a7910bf4ae1319144b33476fb4e44f1c2 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:36:21 +0545 Subject: [PATCH 026/113] feat: add common css class main-content that gives the full screen height after reducing the nav bar height --- src/frontend/src/assets/css/tailwind.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/frontend/src/assets/css/tailwind.css b/src/frontend/src/assets/css/tailwind.css index b36df2ad..5fea202b 100644 --- a/src/frontend/src/assets/css/tailwind.css +++ b/src/frontend/src/assets/css/tailwind.css @@ -140,3 +140,7 @@ input:-webkit-autofill:active { -webkit-box-shadow: 0 0 0 1000px transparent inset; transition: background-color 5000s ease-in-out 0s; } + +.main-content{ + @apply naxatw-h-[calc(100vh-3.5rem)] +} From 31fcf4d18d663a4934b9615c1b7eaad60f1001d7 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:36:57 +0545 Subject: [PATCH 027/113] feat(user-profile): add UpdateUserProfile component --- .../src/views/UpdateUserProfile/index.tsx | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/frontend/src/views/UpdateUserProfile/index.tsx diff --git a/src/frontend/src/views/UpdateUserProfile/index.tsx b/src/frontend/src/views/UpdateUserProfile/index.tsx new file mode 100644 index 00000000..2d7342f8 --- /dev/null +++ b/src/frontend/src/views/UpdateUserProfile/index.tsx @@ -0,0 +1,78 @@ +import Tab from '@Components/common/Tabs'; +import BasicDetails from '@Components/UpdateUserDetails/BasicDetails.tsx'; +import Header from '@Components/UpdateUserDetails/Header'; +import OrganizationDetails from '@Components/UpdateUserDetails/OrganizationDetails'; +import OtherDetails from '@Components/UpdateUserDetails/OtherDetails'; +import Password from '@Components/UpdateUserDetails/Password'; +import { tabOptions } from '@Constants/index'; +import useWindowDimensions from '@Hooks/useWindowDimensions'; +import { setCommonState } from '@Store/actions/common'; +import { useTypedSelector } from '@Store/hooks'; +import { useEffect } from 'react'; +import { useDispatch } from 'react-redux'; + +const getActiveFormContent = (activeTab: number, userType: string) => { + switch (activeTab) { + case 1: + return ; + case 2: + return userType === 'Project Creator' ? ( + + ) : ( + + ); + case 3: + return ; + default: + return <>; + } +}; + +const UpdateUserProfile = () => { + const dispatch = useDispatch(); + const { width } = useWindowDimensions(); + + const userProfileActiveTab = useTypedSelector( + state => state.common.userProfileActiveTab, + ); + const signedInAs = localStorage.getItem('signedInAs') || 'Project Creator'; + + useEffect(() => { + return () => {}; + }, []); + + return ( +
+
+
+
+
+
+
+
+ { + dispatch( + setCommonState({ userProfileActiveTab: Number(data) }), + ); + }} + tabOptions={tabOptions} + activeTab={userProfileActiveTab} + /> +
+
+
+ {getActiveFormContent(userProfileActiveTab, signedInAs)} +
+
+
+
+
+
+ ); +}; + +export default UpdateUserProfile; From e880d59d6fd133cf318221a7139eec84c4e76276 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:38:09 +0545 Subject: [PATCH 028/113] feat: remove the route `user-profile` add `complete-profile` from the list of routes without navbar --- src/frontend/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index cfef8088..d3fb97b5 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -52,7 +52,7 @@ export default function App() { '/', '/login', '/forgot-password', - '/user-profile', + '/complete-profile', ]; return ( From 4d1adf586c7dce8886652cae5d19ecd9aa81e947 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 11:50:34 +0545 Subject: [PATCH 029/113] feat(user-profile): update basic details --- .../BasicDetails.tsx/index.tsx | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx index 5624860f..bdef9cac 100644 --- a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx @@ -5,6 +5,9 @@ import { countriesWithPhoneCodes } from '@Constants/countryCode'; import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; import ErrorMessage from '@Components/common/ErrorMessage'; import { Button } from '@Components/RadixComponents/Button'; +import { useMutation } from '@tanstack/react-query'; +import { patchUserProfile } from '@Services/common'; +import { toast } from 'react-toastify'; const BasicDetails = () => { const userProfile = getLocalStorageValue('userprofile'); @@ -20,6 +23,26 @@ const BasicDetails = () => { defaultValues: initialState, }); + const { mutate: updateBasicInfo, isLoading } = useMutation< + any, + any, + any, + unknown + >({ + mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), + onSuccess: () => { + toast.success('Basic Updated Successfully'); + }, + onError: err => { + // eslint-disable-next-line no-console + console.log(err); + }, + }); + + const onSubmit = (formData: Record) => { + updateBasicInfo({ userId: userProfile?.id, data: formData }); + }; + return (
@@ -110,8 +133,10 @@ const BasicDetails = () => { className="naxatw-bg-red" onClick={e => { e.preventDefault(); + handleSubmit(onSubmit)(); }} withLoader + isLoading={isLoading} > Save From c692906da4b9af142458dad4bfe90cba54c3ce3f Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:06:01 +0545 Subject: [PATCH 030/113] refactor: remove user data fetching on projects page --- src/frontend/src/views/Projects/index.tsx | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/frontend/src/views/Projects/index.tsx b/src/frontend/src/views/Projects/index.tsx index 0f5b8b98..2c58ad94 100644 --- a/src/frontend/src/views/Projects/index.tsx +++ b/src/frontend/src/views/Projects/index.tsx @@ -4,10 +4,9 @@ import { ProjectsHeader, ProjectsMapSection, } from '@Components/Projects'; -import { useGetProjectsListQuery, useGetUserDetailsQuery } from '@Api/projects'; +import { useGetProjectsListQuery } from '@Api/projects'; import ProjectCardSkeleton from '@Components/Projects/ProjectCardSkeleton'; import { useEffect } from 'react'; -import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; import hasErrorBoundary from '@Utils/hasErrorBoundary'; import { setCreateProjectState } from '@Store/actions/createproject'; import { useDispatch } from 'react-redux'; @@ -23,15 +22,6 @@ const Projects = () => { const { data: projectsList, isLoading }: Record = useGetProjectsListQuery(projectsFilterByOwner); - const { data: userDetails } = useGetUserDetailsQuery(); - const localStorageUserDetails = getLocalStorageValue('userprofile'); - - useEffect(() => { - if (!userDetails || !localStorageUserDetails) return; - const userDetailsString = JSON.stringify(userDetails); - localStorage.setItem('userprofile', userDetailsString as string); - }, [userDetails, localStorageUserDetails]); - useEffect(() => { return () => { dispatch(setCreateProjectState({ ProjectsFilterByOwner: 'no' })); From 1eedd82b616b5be5db41f1bda772f6260d8799f5 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:07:48 +0545 Subject: [PATCH 031/113] refactor(user-profile): revalidate user details data on basic details patch success --- .../components/UpdateUserDetails/BasicDetails.tsx/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx index bdef9cac..d21b714b 100644 --- a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx @@ -5,7 +5,7 @@ import { countriesWithPhoneCodes } from '@Constants/countryCode'; import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; import ErrorMessage from '@Components/common/ErrorMessage'; import { Button } from '@Components/RadixComponents/Button'; -import { useMutation } from '@tanstack/react-query'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; import { patchUserProfile } from '@Services/common'; import { toast } from 'react-toastify'; @@ -18,6 +18,7 @@ const BasicDetails = () => { password: null, phone_number: userProfile?.phone_number || null, }; + const queryClient = useQueryClient(); const { register, handleSubmit, formState, control } = useForm({ defaultValues: initialState, @@ -31,6 +32,8 @@ const BasicDetails = () => { >({ mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), onSuccess: () => { + queryClient.invalidateQueries(['user-profile']); + toast.success('Basic Updated Successfully'); }, onError: err => { From 10195fbd56fe3f2233863a58dac9748254215931 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:08:47 +0545 Subject: [PATCH 032/113] feat: store user details on local storage on fetch success --- src/frontend/src/api/projects.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/api/projects.ts b/src/frontend/src/api/projects.ts index 7720efb1..81b50b6c 100644 --- a/src/frontend/src/api/projects.ts +++ b/src/frontend/src/api/projects.ts @@ -46,9 +46,14 @@ export const useGetUserDetailsQuery = ( queryOptions?: Partial, ) => { return useQuery({ - queryKey: ['user=profile'], + queryKey: ['user-profile'], queryFn: getUserProfileInfo, - select: (res: any) => res.data, + select: (res: any) => { + const userDetails = res.data; + const userDetailsString = JSON.stringify(userDetails); + localStorage.setItem('userprofile', userDetailsString as string); + return userDetails; + }, ...queryOptions, }); }; From 33ca8717f88d01a8705445c61d021852b637eaa9 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:09:42 +0545 Subject: [PATCH 033/113] feat(user-profile): create user profile patch service --- src/frontend/src/services/common.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/frontend/src/services/common.ts b/src/frontend/src/services/common.ts index 366696d4..0ed23c61 100644 --- a/src/frontend/src/services/common.ts +++ b/src/frontend/src/services/common.ts @@ -22,3 +22,8 @@ export const postUserProfile = ({ export const getUserProfileInfo = () => authenticated(api).get('/users/my-info/'); + +export const patchUserProfile = ({ userId, data }: Record) => + authenticated(api).post(`/users/${userId}/profile`, data, { + headers: { 'Content-Type': 'application/json' }, + }); From 22ad1972868f4cc7bbe230f8bca5e506f295d1db Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:10:45 +0545 Subject: [PATCH 034/113] feat(user-profile): call user details api on userProfile of nav section --- src/frontend/src/components/common/UserProfile/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/frontend/src/components/common/UserProfile/index.tsx b/src/frontend/src/components/common/UserProfile/index.tsx index f19dd34e..cb1bd1b7 100644 --- a/src/frontend/src/components/common/UserProfile/index.tsx +++ b/src/frontend/src/components/common/UserProfile/index.tsx @@ -7,11 +7,14 @@ import { useNavigate } from 'react-router-dom'; import UserAvatar from '@Components/common/UserAvatar'; import { toast } from 'react-toastify'; import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; +import { useGetUserDetailsQuery } from '@Api/projects'; export default function UserProfile() { const [toggle, setToggle] = useState(false); const navigate = useNavigate(); + // eslint-disable-next-line no-unused-vars + const { data: userDetails } = useGetUserDetailsQuery(); const userProfile = getLocalStorageValue('userprofile'); const settingOptions = [ From cee089051e2518df3f69c8b061fae0d6ab2eab20 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:20:38 +0545 Subject: [PATCH 035/113] feat(user-profile): update organization details --- .../OrganizationDetails/index.tsx | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx index 2376b9ed..66947daf 100644 --- a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx @@ -2,8 +2,11 @@ import ErrorMessage from '@Components/common/ErrorMessage'; import { FormControl, Input, Label } from '@Components/common/FormUI'; import { Flex, FlexColumn } from '@Components/common/Layouts'; import { Button } from '@Components/RadixComponents/Button'; +import { patchUserProfile } from '@Services/common'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; import { useForm } from 'react-hook-form'; +import { toast } from 'react-toastify'; const OrganizationDetails = () => { const userProfile = getLocalStorageValue('userprofile'); @@ -13,11 +16,34 @@ const OrganizationDetails = () => { organization_address: userProfile?.organization_address || null, job_title: userProfile?.job_title || null, }; + const queryClient = useQueryClient(); const { register, handleSubmit, formState } = useForm({ defaultValues: initialState, }); + const { mutate: updateOrganizationDetails, isLoading } = useMutation< + any, + any, + any, + unknown + >({ + mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), + onSuccess: () => { + queryClient.invalidateQueries(['user-profile']); + + toast.success('Organization details updated successfully'); + }, + onError: err => { + // eslint-disable-next-line no-console + console.log(err); + }, + }); + + const onSubmit = (formData: Record) => { + updateOrganizationDetails({ userId: userProfile?.id, data: formData }); + }; + return (
@@ -71,8 +97,10 @@ const OrganizationDetails = () => { className="naxatw-bg-red" onClick={e => { e.preventDefault(); + handleSubmit(onSubmit)(); }} withLoader + isLoading={isLoading} > Save From cd34d0b5af9460f2bc1bbf201a441a620f51bea9 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 12:26:14 +0545 Subject: [PATCH 036/113] feat(user-profile): update other details --- .../UpdateUserDetails/OtherDetails/index.tsx | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx index b60b37b6..6f5364b5 100644 --- a/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx @@ -8,6 +8,10 @@ import FileUpload from '@Components/common/UploadArea'; import { droneOperatorOptions } from '@Constants/index'; import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; import { setCommonState } from '@Store/actions/common'; +import { Button } from '@Components/RadixComponents/Button'; +import { patchUserProfile } from '@Services/common'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { toast } from 'react-toastify'; const OtherDetails = () => { const userProfile = getLocalStorageValue('userprofile'); @@ -24,11 +28,34 @@ const OtherDetails = () => { certified_drone_operator: userProfile?.certified_drone_operator || false, drone_you_own: userProfile?.drone_you_own || null, }; + const queryClient = useQueryClient(); const { register, handleSubmit, setValue, formState } = useForm({ defaultValues: initialState, }); + const { mutate: updateOtherDetails, isLoading } = useMutation< + any, + any, + any, + unknown + >({ + mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), + onSuccess: () => { + queryClient.invalidateQueries(['user-profile']); + + toast.success('Details Updated Successfully'); + }, + onError: err => { + // eslint-disable-next-line no-console + console.log(err); + }, + }); + + const onSubmit = (formData: Record) => { + updateOtherDetails({ userId: userProfile?.id, data: formData }); + }; + return (
@@ -108,6 +135,19 @@ const OtherDetails = () => { placeholder="*The supported file formats are pdf, .jpeg, .png" /> +
+ +
); }; From 2be552dea02bf0795d7c30a617578b6d2ddc261e Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 13:07:10 +0545 Subject: [PATCH 037/113] feat(user-profile): update password --- .../UpdateUserDetails/Password/index.tsx | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx index 5533d8d8..3ceb6f29 100644 --- a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx @@ -1,8 +1,12 @@ +import { useForm } from 'react-hook-form'; +import { toast } from 'react-toastify'; import ErrorMessage from '@Components/common/ErrorMessage'; import { FormControl, Input, Label } from '@Components/common/FormUI'; import { Flex, FlexColumn } from '@Components/common/Layouts'; import { Button } from '@Components/RadixComponents/Button'; -import { useForm } from 'react-hook-form'; +import { patchUserProfile } from '@Services/common'; +import { useMutation } from '@tanstack/react-query'; +import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; const Password = () => { const initialState = { @@ -10,12 +14,33 @@ const Password = () => { password: '', confirm_password: '', }; + const userProfile = getLocalStorageValue('userprofile'); + const { register, handleSubmit, formState, watch } = useForm({ defaultValues: initialState, }); - const password = watch('password'); + const { mutate: updatePassword, isLoading } = useMutation< + any, + any, + any, + unknown + >({ + mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), + onSuccess: () => { + toast.success('Password Updated successfully'); + }, + onError: err => { + // eslint-disable-next-line no-console + console.log(err); + }, + }); + + const onSubmit = (formData: Record) => { + updatePassword({ userId: userProfile?.id, data: formData }); + }; + return (
@@ -29,7 +54,7 @@ const Password = () => { { { value === password || 'The passwords do not match', @@ -73,8 +98,10 @@ const Password = () => { className="naxatw-bg-red" onClick={e => { e.preventDefault(); + handleSubmit(onSubmit)(); }} withLoader + isLoading={isLoading} > Save From 86c6a7f034ed41d0640d8671b7dfbf2cc79916cc Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 13:10:23 +0545 Subject: [PATCH 038/113] fix: typo --- .../UpdateUserDetails/BasicDetails.tsx/index.tsx | 4 ++-- .../UpdateUserDetails/OrganizationDetails/index.tsx | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx index d21b714b..6db50521 100644 --- a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx @@ -1,3 +1,4 @@ +import { toast } from 'react-toastify'; import { Controller, useForm } from 'react-hook-form'; import { FormControl, Input, Label, Select } from '@Components/common/FormUI'; import { Flex, FlexColumn } from '@Components/common/Layouts'; @@ -7,7 +8,6 @@ import ErrorMessage from '@Components/common/ErrorMessage'; import { Button } from '@Components/RadixComponents/Button'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { patchUserProfile } from '@Services/common'; -import { toast } from 'react-toastify'; const BasicDetails = () => { const userProfile = getLocalStorageValue('userprofile'); @@ -34,7 +34,7 @@ const BasicDetails = () => { onSuccess: () => { queryClient.invalidateQueries(['user-profile']); - toast.success('Basic Updated Successfully'); + toast.success('Details Updated Successfully'); }, onError: err => { // eslint-disable-next-line no-console diff --git a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx index 66947daf..043a23bc 100644 --- a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx @@ -1,12 +1,12 @@ +import { useForm } from 'react-hook-form'; +import { toast } from 'react-toastify'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; import ErrorMessage from '@Components/common/ErrorMessage'; import { FormControl, Input, Label } from '@Components/common/FormUI'; import { Flex, FlexColumn } from '@Components/common/Layouts'; import { Button } from '@Components/RadixComponents/Button'; import { patchUserProfile } from '@Services/common'; -import { useMutation, useQueryClient } from '@tanstack/react-query'; import { getLocalStorageValue } from '@Utils/getLocalStorageValue'; -import { useForm } from 'react-hook-form'; -import { toast } from 'react-toastify'; const OrganizationDetails = () => { const userProfile = getLocalStorageValue('userprofile'); @@ -32,7 +32,7 @@ const OrganizationDetails = () => { onSuccess: () => { queryClient.invalidateQueries(['user-profile']); - toast.success('Organization details updated successfully'); + toast.success('Details Updated successfully'); }, onError: err => { // eslint-disable-next-line no-console From f686c84366c367e87646ea75fa3376f63cac11ed Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 13:14:58 +0545 Subject: [PATCH 039/113] fix: minor style --- .../components/UpdateUserDetails/OrganizationDetails/index.tsx | 2 +- .../src/components/UpdateUserDetails/Password/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx index 043a23bc..814d1a62 100644 --- a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx @@ -47,7 +47,7 @@ const OrganizationDetails = () => { return (
-

+

Organization Details

diff --git a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx index 3ceb6f29..4f07b498 100644 --- a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx @@ -44,7 +44,7 @@ const Password = () => { return (
-

+

Change Password

From d87f2d6d041ed892a232b50621aa110ad658cff2 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 13:36:58 +0545 Subject: [PATCH 040/113] fix: typo --- .../DescriptionSection/DescriptionBox/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx b/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx index b196e389..c6c20130 100644 --- a/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx +++ b/src/frontend/src/components/DroneOperatorTask/DescriptionSection/DescriptionBox/index.tsx @@ -45,7 +45,7 @@ const DescriptionBox = () => { : null, }, { - name: 'TAsk locked date', + name: 'Task locked date', value: taskData?.updated_at ? taskData?.updated_at?.slice(0, 10) || '-' : null, From b41631bff3bbe51af7828141e3b642469abf867f Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 13:38:09 +0545 Subject: [PATCH 041/113] fix(ser-profile): make patch request on profile data change --- src/frontend/src/services/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/services/common.ts b/src/frontend/src/services/common.ts index 0ed23c61..5faed1b3 100644 --- a/src/frontend/src/services/common.ts +++ b/src/frontend/src/services/common.ts @@ -24,6 +24,6 @@ export const getUserProfileInfo = () => authenticated(api).get('/users/my-info/'); export const patchUserProfile = ({ userId, data }: Record) => - authenticated(api).post(`/users/${userId}/profile`, data, { + authenticated(api).patch(`/users/${userId}/profile`, data, { headers: { 'Content-Type': 'application/json' }, }); From cec7555c4c6755e7232089b3e3ca9d0064a13a91 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 13:39:29 +0545 Subject: [PATCH 042/113] feat(user-profile): show error message --- .../components/UpdateUserDetails/BasicDetails.tsx/index.tsx | 3 +-- .../components/UpdateUserDetails/OrganizationDetails/index.tsx | 1 + .../src/components/UpdateUserDetails/OtherDetails/index.tsx | 1 + .../src/components/UpdateUserDetails/Password/index.tsx | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx index 6db50521..49449916 100644 --- a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx @@ -15,7 +15,6 @@ const BasicDetails = () => { name: userProfile?.name, country: userProfile?.country || null, city: userProfile?.city || null, - password: null, phone_number: userProfile?.phone_number || null, }; const queryClient = useQueryClient(); @@ -33,12 +32,12 @@ const BasicDetails = () => { mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), onSuccess: () => { queryClient.invalidateQueries(['user-profile']); - toast.success('Details Updated Successfully'); }, onError: err => { // eslint-disable-next-line no-console console.log(err); + toast.error(err?.response?.data?.detail || 'Something went wrong'); }, }); diff --git a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx index 814d1a62..0d6377f3 100644 --- a/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/OrganizationDetails/index.tsx @@ -37,6 +37,7 @@ const OrganizationDetails = () => { onError: err => { // eslint-disable-next-line no-console console.log(err); + toast.error(err?.response?.data?.detail || 'Something went wrong'); }, }); diff --git a/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx b/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx index 6f5364b5..dc870efc 100644 --- a/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/OtherDetails/index.tsx @@ -49,6 +49,7 @@ const OtherDetails = () => { onError: err => { // eslint-disable-next-line no-console console.log(err); + toast.error(err?.response?.data?.detail || 'Something went wrong'); }, }); diff --git a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx index 4f07b498..436b14d3 100644 --- a/src/frontend/src/components/UpdateUserDetails/Password/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/Password/index.tsx @@ -29,11 +29,12 @@ const Password = () => { >({ mutationFn: payloadDataObject => patchUserProfile(payloadDataObject), onSuccess: () => { - toast.success('Password Updated successfully'); + toast.success('Password Updated Successfully'); }, onError: err => { // eslint-disable-next-line no-console console.log(err); + toast.error(err?.response?.data?.detail || 'Something went wrong'); }, }); From a10d813614b99f4220108c24f63a0ba95cbd6d6b Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 2 Oct 2024 13:58:00 +0545 Subject: [PATCH 043/113] hot-fix(user-profile): check old & new password before verify the password --- src/backend/app/users/user_routes.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/backend/app/users/user_routes.py b/src/backend/app/users/user_routes.py index 7d4bfcc2..70749835 100644 --- a/src/backend/app/users/user_routes.py +++ b/src/backend/app/users/user_routes.py @@ -88,7 +88,6 @@ async def update_user_profile( Raises: HTTPException: If user with given user_id is not found in the database. """ - user = await user_schemas.DbUser.get_user_by_id(db, user_id) if user_data.id != user_id: raise HTTPException( @@ -100,13 +99,14 @@ async def update_user_profile( raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="User not found") if request.method == "PATCH": - if not user_logic.verify_password( - profile_update.old_password, user.get("password") - ): - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail="Old password is incorrect", - ) + if profile_update.old_password and profile_update.password: + if not user_logic.verify_password( + profile_update.old_password, user.get("password") + ): + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail="Old password is incorrect", + ) user = await user_schemas.DbUserProfile.update(db, user_id, profile_update) return JSONResponse( From 66469eba123962d01da4adeb6924c33e639671c9 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 2 Oct 2024 14:14:18 +0545 Subject: [PATCH 044/113] fix: added message if user do not sent old and new password --- src/backend/app/users/user_routes.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/app/users/user_routes.py b/src/backend/app/users/user_routes.py index 70749835..a2f88809 100644 --- a/src/backend/app/users/user_routes.py +++ b/src/backend/app/users/user_routes.py @@ -107,6 +107,11 @@ async def update_user_profile( status_code=HTTPStatus.BAD_REQUEST, detail="Old password is incorrect", ) + else: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail="Old and new password are required !", + ) user = await user_schemas.DbUserProfile.update(db, user_id, profile_update) return JSONResponse( From 6c0db7fe32819dfadd2ac0766b93c9acb81d301a Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 2 Oct 2024 14:20:35 +0545 Subject: [PATCH 045/113] refac: exception raise on password check --- src/backend/app/users/user_routes.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/backend/app/users/user_routes.py b/src/backend/app/users/user_routes.py index a2f88809..70749835 100644 --- a/src/backend/app/users/user_routes.py +++ b/src/backend/app/users/user_routes.py @@ -107,11 +107,6 @@ async def update_user_profile( status_code=HTTPStatus.BAD_REQUEST, detail="Old password is incorrect", ) - else: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail="Old and new password are required !", - ) user = await user_schemas.DbUserProfile.update(db, user_id, profile_update) return JSONResponse( From 01e5e5030b1b9c0817fb61083f9aabbb4c4f9c2a Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 17:08:42 +0545 Subject: [PATCH 046/113] feat(user-profile): redirect to complete profile page if the user not completed the signup --- .../src/components/common/UserProfile/index.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/common/UserProfile/index.tsx b/src/frontend/src/components/common/UserProfile/index.tsx index cb1bd1b7..ade0db79 100644 --- a/src/frontend/src/components/common/UserProfile/index.tsx +++ b/src/frontend/src/components/common/UserProfile/index.tsx @@ -2,7 +2,7 @@ /* eslint-disable jsx-a11y/no-noninteractive-tabindex */ /* eslint-disable jsx-a11y/no-static-element-interactions */ /* eslint-disable jsx-a11y/click-events-have-key-events */ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import UserAvatar from '@Components/common/UserAvatar'; import { toast } from 'react-toastify'; @@ -13,10 +13,14 @@ export default function UserProfile() { const [toggle, setToggle] = useState(false); const navigate = useNavigate(); - // eslint-disable-next-line no-unused-vars - const { data: userDetails } = useGetUserDetailsQuery(); + const { data: userDetails }: Record = useGetUserDetailsQuery(); const userProfile = getLocalStorageValue('userprofile'); + useEffect(() => { + if (userDetails?.has_user_profile) return; + if (!userDetails?.has_user_profile) navigate('/complete-profile'); + }, [userDetails?.has_user_profile, navigate]); + const settingOptions = [ { id: 1, From 4f30c97b7b902c1b49c793fc32fbd7de284772a7 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 17:09:41 +0545 Subject: [PATCH 047/113] feat(user-profile): redirect to complete profile on google auth success --- src/frontend/src/components/GoogleAuth/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/GoogleAuth/index.tsx b/src/frontend/src/components/GoogleAuth/index.tsx index 7d9d60a7..f6f4bee4 100644 --- a/src/frontend/src/components/GoogleAuth/index.tsx +++ b/src/frontend/src/components/GoogleAuth/index.tsx @@ -47,7 +47,7 @@ function GoogleAuth() { if (userDetails?.has_user_profile) { navigate('/projects'); } else { - navigate('/user-profile'); + navigate('/complete-profile'); } }; await completeLogin(); @@ -56,7 +56,7 @@ function GoogleAuth() { setIsReadyToRedirect(true); }; loginRedirect(); - }, [location.search]); + }, [location.search, navigate]); return ( From b33ed4d72ccf453eaf382acb609996b735e10e25 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 17:11:21 +0545 Subject: [PATCH 048/113] fix(user-profile): minor UI --- .../CompleteUserProfile/FormContents/BasicDetails/index.tsx | 2 +- .../components/UpdateUserDetails/BasicDetails.tsx/index.tsx | 2 +- src/frontend/src/views/CompleteUserProfile/index.tsx | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/components/CompleteUserProfile/FormContents/BasicDetails/index.tsx b/src/frontend/src/components/CompleteUserProfile/FormContents/BasicDetails/index.tsx index 8e9b0973..1975f21c 100644 --- a/src/frontend/src/components/CompleteUserProfile/FormContents/BasicDetails/index.tsx +++ b/src/frontend/src/components/CompleteUserProfile/FormContents/BasicDetails/index.tsx @@ -59,7 +59,7 @@ export default function BasicDetails({ formProps }: { formProps: any }) { placeholder="Enter City" className="naxatw-mt-1" {...register('city', { - setValueAs: (value: string) => value.trim(), + setValueAs: (value: string) => value?.trim(), required: 'City is Required', })} /> diff --git a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx index 49449916..4c589645 100644 --- a/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx +++ b/src/frontend/src/components/UpdateUserDetails/BasicDetails.tsx/index.tsx @@ -96,7 +96,7 @@ const BasicDetails = () => { placeholder="Enter City" className="naxatw-mt-1" {...register('city', { - setValueAs: (value: string) => value.trim(), + setValueAs: (value: string) => value?.trim(), required: 'City is Required', })} /> diff --git a/src/frontend/src/views/CompleteUserProfile/index.tsx b/src/frontend/src/views/CompleteUserProfile/index.tsx index bf0149de..84c16de7 100644 --- a/src/frontend/src/views/CompleteUserProfile/index.tsx +++ b/src/frontend/src/views/CompleteUserProfile/index.tsx @@ -1,6 +1,5 @@ import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; import { useNavigate } from 'react-router-dom'; -import { UserProfileHeader } from '@Components/CompleteUserProfile'; import { useForm } from 'react-hook-form'; import { BasicDetails, @@ -126,8 +125,7 @@ const CompleteUserProfile = () => { }; return ( -
- +
Date: Wed, 2 Oct 2024 17:27:46 +0545 Subject: [PATCH 049/113] fix(user-profile): navigate to complete profile only after the profile fetching is completed --- src/frontend/src/components/common/UserProfile/index.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/common/UserProfile/index.tsx b/src/frontend/src/components/common/UserProfile/index.tsx index ade0db79..b64f406b 100644 --- a/src/frontend/src/components/common/UserProfile/index.tsx +++ b/src/frontend/src/components/common/UserProfile/index.tsx @@ -13,13 +13,14 @@ export default function UserProfile() { const [toggle, setToggle] = useState(false); const navigate = useNavigate(); - const { data: userDetails }: Record = useGetUserDetailsQuery(); + const { data: userDetails, isFetching }: Record = + useGetUserDetailsQuery(); const userProfile = getLocalStorageValue('userprofile'); useEffect(() => { - if (userDetails?.has_user_profile) return; + if (userDetails?.has_user_profile || isFetching) return; if (!userDetails?.has_user_profile) navigate('/complete-profile'); - }, [userDetails?.has_user_profile, navigate]); + }, [userDetails?.has_user_profile, navigate, isFetching]); const settingOptions = [ { From 9203dd6cc084c5aa5504373ef306968277433619 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 2 Oct 2024 17:39:54 +0545 Subject: [PATCH 050/113] fix: typo --- .../CreateProject/FormContents/KeyParameters/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/CreateProject/FormContents/KeyParameters/index.tsx b/src/frontend/src/components/CreateProject/FormContents/KeyParameters/index.tsx index 3dcbefe0..0e6d815b 100644 --- a/src/frontend/src/components/CreateProject/FormContents/KeyParameters/index.tsx +++ b/src/frontend/src/components/CreateProject/FormContents/KeyParameters/index.tsx @@ -126,7 +126,7 @@ const KeyParameters = ({ formProps }: { formProps: UseFormPropsType }) => { max={300} min={0} {...register('altitude_from_ground', { - required: 'Altitude From Round is Required', + required: 'Altitude From ground is Required', valueAsNumber: true, max: { value: 300, From c8dca57d7a19b27cddf51b0339b4a9ce2850e86a Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Fri, 4 Oct 2024 10:14:34 +0545 Subject: [PATCH 051/113] used presigned url for map screenshot in projects endpoint --- src/backend/app/projects/project_schemas.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 219eca16..13902a21 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -23,7 +23,7 @@ ) from psycopg.rows import dict_row from app.config import settings -from app.s3 import get_image_dir_url +from app.s3 import get_presigned_url def validate_geojson( @@ -456,7 +456,8 @@ def set_image_url(cls, values): project_id = values.id if project_id: image_dir = f"projects/{project_id}/map_screenshot.png" - values.image_url = get_image_dir_url(settings.S3_BUCKET_NAME, image_dir) + # values.image_url = get_image_dir_url(settings.S3_BUCKET_NAME, image_dir) + values.image_url = get_presigned_url(settings.S3_BUCKET_NAME, image_dir, 5) return values From 5cea65a90456e4db7e13bbeaa0d1984e9d0a905a Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Fri, 4 Oct 2024 11:31:36 +0545 Subject: [PATCH 052/113] feat: added search features in projects read endpoit --- src/backend/app/projects/project_routes.py | 3 ++- src/backend/app/projects/project_schemas.py | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index a10b7fb7..422f62b7 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -309,6 +309,7 @@ async def read_projects( filter_by_owner: Optional[bool] = Query( False, description="Filter projects by authenticated user (creator)" ), + search: Optional[str] = Query(None, description="Search projects by name"), skip: int = 0, limit: int = 100, ): @@ -317,7 +318,7 @@ async def read_projects( try: user_id = user_data.id if filter_by_owner else None projects = await project_schemas.DbProject.all( - db, user_id=user_id, skip=skip, limit=limit + db, user_id=user_id, search=search, skip=skip, limit=limit ) if not projects: return [] diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 13902a21..d280410c 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -285,13 +285,15 @@ async def one(db: Connection, project_id: uuid.UUID): async def all( db: Connection, user_id: Optional[str] = None, + search: Optional[str] = None, skip: int = 0, limit: int = 100, ): """ Get all projects, count total tasks and task states (ongoing, completed, etc.). - Optionally filter by the project creator (user). + Optionally filter by the project creator (user) and search by project name. """ + search_term = f"%{search}%" if search else "%" async with db.cursor(row_factory=dict_row) as cur: await cur.execute( """ @@ -319,12 +321,18 @@ async def all( ) AS te ON te.task_id = t.id WHERE (p.author_id = COALESCE(%(user_id)s, p.author_id)) + AND p.name ILIKE %(search)s GROUP BY p.id ORDER BY p.created_at DESC OFFSET %(skip)s LIMIT %(limit)s """, - {"skip": skip, "limit": limit, "user_id": user_id}, + { + "skip": skip, + "limit": limit, + "user_id": user_id, + "search": search_term, + }, ) db_projects = await cur.fetchall() return db_projects From 81d86de7bde1d5cf3d7cc5bef499584733bb0d07 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 10:33:25 +0545 Subject: [PATCH 053/113] fix(update-userProfile): update background color --- src/frontend/src/views/UpdateUserProfile/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/views/UpdateUserProfile/index.tsx b/src/frontend/src/views/UpdateUserProfile/index.tsx index 2d7342f8..3054f022 100644 --- a/src/frontend/src/views/UpdateUserProfile/index.tsx +++ b/src/frontend/src/views/UpdateUserProfile/index.tsx @@ -42,13 +42,13 @@ const UpdateUserProfile = () => { }, []); return ( -
+
-
+
Date: Tue, 8 Oct 2024 10:43:27 +0545 Subject: [PATCH 054/113] feat(dashboard): show user role --- .../src/components/Dashboard/DashboardSidebar/index.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx b/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx index 6a5a89e0..0f83a2b0 100644 --- a/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx +++ b/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx @@ -6,15 +6,17 @@ import hasErrorBoundary from '@Utils/hasErrorBoundary'; const DashboardSidebar = () => { const navigate = useNavigate(); - const userDetails = getLocalStorageValue('userprofile'); + const role = localStorage.getItem('signedInAs'); return ( profile
{userDetails?.name}
+

{role}

{userDetails?.email_address}

+ + ); + })} + +
); } diff --git a/src/frontend/src/components/common/FormUI/SearchInput/index.tsx b/src/frontend/src/components/common/FormUI/SearchInput/index.tsx index f48134d0..bf32e15b 100644 --- a/src/frontend/src/components/common/FormUI/SearchInput/index.tsx +++ b/src/frontend/src/components/common/FormUI/SearchInput/index.tsx @@ -39,7 +39,7 @@ export default function SearchInput({ )} diff --git a/src/frontend/src/constants/index.ts b/src/frontend/src/constants/index.ts index 66be6409..dca9fd77 100644 --- a/src/frontend/src/constants/index.ts +++ b/src/frontend/src/constants/index.ts @@ -79,3 +79,11 @@ export const droneOperatorKeys = [ 'confirm_password', // 'country_code', ]; + +export const rowsPerPageOptions = [ + { label: '10', value: 10 }, + { label: '20', value: 20 }, + { label: '30', value: 30 }, + { label: '50', value: 50 }, + { label: '100', value: 100 }, +]; diff --git a/src/frontend/src/hooks/usePagination.tsx b/src/frontend/src/hooks/usePagination.tsx new file mode 100644 index 00000000..874f5ec3 --- /dev/null +++ b/src/frontend/src/hooks/usePagination.tsx @@ -0,0 +1,93 @@ +import { useMemo } from 'react'; + +interface usePaginationIProps { + totalCount: number; + pageSize: number; + siblingCount: number; + currentPage: number; +} + +export const DOTS = '...'; + +const range = (start: number, end: number) => { + const length = end - start + 1; + /* + Create an array of certain length and set the elements within it from + start value to end value. + */ + return Array.from({ length }, (_, idx) => idx + start); +}; + +export default function usePagination({ + totalCount, + pageSize, + siblingCount = 1, + currentPage, +}: usePaginationIProps) { + const paginationRange = useMemo(() => { + const totalPageCount = Math.ceil(totalCount / pageSize); + + // Pages count is determined as siblingCount + firstPage + lastPage + currentPage + 2*DOTS + const totalPageNumbers = siblingCount * 2 + 5; + + /* + Case 1: + If the number of pages is less than the page numbers we want to show in our + paginationComponent, we return the range [1..totalPageCount] + */ + if (totalPageNumbers >= totalPageCount) { + return range(1, totalPageCount); + } + + /* + Calculate left and right sibling index and make sure they are within range 1 and totalPageCount + */ + const leftSiblingIndex = Math.max(currentPage - siblingCount, 1); + const rightSiblingIndex = Math.min( + currentPage + siblingCount, + totalPageCount, + ); + + /* + We do not show dots just when there is just one page number to be inserted between the extremes of sibling and the page limits i.e 1 and totalPageCount. Hence we are using leftSiblingIndex > 2 and rightSiblingIndex < totalPageCount - 2 + */ + const shouldShowLeftDots = leftSiblingIndex > 2; + const shouldShowRightDots = rightSiblingIndex < totalPageCount - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPageCount; + + /* + Case 2: No left dots to show, but rights dots to be shown + */ + if (!shouldShowLeftDots && shouldShowRightDots) { + const leftItemCount = 3 + 1 * siblingCount; + const leftRange = range(1, leftItemCount); + + return [...leftRange, DOTS, totalPageCount]; + } + + /* + Case 3: No right dots to show, but left dots to be shown + */ + if (shouldShowLeftDots && !shouldShowRightDots) { + const rightItemCount = 3 + 2 * siblingCount; + const rightRange = range( + totalPageCount - rightItemCount + 1, + totalPageCount, + ); + return [firstPageIndex, DOTS, ...rightRange]; + } + + /* + Case 4: Both left and right dots to be shown + */ + if (shouldShowLeftDots && shouldShowRightDots) { + const middleRange = range(leftSiblingIndex, rightSiblingIndex); + return [firstPageIndex, DOTS, ...middleRange, DOTS, lastPageIndex]; + } + return []; + }, [totalCount, pageSize, siblingCount, currentPage]); + + return paginationRange; +} diff --git a/src/frontend/src/services/createproject.ts b/src/frontend/src/services/createproject.ts index 18dbdf60..77462dc1 100644 --- a/src/frontend/src/services/createproject.ts +++ b/src/frontend/src/services/createproject.ts @@ -1,8 +1,8 @@ /* eslint-disable import/prefer-default-export */ import { authenticated, api } from '.'; -export const getProjectsList = (filterByOwner: boolean) => - authenticated(api).get(`/projects/?filter_by_owner=${filterByOwner}`); +export const getProjectsList = (params: Record) => + authenticated(api).get(`/projects/`, { params }); export const getProjectDetail = (id: string) => authenticated(api).get(`/projects/${id}`); diff --git a/src/frontend/src/store/slices/common.ts b/src/frontend/src/store/slices/common.ts index 077d5061..f9cc5bc8 100644 --- a/src/frontend/src/store/slices/common.ts +++ b/src/frontend/src/store/slices/common.ts @@ -15,6 +15,7 @@ export interface CommonState { openSignInMenu: boolean; userProfileActiveTab: number; isCertifiedDroneUser: 'yes' | 'no'; + projectSearchKey: string; } const initialState: CommonState = { @@ -26,6 +27,7 @@ const initialState: CommonState = { openSignInMenu: false, userProfileActiveTab: 1, isCertifiedDroneUser: 'no', + projectSearchKey: '', }; const setCommonState: CaseReducer< diff --git a/src/frontend/src/views/Projects/index.tsx b/src/frontend/src/views/Projects/index.tsx index 2c58ad94..ff4914fc 100644 --- a/src/frontend/src/views/Projects/index.tsx +++ b/src/frontend/src/views/Projects/index.tsx @@ -1,3 +1,5 @@ +import { useEffect, useState } from 'react'; +import { useDispatch } from 'react-redux'; import { useTypedSelector } from '@Store/hooks'; import { ProjectCard, @@ -6,10 +8,11 @@ import { } from '@Components/Projects'; import { useGetProjectsListQuery } from '@Api/projects'; import ProjectCardSkeleton from '@Components/Projects/ProjectCardSkeleton'; -import { useEffect } from 'react'; import hasErrorBoundary from '@Utils/hasErrorBoundary'; import { setCreateProjectState } from '@Store/actions/createproject'; -import { useDispatch } from 'react-redux'; +import Pagination from '@Components/Projects/Pagination'; +import Skeleton from '@Components/RadixComponents/Skeleton'; +import { setCommonState } from '@Store/actions/common'; const Projects = () => { const dispatch = useDispatch(); @@ -17,21 +20,45 @@ const Projects = () => { const projectsFilterByOwner = useTypedSelector( state => state.createproject.ProjectsFilterByOwner, ); + const projectSearchKey = useTypedSelector( + state => state.common.projectSearchKey, + ); + const [paginationState, setSetPaginationState] = useState({ + activePage: 1, + selectedNumberOfRows: 10, + }); + + const handlePaginationState = (value: Record) => { + setSetPaginationState(prev => ({ ...prev, ...value })); + }; // fetch api for projectsList - const { data: projectsList, isLoading }: Record = - useGetProjectsListQuery(projectsFilterByOwner); + const { data: projectListData, isFetching: isLoading }: Record = + useGetProjectsListQuery({ + queryKey: { + // @ts-ignore + filter_by_owner: projectsFilterByOwner === 'yes', + page: paginationState?.activePage, + results_per_page: paginationState?.selectedNumberOfRows, + search: projectSearchKey, + }, + }); + + useEffect(() => { + handlePaginationState({ activePage: 1 }); + }, [projectSearchKey, projectsFilterByOwner]); useEffect(() => { return () => { dispatch(setCreateProjectState({ ProjectsFilterByOwner: 'no' })); + dispatch(setCommonState({ projectSearchKey: '' })); }; }, [dispatch]); return (
-
+
{ ) : ( <> - {!projectsList?.length &&
No projects available
} - {(projectsList as Record[])?.map( + {!projectListData?.results?.length && ( +
No projects available
+ )} + {(projectListData?.results as Record[])?.map( (project: Record) => ( {
{showMap && (
- + {!isLoading ? ( + + ) : ( + + )}
)}
+
+ +
); }; From 475527e1dd2c9ecd6aace9db972a1a6a0547238a Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 8 Oct 2024 11:44:24 +0545 Subject: [PATCH 057/113] feat: update task state to reflect the start of image processing --- src/backend/app/projects/image_processing.py | 17 ++++++++++++++--- src/backend/app/projects/project_routes.py | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index d36d3424..69f904eb 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -125,7 +125,7 @@ def download_results(self, task, output_path): log.info("Download completed.") return path - def process_images_from_s3(self, bucket_name, name=None, options=[]): + async def process_images_from_s3(self, bucket_name, name=None, options=[]): """ Processes images from MinIO storage. @@ -136,13 +136,24 @@ def process_images_from_s3(self, bucket_name, name=None, options=[]): :param options: Processing options ([{'name': optionName, 'value': optionValue}, ...]). :return: The task object. """ - # Create a temporary directory to store downloaded images + # Create a temporary directory to store downloaded imagesfeat/update-completed-task temp_dir = tempfile.mkdtemp() try: self.download_images_from_s3(bucket_name, temp_dir) images_list = self.list_images(temp_dir) + # TODO: Update task state to reflect completion of image uploads (will remove thsi.). + await task_logic.update_task_state( + self.db, + self.project.id, + self.task_id, + self.user_id, + "Task images processing started.", + State.LOCKED_FOR_MAPPING, + State.IMAGE_PROCESSED, + timestamp(), + ) # Start a new processing task task = self.process_new_task(images_list, name=name, options=options) # Monitor task progress @@ -156,7 +167,7 @@ def process_images_from_s3(self, bucket_name, name=None, options=[]): s3_path = f"projects/{self.project_id}/{self.task_id}/assets.zip" add_file_to_bucket(bucket_name, path_to_download, s3_path) # now update the task as completed in Db. - task_logic.update_task_state( + await task_logic.update_task_state( self.db, self.project_id, self.task_id, diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index 2227611b..31381529 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -3,6 +3,7 @@ import uuid from typing import Annotated, Optional from uuid import UUID +from app.tasks import task_logic import geojson from datetime import timedelta from fastapi import ( @@ -24,13 +25,13 @@ from shapely.ops import unary_union from app.projects import project_schemas, project_deps, project_logic from app.db import database -from app.models.enums import HTTPStatus +from app.models.enums import HTTPStatus, State from app.s3 import s3_client from app.config import settings from app.users.user_deps import login_required from app.users.user_schemas import AuthUser from app.tasks import task_schemas -from app.utils import geojson_to_kml +from app.utils import geojson_to_kml, timestamp from app.users import user_schemas @@ -352,6 +353,17 @@ async def process_imagery( db: Annotated[Connection, Depends(database.get_db)], ): user_id = user_data.id + # TODO: Update task state to reflect completion of image uploads. + await task_logic.update_task_state( + db, + project.id, + task_id, + user_id, + "Task images upload completed.", + State.LOCKED_FOR_MAPPING, + State.IMAGE_UPLOADED, + timestamp(), + ) background_tasks.add_task( project_logic.process_drone_images, project.id, task_id, user_id, db ) From 94679cbc557332b39b4a2a25bfd8b6dc59fcac39 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 8 Oct 2024 11:47:02 +0545 Subject: [PATCH 058/113] fix: remove comment from the task update function --- src/backend/app/projects/image_processing.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 69f904eb..367090e6 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -136,14 +136,13 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): :param options: Processing options ([{'name': optionName, 'value': optionValue}, ...]). :return: The task object. """ - # Create a temporary directory to store downloaded imagesfeat/update-completed-task + # Create a temporary directory to store downloaded images temp_dir = tempfile.mkdtemp() try: self.download_images_from_s3(bucket_name, temp_dir) images_list = self.list_images(temp_dir) - # TODO: Update task state to reflect completion of image uploads (will remove thsi.). await task_logic.update_task_state( self.db, self.project.id, From d633c45b6724c481629f746eda5f30f798c92c84 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 8 Oct 2024 11:54:57 +0545 Subject: [PATCH 059/113] fix: adjust the state based on processing... --- src/backend/app/projects/image_processing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 367090e6..0be67caa 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -149,7 +149,7 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): self.task_id, self.user_id, "Task images processing started.", - State.LOCKED_FOR_MAPPING, + State.IMAGE_UPLOADED, State.IMAGE_PROCESSED, timestamp(), ) @@ -172,7 +172,7 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): self.task_id, self.user_id, "Task completed.", - State.LOCKED_FOR_MAPPING, + State.IMAGE_PROCESSED, State.UNLOCKED_DONE, timestamp(), ) From 1f7bb9e5869ca023b94ac50a5d58ea48caccf10e Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 8 Oct 2024 12:10:19 +0545 Subject: [PATCH 060/113] fix: refine the state of task processing --- src/backend/app/projects/image_processing.py | 14 ++------------ src/backend/app/projects/project_schemas.py | 2 +- src/backend/app/tasks/task_routes.py | 2 +- src/backend/app/tasks/task_schemas.py | 2 +- 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 0be67caa..ef500881 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -143,16 +143,6 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): images_list = self.list_images(temp_dir) - await task_logic.update_task_state( - self.db, - self.project.id, - self.task_id, - self.user_id, - "Task images processing started.", - State.IMAGE_UPLOADED, - State.IMAGE_PROCESSED, - timestamp(), - ) # Start a new processing task task = self.process_new_task(images_list, name=name, options=options) # Monitor task progress @@ -168,12 +158,12 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): # now update the task as completed in Db. await task_logic.update_task_state( self.db, - self.project_id, + self.project.id, self.task_id, self.user_id, "Task completed.", + State.IMAGE_UPLOADED, State.IMAGE_PROCESSED, - State.UNLOCKED_DONE, timestamp(), ) return task diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 74eeab32..ef3d99b9 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -253,7 +253,7 @@ async def one(db: Connection, project_id: uuid.UUID): CASE WHEN te.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' - WHEN te.state = 'UNLOCKED_DONE' THEN 'completed' + WHEN te.state = 'IMAGE_PROCESSED' THEN 'completed' WHEN te.state = 'UNFLYABLE_TASK' THEN 'unflyable task' ELSE 'UNLOCKED_TO_MAP' END AS calculated_state diff --git a/src/backend/app/tasks/task_routes.py b/src/backend/app/tasks/task_routes.py index 97e21d9f..32f267a7 100644 --- a/src/backend/app/tasks/task_routes.py +++ b/src/backend/app/tasks/task_routes.py @@ -97,7 +97,7 @@ async def get_task_stats( SELECT COUNT(CASE WHEN te.state = 'REQUEST_FOR_MAPPING' THEN 1 END) AS request_logs, COUNT(CASE WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 1 END) AS ongoing_tasks, - COUNT(CASE WHEN te.state = 'UNLOCKED_DONE' THEN 1 END) AS completed_tasks, + COUNT(CASE WHEN te.state = 'IMAGE_PROCESSED' THEN 1 END) AS completed_tasks, COUNT(CASE WHEN te.state = 'UNFLYABLE_TASK' THEN 1 END) AS unflyable_tasks FROM ( SELECT DISTINCT ON (te.task_id) diff --git a/src/backend/app/tasks/task_schemas.py b/src/backend/app/tasks/task_schemas.py index 9ad70c59..6ef0cf94 100644 --- a/src/backend/app/tasks/task_schemas.py +++ b/src/backend/app/tasks/task_schemas.py @@ -170,7 +170,7 @@ async def get_tasks_by_user( CASE WHEN task_events.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' WHEN task_events.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' - WHEN task_events.state = 'UNLOCKED_DONE' THEN 'completed' + WHEN task_events.state = 'IMAGE_PROCESSED' THEN 'completed' WHEN task_events.state = 'UNFLYABLE_TASK' THEN 'unflyable task' ELSE 'UNLOCKED_TO_MAP' END AS state From 46e37708a8fac55a5cfbe4f4079da676b4bec3a5 Mon Sep 17 00:00:00 2001 From: Pradip Thapa Date: Tue, 8 Oct 2024 12:18:10 +0545 Subject: [PATCH 061/113] Feat: Updated the task as completed after process from S3 (#270) * feat: updated the task as completed after process from s3 * feat: update task state to reflect the start of image processing * fix: remove comment from the task update function * fix: adjust the state based on processing... * fix: refine the state of task processing --- src/backend/app/projects/image_processing.py | 21 ++++++++++++++++++- src/backend/app/projects/project_logic.py | 8 +++++-- src/backend/app/projects/project_routes.py | 22 +++++++++++++++++--- src/backend/app/projects/project_schemas.py | 2 +- src/backend/app/tasks/task_routes.py | 2 +- src/backend/app/tasks/task_schemas.py | 2 +- 6 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 09215ec8..ef500881 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -2,10 +2,14 @@ import tempfile import shutil from pathlib import Path +from app.tasks import task_logic +from app.models.enums import State +from app.utils import timestamp from pyodm import Node from app.s3 import get_file_from_bucket, list_objects_from_bucket, add_file_to_bucket from loguru import logger as log from concurrent.futures import ThreadPoolExecutor +from psycopg import Connection class DroneImageProcessor: @@ -14,6 +18,8 @@ def __init__( node_odm_url: str, project_id: uuid.UUID, task_id: uuid.UUID, + user_id: str, + db: Connection, ): """ Initializes the connection to the ODM node. @@ -22,6 +28,8 @@ def __init__( self.node = Node.from_url(node_odm_url) self.project_id = project_id self.task_id = task_id + self.user_id = user_id + self.db = db def options_list_to_dict(self, options=[]): """ @@ -117,7 +125,7 @@ def download_results(self, task, output_path): log.info("Download completed.") return path - def process_images_from_s3(self, bucket_name, name=None, options=[]): + async def process_images_from_s3(self, bucket_name, name=None, options=[]): """ Processes images from MinIO storage. @@ -147,6 +155,17 @@ def process_images_from_s3(self, bucket_name, name=None, options=[]): # Upload the results into s3 s3_path = f"projects/{self.project_id}/{self.task_id}/assets.zip" add_file_to_bucket(bucket_name, path_to_download, s3_path) + # now update the task as completed in Db. + await task_logic.update_task_state( + self.db, + self.project.id, + self.task_id, + self.user_id, + "Task completed.", + State.IMAGE_UPLOADED, + State.IMAGE_PROCESSED, + timestamp(), + ) return task finally: diff --git a/src/backend/app/projects/project_logic.py b/src/backend/app/projects/project_logic.py index 624337b3..d5a5dfc8 100644 --- a/src/backend/app/projects/project_logic.py +++ b/src/backend/app/projects/project_logic.py @@ -165,9 +165,13 @@ async def preview_split_by_square(boundary: str, meters: int): ) -def process_drone_images(project_id: uuid.UUID, task_id: uuid.UUID): +def process_drone_images( + project_id: uuid.UUID, task_id: uuid.UUID, user_id: str, db: Connection +): # Initialize the processor - processor = DroneImageProcessor(settings.NODE_ODM_URL, project_id, task_id) + processor = DroneImageProcessor( + settings.NODE_ODM_URL, project_id, task_id, user_id, db + ) # Define processing options options = [ diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index 8d9d5104..3e7f2060 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -3,6 +3,7 @@ import uuid from typing import Annotated, Optional from uuid import UUID +from app.tasks import task_logic import geojson from datetime import timedelta from fastapi import ( @@ -24,13 +25,13 @@ from shapely.ops import unary_union from app.projects import project_schemas, project_deps, project_logic from app.db import database -from app.models.enums import HTTPStatus +from app.models.enums import HTTPStatus, State from app.s3 import s3_client from app.config import settings from app.users.user_deps import login_required from app.users.user_schemas import AuthUser from app.tasks import task_schemas -from app.utils import geojson_to_kml +from app.utils import geojson_to_kml, timestamp from app.users import user_schemas @@ -366,8 +367,23 @@ async def process_imagery( ], user_data: Annotated[AuthUser, Depends(login_required)], background_tasks: BackgroundTasks, + db: Annotated[Connection, Depends(database.get_db)], ): - background_tasks.add_task(project_logic.process_drone_images, project.id, task_id) + user_id = user_data.id + # TODO: Update task state to reflect completion of image uploads. + await task_logic.update_task_state( + db, + project.id, + task_id, + user_id, + "Task images upload completed.", + State.LOCKED_FOR_MAPPING, + State.IMAGE_UPLOADED, + timestamp(), + ) + background_tasks.add_task( + project_logic.process_drone_images, project.id, task_id, user_id, db + ) return {"message": "Processing started"} diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 9d963f57..9629cfb0 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -253,7 +253,7 @@ async def one(db: Connection, project_id: uuid.UUID): CASE WHEN te.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' - WHEN te.state = 'UNLOCKED_DONE' THEN 'completed' + WHEN te.state = 'IMAGE_PROCESSED' THEN 'completed' WHEN te.state = 'UNFLYABLE_TASK' THEN 'unflyable task' ELSE 'UNLOCKED_TO_MAP' END AS calculated_state diff --git a/src/backend/app/tasks/task_routes.py b/src/backend/app/tasks/task_routes.py index 97e21d9f..32f267a7 100644 --- a/src/backend/app/tasks/task_routes.py +++ b/src/backend/app/tasks/task_routes.py @@ -97,7 +97,7 @@ async def get_task_stats( SELECT COUNT(CASE WHEN te.state = 'REQUEST_FOR_MAPPING' THEN 1 END) AS request_logs, COUNT(CASE WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 1 END) AS ongoing_tasks, - COUNT(CASE WHEN te.state = 'UNLOCKED_DONE' THEN 1 END) AS completed_tasks, + COUNT(CASE WHEN te.state = 'IMAGE_PROCESSED' THEN 1 END) AS completed_tasks, COUNT(CASE WHEN te.state = 'UNFLYABLE_TASK' THEN 1 END) AS unflyable_tasks FROM ( SELECT DISTINCT ON (te.task_id) diff --git a/src/backend/app/tasks/task_schemas.py b/src/backend/app/tasks/task_schemas.py index 9ad70c59..6ef0cf94 100644 --- a/src/backend/app/tasks/task_schemas.py +++ b/src/backend/app/tasks/task_schemas.py @@ -170,7 +170,7 @@ async def get_tasks_by_user( CASE WHEN task_events.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' WHEN task_events.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' - WHEN task_events.state = 'UNLOCKED_DONE' THEN 'completed' + WHEN task_events.state = 'IMAGE_PROCESSED' THEN 'completed' WHEN task_events.state = 'UNFLYABLE_TASK' THEN 'unflyable task' ELSE 'UNLOCKED_TO_MAP' END AS state From 0a5935889e8ec867c3e75da0ff2b23453b8266c6 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 13:12:24 +0545 Subject: [PATCH 062/113] feat(projects): Show status on project card --- .../components/Projects/ProjectCard/index.tsx | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/components/Projects/ProjectCard/index.tsx b/src/frontend/src/components/Projects/ProjectCard/index.tsx index 11a6e677..7fc7a207 100644 --- a/src/frontend/src/components/Projects/ProjectCard/index.tsx +++ b/src/frontend/src/components/Projects/ProjectCard/index.tsx @@ -5,14 +5,17 @@ interface IProjectCardProps { title: string; description: string; imageUrl: string | null; + totalTasks: number; + ongoingTasks: number; } export default function ProjectCard({ id, title, description, - imageUrl, + totalTasks, + ongoingTasks, }: IProjectCardProps) { const navigate = useNavigate(); const onProjectCardClick = () => { @@ -23,9 +26,9 @@ export default function ProjectCard({
-

+

{imageUrl ? ( )}

-

- #{id} -

+
+

+ ID:#{id} +

+
+
+ Ongoing +
+
+

{title}

{description}

+
+
+

{ongoingTasks}

{' '} +

/

+

{totalTasks}

Tasks Ongoing

+
+
+
+
+
); } From 3740f2f599aba1f90b4134cf0c2be35f510cf430 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 13:28:00 +0545 Subject: [PATCH 063/113] feat(dashboard): update UI and pass other project details on project card props --- src/frontend/src/views/Projects/index.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/views/Projects/index.tsx b/src/frontend/src/views/Projects/index.tsx index 2c58ad94..c767e7c7 100644 --- a/src/frontend/src/views/Projects/index.tsx +++ b/src/frontend/src/views/Projects/index.tsx @@ -33,8 +33,8 @@ const Projects = () => {
{isLoading ? ( <> @@ -50,9 +50,12 @@ const Projects = () => { ), )} @@ -60,7 +63,7 @@ const Projects = () => { )}
{showMap && ( -
+
)} From 83ddfe3dea3c653161480a2beb4c995a1e61c492 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 8 Oct 2024 13:54:55 +0545 Subject: [PATCH 064/113] feat: update the status of each projects on projects list endpoint --- src/backend/app/projects/project_schemas.py | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index ef3d99b9..3ca6575f 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -341,7 +341,10 @@ async def all( COUNT(t.id) AS total_task_count, -- Count based on the latest state of tasks - COUNT(CASE WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 1 END) AS ongoing_task_count + COUNT(CASE WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 1 END) AS ongoing_task_count, + + -- Count based on the latest state of tasks + COUNT(CASE WHEN te.state = 'IMAGE_PROCESSED' THEN 1 END) AS completed_task_count FROM projects p LEFT JOIN tasks t ON t.project_id = p.id @@ -492,6 +495,8 @@ class ProjectOut(BaseModel): tasks: Optional[list[TaskOut]] = [] image_url: Optional[str] = None ongoing_task_count: Optional[int] = 0 + completed_task_count: Optional[int] = 0 + status: Optional[str] = "not-started" @model_validator(mode="after") def set_image_url(cls, values): @@ -503,6 +508,21 @@ def set_image_url(cls, values): values.image_url = get_presigned_url(settings.S3_BUCKET_NAME, image_dir, 5) return values + @model_validator(mode="after") + def calculate_status(cls, values): + """Set the project status based on task counts.""" + ongoing_task_count = values.ongoing_task_count + completed_task_count = values.completed_task_count + + if ongoing_task_count == 0: + values.status = "not-started" + elif ongoing_task_count > 0 and ongoing_task_count != completed_task_count: + values.status = "ongoing" + elif ongoing_task_count == completed_task_count: + values.status = "completed" + + return values + class PresignedUrlRequest(BaseModel): project_id: uuid.UUID From 647998c60a9d08b5aa6af6785a1e47620f48663c Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 13:55:07 +0545 Subject: [PATCH 065/113] feat(dashboard): show slug on project card --- src/frontend/src/components/Projects/ProjectCard/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/Projects/ProjectCard/index.tsx b/src/frontend/src/components/Projects/ProjectCard/index.tsx index 7fc7a207..2e79fea0 100644 --- a/src/frontend/src/components/Projects/ProjectCard/index.tsx +++ b/src/frontend/src/components/Projects/ProjectCard/index.tsx @@ -7,6 +7,7 @@ interface IProjectCardProps { imageUrl: string | null; totalTasks: number; ongoingTasks: number; + slug: string; } export default function ProjectCard({ @@ -16,6 +17,7 @@ export default function ProjectCard({ imageUrl, totalTasks, ongoingTasks, + slug, }: IProjectCardProps) { const navigate = useNavigate(); const onProjectCardClick = () => { @@ -43,7 +45,7 @@ export default function ProjectCard({

- ID:#{id} + ID:#{slug}

From 28ce0a6de3dfdcd062cd336beb169825fa5aa35d Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Tue, 8 Oct 2024 15:14:54 +0545 Subject: [PATCH 066/113] feat: refine the status of tasks --- src/backend/app/projects/project_schemas.py | 6 +++--- src/backend/app/tasks/task_schemas.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 3ca6575f..5fb32616 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -252,10 +252,10 @@ async def one(db: Connection, project_id: uuid.UUID): te.user_id, CASE WHEN te.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' - WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' + WHEN te.state = 'LOCKED_FOR_MAPPING' OR te.state = 'IMAGE_UPLOADED' THEN 'ongoing' WHEN te.state = 'IMAGE_PROCESSED' THEN 'completed' WHEN te.state = 'UNFLYABLE_TASK' THEN 'unflyable task' - ELSE 'UNLOCKED_TO_MAP' + ELSE '' END AS calculated_state FROM task_events te @@ -273,7 +273,7 @@ async def one(db: Connection, project_id: uuid.UUID): ST_YMin(ST_Envelope(t.outline)) AS ymin, ST_XMax(ST_Envelope(t.outline)) AS xmax, ST_YMax(ST_Envelope(t.outline)) AS ymax, - COALESCE(tsc.calculated_state, 'UNLOCKED_TO_MAP') AS state, + COALESCE(tsc.calculated_state) AS state, tsc.user_id, u.name, ST_Area(ST_Transform(t.outline, 3857)) / 1000000 AS task_area diff --git a/src/backend/app/tasks/task_schemas.py b/src/backend/app/tasks/task_schemas.py index 6ef0cf94..93d9350d 100644 --- a/src/backend/app/tasks/task_schemas.py +++ b/src/backend/app/tasks/task_schemas.py @@ -169,10 +169,10 @@ async def get_tasks_by_user( task_events.updated_at, CASE WHEN task_events.state = 'REQUEST_FOR_MAPPING' THEN 'request logs' - WHEN task_events.state = 'LOCKED_FOR_MAPPING' THEN 'ongoing' + WHEN task_events.state = 'LOCKED_FOR_MAPPING' OR task_events.state = 'IMAGE_UPLOADED' THEN 'ongoing' WHEN task_events.state = 'IMAGE_PROCESSED' THEN 'completed' WHEN task_events.state = 'UNFLYABLE_TASK' THEN 'unflyable task' - ELSE 'UNLOCKED_TO_MAP' + ELSE '' END AS state FROM task_events From fc9d2ddd906a267d8b2d77d3cb3f538541fac356 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 15:28:32 +0545 Subject: [PATCH 067/113] feat(project-details): add new status on legend --- .../src/components/IndividualProject/MapSection/Legend.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx b/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx index 3858c8f3..919bfc6a 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx @@ -22,6 +22,10 @@ const Legend = () => {
Finished Tasks
+
+
+
Image Uploaded
+
Requested Tasks
From 79751fa128f85914a261389657d7b865476f56f7 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 15:29:26 +0545 Subject: [PATCH 068/113] feat(project-details): show skeleton on project data fetching --- src/frontend/src/views/IndividualProject/index.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/views/IndividualProject/index.tsx b/src/frontend/src/views/IndividualProject/index.tsx index e218493a..618543ee 100644 --- a/src/frontend/src/views/IndividualProject/index.tsx +++ b/src/frontend/src/views/IndividualProject/index.tsx @@ -8,6 +8,7 @@ import { MapSection, Tasks, } from '@Components/IndividualProject'; +import Skeleton from '@Components/RadixComponents/Skeleton'; import { projectOptions } from '@Constants/index'; import { setProjectState } from '@Store/actions/project'; import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; @@ -41,7 +42,7 @@ const IndividualProject = () => { state => state.project.individualProjectActiveTab, ); - const { data: projectData, isLoading: isProjectDataLoading } = + const { data: projectData, isFetching: isProjectDataFetching } = useGetProjectsDetailQuery(id as string, { onSuccess: (res: any) => { dispatch( @@ -102,12 +103,16 @@ const IndividualProject = () => { {getActiveTabContent( individualProjectActiveTab, projectData as Record, - isProjectDataLoading, + isProjectDataFetching, )}
- + {isProjectDataFetching ? ( + + ) : ( + } /> + )}
From de438ad553154a1493d6bbc06a45b5dedc3600b0 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 15:31:54 +0545 Subject: [PATCH 069/113] feat(project-details): fill different color for completed task and image uploaded task show go to task button --- .../IndividualProject/MapSection/index.tsx | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/frontend/src/components/IndividualProject/MapSection/index.tsx b/src/frontend/src/components/IndividualProject/MapSection/index.tsx index 3f196cc0..3aad268e 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/index.tsx @@ -1,5 +1,10 @@ /* eslint-disable no-nested-ternary */ /* eslint-disable no-unused-vars */ +import { useCallback, useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { LngLatBoundsLike, Map } from 'maplibre-gl'; +import { FeatureCollection } from 'geojson'; +import { toast } from 'react-toastify'; import { useGetProjectsDetailQuery, useGetTaskStatesQuery, @@ -19,14 +24,9 @@ import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; import { useMutation } from '@tanstack/react-query'; import getBbox from '@turf/bbox'; import hasErrorBoundary from '@Utils/hasErrorBoundary'; -import { FeatureCollection } from 'geojson'; -import { LngLatBoundsLike, Map } from 'maplibre-gl'; -import { useCallback, useEffect, useState } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; -import { toast } from 'react-toastify'; import Legend from './Legend'; -const MapSection = () => { +const MapSection = ({ projectData }: { projectData: Record }) => { const { id } = useParams(); const navigate = useNavigate(); const dispatch = useTypedDispatch(); @@ -39,10 +39,6 @@ const MapSection = () => { ); const { data: userDetails }: Record = useGetUserDetailsQuery(); - const { data: projectData }: Record = useGetProjectsDetailQuery( - id as string, - ); - const { map, isMapLoaded } = useMapLibreGLMap({ mapOptions: { zoom: 5, @@ -143,8 +139,11 @@ const MapSection = () => { return `This task is locked for mapping ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; case 'UNFLYABLE_TASK': return 'This task is not flyable'; - case 'COMPLETED': - return 'This Task is completed'; + case 'IMAGE_UPLOADED': + return `This Task's Images has been uploaded ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; + case 'IMAGE_PROCESSED': + return `This Task is completed ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; + default: return ''; } @@ -263,14 +262,32 @@ const MapSection = () => { 'fill-opacity': 0.5, }, } - : { - type: 'fill', - paint: { - 'fill-color': '#ffffff', - 'fill-outline-color': '#484848', - 'fill-opacity': 0.5, - }, - } + : taskStatusObj?.[`${task?.id}`] === 'IMAGE_UPLOADED' + ? { + type: 'fill', + paint: { + 'fill-color': '#9C77B2', + 'fill-outline-color': '#484848', + 'fill-opacity': 0.5, + }, + } + : taskStatusObj?.[`${task?.id}`] === 'IMAGE_PROCESSED' + ? { + type: 'fill', + paint: { + 'fill-color': '#ACD2C4', + 'fill-outline-color': '#484848', + 'fill-opacity': 0.5, + }, + } + : { + type: 'fill', + paint: { + 'fill-color': '#ffffff', + 'fill-outline-color': '#484848', + 'fill-opacity': 0.5, + }, + } } hasImage={ taskStatusObj?.[`${task?.id}`] === 'LOCKED_FOR_MAPPING' || false @@ -299,7 +316,9 @@ const MapSection = () => { !taskStatusObj?.[selectedTaskId] || taskStatusObj?.[selectedTaskId] === 'UNLOCKED_TO_MAP' || (taskStatusObj?.[selectedTaskId] === 'LOCKED_FOR_MAPPING' && - lockedUser?.id === userDetails?.id) + lockedUser?.id === userDetails?.id) || + taskStatusObj?.[selectedTaskId] === 'IMAGE_UPLOADED' || + taskStatusObj?.[selectedTaskId] === 'IMAGE_PROCESSED' ) } buttonText={ From d316101934e2ae6247510961b550ca6ad1452815 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 15:53:26 +0545 Subject: [PATCH 070/113] feat(project-details): show loader on table --- .../IndividualProject/Contributions/TableSection/index.tsx | 3 ++- .../src/components/IndividualProject/Contributions/index.tsx | 4 ++-- .../IndividualProject/Tasks/TableSection/index.tsx | 3 ++- .../src/components/IndividualProject/Tasks/index.tsx | 4 ++-- src/frontend/src/views/IndividualProject/index.tsx | 5 +++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx b/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx index 96b5a7c9..14c94cd8 100644 --- a/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx @@ -54,7 +54,7 @@ const contributionsDataColumns = [ }, ]; -export default function TableSection() { +export default function TableSection({ isFetching }: { isFetching: boolean }) { const tasksData = useTypedSelector(state => state.project.tasksData); const taskDataForTable = useMemo(() => { @@ -82,6 +82,7 @@ export default function TableSection() { }} data={taskDataForTable as Record[]} withPagination={false} + loading={isFetching} /> ); } diff --git a/src/frontend/src/components/IndividualProject/Contributions/index.tsx b/src/frontend/src/components/IndividualProject/Contributions/index.tsx index 90a38df8..347542f9 100644 --- a/src/frontend/src/components/IndividualProject/Contributions/index.tsx +++ b/src/frontend/src/components/IndividualProject/Contributions/index.tsx @@ -1,10 +1,10 @@ import TableSection from './TableSection'; -export default function Contributions() { +export default function Contributions({ isFetching }: { isFetching: boolean }) { return (
- +
); diff --git a/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx b/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx index e530d069..9c60e496 100644 --- a/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx @@ -21,7 +21,7 @@ const tasksDataColumns = [ // }, ]; -export default function TableSection() { +export default function TableSection({ isFetching }: { isFetching: boolean }) { const tasksData = useTypedSelector(state => state.project.tasksData); const taskDataForTable = useMemo(() => { @@ -49,6 +49,7 @@ export default function TableSection() { }} data={taskDataForTable as Record[]} withPagination={false} + loading={isFetching} /> ); } diff --git a/src/frontend/src/components/IndividualProject/Tasks/index.tsx b/src/frontend/src/components/IndividualProject/Tasks/index.tsx index 1e4468a6..a317751c 100644 --- a/src/frontend/src/components/IndividualProject/Tasks/index.tsx +++ b/src/frontend/src/components/IndividualProject/Tasks/index.tsx @@ -3,7 +3,7 @@ // import { FlexRow } from '@Components/common/Layouts'; import TableSection from './TableSection'; -export default function Tasks() { +export default function Tasks({ isFetching }: { isFetching: boolean }) { return (
{/* @@ -24,7 +24,7 @@ export default function Tasks() { */}
- +
); diff --git a/src/frontend/src/views/IndividualProject/index.tsx b/src/frontend/src/views/IndividualProject/index.tsx index 618543ee..cfe2d170 100644 --- a/src/frontend/src/views/IndividualProject/index.tsx +++ b/src/frontend/src/views/IndividualProject/index.tsx @@ -21,7 +21,7 @@ const getActiveTabContent = ( data: Record, isProjectDataLoading: boolean, ) => { - if (activeTab === 'tasks') return ; + if (activeTab === 'tasks') return ; if (activeTab === 'instructions') return ( ); - if (activeTab === 'contributions') return ; + if (activeTab === 'contributions') + return ; return <>; }; From 8f55c8bfcf7894bb30a46dc33a88c2666813e01b Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 16:25:41 +0545 Subject: [PATCH 071/113] feat(dashboard): make logs table responsive --- .../Dashboard/TaskLogs/TaskLogsTable.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/frontend/src/components/Dashboard/TaskLogs/TaskLogsTable.tsx b/src/frontend/src/components/Dashboard/TaskLogs/TaskLogsTable.tsx index 4c080a93..0095b9d6 100644 --- a/src/frontend/src/components/Dashboard/TaskLogs/TaskLogsTable.tsx +++ b/src/frontend/src/components/Dashboard/TaskLogs/TaskLogsTable.tsx @@ -8,29 +8,29 @@ interface ITaskLogsTableProps { const TaskLogsTable = ({ data: taskList }: ITaskLogsTableProps) => { const navigate = useNavigate(); return ( -
- - +
+
+ - - - {/* */} - - - From 42bb7efd17b2284a8c0d5cf1bfd80995c7818b86 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 16:47:40 +0545 Subject: [PATCH 072/113] feat: add Status chip component --- .../common/Chip/StatusChip/index.tsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/frontend/src/components/common/Chip/StatusChip/index.tsx diff --git a/src/frontend/src/components/common/Chip/StatusChip/index.tsx b/src/frontend/src/components/common/Chip/StatusChip/index.tsx new file mode 100644 index 00000000..a6981f3e --- /dev/null +++ b/src/frontend/src/components/common/Chip/StatusChip/index.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +const StatusChip = ({ + color = '#417EC9', + text = 'Ongoing', +}: { + color: string; + text: string; +}) => { + return ( +
+ {text} +
+ ); +}; + +export default StatusChip; From 68ab945486a95c506fed2762d72375ade7031dab Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 16:48:18 +0545 Subject: [PATCH 073/113] feat(project-dashboard): show complete status on project card --- .../components/Projects/ProjectCard/index.tsx | 28 +++++++++++++------ .../common/Chip/StatusChip/index.tsx | 2 -- src/frontend/src/views/Projects/index.tsx | 3 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/components/Projects/ProjectCard/index.tsx b/src/frontend/src/components/Projects/ProjectCard/index.tsx index 2e79fea0..23529d0a 100644 --- a/src/frontend/src/components/Projects/ProjectCard/index.tsx +++ b/src/frontend/src/components/Projects/ProjectCard/index.tsx @@ -1,3 +1,5 @@ +/* eslint-disable no-nested-ternary */ +import StatusChip from '@Components/common/Chip/StatusChip'; import { useNavigate } from 'react-router-dom'; interface IProjectCardProps { @@ -6,8 +8,9 @@ interface IProjectCardProps { description: string; imageUrl: string | null; totalTasks: number; - ongoingTasks: number; + status: string; slug: string; + completedTask: number; } export default function ProjectCard({ @@ -16,8 +19,9 @@ export default function ProjectCard({ description, imageUrl, totalTasks, - ongoingTasks, + status, slug, + completedTask, }: IProjectCardProps) { const navigate = useNavigate(); const onProjectCardClick = () => { @@ -47,10 +51,14 @@ export default function ProjectCard({

ID:#{slug}

-
-
- Ongoing -
+
+ {status === 'not-started' ? ( + + ) : status === 'ongoing' ? ( + + ) : ( + + )}

@@ -59,14 +67,16 @@ export default function ProjectCard({

{description}

-

{ongoingTasks}

{' '} +

+ {completedTask} +

{' '}

/

-

{totalTasks}

Tasks Ongoing

+

{totalTasks}

Tasks Completed

diff --git a/src/frontend/src/components/common/Chip/StatusChip/index.tsx b/src/frontend/src/components/common/Chip/StatusChip/index.tsx index a6981f3e..2f48244f 100644 --- a/src/frontend/src/components/common/Chip/StatusChip/index.tsx +++ b/src/frontend/src/components/common/Chip/StatusChip/index.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - const StatusChip = ({ color = '#417EC9', text = 'Ongoing', diff --git a/src/frontend/src/views/Projects/index.tsx b/src/frontend/src/views/Projects/index.tsx index 23c5de8e..94a9d6c8 100644 --- a/src/frontend/src/views/Projects/index.tsx +++ b/src/frontend/src/views/Projects/index.tsx @@ -84,7 +84,8 @@ const Projects = () => { title={project.name} description={project.description} totalTasks={project?.total_task_count} - ongoingTasks={project?.ongoing_task_count} + status={project?.status} + completedTask={project?.completed_task_count} /> ), )} From 9cce047e69e093591f4284836e8eecdbd35b27ec Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 16:58:15 +0545 Subject: [PATCH 074/113] feat: fill circle color code from properties on VectorLayerWithCluster component --- .../components/Projects/MapSection/VectorLayerWithCluster.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx b/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx index 19774feb..2295a2b2 100644 --- a/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx +++ b/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx @@ -59,7 +59,7 @@ export default function VectorLayerWithCluster({ source: sourceId, filter: ['!', ['has', 'point_count']], paint: { - 'circle-color': '#11b4da', + 'circle-color': ['get', 'colorCode'], 'circle-radius': 8, 'circle-stroke-width': 1, 'circle-stroke-color': '#fff', From bd40cc9d98e4d578f4650be42fd084d935351806 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 8 Oct 2024 16:59:22 +0545 Subject: [PATCH 075/113] feat(project-description): add different color code as per project status on properties of projects geojson --- src/frontend/src/components/Projects/MapSection/index.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/frontend/src/components/Projects/MapSection/index.tsx b/src/frontend/src/components/Projects/MapSection/index.tsx index 7505747a..7fc8101c 100644 --- a/src/frontend/src/components/Projects/MapSection/index.tsx +++ b/src/frontend/src/components/Projects/MapSection/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-nested-ternary */ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { LngLatBoundsLike, Map } from 'maplibre-gl'; @@ -41,6 +42,12 @@ const ProjectsMapSection = ({ projectList }: { projectList: any }) => { id: current?.id, name: current?.name, slug: current?.slug, + colorCode: + current?.status === 'not-started' + ? '#808080' + : current?.status === 'completed' + ? '#028a0f' + : '#11b4da', }, }, ], From 6899671857f556e1fdad31fb1f6bc5136f65ed70 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 9 Oct 2024 09:34:46 +0545 Subject: [PATCH 076/113] hotfix: Update project/id to project_id in S3 image processing logic --- src/backend/app/projects/image_processing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index ef500881..741ed571 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -158,7 +158,7 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): # now update the task as completed in Db. await task_logic.update_task_state( self.db, - self.project.id, + self.project_id, self.task_id, self.user_id, "Task completed.", From 6f3d1d7de301b25a704bc6a6e222a5acfe4f515d Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 9 Oct 2024 09:44:40 +0545 Subject: [PATCH 077/113] feat: reduce table height --- src/frontend/src/components/RadixComponents/Table.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/RadixComponents/Table.tsx b/src/frontend/src/components/RadixComponents/Table.tsx index d4e566ac..d1914954 100644 --- a/src/frontend/src/components/RadixComponents/Table.tsx +++ b/src/frontend/src/components/RadixComponents/Table.tsx @@ -5,7 +5,7 @@ const Table = React.forwardRef< HTMLTableElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -
+
+ ID + Project Name + Total task area Est.flight time + Created Date + Status +
Date: Wed, 9 Oct 2024 09:54:44 +0545 Subject: [PATCH 078/113] feat(project-details): image processing status text update --- .../src/components/IndividualProject/MapSection/Legend.tsx | 2 +- .../src/components/IndividualProject/MapSection/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx b/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx index 919bfc6a..21cc42fb 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx @@ -24,7 +24,7 @@ const Legend = () => {
-
Image Uploaded
+
Image Processing
diff --git a/src/frontend/src/components/IndividualProject/MapSection/index.tsx b/src/frontend/src/components/IndividualProject/MapSection/index.tsx index 3aad268e..de5a285b 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/index.tsx @@ -140,9 +140,9 @@ const MapSection = ({ projectData }: { projectData: Record }) => { case 'UNFLYABLE_TASK': return 'This task is not flyable'; case 'IMAGE_UPLOADED': - return `This Task's Images has been uploaded ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; + return `This task's Images has been uploaded ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; case 'IMAGE_PROCESSED': - return `This Task is completed ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; + return `This task is completed ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; default: return ''; From f1596a8d4244ce03c3f8a037d22a10938e17aedc Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 9 Oct 2024 09:57:33 +0545 Subject: [PATCH 079/113] fix(project-details): available tasks not showing on table behave the task not having state as available tasks --- .../components/IndividualProject/Tasks/TableSection/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx b/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx index 9c60e496..d35f2266 100644 --- a/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx @@ -27,8 +27,7 @@ export default function TableSection({ isFetching }: { isFetching: boolean }) { const taskDataForTable = useMemo(() => { if (!tasksData) return []; return tasksData?.reduce((acc: any, curr: any) => { - if (!(curr?.state === '' || curr?.state === 'UNLOCKED_TO_MAP')) - return acc; + if (!(!curr?.state || curr?.state === 'UNLOCKED_TO_MAP')) return acc; return [ ...acc, { From eaff9acd00479fcd4d0ae70aedbf2d69a0fa14e1 Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 9 Oct 2024 10:23:44 +0545 Subject: [PATCH 080/113] fix: added asyncio event loop to call async update_task_state in process_images_from_s3 --- src/backend/app/projects/image_processing.py | 26 +++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 741ed571..302623fa 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -10,7 +10,7 @@ from loguru import logger as log from concurrent.futures import ThreadPoolExecutor from psycopg import Connection - +import asyncio class DroneImageProcessor: def __init__( @@ -125,7 +125,7 @@ def download_results(self, task, output_path): log.info("Download completed.") return path - async def process_images_from_s3(self, bucket_name, name=None, options=[]): + def process_images_from_s3(self, bucket_name, name=None, options=[]): """ Processes images from MinIO storage. @@ -156,15 +156,19 @@ async def process_images_from_s3(self, bucket_name, name=None, options=[]): s3_path = f"projects/{self.project_id}/{self.task_id}/assets.zip" add_file_to_bucket(bucket_name, path_to_download, s3_path) # now update the task as completed in Db. - await task_logic.update_task_state( - self.db, - self.project_id, - self.task_id, - self.user_id, - "Task completed.", - State.IMAGE_UPLOADED, - State.IMAGE_PROCESSED, - timestamp(), + # Call the async function using asyncio + loop = asyncio.get_event_loop() + loop.run_until_complete( + task_logic.update_task_state( + self.db, + self.project_id, + self.task_id, + self.user_id, + "Task completed.", + State.IMAGE_UPLOADED, + State.IMAGE_PROCESSED, + timestamp(), + ) ) return task From f361b6cf330c8ee57d6fd1cdb18dd9c712eb4d6e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 04:42:07 +0000 Subject: [PATCH 081/113] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/backend/app/projects/image_processing.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 302623fa..d784ce24 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -12,6 +12,7 @@ from psycopg import Connection import asyncio + class DroneImageProcessor: def __init__( self, From 20ab8a55ee4eaf143958cce3bc8a3c4d5080b67e Mon Sep 17 00:00:00 2001 From: Sujit <90745363+suzit-10@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:36:23 +0545 Subject: [PATCH 082/113] Feat: Show project status and task status on map and project cards (#272) * fix(update-userProfile): update background color * feat(dashboard): show user role * feat(projects): Show status on project card * feat(dashboard): update UI and pass other project details on project card props * feat(dashboard): show slug on project card * feat(project-details): add new status on legend * feat(project-details): show skeleton on project data fetching * feat(project-details): fill different color for completed task and image uploaded task show go to task button * feat(project-details): show loader on table * feat(dashboard): make logs table responsive * feat: add Status chip component * feat(project-dashboard): show complete status on project card * feat: fill circle color code from properties on VectorLayerWithCluster component * feat(project-description): add different color code as per project status on properties of projects geojson * feat: reduce table height * feat(project-details): image processing status text update * fix(project-details): available tasks not showing on table behave the task not having state as available tasks --------- Co-authored-by: Sujit --- .../Dashboard/DashboardSidebar/index.tsx | 8 ++- .../Dashboard/TaskLogs/TaskLogsTable.tsx | 18 +++--- .../Contributions/TableSection/index.tsx | 3 +- .../IndividualProject/Contributions/index.tsx | 4 +- .../IndividualProject/MapSection/Legend.tsx | 4 ++ .../IndividualProject/MapSection/index.tsx | 61 ++++++++++++------- .../Tasks/TableSection/index.tsx | 6 +- .../IndividualProject/Tasks/index.tsx | 4 +- .../MapSection/VectorLayerWithCluster.tsx | 2 +- .../components/Projects/MapSection/index.tsx | 17 +++++- .../components/Projects/ProjectCard/index.tsx | 47 ++++++++++++-- .../src/components/RadixComponents/Table.tsx | 2 +- .../common/Chip/StatusChip/index.tsx | 18 ++++++ .../src/views/IndividualProject/index.tsx | 16 +++-- src/frontend/src/views/Projects/index.tsx | 10 ++- .../src/views/UpdateUserProfile/index.tsx | 4 +- 16 files changed, 165 insertions(+), 59 deletions(-) create mode 100644 src/frontend/src/components/common/Chip/StatusChip/index.tsx diff --git a/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx b/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx index 6a5a89e0..0f83a2b0 100644 --- a/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx +++ b/src/frontend/src/components/Dashboard/DashboardSidebar/index.tsx @@ -6,15 +6,17 @@ import hasErrorBoundary from '@Utils/hasErrorBoundary'; const DashboardSidebar = () => { const navigate = useNavigate(); - const userDetails = getLocalStorageValue('userprofile'); + const role = localStorage.getItem('signedInAs'); return ( profile
{userDetails?.name}
+

{role}

{userDetails?.email_address}

+
- +
+
+ - - - {/* */} - - - diff --git a/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx b/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx index 96b5a7c9..14c94cd8 100644 --- a/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/Contributions/TableSection/index.tsx @@ -54,7 +54,7 @@ const contributionsDataColumns = [ }, ]; -export default function TableSection() { +export default function TableSection({ isFetching }: { isFetching: boolean }) { const tasksData = useTypedSelector(state => state.project.tasksData); const taskDataForTable = useMemo(() => { @@ -82,6 +82,7 @@ export default function TableSection() { }} data={taskDataForTable as Record[]} withPagination={false} + loading={isFetching} /> ); } diff --git a/src/frontend/src/components/IndividualProject/Contributions/index.tsx b/src/frontend/src/components/IndividualProject/Contributions/index.tsx index 90a38df8..347542f9 100644 --- a/src/frontend/src/components/IndividualProject/Contributions/index.tsx +++ b/src/frontend/src/components/IndividualProject/Contributions/index.tsx @@ -1,10 +1,10 @@ import TableSection from './TableSection'; -export default function Contributions() { +export default function Contributions({ isFetching }: { isFetching: boolean }) { return (
- +
); diff --git a/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx b/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx index 3858c8f3..21cc42fb 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/Legend.tsx @@ -22,6 +22,10 @@ const Legend = () => {
Finished Tasks
+
+
+
Image Processing
+
Requested Tasks
diff --git a/src/frontend/src/components/IndividualProject/MapSection/index.tsx b/src/frontend/src/components/IndividualProject/MapSection/index.tsx index 3f196cc0..de5a285b 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/index.tsx @@ -1,5 +1,10 @@ /* eslint-disable no-nested-ternary */ /* eslint-disable no-unused-vars */ +import { useCallback, useEffect, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { LngLatBoundsLike, Map } from 'maplibre-gl'; +import { FeatureCollection } from 'geojson'; +import { toast } from 'react-toastify'; import { useGetProjectsDetailQuery, useGetTaskStatesQuery, @@ -19,14 +24,9 @@ import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; import { useMutation } from '@tanstack/react-query'; import getBbox from '@turf/bbox'; import hasErrorBoundary from '@Utils/hasErrorBoundary'; -import { FeatureCollection } from 'geojson'; -import { LngLatBoundsLike, Map } from 'maplibre-gl'; -import { useCallback, useEffect, useState } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; -import { toast } from 'react-toastify'; import Legend from './Legend'; -const MapSection = () => { +const MapSection = ({ projectData }: { projectData: Record }) => { const { id } = useParams(); const navigate = useNavigate(); const dispatch = useTypedDispatch(); @@ -39,10 +39,6 @@ const MapSection = () => { ); const { data: userDetails }: Record = useGetUserDetailsQuery(); - const { data: projectData }: Record = useGetProjectsDetailQuery( - id as string, - ); - const { map, isMapLoaded } = useMapLibreGLMap({ mapOptions: { zoom: 5, @@ -143,8 +139,11 @@ const MapSection = () => { return `This task is locked for mapping ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; case 'UNFLYABLE_TASK': return 'This task is not flyable'; - case 'COMPLETED': - return 'This Task is completed'; + case 'IMAGE_UPLOADED': + return `This task's Images has been uploaded ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; + case 'IMAGE_PROCESSED': + return `This task is completed ${properties.locked_user_name ? `by ${userDetails?.id === properties?.locked_user_id ? 'you' : properties?.locked_user_name}` : ''}`; + default: return ''; } @@ -263,14 +262,32 @@ const MapSection = () => { 'fill-opacity': 0.5, }, } - : { - type: 'fill', - paint: { - 'fill-color': '#ffffff', - 'fill-outline-color': '#484848', - 'fill-opacity': 0.5, - }, - } + : taskStatusObj?.[`${task?.id}`] === 'IMAGE_UPLOADED' + ? { + type: 'fill', + paint: { + 'fill-color': '#9C77B2', + 'fill-outline-color': '#484848', + 'fill-opacity': 0.5, + }, + } + : taskStatusObj?.[`${task?.id}`] === 'IMAGE_PROCESSED' + ? { + type: 'fill', + paint: { + 'fill-color': '#ACD2C4', + 'fill-outline-color': '#484848', + 'fill-opacity': 0.5, + }, + } + : { + type: 'fill', + paint: { + 'fill-color': '#ffffff', + 'fill-outline-color': '#484848', + 'fill-opacity': 0.5, + }, + } } hasImage={ taskStatusObj?.[`${task?.id}`] === 'LOCKED_FOR_MAPPING' || false @@ -299,7 +316,9 @@ const MapSection = () => { !taskStatusObj?.[selectedTaskId] || taskStatusObj?.[selectedTaskId] === 'UNLOCKED_TO_MAP' || (taskStatusObj?.[selectedTaskId] === 'LOCKED_FOR_MAPPING' && - lockedUser?.id === userDetails?.id) + lockedUser?.id === userDetails?.id) || + taskStatusObj?.[selectedTaskId] === 'IMAGE_UPLOADED' || + taskStatusObj?.[selectedTaskId] === 'IMAGE_PROCESSED' ) } buttonText={ diff --git a/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx b/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx index e530d069..d35f2266 100644 --- a/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/Tasks/TableSection/index.tsx @@ -21,14 +21,13 @@ const tasksDataColumns = [ // }, ]; -export default function TableSection() { +export default function TableSection({ isFetching }: { isFetching: boolean }) { const tasksData = useTypedSelector(state => state.project.tasksData); const taskDataForTable = useMemo(() => { if (!tasksData) return []; return tasksData?.reduce((acc: any, curr: any) => { - if (!(curr?.state === '' || curr?.state === 'UNLOCKED_TO_MAP')) - return acc; + if (!(!curr?.state || curr?.state === 'UNLOCKED_TO_MAP')) return acc; return [ ...acc, { @@ -49,6 +48,7 @@ export default function TableSection() { }} data={taskDataForTable as Record[]} withPagination={false} + loading={isFetching} /> ); } diff --git a/src/frontend/src/components/IndividualProject/Tasks/index.tsx b/src/frontend/src/components/IndividualProject/Tasks/index.tsx index 1e4468a6..a317751c 100644 --- a/src/frontend/src/components/IndividualProject/Tasks/index.tsx +++ b/src/frontend/src/components/IndividualProject/Tasks/index.tsx @@ -3,7 +3,7 @@ // import { FlexRow } from '@Components/common/Layouts'; import TableSection from './TableSection'; -export default function Tasks() { +export default function Tasks({ isFetching }: { isFetching: boolean }) { return (
{/* @@ -24,7 +24,7 @@ export default function Tasks() {
*/}
- +
); diff --git a/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx b/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx index 19774feb..2295a2b2 100644 --- a/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx +++ b/src/frontend/src/components/Projects/MapSection/VectorLayerWithCluster.tsx @@ -59,7 +59,7 @@ export default function VectorLayerWithCluster({ source: sourceId, filter: ['!', ['has', 'point_count']], paint: { - 'circle-color': '#11b4da', + 'circle-color': ['get', 'colorCode'], 'circle-radius': 8, 'circle-stroke-width': 1, 'circle-stroke-color': '#fff', diff --git a/src/frontend/src/components/Projects/MapSection/index.tsx b/src/frontend/src/components/Projects/MapSection/index.tsx index 5f69fa87..7fc8101c 100644 --- a/src/frontend/src/components/Projects/MapSection/index.tsx +++ b/src/frontend/src/components/Projects/MapSection/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-nested-ternary */ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { LngLatBoundsLike, Map } from 'maplibre-gl'; @@ -41,6 +42,12 @@ const ProjectsMapSection = ({ projectList }: { projectList: any }) => { id: current?.id, name: current?.name, slug: current?.slug, + colorCode: + current?.status === 'not-started' + ? '#808080' + : current?.status === 'completed' + ? '#028a0f' + : '#11b4da', }, }, ], @@ -55,10 +62,16 @@ const ProjectsMapSection = ({ projectList }: { projectList: any }) => { }, [projectList]); useEffect(() => { - if (!projectsGeojson || !projectsGeojson?.features?.length) return; + if ( + !projectsGeojson || + !projectsGeojson?.features?.length || + !map || + !isMapLoaded + ) + return; const bbox = getBbox(projectsGeojson as FeatureCollection); map?.fitBounds(bbox as LngLatBoundsLike, { padding: 100, duration: 500 }); - }, [projectsGeojson, map]); + }, [projectsGeojson, map, isMapLoaded]); const getPopupUI = useCallback(() => { return ( diff --git a/src/frontend/src/components/Projects/ProjectCard/index.tsx b/src/frontend/src/components/Projects/ProjectCard/index.tsx index 11a6e677..23529d0a 100644 --- a/src/frontend/src/components/Projects/ProjectCard/index.tsx +++ b/src/frontend/src/components/Projects/ProjectCard/index.tsx @@ -1,3 +1,5 @@ +/* eslint-disable no-nested-ternary */ +import StatusChip from '@Components/common/Chip/StatusChip'; import { useNavigate } from 'react-router-dom'; interface IProjectCardProps { @@ -5,14 +7,21 @@ interface IProjectCardProps { title: string; description: string; imageUrl: string | null; + totalTasks: number; + status: string; + slug: string; + completedTask: number; } export default function ProjectCard({ id, title, description, - imageUrl, + totalTasks, + status, + slug, + completedTask, }: IProjectCardProps) { const navigate = useNavigate(); const onProjectCardClick = () => { @@ -23,9 +32,9 @@ export default function ProjectCard({
-

+

{imageUrl ? ( )}

-

- #{id} -

+
+

+ ID:#{slug} +

+
+ {status === 'not-started' ? ( + + ) : status === 'ongoing' ? ( + + ) : ( + + )} +
+

{title}

{description}

+
+
+

+ {completedTask} +

{' '} +

/

+

{totalTasks}

Tasks Completed

+
+
+
+
+
); } diff --git a/src/frontend/src/components/RadixComponents/Table.tsx b/src/frontend/src/components/RadixComponents/Table.tsx index d4e566ac..d1914954 100644 --- a/src/frontend/src/components/RadixComponents/Table.tsx +++ b/src/frontend/src/components/RadixComponents/Table.tsx @@ -5,7 +5,7 @@ const Table = React.forwardRef< HTMLTableElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -
+
+ ID + Project Name + Total task area Est.flight time + Created Date + Status +
{ + return ( +
+ {text} +
+ ); +}; + +export default StatusChip; diff --git a/src/frontend/src/views/IndividualProject/index.tsx b/src/frontend/src/views/IndividualProject/index.tsx index e218493a..cfe2d170 100644 --- a/src/frontend/src/views/IndividualProject/index.tsx +++ b/src/frontend/src/views/IndividualProject/index.tsx @@ -8,6 +8,7 @@ import { MapSection, Tasks, } from '@Components/IndividualProject'; +import Skeleton from '@Components/RadixComponents/Skeleton'; import { projectOptions } from '@Constants/index'; import { setProjectState } from '@Store/actions/project'; import { useTypedDispatch, useTypedSelector } from '@Store/hooks'; @@ -20,7 +21,7 @@ const getActiveTabContent = ( data: Record, isProjectDataLoading: boolean, ) => { - if (activeTab === 'tasks') return ; + if (activeTab === 'tasks') return ; if (activeTab === 'instructions') return ( ); - if (activeTab === 'contributions') return ; + if (activeTab === 'contributions') + return ; return <>; }; @@ -41,7 +43,7 @@ const IndividualProject = () => { state => state.project.individualProjectActiveTab, ); - const { data: projectData, isLoading: isProjectDataLoading } = + const { data: projectData, isFetching: isProjectDataFetching } = useGetProjectsDetailQuery(id as string, { onSuccess: (res: any) => { dispatch( @@ -102,12 +104,16 @@ const IndividualProject = () => { {getActiveTabContent( individualProjectActiveTab, projectData as Record, - isProjectDataLoading, + isProjectDataFetching, )}
- + {isProjectDataFetching ? ( + + ) : ( + } /> + )}
diff --git a/src/frontend/src/views/Projects/index.tsx b/src/frontend/src/views/Projects/index.tsx index ff4914fc..94a9d6c8 100644 --- a/src/frontend/src/views/Projects/index.tsx +++ b/src/frontend/src/views/Projects/index.tsx @@ -60,8 +60,8 @@ const Projects = () => {
{isLoading ? ( <> @@ -79,9 +79,13 @@ const Projects = () => { ), )} @@ -89,7 +93,7 @@ const Projects = () => { )}
{showMap && ( -
+
{!isLoading ? ( ) : ( diff --git a/src/frontend/src/views/UpdateUserProfile/index.tsx b/src/frontend/src/views/UpdateUserProfile/index.tsx index 2d7342f8..3054f022 100644 --- a/src/frontend/src/views/UpdateUserProfile/index.tsx +++ b/src/frontend/src/views/UpdateUserProfile/index.tsx @@ -42,13 +42,13 @@ const UpdateUserProfile = () => { }, []); return ( -
+
-
+
Date: Wed, 9 Oct 2024 11:34:43 +0545 Subject: [PATCH 083/113] fix: resolve RuntimeError for missing event loop in AnyIO worker thread --- src/backend/app/projects/image_processing.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index d784ce24..7ec6eaf9 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -158,8 +158,7 @@ def process_images_from_s3(self, bucket_name, name=None, options=[]): add_file_to_bucket(bucket_name, path_to_download, s3_path) # now update the task as completed in Db. # Call the async function using asyncio - loop = asyncio.get_event_loop() - loop.run_until_complete( + asyncio.run( task_logic.update_task_state( self.db, self.project_id, From 1d685d93a96f043e4239e4aed61ad16f8ab74c61 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 9 Oct 2024 12:25:49 +0545 Subject: [PATCH 084/113] hot-fix: minor UI issue on chip --- src/frontend/src/components/common/Chip/StatusChip/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/common/Chip/StatusChip/index.tsx b/src/frontend/src/components/common/Chip/StatusChip/index.tsx index 2f48244f..99fb2b1f 100644 --- a/src/frontend/src/components/common/Chip/StatusChip/index.tsx +++ b/src/frontend/src/components/common/Chip/StatusChip/index.tsx @@ -7,7 +7,7 @@ const StatusChip = ({ }) => { return (
{text} From 4db41501b7d5e3293abb84f4140ffabb89b37cee Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 9 Oct 2024 12:33:27 +0545 Subject: [PATCH 085/113] feat: added asgiref package to convert the async to sync function --- src/backend/app/projects/image_processing.py | 25 +- src/backend/pdm.lock | 1362 +++++++----------- src/backend/pyproject.toml | 1 + 3 files changed, 542 insertions(+), 846 deletions(-) diff --git a/src/backend/app/projects/image_processing.py b/src/backend/app/projects/image_processing.py index 7ec6eaf9..543df504 100644 --- a/src/backend/app/projects/image_processing.py +++ b/src/backend/app/projects/image_processing.py @@ -10,7 +10,7 @@ from loguru import logger as log from concurrent.futures import ThreadPoolExecutor from psycopg import Connection -import asyncio +from asgiref.sync import async_to_sync class DroneImageProcessor: @@ -158,17 +158,18 @@ def process_images_from_s3(self, bucket_name, name=None, options=[]): add_file_to_bucket(bucket_name, path_to_download, s3_path) # now update the task as completed in Db. # Call the async function using asyncio - asyncio.run( - task_logic.update_task_state( - self.db, - self.project_id, - self.task_id, - self.user_id, - "Task completed.", - State.IMAGE_UPLOADED, - State.IMAGE_PROCESSED, - timestamp(), - ) + + # Update background task status to COMPLETED + update_task_status_sync = async_to_sync(task_logic.update_task_state) + update_task_status_sync( + self.db, + self.project_id, + self.task_id, + self.user_id, + "Task completed.", + State.IMAGE_UPLOADED, + State.IMAGE_PROCESSED, + timestamp(), ) return task diff --git a/src/backend/pdm.lock b/src/backend/pdm.lock index 96339e9a..2303461c 100644 --- a/src/backend/pdm.lock +++ b/src/backend/pdm.lock @@ -1,11 +1,24 @@ # This file is @generated by PDM. # It is not intended for manual editing. +[metadata] +groups = ["default"] +strategy = ["cross_platform"] +lock_version = "4.5.0" +content_hash = "sha256:99dcee931aca5cd6b30de348304d4698e73e08c6c2eb7246423cb7d50969ac90" + +[[metadata.targets]] +requires_python = ">=3.11" + [[package]] name = "aiosmtplib" version = "3.0.2" requires_python = ">=3.8" summary = "asyncio SMTP client" +files = [ + {file = "aiosmtplib-3.0.2-py3-none-any.whl", hash = "sha256:8783059603a34834c7c90ca51103c3aa129d5922003b5ce98dbaa6d4440f10fc"}, + {file = "aiosmtplib-3.0.2.tar.gz", hash = "sha256:08fd840f9dbc23258025dca229e8a8f04d2ccf3ecb1319585615bfc7933f7f47"}, +] [[package]] name = "alembic" @@ -15,14 +28,27 @@ summary = "A database migration tool for SQLAlchemy." dependencies = [ "Mako", "SQLAlchemy>=1.3.0", + "importlib-metadata; python_version < \"3.9\"", + "importlib-resources; python_version < \"3.9\"", "typing-extensions>=4", ] +files = [ + {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, + {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, +] [[package]] name = "annotated-types" version = "0.7.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.9\"", +] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] [[package]] name = "anyio" @@ -30,8 +56,14 @@ version = "4.4.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" dependencies = [ + "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", "sniffio>=1.1", + "typing-extensions>=4.1; python_version < \"3.11\"", +] +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, ] [[package]] @@ -41,6 +73,11 @@ requires_python = ">=3.7" summary = "Argon2 for Python" dependencies = [ "argon2-cffi-bindings", + "typing-extensions; python_version < \"3.8\"", +] +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [[package]] @@ -51,18 +88,73 @@ summary = "Low-level CFFI bindings for Argon2" dependencies = [ "cffi>=1.0.1", ] +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, +] + +[[package]] +name = "asgiref" +version = "3.8.1" +requires_python = ">=3.8" +summary = "ASGI specs, helper code, and adapters" +dependencies = [ + "typing-extensions>=4; python_version < \"3.11\"", +] +files = [ + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, +] [[package]] name = "bcrypt" version = "4.2.0" requires_python = ">=3.7" summary = "Modern password hashing for your software and your servers" +files = [ + {file = "bcrypt-4.2.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291"}, + {file = "bcrypt-4.2.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060"}, + {file = "bcrypt-4.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7"}, + {file = "bcrypt-4.2.0-cp37-abi3-win32.whl", hash = "sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458"}, + {file = "bcrypt-4.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5"}, + {file = "bcrypt-4.2.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2"}, + {file = "bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e"}, + {file = "bcrypt-4.2.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8"}, + {file = "bcrypt-4.2.0-cp39-abi3-win32.whl", hash = "sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34"}, + {file = "bcrypt-4.2.0-cp39-abi3-win_amd64.whl", hash = "sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9"}, + {file = "bcrypt-4.2.0.tar.gz", hash = "sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221"}, +] [[package]] name = "certifi" version = "2024.8.30" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] [[package]] name = "cffi" @@ -72,12 +164,83 @@ summary = "Foreign Function Interface for Python calling C code." dependencies = [ "pycparser", ] +files = [ + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] [[package]] name = "charset-normalizer" version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" @@ -86,6 +249,11 @@ requires_python = ">=3.7" summary = "Composable command line interface toolkit" dependencies = [ "colorama; platform_system == \"Windows\"", + "importlib-metadata; python_version < \"3.8\"", +] +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [[package]] @@ -93,12 +261,20 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "dnspython" version = "2.6.1" requires_python = ">=3.8" summary = "DNS toolkit" +files = [ + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, +] [[package]] name = "drone-flightplan" @@ -110,6 +286,10 @@ dependencies = [ "pyproj>=3.0.0", "shapely>=2.0.0", ] +files = [ + {file = "drone_flightplan-0.3.1rc4-py3-none-any.whl", hash = "sha256:d0150655091c187a8db8a3f5170ed4a3d85bc25408ff463f02478a9ed4f29666"}, + {file = "drone_flightplan-0.3.1rc4.tar.gz", hash = "sha256:badce959ffcf062028e0245e8a00b8f7e9cac52c356f673b0eccdbed5c92a961"}, +] [[package]] name = "email-validator" @@ -120,6 +300,10 @@ dependencies = [ "dnspython>=2.0.0", "idna>=2.0.0", ] +files = [ + {file = "email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, + {file = "email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, +] [[package]] name = "fastapi" @@ -131,12 +315,19 @@ dependencies = [ "starlette<0.38.0,>=0.37.2", "typing-extensions>=4.8.0", ] +files = [ + {file = "fastapi-0.112.0-py3-none-any.whl", hash = "sha256:3487ded9778006a45834b8c816ec4a48d522e2631ca9e75ec5a774f1b052f821"}, + {file = "fastapi-0.112.0.tar.gz", hash = "sha256:d262bc56b7d101d1f4e8fc0ad2ac75bb9935fec504d2b7117686cec50710cf05"}, +] [[package]] name = "gdal" version = "3.6.2" requires_python = ">=3.6.0" summary = "GDAL: Geospatial Data Abstraction Library" +files = [ + {file = "GDAL-3.6.2.tar.gz", hash = "sha256:a167cde1813707d91a938dad1a22f280f5ad28c45980d42e948fb8c59f890f5a"}, +] [[package]] name = "geoalchemy2" @@ -147,12 +338,20 @@ dependencies = [ "SQLAlchemy>=1.4", "packaging", ] +files = [ + {file = "GeoAlchemy2-0.14.2-py3-none-any.whl", hash = "sha256:ca81c2d924c0724458102bac93f68f3e3c337a65fcb811af5e504ce7c5d56ac2"}, + {file = "GeoAlchemy2-0.14.2.tar.gz", hash = "sha256:8ca023dcb9a36c6d312f3b4aee631d66385264e2fc9feb0ab0f446eb5609407d"}, +] [[package]] name = "geojson" version = "3.1.0" requires_python = ">=3.7" summary = "Python bindings and utilities for GeoJSON" +files = [ + {file = "geojson-3.1.0-py3-none-any.whl", hash = "sha256:68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3"}, + {file = "geojson-3.1.0.tar.gz", hash = "sha256:58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac"}, +] [[package]] name = "geojson-pydantic" @@ -162,30 +361,79 @@ summary = "Pydantic data models for the GeoJSON spec." dependencies = [ "pydantic~=2.0", ] +files = [ + {file = "geojson_pydantic-1.1.0-py3-none-any.whl", hash = "sha256:0de723719d66e585123db10ead99dfa51aff8cec08be512646df25224ac425f4"}, + {file = "geojson_pydantic-1.1.0.tar.gz", hash = "sha256:b214dc746f1e085641e32f0aaa47e0bfa67eefa2cf60a516326c68b87808e2ae"}, +] [[package]] name = "greenlet" version = "3.1.0" requires_python = ">=3.7" summary = "Lightweight in-process concurrent programming" +files = [ + {file = "greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, + {file = "greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, + {file = "greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, + {file = "greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, + {file = "greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, + {file = "greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, + {file = "greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, + {file = "greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, + {file = "greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, + {file = "greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, + {file = "greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, + {file = "greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, + {file = "greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, +] [[package]] name = "h11" version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +dependencies = [ + "typing-extensions; python_version < \"3.8\"", +] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] [[package]] name = "idna" version = "3.8" requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" +files = [ + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, +] [[package]] name = "itsdangerous" version = "2.2.0" requires_python = ">=3.8" summary = "Safely pass data to untrusted environments and back." +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] [[package]] name = "jinja2" @@ -195,6 +443,10 @@ summary = "A very fast and expressive template engine." dependencies = [ "MarkupSafe>=2.0", ] +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] [[package]] name = "loguru" @@ -202,9 +454,14 @@ version = "0.7.2" requires_python = ">=3.5" summary = "Python logging made (stupidly) simple" dependencies = [ + "aiocontextvars>=0.2.0; python_version < \"3.7\"", "colorama>=0.3.4; sys_platform == \"win32\"", "win32-setctime>=1.0.0; sys_platform == \"win32\"", ] +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] [[package]] name = "mako" @@ -214,12 +471,39 @@ summary = "A super-fast templating language that borrows the best ideas from the dependencies = [ "MarkupSafe>=0.9.2", ] +files = [ + {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, + {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, +] [[package]] name = "markupsafe" version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." +files = [ + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] [[package]] name = "minio" @@ -233,29 +517,64 @@ dependencies = [ "typing-extensions", "urllib3", ] +files = [ + {file = "minio-7.2.8-py3-none-any.whl", hash = "sha256:aa3b485788b63b12406a5798465d12a57e4be2ac2a58a8380959b6b748e64ddd"}, + {file = "minio-7.2.8.tar.gz", hash = "sha256:f8af2dafc22ebe1aef3ac181b8e217037011c430aa6da276ed627e55aaf7c815"}, +] [[package]] name = "numpy" version = "1.26.4" requires_python = ">=3.9" summary = "Fundamental package for array computing in Python" +files = [ + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] [[package]] name = "oauthlib" version = "3.2.2" requires_python = ">=3.6" summary = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] [[package]] name = "packaging" version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] [[package]] name = "passlib" version = "1.7.4" summary = "comprehensive password hashing framework supporting over 30 schemes" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] [[package]] name = "passlib" @@ -266,6 +585,10 @@ dependencies = [ "bcrypt>=3.1.0", "passlib==1.7.4", ] +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] [[package]] name = "psycopg" @@ -273,9 +596,14 @@ version = "3.2.1" requires_python = ">=3.8" summary = "PostgreSQL database adapter for Python" dependencies = [ + "backports-zoneinfo>=0.2.0; python_version < \"3.9\"", "typing-extensions>=4.4", "tzdata; sys_platform == \"win32\"", ] +files = [ + {file = "psycopg-3.2.1-py3-none-any.whl", hash = "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175"}, + {file = "psycopg-3.2.1.tar.gz", hash = "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7"}, +] [[package]] name = "psycopg-pool" @@ -285,12 +613,23 @@ summary = "Connection Pool for Psycopg" dependencies = [ "typing-extensions>=4.4", ] +files = [ + {file = "psycopg_pool-3.2.2-py3-none-any.whl", hash = "sha256:273081d0fbfaced4f35e69200c89cb8fbddfe277c38cc86c235b90a2ec2c8153"}, + {file = "psycopg_pool-3.2.2.tar.gz", hash = "sha256:9e22c370045f6d7f2666a5ad1b0caf345f9f1912195b0b25d0d3bcc4f3a7389c"}, +] [[package]] name = "psycopg2" version = "2.9.9" requires_python = ">=3.7" summary = "psycopg2 - Python-PostgreSQL Database Adapter" +files = [ + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, + {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, +] [[package]] name = "psycopg" @@ -302,18 +641,39 @@ dependencies = [ "psycopg-pool", "psycopg==3.2.1", ] +files = [ + {file = "psycopg-3.2.1-py3-none-any.whl", hash = "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175"}, + {file = "psycopg-3.2.1.tar.gz", hash = "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7"}, +] [[package]] name = "pycparser" version = "2.22" requires_python = ">=3.8" summary = "C parser in Python" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] [[package]] name = "pycryptodome" version = "3.20.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "Cryptographic library for Python" +files = [ + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] [[package]] name = "pydantic" @@ -326,6 +686,10 @@ dependencies = [ "typing-extensions>=4.12.2; python_version >= \"3.13\"", "typing-extensions>=4.6.1; python_version < \"3.13\"", ] +files = [ + {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, + {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, +] [[package]] name = "pydantic-core" @@ -335,6 +699,45 @@ summary = "Core functionality for Pydantic validation and serialization" dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] +files = [ + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, + {file = "pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, + {file = "pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, + {file = "pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, + {file = "pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, + {file = "pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, + {file = "pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, + {file = "pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, + {file = "pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, + {file = "pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, + {file = "pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, + {file = "pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, + {file = "pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, + {file = "pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, + {file = "pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, + {file = "pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, +] [[package]] name = "pydantic-settings" @@ -345,6 +748,10 @@ dependencies = [ "pydantic>=2.7.0", "python-dotenv>=0.21.0", ] +files = [ + {file = "pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, + {file = "pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, +] [[package]] name = "pydantic" @@ -356,12 +763,20 @@ dependencies = [ "email-validator>=2.0.0", "pydantic==2.9.1", ] +files = [ + {file = "pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, + {file = "pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, +] [[package]] name = "pyjwt" version = "2.9.0" requires_python = ">=3.8" summary = "JSON Web Token implementation in Python" +files = [ + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, +] [[package]] name = "pyodm" @@ -372,6 +787,10 @@ dependencies = [ "requests-toolbelt", "urllib3", ] +files = [ + {file = "pyodm-1.5.11-py3-none-any.whl", hash = "sha256:c0b9a4358db12f2a84a4d13533b9a3ea4c63419d6518420ba7a2ab32842294b8"}, + {file = "pyodm-1.5.11.tar.gz", hash = "sha256:bb97710171bfaee92e145bd97b1ac77db8beef580b89d6585a622ff6fb424c53"}, +] [[package]] name = "pyproj" @@ -381,18 +800,41 @@ summary = "Python interface to PROJ (cartographic projections and coordinate tra dependencies = [ "certifi", ] +files = [ + {file = "pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882"}, + {file = "pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a"}, + {file = "pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85"}, + {file = "pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915"}, + {file = "pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132"}, + {file = "pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2"}, + {file = "pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746"}, + {file = "pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8"}, + {file = "pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf"}, + {file = "pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d"}, + {file = "pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb"}, + {file = "pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0"}, + {file = "pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf"}, +] [[package]] name = "python-dotenv" version = "1.0.1" requires_python = ">=3.8" summary = "Read key-value pairs from a .env file and set them as environment variables" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] [[package]] name = "python-multipart" version = "0.0.9" requires_python = ">=3.8" summary = "A streaming multipart parser for Python" +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] [[package]] name = "python-slugify" @@ -402,6 +844,10 @@ summary = "A Python slugify application that also handles Unicode" dependencies = [ "text-unidecode>=1.3", ] +files = [ + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, +] [[package]] name = "requests" @@ -414,6 +860,10 @@ dependencies = [ "idna<4,>=2.5", "urllib3<3,>=1.21.1", ] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] [[package]] name = "requests-oauthlib" @@ -424,6 +874,10 @@ dependencies = [ "oauthlib>=3.0.0", "requests>=2.0.0", ] +files = [ + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, +] [[package]] name = "requests-toolbelt" @@ -433,6 +887,10 @@ summary = "A utility belt for advanced users of python-requests" dependencies = [ "requests<3.0.0,>=2.0.1", ] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] [[package]] name = "shapely" @@ -442,12 +900,31 @@ summary = "Manipulation and analysis of geometric objects" dependencies = [ "numpy<3,>=1.14", ] +files = [ + {file = "shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec"}, + {file = "shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8"}, + {file = "shapely-2.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8e71bb9a46814019f6644c4e2560a09d44b80100e46e371578f35eaaa9da1c"}, + {file = "shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760"}, + {file = "shapely-2.0.5-cp311-cp311-win32.whl", hash = "sha256:35110e80070d664781ec7955c7de557456b25727a0257b354830abb759bf8311"}, + {file = "shapely-2.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:03bd7b5fa5deb44795cc0a503999d10ae9d8a22df54ae8d4a4cd2e8a93466195"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ff9521991ed9e201c2e923da014e766c1aa04771bc93e6fe97c27dcf0d40ace"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b65365cfbf657604e50d15161ffcc68de5cdb22a601bbf7823540ab4918a98d"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21f64e647a025b61b19585d2247137b3a38a35314ea68c66aaf507a1c03ef6fe"}, + {file = "shapely-2.0.5-cp312-cp312-win32.whl", hash = "sha256:3ac7dc1350700c139c956b03d9c3df49a5b34aaf91d024d1510a09717ea39199"}, + {file = "shapely-2.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:30e8737983c9d954cd17feb49eb169f02f1da49e24e5171122cf2c2b62d65c95"}, + {file = "shapely-2.0.5.tar.gz", hash = "sha256:bff2366bc786bfa6cb353d6b47d0443c570c32776612e527ee47b6df63fcfe32"}, +] [[package]] name = "sniffio" version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] [[package]] name = "sqlalchemy" @@ -455,9 +932,30 @@ version = "2.0.23" requires_python = ">=3.7" summary = "Database Abstraction Library" dependencies = [ - "greenlet!=0.4.17; platform_machine == \"aarch64\" or (platform_machine == \"ppc64le\" or (platform_machine == \"x86_64\" or (platform_machine == \"amd64\" or (platform_machine == \"AMD64\" or (platform_machine == \"win32\" or platform_machine == \"WIN32\")))))", + "greenlet!=0.4.17; platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\"", + "importlib-metadata; python_version < \"3.8\"", "typing-extensions>=4.2.0", ] +files = [ + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, + {file = "SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, + {file = "SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, +] [[package]] name = "starlette" @@ -466,30 +964,51 @@ requires_python = ">=3.8" summary = "The little ASGI library that shines." dependencies = [ "anyio<5,>=3.4.0", + "typing-extensions>=3.10.0; python_version < \"3.10\"", +] +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, ] [[package]] name = "text-unidecode" version = "1.3" summary = "The most basic Text::Unidecode port" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] [[package]] name = "typing-extensions" version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] [[package]] name = "tzdata" version = "2024.1" requires_python = ">=2" summary = "Provider of IANA time zone data" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] [[package]] name = "urllib3" version = "2.2.2" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] [[package]] name = "uvicorn" @@ -499,6 +1018,11 @@ summary = "The lightning-fast ASGI server." dependencies = [ "click>=7.0", "h11>=0.8", + "typing-extensions>=4.0; python_version < \"3.11\"", +] +files = [ + {file = "uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835"}, + {file = "uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee"}, ] [[package]] @@ -506,837 +1030,7 @@ name = "win32-setctime" version = "1.1.0" requires_python = ">=3.5" summary = "A small Python utility to set file creation time on Windows" - -[metadata] -lock_version = "4.2" -cross_platform = true -groups = ["default"] -content_hash = "sha256:34e737b7b5f07d56925b5b8892bcdee256dfe9cec5d8986c30772ecccb70e028" - -[metadata.files] -"aiosmtplib 3.0.2" = [ - {url = "https://files.pythonhosted.org/packages/87/35/441faea7a11159795881a6ec869454f40269e4e3806dced935a35d83a412/aiosmtplib-3.0.2-py3-none-any.whl", hash = "sha256:8783059603a34834c7c90ca51103c3aa129d5922003b5ce98dbaa6d4440f10fc"}, - {url = "https://files.pythonhosted.org/packages/91/2a/812517f8350cd317aad2ba1ce25dfc213c6f1f2e62e1cbf662b4bdc51d34/aiosmtplib-3.0.2.tar.gz", hash = "sha256:08fd840f9dbc23258025dca229e8a8f04d2ccf3ecb1319585615bfc7933f7f47"}, -] -"alembic 1.13.2" = [ - {url = "https://files.pythonhosted.org/packages/66/e2/efa88e86029cada2da5941ec664d50d9a3b2a91f5066405c6f90e5016c16/alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, - {url = "https://files.pythonhosted.org/packages/df/ed/c884465c33c25451e4a5cd4acad154c29e5341e3214e220e7f3478aa4b0d/alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, -] -"annotated-types 0.7.0" = [ - {url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] -"anyio 4.4.0" = [ - {url = "https://files.pythonhosted.org/packages/7b/a2/10639a79341f6c019dedc95bd48a4928eed9f1d1197f4c04f546fc7ae0ff/anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {url = "https://files.pythonhosted.org/packages/e6/e3/c4c8d473d6780ef1853d630d581f70d655b4f8d7553c6997958c283039a2/anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] -"argon2-cffi 23.1.0" = [ - {url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, - {url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, -] -"argon2-cffi-bindings 21.2.0" = [ - {url = "https://files.pythonhosted.org/packages/2e/f1/48888db30b6a4a0c78ab7bc7444058a1135b223b6a2a5f2ac7d6780e7443/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {url = "https://files.pythonhosted.org/packages/34/da/d105a3235ae86c1c1a80c1e9c46953e6e53cc8c4c61fb3c5ac8a39bbca48/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {url = "https://files.pythonhosted.org/packages/43/f3/20bc53a6e50471dfea16a63dc9b69d2a9ec78fd2b9532cc25f8317e121d9/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {url = "https://files.pythonhosted.org/packages/8c/1b/b2abebe25743daf80db3ee3ea37e4d446c8fbcc5abb7c06baf7261f5678d/argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {url = "https://files.pythonhosted.org/packages/c5/98/6cdb23d0aeb8612175e2d0fcffe776eb18d22d73e1efe4322f6a9d2bab12/argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {url = "https://files.pythonhosted.org/packages/dc/46/610263c404f33127878515819217aafd150906814624c31a6ad18a0a40fb/argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {url = "https://files.pythonhosted.org/packages/ed/55/f8ba268bc9005d0ca57a862e8f1b55bf1775e97a36bd30b0a8fb568c265c/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, - {url = "https://files.pythonhosted.org/packages/ee/0f/a2260a207f21ce2ff4cad00a417c31597f08eafb547e00615bcbf403d8ea/argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {url = "https://files.pythonhosted.org/packages/f2/c6/e1ea7fc615ac7f9aaa4397e4ace245557d5bb25b4a594b06dccb2d90e05d/argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {url = "https://files.pythonhosted.org/packages/f4/64/bef937102280c7c92dd47dd9a67b6c76ef6a276f736c419ea538fa86adf8/argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, -] -"bcrypt 4.2.0" = [ - {url = "https://files.pythonhosted.org/packages/00/03/2af7c45034aba6002d4f2b728c1a385676b4eab7d764410e34fd768009f2/bcrypt-4.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3698393a1b1f1fd5714524193849d0c6d524d33523acca37cd28f02899285060"}, - {url = "https://files.pythonhosted.org/packages/05/d2/1be1e16aedec04bcf8d0156e01b987d16a2063d38e64c3f28030a3427d61/bcrypt-4.2.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02d944ca89d9b1922ceb8a46460dd17df1ba37ab66feac4870f6862a1533c00"}, - {url = "https://files.pythonhosted.org/packages/09/97/01026e7b1b7f8aeb41514408eca1137c0f8aef9938335e3bc713f82c282e/bcrypt-4.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:39e1d30c7233cfc54f5c3f2c825156fe044efdd3e0b9d309512cc514a263ec2a"}, - {url = "https://files.pythonhosted.org/packages/1a/d4/586b9c18a327561ea4cd336ff4586cca1a7aa0f5ee04e23a8a8bb9ca64f1/bcrypt-4.2.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cb2a8ec2bc07d3553ccebf0746bbf3d19426d1c6d1adbd4fa48925f66af7b9e8"}, - {url = "https://files.pythonhosted.org/packages/1c/2a/c74052e54162ec639266d91539cca7cbf3d1d3b8b36afbfeaee0ea6a1702/bcrypt-4.2.0-cp39-abi3-win_amd64.whl", hash = "sha256:61ed14326ee023917ecd093ee6ef422a72f3aec6f07e21ea5f10622b735538a9"}, - {url = "https://files.pythonhosted.org/packages/24/55/1a7127faf4576138bb278b91e9c75307490178979d69c8e6e273f74b974f/bcrypt-4.2.0-cp39-abi3-win32.whl", hash = "sha256:77800b7147c9dc905db1cba26abe31e504d8247ac73580b4aa179f98e6608f34"}, - {url = "https://files.pythonhosted.org/packages/3e/d0/31938bb697600a04864246acde4918c4190a938f891fd11883eaaf41327a/bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d3a6d28cb2305b43feac298774b997e372e56c7c7afd90a12b3dc49b189151c"}, - {url = "https://files.pythonhosted.org/packages/46/54/dc7b58abeb4a3d95bab653405935e27ba32f21b812d8ff38f271fb6f7f55/bcrypt-4.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:1bb429fedbe0249465cdd85a58e8376f31bb315e484f16e68ca4c786dcc04291"}, - {url = "https://files.pythonhosted.org/packages/4b/3b/ad784eac415937c53da48983756105d267b91e56aa53ba8a1b2014b8d930/bcrypt-4.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3413bd60460f76097ee2e0a493ccebe4a7601918219c02f503984f0a7ee0aebe"}, - {url = "https://files.pythonhosted.org/packages/5d/2c/019bc2c63c6125ddf0483ee7d914a405860327767d437913942b476e9c9b/bcrypt-4.2.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:27fe0f57bb5573104b5a6de5e4153c60814c711b29364c10a75a54bb6d7ff48d"}, - {url = "https://files.pythonhosted.org/packages/65/f1/e09626c88a56cda488810fb29d5035f1662873777ed337880856b9d204ae/bcrypt-4.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:8f6ede91359e5df88d1f5c1ef47428a4420136f3ce97763e31b86dd8280fbdf5"}, - {url = "https://files.pythonhosted.org/packages/73/5a/811c3c7af3be99888f39ee8845ddf849d2a03a83049d63ece5dfb4612f4d/bcrypt-4.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:1ff39b78a52cf03fdf902635e4c81e544714861ba3f0efc56558979dd4f09170"}, - {url = "https://files.pythonhosted.org/packages/75/fe/9e137727f122bbe29771d56afbf4e0dbc85968caa8957806f86404a5bfe1/bcrypt-4.2.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8ac68872c82f1add6a20bd489870c71b00ebacd2e9134a8aa3f98a0052ab4b0e"}, - {url = "https://files.pythonhosted.org/packages/7b/76/2aa660679abbdc7f8ee961552e4bb6415a81b303e55e9374533f22770203/bcrypt-4.2.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0da52759f7f30e83f1e30a888d9163a81353ef224d82dc58eb5bb52efcabc399"}, - {url = "https://files.pythonhosted.org/packages/8b/79/76a139d1b9f11aa4afcb7ceb882d2e81003667681711f2fe8a302c4c10ca/bcrypt-4.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:373db9abe198e8e2c70d12b479464e0d5092cc122b20ec504097b5f2297ed184"}, - {url = "https://files.pythonhosted.org/packages/96/86/8c6a84daed4dd878fbab094400c9174c43d9b838ace077a2f8ee8bc3ae12/bcrypt-4.2.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52aac18ea1f4a4f65963ea4f9530c306b56ccd0c6f8c8da0c06976e34a6e841"}, - {url = "https://files.pythonhosted.org/packages/a9/81/4e8f5bc0cd947e91fb720e1737371922854da47a94bc9630454e7b2845f8/bcrypt-4.2.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:096a15d26ed6ce37a14c1ac1e48119660f21b24cba457f160a4b830f3fe6b5cb"}, - {url = "https://files.pythonhosted.org/packages/ac/be/da233c5f11fce3f8adec05e8e532b299b64833cc962f49331cdd0e614fa9/bcrypt-4.2.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:655ea221910bcac76ea08aaa76df427ef8625f92e55a8ee44fbf7753dbabb328"}, - {url = "https://files.pythonhosted.org/packages/b0/b8/8b4add88d55a263cf1c6b8cf66c735280954a04223fcd2880120cc767ac3/bcrypt-4.2.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:1ee38e858bf5d0287c39b7a1fc59eec64bbf880c7d504d3a06a96c16e14058e7"}, - {url = "https://files.pythonhosted.org/packages/ca/46/03eb26ea3e9c12ca18d1f3bf06199f7d72ce52e68f2a1ebcfd8acff9c472/bcrypt-4.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f4f4acf526fcd1c34e7ce851147deedd4e26e6402369304220250598b26448db"}, - {url = "https://files.pythonhosted.org/packages/cb/4c/ff8ca83d816052fba36def1d24e97d9a85739b9bbf428c0d0ecd296a07c8/bcrypt-4.2.0-cp37-abi3-win32.whl", hash = "sha256:5a1e8aa9b28ae28020a3ac4b053117fb51c57a010b9f969603ed885f23841458"}, - {url = "https://files.pythonhosted.org/packages/cc/14/b9ff8e0218bee95e517b70e91130effb4511e8827ac1ab00b4e30943a3f6/bcrypt-4.2.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8d7bb9c42801035e61c109c345a28ed7e84426ae4865511eb82e913df18f58c2"}, - {url = "https://files.pythonhosted.org/packages/dc/5d/6843443ce4ab3af40bddb6c7c085ed4a8418b3396f7a17e60e6d9888416c/bcrypt-4.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:762a2c5fb35f89606a9fde5e51392dad0cd1ab7ae64149a8b935fe8d79dd5ed7"}, - {url = "https://files.pythonhosted.org/packages/e3/96/7a654027638ad9b7589effb6db77eb63eba64319dfeaf9c0f4ca953e5f76/bcrypt-4.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d84cf6d877918620b687b8fd1bf7781d11e8a0998f576c7aa939776b512b98d"}, - {url = "https://files.pythonhosted.org/packages/e4/7e/d95e7d96d4828e965891af92e43b52a4cd3395dc1c1ef4ee62748d0471d0/bcrypt-4.2.0.tar.gz", hash = "sha256:cf69eaf5185fd58f268f805b505ce31f9b9fc2d64b376642164e9244540c1221"}, - {url = "https://files.pythonhosted.org/packages/e7/c3/dae866739989e3f04ae304e1201932571708cb292a28b2f1b93283e2dcd8/bcrypt-4.2.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9c1c4ad86351339c5f320ca372dfba6cb6beb25e8efc659bedd918d921956bae"}, - {url = "https://files.pythonhosted.org/packages/f6/05/e394515f4e23c17662e5aeb4d1859b11dc651be01a3bd03c2e919a155901/bcrypt-4.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3bbbfb2734f0e4f37c5136130405332640a1e46e6b23e000eeff2ba8d005da68"}, -] -"certifi 2024.8.30" = [ - {url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, -] -"cffi 1.17.1" = [ - {url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {url = "https://files.pythonhosted.org/packages/2f/70/80c33b044ebc79527447fd4fbc5455d514c3bb840dede4455de97da39b4d/cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {url = "https://files.pythonhosted.org/packages/42/7a/9d086fab7c66bd7c4d0f27c57a1b6b068ced810afc498cc8c49e0088661c/cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {url = "https://files.pythonhosted.org/packages/48/08/15bf6b43ae9bd06f6b00ad8a91f5a8fe1069d4c9fab550a866755402724e/cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {url = "https://files.pythonhosted.org/packages/53/93/7e547ab4105969cc8c93b38a667b82a835dd2cc78f3a7dad6130cfd41e1d/cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {url = "https://files.pythonhosted.org/packages/56/c4/a308f2c332006206bb511de219efeff090e9d63529ba0a77aae72e82248b/cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {url = "https://files.pythonhosted.org/packages/5b/95/b34462f3ccb09c2594aa782d90a90b045de4ff1f70148ee79c69d37a0a5a/cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {url = "https://files.pythonhosted.org/packages/74/06/90b8a44abf3556599cdec107f7290277ae8901a58f75e6fe8f970cd72418/cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {url = "https://files.pythonhosted.org/packages/8c/52/b08750ce0bce45c143e1b5d7357ee8c55341b52bdef4b0f081af1eb248c2/cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {url = "https://files.pythonhosted.org/packages/ae/11/e77c8cd24f58285a82c23af484cf5b124a376b32644e445960d1a4654c3a/cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {url = "https://files.pythonhosted.org/packages/b9/ea/8bb50596b8ffbc49ddd7a1ad305035daa770202a6b782fc164647c2673ad/cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {url = "https://files.pythonhosted.org/packages/bb/19/b51af9f4a4faa4a8ac5a0e5d5c2522dcd9703d07fac69da34a36c4d960d3/cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {url = "https://files.pythonhosted.org/packages/bd/62/a1f468e5708a70b1d86ead5bab5520861d9c7eacce4a885ded9faa7729c3/cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {url = "https://files.pythonhosted.org/packages/c2/5b/f1523dd545f92f7df468e5f653ffa4df30ac222f3c884e51e139878f1cb5/cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {url = "https://files.pythonhosted.org/packages/ca/5b/b63681518265f2f4060d2b60755c1c77ec89e5e045fc3773b72735ddaad5/cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {url = "https://files.pythonhosted.org/packages/cb/b5/fd9f8b5a84010ca169ee49f4e4ad6f8c05f4e3545b72ee041dbbcb159882/cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {url = "https://files.pythonhosted.org/packages/da/63/1785ced118ce92a993b0ec9e0d0ac8dc3e5dbfbcaa81135be56c69cabbb6/cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {url = "https://files.pythonhosted.org/packages/e2/63/2bed8323890cb613bbecda807688a31ed11a7fe7afe31f8faaae0206a9a3/cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {url = "https://files.pythonhosted.org/packages/e6/c3/21cab7a6154b6a5ea330ae80de386e7665254835b9e98ecc1340b3a7de9a/cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {url = "https://files.pythonhosted.org/packages/ed/65/25a8dc32c53bf5b7b6c2686b42ae2ad58743f7ff644844af7cdb29b49361/cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, - {url = "https://files.pythonhosted.org/packages/fc/fc/a1e4bebd8d680febd29cf6c8a40067182b64f00c7d105f8f26b5bc54317b/cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, -] -"charset-normalizer 3.3.2" = [ - {url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {url = "https://files.pythonhosted.org/packages/05/8c/eb854996d5fef5e4f33ad56927ad053d04dc820e4a3d39023f35cad72617/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {url = "https://files.pythonhosted.org/packages/13/82/83c188028b6f38d39538442dd127dc794c602ae6d45d66c469f4063a4c30/charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {url = "https://files.pythonhosted.org/packages/13/f8/eefae0629fa9260f83b826ee3363e311bb03cfdd518dad1bd10d57cb2d84/charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {url = "https://files.pythonhosted.org/packages/16/ea/a9e284aa38cccea06b7056d4cbc7adf37670b1f8a668a312864abf1ff7c6/charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {url = "https://files.pythonhosted.org/packages/1f/8d/33c860a7032da5b93382cbe2873261f81467e7b37f4ed91e25fed62fd49b/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, - {url = "https://files.pythonhosted.org/packages/2a/9d/a6d15bd1e3e2914af5955c8eb15f4071997e7078419328fee93dfd497eb7/charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {url = "https://files.pythonhosted.org/packages/2b/61/095a0aa1a84d1481998b534177c8566fdc50bb1233ea9a0478cd3cc075bd/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {url = "https://files.pythonhosted.org/packages/2e/37/9223632af0872c86d8b851787f0edd3fe66be4a5378f51242b25212f8374/charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {url = "https://files.pythonhosted.org/packages/2f/0e/d7303ccae9735ff8ff01e36705ad6233ad2002962e8668a970fc000c5e1b/charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {url = "https://files.pythonhosted.org/packages/33/95/ef68482e4a6adf781fae8d183fb48d6f2be8facb414f49c90ba6a5149cd1/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {url = "https://files.pythonhosted.org/packages/33/c3/3b96a435c5109dd5b6adc8a59ba1d678b302a97938f032e3770cc84cd354/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {url = "https://files.pythonhosted.org/packages/34/2a/f392457d45e24a0c9bfc012887ed4f3c54bf5d4d05a5deb970ffec4b7fc0/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {url = "https://files.pythonhosted.org/packages/3d/09/d82fe4a34c5f0585f9ea1df090e2a71eb9bb1e469723053e1ee9f57c16f3/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {url = "https://files.pythonhosted.org/packages/3d/85/5b7416b349609d20611a64718bed383b9251b5a601044550f0c8983b8900/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {url = "https://files.pythonhosted.org/packages/3f/ba/3f5e7be00b215fa10e13d64b1f6237eb6ebea66676a41b2bcdd09fe74323/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {url = "https://files.pythonhosted.org/packages/43/05/3bf613e719efe68fb3a77f9c536a389f35b95d75424b96b426a47a45ef1d/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {url = "https://files.pythonhosted.org/packages/44/80/b339237b4ce635b4af1c73742459eee5f97201bd92b2371c53e11958392e/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {url = "https://files.pythonhosted.org/packages/46/6a/d5c26c41c49b546860cc1acabdddf48b0b3fb2685f4f5617ac59261b44ae/charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {url = "https://files.pythonhosted.org/packages/4f/d1/d547cc26acdb0cc458b152f79b2679d7422f29d41581e6fa907861e88af1/charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {url = "https://files.pythonhosted.org/packages/51/fd/0ee5b1c2860bb3c60236d05b6e4ac240cf702b67471138571dad91bcfed8/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {url = "https://files.pythonhosted.org/packages/53/cd/aa4b8a4d82eeceb872f83237b2d27e43e637cac9ffaef19a1321c3bafb67/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {url = "https://files.pythonhosted.org/packages/54/7f/cad0b328759630814fcf9d804bfabaf47776816ad4ef2e9938b7e1123d04/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {url = "https://files.pythonhosted.org/packages/58/78/a0bc646900994df12e07b4ae5c713f2b3e5998f58b9d3720cce2aa45652f/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {url = "https://files.pythonhosted.org/packages/58/a2/0c63d5d7ffac3104b86631b7f2690058c97bf72d3145c0a9cd4fb90c58c2/charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {url = "https://files.pythonhosted.org/packages/66/fe/c7d3da40a66a6bf2920cce0f436fa1f62ee28aaf92f412f0bf3b84c8ad6c/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {url = "https://files.pythonhosted.org/packages/74/20/8923a06f15eb3d7f6a306729360bd58f9ead1dc39bc7ea8831f4b407e4ae/charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {url = "https://files.pythonhosted.org/packages/79/66/8946baa705c588521afe10b2d7967300e49380ded089a62d38537264aece/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {url = "https://files.pythonhosted.org/packages/81/b2/160893421adfa3c45554fb418e321ed342bb10c0a4549e855b2b2a3699cb/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {url = "https://files.pythonhosted.org/packages/8d/b7/9e95102e9a8cce6654b85770794b582dda2921ec1fd924c10fbcf215ad31/charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {url = "https://files.pythonhosted.org/packages/91/95/e2cfa7ce962e6c4b59a44a6e19e541c3a0317e543f0e0923f844e8d7d21d/charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {url = "https://files.pythonhosted.org/packages/96/fc/0cae31c0f150cd1205a2a208079de865f69a8fd052a98856c40c99e36b3c/charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {url = "https://files.pythonhosted.org/packages/98/69/5d8751b4b670d623aa7a47bef061d69c279e9f922f6705147983aa76c3ce/charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {url = "https://files.pythonhosted.org/packages/9e/ef/cd47a63d3200b232792e361cd67530173a09eb011813478b1c0fb8aa7226/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {url = "https://files.pythonhosted.org/packages/a0/b1/4e72ef73d68ebdd4748f2df97130e8428c4625785f2b6ece31f555590c2d/charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {url = "https://files.pythonhosted.org/packages/a2/a0/4af29e22cb5942488cf45630cbdd7cefd908768e69bdd90280842e4e8529/charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {url = "https://files.pythonhosted.org/packages/a8/31/47d018ef89f95b8aded95c589a77c072c55e94b50a41aa99c0a2008a45a4/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {url = "https://files.pythonhosted.org/packages/a8/6f/4ff299b97da2ed6358154b6eb3a2db67da2ae204e53d205aacb18a7e4f34/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {url = "https://files.pythonhosted.org/packages/ae/d5/4fecf1d58bedb1340a50f165ba1c7ddc0400252d6832ff619c4568b36cc0/charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {url = "https://files.pythonhosted.org/packages/b2/62/5a5dcb9a71390a9511a253bde19c9c89e0b20118e41080185ea69fb2c209/charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {url = "https://files.pythonhosted.org/packages/b3/c1/ebca8e87c714a6a561cfee063f0655f742e54b8ae6e78151f60ba8708b3a/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {url = "https://files.pythonhosted.org/packages/b8/60/e2f67915a51be59d4539ed189eb0a2b0d292bf79270410746becb32bc2c3/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {url = "https://files.pythonhosted.org/packages/bd/28/7ea29e73eea52c7e15b4b9108d0743fc9e4cc2cdb00d275af1df3d46d360/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {url = "https://files.pythonhosted.org/packages/be/4d/9e370f8281cec2fcc9452c4d1ac513324c32957c5f70c73dd2fa8442a21a/charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {url = "https://files.pythonhosted.org/packages/c1/9d/254a2f1bcb0ce9acad838e94ed05ba71a7cb1e27affaa4d9e1ca3958cdb6/charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {url = "https://files.pythonhosted.org/packages/c2/65/52aaf47b3dd616c11a19b1052ce7fa6321250a7a0b975f48d8c366733b9f/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {url = "https://files.pythonhosted.org/packages/c8/ce/09d6845504246d95c7443b8c17d0d3911ec5fdc838c3213e16c5e47dee44/charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {url = "https://files.pythonhosted.org/packages/c9/7a/6d8767fac16f2c80c7fa9f14e0f53d4638271635c306921844dc0b5fd8a6/charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {url = "https://files.pythonhosted.org/packages/cc/94/f7cf5e5134175de79ad2059edf2adce18e0685ebdb9227ff0139975d0e93/charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {url = "https://files.pythonhosted.org/packages/d1/2f/0d1efd07c74c52b6886c32a3b906fb8afd2fecf448650e73ecb90a5a27f1/charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {url = "https://files.pythonhosted.org/packages/da/f1/3702ba2a7470666a62fd81c58a4c40be00670e5006a67f4d626e57f013ae/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {url = "https://files.pythonhosted.org/packages/db/fb/d29e343e7c57bbf1231275939f6e75eb740cd47a9d7cb2c52ffeb62ef869/charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {url = "https://files.pythonhosted.org/packages/e1/9c/60729bf15dc82e3aaf5f71e81686e42e50715a1399770bcde1a9e43d09db/charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {url = "https://files.pythonhosted.org/packages/eb/5c/97d97248af4920bc68687d9c3b3c0f47c910e21a8ff80af4565a576bd2f0/charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {url = "https://files.pythonhosted.org/packages/ef/d4/a1d72a8f6aa754fdebe91b848912025d30ab7dced61e9ed8aabbf791ed65/charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {url = "https://files.pythonhosted.org/packages/f2/0e/e06bc07ef4673e4d24dc461333c254586bb759fdd075031539bab6514d07/charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {url = "https://files.pythonhosted.org/packages/f6/93/bb6cbeec3bf9da9b2eba458c15966658d1daa8b982c642f81c93ad9b40e1/charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {url = "https://files.pythonhosted.org/packages/f6/d3/bfc699ab2c4f9245867060744e8136d359412ff1e5ad93be38a46d160f9d/charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {url = "https://files.pythonhosted.org/packages/f7/9d/bcf4a449a438ed6f19790eee543a86a740c77508fbc5ddab210ab3ba3a9a/charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, -] -"click 8.1.7" = [ - {url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] -"colorama 0.4.6" = [ - {url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -"dnspython 2.6.1" = [ - {url = "https://files.pythonhosted.org/packages/37/7d/c871f55054e403fdfd6b8f65fd6d1c4e147ed100d3e9f9ba1fe695403939/dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, - {url = "https://files.pythonhosted.org/packages/87/a1/8c5287991ddb8d3e4662f71356d9656d91ab3a36618c3dd11b280df0d255/dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, -] -"drone-flightplan 0.3.1rc4" = [ - {url = "https://files.pythonhosted.org/packages/02/f4/765a09ec0346de3f12b7bbabc378f84bbe7af7cb24b7cdf0bcc84de5b03d/drone_flightplan-0.3.1rc4-py3-none-any.whl", hash = "sha256:d0150655091c187a8db8a3f5170ed4a3d85bc25408ff463f02478a9ed4f29666"}, - {url = "https://files.pythonhosted.org/packages/b6/68/9e800150217c047fbad940ad82feeba737e1e6364a2817eb70da23725104/drone_flightplan-0.3.1rc4.tar.gz", hash = "sha256:badce959ffcf062028e0245e8a00b8f7e9cac52c356f673b0eccdbed5c92a961"}, -] -"email-validator 2.2.0" = [ - {url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"}, - {url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631"}, -] -"fastapi 0.112.0" = [ - {url = "https://files.pythonhosted.org/packages/0a/50/c535521c0cdb8b78da923bfffca7eb38429828de1770bbd8820b55f3779f/fastapi-0.112.0.tar.gz", hash = "sha256:d262bc56b7d101d1f4e8fc0ad2ac75bb9935fec504d2b7117686cec50710cf05"}, - {url = "https://files.pythonhosted.org/packages/26/34/d0dca5f1fc0113723a425c913a886709698c4110f960c0990905804e0b2c/fastapi-0.112.0-py3-none-any.whl", hash = "sha256:3487ded9778006a45834b8c816ec4a48d522e2631ca9e75ec5a774f1b052f821"}, -] -"gdal 3.6.2" = [ - {url = "https://files.pythonhosted.org/packages/49/4f/174743caf64d1999c46ab2ee72b2cb0d77a47bd7ed04f954f863e35a25fd/GDAL-3.6.2.tar.gz", hash = "sha256:a167cde1813707d91a938dad1a22f280f5ad28c45980d42e948fb8c59f890f5a"}, -] -"geoalchemy2 0.14.2" = [ - {url = "https://files.pythonhosted.org/packages/23/41/5011f934e34cc0995fdff6ade94fd897177a0119ba439eab7f49e9ac32b3/GeoAlchemy2-0.14.2.tar.gz", hash = "sha256:8ca023dcb9a36c6d312f3b4aee631d66385264e2fc9feb0ab0f446eb5609407d"}, - {url = "https://files.pythonhosted.org/packages/a6/a0/6a1c96ab4f95fb3573ac47f370404a78497509e5883420e9cb09e31a589b/GeoAlchemy2-0.14.2-py3-none-any.whl", hash = "sha256:ca81c2d924c0724458102bac93f68f3e3c337a65fcb811af5e504ce7c5d56ac2"}, -] -"geojson 3.1.0" = [ - {url = "https://files.pythonhosted.org/packages/0f/34/0ea653dec93d3a360856e629a897a1d3ab534f2952852bb59d55853055ed/geojson-3.1.0.tar.gz", hash = "sha256:58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac"}, - {url = "https://files.pythonhosted.org/packages/8e/1b/4f57660aa148d3e3043d048b7e1ab87dfeb85204d0fdb5b4e19c08202162/geojson-3.1.0-py3-none-any.whl", hash = "sha256:68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3"}, -] -"geojson-pydantic 1.1.0" = [ - {url = "https://files.pythonhosted.org/packages/0d/05/af6c27e0cd2f7629559db36dffc28185afb7192622ca9571d56a548038b0/geojson_pydantic-1.1.0-py3-none-any.whl", hash = "sha256:0de723719d66e585123db10ead99dfa51aff8cec08be512646df25224ac425f4"}, - {url = "https://files.pythonhosted.org/packages/b1/28/3606a62de5066c13fb7e9156c2dc371c1b082f2f7e83f510525ba7a17da2/geojson_pydantic-1.1.0.tar.gz", hash = "sha256:b214dc746f1e085641e32f0aaa47e0bfa67eefa2cf60a516326c68b87808e2ae"}, -] -"greenlet 3.1.0" = [ - {url = "https://files.pythonhosted.org/packages/05/76/5902a38828f06b2bd964ffca36275439c3be993184b9540341585aadad3d/greenlet-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3e7e6ef1737a819819b1163116ad4b48d06cfdd40352d813bb14436024fcda99"}, - {url = "https://files.pythonhosted.org/packages/0d/20/89674b7d62a19138b3352f6080f2ff3e1ee4a298b29bb793746423d0b908/greenlet-3.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:28fe80a3eb673b2d5cc3b12eea468a5e5f4603c26aa34d88bf61bba82ceb2f9b"}, - {url = "https://files.pythonhosted.org/packages/10/90/53ad671dcdbf973b017a6e98f12a268bd1a00b0a712094be94f916bf8381/greenlet-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9eb4a1d7399b9f3c7ac68ae6baa6be5f9195d1d08c9ddc45ad559aa6b556bce6"}, - {url = "https://files.pythonhosted.org/packages/16/be/4f5fd9ea44eb58e32ecfaf72839f842e2f343eaa0ff5c24cadbcfe22aad5/greenlet-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e49a65d25d7350cca2da15aac31b6f67a43d867448babf997fe83c7505f57bc"}, - {url = "https://files.pythonhosted.org/packages/24/b5/24dc29e920a1f6b4e2f920fdd642a3364a5b082988931b7d5d1229d48340/greenlet-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2651dfb006f391bcb240635079a68a261b227a10a08af6349cba834a2141efa1"}, - {url = "https://files.pythonhosted.org/packages/27/37/b2ee70a8053a295e020e05e4d235d795f3013b55a2ac7513c9cbf0d53133/greenlet-3.1.0-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13ff8c8e54a10472ce3b2a2da007f915175192f18e6495bad50486e87c7f6637"}, - {url = "https://files.pythonhosted.org/packages/27/f9/23fec67219d73ec2fbf24a0dd9bfc51afb6aac9fde29dc7c99a6992d4fe3/greenlet-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a3dae7492d16e85ea6045fd11cb8e782b63eac8c8d520c3a92c02ac4573b0a6"}, - {url = "https://files.pythonhosted.org/packages/2c/0b/15c674a64cc35a0ac7808c5c7feb25513feb31300bcc8c50565b798b0f64/greenlet-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:a0409bc18a9f85321399c29baf93545152d74a49d92f2f55302f122007cfda00"}, - {url = "https://files.pythonhosted.org/packages/2d/34/17f5623158ec1fff9326965d61705820aa498cdb5d179f6d42dbc2113c10/greenlet-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c3446937be153718250fe421da548f973124189f18fe4575a0510b5c928f0cc"}, - {url = "https://files.pythonhosted.org/packages/31/99/04e9416ee5ad22d5ceaf01efac2e7386e17c3d4c6dd3407a3df4b9c682f6/greenlet-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fd6e94593f6f9714dbad1aaba734b5ec04593374fa6638df61592055868f8b8"}, - {url = "https://files.pythonhosted.org/packages/3b/4e/2d0428b76e39802cfc2ce53afab4b0cbbdc0ba13925180352c7f0cf51b46/greenlet-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9482c2ed414781c0af0b35d9d575226da6b728bd1a720668fa05837184965b7"}, - {url = "https://files.pythonhosted.org/packages/3e/e8/5d522a89f890a4ffefd02c21a12be503c03071fb5eb586d216e4f263d9e7/greenlet-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44151d7b81b9391ed759a2f2865bbe623ef00d648fed59363be2bbbd5154656f"}, - {url = "https://files.pythonhosted.org/packages/46/b3/cc9cff0bebd128836cf75a200b9e4b319abf4b72e983c4931775a4976ea4/greenlet-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:221169d31cada333a0c7fd087b957c8f431c1dba202c3a58cf5a3583ed973e9b"}, - {url = "https://files.pythonhosted.org/packages/47/ff/c8ec3bcf7e23f45ed4085b6673a23b4d4763bb39e9797b787c55ed65dbc1/greenlet-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd65695a8df1233309b701dec2539cc4b11e97d4fcc0f4185b4a12ce54db0491"}, - {url = "https://files.pythonhosted.org/packages/4a/dc/3b66219e65dd854037a997a72c84affbdf32fefe3482c43ac26590757b2d/greenlet-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:184258372ae9e1e9bddce6f187967f2e08ecd16906557c4320e3ba88a93438c3"}, - {url = "https://files.pythonhosted.org/packages/50/15/b3e7de3d7e141a328b8141d85e4b01c27bcff0161e5ca2d9a490b87ae3c5/greenlet-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9505a0c8579899057cbefd4ec34d865ab99852baf1ff33a9481eb3924e2da0b"}, - {url = "https://files.pythonhosted.org/packages/51/a2/09d1306418e81bba6775b41fec2f7c672d77a9175ad6fb1b3beefedaba8f/greenlet-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:ac0adfdb3a21dc2a24ed728b61e72440d297d0fd3a577389df566651fcd08f97"}, - {url = "https://files.pythonhosted.org/packages/52/61/8ece7ea36c7ad76f09ddb8c7dce7abf40cd608167564105c8281174d73f5/greenlet-3.1.0-cp38-cp38-win32.whl", hash = "sha256:1544b8dd090b494c55e60c4ff46e238be44fdc472d2589e943c241e0169bcea2"}, - {url = "https://files.pythonhosted.org/packages/56/fe/bc264a26bc7baeb619334385aac76dd19d0ec556429fb0e74443fd7974b6/greenlet-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:619935a44f414274a2c08c9e74611965650b730eb4efe4b2270f91df5e4adf9a"}, - {url = "https://files.pythonhosted.org/packages/57/9d/2d618474cdab9f664b2cf0641e7832b1a86e03c6dbd1ff505c7cdf2c4d8e/greenlet-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3c59a06c2c28a81a026ff11fbf012081ea34fb9b7052f2ed0366e14896f0a1d"}, - {url = "https://files.pythonhosted.org/packages/58/a8/a54a8816187e55f42fa135419efe3a88a2749f75ed4169abc6bf300ce0a9/greenlet-3.1.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:24fc216ec7c8be9becba8b64a98a78f9cd057fd2dc75ae952ca94ed8a893bf27"}, - {url = "https://files.pythonhosted.org/packages/60/b5/6e3ecc12dc58c575cde447477db71d6b197f10fcde7eb259ed84e9c9c4de/greenlet-3.1.0-cp39-cp39-win32.whl", hash = "sha256:d0dd943282231480aad5f50f89bdf26690c995e8ff555f26d8a5b9887b559bcc"}, - {url = "https://files.pythonhosted.org/packages/65/1b/3d91623c3eff61c11799e7f3d6c01f6bfa9bd2d1f0181116fd0b9b108a40/greenlet-3.1.0.tar.gz", hash = "sha256:b395121e9bbe8d02a750886f108d540abe66075e61e22f7353d9acb0b81be0f0"}, - {url = "https://files.pythonhosted.org/packages/65/94/eafcd6812ad878e14b92aa0c96a28f84a35a23685d8fad0b7569235ae994/greenlet-3.1.0-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:665b21e95bc0fce5cab03b2e1d90ba9c66c510f1bb5fdc864f3a377d0f553f6b"}, - {url = "https://files.pythonhosted.org/packages/66/49/de46b2da577000044e7f5ab514021bbc48a0b0c6dd7af2da9732db36c584/greenlet-3.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4bf607f690f7987ab3291406e012cd8591a4f77aa54f29b890f9c331e84989"}, - {url = "https://files.pythonhosted.org/packages/6e/3d/c732906902d4cfa75f7432ef28e9acb3461b56e01f69ab485bd8e32458a8/greenlet-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f346d24d74c00b6730440f5eb8ec3fe5774ca8d1c9574e8e57c8671bb51b910"}, - {url = "https://files.pythonhosted.org/packages/75/4a/c612e5688dbbce6873763642195d9902e04de43914fe415661fe3c435e1e/greenlet-3.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9d86401550b09a55410f32ceb5fe7efcd998bd2dad9e82521713cb148a4a15f"}, - {url = "https://files.pythonhosted.org/packages/77/d5/489ee9a7a9bace162d99c52f347edc14ffa570fdf5684e95d9dc146ba1be/greenlet-3.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26811df4dc81271033a7836bc20d12cd30938e6bd2e9437f56fa03da81b0f8fc"}, - {url = "https://files.pythonhosted.org/packages/7b/da/1c095eaf7ade0d67c520ee98ab2f34b9c1279e5be96154a46fb940aa8567/greenlet-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44cd313629ded43bb3b98737bba2f3e2c2c8679b55ea29ed73daea6b755fe8e7"}, - {url = "https://files.pythonhosted.org/packages/7f/19/5824ddd54f91b22420908a099d801e3b3c9e49da55b1805d6c5a6fc163ef/greenlet-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81eeec4403a7d7684b5812a8aaa626fa23b7d0848edb3a28d2eb3220daddcbd0"}, - {url = "https://files.pythonhosted.org/packages/80/ae/108d1ed1a9e8472ff6a494121fd45ab5666e4c3009b3bfc595e3a0683570/greenlet-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a771dc64fa44ebe58d65768d869fcfb9060169d203446c1d446e844b62bdfdca"}, - {url = "https://files.pythonhosted.org/packages/86/01/852b8c516b35ef2b16812655612092e02608ea79de7e79fde841cfcdbae4/greenlet-3.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6f4c2027689093775fd58ca2388d58789009116844432d920e9147f91acbe64"}, - {url = "https://files.pythonhosted.org/packages/87/b0/ac381b73c9b9e2cb55970b9a5842ff5b6bc83a7f23aedd3dded1589f0039/greenlet-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:d46d5069e2eeda111d6f71970e341f4bd9aeeee92074e649ae263b834286ecc0"}, - {url = "https://files.pythonhosted.org/packages/89/dc/d2eaaefca5e295ec9cc09c958f7c3086582a6e1d93de31b780e420cbf6dc/greenlet-3.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d07c28b85b350564bdff9f51c1c5007dfb2f389385d1bc23288de51134ca303"}, - {url = "https://files.pythonhosted.org/packages/96/20/4a7e12ba42c86d511cc6137f15af1b99fad95642134c64a2da7a84f448f3/greenlet-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9671e7282d8c6fcabc32c0fb8d7c0ea8894ae85cee89c9aadc2d7129e1a9954"}, - {url = "https://files.pythonhosted.org/packages/98/bb/208f0b192f6c22e5371d0fd6dfa50d429562af8d79a4045bad0f2d7df4ec/greenlet-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:01059afb9b178606b4b6e92c3e710ea1635597c3537e44da69f4531e111dd5e9"}, - {url = "https://files.pythonhosted.org/packages/9b/a4/f2493536dad2539b84f61e60b6071e29bea05e8148cfa67237aeba550898/greenlet-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a814dc3100e8a046ff48faeaa909e80cdb358411a3d6dd5293158425c684eda8"}, - {url = "https://files.pythonhosted.org/packages/9d/e7/744b590459b7d06b6b3383036ae0a0540ece9132f5e2c6c3c640de6c36ab/greenlet-3.1.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d004db911ed7b6218ec5c5bfe4cf70ae8aa2223dffbb5b3c69e342bb253cb28"}, - {url = "https://files.pythonhosted.org/packages/a0/ab/194c82e7c81a884057149641a55f6fd1755b396fd19a88ed4ca2472c2724/greenlet-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cd8518eade968bc52262d8c46727cfc0826ff4d552cf0430b8d65aaf50bb91d"}, - {url = "https://files.pythonhosted.org/packages/a2/90/912a1227a841d5df57d6dbe5730e049d5fd38c902c3940e45222360ca336/greenlet-3.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a53dfe8f82b715319e9953330fa5c8708b610d48b5c59f1316337302af5c0811"}, - {url = "https://files.pythonhosted.org/packages/a9/25/c7e0526420b241b5548df8214303463b751ed66b2efff006bfb4b6f9ef3f/greenlet-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b5ea3664eed571779403858d7cd0a9b0ebf50d57d2cdeafc7748e09ef8cd81a"}, - {url = "https://files.pythonhosted.org/packages/aa/25/5aa6682f68b2c5a4ef1887e7d576cc76f6269f7c46aad71ce5163ae504ee/greenlet-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:db1b3ccb93488328c74e97ff888604a8b95ae4f35f4f56677ca57a4fc3a4220b"}, - {url = "https://files.pythonhosted.org/packages/aa/67/12f51aa488d8778e1b8e9fcaeb25678524eda29a7a133a9263d6449fe011/greenlet-3.1.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9c1c4f1748ccac0bae1dbb465fb1a795a75aba8af8ca871503019f4285e2a"}, - {url = "https://files.pythonhosted.org/packages/af/c1/abccddcb2ec07538b6ee1fa30999a239a1ec807109a8dc069e55288df636/greenlet-3.1.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037d9ac99540ace9424cb9ea89f0accfaff4316f149520b4ae293eebc5bded17"}, - {url = "https://files.pythonhosted.org/packages/b2/f5/15440aaf5e0ccb7cb050fe8669b5f625ee6ed2e8ba82315b4bc2c0944b86/greenlet-3.1.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c0a5b1c22c82831f56f2f7ad9bbe4948879762fe0d59833a4a71f16e5fa0f682"}, - {url = "https://files.pythonhosted.org/packages/b9/46/d97ad3d8ca6ab8c4f166493164b5461161a295887b6d9ca0bbd4ccdede78/greenlet-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76dc19e660baea5c38e949455c1181bc018893f25372d10ffe24b3ed7341fb25"}, - {url = "https://files.pythonhosted.org/packages/c1/7c/6b1f3ced3867a7ca073100aab0d2d200f11b07bc60710eefbb6278cda219/greenlet-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fad7a051e07f64e297e6e8399b4d6a3bdcad3d7297409e9a06ef8cbccff4f501"}, - {url = "https://files.pythonhosted.org/packages/c1/e8/30c84a3c639691f6c00b04575abd474d94d404a9ad686e60ba0c17c797d0/greenlet-3.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:90b5bbf05fe3d3ef697103850c2ce3374558f6fe40fd57c9fac1bf14903f50a5"}, - {url = "https://files.pythonhosted.org/packages/ca/7d/7c348b13b67930c6d0ee1438ec4be64fc2c8f23f55bd50179db2a5303944/greenlet-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:ffb08f2a1e59d38c7b8b9ac8083c9c8b9875f0955b1e9b9b9a965607a51f8e54"}, - {url = "https://files.pythonhosted.org/packages/cc/7a/12e04050093151008ee768580c4fd701c4a4de7ecc01d96af73a130c04ed/greenlet-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713d450cf8e61854de9420fb7eea8ad228df4e27e7d4ed465de98c955d2b3fa6"}, - {url = "https://files.pythonhosted.org/packages/cc/d2/460d00a72720a8798815d29cc4281b72103910017ca2d560a12f801b2138/greenlet-3.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655b21ffd37a96b1e78cc48bf254f5ea4b5b85efaf9e9e2a526b3c9309d660ca"}, - {url = "https://files.pythonhosted.org/packages/cd/84/9ed78fd909292a9aee9c713c8dc08d2335628ca56a5e675235818ca5f0e0/greenlet-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfcfb73aed40f550a57ea904629bdaf2e562c68fa1164fa4588e752af6efdc3f"}, - {url = "https://files.pythonhosted.org/packages/d3/73/591c60545a81edc62c06325c4948865cca5904eb01388fbd11f9c5a72d5a/greenlet-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415b9494ff6240b09af06b91a375731febe0090218e2898d2b85f9b92abcda0"}, - {url = "https://files.pythonhosted.org/packages/d9/b5/ad4ec97be5cd964932fe4cde80df03d9fca23ed8b5c65d54f16270af639f/greenlet-3.1.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a8870983af660798dc1b529e1fd6f1cefd94e45135a32e58bd70edd694540f33"}, - {url = "https://files.pythonhosted.org/packages/e2/0e/bfca17d8f0e7b7dfc918d504027bb795d1aad9ea459a90c33acb24c29034/greenlet-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d58ec349e0c2c0bc6669bf2cd4982d2f93bf067860d23a0ea1fe677b0f0b1e09"}, - {url = "https://files.pythonhosted.org/packages/e7/1f/fe4c6f388c9a6736b5afc783979ba6d0fc9ee9c5edb5539184ac88aa8b8c/greenlet-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9730929375021ec90f6447bff4f7f5508faef1c02f399a1953870cdb78e0c345"}, - {url = "https://files.pythonhosted.org/packages/e7/80/b1f8b87bcb32f8aa2582e25088dc59e96dff9472d8f6d3e46b19cf9a6e89/greenlet-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d45b75b0f3fd8d99f62eb7908cfa6d727b7ed190737dec7fe46d993da550b81a"}, - {url = "https://files.pythonhosted.org/packages/e8/30/22f6c2bc2e21b51ecf0b59f503f00041fe7fc44f5a9923dc701f686a0e47/greenlet-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ddc7bcedeb47187be74208bc652d63d6b20cb24f4e596bd356092d8000da6d6"}, - {url = "https://files.pythonhosted.org/packages/e8/65/577971a48f06ebd2f759466b4c1c59cd4dc901ec43f1a775207430ad80b9/greenlet-3.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:243a223c96a4246f8a30ea470c440fe9db1f5e444941ee3c3cd79df119b8eebf"}, - {url = "https://files.pythonhosted.org/packages/ea/7d/d87885ed60a5bf9dbb4424386b84ab96a50b2f4eb2d00641788b73bdb2cd/greenlet-3.1.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cea1cca3be76c9483282dc7760ea1cc08a6ecec1f0b6ca0a94ea0d17432da19"}, - {url = "https://files.pythonhosted.org/packages/eb/9b/39930fdefa5dab2511ed813a6764458980e04e10c8c3560862fb2f340128/greenlet-3.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76e5064fd8e94c3f74d9fd69b02d99e3cdb8fc286ed49a1f10b256e59d0d3a0b"}, - {url = "https://files.pythonhosted.org/packages/ee/89/88b2b0ef98f942d260109e99b776524309761399f73547b4d0e29275f755/greenlet-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22f4e26400f7f48faef2d69c20dc055a1f3043d330923f9abe08ea0aecc44df"}, - {url = "https://files.pythonhosted.org/packages/f1/8c/a9f0d64d8eb142bb6931203a3768099a8016607409674970aeede2a72b53/greenlet-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3967dcc1cd2ea61b08b0b276659242cbce5caca39e7cbc02408222fb9e6ff39"}, - {url = "https://files.pythonhosted.org/packages/f7/ed/f25832e30a54a92fa13ab94a206f2ea296306acdf5f6a48f88bbb41a6e44/greenlet-3.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:726377bd60081172685c0ff46afbc600d064f01053190e4450857483c4d44484"}, - {url = "https://files.pythonhosted.org/packages/f9/5f/fb128714bbd96614d570fff1d91bbef7a49345bea183e9ea19bdcda1f235/greenlet-3.1.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:76b3e3976d2a452cba7aa9e453498ac72240d43030fdc6d538a72b87eaff52fd"}, - {url = "https://files.pythonhosted.org/packages/fb/e8/9374e77fc204973d6d901c8bb2d7cb223e81513754874cbee6cc5c5fc0ba/greenlet-3.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:cd468ec62257bb4544989402b19d795d2305eccb06cde5da0eb739b63dc04665"}, -] -"h11 0.14.0" = [ - {url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] -"idna 3.8" = [ - {url = "https://files.pythonhosted.org/packages/22/7e/d71db821f177828df9dea8c42ac46473366f191be53080e552e628aad991/idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {url = "https://files.pythonhosted.org/packages/e8/ac/e349c5e6d4543326c6883ee9491e3921e0d07b55fdf3cce184b40d63e72a/idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, -] -"itsdangerous 2.2.0" = [ - {url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, - {url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, -] -"jinja2 3.1.4" = [ - {url = "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {url = "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, -] -"loguru 0.7.2" = [ - {url = "https://files.pythonhosted.org/packages/03/0a/4f6fed21aa246c6b49b561ca55facacc2a44b87d65b8b92362a8e99ba202/loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, - {url = "https://files.pythonhosted.org/packages/9e/30/d87a423766b24db416a46e9335b9602b054a72b96a88a241f2b09b560fa8/loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, -] -"mako 1.3.5" = [ - {url = "https://files.pythonhosted.org/packages/03/62/70f5a0c2dd208f9f3f2f9afd103aec42ee4d9ad2401d78342f75e9b8da36/Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, - {url = "https://files.pythonhosted.org/packages/67/03/fb5ba97ff65ce64f6d35b582aacffc26b693a98053fa831ab43a437cbddb/Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, -] -"markupsafe 2.1.5" = [ - {url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, - {url = "https://files.pythonhosted.org/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, - {url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, - {url = "https://files.pythonhosted.org/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, - {url = "https://files.pythonhosted.org/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, - {url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, - {url = "https://files.pythonhosted.org/packages/0e/7d/968284145ffd9d726183ed6237c77938c021abacde4e073020f920e060b2/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, - {url = "https://files.pythonhosted.org/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, - {url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, - {url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, - {url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, - {url = "https://files.pythonhosted.org/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, - {url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, - {url = "https://files.pythonhosted.org/packages/2f/69/30d29adcf9d1d931c75001dd85001adad7374381c9c2086154d9f6445be6/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, - {url = "https://files.pythonhosted.org/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, - {url = "https://files.pythonhosted.org/packages/3a/03/63498d05bd54278b6ca340099e5b52ffb9cdf2ee4f2d9b98246337e21689/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, - {url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, - {url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, - {url = "https://files.pythonhosted.org/packages/4a/1d/c4f5016f87ced614eacc7d5fb85b25bcc0ff53e8f058d069fc8cbfdc3c7a/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, - {url = "https://files.pythonhosted.org/packages/4c/6f/f2b0f675635b05f6afd5ea03c094557bdb8622fa8e673387444fe8d8e787/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, - {url = "https://files.pythonhosted.org/packages/4f/14/6f294b9c4f969d0c801a4615e221c1e084722ea6114ab2114189c5b8cbe0/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, - {url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, - {url = "https://files.pythonhosted.org/packages/51/e0/393467cf899b34a9d3678e78961c2c8cdf49fb902a959ba54ece01273fb1/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, - {url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, - {url = "https://files.pythonhosted.org/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, - {url = "https://files.pythonhosted.org/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, - {url = "https://files.pythonhosted.org/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, - {url = "https://files.pythonhosted.org/packages/68/79/11b4fe15124692f8673b603433e47abca199a08ecd2a4851bfbdc97dc62d/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, - {url = "https://files.pythonhosted.org/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, - {url = "https://files.pythonhosted.org/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, - {url = "https://files.pythonhosted.org/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, - {url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, - {url = "https://files.pythonhosted.org/packages/6c/4c/3577a52eea1880538c435176bc85e5b3379b7ab442327ccd82118550758f/MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, - {url = "https://files.pythonhosted.org/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, - {url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, - {url = "https://files.pythonhosted.org/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, - {url = "https://files.pythonhosted.org/packages/81/d4/fd74714ed30a1dedd0b82427c02fa4deec64f173831ec716da11c51a50aa/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, - {url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, - {url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, - {url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, - {url = "https://files.pythonhosted.org/packages/92/21/357205f03514a49b293e214ac39de01fadd0970a6e05e4bf1ddd0ffd0881/MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, - {url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, - {url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, - {url = "https://files.pythonhosted.org/packages/a7/88/a940e11827ea1c136a34eca862486178294ae841164475b9ab216b80eb8e/MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, - {url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, - {url = "https://files.pythonhosted.org/packages/b3/fb/c18b8c9fbe69e347fdbf782c6478f1bc77f19a830588daa224236678339b/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, - {url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, - {url = "https://files.pythonhosted.org/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, - {url = "https://files.pythonhosted.org/packages/bf/f3/ecb00fc8ab02b7beae8699f34db9357ae49d9f21d4d3de6f305f34fa949e/MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, - {url = "https://files.pythonhosted.org/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, - {url = "https://files.pythonhosted.org/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, - {url = "https://files.pythonhosted.org/packages/cb/06/0d28bd178db529c5ac762a625c335a9168a7a23f280b4db9c95e97046145/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, - {url = "https://files.pythonhosted.org/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, - {url = "https://files.pythonhosted.org/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, - {url = "https://files.pythonhosted.org/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, - {url = "https://files.pythonhosted.org/packages/ed/88/408bdbf292eb86f03201c17489acafae8358ba4e120d92358308c15cea7c/MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, - {url = "https://files.pythonhosted.org/packages/f6/02/5437e2ad33047290dafced9df741d9efc3e716b75583bbd73a9984f1b6f7/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, - {url = "https://files.pythonhosted.org/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, - {url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, - {url = "https://files.pythonhosted.org/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, -] -"minio 7.2.8" = [ - {url = "https://files.pythonhosted.org/packages/34/89/f4d5cfb0a5494e7dae1c11d6d1ab82811d93f6af8ca54e1393c046ff0e75/minio-7.2.8-py3-none-any.whl", hash = "sha256:aa3b485788b63b12406a5798465d12a57e4be2ac2a58a8380959b6b748e64ddd"}, - {url = "https://files.pythonhosted.org/packages/85/be/6ddefcacca569bc1199cf8796fef891e67596ae30d865ea27e86b247ca4f/minio-7.2.8.tar.gz", hash = "sha256:f8af2dafc22ebe1aef3ac181b8e217037011c430aa6da276ed627e55aaf7c815"}, -] -"numpy 1.26.4" = [ - {url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {url = "https://files.pythonhosted.org/packages/16/ee/9df80b06680aaa23fc6c31211387e0db349e0e36d6a63ba3bd78c5acdf11/numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {url = "https://files.pythonhosted.org/packages/28/7d/4b92e2fe20b214ffca36107f1a3e75ef4c488430e64de2d9af5db3a4637d/numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {url = "https://files.pythonhosted.org/packages/3f/72/3df6c1c06fc83d9cfe381cccb4be2532bbd38bf93fbc9fad087b6687f1c0/numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {url = "https://files.pythonhosted.org/packages/43/12/01a563fc44c07095996d0129b8899daf89e4742146f7044cdbdb3101c57f/numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {url = "https://files.pythonhosted.org/packages/54/30/c2a907b9443cf42b90c17ad10c1e8fa801975f01cb9764f3f8eb8aea638b/numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, - {url = "https://files.pythonhosted.org/packages/6d/64/c3bcdf822269421d85fe0d64ba972003f9bb4aa9a419da64b86856c9961f/numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {url = "https://files.pythonhosted.org/packages/7d/24/ce71dc08f06534269f66e73c04f5709ee024a1afe92a7b6e1d73f158e1f8/numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {url = "https://files.pythonhosted.org/packages/8e/02/570545bac308b58ffb21adda0f4e220ba716fb658a63c151daecc3293350/numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {url = "https://files.pythonhosted.org/packages/ae/8c/ab03a7c25741f9ebc92684a20125fbc9fc1b8e1e700beb9197d750fdff88/numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {url = "https://files.pythonhosted.org/packages/b5/42/054082bd8220bbf6f297f982f0a8f5479fcbc55c8b511d928df07b965869/numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {url = "https://files.pythonhosted.org/packages/f4/5f/fafd8c51235f60d49f7a88e2275e13971e90555b67da52dd6416caec32fe/numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, -] -"oauthlib 3.2.2" = [ - {url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, - {url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, -] -"packaging 24.1" = [ - {url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] -"passlib 1.7.4" = [ - {url = "https://files.pythonhosted.org/packages/3b/a4/ab6b7589382ca3df236e03faa71deac88cae040af60c071a78d254a62172/passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {url = "https://files.pythonhosted.org/packages/b6/06/9da9ee59a67fae7761aab3ccc84fa4f3f33f125b370f1ccdb915bf967c11/passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] -"psycopg 3.2.1" = [ - {url = "https://files.pythonhosted.org/packages/8a/0e/0f755db36f47f96464463385552f8f132a981731356837c9a30a11ab2d35/psycopg-3.2.1-py3-none-any.whl", hash = "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175"}, - {url = "https://files.pythonhosted.org/packages/ff/8e/f176997fd790d3dce9fa0ca695391beaeee39af7ecd6d426c4c063cf6744/psycopg-3.2.1.tar.gz", hash = "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7"}, -] -"psycopg-pool 3.2.2" = [ - {url = "https://files.pythonhosted.org/packages/7f/57/9353b9ca259eaa3f0da2780eae7136948e70a8423e66b08a1115e7501860/psycopg_pool-3.2.2.tar.gz", hash = "sha256:9e22c370045f6d7f2666a5ad1b0caf345f9f1912195b0b25d0d3bcc4f3a7389c"}, - {url = "https://files.pythonhosted.org/packages/e5/0f/1cbe48737ac568e09fe03fbbcc585cdb535b5efb7709ba9b3f38a7ad7645/psycopg_pool-3.2.2-py3-none-any.whl", hash = "sha256:273081d0fbfaced4f35e69200c89cb8fbddfe277c38cc86c235b90a2ec2c8153"}, -] -"psycopg2 2.9.9" = [ - {url = "https://files.pythonhosted.org/packages/13/13/f74ffe6b6f58822e807c70391dc5679a53feb92ce119ccb8a6546c3fb893/psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, - {url = "https://files.pythonhosted.org/packages/1f/78/86b90d30c4e02e88379184ade34c2fd4883a4d3e420cc3c0f6da2b8f3a9a/psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, - {url = "https://files.pythonhosted.org/packages/2b/77/ffeb9ac356b3d99d97ca681bf0d0aa74f6d1d8c2ce0d6c4f2f34e396dbc0/psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, - {url = "https://files.pythonhosted.org/packages/37/2c/5133dd3183a3bd82371569f0dd783e6927672de7e671b278ce248810b7f7/psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, - {url = "https://files.pythonhosted.org/packages/58/4b/c4a26e191882b60150bfcb639e416524ae7f8249ab7ee854fb5247f16c40/psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, - {url = "https://files.pythonhosted.org/packages/6b/a8/5080c0e61a3b393a379ea2fa93402135c73baffcd5f08b9503e508aac116/psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, - {url = "https://files.pythonhosted.org/packages/8e/e8/c439b378efc9f2d0fd1fd5f66b03cb9ed41423f179997a935f10374f3c0d/psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, - {url = "https://files.pythonhosted.org/packages/91/2c/1fc5b9d33cd248c548ba19f2cef8e89cabaafab9858a602868a592cdc1b0/psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, - {url = "https://files.pythonhosted.org/packages/a2/14/2767d963915f957c07f5d4c3d9c5c9a407415289f5cde90b82cb3e8c2a12/psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, - {url = "https://files.pythonhosted.org/packages/bc/bc/6572dec6834e779668421e25f8812a872d978e241f85491a5e4dda606a98/psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, - {url = "https://files.pythonhosted.org/packages/be/a7/0a39176d369a8289191f3d327139cfb4923dcedcfd7105774e57996f63cd/psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, - {url = "https://files.pythonhosted.org/packages/c9/5e/dc6acaf46d78979d6b03458b7a1618a68e152a6776fce95daac5e0f0301b/psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, - {url = "https://files.pythonhosted.org/packages/f8/ec/ec73fe66d4317db006a38ebafbde02cb7e1d727ed65f5bbe54efb191d9e6/psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, -] -"pycparser 2.22" = [ - {url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, -] -"pycryptodome 3.20.0" = [ - {url = "https://files.pythonhosted.org/packages/09/12/34eb6587adcee5d676533e4c217a6385a2f4d90086198a3b1ade5dcdf684/pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, - {url = "https://files.pythonhosted.org/packages/0d/08/01987ab75ca789247a88c8b2f0ce374ef7d319e79589e0842e316a272662/pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, - {url = "https://files.pythonhosted.org/packages/17/87/c7153fcd400df0f4a67d7d92cdb6b5e43f309c22434374b8a61849dfb280/pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, - {url = "https://files.pythonhosted.org/packages/1f/90/d131c0eb643290230dfa4108b7c2d135122d88b714ad241d77beb4782a76/pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, - {url = "https://files.pythonhosted.org/packages/24/0a/9e0791833984305a8ee7cb8b1feaabffdbe1607f79f6890b38259befacc4/pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, - {url = "https://files.pythonhosted.org/packages/24/80/56a04e2ae622d7f38c1c01aef46a26c6b73a2ad15c9705a8e008b5befb03/pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, - {url = "https://files.pythonhosted.org/packages/30/4b/cbc67cda0efd55d7ddcc98374c4b9c853022a595ed1d78dd15c961bc7f6e/pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, - {url = "https://files.pythonhosted.org/packages/39/12/5fe7f5b9212dda9f5a26f842a324d6541fe1ca8059602124ff30db1e874b/pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, - {url = "https://files.pythonhosted.org/packages/42/4c/706ef0c97ef61598d6b3745cfdae57c09b10b61fd60700d69443173bd430/pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, - {url = "https://files.pythonhosted.org/packages/53/a3/1345f914963d7d668a5423dc563deafae02479bd1c69b39180724475584f/pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, - {url = "https://files.pythonhosted.org/packages/5d/c3/5530f270c4ec87953fbed203e4f1f4a2fa002bc43efdc1b3cf9ab442e741/pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, - {url = "https://files.pythonhosted.org/packages/68/31/d444cbb52f348ea89f90e2aff4804e03b42671c784719ee7c75d51db2913/pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, - {url = "https://files.pythonhosted.org/packages/68/9a/88d984405b087e8c8dd9a9d4c81a6fa675454e5fcf2ae01d9553b3128637/pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, - {url = "https://files.pythonhosted.org/packages/6a/3d/ba3905a0ae6dd4e8686dbde85c71ce38e27f5ad3587424891238ad520aaf/pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, - {url = "https://files.pythonhosted.org/packages/75/00/744661e96afcb5016c10ee821fe6ff6962f5feb020d7286d082c004a36dd/pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, - {url = "https://files.pythonhosted.org/packages/80/fc/bc18a2951ab3104caa67cae290d42d9cd230884f0d27bf0891f821636f32/pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, - {url = "https://files.pythonhosted.org/packages/8b/61/522235ca81d9dcfcf8b4cbc253b3a8a1f2231603d486369a8a02eb998f31/pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, - {url = "https://files.pythonhosted.org/packages/9a/6a/ccfc4b1c7eee616dd9b3a663a26ec1ba2a13319dd51876f64867b4ab3d27/pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, - {url = "https://files.pythonhosted.org/packages/a2/40/63dff38fa4f7888f812263494d4a745eeed180ff09dd7b8350a81eb09d21/pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, - {url = "https://files.pythonhosted.org/packages/ac/1e/d0fbf9c82e49c0e0c5ceebf4e9c3acdbdad21fe47b2a7cc5db2284140401/pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, - {url = "https://files.pythonhosted.org/packages/af/20/5f29ec45462360e7f61e8688af9fe4a0afae057edfabdada662e11bf97e7/pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, - {url = "https://files.pythonhosted.org/packages/b5/bf/798630923b67f4201059c2d690105998f20a6a8fb9b5ab68d221985155b3/pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, - {url = "https://files.pythonhosted.org/packages/b9/ed/19223a0a0186b8a91ebbdd2852865839237a21c74f1fbc4b8d5b62965239/pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, - {url = "https://files.pythonhosted.org/packages/c7/10/88fb67d2fa545ce2ac61cfda70947bcbb1769f1956315c4b919d79774897/pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, - {url = "https://files.pythonhosted.org/packages/dd/20/b4b6bd07bfb6f6826b147131dcea9fea99559077842ad7e304a7464353c5/pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, - {url = "https://files.pythonhosted.org/packages/e5/1f/6bc4beb4adc07b847e5d3fddbec4522c2c3aa05df9e61b91dc4eff6a4946/pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, - {url = "https://files.pythonhosted.org/packages/e9/a7/5aa0596f7fc710fd55b4e6bbb025fedacfec929465a618f20e61ebf7df76/pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, - {url = "https://files.pythonhosted.org/packages/ea/94/82ebfa5c83d980907ceebf79b00909a569d258bdfd9b0264d621fa752cfd/pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, - {url = "https://files.pythonhosted.org/packages/ef/50/090be8ca0ea560037bf515c5b2f27547777e2175244f168555ecccc23c54/pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, - {url = "https://files.pythonhosted.org/packages/f0/65/6cb997318100aa9f7dfc2753a611c4728a84825990645a0391859deeaa6f/pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, - {url = "https://files.pythonhosted.org/packages/fb/0b/eb6bfe34a9b7a265e103084a3cfc0dbb2a102d04a6239ce91434b03641c0/pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, - {url = "https://files.pythonhosted.org/packages/ff/96/b0d494defb3346378086848a8ece5ddfd138a66c4a05e038fca873b2518c/pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, -] -"pydantic 2.9.1" = [ - {url = "https://files.pythonhosted.org/packages/14/15/3d989541b9c8128b96d532cfd2dd10131ddcc75a807330c00feb3d42a5bd/pydantic-2.9.1.tar.gz", hash = "sha256:1363c7d975c7036df0db2b4a61f2e062fbc0aa5ab5f2772e0ffc7191a4f4bce2"}, - {url = "https://files.pythonhosted.org/packages/e4/28/fff23284071bc1ba419635c7e86561c8b9b8cf62a5bcb459b92d7625fd38/pydantic-2.9.1-py3-none-any.whl", hash = "sha256:7aff4db5fdf3cf573d4b3c30926a510a10e19a0774d38fc4967f78beb6deb612"}, -] -"pydantic-core 2.23.3" = [ - {url = "https://files.pythonhosted.org/packages/00/58/c55081fdfc1a1c26c4d90555c013bbb6193721147154b5ba3dff16c36b96/pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:50e4661f3337977740fdbfbae084ae5693e505ca2b3130a6d4eb0f2281dc43b8"}, - {url = "https://files.pythonhosted.org/packages/02/4f/7d1b8a28e4a1dd96cdde9e220627abd4d3a7860eb79cc682ccf828cf93e4/pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:87cfa0ed6b8c5bd6ae8b66de941cece179281239d482f363814d2b986b79cedc"}, - {url = "https://files.pythonhosted.org/packages/06/32/a0a7a3a318b4ae98a0e6b9e18db31fadbd3cfc46b31191e4ed4ca658e2d4/pydantic_core-2.23.3-cp310-none-win32.whl", hash = "sha256:8b5b3ed73abb147704a6e9f556d8c5cb078f8c095be4588e669d315e0d11893b"}, - {url = "https://files.pythonhosted.org/packages/0b/09/51af6a1c12830c199b7410290894ba6c723a79b8fc1760324c9f0914aa31/pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b2682038e255e94baf2c473dca914a7460069171ff5cdd4080be18ab8a7fd6e"}, - {url = "https://files.pythonhosted.org/packages/10/0e/664177152393180ca06ed393a3d4b16804d0a98ce9ccb460c1d29950ab77/pydantic_core-2.23.3-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:68f4cf373f0de6abfe599a38307f4417c1c867ca381c03df27c873a9069cda25"}, - {url = "https://files.pythonhosted.org/packages/12/ef/c16db2dc939e2686b63a1cd19e80fda55fff95b7411cc3a34ca7d7d2463e/pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b676583fc459c64146debea14ba3af54e540b61762dfc0613dc4e98c3f66eeb"}, - {url = "https://files.pythonhosted.org/packages/18/02/09c3ec4f9b270fd5af8f142b5547c396a1cb2aba6721b374f77a60e4bae4/pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2718443bc671c7ac331de4eef9b673063b10af32a0bb385019ad61dcf2cc8f6c"}, - {url = "https://files.pythonhosted.org/packages/18/0e/f8da8467a6b8a7c6b09b11b6b4c32d4a24e1472768dd20f90703e186b9a5/pydantic_core-2.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6cb968da9a0746a0cf521b2b5ef25fc5a0bee9b9a1a8214e0a1cfaea5be7e8a4"}, - {url = "https://files.pythonhosted.org/packages/18/42/0821cd46f76406e0fe57df7a89d6af8fddb22cce755bcc2db077773c7d1a/pydantic_core-2.23.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db6e6afcb95edbe6b357786684b71008499836e91f2a4a1e55b840955b341dbb"}, - {url = "https://files.pythonhosted.org/packages/1a/82/7d62c3dd4e2e101a81ac3fa138d986bfbad9727a6275fc2b4a5efb98bdbd/pydantic_core-2.23.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d965e8b325f443ed3196db890d85dfebbb09f7384486a77461347f4adb1fa7f8"}, - {url = "https://files.pythonhosted.org/packages/24/ba/9ac8744ab636c1161c598cc5e8261379b6b0f1d63c31242bf9d5ed41ed32/pydantic_core-2.23.3-cp313-none-win_amd64.whl", hash = "sha256:37ba321ac2a46100c578a92e9a6aa33afe9ec99ffa084424291d84e456f490c1"}, - {url = "https://files.pythonhosted.org/packages/24/cc/37feff1792f09dc33207fbad3897373229279d1973c211f9562abfdf137d/pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f6bd91345b5163ee7448bee201ed7dd601ca24f43f439109b0212e296eb5b423"}, - {url = "https://files.pythonhosted.org/packages/2b/51/6e1f5b06a3e70de9ac4d14d5ddf74564c2831ed403bb86808742c26d4240/pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b259fd8409ab84b4041b7b3f24dcc41e4696f180b775961ca8142b5b21d0e70"}, - {url = "https://files.pythonhosted.org/packages/35/0f/146269dba21b10d5bf86f9a7a7bbeab4ce1db06f466a1ab5ec3dec68b409/pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbdce4b47592f9e296e19ac31667daed8753c8367ebb34b9a9bd89dacaa299c9"}, - {url = "https://files.pythonhosted.org/packages/3d/d9/b565048609db77760b9a0900f6e0a3b2f33be47cd3c4a433f49653a0d2b5/pydantic_core-2.23.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc1636770a809dee2bd44dd74b89cc80eb41172bcad8af75dd0bc182c2666d4c"}, - {url = "https://files.pythonhosted.org/packages/3e/4a/6d9e8ad6c95be4af18948d400284382bc7f8b00d795f2222f3f094bc4dcb/pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6de1ec30c4bb94f3a69c9f5f2182baeda5b809f806676675e9ef6b8dc936f28"}, - {url = "https://files.pythonhosted.org/packages/3e/b4/ac069c58e3cee70c69f03693222cc173fdf740d20d53167bceafc1efc7ca/pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0a0137ddf462575d9bce863c4c95bac3493ba8e22f8c28ca94634b4a1d3e2bb4"}, - {url = "https://files.pythonhosted.org/packages/3f/e5/1ee8f68f9425728541edb9df26702f95f8243c9e42f405b2a972c64edb1b/pydantic_core-2.23.3-cp39-none-win32.whl", hash = "sha256:40d9bd259538dba2f40963286009bf7caf18b5112b19d2b55b09c14dde6db6a7"}, - {url = "https://files.pythonhosted.org/packages/41/94/8ee55c51333ed8df3a6f1e73c6530c724a9a37d326e114c9e3b24faacff9/pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:67a5def279309f2e23014b608c4150b0c2d323bd7bccd27ff07b001c12c2415c"}, - {url = "https://files.pythonhosted.org/packages/42/a1/2f262db2fd6f9c2c9904075a067b1764cc6f71c014be5c6c91d9de52c434/pydantic_core-2.23.3-cp312-none-win32.whl", hash = "sha256:255ec6dcb899c115f1e2a64bc9ebc24cc0e3ab097775755244f77360d1f3c06c"}, - {url = "https://files.pythonhosted.org/packages/43/c1/1d460d09c012ac76b68b2a1fd426ad624724f93b40e24a9a993763f12c61/pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a678c1ac5c5ec5685af0133262103defb427114e62eafeda12f1357a12140162"}, - {url = "https://files.pythonhosted.org/packages/44/d8/ca9acd7f5f044d9ff6e43d7f35aab4b1d5982b4773761eabe3317fc68e30/pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc379c73fd66606628b866f661e8785088afe2adaba78e6bbe80796baf708a63"}, - {url = "https://files.pythonhosted.org/packages/47/71/5aa475102a31edc15bb0df9a6627de64f62b11be99be49f2a4a0d2a19eea/pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94f85614f2cba13f62c3c6481716e4adeae48e1eaa7e8bac379b9d177d93947a"}, - {url = "https://files.pythonhosted.org/packages/4a/60/ef8eaad365c1d94962d158633f66313e051f7b90cead647e65a96993da22/pydantic_core-2.23.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c889fd87e1f1bbeb877c2ee56b63bb297de4636661cc9bbfcf4b34e5e925bc27"}, - {url = "https://files.pythonhosted.org/packages/4b/1f/77c720b6ca179f59c44a5698163b38be58e735974db28d761b31462da42e/pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c3980f2843de5184656aab58698011b42763ccba11c4a8c35936c8dd6c7068c"}, - {url = "https://files.pythonhosted.org/packages/4d/f0/665d4cd60147992b1da0f5a9d1fd7f309c7f12999e3a494c4898165c64ab/pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6b5547d098c76e1694ba85f05b595720d7c60d342f24d5aad32c3049131fa5c4"}, - {url = "https://files.pythonhosted.org/packages/4f/70/9a153f19394e2ef749f586273ebcdb3de97e2fa97e175b957a8e5a2a77f9/pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c24574c7e92e2c56379706b9a3f07c1e0c7f2f87a41b6ee86653100c4ce343e5"}, - {url = "https://files.pythonhosted.org/packages/4f/ff/6dc33f3b71e34ef633e35d6476d245bf303fc3eaf18a00f39bb54f78faf3/pydantic_core-2.23.3-cp311-none-win_amd64.whl", hash = "sha256:c744fa100fdea0d000d8bcddee95213d2de2e95b9c12be083370b2072333a0fa"}, - {url = "https://files.pythonhosted.org/packages/53/f8/56355d7b1cf84df63f93b1a455ebb53fd9588edbb63a44fd4d801444a060/pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbb5e45eab7624440516ee3722a3044b83fff4c0372efe183fd6ba678ff681fe"}, - {url = "https://files.pythonhosted.org/packages/55/d9/75d178e0619b09d9c675692baceaf465fdcd0416160e549d7302d2b1f581/pydantic_core-2.23.3-cp38-none-win32.whl", hash = "sha256:f4a57db8966b3a1d1a350012839c6a0099f0898c56512dfade8a1fe5fb278710"}, - {url = "https://files.pythonhosted.org/packages/57/f4/20aa352e03379a3b5d6c2fb951a979f70718138ea747e3f756d63dda69da/pydantic_core-2.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea85bda3189fb27503af4c45273735bcde3dd31c1ab17d11f37b04877859ef45"}, - {url = "https://files.pythonhosted.org/packages/5a/7d/9573f006e39cd1a7b7716d1a264e3f4f353cf0a6042c04c01c6e31666f62/pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3cf31edf405a161a0adad83246568647c54404739b614b1ff43dad2b02e6d5"}, - {url = "https://files.pythonhosted.org/packages/5c/cc/07bec3fb337ff80eacd6028745bd858b9642f61ee58cfdbfb64451c1def0/pydantic_core-2.23.3.tar.gz", hash = "sha256:3cb0f65d8b4121c1b015c60104a685feb929a29d7cf204387c7f2688c7974690"}, - {url = "https://files.pythonhosted.org/packages/5d/9a/b2c520ef627001c68cf23990b2de42ba66eae58a3f56f13375ae9aecb88d/pydantic_core-2.23.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e61328920154b6a44d98cabcb709f10e8b74276bc709c9a513a8c37a18786cc4"}, - {url = "https://files.pythonhosted.org/packages/61/09/f0fde8a9d66f37f3e08e03965a9833d71c4b5fb0287d8f625f88d79dfcd6/pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b6e5da855e9c55a0c67f4db8a492bf13d8d3316a59999cfbaf98cc6e401961"}, - {url = "https://files.pythonhosted.org/packages/61/2b/0bfe144cac991700dbeaff620fed38b0565352acb342f90374ebf1350084/pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:09e926397f392059ce0afdcac920df29d9c833256354d0c55f1584b0b70cf07e"}, - {url = "https://files.pythonhosted.org/packages/6a/43/a0ee125c96841c98d284d9ed04b48344c46e02765b9ad13bd0c5115bcb20/pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbaaf2ef20d282659093913da9d402108203f7cb5955020bd8d1ae5a2325d1c4"}, - {url = "https://files.pythonhosted.org/packages/6e/c5/7172805d806012aaff6547d2c819a98bc318313d36a9b10cd48241d85fb1/pydantic_core-2.23.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1eba2f7ce3e30ee2170410e2171867ea73dbd692433b81a93758ab2de6c64835"}, - {url = "https://files.pythonhosted.org/packages/70/8e/fd3c9eda00fbdadca726f17a0f863ecd871a65b3a381b77277ae386d3bcd/pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01491d8b4d8db9f3391d93b0df60701e644ff0894352947f31fff3e52bd5c801"}, - {url = "https://files.pythonhosted.org/packages/78/9f/387353f6b6b2ed023f973cffa4e2384bb2e52d15acf5680bc70c50f6c48f/pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b2b55b0448e9da68f56b696f313949cda1039e8ec7b5d294285335b53104b61"}, - {url = "https://files.pythonhosted.org/packages/79/62/8a7bf68bc90c305f1961f540c421500c0f75adaf9c21e5d7eb3ed2550007/pydantic_core-2.23.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03795b9e8a5d7fda05f3873efc3f59105e2dcff14231680296b87b80bb327295"}, - {url = "https://files.pythonhosted.org/packages/7a/91/b20f5646d7ef7c2629744b49e6fb86f839aa676b1aa11fb3998371ac5860/pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86fc6c762ca7ac8fbbdff80d61b2c59fb6b7d144aa46e2d54d9e1b7b0e780e01"}, - {url = "https://files.pythonhosted.org/packages/7e/a5/25200aaafd1e97e2ec3c1eb4b357669dd93911f2eba252bc60b6ba884fff/pydantic_core-2.23.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e22b477bf90db71c156f89a55bfe4d25177b81fce4aa09294d9e805eec13855"}, - {url = "https://files.pythonhosted.org/packages/80/0d/e6be39d563846de02a1a61fa942758e6d2409f5a87bb5853f65abde2470a/pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b731f25c80830c76fdb13705c68fef6a2b6dc494402987c7ea9584fe189f5d"}, - {url = "https://files.pythonhosted.org/packages/80/d1/c6f8e23987dc166976996a910876596635d71e529335b846880d856589fd/pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03667cec5daf43ac4995cefa8aaf58f99de036204a37b889c24a80927b629cec"}, - {url = "https://files.pythonhosted.org/packages/85/e6/ef09f395c974d08674464dd3d49066612fe7cc0466ef8ce9427cadf13e5b/pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f56af3a420fb1ffaf43ece3ea09c2d27c444e7c40dcb7c6e7cf57aae764f2b48"}, - {url = "https://files.pythonhosted.org/packages/88/6a/df8adefd9d1052c72ee98b8c50a5eb042cdb3f2fea1f4f58a16046bdac02/pydantic_core-2.23.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:59d52cf01854cb26c46958552a21acb10dd78a52aa34c86f284e66b209db8cab"}, - {url = "https://files.pythonhosted.org/packages/89/71/59172c61f2ecd4b33276774512ef31912944429fabaa0f4483151f788a35/pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0cb80fd5c2df4898693aa841425ea1727b1b6d2167448253077d2a49003e0ed"}, - {url = "https://files.pythonhosted.org/packages/8f/35/6d81bc4aa7d06e716f39e2bffb0eabcbcebaf7bab94c2f8278e277ded0ea/pydantic_core-2.23.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e0ec50663feedf64d21bad0809f5857bac1ce91deded203efc4a84b31b2e4305"}, - {url = "https://files.pythonhosted.org/packages/92/8c/c6f1a0f72328c5687acc0847baf806c4cb31c1a9321de70c3cbcbb37cece/pydantic_core-2.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3c09a7885dd33ee8c65266e5aa7fb7e2f23d49d8043f089989726391dd7350c5"}, - {url = "https://files.pythonhosted.org/packages/92/a1/7e628e19b78e6ffdb2c92cccbb7eca84bfd3276cee4cafcae8833452f458/pydantic_core-2.23.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d015e63b985a78a3d4ccffd3bdf22b7c20b3bbd4b8227809b3e8e75bc37f9cb2"}, - {url = "https://files.pythonhosted.org/packages/96/67/663492ab80a625d07ca4abd3178023fa79a9f6fa1df4acc3213bff371e9d/pydantic_core-2.23.3-cp39-none-win_amd64.whl", hash = "sha256:5a8cd3074a98ee70173a8633ad3c10e00dcb991ecec57263aacb4095c5efb958"}, - {url = "https://files.pythonhosted.org/packages/9a/00/a57937080b49500df790c4853d3e7bc605bd0784e4fcaf1a159456f37ef1/pydantic_core-2.23.3-cp312-none-win_amd64.whl", hash = "sha256:40b8441be16c1e940abebed83cd006ddb9e3737a279e339dbd6d31578b802f7b"}, - {url = "https://files.pythonhosted.org/packages/9c/04/e2fcad9e0e2d6c22b7047ab6d0131df0432fc93c442abe9aa39ce29478b0/pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb539d7e5dc4aac345846f290cf504d2fd3c1be26ac4e8b5e4c2b688069ff4cf"}, - {url = "https://files.pythonhosted.org/packages/a1/8d/d845077d39e55763bdb99d64ef86f8961827f8896b6e58ce08ce6b255bde/pydantic_core-2.23.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5499798317fff7f25dbef9347f4451b91ac2a4330c6669821c8202fd354c7bee"}, - {url = "https://files.pythonhosted.org/packages/a4/5e/e589474af850c77c3180b101b54bc98bf812ad09728ba2cff4989acc9734/pydantic_core-2.23.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b01a078dd4f9a52494370af21aa52964e0a96d4862ac64ff7cea06e0f12d2c5"}, - {url = "https://files.pythonhosted.org/packages/a5/1c/79d976846fcdcae0c657922d0f476ca287fa694e69ac1fc9d397b831e1cc/pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2b05e6ccbee333a8f4b8f4d7c244fdb7a979e90977ad9c51ea31261e2085ce0"}, - {url = "https://files.pythonhosted.org/packages/a7/02/7b85ae2c3452e6b9f43b89482dc2a2ba771c31d86d93c2a5a250870b243b/pydantic_core-2.23.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0dda0290a6f608504882d9f7650975b4651ff91c85673341789a476b1159f211"}, - {url = "https://files.pythonhosted.org/packages/a8/fb/fc7077473d843fd70bd1e09177c3225be95621881765d6f7d123036fb9c7/pydantic_core-2.23.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7f10a5d1b9281392f1bf507d16ac720e78285dfd635b05737c3911637601bae6"}, - {url = "https://files.pythonhosted.org/packages/a9/09/751832a0938384cf78ce0353d38ef350c9ecbf2ebd5dc7ff0b3b3a0f8bfd/pydantic_core-2.23.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb68b41c3fa64587412b104294b9cbb027509dc2f6958446c502638d481525ef"}, - {url = "https://files.pythonhosted.org/packages/ac/50/7399d536d6600d69059a87fff89861332c97a7b3471327a3663c7576e707/pydantic_core-2.23.3-cp313-none-win32.whl", hash = "sha256:76bdab0de4acb3f119c2a4bff740e0c7dc2e6de7692774620f7452ce11ca76c8"}, - {url = "https://files.pythonhosted.org/packages/ae/f3/f4381383b65cf16392aead51643fd5fb3feeb69972226d276ce5c6cfb948/pydantic_core-2.23.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:047531242f8e9c2db733599f1c612925de095e93c9cc0e599e96cf536aaf56ba"}, - {url = "https://files.pythonhosted.org/packages/b1/b4/4f7713870898f06928968ec0d44d5a1216fb0ef2b539db4a1620881a4815/pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04b07490bc2f6f2717b10c3969e1b830f5720b632f8ae2f3b8b1542394c47a8e"}, - {url = "https://files.pythonhosted.org/packages/b4/93/16f77056eeeffe094b0c3909c78a321d3a3a9bce02932982e5ebf08156c5/pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edbefe079a520c5984e30e1f1f29325054b59534729c25b874a16a5048028d16"}, - {url = "https://files.pythonhosted.org/packages/b5/7d/99d47c7084e39465781552f65889f92b1673a31c179753e476385326a3b6/pydantic_core-2.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dd9be0a42de08f4b58a3cc73a123f124f65c24698b95a54c1543065baca8cf0e"}, - {url = "https://files.pythonhosted.org/packages/b8/9c/cb69375fd9488869c4c29edf6666050ce5c88baf755926f4121aacd9f01f/pydantic_core-2.23.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:82da2f4703894134a9f000e24965df73cc103e31e8c31906cc1ee89fde72cbd8"}, - {url = "https://files.pythonhosted.org/packages/bb/17/d15fd8ce143cd1abb27be924eeff3c5c0fe3b0582f703c5a5273c11e67ce/pydantic_core-2.23.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3fc572d9b5b5cfe13f8e8a6e26271d5d13f80173724b738557a8c7f3a8a3791"}, - {url = "https://files.pythonhosted.org/packages/bd/fc/89e2a998218230ed8c38f0ba11d8f73947df90ac59a1e9f2fb4e1ba318a5/pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6470b5a1ec4d1c2e9afe928c6cb37eb33381cab99292a708b8cb9aa89e62429b"}, - {url = "https://files.pythonhosted.org/packages/be/14/07f8fa279d8c7b414c7e547f868dd1b9f8e76f248f49fb44c2312be62cb0/pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f62c1c953d7ee375df5eb2e44ad50ce2f5aff931723b398b8bc6f0ac159791a"}, - {url = "https://files.pythonhosted.org/packages/c0/2d/1f4ec8614225b516366f6c4c49d55ec42ebb93004c0bc9a3e0d21d0ed3c0/pydantic_core-2.23.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f399e8657c67313476a121a6944311fab377085ca7f490648c9af97fc732732d"}, - {url = "https://files.pythonhosted.org/packages/c8/e0/0ec00fa4fa380847f98189f7e1899366dfdeb3d87487b54622f91bcd9a68/pydantic_core-2.23.3-cp38-none-win_amd64.whl", hash = "sha256:13dd45ba2561603681a2676ca56006d6dee94493f03d5cadc055d2055615c3ea"}, - {url = "https://files.pythonhosted.org/packages/cd/43/b9a88a4e6454fcad63317e3dade687b68ae7d9f324c868411b1ea70218b3/pydantic_core-2.23.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce3317d155628301d649fe5e16a99528d5680af4ec7aa70b90b8dacd2d725c9b"}, - {url = "https://files.pythonhosted.org/packages/d1/3d/9f96bbd6212b4b0a6dc6d037e446208d3420baba2b2b81e544094b18a859/pydantic_core-2.23.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:203171e48946c3164fe7691fc349c79241ff8f28306abd4cad5f4f75ed80bc8d"}, - {url = "https://files.pythonhosted.org/packages/d2/66/15d6378783e2ede05416194848030b35cf732d84cf6cb8897aa916f628a6/pydantic_core-2.23.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:510b7fb0a86dc8f10a8bb43bd2f97beb63cffad1203071dc434dac26453955cd"}, - {url = "https://files.pythonhosted.org/packages/d7/f3/81a5f69ea1359633876ea2283728d0afe2ed62e028d91d747dcdfabc594e/pydantic_core-2.23.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9172d2088e27d9a185ea0a6c8cebe227a9139fd90295221d7d495944d2367700"}, - {url = "https://files.pythonhosted.org/packages/d9/31/a851c3191c4da40c8dc7baa529e4508d882f3a9ace610ea0fb8c1442a92c/pydantic_core-2.23.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c483dab0f14b8d3f0df0c6c18d70b21b086f74c87ab03c59250dbf6d3c89baba"}, - {url = "https://files.pythonhosted.org/packages/e0/ff/626007d5b7ac811f9bcac6d8af3a574ccee4505c1f015d25806101842f0c/pydantic_core-2.23.3-cp311-none-win32.whl", hash = "sha256:560e32f0df04ac69b3dd818f71339983f6d1f70eb99d4d1f8e9705fb6c34a5c1"}, - {url = "https://files.pythonhosted.org/packages/e1/3c/32958c0a5d1935591b58337037a1695782e61261582d93d5a7f55441f879/pydantic_core-2.23.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6daaf5b1ba1369a22c8b050b643250e3e5efc6a78366d323294aee54953a4d5f"}, - {url = "https://files.pythonhosted.org/packages/e3/31/38aebe234508fc30c80b4825661d3c1ef0d51b1c40a12e50855b108acd35/pydantic_core-2.23.3-cp310-none-win_amd64.whl", hash = "sha256:2b603cde285322758a0279995b5796d64b63060bfbe214b50a3ca23b5cee3e83"}, - {url = "https://files.pythonhosted.org/packages/e5/55/b969088e48bd8ea588548a7194d425de74370b17b385cee4d28f5a79013d/pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ccd69edcf49f0875d86942f4418a4e83eb3047f20eb897bffa62a5d419c8fa"}, - {url = "https://files.pythonhosted.org/packages/e7/52/fd89a422e922174728341b594612e9c727f5c07c55e3e436dc3dd626f52d/pydantic_core-2.23.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e89513f014c6be0d17b00a9a7c81b1c426f4eb9224b15433f3d98c1a071f8433"}, - {url = "https://files.pythonhosted.org/packages/e7/5c/2ab3689816702554ac73ea5c435030be5461180d5b18f252ea7890774227/pydantic_core-2.23.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d90e08b2727c5d01af1b5ef4121d2f0c99fbee692c762f4d9d0409c9da6541"}, - {url = "https://files.pythonhosted.org/packages/f0/67/13fa22d7b09395e83721edc31bae2bd5c5e2c36a09d470c18f5d1de46958/pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fcf31facf2796a2d3b7fe338fe8640aa0166e4e55b4cb108dbfd1058049bf4cb"}, - {url = "https://files.pythonhosted.org/packages/f1/b9/e5482ac4ea2d128925759d905fb05a08ca98e67ed1d8ab7401861997c6c8/pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7f7f72f721223f33d3dc98a791666ebc6a91fa023ce63733709f4894a7dc611"}, - {url = "https://files.pythonhosted.org/packages/f7/49/0233bae5778a5526cef000447a93e8d462f4f13e2214c13c5b23d379cb25/pydantic_core-2.23.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:748bdf985014c6dd3e1e4cc3db90f1c3ecc7246ff5a3cd4ddab20c768b2f1dab"}, - {url = "https://files.pythonhosted.org/packages/f8/ae/5b62d4989323f5c8f1aa265035d6f3b348a20b79f6e4e8a5f2e13da17e31/pydantic_core-2.23.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e6f33503c5495059148cc486867e1d24ca35df5fc064686e631e314d959ad5b"}, - {url = "https://files.pythonhosted.org/packages/fa/1b/1d689c53d15ab67cb0df1c3a2b1df873b50409581e93e4848289dce57e2f/pydantic_core-2.23.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7200fd561fb3be06827340da066df4311d0b6b8eb0c2116a110be5245dceb326"}, - {url = "https://files.pythonhosted.org/packages/fc/19/88cf661dd393be8f7a2c9823e33a2ed904b1aad29135cc6754e5fd958375/pydantic_core-2.23.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d063c6b9fed7d992bcbebfc9133f4c24b7a7f215d6b102f3e082b1117cddb72c"}, - {url = "https://files.pythonhosted.org/packages/fd/89/cdd76ae363cabae23a4b70df50d603c81c517415ff9d5d65e72e35251cf6/pydantic_core-2.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c409ce1c219c091e47cb03feb3c4ed8c2b8e004efc940da0166aaee8f9d6c8"}, -] -"pydantic-settings 2.4.0" = [ - {url = "https://files.pythonhosted.org/packages/58/14/7bfb313ccee79f97dc235721b035174af94ef4472cfe455c259cd2971f2f/pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, - {url = "https://files.pythonhosted.org/packages/93/46/7f90f36c1bdcf24962d2b7b0e11aba3bbd65ea7904cb2553072882a4e6b7/pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, -] -"pyjwt 2.9.0" = [ - {url = "https://files.pythonhosted.org/packages/79/84/0fdf9b18ba31d69877bd39c9cd6052b47f3761e9910c15de788e519f079f/PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {url = "https://files.pythonhosted.org/packages/fb/68/ce067f09fca4abeca8771fe667d89cc347d1e99da3e093112ac329c6020e/pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, -] -"pyodm 1.5.11" = [ - {url = "https://files.pythonhosted.org/packages/41/d8/186ee7b2a95f7b8e50f2068e152f5b3a58d838fea90eabde0785c79f32c5/pyodm-1.5.11-py3-none-any.whl", hash = "sha256:c0b9a4358db12f2a84a4d13533b9a3ea4c63419d6518420ba7a2ab32842294b8"}, - {url = "https://files.pythonhosted.org/packages/52/99/53e514b55916ef91c2b6f8f611c0e03465caa9e5a17c742056b543f0c8ee/pyodm-1.5.11.tar.gz", hash = "sha256:bb97710171bfaee92e145bd97b1ac77db8beef580b89d6585a622ff6fb424c53"}, -] -"pyproj 3.6.1" = [ - {url = "https://files.pythonhosted.org/packages/0b/64/93232511a7906a492b1b7dfdfc17f4e95982d76a24ef4f86d18cfe7ae2c9/pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746"}, - {url = "https://files.pythonhosted.org/packages/0e/ab/1c2159ec757677c5a6b8803f6be45c2b550dc42c84ec4a228dc219849bbb/pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb"}, - {url = "https://files.pythonhosted.org/packages/10/f2/b550b1f65cc7e51c9116b220b50aade60c439103432a3fd5b12efbc77e15/pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8"}, - {url = "https://files.pythonhosted.org/packages/14/6d/ae373629a1723f0db80d7b8c93598b00d9ecb930ed9ebf4f35826a33e97c/pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132"}, - {url = "https://files.pythonhosted.org/packages/18/86/2e7cb9de40492f1bafbf11f4c9072edc394509a40b5e4c52f8139546f039/pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe"}, - {url = "https://files.pythonhosted.org/packages/19/9b/c57569132174786aa3f72275ac306956859a639dad0ce8d95c8411ce8209/pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d"}, - {url = "https://files.pythonhosted.org/packages/2c/c2/8d4f61065dfed965e53badd41201ad86a05af0c1bbc75dffb12ef0f5a7dd/pyproj-3.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18faa54a3ca475bfe6255156f2f2874e9a1c8917b0004eee9f664b86ccc513d3"}, - {url = "https://files.pythonhosted.org/packages/30/bd/b9bd3761f08754e8dbb34c5a647db2099b348ab5da338e90980caf280e37/pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a"}, - {url = "https://files.pythonhosted.org/packages/31/38/2cf8777cb2d5622a78195e690281b7029098795fde4751aec8128238b8bb/pyproj-3.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd43bd9a9b9239805f406fd82ba6b106bf4838d9ef37c167d3ed70383943ade1"}, - {url = "https://files.pythonhosted.org/packages/43/28/e8d2ca71dd56c27cbe668e4226963d61956cded222a2e839e6fec1ab6d82/pyproj-3.6.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd93c1a0c6c4aedc77c0fe275a9f2aba4d59b8acf88cebfc19fe3c430cfabf4f"}, - {url = "https://files.pythonhosted.org/packages/43/d0/cbe29a4dcf38ee7e72bf695d0d3f2bee21b4f22ee6cf579ad974de9edfc8/pyproj-3.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:36b64c2cb6ea1cc091f329c5bd34f9c01bb5da8c8e4492c709bda6a09f96808f"}, - {url = "https://files.pythonhosted.org/packages/5e/c5/928d5a26995dbefbebd7507d982141cd9153bc7e4392b334fff722c4af12/pyproj-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5279586013b8d6582e22b6f9e30c49796966770389a9d5b85e25a4223286cd3f"}, - {url = "https://files.pythonhosted.org/packages/64/90/dfe5c00de1ca4dbb82606e79790659d4ed7f0ed8d372bccb3baca2a5abe0/pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915"}, - {url = "https://files.pythonhosted.org/packages/79/95/eb68113c5b5737c342bde1bab92705dabe69c16299c5a122616e50f1fbd6/pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2"}, - {url = "https://files.pythonhosted.org/packages/7d/84/2b39bbf888c753ea48b40d47511548c77aa03445465c35cc4c4e9649b643/pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf"}, - {url = "https://files.pythonhosted.org/packages/84/a6/a300c1b14b2112e966e9f90b18f9c13b586bdcf417207cee913ae9005da3/pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882"}, - {url = "https://files.pythonhosted.org/packages/89/8f/27350c8fba71a37cd0d316f100fbd96bf139cc2b5ff1ab0dcbc7ac64010a/pyproj-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:db3aedd458e7f7f21d8176f0a1d924f1ae06d725228302b872885a1c34f3119e"}, - {url = "https://files.pythonhosted.org/packages/8d/e8/e826e0a962f36bd925a933829cf6ef218efe2055db5ea292be40974a929d/pyproj-3.6.1-cp39-cp39-win32.whl", hash = "sha256:9274880263256f6292ff644ca92c46d96aa7e57a75c6df3f11d636ce845a1877"}, - {url = "https://files.pythonhosted.org/packages/97/0a/b1525be9680369cc06dd288e12c59d24d5798b4afcdcf1b0915836e1caa6/pyproj-3.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50100b2726a3ca946906cbaa789dd0749f213abf0cbb877e6de72ca7aa50e1ae"}, - {url = "https://files.pythonhosted.org/packages/c5/32/63cf474f4a8d4804b3bdf7c16b8589f38142e8e2f8319dcea27e0bc21a87/pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4"}, - {url = "https://files.pythonhosted.org/packages/c7/f3/2f32fe143cd7ba1d4d68f1b6dce9ca402d909cbd5a5830e3a8fa3d1acbbf/pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0"}, - {url = "https://files.pythonhosted.org/packages/cb/39/1ce27cb86f51a1f5aed3a1617802a6131b59ea78492141d1fbe36722595e/pyproj-3.6.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6420ea8e7d2a88cb148b124429fba8cd2e0fae700a2d96eab7083c0928a85110"}, - {url = "https://files.pythonhosted.org/packages/d7/50/d369bbe62d7a0d1e2cb40bc211da86a3f6e0f3c99f872957a72c3d5492d6/pyproj-3.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ba1f9b03d04d8cab24d6375609070580a26ce76eaed54631f03bab00a9c737b"}, - {url = "https://files.pythonhosted.org/packages/d9/a8/7193f46032636be917bc775506ae987aad72c931b1f691b775ca812a2917/pyproj-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c41e80ddee130450dcb8829af7118f1ab69eaf8169c4bf0ee8d52b72f098dc2f"}, - {url = "https://files.pythonhosted.org/packages/f4/0a/d82aeeb605b5d6870bc72307c3b5e044e632eb7720df8885e144f51a8eac/pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85"}, - {url = "https://files.pythonhosted.org/packages/f6/2b/b60cf73b0720abca313bfffef34e34f7f7dae23852b2853cf0368d49426b/pyproj-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fafd1f3eb421694857f254a9bdbacd1eb22fc6c24ca74b136679f376f97d35"}, - {url = "https://files.pythonhosted.org/packages/fe/4b/2f8f6f94643b9fe2083338eff294feda84d916409b5840b7a402d2be93f8/pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf"}, -] -"python-dotenv 1.0.1" = [ - {url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, - {url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, -] -"python-multipart 0.0.9" = [ - {url = "https://files.pythonhosted.org/packages/3d/47/444768600d9e0ebc82f8e347775d24aef8f6348cf00e9fa0e81910814e6d/python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, - {url = "https://files.pythonhosted.org/packages/5c/0f/9c55ac6c84c0336e22a26fa84ca6c51d58d7ac3a2d78b0dfa8748826c883/python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, -] -"python-slugify 8.0.4" = [ - {url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, - {url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, -] -"requests 2.32.3" = [ - {url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, - {url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, -] -"requests-oauthlib 2.0.0" = [ - {url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, - {url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, -] -"requests-toolbelt 1.0.0" = [ - {url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, - {url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, -] -"shapely 2.0.5" = [ - {url = "https://files.pythonhosted.org/packages/04/df/8062f14cb7aa502b8bda358103facedc80b87eec41e3391182655ff40615/shapely-2.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:03bd7b5fa5deb44795cc0a503999d10ae9d8a22df54ae8d4a4cd2e8a93466195"}, - {url = "https://files.pythonhosted.org/packages/13/56/11150c625bc984e9395913a255f52cf6c7de85b98396339cee66119481d4/shapely-2.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8af6f7260f809c0862741ad08b1b89cb60c130ae30efab62320bbf4ee9cc71fa"}, - {url = "https://files.pythonhosted.org/packages/29/3d/0d3ab80860cda6afbce9736fa1f091f452092d344fdd4e3c65e5fe7b1111/shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec"}, - {url = "https://files.pythonhosted.org/packages/36/cc/3f39afc4b83166641e041e6ab526969214b420468c49a71ea03895739ecb/shapely-2.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c83a36f12ec8dee2066946d98d4d841ab6512a6ed7eb742e026a64854019b5f"}, - {url = "https://files.pythonhosted.org/packages/4b/37/c25a8e47a945b6d22093cd376d695ef82813a06742d5d0f3626d76dcc70f/shapely-2.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5456dd522800306ba3faef77c5ba847ec30a0bd73ab087a25e0acdd4db2514f"}, - {url = "https://files.pythonhosted.org/packages/4b/ad/8a9fe3b987058ff4f4ba8a7d7d19894f9952add4b1ba7649597cbba715d6/shapely-2.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:798090b426142df2c5258779c1d8d5734ec6942f778dab6c6c30cfe7f3bf64ff"}, - {url = "https://files.pythonhosted.org/packages/57/d7/69f4ec187b68e4d0e0bf5b0505ad19a9a69a330d21da8a2b5b38235c3c40/shapely-2.0.5-cp37-cp37m-win32.whl", hash = "sha256:b5870633f8e684bf6d1ae4df527ddcb6f3895f7b12bced5c13266ac04f47d231"}, - {url = "https://files.pythonhosted.org/packages/59/13/d0eff813ee57d73ddfc9aca7afeb30a714723a50f068f3839375bfbfc091/shapely-2.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:7fed9dbfbcfec2682d9a047b9699db8dcc890dfca857ecba872c42185fc9e64e"}, - {url = "https://files.pythonhosted.org/packages/5c/99/735944b99e32d3103f8c0880925a3fcfe8b04cfff61ad70fe1aac8c22120/shapely-2.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b714a840402cde66fd7b663bb08cacb7211fa4412ea2a209688f671e0d0631fd"}, - {url = "https://files.pythonhosted.org/packages/5d/e7/719f384857c39aa51aa19d09d7cac84aeab1b25a7d0dab62433bf7b419e9/shapely-2.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ff9521991ed9e201c2e923da014e766c1aa04771bc93e6fe97c27dcf0d40ace"}, - {url = "https://files.pythonhosted.org/packages/5e/87/f1bb954978de7c1dcf575b7710141b9fe07ffbb1b963ea9a96c1a4ef0b7b/shapely-2.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e91ee179af539100eb520281ba5394919067c6b51824e6ab132ad4b3b3e76dd0"}, - {url = "https://files.pythonhosted.org/packages/70/a5/6d171586eb850c7582d2aeab027e1027ace4eb3a6c2e5f05746b8ab039e0/shapely-2.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:1e5cb5ee72f1bc7ace737c9ecd30dc174a5295fae412972d3879bac2e82c8fae"}, - {url = "https://files.pythonhosted.org/packages/71/89/bca9176ef4d7cee06c35163d2d973a01fb28d67a51af485dc6b0a39adb86/shapely-2.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06efe39beafde3a18a21dde169d32f315c57da962826a6d7d22630025200c5e6"}, - {url = "https://files.pythonhosted.org/packages/73/d4/b5ab353c3bf5b3a3f58fe204e1144183ff832932d4bbc37b5a0330ae77a7/shapely-2.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:401cb794c5067598f50518e5a997e270cd7642c4992645479b915c503866abed"}, - {url = "https://files.pythonhosted.org/packages/76/04/111f8d42ad50fb60b2fa725c64a6988d2a49ea513c4feb4e02f93dc353bd/shapely-2.0.5-cp311-cp311-win32.whl", hash = "sha256:35110e80070d664781ec7955c7de557456b25727a0257b354830abb759bf8311"}, - {url = "https://files.pythonhosted.org/packages/79/bb/965b1dba79a63912f5a9deb183bab4f725d5c2e39c5ede1b36041b9547e8/shapely-2.0.5-cp310-cp310-win32.whl", hash = "sha256:9a4492a2b2ccbeaebf181e7310d2dfff4fdd505aef59d6cb0f217607cb042fb3"}, - {url = "https://files.pythonhosted.org/packages/7e/4e/4e83b9f3d7f0ce523c92bdf3dfe0292738d8ad2b589971390d6205bc843e/shapely-2.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8e71bb9a46814019f6644c4e2560a09d44b80100e46e371578f35eaaa9da1c"}, - {url = "https://files.pythonhosted.org/packages/80/68/6b51b7587547f6bbd0965cf957505a0ebec93510e840572a983003b3a0a9/shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8"}, - {url = "https://files.pythonhosted.org/packages/80/75/73137095dbb8e35bf34e6d36edf5059f67ec65fcb6ef836b994fd54f3cf5/shapely-2.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7545a39c55cad1562be302d74c74586f79e07b592df8ada56b79a209731c0219"}, - {url = "https://files.pythonhosted.org/packages/83/94/bd391727c29dd014d4a24b92c54717de202e2aa6a0d9b5e9320215b11683/shapely-2.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45211276900c4790d6bfc6105cbf1030742da67594ea4161a9ce6812a6721e68"}, - {url = "https://files.pythonhosted.org/packages/a0/b6/8cbd3674fdbd235ef9b82e055b884034ae9526a26a119dd4b7636303cd39/shapely-2.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e119444bc27ca33e786772b81760f2028d930ac55dafe9bc50ef538b794a8e1"}, - {url = "https://files.pythonhosted.org/packages/a4/77/c05e794a65263deb020d7e25623234975dd96881f9e8cde341810ca683e7/shapely-2.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b65365cfbf657604e50d15161ffcc68de5cdb22a601bbf7823540ab4918a98d"}, - {url = "https://files.pythonhosted.org/packages/a6/60/a2c3b436d794d923a6d8e045690860f894e5671277044f271dc5c5f19ceb/shapely-2.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:4461509afdb15051e73ab178fae79974387f39c47ab635a7330d7fee02c68a3f"}, - {url = "https://files.pythonhosted.org/packages/ad/99/c47247f4d688bbb5346df5ff1de5d9792b6d95cbbb2fd7b71f45901c1878/shapely-2.0.5.tar.gz", hash = "sha256:bff2366bc786bfa6cb353d6b47d0443c570c32776612e527ee47b6df63fcfe32"}, - {url = "https://files.pythonhosted.org/packages/c6/ca/f914baceedbf0f5f78b2356e3382ffb8846ddf9cd90e6ec1ed035b35a901/shapely-2.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89e640c2cd37378480caf2eeda9a51be64201f01f786d127e78eaeff091ec897"}, - {url = "https://files.pythonhosted.org/packages/d4/c3/e98e3eb9f06def32b8e2454ab718cafb99149f023dff023e257125132d6e/shapely-2.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:30e8737983c9d954cd17feb49eb169f02f1da49e24e5171122cf2c2b62d65c95"}, - {url = "https://files.pythonhosted.org/packages/e1/7a/06aafb341a411c594d3f8f2733f2f644814facf0e6e947a829840f562d36/shapely-2.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89d34787c44f77a7d37d55ae821f3a784fa33592b9d217a45053a93ade899375"}, - {url = "https://files.pythonhosted.org/packages/e2/44/da3de2d85ad45462564245fd3eb98bb1744d69d834baa1feebb2d6329d66/shapely-2.0.5-cp39-cp39-win32.whl", hash = "sha256:8203a8b2d44dcb366becbc8c3d553670320e4acf0616c39e218c9561dd738d92"}, - {url = "https://files.pythonhosted.org/packages/e8/5e/9203579b42060669eaa0715bc2b1e722fd5fe90a8e427851667e905812d7/shapely-2.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b299b91557b04acb75e9732645428470825061f871a2edc36b9417d66c1fc5"}, - {url = "https://files.pythonhosted.org/packages/ec/1b/092fff53cbeced411eed2717592e31cadd3e52f0ebaba5f2df3f34913f96/shapely-2.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9"}, - {url = "https://files.pythonhosted.org/packages/ed/a8/c8b0f1a165e161247caf0fc265d61de3c4ea27d7c313c7ebfb1c4f6ddea4/shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760"}, - {url = "https://files.pythonhosted.org/packages/f0/32/b7687654b6e747ceae8f9fa4cc7489a8ebf275c64caf811f949d87e89f5d/shapely-2.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21f64e647a025b61b19585d2247137b3a38a35314ea68c66aaf507a1c03ef6fe"}, - {url = "https://files.pythonhosted.org/packages/f8/2b/b25546f075c3b8f9b8dfdb9408cf418a80e8dab759e560cc810189487ff2/shapely-2.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ff7731fea5face9ec08a861ed351734a79475631b7540ceb0b66fb9732a5f529"}, - {url = "https://files.pythonhosted.org/packages/f9/9c/5b68b3cd484065c7d33d83168d2ecfebfeeaa6d88bc9cfd830de2df490ac/shapely-2.0.5-cp312-cp312-win32.whl", hash = "sha256:3ac7dc1350700c139c956b03d9c3df49a5b34aaf91d024d1510a09717ea39199"}, - {url = "https://files.pythonhosted.org/packages/fb/cb/ce0f406565b230674f7ca56d17b87546b34bf490aa56093ad2063b6205e1/shapely-2.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff9e520af0c5a578e174bca3c18713cd47a6c6a15b6cf1f50ac17dc8bb8db6a2"}, - {url = "https://files.pythonhosted.org/packages/fe/87/9f01fb8cf71f1b33a73023dbb0e73500dfc30f483973b24a1c9ac7aeccda/shapely-2.0.5-cp38-cp38-win32.whl", hash = "sha256:7e8cf5c252fac1ea51b3162be2ec3faddedc82c256a1160fc0e8ddbec81b06d2"}, -] -"sniffio 1.3.1" = [ - {url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, - {url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, -] -"sqlalchemy 2.0.23" = [ - {url = "https://files.pythonhosted.org/packages/12/61/ee1619cea002a94e954c353c2e93a4da85cb1106a24a7c66d5794301e84e/SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, - {url = "https://files.pythonhosted.org/packages/17/60/8cfa64fe57a8e9a5cca61027519e7fb44b0e9124a9cb0509708f30d38cc1/SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, - {url = "https://files.pythonhosted.org/packages/1d/40/9c7169cb4dc66c0a2d4cf5ff016faab417d30a1d2deea57780b329dd4fe5/SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, - {url = "https://files.pythonhosted.org/packages/29/b2/70b88e4e6dac15dd2f380e18b7c2144b4334ac1587d6a7cc031297fac96c/SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, - {url = "https://files.pythonhosted.org/packages/2c/a4/f1978e5a12cbe7aa7043d2094b0d793287307e36e0bc351daea8b8cfa376/SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, - {url = "https://files.pythonhosted.org/packages/2d/ca/1ad0106300c9cbd14e2b88bffe9f52f03ce2abe48f3b88747e520180014e/SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, - {url = "https://files.pythonhosted.org/packages/2f/4e/cbbb63dc6eb55138311a949ab4221e69a0aff8d95bf294fd948727392a14/SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, - {url = "https://files.pythonhosted.org/packages/35/63/0ee6deb8409e6159ad7fccf89c9f36040666f63887f4147d716ae5b97d06/SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, - {url = "https://files.pythonhosted.org/packages/36/29/15a839fa2faf9d588afd7d0ea4ed9c323232bc682dbb683daaca3fbec0f6/SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, - {url = "https://files.pythonhosted.org/packages/36/70/202467dc568aa211d234acedab908ca4e09dfbb6b8eedc91217c2e9208ac/SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, - {url = "https://files.pythonhosted.org/packages/39/7f/3030a3af7f96434fd756ae31a586b23fdd0a07df0ec4a648336ade7edde3/SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, - {url = "https://files.pythonhosted.org/packages/3c/eb/66fc0910c7ca5617b7c042bb4bc345226ad015ce5fc6543f453bffb6e47b/SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, - {url = "https://files.pythonhosted.org/packages/4d/e0/d9551da0fc8c01c5a8342b7b30a7552329abf7a2a4a60411dd004e4b4501/SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, - {url = "https://files.pythonhosted.org/packages/53/30/339fd68c0200a8f70d9198ca250c2ba0e4683ba11ba42423f300a041dfc9/SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, - {url = "https://files.pythonhosted.org/packages/53/ce/d7262dcc228f66c4d805c8975f71deca581e8a56b46612eb35708ec5cb51/SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, - {url = "https://files.pythonhosted.org/packages/55/b6/928ed9857b9974d40741bc1cd07f569f38904d13a5fa61fc782f3245e130/SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, - {url = "https://files.pythonhosted.org/packages/5a/e4/f8b9828117adb533891c4d6872a6f1a047b6049faf44db6a3c502e88acd7/SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, - {url = "https://files.pythonhosted.org/packages/5c/1c/6de9e2c94b61a666cf05143a66b35f4608c066175573a81acd42f96fadcc/SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, - {url = "https://files.pythonhosted.org/packages/5c/b2/4914a76c35952d899dc5f4385c55fab15b718e9aff68c8104a8d193c23bd/SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, - {url = "https://files.pythonhosted.org/packages/5c/e4/f2b196d8779c09c32337ff1e17d6edd57547fe674413b3a82e42a370a65c/SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, - {url = "https://files.pythonhosted.org/packages/5c/e7/d363abf1882ef31e780821b27bda4750d31fd46149da6b3741e99b23f873/SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, - {url = "https://files.pythonhosted.org/packages/5e/fb/3cd382bdd402154832b2142d93b0ddedcfa4c6ecb8120690e11e5086de33/SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, - {url = "https://files.pythonhosted.org/packages/62/20/3a0cbfbb17b311c6323769c09ec559a2324e09871a2f66d6040bec930031/SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, - {url = "https://files.pythonhosted.org/packages/62/7f/0155fe62b6054c0642bcf187088d9faaa66c1d057ee2c0038a2a673ca2ae/SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, - {url = "https://files.pythonhosted.org/packages/67/e7/7c77fd5290646f929b499992607cf1bc940573098a593080fcc8f7e13a08/SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, - {url = "https://files.pythonhosted.org/packages/7c/1f/d34a789e188c754560f54893f9a559c432af3b3ef6d9401d406f10d6c1ab/SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, - {url = "https://files.pythonhosted.org/packages/90/00/f588b08bb2ce214df96e7a045ddf9ffafab6bfac75e6c75f0a50fb9f8d2a/SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, - {url = "https://files.pythonhosted.org/packages/90/63/981fb1f20f1705e0bd31153a68d0fdf59a3ae6e41baa8b410a9f0d5aa901/SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, - {url = "https://files.pythonhosted.org/packages/97/9b/bb6a4c80c2e62719330fcdb57f024329fb2a2ce17664ddabcc74d2cda812/SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, - {url = "https://files.pythonhosted.org/packages/9b/41/e92e465f91aeeea7974a77549edc6736544cf881448ddb4b133903d008fe/SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, - {url = "https://files.pythonhosted.org/packages/9c/af/c61d98f6c21f35b13f22259e38b47669afe960a348e2c01ce262f183dcbe/SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, - {url = "https://files.pythonhosted.org/packages/a4/90/9bc93131211b628e4339700713647aeecbc194e66ac6de869711c631b0cd/SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, - {url = "https://files.pythonhosted.org/packages/a6/da/49d4f9cd352259fa29c5110b78458c5046058b4fe27caf8644ebf11d8df7/SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, - {url = "https://files.pythonhosted.org/packages/a9/a3/9afc2bf14c5892640c15d050bd9c9bfefead29cb041560734dff13bf0890/SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, - {url = "https://files.pythonhosted.org/packages/aa/1c/0b66318368b1c9ef51c5c8560530b8ef842164e10eea08cacb06739388e0/SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, - {url = "https://files.pythonhosted.org/packages/ac/40/efe4320de1de9af3b6e538f89e2f1d56f83209fddbec77bafa06ee4f42c6/SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, - {url = "https://files.pythonhosted.org/packages/b7/a8/4495f521f8ac6bde513436867755788c9efe632cb2a2e9d5add880e889bb/SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, - {url = "https://files.pythonhosted.org/packages/be/67/7c054e93e1cca2d04ed69548ebf21134ace9c74efd008f936aa371a001be/SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, - {url = "https://files.pythonhosted.org/packages/c3/3c/a79b9541de3eb2efeaa785b2f11acbcf6e16cc118c2791aa27ed23a448f8/SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, - {url = "https://files.pythonhosted.org/packages/c3/b4/93e0a6743ae3657ce3681d5f19ba5b9cde918f3489f47818d60615320abc/SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, - {url = "https://files.pythonhosted.org/packages/c7/55/d1d2ad054fb7e9188681d56df40ed81c2c198314a805b180b0ec99019da1/SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, - {url = "https://files.pythonhosted.org/packages/d0/35/baf485da71f15b37d8d8e926d471490ed7b9c0ce1bd82da58f7d46509107/SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, - {url = "https://files.pythonhosted.org/packages/d3/8a/321205f6ab88307618650f916f7c04f51864cd716c9583a25230ace70dc3/SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, - {url = "https://files.pythonhosted.org/packages/da/9b/ba3591423ad1d62f0f98132040aba67ae460073ecbfa956df63014f89580/SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, - {url = "https://files.pythonhosted.org/packages/e0/32/6e168c00cd90037d37d6ce238fc2b18ea6c9591d1ca42a7cfdce8139675b/SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, - {url = "https://files.pythonhosted.org/packages/e7/25/cfcc50c21cb133ae44f9aba61b48285451b6ecb882af291fe9da6445f4da/SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, - {url = "https://files.pythonhosted.org/packages/ed/9b/002a02bae5b464d557197e5a241bdc5d88d1aa6ef9373841fee61019243d/SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, - {url = "https://files.pythonhosted.org/packages/ee/46/a3196db7ffd2609c7935798730e21bed8806d9bf4401921587dac4be0747/SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, - {url = "https://files.pythonhosted.org/packages/f2/e0/fa52d06ed2ad85d6f3c61133559c7bc174e7dc6d3987a633ae9bbbd716bc/SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, -] -"starlette 0.37.2" = [ - {url = "https://files.pythonhosted.org/packages/61/b5/6bceb93ff20bd7ca36e6f7c540581abb18f53130fabb30ba526e26fd819b/starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, - {url = "https://files.pythonhosted.org/packages/fd/18/31fa32ed6c68ba66220204ef0be798c349d0a20c1901f9d4a794e08c76d8/starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, -] -"text-unidecode 1.3" = [ - {url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, - {url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, -] -"typing-extensions 4.12.2" = [ - {url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, -] -"tzdata 2024.1" = [ - {url = "https://files.pythonhosted.org/packages/65/58/f9c9e6be752e9fcb8b6a0ee9fb87e6e7a1f6bcab2cdc73f02bb7ba91ada0/tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {url = "https://files.pythonhosted.org/packages/74/5b/e025d02cb3b66b7b76093404392d4b44343c69101cc85f4d180dd5784717/tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, -] -"urllib3 2.2.2" = [ - {url = "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, - {url = "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, -] -"uvicorn 0.30.5" = [ - {url = "https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835"}, - {url = "https://files.pythonhosted.org/packages/c3/ad/02b1b412e43605aa6aac8d0392c383ff3f6ae8267b7864e48e3b5f3f601e/uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee"}, -] -"win32-setctime 1.1.0" = [ - {url = "https://files.pythonhosted.org/packages/0a/e6/a7d828fef907843b2a5773ebff47fb79ac0c1c88d60c0ca9530ee941e248/win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {url = "https://files.pythonhosted.org/packages/6b/dd/f95a13d2b235a28d613ba23ebad55191514550debb968b46aab99f2e3a30/win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] diff --git a/src/backend/pyproject.toml b/src/backend/pyproject.toml index 518303c3..1e5fe4ec 100644 --- a/src/backend/pyproject.toml +++ b/src/backend/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "drone-flightplan==0.3.1rc4", "psycopg2>=2.9.9", "pyodm>=1.5.11", + "asgiref>=3.8.1", ] requires-python = ">=3.11" license = {text = "GPL-3.0-only"} From d2a9a6f02dbc33e2c4ff6da3172d82016f49b419 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 9 Oct 2024 13:12:46 +0545 Subject: [PATCH 086/113] feat(project-description): increase opacity of task completed tasks fill color --- .../src/components/IndividualProject/MapSection/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/IndividualProject/MapSection/index.tsx b/src/frontend/src/components/IndividualProject/MapSection/index.tsx index de5a285b..76ccfaf0 100644 --- a/src/frontend/src/components/IndividualProject/MapSection/index.tsx +++ b/src/frontend/src/components/IndividualProject/MapSection/index.tsx @@ -277,7 +277,7 @@ const MapSection = ({ projectData }: { projectData: Record }) => { paint: { 'fill-color': '#ACD2C4', 'fill-outline-color': '#484848', - 'fill-opacity': 0.5, + 'fill-opacity': 0.7, }, } : { From dc612ee92198a03e3136c4260519a550189e541e Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 9 Oct 2024 13:32:07 +0545 Subject: [PATCH 087/113] fix: completed task status count --- src/backend/app/projects/project_schemas.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 3ca6575f..9658fdda 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -513,12 +513,13 @@ def calculate_status(cls, values): """Set the project status based on task counts.""" ongoing_task_count = values.ongoing_task_count completed_task_count = values.completed_task_count + total_task_count = values.total_task_count if ongoing_task_count == 0: values.status = "not-started" elif ongoing_task_count > 0 and ongoing_task_count != completed_task_count: values.status = "ongoing" - elif ongoing_task_count == completed_task_count: + elif ongoing_task_count == total_task_count: values.status = "completed" return values From f57bdc9dcc2b714a8bc448cd01952e0fbbfda3ef Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 9 Oct 2024 13:41:29 +0545 Subject: [PATCH 088/113] fix: update ongoing_task_count to count tasks in specific states of projects --- src/backend/app/projects/project_schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index bc511e79..b8a5431a 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -341,7 +341,7 @@ async def all( COUNT(t.id) AS total_task_count, -- Count based on the latest state of tasks - COUNT(CASE WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 1 END) AS ongoing_task_count, + COUNT(CASE WHEN te.state IN ('LOCKED_FOR_MAPPING', 'REQUEST_FOR_MAPPING', 'IMAGE_UPLOADED', 'UNFLYABLE_TASK') THEN 1 END) AS ongoing_task_count, -- Count based on the latest state of tasks COUNT(CASE WHEN te.state = 'IMAGE_PROCESSED' THEN 1 END) AS completed_task_count From 8a7ce11d9cdaee6d675f9911630ae39196cc43fc Mon Sep 17 00:00:00 2001 From: Pradip-p Date: Wed, 9 Oct 2024 14:44:57 +0545 Subject: [PATCH 089/113] fix: optimize project status calculation logic & update ongoing status count. --- src/backend/app/projects/project_schemas.py | 8 ++++---- src/backend/app/tasks/task_routes.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index b8a5431a..083d2b20 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -549,12 +549,12 @@ def calculate_status(cls, values): completed_task_count = values.completed_task_count total_task_count = values.total_task_count - if ongoing_task_count == 0: + if completed_task_count == 0 and ongoing_task_count == 0: values.status = "not-started" - elif ongoing_task_count > 0 and ongoing_task_count != completed_task_count: - values.status = "ongoing" - elif ongoing_task_count == total_task_count: + elif completed_task_count == total_task_count: values.status = "completed" + else: + values.status = "ongoing" return values diff --git a/src/backend/app/tasks/task_routes.py b/src/backend/app/tasks/task_routes.py index 32f267a7..0839ab08 100644 --- a/src/backend/app/tasks/task_routes.py +++ b/src/backend/app/tasks/task_routes.py @@ -96,7 +96,7 @@ async def get_task_stats( raw_sql = """ SELECT COUNT(CASE WHEN te.state = 'REQUEST_FOR_MAPPING' THEN 1 END) AS request_logs, - COUNT(CASE WHEN te.state = 'LOCKED_FOR_MAPPING' THEN 1 END) AS ongoing_tasks, + COUNT(CASE WHEN te.state IN ('LOCKED_FOR_MAPPING', 'REQUEST_FOR_MAPPING', 'IMAGE_UPLOADED', 'UNFLYABLE_TASK') THEN 1 END) AS ongoing_tasks, COUNT(CASE WHEN te.state = 'IMAGE_PROCESSED' THEN 1 END) AS completed_tasks, COUNT(CASE WHEN te.state = 'UNFLYABLE_TASK' THEN 1 END) AS unflyable_tasks FROM ( From c9f772e3adb9f446652ba0c7e31d08bcd74ad776 Mon Sep 17 00:00:00 2001 From: Sujit Date: Mon, 14 Oct 2024 11:50:42 +0545 Subject: [PATCH 090/113] fix(task-description): set height to update takeoff point button section --- .../src/components/DroneOperatorTask/MapSection/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/DroneOperatorTask/MapSection/index.tsx b/src/frontend/src/components/DroneOperatorTask/MapSection/index.tsx index b4d56903..e8ccced3 100644 --- a/src/frontend/src/components/DroneOperatorTask/MapSection/index.tsx +++ b/src/frontend/src/components/DroneOperatorTask/MapSection/index.tsx @@ -254,7 +254,7 @@ const MapSection = ({ className }: { className?: string }) => { )} -
+