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())