diff --git a/apps/api/views/homework.py b/apps/api/views/homework.py
index 0d7bf12a..26e55f58 100644
--- a/apps/api/views/homework.py
+++ b/apps/api/views/homework.py
@@ -96,7 +96,7 @@ class DefinitionViewSet(ModelViewSet):
queryset = Definition.objects.all()
queryset = Definition.objects.all().prefetch_related(Prefetch(
'custom_questions',
- queryset=Question.objects.order_by('id')))
+ queryset=Question.objects.all()))
serializer_class = DefinitionSerializer
permission_classes = (DefinitionPermissionCheck,)
diff --git a/apps/homework/migrations/0057_auto_20200507_2015.py b/apps/homework/migrations/0057_auto_20200507_2015.py
new file mode 100644
index 00000000..d45f23e6
--- /dev/null
+++ b/apps/homework/migrations/0057_auto_20200507_2015.py
@@ -0,0 +1,22 @@
+# Generated by Django 2.2.10 on 2020-05-07 20:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('homework', '0056_auto_20200507_1944'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='question',
+ options={'ordering': ('question',)},
+ ),
+ migrations.AlterField(
+ model_name='definition',
+ name='description',
+ field=models.TextField(blank=True, null=True),
+ ),
+ ]
diff --git a/apps/homework/models.py b/apps/homework/models.py
index 3b1a79ec..63d1f328 100644
--- a/apps/homework/models.py
+++ b/apps/homework/models.py
@@ -1,4 +1,5 @@
import os
+import re
from decimal import Decimal
from urllib.parse import urlparse
@@ -27,7 +28,7 @@ class Definition(models.Model):
due_date = models.DateTimeField(default=None)
name = models.CharField(default=None, max_length=100, null=False, blank=False)
- description = models.CharField(max_length=300, null=True, blank=True)
+ description = models.TextField(null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True)
questions_only = models.BooleanField(default=False, null=False)
@@ -64,6 +65,10 @@ class Meta:
def __str__(self):
return "{}".format(self.name)
+ @property
+ def has_standard_questions(self):
+ return bool(self.ask_project_url) or bool(self.ask_publication_url) or bool(self.ask_method_name) or bool(self.ask_method_description)
+
def get_challenge_url(self):
parsed_uri = urlparse(self.challenge_url)
scheme = parsed_uri.scheme
@@ -139,6 +144,20 @@ class Submission(models.Model):
def __str__(self):
return "{}".format(self.github_url)
+ @property
+ def nb_viewer_format_submission_url(self):
+ # This property is for prepending the nbviewer domain to the Github URL for Jupyter Notebook submissions.
+ url = self.github_url
+ if self.definition.jupyter_notebook_enabled:
+ if type(url) == str:
+ if not re.match('.*ipynb$', url):
+ return url
+ if not re.match('.*github\.com.*', url):
+ return url
+ url = url.split('github.com')[-1]
+ return f'https://nbviewer.jupyter.org/github{url}'
+ return url
+
@property
def get_challenge_url(self):
if not self.definition.challenge_url:
@@ -257,7 +276,7 @@ def get_total_score(self):
def calculate_grade(self):
total, total_possible = self.get_total_score_total_possible()
- self.text_grade = f"{total}/{total_possible}"
+ self.text_grade = f"{total}/{int(total_possible)}"
if total_possible != 0 and total is not None:
self.overall_grade = total / total_possible
self.save()
@@ -323,6 +342,9 @@ class Question(models.Model):
question = models.TextField()
candidate_answers = JSONField(blank=True, default=list)
+ class Meta:
+ ordering = ('question',)
+
def __str__(self):
return self.question
diff --git a/apps/homework/templates/homework/forms/grade_homework.html b/apps/homework/templates/homework/forms/grade_homework.html
index 2a805bff..26f79120 100644
--- a/apps/homework/templates/homework/forms/grade_homework.html
+++ b/apps/homework/templates/homework/forms/grade_homework.html
@@ -32,36 +32,41 @@
- {% endif %}
- {% if definition.jupyter_notebook_enabled %}
-
-
-
Auto-Grade Score: {{ submission.jupyter_score }} / {{ definition.jupyter_notebook_highest }}
- {% if submission_jupyter_warnings %}
-
Auto-Grade Warnings:
-
- {% for warning in submission_jupyter_warnings %}
- - {{ warning }}
- {% endfor %}
-
- {% endif %}
+ {% if definition.jupyter_notebook_enabled %}
+
+
+
Auto-Grade Score: {{ submission.jupyter_score }} / {{ definition.jupyter_notebook_highest }}
+ {% if submission_jupyter_warnings %}
+
Auto-Grade Warnings:
+
+ {% for warning in submission_jupyter_warnings %}
+ - {{ warning }}
+ {% endfor %}
+
+ {% endif %}
- {% if submission_jupyter_errors %}
-
Auto-Grade Errors:
-
- {% for error in submission_jupyter_errors %}
- - {{ error }}
- {% endfor %}
-
- {% endif %}
-
- {% endif %}
+ {% if submission_jupyter_errors %}
+
Auto-Grade Errors:
+
+ {% for error in submission_jupyter_errors %}
+ - {{ error }}
+ {% endfor %}
+
+ {% endif %}
+
+ {% endif %}
+ {% endif %}
Questions
@@ -81,6 +86,9 @@
Questions
target="_blank" rel="noopener noreferrer"
>{{ submission.publication_url }}{% endif %}
+ {% if not definition.has_standard_questions %}
+
No standard questions defined for this homework.
+ {% endif %}
diff --git a/apps/homework/templates/homework/overview.html b/apps/homework/templates/homework/overview.html
index 3bd41749..144cf713 100644
--- a/apps/homework/templates/homework/overview.html
+++ b/apps/homework/templates/homework/overview.html
@@ -2,6 +2,7 @@
{% extends 'base.html' %}
{% load static %}
{% load homework_tags %}
+{% load chagrade_tags %}
{% block title %}Welcome{% endblock %}
@@ -90,7 +91,7 @@
{% if not definition.questions_only %}
{% if submission.github_url %}
{% else %}
@@ -236,7 +237,9 @@
- {{ grade.text_grade }}
+ {% with grade.calculate_grade as g %}
+ {{ grade.text_grade }}
+ {% endwith %}
Total Grade
@@ -245,7 +248,7 @@
{% if definition.jupyter_notebook_enabled %}
- {{ grade.jupyter_notebook_grade }}/{{ definition.jupyter_notebook_highest }}
+ {{ grade.jupyter_notebook_grade|default:0.0 }}/{{ definition.jupyter_notebook_highest|format_as_int }}
JUPYTER NOTEBOOK GRADE
diff --git a/apps/homework/templates/homework/submission_detail.html b/apps/homework/templates/homework/submission_detail.html
index 5f465bae..f0cf4a47 100644
--- a/apps/homework/templates/homework/submission_detail.html
+++ b/apps/homework/templates/homework/submission_detail.html
@@ -69,7 +69,13 @@
-
+
diff --git a/apps/homework/templates/homework/submission_list.html b/apps/homework/templates/homework/submission_list.html
index 0ac72990..d5efc2ea 100644
--- a/apps/homework/templates/homework/submission_list.html
+++ b/apps/homework/templates/homework/submission_list.html
@@ -87,7 +87,9 @@
Due Date: {{ definition.due_date }}
{% endif %}
{% if submission.github_url %}
-
+
{% else %}
diff --git a/apps/klasses/migrations/0016_auto_20200507_2015.py b/apps/klasses/migrations/0016_auto_20200507_2015.py
new file mode 100644
index 00000000..84d3734b
--- /dev/null
+++ b/apps/klasses/migrations/0016_auto_20200507_2015.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.10 on 2020-05-07 20:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('klasses', '0015_auto_20200326_2135'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='klass',
+ name='description',
+ field=models.TextField(blank=True, default='', null=True),
+ ),
+ ]
diff --git a/apps/klasses/models.py b/apps/klasses/models.py
index a88afb2a..de0f34da 100644
--- a/apps/klasses/models.py
+++ b/apps/klasses/models.py
@@ -35,7 +35,7 @@ class Klass(models.Model):
title = models.CharField(max_length=60, null=False, blank=False, default="New Course")
course_number = models.SlugField(max_length=60, null=False, blank=False)
- description = models.CharField(max_length=300, null=True, blank=True, default="")
+ description = models.TextField(null=True, blank=True, default="")
created = models.DateTimeField(editable=False, default=timezone.now, null=True, blank=True)
modified = models.DateTimeField(default=timezone.now, null=True, blank=True)
diff --git a/apps/klasses/templates/klasses/wizard/grade_homework.html b/apps/klasses/templates/klasses/wizard/grade_homework.html
index 318e3745..ace1c9a4 100644
--- a/apps/klasses/templates/klasses/wizard/grade_homework.html
+++ b/apps/klasses/templates/klasses/wizard/grade_homework.html
@@ -9,9 +9,17 @@
Students
-
- Download CSV
-
+
@@ -87,16 +95,15 @@ Students
{% endfor %}
-
- Not Graded
- Grade Not Published
- Grade Published
- Jupyter Notebook Needs Review
-
+
|