summaryrefslogtreecommitdiff
path: root/yaksh/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'yaksh/models.py')
-rw-r--r--yaksh/models.py91
1 files changed, 54 insertions, 37 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index e161543..9aa3e0b 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -258,7 +258,7 @@ class Lesson(models.Model):
html_data = models.TextField(null=True, blank=True)
# Creator of the lesson
- creator = models.ForeignKey(User)
+ creator = models.ForeignKey(User, on_delete=models.CASCADE)
# Activate/Deactivate Lesson
active = models.BooleanField(default=True)
@@ -329,7 +329,8 @@ class Lesson(models.Model):
#############################################################################
class LessonFile(models.Model):
- lesson = models.ForeignKey(Lesson, related_name="lesson")
+ lesson = models.ForeignKey(Lesson, related_name="lesson",
+ on_delete=models.CASCADE)
file = models.FileField(upload_to=get_file_dir, default=None)
def remove(self):
@@ -477,7 +478,7 @@ class Quiz(models.Model):
is_exercise = models.BooleanField(default=False)
- creator = models.ForeignKey(User, null=True)
+ creator = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
objects = QuizManager()
@@ -534,7 +535,7 @@ class Quiz(models.Model):
except QuestionPaper.DoesNotExist:
qp = None
ans_ppr = AnswerPaper.objects.filter(
- user=user, course=course, question_paper=qp
+ user_id=user.id, course_id=course.id, question_paper_id=qp
).order_by("-attempt_number")
if ans_ppr.exists():
status = ans_ppr.first().status
@@ -548,7 +549,7 @@ class Quiz(models.Model):
except QuestionPaper.DoesNotExist:
qp = None
ans_ppr = AnswerPaper.objects.filter(
- user=user, course=course, question_paper=qp
+ user_id=user.id, course_id=course.id, question_paper_id=qp
).order_by("-attempt_number")
if ans_ppr.exists():
return any([paper.passed for paper in ans_ppr])
@@ -593,8 +594,10 @@ class LearningUnit(models.Model):
""" Maintain order of lesson and quiz added in the course """
order = models.IntegerField()
type = models.CharField(max_length=16)
- lesson = models.ForeignKey(Lesson, null=True, blank=True)
- quiz = models.ForeignKey(Quiz, null=True, blank=True)
+ lesson = models.ForeignKey(Lesson, null=True, blank=True,
+ on_delete=models.CASCADE)
+ quiz = models.ForeignKey(Quiz, null=True, blank=True,
+ on_delete=models.CASCADE)
check_prerequisite = models.BooleanField(default=True)
def get_lesson_or_quiz(self):
@@ -607,10 +610,12 @@ class LearningUnit(models.Model):
self.check_prerequisite = True
def get_completion_status(self, user, course):
- course_status = CourseStatus.objects.filter(user=user, course=course)
+ course_status = CourseStatus.objects.filter(
+ user_id=user.id, course_id=course.id
+ )
state = "not attempted"
if course_status.exists():
- if self in course_status.first().completed_units.all():
+ if course_status.first().completed_units.filter(id=self.id):
state = "completed"
elif self.type == "quiz":
state = self.quiz.get_answerpaper_status(user, course)
@@ -657,7 +662,8 @@ class LearningModule(models.Model):
name = models.CharField(max_length=255)
description = models.TextField(default=None, null=True, blank=True)
order = models.IntegerField(default=0)
- creator = models.ForeignKey(User, related_name="module_creator")
+ creator = models.ForeignKey(User, related_name="module_creator",
+ on_delete=models.CASCADE)
check_prerequisite = models.BooleanField(default=True)
check_prerequisite_passes = models.BooleanField(default=False)
html_data = models.TextField(null=True, blank=True)
@@ -834,7 +840,8 @@ class Course(models.Model):
active = models.BooleanField(default=True)
code = models.CharField(max_length=128, null=True, blank=True)
hidden = models.BooleanField(default=False)
- creator = models.ForeignKey(User, related_name='creator')
+ creator = models.ForeignKey(User, related_name='creator',
+ on_delete=models.CASCADE)
students = models.ManyToManyField(User, related_name='students')
requests = models.ManyToManyField(User, related_name='requests')
rejected = models.ManyToManyField(User, related_name='rejected')
@@ -863,7 +870,8 @@ class Course(models.Model):
null=True
)
- grading_system = models.ForeignKey(GradingSystem, null=True, blank=True)
+ grading_system = models.ForeignKey(GradingSystem, null=True, blank=True,
+ on_delete=models.CASCADE)
objects = CourseManager()
@@ -1117,9 +1125,10 @@ class CourseStatus(models.Model):
completed_units = models.ManyToManyField(LearningUnit,
related_name="completed_units")
current_unit = models.ForeignKey(LearningUnit, related_name="current_unit",
- null=True, blank=True)
- course = models.ForeignKey(Course)
- user = models.ForeignKey(User)
+ null=True, blank=True,
+ on_delete=models.CASCADE)
+ course = models.ForeignKey(Course, on_delete=models.CASCADE)
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
grade = models.CharField(max_length=255, null=True, blank=True)
percentage = models.FloatField(default=0.0)
percent_completed = models.IntegerField(default=0)
@@ -1131,7 +1140,7 @@ class CourseStatus(models.Model):
if self.is_course_complete():
self.calculate_percentage()
if self.course.grading_system is None:
- grading_system = GradingSystem.objects.get(name='default')
+ grading_system = GradingSystem.objects.get(name__contains='default')
else:
grading_system = self.course.grading_system
grade = grading_system.get_grade(self.percentage)
@@ -1173,14 +1182,14 @@ class CourseStatus(models.Model):
###############################################################################
class ConcurrentUser(models.Model):
- concurrent_user = models.OneToOneField(User)
+ concurrent_user = models.OneToOneField(User, on_delete=models.CASCADE)
session_key = models.CharField(max_length=40)
###############################################################################
class Profile(models.Model):
"""Profile for a user to store roll number and other details."""
- user = models.OneToOneField(User)
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
roll_number = models.CharField(max_length=20)
institute = models.CharField(max_length=128)
department = models.CharField(max_length=64)
@@ -1258,7 +1267,8 @@ class Question(models.Model):
snippet = models.TextField(blank=True)
# user for particular question
- user = models.ForeignKey(User, related_name="user")
+ user = models.ForeignKey(User, related_name="user",
+ on_delete=models.CASCADE)
# Does this question allow partial grading
partial_grading = models.BooleanField(default=False)
@@ -1533,7 +1543,8 @@ class Question(models.Model):
###############################################################################
class FileUpload(models.Model):
file = models.FileField(upload_to=get_upload_dir, blank=True)
- question = models.ForeignKey(Question, related_name="question")
+ question = models.ForeignKey(Question, related_name="question",
+ on_delete=models.CASCADE)
extract = models.BooleanField(default=False)
hide = models.BooleanField(default=False)
@@ -1567,7 +1578,7 @@ class Answer(models.Model):
"""Answers submitted by the users."""
# The question for which user answers.
- question = models.ForeignKey(Question)
+ question = models.ForeignKey(Question, on_delete=models.CASCADE)
# The answer submitted by the user.
answer = models.TextField(null=True, blank=True)
@@ -1642,7 +1653,7 @@ class QuestionPaper(models.Model):
"""Question paper stores the detail of the questions."""
# Question paper belongs to a particular quiz.
- quiz = models.ForeignKey(Quiz)
+ quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
# Questions that will be mandatory in the quiz.
fixed_questions = models.ManyToManyField(Question)
@@ -1928,10 +1939,10 @@ class AnswerPaperManager(models.Manager):
def _get_answerpapers_for_quiz(self, questionpaper_id, course_id,
status=False):
if not status:
- return self.filter(question_paper_id=questionpaper_id,
+ return self.filter(question_paper_id__in=questionpaper_id,
course_id=course_id)
else:
- return self.filter(question_paper_id=questionpaper_id,
+ return self.filter(question_paper_id__in=questionpaper_id,
course_id=course_id,
status="completed")
@@ -1973,14 +1984,15 @@ class AnswerPaperManager(models.Manager):
.distinct()
def get_user_all_attempts(self, questionpaper, user, course_id):
- return self.filter(question_paper=questionpaper, user=user,
+ return self.filter(question_paper_id__in=questionpaper, user_id=user,
course_id=course_id)\
.order_by('-attempt_number')
def get_user_data(self, user, questionpaper_id, course_id,
attempt_number=None):
if attempt_number is not None:
- papers = self.filter(user=user, question_paper_id=questionpaper_id,
+ papers = self.filter(user_id=user.id,
+ question_paper_id__in=questionpaper_id,
course_id=course_id,
attempt_number=attempt_number)
else:
@@ -1998,7 +2010,8 @@ class AnswerPaperManager(models.Manager):
def get_user_best_of_attempts_marks(self, quiz, user_id, course_id):
best_attempt = 0.0
- papers = self.filter(question_paper__quiz=quiz, course_id=course_id,
+ papers = self.filter(question_paper__quiz_id=quiz.id,
+ course_id=course_id,
user=user_id).values("marks_obtained")
if papers:
best_attempt = max([marks["marks_obtained"] for marks in papers])
@@ -2010,15 +2023,15 @@ class AnswerPaper(models.Model):
"""A answer paper for a student -- one per student typically.
"""
# The user taking this question paper.
- user = models.ForeignKey(User)
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
questions = models.ManyToManyField(Question, related_name='questions')
# The Quiz to which this question paper is attached to.
- question_paper = models.ForeignKey(QuestionPaper)
+ question_paper = models.ForeignKey(QuestionPaper, on_delete=models.CASCADE)
# Answepaper will be unique to the course
- course = models.ForeignKey(Course, null=True)
+ course = models.ForeignKey(Course, null=True, on_delete=models.CASCADE)
# The attempt number for the question paper.
attempt_number = models.IntegerField()
@@ -2438,17 +2451,20 @@ class AssignmentUploadManager(models.Manager):
##############################################################################
class AssignmentUpload(models.Model):
- user = models.ForeignKey(User)
- assignmentQuestion = models.ForeignKey(Question)
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ assignmentQuestion = models.ForeignKey(Question, on_delete=models.CASCADE)
assignmentFile = models.FileField(upload_to=get_assignment_dir)
- question_paper = models.ForeignKey(QuestionPaper, blank=True, null=True)
- course = models.ForeignKey(Course, null=True, blank=True)
+ question_paper = models.ForeignKey(QuestionPaper, blank=True, null=True,
+ on_delete=models.CASCADE)
+ course = models.ForeignKey(Course, null=True, blank=True,
+ on_delete=models.CASCADE)
objects = AssignmentUploadManager()
##############################################################################
class TestCase(models.Model):
- question = models.ForeignKey(Question, blank=True, null=True)
+ question = models.ForeignKey(Question, blank=True, null=True,
+ on_delete=models.CASCADE)
type = models.CharField(max_length=24, choices=test_case_types, null=True)
@@ -2585,10 +2601,11 @@ class TestCaseOrder(models.Model):
"""
# Answerpaper of the user.
- answer_paper = models.ForeignKey(AnswerPaper, related_name="answer_paper")
+ answer_paper = models.ForeignKey(AnswerPaper, related_name="answer_paper",
+ on_delete=models.CASCADE)
# Question in an answerpaper.
- question = models.ForeignKey(Question)
+ question = models.ForeignKey(Question, on_delete=models.CASCADE)
# Order of the test case for a question.
order = models.TextField()