diff --git a/gns3server/db/models/users.py b/gns3server/db/models/users.py index d9fc9aa29..08d50f8a1 100644 --- a/gns3server/db/models/users.py +++ b/gns3server/db/models/users.py @@ -15,8 +15,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +from datetime import datetime +from typing import Optional + from sqlalchemy import Table, Boolean, Column, Integer, String, DateTime, ForeignKey, event -from sqlalchemy.orm import relationship +from sqlalchemy.orm import Mapped, mapped_column, relationship from .base import Base, BaseTable, generate_uuid, GUID @@ -43,7 +46,7 @@ class User(BaseTable): email = Column(String, unique=True, index=True) full_name = Column(String) hashed_password = Column(String) - last_login = Column(DateTime) + last_login: Mapped[Optional[datetime]] = mapped_column(DateTime) token_version = Column(Integer, default=0, nullable=False, server_default="0") is_active = Column(Boolean, default=True) is_superadmin = Column(Boolean, default=False) diff --git a/gns3server/db/repositories/users.py b/gns3server/db/repositories/users.py index f7e098dc4..2bd40e313 100644 --- a/gns3server/db/repositories/users.py +++ b/gns3server/db/repositories/users.py @@ -16,8 +16,9 @@ # along with this program. If not, see . from uuid import UUID -from typing import Optional, List, Union +from typing import Optional, List, Union, cast from sqlalchemy import select, update, delete, func +from sqlalchemy.engine import CursorResult from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload @@ -72,7 +73,7 @@ class UsersRepository(BaseRepository): query = select(models.User) result = await self._db_session.execute(query) - return result.scalars().all() + return list(result.scalars().all()) async def create_user(self, user: schemas.UserCreate) -> models.User: """ @@ -129,7 +130,7 @@ class UsersRepository(BaseRepository): query = delete(models.User).where(models.User.user_id == user_id) result = await self._db_session.execute(query) await self._db_session.commit() - return result.rowcount > 0 + return cast(CursorResult, result).rowcount > 0 async def authenticate_user(self, username: str, password: str) -> Optional[models.User]: """ @@ -168,7 +169,7 @@ class UsersRepository(BaseRepository): query = select(models.UserGroup).join(models.UserGroup.users).filter(models.User.user_id == user_id) result = await self._db_session.execute(query) - return result.scalars().all() + return list(result.scalars().all()) async def get_user_group(self, user_group_id: UUID) -> Optional[models.UserGroup]: """ @@ -195,7 +196,7 @@ class UsersRepository(BaseRepository): query = select(models.UserGroup) result = await self._db_session.execute(query) - return result.scalars().all() + return list(result.scalars().all()) async def create_user_group(self, user_group: schemas.UserGroupCreate) -> models.UserGroup: """ @@ -233,7 +234,7 @@ class UsersRepository(BaseRepository): query = delete(models.UserGroup).where(models.UserGroup.user_group_id == user_group_id) result = await self._db_session.execute(query) await self._db_session.commit() - return result.rowcount > 0 + return cast(CursorResult, result).rowcount > 0 async def add_member_to_user_group(self, user_group_id: UUID, user: models.User) -> Union[None, models.UserGroup]: """ @@ -285,4 +286,4 @@ class UsersRepository(BaseRepository): query = select(models.User).join(models.User.groups).filter(models.UserGroup.user_group_id == user_group_id) result = await self._db_session.execute(query) - return result.scalars().all() + return list(result.scalars().all())