diff --git a/yaksh/forms.py b/yaksh/forms.py
index 01e691d5..08d14090 100644
--- a/yaksh/forms.py
+++ b/yaksh/forms.py
@@ -410,8 +410,8 @@ class Meta:
model = Course
fields = [
'name', 'enrollment', 'active', 'code', 'instructions',
- 'start_enroll_time', 'end_enroll_time', 'grading_system',
- 'view_grade'
+ 'start_enroll_time', 'end_enroll_time', 'start_date_time',
+ 'end_date_time', 'grading_system', 'view_grade'
]
def save(self, commit=True, *args, **kwargs):
@@ -440,9 +440,15 @@ def __init__(self, user, *args, **kwargs):
{'class': form_input_class, 'placeholder': 'Course instructions'}
)
self.fields['start_enroll_time'].widget.attrs.update(
- {'class': form_input_class, 'placeholder': 'Course Start DateTime'}
+ {'class': form_input_class, 'placeholder': 'Enrollment Start DateTime'}
)
self.fields['end_enroll_time'].widget.attrs.update(
+ {'class': form_input_class, 'placeholder': 'Enrollment End DateTime'}
+ )
+ self.fields['start_date_time'].widget.attrs.update(
+ {'class': form_input_class, 'placeholder': 'Course Start DateTime'}
+ )
+ self.fields['end_date_time'].widget.attrs.update(
{'class': form_input_class, 'placeholder': 'Course End DateTime'}
)
self.fields['grading_system'].widget.attrs.update(
diff --git a/yaksh/models.py b/yaksh/models.py
index 8e5562b3..bc55080b 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -950,6 +950,23 @@ class Course(models.Model):
null=True
)
+ # The start date of the course enrollment.
+ start_date_time = models.DateTimeField(
+ "Start Date and Time of the course",
+ default=timezone.now,
+ null=True
+ )
+
+ # The end date and time of the course enrollment
+ end_date_time = models.DateTimeField(
+ "End Date and Time of the course",
+ default=datetime(
+ 2199, 1, 1,
+ tzinfo=pytz.timezone(timezone.get_current_timezone_name())
+ ),
+ null=True
+ )
+
grading_system = models.ForeignKey(GradingSystem, null=True, blank=True,
on_delete=models.CASCADE)
@@ -982,6 +999,11 @@ def get_requests(self):
def is_active_enrollment(self):
return self.start_enroll_time <= timezone.now() < self.end_enroll_time
+ def is_active(self):
+ return self.active and (
+ self.start_date_time <= timezone.now() < self.end_date_time
+ )
+
def enroll(self, was_rejected, *users):
self.students.add(*users)
if not was_rejected:
@@ -3256,7 +3278,7 @@ def has_quiz_time_exhausted(self):
return not self.quiz.active or self.quiz.is_expired()
def is_course_exhausted(self):
- return not self.course.active or not self.course.is_active_enrollment()
+ return not self.course.active or not self.course.is_active()
def is_special_attempt_required(self):
return (self.has_student_attempts_exhausted() or
diff --git a/yaksh/templates/yaksh/quizzes_user.html b/yaksh/templates/yaksh/quizzes_user.html
index 3dfcbac2..27474510 100644
--- a/yaksh/templates/yaksh/quizzes_user.html
+++ b/yaksh/templates/yaksh/quizzes_user.html
@@ -85,7 +85,7 @@
{{title}}
{% endif %}
{% else %}
- {% if course.data.active %}
+ {% if course.is_active %}
{% if course.data.is_active_enrollment %}
{% if course.data.is_self_enroll %}
Enroll
diff --git a/yaksh/views.py b/yaksh/views.py
index 4a6f462d..01fa9ec2 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -207,6 +207,7 @@ def quizlist_user(request, enrolled=None, msg=None):
courses_data.append(
{
'data': course,
+ 'is_active': course.is_active(),
'completion_percentage': _percent,
}
)
@@ -585,7 +586,7 @@ def start(request, questionpaper_id=None, attempt_num=None, course_id=None,
return quizlist_user(request, msg=msg)
# if course is active and is not expired
- if not course.active or not course.is_active_enrollment():
+ if not course.active or not course.is_active():
msg = "{0} is either expired or not active".format(course.name)
if is_moderator(user) and course.is_trial:
return prof_manage(request, msg=msg)
@@ -1104,7 +1105,7 @@ def add_course(request, course_id=None):
def enroll_request(request, course_id):
user = request.user
course = get_object_or_404(Course, pk=course_id)
- if not course.is_active_enrollment() and course.hidden:
+ if not (course.is_active_enrollment() or not course.is_active()) and course.hidden:
msg = (
'Unable to add enrollments for this course, please contact your '
'instructor/administrator.'
@@ -1203,7 +1204,7 @@ def enroll_user(request, course_id, user_id=None, was_rejected=False):
raise Http404('You are not allowed to view this page')
course = get_object_or_404(Course, id=course_id)
- if not course.is_active_enrollment():
+ if not course.is_active_enrollment() or not course.is_active():
msg = (
'Enrollment for this course has been closed,'
' please contact your '
@@ -1245,7 +1246,7 @@ def enroll_reject_user(request,
raise Http404('You are not allowed to view this page')
course = get_object_or_404(Course, id=course_id)
- if not course.is_active_enrollment():
+ if not course.is_active_enrollment() or not course.is_active():
msg = (
'Enrollment for this course has been closed,'
' please contact your '
@@ -2767,7 +2768,7 @@ def show_lesson(request, lesson_id, module_id, course_id):
course = Course.objects.get(id=course_id)
if user not in course.students.all():
raise Http404('This course does not belong to you')
- if not course.active or not course.is_active_enrollment():
+ if not course.is_active() or not course.is_active_enrollment():
msg = "{0} is either expired or not active".format(course.name)
return quizlist_user(request, msg=msg)
learn_module = course.learning_module.get(id=module_id)
@@ -3145,7 +3146,7 @@ def view_module(request, module_id, course_id, msg=None):
if user not in course.students.all():
raise Http404('You are not enrolled for this course!')
context = {}
- if not course.active or not course.is_active_enrollment():
+ if not course.is_active() or not course.is_active_enrollment():
msg = "{0} is either expired or not active".format(course.name)
return course_modules(request, course_id, msg)
learning_module = course.learning_module.get(id=module_id)
@@ -3189,7 +3190,7 @@ def course_modules(request, course_id, msg=None):
msg = 'You are not enrolled for this course!'
return quizlist_user(request, msg=msg)
- if not course.active or not course.is_active_enrollment():
+ if not course.is_active() or not course.is_active_enrollment():
msg = "{0} is either expired or not active".format(course.name)
return quizlist_user(request, msg=msg)
learning_modules = course.get_learning_modules()