new
All checks were successful
Deploy to Server / deploy (push) Successful in 17s

This commit is contained in:
jeremygan2021
2026-03-20 13:27:54 +08:00
parent 0d7ba5d87c
commit c62c5b98ea
5 changed files with 238 additions and 7 deletions

View File

@@ -1,7 +1,7 @@
from django.contrib import admin
from unfold.admin import ModelAdmin
from unfold.decorators import display
from .models import Competition, CompetitionEnrollment, ScoreDimension, Project, ProjectFile, Score, Comment
from .models import Competition, CompetitionEnrollment, ScoreDimension, Project, ProjectFile, Score, Comment, ScoreFormula
class ScoreDimensionInline(admin.TabularInline):
model = ScoreDimension
@@ -143,3 +143,60 @@ class CommentAdmin(ModelAdmin):
def content_preview(self, obj):
return obj.content[:50] + '...' if len(obj.content) > 50 else obj.content
content_preview.short_description = "评语内容"
class ScoreFormulaAdmin(ModelAdmin):
"""
评分公式管理
提供可视化公式编辑功能
"""
list_display = ['name', 'competition', 'formula_preview_display', 'is_active', 'is_default', 'created_at']
list_filter = ['competition', 'is_active', 'is_default']
search_fields = ['name', 'description', 'formula', 'competition__title']
autocomplete_fields = ['competition']
fieldsets = (
('基本信息', {
'fields': ('competition', 'name', 'description')
}),
('公式配置', {
'fields': ('formula',),
'description': '使用维度名称作为变量,例如: 创新性 * 0.3 + 实用性 * 0.5 + 演示效果 * 0.2'
}),
('公式设置', {
'fields': ('is_active', 'is_default')
}),
)
@display(description="公式预览")
def formula_preview_display(self, obj):
preview = obj.get_formula_preview()
return preview[:100] + '...' if len(preview) > 100 else preview if preview else '-'
def get_form_kwargs(self, request, *args, **kwargs):
kwargs = super().get_form_kwargs(request, *args, **kwargs)
return kwargs
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
extra_context = extra_context or {}
if request.method == 'GET' and not object_id:
competition_id = request.GET.get('competition')
if competition_id:
try:
from .models import ScoreDimension
dimensions = ScoreDimension.objects.filter(competition_id=competition_id)
extra_context['dimensions'] = dimensions
except:
pass
return super().changeform_view(request, object_id, form_url, extra_context)
class Media:
css = {
'all': ('competition/admin/css/formula-editor.css',)
}
js = ('competition/admin/js/formula-editor.js',)
admin.site.register(ScoreFormula, ScoreFormulaAdmin)