Quota allocation system: - Replace monthly budget with one-time quota allocation (prepaid model) - Support both adding (+) and deducting (-) quota with underflow protection - Stepped alerts at configurable percentages (e.g., 50%/80%/90%) - Auto-disable when quota exhausted (100%), alert state resets on new allocation - Quota allocation history with operator audit trail IAM management: - Create new IAM sub-accounts directly from AirGate (auto-generates API keys) - SecretKey shown once in dialog with copy-to-clipboard - Attach/detach IAM policies via UI (ArkFullAccess, TOSFullAccess, etc.) - Sync existing users from Volcengine - Project list pulled from Volcengine API for dropdown selection Security & auth: - API Key authentication for external systems (AirDrama integration) - SECRET_KEY enforced in production (raises error if missing with DEBUG=False) - APIKeyUser with proper pk/is_staff attributes for DRF compatibility Infrastructure: - Docker + docker-compose for backend and frontend - Nginx reverse proxy for frontend with /api/ forwarding - Entrypoint with auto-migrate and default admin creation - SQLite data persisted via Docker volume at /app/data/ Bug fixes from audit: - Fix frontend referencing non-existent fields (current_month_spending, effective_budget, budget_usage_percent) - Fix scheduler using naive datetime.now() → timezone.now() - Fix scheduler reading interval from settings instead of GlobalConfig DB - Fix docker-compose SQLite volume mounting as directory - Fix CORS origin with explicit port 80 - Remove dead config (VOLC_ACCESS_KEY/SK, MONITOR_INTERVAL from settings) - Remove unused imports Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
from django.contrib import admin
|
|
from .models import VolcAccount, IAMUser, GlobalConfig, AlertRecord, SpendingRecord, QuotaAllocation
|
|
|
|
|
|
@admin.register(VolcAccount)
|
|
class VolcAccountAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'access_key_hint', 'is_active', 'updated_at')
|
|
|
|
|
|
@admin.register(IAMUser)
|
|
class IAMUserAdmin(admin.ModelAdmin):
|
|
list_display = ('username', 'display_name', 'status', 'monitor_enabled',
|
|
'allocated_quota', 'consumed_total')
|
|
list_filter = ('status', 'monitor_enabled')
|
|
|
|
|
|
@admin.register(QuotaAllocation)
|
|
class QuotaAllocationAdmin(admin.ModelAdmin):
|
|
list_display = ('iam_user', 'amount', 'total_after', 'created_by', 'created_at')
|
|
|
|
|
|
@admin.register(GlobalConfig)
|
|
class GlobalConfigAdmin(admin.ModelAdmin):
|
|
list_display = ('monitor_interval_seconds', 'updated_at')
|
|
|
|
|
|
@admin.register(AlertRecord)
|
|
class AlertRecordAdmin(admin.ModelAdmin):
|
|
list_display = ('title', 'alert_type', 'spending_amount', 'notified', 'created_at')
|
|
list_filter = ('alert_type', 'notified')
|
|
|
|
|
|
@admin.register(SpendingRecord)
|
|
class SpendingRecordAdmin(admin.ModelAdmin):
|
|
list_display = ('iam_user', 'bill_period', 'amount', 'updated_at')
|