Assessments App¶
Quiz and assessment management system for knowledge testing.
Quick Start¶
from htk.apps.assessments.models import (
AbstractAssessment,
AbstractAssessmentQuestion,
AbstractAssessmentQuestionAnswerOption
)
# Create assessment
assessment = AbstractAssessment.objects.create(
name='Django Fundamentals Quiz',
description='Test your Django knowledge',
passing_score=70
)
# Create question
question = AbstractAssessmentQuestion.objects.create(
assessment=assessment,
text='What is Django?',
order=1
)
# Add answer options
AbstractAssessmentQuestionAnswerOption.objects.create(
question=question,
text='Python web framework',
is_correct=True,
order=1
)
AbstractAssessmentQuestionAnswerOption.objects.create(
question=question,
text='Database system',
is_correct=False,
order=2
)
Building Assessments¶
Create Assessment¶
from htk.apps.assessments.models import AbstractAssessment
# Create quiz
assessment = AbstractAssessment.objects.create(
name='Company Values Assessment',
description='Assess your understanding of company values',
passing_score=60,
time_limit=600 # seconds
)
Add Questions¶
from htk.apps.assessments.models import AbstractAssessmentQuestion
# Single choice question
question = AbstractAssessmentQuestion.objects.create(
assessment=assessment,
text='Which is our core value?',
question_type='single_choice',
order=1
)
# Multiple choice question
question = AbstractAssessmentQuestion.objects.create(
assessment=assessment,
text='Select all that apply',
question_type='multiple_choice',
order=2
)
# Free text question
question = AbstractAssessmentQuestion.objects.create(
assessment=assessment,
text='Explain your answer',
question_type='text',
order=3
)
Add Answer Options¶
from htk.apps.assessments.models import AbstractAssessmentQuestionAnswerOption
# Create options for question
options_data = [
('Innovation', True),
('Profit Only', False),
('Customer Focus', True),
]
for text, is_correct in options_data:
AbstractAssessmentQuestionAnswerOption.objects.create(
question=question,
text=text,
is_correct=is_correct
)
Taking Assessments¶
Track User Responses¶
from htk.apps.assessments.models import AbstractAssessmentResponse
# Submit answer
response = AbstractAssessmentResponse.objects.create(
assessment=assessment,
user=user,
question=question,
selected_option=option,
is_correct=option.is_correct
)
Score Assessment¶
from htk.apps.assessments.models import AbstractAssessment, AbstractAssessmentResponse
# Calculate score
assessment = AbstractAssessment.objects.get(id=assessment_id)
user_responses = AbstractAssessmentResponse.objects.filter(
assessment=assessment,
user=user
)
total_questions = assessment.questions.count()
correct_answers = user_responses.filter(is_correct=True).count()
score_percentage = (correct_answers / total_questions) * 100
passed = score_percentage >= assessment.passing_score
Common Patterns¶
Assessment Analytics¶
from django.db.models import Avg, Count
from htk.apps.assessments.models import AbstractAssessment, AbstractAssessmentResponse
# Get assessment statistics
assessment = AbstractAssessment.objects.get(id=assessment_id)
responses = AbstractAssessmentResponse.objects.filter(assessment=assessment)
stats = {
'total_attempts': AbstractAssessmentResponse.objects.values('user').distinct().count(),
'average_score': responses.filter(is_correct=True).count() / responses.count() * 100,
'pass_rate': (
AbstractAssessmentResponse.objects.filter(
assessment=assessment,
score__gte=assessment.passing_score
).values('user').distinct().count() /
AbstractAssessmentResponse.objects.filter(
assessment=assessment
).values('user').distinct().count() * 100
)
}
Difficulty Analysis¶
from django.db.models import Avg, Count
from htk.apps.assessments.models import AbstractAssessmentQuestion
# Get most difficult questions
questions = AbstractAssessmentQuestion.objects.filter(
assessment=assessment
).annotate(
correct_count=Count(
'assessmentresponse',
filter=Q(assessmentresponse__is_correct=True)
)
)
# Sort by difficulty (fewer correct answers = harder)
difficult = questions.order_by('correct_count')
Timed Assessments¶
from django.utils import timezone
from datetime import timedelta
# Track time taken
start_time = timezone.now()
# Check time limit
assessment_response = {
'assessment': assessment,
'user': user,
'started_at': start_time,
'time_limit': assessment.time_limit
}
# Check if time expired
elapsed = (timezone.now() - start_time).total_seconds()
time_remaining = assessment.time_limit - elapsed
expired = time_remaining <= 0
Adaptive Questions¶
from htk.apps.assessments.models import AbstractAssessmentQuestion
# Show next question based on performance
def get_next_question(user, assessment):
# Get answered questions
answered = AbstractAssessmentResponse.objects.filter(
user=user,
assessment=assessment
).values_list('question_id', flat=True)
# Get unanswered questions
next_question = AbstractAssessmentQuestion.objects.filter(
assessment=assessment
).exclude(
id__in=answered
).first()
return next_question
Generate Certificates¶
from django.utils import timezone
# Award certificate on passing
def check_and_award_certificate(user, assessment):
from htk.apps.assessments.models import AssessmentCertificate
score = calculate_score(user, assessment)
if score >= assessment.passing_score:
cert = AssessmentCertificate.objects.create(
user=user,
assessment=assessment,
score=score,
awarded_at=timezone.now()
)
return cert
Models¶
AbstractAssessment¶
class AbstractAssessment(models.Model):
name = CharField(max_length=200)
description = TextField(blank=True)
passing_score = IntegerField(default=60) # Percentage
time_limit = IntegerField(null=True, blank=True) # Seconds
created = DateTimeField(auto_now_add=True)
AbstractAssessmentQuestion¶
class AbstractAssessmentQuestion(models.Model):
assessment = ForeignKey(AbstractAssessment, on_delete=models.CASCADE)
text = TextField()
question_type = CharField(max_length=50) # 'single_choice', 'multiple_choice', 'text'
order = IntegerField()
AbstractAssessmentQuestionAnswerOption¶
class AbstractAssessmentQuestionAnswerOption(models.Model):
question = ForeignKey(AbstractAssessmentQuestion, on_delete=models.CASCADE)
text = CharField(max_length=500)
is_correct = BooleanField()
order = IntegerField()
Configuration¶
# settings.py
ASSESSMENT_PASSING_SCORE = 70
ASSESSMENT_QUESTION_TYPES = [
('single_choice', 'Single Choice'),
('multiple_choice', 'Multiple Choice'),
('text', 'Free Text'),
]
ASSESSMENT_RANDOMIZE_QUESTIONS = True
ASSESSMENT_RANDOMIZE_OPTIONS = True
ASSESSMENT_SHOW_CORRECT_ANSWERS = True # After completion
Best Practices¶
- Clear questions - Write unambiguous assessment questions
- Balanced difficulty - Mix easy and hard questions
- Multiple options - Provide plausible distractor options
- Set passing score - Define clear passing criteria
- Provide feedback - Show correct answers after completion
- Track analytics - Monitor question difficulty
- Time limits - Use for timed assessments