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 @@

Challenge Rules

Link to challenge competition {% if submission.github_url %} - Link to Github repo of submission + Link to Github repo of submission {% endif %} Submission Details
- {% endif %} - {% if definition.jupyter_notebook_enabled %} -

Jupyter Notebook

-
-
Auto-Grade Score: {{ submission.jupyter_score }} / {{ definition.jupyter_notebook_highest }}
- {% if submission_jupyter_warnings %} -
Auto-Grade Warnings:
- - {% endif %} + {% if definition.jupyter_notebook_enabled %} +

Jupyter Notebook

+
+
Auto-Grade Score: {{ submission.jupyter_score }} / {{ definition.jupyter_notebook_highest }}
+ {% if submission_jupyter_warnings %} +
Auto-Grade Warnings:
+ + {% endif %} - {% if submission_jupyter_errors %} -
Auto-Grade Errors:
- - {% endif %} -
- {% endif %} + {% if submission_jupyter_errors %} +
Auto-Grade Errors:
+ + {% 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 @@

Submission Details:

{% if not definition.questions_only %} {% if submission.github_url %}
Github URL for Submission
{% else %} @@ -236,7 +237,9 @@

Submission Details:

- {{ grade.text_grade }} + {% with grade.calculate_grade as g %} + {{ grade.text_grade }} + {% endwith %}
Total Grade @@ -245,7 +248,7 @@

Submission Details:

{% 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 @@
Submission Information
- +
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 @@

Grade Homework

Students

- - Download CSV - +
+ + Download CSV + +
+
Not Graded
+
Grade Not Published
+
Grade Published
+
Jupyter Notebook Needs Review
+
+
@@ -87,16 +95,15 @@

Students

{% endfor %}
-
-
Not Graded
-
Grade Not Published
-
Grade Published
-
Jupyter Notebook Needs Review
-
+ \ No newline at end of file