Skip to content

Commit 7f4cbd4

Browse files
committed
few updates
1 parent 5b7a035 commit 7f4cbd4

File tree

12 files changed

+252
-191
lines changed

12 files changed

+252
-191
lines changed

Dr_R/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
DEBUG = True
2626

2727
ALLOWED_HOSTS = ['*']
28+
CSRF_TRUSTED_ORIGINS = ['https://*.mars-valpo.com']
2829

2930

3031
# Application definition
@@ -39,7 +40,7 @@
3940
'django.contrib.sessions',
4041
'django.contrib.messages',
4142
'django.contrib.staticfiles',
42-
'django_extensions'
43+
'django_extensions',
4344
]
4445

4546
MIDDLEWARE = [

astros/templates/astros/login.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<input class="btn btn-primary r" type="submit" value="Login">
2828
<input type="hidden" name="next" value="{{ request.GET.next }}">
2929
</form>
30-
<u class='forgot-password-link'>forgot password?</u>
30+
<ul class='forgot-password-link'>forgot password?</ul>
3131
<br>
3232
<br>
3333
<div class="change-pwd-deimos registration-form cpwd" style="display: none">
@@ -72,7 +72,7 @@
7272
<input class="btn btn-primary r" type="submit" value="Login">
7373
<input type="hidden" name="next" value="{{ request.GET.next }}">
7474
</form>
75-
<u class='forgot-password-link'>forgot password?</u>
75+
<ul class='forgot-password-link'>forgot password?</ul>
7676
<br>
7777
<br>
7878

astros/views.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.shortcuts import render, redirect
2+
from django.contrib.auth.models import User
23
from phobos.models import Course, Professor,EnrollmentCode,CourseInfo
34
from deimos.models import Student, Enrollment
45
from django.contrib.auth.decorators import login_required
@@ -27,12 +28,10 @@ def register(request):
2728
return render(request, 'astros/register.html')
2829

2930
def all_courses(request):
30-
31-
# TODO: you may *need* to user request.user._wrapped instead
3231
try:
33-
courses = Course.objects.all().order_by('-timestamp')
3432
professor = Professor.objects.get(pk=request.user.pk)
35-
is_professor_list = [1 if course.professors.filter(pk = request.user.pk).exists() or course.name=='Question Bank'\
33+
courses = Course.objects.exclude(name='Question Bank').order_by('-timestamp')
34+
is_professor_list = [1 if course.professors.filter(pk = request.user.pk).exists()\
3635
else 0 for course in courses]
3736
context = {
3837
"courses__is_professor": zip(courses, is_professor_list),
@@ -43,8 +42,8 @@ def all_courses(request):
4342
except Professor.DoesNotExist:
4443
pass
4544
try:
46-
courses = Course.objects.exclude(name='Question Bank').order_by('-timestamp')
4745
student = Student.objects.get(pk=request.user.pk)
46+
courses = Course.objects.exclude(name='Question Bank').order_by('-timestamp')
4847
is_student_list = [1 if Enrollment.objects.filter(student=request.user, course=course).exists()\
4948
else 0 for course in courses]
5049
context = {
@@ -66,10 +65,11 @@ def course_enroll(request, course_id, code):
6665
if not Enrollment.objects.filter(student=student, course=course).exists():
6766
# Checking whether code is valid.
6867
try:
69-
code = EnrollmentCode.objects.get(course=course, code=code)
70-
except:
71-
return HttpResponse(json.dumps({'state':False,'response':'Invalid code'}))
72-
if code.expiring_date >= date.today():
68+
enrollment_code = EnrollmentCode.objects.filter(course=course, code=code)
69+
except EnrollmentCode.DoesNotExist:
70+
return HttpResponse(json.dumps({'state': False, 'response': 'Invalid code'}))
71+
72+
if enrollment_code.expiring_date >= date.today():
7373
# If not enrolled, create a new Enrollment instance
7474
enrollment, created = Enrollment.objects.get_or_create(student=student, course=course)
7575
enrollment.save()
@@ -156,7 +156,7 @@ def generate_auth_code(request):
156156
def validate_auth_code(request):
157157
if request.method == "POST":
158158
data = json.loads(request.body)
159-
email = data["email"]
159+
email = data["email"].strip()
160160
str_email = str(email)
161161
code= int(data["code"].strip())
162162
if str_email in code_base:
@@ -166,7 +166,7 @@ def validate_auth_code(request):
166166
if code in valid_codes:
167167
code_base[str_email] = [] # Clearing out the list for that email.
168168
return JsonResponse({'success':True,
169-
'message':'You have been registered successfully.'})
169+
'message':'You will be registered in a couple of seconds.'})
170170
else:
171171
return JsonResponse({'success':False,
172172
'message':'Wrong code. Try again.'})
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 4.2.3 on 2023-11-21 03:20
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('phobos', '0049_remove_question_category_unit_questioncategory'),
10+
('deimos', '0022_assignmentstudent_is_complete'),
11+
]
12+
13+
operations = [
14+
migrations.AlterUniqueTogether(
15+
name='assignmentstudent',
16+
unique_together={('student', 'assignment')},
17+
),
18+
migrations.AlterUniqueTogether(
19+
name='enrollment',
20+
unique_together={('student', 'course')},
21+
),
22+
migrations.AlterUniqueTogether(
23+
name='questionstudent',
24+
unique_together={('student', 'question')},
25+
),
26+
]

deimos/models.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from django.core.validators import MaxValueValidator, MinValueValidator
44
from .utils import *
55
from datetime import date
6+
67
class Student(User):
78
"""
89
Student class to handle students in the platform.
@@ -14,6 +15,9 @@ class Student(User):
1415
assignments = models.ManyToManyField(Assignment, through='AssignmentStudent')
1516
questions = models.ManyToManyField(Question, through='QuestionStudent')
1617

18+
def __str__(self):
19+
return f"First Name: {self.first_name} Last Name: {self.last_name} Email: {self.email}"
20+
1721

1822

1923
class Resource(models.Model):
@@ -66,6 +70,13 @@ class Enrollment(models.Model):
6670
grade = models.FloatField(validators=[MaxValueValidator(100)], default=0, null=True)
6771
registration_date = models.DateTimeField(auto_now_add=True)
6872

73+
class Meta:
74+
unique_together = ('student', 'course')
75+
76+
def __str__(self):
77+
return f'{self.student} enrolled in {self.course}'
78+
79+
6980
class AssignmentStudent(models.Model):
7081
"""
7182
Used to manage `Assigment` - `Student` relationship.
@@ -75,6 +86,9 @@ class AssignmentStudent(models.Model):
7586
grade = models.FloatField(validators=[MaxValueValidator(100)], default=0, null=True)
7687
due_date = models.DateTimeField(null=True, blank=True)
7788
is_complete = models.BooleanField(default=False)
89+
90+
class Meta:
91+
unique_together = ('student', 'assignment')
7892

7993
def get_grade(self):
8094
"""
@@ -100,12 +114,15 @@ def get_grade(self):
100114
self.grade = round((num_points/total) * 100, 2)
101115
else:
102116
self.grade = 0
103-
self.assignment.num_points = total
117+
self.save()
104118
return self.grade
105119

106120
def get_status(self):
107121
return self.is_complete
108122

123+
def __str__(self):
124+
return f"{self.assignment.name} for {self.student}"
125+
109126
def save(self, *args, **kwargs):
110127
if not self.due_date:
111128
self.due_date = self.assignment.due_date
@@ -124,6 +141,9 @@ class QuestionStudent(models.Model):
124141
num_units_attempts = models.IntegerField(default=0, null=True, blank=True, validators=[MinValueValidator(0)])
125142
is_complete = models.BooleanField(default=False)
126143

144+
class Meta:
145+
unique_together = ('student', 'question')
146+
127147
def save(self, *args, **kwargs):
128148
if self.success == True:
129149
self.is_complete = True
@@ -143,6 +163,8 @@ def create_instances(self):
143163
if not parent_question_student.instances_created:
144164
parent_question_student.create_instances()
145165
self.instances_created = True
166+
self.save()
167+
146168
def compute_structural_answer(self):
147169
"""
148170
Computes the answer to the question if it's a `Question` with `Variable` answers.
@@ -236,7 +258,7 @@ def get_num_points(self):
236258
# are not successful. Maybe due to a new functionality
237259
# or the teacher manually giving points for that attempt
238260
total += attempt.num_points
239-
self.num_points = total
261+
self.num_points = total # useless for now. That's why it is not even saved()
240262
return total
241263

242264
def get_num_attempts(self):

deimos/static/deimos/js/answer_question.js

Lines changed: 74 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -30,60 +30,7 @@ document.addEventListener('DOMContentLoaded', ()=> {
3030

3131
previousAttempts.forEach((pA)=>{
3232

33-
const elements = pA.querySelectorAll(".p-attempt");
34-
35-
if (elements.length != 0){
36-
37-
// /console.log(elements);
38-
function showElement(currentIndex, newIndex) {
39-
elements[currentIndex].style.top = '-100%'; // Move the current element up and out of view
40-
elements[currentIndex].style.opacity = '0'; // Fade it out
41-
42-
elements[newIndex].style.top = '0'; // Move the target element to the viewable area
43-
elements[newIndex].style.opacity = '1'; // Fade it in
44-
45-
pA.querySelector('.attempts-container').dataset.index = newIndex; // Update the dataset
46-
}
47-
48-
pA.querySelector('.btn-attempt-down').addEventListener('click', () => {
49-
let currentIndex = parseInt(pA.querySelector('.attempts-container').dataset.index);
50-
let nextIndex = (currentIndex + 1) % elements.length;
51-
showElement(currentIndex, nextIndex);
52-
});
53-
54-
pA.querySelector('.btn-attempt-up').addEventListener('click', () => {
55-
let currentIndex = parseInt(pA.querySelector('.attempts-container').dataset.index);
56-
let prevIndex = (currentIndex - 1 + elements.length) % elements.length;
57-
showElement(currentIndex, prevIndex);
58-
});
59-
60-
61-
pA.querySelector('.open-attempts').addEventListener('click', (event)=>{
62-
if(event.target.classList.contains('closed')){
63-
pA.querySelector('.a-container').style.display = 'flex';
64-
event.target.classList.remove('closed');
65-
}else{
66-
pA.querySelector('.a-container').style.display = 'none';
67-
event.target.classList.add('closed');
68-
}
69-
})
70-
71-
try{
72-
pA.querySelectorAll('.p-attempt').forEach((p)=>{
73-
const content = math.parse(p.querySelector('.attempt-content').value).toTex();
74-
const aUnits = p.querySelector('.attempt-units');
75-
var finalDisplay = content
76-
if(aUnits != null){
77-
finalDisplay = content + ' ' + aUnits.value
78-
}
79-
p.innerHTML = MathJax.tex2chtml(finalDisplay).innerHTML // ;
80-
})
81-
82-
}catch (error){
83-
console.log(error);
84-
}
85-
}
86-
33+
loadAttempts(pA);
8734
})
8835
MathJax.typesetPromise();
8936
})
@@ -401,8 +348,11 @@ document.addEventListener('DOMContentLoaded', ()=> {
401348
// Creating a p tag to contain the attempt and
402349
// displaying in previous attempts
403350
const newAttempt = document.createElement('p');
404-
newAttempt.classList.add('p-attempt')
405-
newAttempt.innerHTML = MathJax.tex2chtml(math.parse(screen.value).toTex() + submitted_units).innerHTML
351+
newAttempt.classList.add('p-attempt');
352+
newAttempt.innerHTML = `
353+
<input type="hidden" class="attempt-content" value="${screen.value}"/>
354+
<input type="hidden" class="attempt-units" value="${submitted_units}"/>
355+
`
406356

407357
fetch(`${baseUrl}/validate_answer/${qid}`, {
408358
method: 'POST',
@@ -422,6 +372,11 @@ document.addEventListener('DOMContentLoaded', ()=> {
422372
displayFeedback(feedbackContainerDiv, 'You already attempted using that answer');
423373
removeAllLights(redLight,yellowLight,greenLight, blueLight);
424374
return;
375+
}else {
376+
// add attempt on previous attempts screen
377+
const previousAttemptsDiv = form.querySelector('.previous-attempts');
378+
previousAttemptsDiv.querySelector('.attempts-container').prepend(newAttempt);
379+
loadAttempts(previousAttemptsDiv);
425380
}
426381
if(requiresUnits){
427382
toggleLight(result.correct,result.too_many_attempts,redLight,yellowLight,
@@ -1155,5 +1110,68 @@ function shuffleArray(array) {
11551110
}
11561111
}
11571112

1113+
1114+
function loadAttempts(attemptDiv){
1115+
const elements = attemptDiv.querySelectorAll(".p-attempt");
1116+
1117+
if (elements.length != 0){
1118+
1119+
// /console.log(elements);
1120+
function showElement(currentIndex, newIndex) {
1121+
elements[currentIndex].style.top = '-100%'; // Move the current element up and out of view
1122+
elements[currentIndex].style.opacity = '0'; // Fade it out
1123+
1124+
elements[newIndex].style.top = '0'; // Move the target element to the viewable area
1125+
elements[newIndex].style.opacity = '1'; // Fade it in
1126+
1127+
attemptDiv.querySelector('.attempts-container').dataset.index = newIndex; // Update the dataset
1128+
}
1129+
1130+
attemptDiv.querySelector('.btn-attempt-down').addEventListener('click', () => {
1131+
let currentIndex = parseInt(attemptDiv.querySelector('.attempts-container').dataset.index);
1132+
let nextIndex = (currentIndex + 1) % elements.length;
1133+
showElement(currentIndex, nextIndex);
1134+
});
1135+
1136+
attemptDiv.querySelector('.btn-attempt-up').addEventListener('click', () => {
1137+
let currentIndex = parseInt(attemptDiv.querySelector('.attempts-container').dataset.index);
1138+
let prevIndex = (currentIndex - 1 + elements.length) % elements.length;
1139+
showElement(currentIndex, prevIndex);
1140+
});
1141+
1142+
1143+
attemptDiv.querySelector('.open-attempts').addEventListener('click', (event)=>{
1144+
if(event.target.classList.contains('closed')){
1145+
attemptDiv.querySelector('.a-container').style.display = 'flex';
1146+
event.target.classList.remove('closed');
1147+
}else{
1148+
attemptDiv.querySelector('.a-container').style.display = 'none';
1149+
event.target.classList.add('closed');
1150+
}
1151+
})
1152+
1153+
try{
1154+
attemptDiv.querySelectorAll('.p-attempt').forEach((p)=>{
1155+
const hiddenInput = p.querySelector('.attempt-content');
1156+
if(hiddenInput != null){
1157+
1158+
const content = math.parse(hiddenInput.value).toTex();
1159+
const aUnits = p.querySelector('.attempt-units');
1160+
var finalDisplay = content
1161+
if(aUnits != null){
1162+
finalDisplay = content + ' ' + aUnits.value
1163+
}
1164+
p.innerHTML = MathJax.tex2chtml(finalDisplay).innerHTML // ;
1165+
1166+
}
1167+
1168+
})
1169+
1170+
}catch (error){
1171+
console.log(error);
1172+
}
1173+
}
1174+
}
1175+
11581176
});
11591177

deimos/templates/deimos/answer_question.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,11 @@ <h3 class="original-size">Question {{question_dict.question.number}}</h3>
281281
<input type="hidden" value="{{attempt.submitted_units}}" class="attempt-units"/>
282282
{% endif %}
283283
</p>
284+
{% empty %}
285+
<p class="p-attempt no-submission">
286+
<input type="hidden" value="N" class="attempt-content"/>
287+
<input type="hidden" value="o\ Previous\ Submission" class="attempt-units"/>
288+
</p>
284289
{% endfor %}
285290
</div>
286291
<div class="button-directions">

0 commit comments

Comments
 (0)