From e2cd40e5531aabf505a9b33d469deaf37dde687c Mon Sep 17 00:00:00 2001 From: urec56 Date: Sun, 10 Mar 2024 13:51:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B1=D0=B4=20=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B0=D0=B2=D0=B0=D1=82=D0=B0=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/images/router.py | 17 +++-- app/images/shemas.py | 5 ++ .../28850415d498_изменения_таблицы_юзеров.py | 62 +++++++++++++++++++ app/tasks/tasks.py | 2 - app/users/chat/router.py | 4 +- app/users/dao.py | 3 - app/users/models.py | 3 +- app/users/router.py | 6 +- app/users/schemas.py | 2 + 9 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 app/migrations/versions/28850415d498_изменения_таблицы_юзеров.py diff --git a/app/images/router.py b/app/images/router.py index d44311f..bd0f9a2 100644 --- a/app/images/router.py +++ b/app/images/router.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, UploadFile, HTTPException import httpx from app.config import settings -from app.images.shemas import SImageUrl +from app.images.shemas import SImageUrl, SAvatarUrl router = APIRouter( prefix="/images", @@ -31,10 +31,19 @@ async def upload_file_returning_str(file: UploadFile, sub_str: str) -> str: return image_url -@router.post('/upload_avatar', response_model=SImageUrl) +async def upload_avatar_returning_dict(file: UploadFile, sub_str: str) -> dict: + remote_server_url = settings.IMAGE_UPLOAD_SERVER + sub_str + response = await upload_file(file, remote_server_url) + image_url = response.json()['image_url'] + hex_color = response.json()['hex_color'] + image_url = settings.IMAGE_UPLOAD_SERVER + image_url + return {'image_url': image_url, 'hex_color': hex_color} + + +@router.post('/upload_avatar', response_model=SAvatarUrl) async def upload_avatar(file: UploadFile): - image_url = await upload_file_returning_str(file, "upload_avatar") - return {'image_url': image_url} + image_data = await upload_avatar_returning_dict(file, "upload_avatar") + return image_data @router.post('/upload_image', response_model=SImageUrl) diff --git a/app/images/shemas.py b/app/images/shemas.py index 1437c15..f7a4e7e 100644 --- a/app/images/shemas.py +++ b/app/images/shemas.py @@ -1,5 +1,10 @@ from pydantic import BaseModel +class SAvatarUrl(BaseModel): + image_url: str + hex_color: str + + class SImageUrl(BaseModel): image_url: str diff --git a/app/migrations/versions/28850415d498_изменения_таблицы_юзеров.py b/app/migrations/versions/28850415d498_изменения_таблицы_юзеров.py new file mode 100644 index 0000000..c510a0f --- /dev/null +++ b/app/migrations/versions/28850415d498_изменения_таблицы_юзеров.py @@ -0,0 +1,62 @@ +"""Изменения таблицы юзеров + +Revision ID: 28850415d498 +Revises: e9b02df6e778 +Create Date: 2024-03-10 13:47:01.603546 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '28850415d498' +down_revision: Union[str, None] = 'e9b02df6e778' +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.drop_index('messages_message_idx', table_name='messages') + op.alter_column('pinnedchats', 'user_id', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('pinnedchats', 'chat_id', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('pinnedmessages', 'chat_id', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('pinnedmessages', 'message_id', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('pinnedmessages', 'user_id', + existing_type=sa.INTEGER(), + nullable=True) + op.add_column('users', sa.Column('avatar_hex', sa.String(), server_default='#30293f', nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'avatar_hex') + op.alter_column('pinnedmessages', 'user_id', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('pinnedmessages', 'message_id', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('pinnedmessages', 'chat_id', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('pinnedchats', 'chat_id', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('pinnedchats', 'user_id', + existing_type=sa.INTEGER(), + nullable=False) + op.create_index('messages_message_idx', 'messages', ['message'], unique=False) + # ### end Alembic commands ### diff --git a/app/tasks/tasks.py b/app/tasks/tasks.py index b27e9e0..a3eb5c6 100644 --- a/app/tasks/tasks.py +++ b/app/tasks/tasks.py @@ -1,9 +1,7 @@ import smtplib import random import string -from pathlib import Path -from PIL import Image from pydantic import EmailStr diff --git a/app/users/chat/router.py b/app/users/chat/router.py index 19487a1..74b4174 100644 --- a/app/users/chat/router.py +++ b/app/users/chat/router.py @@ -10,8 +10,8 @@ from app.users.chat.shemas import SMessage, SLastMessages, SPinnedMessage, SPinn from app.users.dao import UserDAO from app.users.dependencies import get_current_user -from app.users.auth import validate_user_access_to_chat, validate_user_admin, get_user_allowed_chats_id, ADMIN_USER_ID, \ - check_verificated_user_with_exc +from app.users.auth import validate_user_access_to_chat, validate_user_admin, get_user_allowed_chats_id, \ + ADMIN_USER_ID, check_verificated_user_with_exc from app.users.models import Users from app.users.schemas import SCreateInvitationLink, SUserAddedToChat diff --git a/app/users/dao.py b/app/users/dao.py index 02a1c3d..b01475b 100644 --- a/app/users/dao.py +++ b/app/users/dao.py @@ -1,7 +1,4 @@ -from datetime import datetime - from sqlalchemy import update, select, insert, and_, func, text -from sqlalchemy.exc import SQLAlchemyError from app.dao.base import BaseDAO from app.database import async_session_maker, engine diff --git a/app/users/models.py b/app/users/models.py index eacf4da..835727d 100644 --- a/app/users/models.py +++ b/app/users/models.py @@ -14,11 +14,12 @@ class Users(Base): email: Mapped[str] username: Mapped[str] hashed_password: Mapped[str] - role: Mapped[int] = mapped_column(server_default=f'0') + role: Mapped[int] = mapped_column(server_default='0') black_phoenix: Mapped[bool] = mapped_column(server_default='false') avatar_image: Mapped[str | None] = mapped_column( server_default='https://images.black-phoenix.ru/static/images/%D1%82%D1%8B%20%D1%83%D0%B6%D0%B5%20%D0%BF%D0%B5%D1%88%D0%BA%D0%B0%20BP.png' ) + avatar_hex: Mapped[str | None] = mapped_column(server_default='#30293f') date_of_birth: Mapped[date] date_of_registration: Mapped[date] = mapped_column(server_default=func.now()) diff --git a/app/users/router.py b/app/users/router.py index e79bb42..f865c61 100644 --- a/app/users/router.py +++ b/app/users/router.py @@ -104,8 +104,10 @@ async def change_avatar(user_data: SUserAvatar, current_user: Users = Depends(ge await check_verificated_user_with_exc(user_id=current_user.id) if not verify_password(user_data.password, current_user.hashed_password): raise IncorrectPasswordException - if await UserDAO.change_data(current_user.id, avatar_image=user_data.new_avatar_image): - return {'new_avatar_image': user_data.new_avatar_image} + if await UserDAO.change_data( + current_user.id, avatar_image=user_data.new_avatar_image, avatar_hex=SUserAvatar.avatar_hex + ): + return {'new_avatar_image': user_data.new_avatar_image, 'avatar_hex': SUserAvatar.avatar_hex} raise SomethingWentWrongException diff --git a/app/users/schemas.py b/app/users/schemas.py index 9b83b58..af780e6 100644 --- a/app/users/schemas.py +++ b/app/users/schemas.py @@ -57,6 +57,7 @@ class SUserRename(BaseModel): class SUserAvatar(BaseModel): password: str new_avatar_image: str + avatar_hex: str class SUserPassword(BaseModel): @@ -97,6 +98,7 @@ class SUserName(BaseModel): class SNewAvatar(BaseModel): new_avatar_image: str + avatar_hex: str class SConfirmPasswordRecovery(BaseModel):