You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

129 lines
4.9 KiB

<<<<<<< HEAD
from ajaxdatatable.admin import AjaxDatatable
from django.contrib import admin
from django.db.models import Count
from django.utils.safestring import mark_safe
from django.utils.html import format_html
from django.urls import reverse, path
from apps.course.models import Lesson
from apps.quiz.models import Quiz
from .question import QuestionAdminInline
@admin.register(Quiz)
class QuizAdmin(AjaxDatatable):
search_fields = ['title', 'lesson__title']
list_display = ['title', 'description','lesson','each_question_timing', '_status', '_questions',]
autocomplete_fields = ['lesson',]
list_filter = ['each_question_timing',]
inlines = [QuestionAdminInline,]
def get_queryset(self, request):
queryset = super().get_queryset(request)
if request.user.groups.filter(name="Professor Group").exists():
return queryset.filter(lesson__course__professor=request.user)
return queryset
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
if obj is None:
form.base_fields['lesson'].queryset = Lesson.objects.all() if request.user.is_staff else Lesson.objects.filter(course__professor=request.user)
form.base_fields['lesson'].widget.can_add_related = False
return form
@admin.display(description='Status', ordering='status')
def _status(self, obj):
if obj.status:
return mark_safe("<span class='badge badge-primary'>Active</span>")
return mark_safe("<span class='badge badge-warning'>Inactive</span>")
@admin.display(description='Questions', ordering='questions_count')
def _questions(self, obj):
return mark_safe(f"<a href='/admin/quiz/question/?quiz={obj.id}'>Questions: {obj.questions_count}</a>")
def get_queryset(self, request):
return super().get_queryset(request).annotate(
questions_count=Count('questions')
)
=======
from django.contrib import admin
from django.db.models import Count
from django.utils.safestring import mark_safe
from django.urls import reverse
from unfold.admin import ModelAdmin
from unfold.decorators import display
from apps.course.models import CourseLesson
from apps.quiz.models import Quiz
from apps.quiz.admin.question import QuestionAdminInline
from utils.admin import project_admin_site
class QuizAdmin(ModelAdmin):
search_fields = ['title', 'lesson__title']
list_display = ['title', 'description', 'lesson', 'each_question_timing', 'status_display', 'questions_display']
list_filter = ['each_question_timing', 'status']
inlines = [QuestionAdminInline]
compressed_fields = True
def get_queryset(self, request):
queryset = super().get_queryset(request).annotate(
questions_count=Count('questions')
)
# اولویت اول: staff یا admin - دسترسی کامل
if (request.user.is_staff or
request.user.has_role('admin') or
request.user.has_role('super_admin')):
return queryset
# اولویت دوم: professor - فقط کوئیزهای دوره‌های خود
if request.user.has_role('professor'):
return queryset.filter(lesson__course__professor=request.user)
return queryset.none()
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
# محدود کردن انتخاب lesson بر اساس سطح دسترسی کاربر
if (request.user.is_staff or
request.user.has_role('admin') or
request.user.has_role('super_admin')):
# اولویت اول: staff یا admin - دسترسی کامل
form.base_fields['lesson'].queryset = CourseLesson.objects.all()
elif request.user.has_role('professor'):
# اولویت دوم: professor - فقط CourseLesson های دوره‌های خود
form.base_fields['lesson'].queryset = CourseLesson.objects.filter(course__professor=request.user)
else:
# سایر کاربران - عدم دسترسی
form.base_fields['lesson'].queryset = CourseLesson.objects.none()
form.base_fields['lesson'].widget.can_add_related = False
return form
@display(description='Status', ordering='status')
def status_display(self, obj):
if obj.status:
return mark_safe('<span class="unfold-badge unfold-badge--success">Active</span>')
return mark_safe('<span class="unfold-badge unfold-badge--warning">Inactive</span>')
@display(description='Questions', ordering='questions_count')
def questions_display(self, obj):
url = reverse('admin:quiz_question_changelist') + f'?quiz={obj.id}'
return mark_safe(f'<a href="{url}" class="unfold-link">Questions: {obj.questions_count}</a>')
project_admin_site.register(Quiz, QuizAdmin)
>>>>>>> develop