Update/fix login

This commit is contained in:
phil 2024-03-16 11:18:33 +05:30
parent ba1f59cfb9
commit 15fe7fab08
4 changed files with 56 additions and 8 deletions

View file

@ -1,4 +1,6 @@
from sqlmodel import Field, SQLModel, Relationship
from datetime import datetime
from sqlmodel import Field, SQLModel, Relationship, String
from pydantic import BaseModel
from gisaf.models.metadata import gisaf_admin
@ -27,10 +29,20 @@ class UserBase(SQLModel):
class User(UserBase, table=True):
__table_args__ = gisaf_admin.table_args
id: str | None = Field(default=None, primary_key=True)
id: int = Field(primary_key=True)
username: str = Field(String(255), unique=True, index=True)
email: str = Field(sa_type=String(50), unique=True)
password: str = Field(sa_type=String(255))
active: bool
confirmed_at: datetime
last_login_at: datetime
current_login_at: datetime
last_login_ip: str = Field(sa_type=String(255))
current_login_ip: str = Field(sa_type=String(255))
login_count: int
roles: list["Role"] = Relationship(back_populates="users",
link_model=UserRoleLink)
password: str | None = None
def can_view(self, model) -> bool:
role = getattr(model, 'viewable_role', None)

View file

@ -10,7 +10,7 @@ from pydantic import BaseModel
from sqlmodel.ext.asyncio.session import AsyncSession
from jose import JWTError, jwt, ExpiredSignatureError
from sqlalchemy import select
from sqlmodel import select
from sqlalchemy.orm import selectinload
from gisaf.config import conf
@ -72,7 +72,8 @@ async def enable_user(session: AsyncSession, username: str, enable=True):
await session.commit()
async def create_user(session: AsyncSession, username: str, password: str, full_name: str,
async def create_user(session: AsyncSession, username: str,
password: str, full_name: str,
email: str, **kwargs):
user_in_db: User | None = await get_user(session, username)
if user_in_db is None:
@ -93,10 +94,10 @@ async def create_user(session: AsyncSession, username: str, password: str, full_
async def get_user(
session: AsyncSession,
username: str) -> (User | None):
username: str) -> User | None:
query = select(User).where(User.username==username).options(selectinload(User.roles))
data = await session.exec(query)
return data.scalar()
return data.one_or_none()
def verify_password(user: User, plain_password):