File size: 3,680 Bytes
d0e0a14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from sqladmin import ModelView
from sqladmin import Admin

from fastapi import Request, Response
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates

import logging

from project.bot.models import Folder, AudioRecord, ImageRecord, Report
from project.users.models import User

template = Jinja2Templates(directory='templates')

logger = logging.getLogger(__name__)


class FolderAdmin(ModelView, model=Folder):
    category = 'Data'
    column_list = [Folder.id, Folder.name, Folder.owner]
    is_async = True
    icon = "fa-solid fa-folder"
    name = "Folder"
    name_plural = "Folders"
    column_searchable_list = [Folder.user_id]
    column_default_sort = ('id', True)
    # column_formatters = {
    #     ChatMessage.transcription: lambda m, a: m.transcription[:50] + '...' if len(m.transcription) > 50
    #     else m.transcription}


class AudioRecordsAdmin(ModelView, model=AudioRecord):
    category = 'Data'
    column_list = [AudioRecord.id, AudioRecord.transcription]
    is_async = True
    icon = "fa-solid fa-microphone"
    name = "Audio"
    name_plural = "Audio"
    column_searchable_list = [AudioRecord.transcription, AudioRecord.id]
    column_default_sort = ('id', True)
    column_formatters = {
        AudioRecord.transcription: lambda m, a: m.transcription[:400] + '...' if len(m.transcription) > 50
        else m.transcription}
    can_edit = False
    details_template = 'details.html'


class ImageRecordsAdmin(ModelView, model=ImageRecord):
    category = 'Data'
    column_list = [ImageRecord.id, ImageRecord.transcription]
    is_async = True
    icon = "fa-solid fa-images"
    name = "Image"
    name_plural = "Images"
    column_searchable_list = [ImageRecord.transcription, ImageRecord.id]
    column_default_sort = ('id', True)
    column_formatters = {
        ImageRecord.transcription: lambda m, a: m.transcription[:400] + '...' if len(m.transcription) > 50
        else m.transcription}
    details_template = 'details.html'
    can_edit = False


class ReportAdmin(ModelView, model=Report):
    category = 'Data'
    column_list = [Report.id, Report.user, Report.content]
    is_async = True
    icon = "fa-solid fa-rocket"
    name = "Report"
    name_plural = "Reports"
    column_searchable_list = [Report.id, Report.content]
    column_default_sort = ('id', True)
    column_formatters = {
        Report.content: lambda m, a: m.content[:400] + '...' if len(m.content) > 400
        else m.content}
    can_edit = False


class UserAdmin(ModelView, model=User):
    column_list = column_sortable_list = [User.id, User.username, User.email]
    is_async = True
    icon = "fa-solid fa-user"
    category = "Account"
    name = "User"
    name_plural = "Users"
    column_searchable_list = [User.username, User.email]
    column_details_exclude_list = [User.hashed_password, 'is_active', 'is_verified']
    form_excluded_columns = ['is_active', 'is_verified', 'is_superuser']
    column_export_list = ['id', 'email', 'username', 'is_superuser']


class AdminCustom(Admin):

    async def login(self, request: Request) -> Response:
        assert self.authentication_backend is not None

        context = {"request": request, "error": ""}

        if request.method == "GET":
            return template.TemplateResponse("login_admin.html", context)

        ok = await self.authentication_backend.login(request)
        if not ok:
            context["error"] = "Invalid credentials."
            return template.TemplateResponse(
                "login_admin.html", context, status_code=400
            )

        return RedirectResponse(request.url_for("admin:index"), status_code=302)