diff --git a/app/main.py b/app/main.py index 1ab74b2..f63f67a 100644 --- a/app/main.py +++ b/app/main.py @@ -1337,6 +1337,8 @@ def create_user(payload: dict, request: Request, _: User = Depends(require_admin expires_at=expires_at, active=payload.get("active", True), is_admin=payload.get("is_admin", False), + first_name=payload.get("first_name", ""), + last_name=payload.get("last_name", ""), ) db.add(user) db.commit() @@ -1349,7 +1351,7 @@ def edit_user(user_id: int, payload: dict, request: Request, _: User = Depends(r user = db.get(User, user_id) if not user: raise HTTPException(status_code=404, detail="User not found") - for key in ["username", "active", "is_admin"]: + for key in ["username", "active", "is_admin", "first_name", "last_name"]: if key in payload: setattr(user, key, payload[key]) if "password" in payload and payload["password"]: diff --git a/app/models.py b/app/models.py index 95f729a..af7e332 100644 --- a/app/models.py +++ b/app/models.py @@ -32,6 +32,8 @@ class User(Base): expires_at: Mapped[dt.datetime] = mapped_column(DateTime(timezone=True), index=True) active: Mapped[bool] = mapped_column(Boolean, default=True, index=True) is_admin: Mapped[bool] = mapped_column(Boolean, default=False) + first_name: Mapped[str] = mapped_column(String(64), default="") + last_name: Mapped[str] = mapped_column(String(64), default="") created_at: Mapped[dt.datetime] = mapped_column(DateTime(timezone=True), default=lambda: dt.datetime.now(dt.timezone.utc)) @@ -50,6 +52,8 @@ class Service(Base): icon_path: Mapped[str] = mapped_column(Text, default="") active: Mapped[bool] = mapped_column(Boolean, default=True) warm_pool_size: Mapped[int] = mapped_column(Integer, default=0) + first_name: Mapped[str] = mapped_column(String(64), default="") + last_name: Mapped[str] = mapped_column(String(64), default="") created_at: Mapped[dt.datetime] = mapped_column(DateTime(timezone=True), default=lambda: dt.datetime.now(dt.timezone.utc)) @@ -59,6 +63,8 @@ class Category(Base): id: Mapped[int] = mapped_column(Integer, primary_key=True) name: Mapped[str] = mapped_column(String(128), unique=True, index=True) slug: Mapped[str] = mapped_column(String(64), unique=True, index=True) + first_name: Mapped[str] = mapped_column(String(64), default="") + last_name: Mapped[str] = mapped_column(String(64), default="") created_at: Mapped[dt.datetime] = mapped_column(DateTime(timezone=True), default=lambda: dt.datetime.now(dt.timezone.utc)) @@ -69,6 +75,8 @@ class ServiceCategory(Base): id: Mapped[int] = mapped_column(Integer, primary_key=True) service_id: Mapped[int] = mapped_column(ForeignKey("services.id", ondelete="CASCADE"), index=True) category_id: Mapped[int] = mapped_column(ForeignKey("categories.id", ondelete="CASCADE"), index=True) + first_name: Mapped[str] = mapped_column(String(64), default="") + last_name: Mapped[str] = mapped_column(String(64), default="") created_at: Mapped[dt.datetime] = mapped_column(DateTime(timezone=True), default=lambda: dt.datetime.now(dt.timezone.utc)) @@ -90,6 +98,8 @@ class RdpSlot(Base): rdp_username: Mapped[str] = mapped_column(String(128)) rdp_password: Mapped[str] = mapped_column(String(256), default="") container_name: Mapped[Optional[str]] = mapped_column(String(128), nullable=True) + first_name: Mapped[str] = mapped_column(String(64), default="") + last_name: Mapped[str] = mapped_column(String(64), default="") created_at: Mapped[dt.datetime] = mapped_column(DateTime(timezone=True), default=lambda: dt.datetime.now(dt.timezone.utc)) diff --git a/app/static/style.css b/app/static/style.css index aec24e7..a4fa7dc 100644 --- a/app/static/style.css +++ b/app/static/style.css @@ -107,6 +107,22 @@ button { } .header-left { display: flex; align-items: center; } .header-right { display: flex; align-items: center; gap: 0.75rem; } + +.user-avatar { + width: 34px; + height: 34px; + border-radius: 50%; + background: linear-gradient(135deg, #1e7dc8 0%, #1360a0 100%); + color: #fff; + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0.02em; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + box-shadow: 0 2px 8px rgba(14,80,160,0.4); +} .header-username { color: #ffffff; font-size: 1rem; diff --git a/app/templates/admin.html b/app/templates/admin.html index 7f98520..07490b0 100644 --- a/app/templates/admin.html +++ b/app/templates/admin.html @@ -53,8 +53,8 @@