1
0
mirror of https://gitlab.com/MoonTestUse1/AdministrationItDepartmens.git synced 2025-08-14 00:25:46 +02:00

Создание чата5

This commit is contained in:
MoonTestUse1
2025-01-05 05:57:42 +06:00
parent 0dd0690990
commit e08b03dbe6
5 changed files with 107 additions and 56 deletions

View File

@@ -1,8 +1,10 @@
"""Admin router"""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from sqlalchemy import func
from typing import List
from datetime import datetime, timedelta
from app.database import get_db
from app.models.user import User
from app.models.request import Request
@@ -14,30 +16,79 @@ router = APIRouter()
@router.get("/statistics")
def get_statistics(
db: Session = Depends(get_db),
_: dict = Depends(get_current_admin)
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""Get system statistics"""
return statistics.get_request_statistics(db)
if not current_user.is_admin:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Not enough permissions"
)
@router.get("/requests", response_model=List[Request])
# Общая статистика
total_requests = db.query(func.count(Request.id)).scalar()
total_users = db.query(func.count(User.id)).filter(User.is_admin == False).scalar()
# Статистика по статусам
status_stats = db.query(
Request.status,
func.count(Request.id)
).group_by(Request.status).all()
# Статистика за последние 7 дней
week_ago = datetime.utcnow() - timedelta(days=7)
daily_stats = db.query(
func.date(Request.created_at),
func.count(Request.id)
).filter(
Request.created_at >= week_ago
).group_by(
func.date(Request.created_at)
).all()
return {
"total_requests": total_requests,
"total_users": total_users,
"status_stats": {
status: count for status, count in status_stats
},
"daily_stats": {
date.strftime("%Y-%m-%d"): count
for date, count in daily_stats
}
}
@router.get("/requests", response_model=List[RequestSchema])
def get_all_requests(
db: Session = Depends(get_db),
_: dict = Depends(get_current_admin)
skip: int = 0,
limit: int = 100,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""Get all requests"""
return requests.get_requests(db)
"""Get all requests (admin only)"""
if not current_user.is_admin:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Not enough permissions"
)
@router.get("/requests/{request_id}", response_model=Request)
async def get_request_by_id(
request_id: int,
db: Session = Depends(get_db),
_: dict = Depends(get_current_admin)
requests = db.query(Request).offset(skip).limit(limit).all()
return requests
@router.get("/users", response_model=List[UserSchema])
def get_all_users(
skip: int = 0,
limit: int = 100,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""
Получить заявку по ID (только для админа)
"""
request = requests.get_request(db, request_id)
if request is None:
raise HTTPException(status_code=404, detail="Request not found")
return request
"""Get all users (admin only)"""
if not current_user.is_admin:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Not enough permissions"
)
users = db.query(User).filter(User.is_admin == False).offset(skip).limit(limit).all()
return users

View File

@@ -1,32 +1,20 @@
"""Request model"""
from enum import Enum
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Text
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.db.base_class import Base
class RequestStatus(str, Enum):
NEW = "new"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
REJECTED = "rejected"
class RequestPriority(str, Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
class Request(Base):
__tablename__ = "requests"
id = Column(Integer, primary_key=True, index=True)
department = Column(String, index=True)
request_type = Column(String, index=True)
description = Column(String)
priority = Column(String)
status = Column(String, default=RequestStatus.NEW)
employee_id = Column(Integer, ForeignKey("employees.id"))
employee_id = Column(Integer, ForeignKey("users.id"), nullable=False)
request_type = Column(String, nullable=False)
description = Column(Text, nullable=False)
priority = Column(String, nullable=False)
status = Column(String, default="new")
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Определяем отношение к Employee
employee = relationship("Employee", back_populates="requests")
# Отношения
employee = relationship("User", back_populates="requests")

View File

@@ -16,4 +16,7 @@ class User(Base):
# Отношения для чата
employee_chats = relationship("Chat", foreign_keys="[Chat.employee_id]", back_populates="employee")
admin_chats = relationship("Chat", foreign_keys="[Chat.admin_id]", back_populates="admin")
sent_messages = relationship("Message", back_populates="sender")
sent_messages = relationship("Message", back_populates="sender")
# Отношения для заявок
requests = relationship("Request", back_populates="employee")

View File

@@ -1,29 +1,22 @@
"""Request schemas"""
from pydantic import BaseModel, ConfigDict
from typing import Optional
from pydantic import BaseModel
from datetime import datetime
from ..models.request import RequestStatus, RequestPriority
from typing import Optional
class RequestBase(BaseModel):
request_type: str
description: str
priority: RequestPriority
model_config = ConfigDict(from_attributes=True)
priority: str
class RequestCreate(RequestBase):
pass
class RequestUpdate(BaseModel):
status: RequestStatus
model_config = ConfigDict(from_attributes=True)
class Request(RequestBase):
id: int
status: RequestStatus
employee_id: int
department: str
status: str
created_at: datetime
updated_at: Optional[datetime] = None
model_config = ConfigDict(from_attributes=True)
class Config:
from_attributes = True

View File

@@ -0,0 +1,16 @@
from pydantic import BaseModel, EmailStr
class UserBase(BaseModel):
email: EmailStr
full_name: str
class UserCreate(UserBase):
password: str
class User(UserBase):
id: int
is_active: bool
is_admin: bool
class Config:
from_attributes = True