Dashboard
Bosh sahifa — siz o‘zingiz tartibga soladigan vidjetlar ro‘yxati. Grafiklarni server chizadi — grafik kutubxonasi va canvas ishlatilmaydi, va har bir vidjet necha so‘rovga tushishini bildiradi.
Mavjud v0.4.0
Hech narsani sozlamasdan nimalarga ega bo‘lasiz
Har bir modelning qatorlar soni, yon panel ularni guruhlagani kabi
guruhlangan holda, va so‘nggi o‘ttiz kundagi yangi akkauntlar grafigi. Bu —
ikkita vidjet: Signups() va Counts() — dashboard aslida doim shunday
bo‘lgan.
Quyidagilarning hech biri majburiy emas. Bosh sahifa sxema haqida emas, balki sizning domeningiz haqidagi savolga javob berishi kerak bo‘lganda ulardan foydalaning.
Joylashtirish
from fastfort.admin import Breakdown, Counts, Metric, Recent, Trend
fort.set_dashboard(
Metric(Shipment, title="Shipments booked", days=14, icon="truck"),
Metric(Invoice, title="Invoices raised", days=14, icon="credit-card"),
Trend(Shipment, title="Shipments per day", days=30),
Breakdown(Shipment, on="status"),
Recent(Shipment, limit=6),
Counts(),
)
Vidjetlar berilgan tartibda chiziladi. fort.set_dashboard() argumentlarsiz
chaqirilsa — bu hech narsasi yo‘q dashboard degani; buni ataylab xohlash
mantiqan to‘g‘ri, lekin tasodifan shunga erishib qo‘yish chalkashtiradi — shu
sababli buni faqat shu tarzda ifodalash mumkin.
Tayyor holda keladigan beshta vidjet
| Vidjet | Nimani chizadi | Necha so‘rovga tushadi |
|---|---|---|
Metric(model) | Son, ishorali farq (delta) va sparklayn | Kuniga bitta so‘rov |
Trend(model) | Xuddi shu qator kattalashtirilgan holda — maydonli grafik yoki ustunlar shaklida — davr bo‘yicha jami qiymat, eng band kun va kunlik o‘rtacha bilan birga | Kuniga bitta so‘rov |
Breakdown(model, on="status") | Ustundagi har bir qiymat uchun bitta indikator | Qiymatiga bitta so‘rov |
Recent(model) | Havolali eng yangi qatorlar | Bitta so‘rov |
Counts() | Ro‘yxatdan o‘tgan har bir modelning qatorlar soni, ilova bo‘yicha guruhlangan | Modeliga bitta so‘rov |
Har bir vidjet title=, span= (THIRD, HALF yoki FULL) parametrlarini,
vaqt bo‘yicha grafik chizadigan bo‘lsa esa — days= va qator qachon kelib
tushganini qayd etuvchi ustun bo‘lgan on= parametrini qabul qiladi. on
ko‘rsatilmasa, odatiy nomlar avtomatik aniqlanadi: created_at,
date_joined, registered_at va boshqalar.
Xarajat ustuni bezak emas. Dashboard — istalgan admin panelda eng ko‘p
ochiladigan sahifa, va eng oson xato — sezdirmasdan yuzta so‘rov yuboradigan
kartochka yaratishdir. Trend(model, days=90) — har bir sahifa yuklanishida
to‘qson ta indekslangan hisoblash degani; days=14 esa — o‘n to‘rtta.
Sahifadagi barcha vidjetlar so‘rovning yagona unit of work’ini baham ko‘radi,
shuning uchun hisob so‘rovlarda yuritiladi, ulanishlarda emas.
Aytadigan gapi bo‘lmagan vidjet hech narsa chizmaydi
Mavjud bo‘lmagan ustun, sana ustuni yo‘q model, erkin matn bo‘yicha
breakdown, dashboard_days=0 — bularning har biri xatolik chiqarish o‘rniga
shunchaki kartochkani ko‘rsatmay qo‘yadi. Konfiguratsiya faylidagi xatolik
faqat bitta kartochkaga zarar keltirishi kerak, hech qachon hamma birinchi
bo‘lib ochadigan sahifaga emas.
Aynan shuning uchun Breakdown qat’iy qiymatlar to‘plamiga ega bo‘lmagan
ustunni qabul qilmaydi: erkin matnli ustunning turli qiymatlarini sanash
butun jadvalni skanerlash demakdir.
Grafiklar server tomonidan chiziladi
SVG yo‘l (path), bir nechta <line> va balandligi bo‘lgan to‘rtburchaklar.
Hech qanday grafik kutubxonasi, <canvas> yo‘q, ikkinchi so‘rov yo‘q, va
admin panelda allaqachon mavjud bo‘lgandan tashqari bironta ham qo‘shimcha
JavaScript baytisiz.
Bu shuni anglatadi: grafik sahifaning birinchi chizilishidayoq mavjud, u chop etiladi, yorug‘ va qorong‘i mavzularda mavzuning o‘z ranglarini oladi va skript o‘chirilganda ham ishlashda davom etadi. Skript faqat tooltiplarni qo‘shadi, boshqa hech narsa qilmaydi. Har bir grafik yonida xuddi shu ma’lumotlar jadval ko‘rinishida ham bor — ko‘rinishdan yashirilgan, ammo ekran o‘quvchisi uchun ochiq.
Har bir grafik faqat bitta rangdan foydalanadi, chunki butun palitra bitta rang tusidan hosil bo‘ladi. Trend — bitta qatordan iborat, breakdown esa ustunlarni uzunligi bo‘yicha solishtiradi — bu odamlar aniq idrok etadigan yagona vizual kanal — har bir ustun yonida son va ulush matn ko‘rinishida ko‘rsatiladi.
O‘zingiznikini yozish
from fastfort.admin.dashboard import Card, Widget
class OpenTickets(Widget):
span = 1
async def resolve(self, context):
adapter = context.adapter_for(Ticket)
count = await adapter.count(ListQuery(filters=(Filter("state", FilterOperator.EXACT, "open"),)))
if not count:
return None
return Card(
template="dashboard/open_tickets.html",
context={"count": count},
span=self.span,
)
fort.set_dashboard(OpenTickets(), Counts())
Card.template renderer orqali aniqlanadi, va avval loyihaning o‘z
shablonlar direktoriyasi, keyin esa paketniki qidiriladi — shuning uchun
o‘zingizning shablonlar direktoriyangizdagi dashboard/open_tickets.html
yetarli bo‘ladi. Sahifada o‘rnatilgan (built-in) vidjetlar uchun hech qanday
alohida holat ko‘zda tutilmagan; sizniki ham aynan ular kabi chiziladi.
context sizga so‘rovning unit of work’ini (adapter_for, spec_for),
reyestrni (key_for, url_for, title_for) va sozlangan oynani (days)
taqdim etadi. Undan o‘tib to‘g‘ridan-to‘g‘ri ORM’ga murojaat qilishdan
qochish kerak: adapter protokoliga mos yozilgan vidjet loyiha backend’ini
o‘zgartirganda ham ishlashda davom etadi.