Commit 22b71966d2d9b9096da3fd33cc84c9d13d5a3873
1 parent
1b22fd60
Exists in
master
and in
5 other branches
removed matheuslins code, which is represented as the exercise app and checked i…
…f nothing else was affected when removing it
Showing
30 changed files
with
6 additions
and
1018 deletions
Show diff stats
amadeus/settings.py
amadeus/urls.py
... | ... | @@ -23,7 +23,6 @@ urlpatterns = [ |
23 | 23 | url(r'^home/', include('app.urls', namespace = 'app')), |
24 | 24 | url(r'^courses/', include('courses.urls', namespace = 'course')), |
25 | 25 | url(r'^users/', include('users.urls', namespace = 'users')), |
26 | - url(r'^exercise/', include('exercise.urls', namespace = 'exercise')), | |
27 | 26 | url(r'^admin/', admin.site.urls), |
28 | 27 | url(r'^', include('core.urls', namespace = 'core')), |
29 | 28 | #API | ... | ... |
courses/templates/subject/form_view_student.html
1 | -{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises %} | |
1 | +{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access %} | |
2 | 2 | {% professor_subject topic.subject user as professor_links %} |
3 | 3 | |
4 | 4 | {% block javascript %} | ... | ... |
courses/templates/topic/update.html
1 | -{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises course_value_field %} | |
1 | +{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access course_value_field %} | |
2 | 2 | |
3 | 3 | <form class="" id="form_topic_update_{{topic.slug}}" method="post" action=""> |
4 | 4 | {% csrf_token %} |
... | ... | @@ -84,7 +84,6 @@ |
84 | 84 | <ul class="dropdown-menu" aria-labelledby="dLabel"> |
85 | 85 | <li><a href="javascript:createForum('{% url 'course:forum:create' %}', '{{ topic.id }}')">{% trans 'Create Forum' %}</a></li> |
86 | 86 | <li><a href="javascript:modal.get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#requisicoes_ajax');">{% trans 'Create Poll' %}</a></li> |
87 | - <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Delivery Material' %}</a></li> | |
88 | 87 | <li><a href="{% url 'course:exam:create_exam' topic.slug %}">{% trans 'Create exam' %}</a></li> |
89 | 88 | </ul> |
90 | 89 | </div> | ... | ... |
courses/templates/topic/view.html
1 | -{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises %} | |
1 | +{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access %} | |
2 | 2 | <!-- Block with Log info --> |
3 | 3 | <input type="hidden" class="log_id" value="{{ topic_log_id }}" /> |
4 | 4 | <input type="hidden" class="log_url" value="{% url 'course:topic_log' topic.id %}" /> |
... | ... | @@ -51,7 +51,7 @@ |
51 | 51 | <ul class="dropdown-menu" aria-labelledby="dLabel"> |
52 | 52 | <li><a href="javascript:createForum('{% url 'course:forum:create' %}', '{{ topic.id }}')">{% trans 'Create Forum' %}</a></li> |
53 | 53 | <li><a href="javascript:modal.get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#requisicoes_ajax');">{% trans 'Create Poll' %}</a></li> |
54 | - <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Delivery Material' %}</a></li> | |
54 | + | |
55 | 55 | <li><a href="{% url 'course:exam:create_exam' topic.slug %}">{% trans 'Create exam' %}</a></li> |
56 | 56 | </ul> |
57 | 57 | </div> |
... | ... | @@ -61,7 +61,7 @@ |
61 | 61 | <ul> |
62 | 62 | {% list_topic_poll request topic %} |
63 | 63 | {% list_topic_foruns request topic %} |
64 | - {% list_topic_exercise request topic %} | |
64 | + | |
65 | 65 | </ul> |
66 | 66 | </div> |
67 | 67 | {% endif %} | ... | ... |
courses/urls.py
... | ... | @@ -33,7 +33,6 @@ urlpatterns = [ |
33 | 33 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), |
34 | 34 | url(r'^subjects/file-material-view/(?P<slug>[\w_-]+)/$', views.FileMaterialView.as_view(), name='file_material_view'), |
35 | 35 | url(r'^links/',include('links.urls',namespace = 'links')), |
36 | - url(r'^exercise/', include('exercise.urls', namespace='exercise')), | |
37 | 36 | url(r'^topic/(?P<topic>[\w_-]+)/$', views.topic_log, name='topic_log'), |
38 | 37 | url(r'^(?P<slug>[\w_-]+)/', include([ |
39 | 38 | url(r'^$', views.CourseView.as_view(), name='view'), | ... | ... |
courses/views.py
... | ... | @@ -16,7 +16,7 @@ from django.shortcuts import get_object_or_404 |
16 | 16 | from django.urls import reverse |
17 | 17 | from django.utils.translation import ugettext_lazy as _ |
18 | 18 | from django.views import generic |
19 | -from exercise.models import Exercise | |
19 | + | |
20 | 20 | from files.forms import FileForm |
21 | 21 | from files.models import TopicFile |
22 | 22 | from functools import reduce |
... | ... | @@ -623,7 +623,6 @@ class SubjectsView(AccessMixin, LogMixin, generic.ListView): |
623 | 623 | context['course'] = subject.course |
624 | 624 | context['subject'] = subject |
625 | 625 | context['topics'] = Topic.objects.filter(subject = subject) |
626 | - context['exercise'] = Exercise.objects.filter(topic__subject=subject) | |
627 | 626 | context['title'] = subject.name |
628 | 627 | if has_role(self.request.user,'professor') or has_role(self.request.user,'system_admin'): |
629 | 628 | context['files'] = TopicFile.objects.filter(professor__name = self.request.user.name) | ... | ... |
exercise/__init__.py
exercise/admin.py
exercise/apps.py
exercise/forms.py
... | ... | @@ -1,32 +0,0 @@ |
1 | -from .models import Exercise | |
2 | -from django import forms | |
3 | -from django.core.exceptions import ValidationError, FieldError | |
4 | -from django.utils.translation import ugettext_lazy as _ | |
5 | -import requests | |
6 | - | |
7 | - | |
8 | -class ExerciseForm(forms.ModelForm): | |
9 | - | |
10 | - def __init__(self, *args, **kwargs): | |
11 | - super(ExerciseForm, self).__init__(*args, **kwargs) | |
12 | - self.fields["allowed"].required = False | |
13 | - self.fields["allowed"].initial = False | |
14 | - | |
15 | - # def clean_allowed(self): | |
16 | - # if('allowed' in self.data): | |
17 | - # allowed = self.data['allowed'] | |
18 | - # raise forms.ValidationError(_('It is required one these fields.')) | |
19 | - # return True | |
20 | - | |
21 | - class Meta: | |
22 | - model = Exercise | |
23 | - fields = ['name_exercise', 'description', | |
24 | - 'end_date', 'file', 'allowed'] | |
25 | - | |
26 | - | |
27 | -class UpdateExerciseForm(forms.ModelForm): | |
28 | - | |
29 | - class Meta: | |
30 | - model = Exercise | |
31 | - fields = ['name_exercise', 'description', | |
32 | - 'end_date', 'file'] |
exercise/locale/pt_BR/LC_MESSAGES/django.po
... | ... | @@ -1,125 +0,0 @@ |
1 | -# SOME DESCRIPTIVE TITLE. | |
2 | -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER | |
3 | -# This file is distributed under the same license as the PACKAGE package. | |
4 | -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | |
5 | -# | |
6 | -#, fuzzy | |
7 | -msgid "" | |
8 | -msgstr "" | |
9 | -"Project-Id-Version: PACKAGE VERSION\n" | |
10 | -"Report-Msgid-Bugs-To: \n" | |
11 | -"POT-Creation-Date: 2016-11-24 00:05-0300\n" | |
12 | -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | |
13 | -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | |
14 | -"Language-Team: LANGUAGE <LL@li.org>\n" | |
15 | -"Language: \n" | |
16 | -"MIME-Version: 1.0\n" | |
17 | -"Content-Type: text/plain; charset=UTF-8\n" | |
18 | -"Content-Transfer-Encoding: 8bit\n" | |
19 | -"Plural-Forms: nplurals=2; plural=(n > 1);\n" | |
20 | - | |
21 | -#: .\models.py:24 | |
22 | -msgid "Name" | |
23 | -msgstr "Nome" | |
24 | - | |
25 | -#: .\models.py:25 .\templates\exercise\card_topic_exercises.html:11 | |
26 | -msgid "Description" | |
27 | -msgstr "Descrição" | |
28 | - | |
29 | -#: .\models.py:26 .\templates\exercise\card_topic_exercises.html:22 | |
30 | -msgid "Delivery Date" | |
31 | -msgstr "Data de entrega" | |
32 | - | |
33 | -#: .\models.py:28 | |
34 | -msgid "Topic" | |
35 | -msgstr "Tópico" | |
36 | - | |
37 | -#: .\models.py:29 | |
38 | -msgid "Professors" | |
39 | -msgstr "Professores" | |
40 | - | |
41 | -#: .\models.py:30 | |
42 | -msgid "Students" | |
43 | -msgstr "Estudantes" | |
44 | - | |
45 | -#: .\models.py:32 | |
46 | -msgid "Type file" | |
47 | -msgstr "Tipo de arquivo" | |
48 | - | |
49 | -#: .\models.py:33 | |
50 | -msgid "Allowed delivery after end date?" | |
51 | -msgstr "Permitido entregar após a data de término?" | |
52 | - | |
53 | -#: .\templates\exercise\card_list_user.html:23 | |
54 | -#: .\templates\exercise\card_topic_exercises.html:26 | |
55 | -msgid "Grade" | |
56 | -msgstr "Nota" | |
57 | - | |
58 | -#: .\templates\exercise\card_list_user.html:30 | |
59 | -msgid "Give a grade" | |
60 | -msgstr "Dar a nota" | |
61 | - | |
62 | -#: .\templates\exercise\card_list_user.html:37 | |
63 | -msgid "Delivery" | |
64 | -msgstr "Entregar" | |
65 | - | |
66 | -#: .\templates\exercise\card_list_user.html:45 | |
67 | -msgid "Create" | |
68 | -msgstr "Criar" | |
69 | - | |
70 | -#: .\templates\exercise\card_list_user.html:52 | |
71 | -msgid "Create a specific exercise" | |
72 | -msgstr "Criar um exercício específico" | |
73 | - | |
74 | -#: .\templates\exercise\card_topic_exercises.html:15 | |
75 | -msgid "Don't have description" | |
76 | -msgstr "Não possui descrição" | |
77 | - | |
78 | -#: .\templates\exercise\card_topic_exercises.html:34 | |
79 | -msgid "Not yet" | |
80 | -msgstr "Ainda não" | |
81 | - | |
82 | -#: .\templates\exercise\card_topic_exercises.html:41 | |
83 | -msgid "File" | |
84 | -msgstr "Arquivo" | |
85 | - | |
86 | -#: .\templates\exercise\card_topic_exercises.html:45 | |
87 | -msgid "Exercise not yet" | |
88 | -msgstr "Sem exercícios por enquanto" | |
89 | - | |
90 | -#: .\templates\exercise\card_topic_exercises.html:49 | |
91 | -msgid "Teacher waiting corretion" | |
92 | -msgstr "Aguardando correção do professor" | |
93 | - | |
94 | -#: .\templates\exercise\create_exercise.html:8 | |
95 | -msgid "Create a New Material" | |
96 | -msgstr "Criar um novo Material" | |
97 | - | |
98 | -#: .\templates\exercise\create_exercise.html:36 | |
99 | -msgid "Choose your file..." | |
100 | -msgstr "Escolha seu arquivo..." | |
101 | - | |
102 | -#: .\templates\exercise\create_exercise.html:66 | |
103 | -msgid "The file size shouldnt exceed 10MB" | |
104 | -msgstr "O tamanho do arquivo não pode exceder 10MB" | |
105 | - | |
106 | -#: .\templates\exercise\create_exercise.html:72 | |
107 | -#: .\templates\exercise\delete_exercise.html:24 | |
108 | -msgid "Close" | |
109 | -msgstr "Fechar" | |
110 | - | |
111 | -#: .\templates\exercise\create_exercise.html:73 | |
112 | -msgid "Submit" | |
113 | -msgstr "Enviar" | |
114 | - | |
115 | -#: .\templates\exercise\delete_exercise.html:12 | |
116 | -msgid "Delete Exercise" | |
117 | -msgstr "Apagar exercício" | |
118 | - | |
119 | -#: .\templates\exercise\delete_exercise.html:20 | |
120 | -msgid "Are you sure to delete the exercise " | |
121 | -msgstr "Você tem certeza que quer deletar o exercício " | |
122 | - | |
123 | -#: .\templates\exercise\delete_exercise.html:25 | |
124 | -msgid "Delete" | |
125 | -msgstr "Apagar" |
exercise/migrations/0001_initial.py
... | ... | @@ -1,32 +0,0 @@ |
1 | -# -*- coding: utf-8 -*- | |
2 | -# Generated by Django 1.10 on 2016-11-24 15:17 | |
3 | -from __future__ import unicode_literals | |
4 | - | |
5 | -from decimal import Decimal | |
6 | -from django.db import migrations, models | |
7 | -import django.db.models.deletion | |
8 | - | |
9 | - | |
10 | -class Migration(migrations.Migration): | |
11 | - | |
12 | - initial = True | |
13 | - | |
14 | - dependencies = [ | |
15 | - ('core', '0001_initial'), | |
16 | - ] | |
17 | - | |
18 | - operations = [ | |
19 | - migrations.CreateModel( | |
20 | - name='Exercise', | |
21 | - fields=[ | |
22 | - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |
23 | - ('name_exercise', models.CharField(max_length=100, verbose_name='Name')), | |
24 | - ('description', models.TextField(blank=True, verbose_name='Description')), | |
25 | - ('end_date', models.DateField(verbose_name='Delivery Date')), | |
26 | - ('grade', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=20, null=True)), | |
27 | - ('file', models.FileField(upload_to='uploads/%Y/%m/%d')), | |
28 | - ('allowed', models.BooleanField(default=False, verbose_name='Allowed delivery after end date?')), | |
29 | - ('file_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='exercise_type', to='core.MimeType', verbose_name='Type file')), | |
30 | - ], | |
31 | - ), | |
32 | - ] |
exercise/migrations/0002_auto_20161124_1217.py
... | ... | @@ -1,36 +0,0 @@ |
1 | -# -*- coding: utf-8 -*- | |
2 | -# Generated by Django 1.10 on 2016-11-24 15:17 | |
3 | -from __future__ import unicode_literals | |
4 | - | |
5 | -from django.conf import settings | |
6 | -from django.db import migrations, models | |
7 | -import django.db.models.deletion | |
8 | - | |
9 | - | |
10 | -class Migration(migrations.Migration): | |
11 | - | |
12 | - initial = True | |
13 | - | |
14 | - dependencies = [ | |
15 | - ('exercise', '0001_initial'), | |
16 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | |
17 | - ('courses', '0002_auto_20161124_1217'), | |
18 | - ] | |
19 | - | |
20 | - operations = [ | |
21 | - migrations.AddField( | |
22 | - model_name='exercise', | |
23 | - name='professors', | |
24 | - field=models.ManyToManyField(blank=True, related_name='professors_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Professors'), | |
25 | - ), | |
26 | - migrations.AddField( | |
27 | - model_name='exercise', | |
28 | - name='students', | |
29 | - field=models.ManyToManyField(blank=True, related_name='subject_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | |
30 | - ), | |
31 | - migrations.AddField( | |
32 | - model_name='exercise', | |
33 | - name='topic', | |
34 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercise_topic', to='courses.Topic', verbose_name='Topic'), | |
35 | - ), | |
36 | - ] |
exercise/migrations/__init__.py
exercise/models.py
... | ... | @@ -1,36 +0,0 @@ |
1 | -from courses.models import Topic | |
2 | -from decimal import Decimal | |
3 | -from django.db import models | |
4 | -from django.utils.translation import ugettext_lazy as _ | |
5 | -from users.models import User | |
6 | -from core.models import MimeType | |
7 | - | |
8 | -""" | |
9 | - Function to return the path where the file should be saved | |
10 | -""" | |
11 | - | |
12 | - | |
13 | -def file_path(instance, filename): | |
14 | - return '/'.join([instance.topic.subject.course.slug, instance.topic.subject.slug, instance.topic.slug, filename]) | |
15 | - | |
16 | - | |
17 | -""" | |
18 | -It represents the Exercises inside topic. | |
19 | -""" | |
20 | - | |
21 | - | |
22 | -class Exercise(models.Model): | |
23 | - | |
24 | - name_exercise = models.CharField(_('Name'), max_length=100) | |
25 | - description = models.TextField(_('Description'), blank=True) | |
26 | - end_date = models.DateField(_('Delivery Date')) | |
27 | - grade = models.DecimalField(max_digits=20, decimal_places=2, default=Decimal('0.00'), null=True) | |
28 | - topic = models.ForeignKey(Topic, verbose_name=_('Topic'), related_name='exercise_topic') | |
29 | - professors = models.ManyToManyField(User, verbose_name=_('Professors'), related_name='professors_exercise', blank=True) | |
30 | - students = models.ManyToManyField(User, verbose_name=_('Students'), related_name='subject_exercise', blank = True) | |
31 | - file = models.FileField(upload_to='uploads/%Y/%m/%d') | |
32 | - file_type = models.ForeignKey(MimeType, verbose_name=_('Type file'), related_name='exercise_type',null=True) | |
33 | - allowed = models.BooleanField(_('Allowed delivery after end date?'), default=False) | |
34 | - | |
35 | - def __str__(self): | |
36 | - return self.name_exercise |
exercise/static/js/exercise.js
exercise/templates/exercise/card_list_user.html
... | ... | @@ -1,64 +0,0 @@ |
1 | -{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises %} | |
2 | - | |
3 | -<div class="col-md-12 col-sm-12 col-lg-12"> | |
4 | - <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false"> | |
5 | - <div class="group"><div class="panel panel-default"> | |
6 | - <div class="panel-heading topic ui-sortable-handle" role="tab"> | |
7 | - <div class="row"> | |
8 | - <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{user.id}}" href=".collapseTopic-{{user.id}}" aria-expanded="false" aria-controls="collapseTopic-{{user.id}}"> | |
9 | - <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button> | |
10 | - </div> | |
11 | - <div class="col-xs-9 col-md-9 titleTopic"> | |
12 | - <a href="" role="button"> | |
13 | - <h4>{{user|capfirst}}</h4> | |
14 | - </a> | |
15 | - </div> | |
16 | - </div> | |
17 | - </div> | |
18 | - <div class="panel-collapse collapseTopic-{{user.id}} collapse in" role="tabpanel" aria-labelledby="heading_{{user.id}}" aria-expanded="true" aria-hidden="false"> | |
19 | - <div class="panel-body"> | |
20 | - <div class="row"> | |
21 | - <div class="col-md-4"> | |
22 | - <div class="resource_inline"> | |
23 | - <h4>{% trans 'Grade' %}</h4> | |
24 | - </div> | |
25 | - <div class="resource_inline"> | |
26 | - {# dropdown de create exercício #} | |
27 | - <div class="dropdown"> | |
28 | - <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | |
29 | - <ul class="dropdown-menu" aria-labelledby="dLabel"> | |
30 | - <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Give a grade' %}</a></li> | |
31 | - </ul> | |
32 | - </div> | |
33 | - </div> | |
34 | - </div> | |
35 | - <div class="col-md-4"> | |
36 | - <div class="resource_inline"> | |
37 | - <h4>{% trans 'Delivery' %}</h4> | |
38 | - </div> | |
39 | - {% for exercise in exercises %} | |
40 | - <li><a href="{{exercise.file.url}}" target="_blank">{{exercise.name_exercise}}</a></li> | |
41 | - {% endfor %} | |
42 | - </div> | |
43 | - <div class="col-md-4"> | |
44 | - <div class="resource_inline"> | |
45 | - <h4>{% trans 'Create' %}</h4> | |
46 | - </div> | |
47 | - <div class="resource_inline"> | |
48 | - {# dropdown de create exercício #} | |
49 | - <div class="dropdown"> | |
50 | - <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | |
51 | - <ul class="dropdown-menu" aria-labelledby="dLabel"> | |
52 | - <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Create a specific exercise' %}</a></li> | |
53 | - </ul> | |
54 | - </div> | |
55 | - </div> | |
56 | - {% include "exercise/create_exercise.html" %} | |
57 | - </div> | |
58 | - </div> | |
59 | - </div> | |
60 | - </div> | |
61 | - </div> | |
62 | - </div> | |
63 | -</div> | |
64 | -</div> | |
65 | 0 | \ No newline at end of file |
exercise/templates/exercise/card_topic_exercises.html
... | ... | @@ -1,59 +0,0 @@ |
1 | -{% load static widget_tweaks i18n %} | |
2 | - | |
3 | -<div class="col-lg-4 col-xs-4 col-sm-4"> | |
4 | - <div class="panel panel-default"> | |
5 | - <div class="panel-body"> | |
6 | - <form class="form-horizontal"> | |
7 | - <fieldset> | |
8 | - <center><legend>{{exercise.name_exercise}}</legend></center> | |
9 | - <div class="container-fluid"> | |
10 | - <div class="form-group"> | |
11 | - <label class="col-md-2 col-xs-2 col-sm-2 control-label">{% trans 'Description' %}: </label><br> | |
12 | - {% if exercise.description%} | |
13 | - {{exercise.description}} | |
14 | - {% else %} | |
15 | - {% trans "Don't have description" %} | |
16 | - {% endif %} | |
17 | - </div> | |
18 | - <div class="form-group"> | |
19 | - | |
20 | - </div> | |
21 | - <div class="form-group"> | |
22 | - <label class="col-md-2 col-xs-2 col-sm-2 control-label">{% trans 'Delivery Date' %}: </label><br>{{exercise.end_date}} | |
23 | - | |
24 | - </div> | |
25 | - <div class="form-group"> | |
26 | - <label for="nota" class="col-md-2 control-label">{% trans 'Grade' %}: | |
27 | - {% if exercise.grade %} | |
28 | - <div class="col-md-4"> | |
29 | - <p id="nota" class="form-control"> | |
30 | - {{exercise.grade}} | |
31 | - </p> | |
32 | - </div> | |
33 | - {% else %} | |
34 | - {% trans 'Not yet' %} | |
35 | - {% endif %} | |
36 | - </label> | |
37 | - </div> | |
38 | - {% if exercise.file %} | |
39 | - <div class="form-group"> | |
40 | - <label for="DelExc" class="col-md-4 control-label"> <i class="fa fa-file-archive-o fa-3x" aria-hidden="true"> | |
41 | - <a href="{{exercise.file.url}}" target="_blank">{% trans 'File' %}</a> | |
42 | - </i> | |
43 | - </div> | |
44 | - {% else %} | |
45 | - <p>{% trans 'Exercise not yet' %}</p> | |
46 | - {% endif %} | |
47 | - {% if not exercise.grade %} | |
48 | - <div class="form-group"> | |
49 | - <label class="col-md-6 control-label"><i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i>{% trans 'Teacher waiting corretion' %} | |
50 | - </div> | |
51 | - {% endif %} | |
52 | - </div> | |
53 | - | |
54 | - </fieldset> | |
55 | - </form> | |
56 | - | |
57 | - </div> | |
58 | - </div> | |
59 | -</div> | |
60 | 0 | \ No newline at end of file |
exercise/templates/exercise/create_exercise.html
... | ... | @@ -1,113 +0,0 @@ |
1 | -{% load widget_tweaks i18n static %} | |
2 | -<!--MODAL CREATE EXERCISE--> | |
3 | -<div class="modal fade" id="createExercisesModal" tabindex="-1" role="dialog" aria-labelledby="createExercise"> | |
4 | - <div class="modal-dialog" role="document"> | |
5 | - <div class="modal-content"> | |
6 | - <div class="modal-header"> | |
7 | - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | |
8 | - <h4 class="modal-title" id="createExercise">{% trans 'Create a New Material' %}</h4> | |
9 | - </div> | |
10 | - <div class="modal-body"> | |
11 | - <!-- Card --> | |
12 | - <form class="form-horizontal" method="post" id="form-exercise" enctype="multipart/form-data"> | |
13 | - {% csrf_token %} | |
14 | - {% if messages %} | |
15 | - {% for message in messages %} | |
16 | - <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert"> | |
17 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
18 | - <span aria-hidden="true">×</span> | |
19 | - </button> | |
20 | - <p>{{ message }}</p> | |
21 | - </div> | |
22 | - {% endfor %} | |
23 | - {% endif %} | |
24 | - <fieldset> | |
25 | - {% for field in form %} | |
26 | - <div class="form-group is-empy{% if form.has_error %} has-error {% endif %} is-fileinput"> | |
27 | - <div class="col-md-12"> | |
28 | - {% if field.field.required %} | |
29 | - <label for="{{ field.auto_id }}" class="control-label">{{ field.label }}<span>*</span></label> | |
30 | - {% else %} | |
31 | - <label for="{{ field.auto_id }}" class=" control-label">{{ field.label }}</label> | |
32 | - {% endif %} | |
33 | - {% if field.auto_id == 'id_file' %} | |
34 | - {% render_field field class='form-control input-sm' %} | |
35 | - <div class="input-group"> | |
36 | - <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your file...' %}"> | |
37 | - <span class="input-group-btn input-group-sm"> | |
38 | - <button type="button" class="btn btn-fab btn-fab-mini"> | |
39 | - <i class="material-icons">attach_file</i> | |
40 | - </button> | |
41 | - </span> | |
42 | - </div> | |
43 | - {% else %} | |
44 | - {% render_field field class='form-control input-sm' %} | |
45 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | |
46 | - {% endif %} | |
47 | - </div> | |
48 | - | |
49 | - {% if field.errors %} | |
50 | - <div class="alert alert-danger alert-dismissible clearfix" role="alert"> | |
51 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
52 | - <span aria-hidden="true">×</span> | |
53 | - </button> | |
54 | - <ul> | |
55 | - {% for error in field.errors %} | |
56 | - <li>{{ error }}</li> | |
57 | - {% endfor %} | |
58 | - </ul> | |
59 | - </div> | |
60 | - {% endif %} | |
61 | - </div> | |
62 | - {% endfor %} | |
63 | - | |
64 | - <div class="form-group"> | |
65 | - <div class="col-md-12 text-center"> | |
66 | - <p><b>{% trans 'The file size shouldnt exceed 10MB' %}</b></p> | |
67 | - </div> | |
68 | - </div> | |
69 | - | |
70 | - <div class="form-group"> | |
71 | - <div class="col-md-12"> | |
72 | - <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | |
73 | - <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button> | |
74 | - </div> | |
75 | - </div> | |
76 | - </fieldset> | |
77 | - </form> | |
78 | - <!-- .end Card --> | |
79 | - </div> | |
80 | - </div> | |
81 | - </div> | |
82 | -</div> | |
83 | -<!-- EndModal --> | |
84 | -<script type="text/javascript"> | |
85 | - $("#form-exercise").submit(function(event) { | |
86 | - $("#createExercisesModal").modal("hide"); | |
87 | - var data = new FormData($('#form-exercise').get(0)); | |
88 | - $.ajax({ | |
89 | - url: "{% url 'course:exercise:create_exercise' topic.slug %}", | |
90 | - type: $("#form-exercise").attr('method'), | |
91 | - data: data, | |
92 | - cache: false, | |
93 | - processData: false, | |
94 | - contentType: false, | |
95 | - success: function(data) { | |
96 | - $('#createExercisesModal').modal('hide'); | |
97 | - $('#list-topic{{ topic.id }}-exercises').append(data); | |
98 | - $('#list-topic{{ topic.id }}-exercises-edit').append(data); | |
99 | - alertify.success('Exercise successfully created!') | |
100 | - setTimeout(function () { location.reload(1); }, 1000); | |
101 | - }, | |
102 | - error: function(data){ | |
103 | - $('#requisicoes_ajax').empty(); | |
104 | - $('#requisicoes_ajax').append(data.responseText); | |
105 | - $('#createExercisesModal').modal('show'); | |
106 | - alertify.alert('Invalid exercise, insert a valid one!'); | |
107 | - $('div.modal-backdrop.fade.in').remove(); | |
108 | - | |
109 | - } | |
110 | - }); | |
111 | - event.preventDefault(); | |
112 | - }); | |
113 | -</script> |
exercise/templates/exercise/delete_exercise.html
... | ... | @@ -1,66 +0,0 @@ |
1 | -{% load static widget_tweaks i18n %} | |
2 | - | |
3 | -<!-- MODAL DELETE LINK --> | |
4 | -<exercise rel="stylesheet" type="text/css" href="{% static 'css/exercise.css' %}"> | |
5 | - | |
6 | -<div class="erro-update"> | |
7 | - <div class="modal fade" id="exerciseDeleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteExerciseLabel" style="z-index: 10"> | |
8 | - <div class="modal-dialog" role="document"> | |
9 | - <div class="modal-content"> | |
10 | - <div class="modal-header"> | |
11 | - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | |
12 | - <h4 class="modal-title" id="deleteExerciseLabel">{% trans 'Delete Exercise' %}</h4> | |
13 | - </div> | |
14 | - <div class="modal-body"> | |
15 | - <!-- Card --> | |
16 | - <form class="form-horizontal" method="post" id="form-delete-exercise" enctype="multipart/form-data"> | |
17 | - {% csrf_token %} | |
18 | - <fieldset> | |
19 | - <div class="col-md-12"> | |
20 | - {% trans "Are you sure to delete the exercise " %} <strong>"{{ exercise.name }}"</strong> </a> of {{ exercise.topic.name }}? | |
21 | - </div> | |
22 | - <div class="form-group"> | |
23 | - <div class="col-md-12"> | |
24 | - <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | |
25 | - <button class="btn btn-raised btn-primary" type="submit">{% trans 'Delete' %}</button> | |
26 | - </div> | |
27 | - </div> | |
28 | - </fieldset> | |
29 | - </form> | |
30 | - <!-- .end Card --> | |
31 | - </div> | |
32 | - </div> | |
33 | - </div> | |
34 | - </div> | |
35 | -</div> | |
36 | - <script src="{% static 'js/exercise.js' %}"></script> | |
37 | - <script type="text/javascript"> | |
38 | - $("#form-delete-exercise").submit(function(event) { | |
39 | - var data = new FormData($('#form-delete-exercise').get(0)); | |
40 | - $('#exerciseDeleteModal').modal('hide'); | |
41 | - $.ajax({ | |
42 | - url: "{% url 'course:exercises:delete_exercise' exercise.slug %}", | |
43 | - type: $("#form-delete-exercise").attr('method'), | |
44 | - data: data, | |
45 | - cache: false, | |
46 | - processData: false, | |
47 | - contentType: false, | |
48 | - success: function(data) { | |
49 | - $('#requisicoes_ajax').empty(); | |
50 | - $('#exercise_{{ exercise.slug }}').remove(); | |
51 | - $('#exercise_edit_icon_{{ exercise.slug }}').remove(); | |
52 | - $('#exercise_edit_{{ exercise.slug }}').remove(); | |
53 | - alertify.alert('Exercise successfully deleted!') | |
54 | - }, | |
55 | - error: function(data){ | |
56 | - $("div.modal-backdrop.fade.in").remove(); | |
57 | - $('#requisicoes_ajax').empty(); | |
58 | - $('#requisicoes_ajax').append(data.responseText); | |
59 | - $('#exerciseDeleteModal').modal('show'); | |
60 | - alertify.alert('Error when trying to delete.'); | |
61 | - } | |
62 | - }); | |
63 | - event.preventDefault(); | |
64 | - }); | |
65 | - </script> | |
66 | -<!-- EndModal --> |
exercise/templates/exercise/exercise_edit.html
... | ... | @@ -1,7 +0,0 @@ |
1 | -{% load static i18n list_topic_foruns permission_tags %} | |
2 | -<div id="exercise-topic{{ topic.id }}-exercises-edit"> | |
3 | - {% for exercise in exercises %} | |
4 | - <li class="icon_edit_remove" id = "exercise_edit_icon_{{ exercise.slug }}"> <a href="javascript:modal.get('{% url 'course:exercise:update_exercise' exercise.slug %}', '#exercisesModalEdit', '#requisicoes_ajax')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('', '#exerciseDeleteModal', '#requisicoes_ajax')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li> | |
5 | - <li id = "exercise_edit_{{ exercise.slug }}"><i class="fa fa-file" aria-hidden="true"></i> <a href="javascript:modal.get('', '#viewExerciseModal','#requisicoes_ajax')">{{exercise.name_exercise}}</a></li> | |
6 | - {% endfor %} | |
7 | -</div> |
exercise/templates/exercise/exercise_list.html
... | ... | @@ -1,6 +0,0 @@ |
1 | -{% load static i18n list_topic_foruns permission_tags %} | |
2 | -<div id="list-topic{{ topic.id }}-exercises"> | |
3 | -{% for exercise in exercises %} | |
4 | - <li id="exercise_{{ exercise.slug }}"><i class="fa fa-file" aria-hidden="true"></i> <a href="{{exercise.file.url}}">{{exercise.name_exercise}}</a></li> | |
5 | -{% endfor %} | |
6 | -</div> |
exercise/templates/exercise/render_exercise.html
exercise/templates/exercise/update_exercise.html
... | ... | @@ -1,120 +0,0 @@ |
1 | -{% load static widget_tweaks i18n %} | |
2 | - | |
3 | -<!-- MODAL CREATE FILE --> | |
4 | -<link rel="stylesheet" type="text/css" href="{% static 'css/file.css' %}"> | |
5 | - | |
6 | -<div class="erro-update"> | |
7 | - <div class="modal fade" id="exercisesModalEdit" tabindex="-1" role="dialog" aria-labelledby="updateFileLabel" style="z-index: 10"> | |
8 | - <div class="modal-dialog" role="document"> | |
9 | - <div class="modal-content"> | |
10 | - <div class="modal-header"> | |
11 | - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | |
12 | - <h4 class="modal-title" id="updateFileLabel">{% trans 'Edit Material' %}</h4> | |
13 | - </div> | |
14 | - <div class="modal-body"> | |
15 | - <!-- Card --> | |
16 | - <form class="form-horizontal" method="post" id="form-update-exercise" enctype="multipart/form-data"> | |
17 | - {% csrf_token %} | |
18 | - {% if messages %} | |
19 | - {% for message in messages %} | |
20 | - <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert"> | |
21 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
22 | - <span aria-hidden="true">×</span> | |
23 | - </button> | |
24 | - <p>{{ message }}</p> | |
25 | - </div> | |
26 | - {% endfor %} | |
27 | - {% endif %} | |
28 | - <fieldset> | |
29 | - {% for field in form %} | |
30 | - <div class="form-group is-empy{% if form.has_error %} has-error {% endif %} is-fileinput"> | |
31 | - <div class="col-md-12"> | |
32 | - {% if field.field.required %} | |
33 | - <label for="{{ field.auto_id }}" class="control-label">{{ field.label }}<span>*</span></label> | |
34 | - {% else %} | |
35 | - <label for="{{ field.auto_id }}" class=" control-label">{{ field.label }}</label> | |
36 | - {% endif %} | |
37 | - {% if field.auto_id == 'id_file' %} | |
38 | - <input class="form-control input-sm" id="id_file_url" name="file_url" type="file"> | |
39 | - <div class="input-group"> | |
40 | - <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your file...' %}"> | |
41 | - <span class="input-group-btn input-group-sm"> | |
42 | - <button type="button" class="btn btn-fab btn-fab-mini"> | |
43 | - <i class="material-icons">attach_file</i> | |
44 | - </button> | |
45 | - </span> | |
46 | - </div> | |
47 | - <div class="crearfix"> | |
48 | - <a href="{{ file.file_url.url }}" target="_blank">{% trans "See current file" %}</a> | |
49 | - </div> | |
50 | - {% else %} | |
51 | - {% render_field field class='form-control input-sm' %} | |
52 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | |
53 | - {% endif %} | |
54 | - </div> | |
55 | - | |
56 | - {% if field.errors %} | |
57 | - <div class="alert alert-danger alert-dismissible clearfix" role="alert"> | |
58 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
59 | - <span aria-hidden="true">×</span> | |
60 | - </button> | |
61 | - <ul> | |
62 | - {% for error in field.errors %} | |
63 | - <li>{{ error }}</li> | |
64 | - {% endfor %} | |
65 | - </ul> | |
66 | - </div> | |
67 | - {% endif %} | |
68 | - </div> | |
69 | - {% endfor %} | |
70 | - | |
71 | - <div class="form-group"> | |
72 | - <div class="col-md-12 text-center"> | |
73 | - <p><b>{% trans 'The file size shouldnt exceed 10MB' %}</b></p> | |
74 | - </div> | |
75 | - </div> | |
76 | - | |
77 | - <div class="form-group"> | |
78 | - <div class="col-md-12"> | |
79 | - <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | |
80 | - <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button> | |
81 | - </div> | |
82 | - </div> | |
83 | - </fieldset> | |
84 | - </form> | |
85 | - <!-- .end Card --> | |
86 | - </div> | |
87 | - </div> | |
88 | - </div> | |
89 | - </div> | |
90 | -</div> | |
91 | - | |
92 | -{% block script_file %} | |
93 | - | |
94 | - {# // <script src="{% static 'js/file.js' %}"></script> #} | |
95 | - <script type="text/javascript"> | |
96 | - $("#form-update-exercise").submit(function(event) { | |
97 | - var data = new FormData($('#form-update-exercise').get(0)); | |
98 | - $.ajax({ | |
99 | - url: "{% url 'course:exercise:update_exercise' exercise.slug %}", | |
100 | - type: $("#form-update-exercise").attr('method'), | |
101 | - data: data, | |
102 | - cache: false, | |
103 | - processData: false, | |
104 | - contentType: false, | |
105 | - success: function(data) { | |
106 | - $('#Carrinho').modal('hide'); | |
107 | - $('#file_edit_{{ exercise.slug }}').replaceWith(data); | |
108 | - $('#file_{{ exercise.slug }}').replaceWith(data); | |
109 | - }, | |
110 | - error: function(data){ | |
111 | - $('.erro-update').html(data.responseText); | |
112 | - $('.modal-backdrop').remove(); | |
113 | - $('#Carrinho').modal(); | |
114 | - } | |
115 | - }); | |
116 | - event.preventDefault(); | |
117 | - }); | |
118 | - </script> | |
119 | -{% endblock script_file %} | |
120 | -<!-- EndModal --> | |
121 | 0 | \ No newline at end of file |
exercise/templatetags/__init__.py
exercise/templatetags/list_topic_exercises.py
... | ... | @@ -1,25 +0,0 @@ |
1 | -from django import template | |
2 | -from exercise.models import Exercise | |
3 | - | |
4 | -register = template.Library() | |
5 | - | |
6 | - | |
7 | -@register.inclusion_tag('exercise/exercise_list.html') | |
8 | -def list_topic_exercise(request, topic): | |
9 | - context = { | |
10 | - 'request': request, | |
11 | - } | |
12 | - context['exercises'] = Exercise.objects.filter(topic=topic) | |
13 | - | |
14 | - return context | |
15 | - | |
16 | - | |
17 | -@register.inclusion_tag('exercise/exercise_edit.html') | |
18 | -def list_topic_exercise_edit(request, topic): | |
19 | - context = { | |
20 | - 'request': request, | |
21 | - } | |
22 | - context['exercises'] = Exercise.objects.filter(topic=topic) | |
23 | - context['topic'] = topic | |
24 | - | |
25 | - return context |
exercise/tests.py
exercise/urls.py
... | ... | @@ -1,9 +0,0 @@ |
1 | -from django.conf.urls import url | |
2 | -from . import views | |
3 | - | |
4 | -urlpatterns = [ | |
5 | - url(r'^create_exercise/(?P<slug>[\w_-]+)/$', views.CreateExercise.as_view(), name='create_exercise'), | |
6 | - url(r'^delete_exercise/(?P<slug>[\w_-]+)/$', views.DeleteExercise.as_view(), name='delete_exercise'), | |
7 | - url(r'^update_exercise/(?P<slug>[\w_-]+)/$', views.UpdateExercise.as_view(), name='update_exercise'), | |
8 | - url(r'^render-exercise/(?P<id>[0-9]+)/$', views.render_exercise, name='render_exercise'), | |
9 | -] |
exercise/views.py
... | ... | @@ -1,253 +0,0 @@ |
1 | -from .forms import ExerciseForm, UpdateExerciseForm | |
2 | -from .models import Exercise | |
3 | -from core.decorators import log_decorator | |
4 | -from core.mixins import LogMixin, NotificationMixin | |
5 | -from core.models import Log, MimeType | |
6 | -from courses.models import Topic | |
7 | -from datetime import datetime | |
8 | -from django.conf import settings | |
9 | -from django.contrib import messages | |
10 | -from django.contrib.auth.mixins import LoginRequiredMixin | |
11 | -from django.core.urlresolvers import reverse_lazy | |
12 | -from django.shortcuts import render, get_object_or_404, redirect | |
13 | -from django.urls import reverse | |
14 | -from django.views import generic | |
15 | -from files.utils import mime_type_to_material_icons | |
16 | -from rolepermissions.mixins import HasRoleMixin | |
17 | -from rolepermissions.verifications import has_role | |
18 | -from users.models import User | |
19 | - | |
20 | - | |
21 | -class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView): | |
22 | - log_component = 'exercise' | |
23 | - log_resource = 'exercise' | |
24 | - log_action = 'create' | |
25 | - log_component = {} | |
26 | - | |
27 | - allowed_roles = ['professor', 'student'] | |
28 | - login_url = reverse_lazy("core:home") | |
29 | - redirect_field_name = 'next' | |
30 | - model = Exercise | |
31 | - template_name = 'exercise/create_exercise.html' | |
32 | - form_class = ExerciseForm | |
33 | - success_url = reverse_lazy('course:exercise:render_exercise') | |
34 | - | |
35 | - log_component = "subject" | |
36 | - log_resource = "exercise" | |
37 | - log_action = "create" | |
38 | - log_context = {} | |
39 | - | |
40 | - def form_invalid(self, form, **kwargs): | |
41 | - context = super(CreateExercise, self).form_invalid(form) | |
42 | - context.status_code = 400 | |
43 | - | |
44 | - return context | |
45 | - | |
46 | - def form_valid(self, form): | |
47 | - self.object = form.save(commit = False) | |
48 | - topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | |
49 | - self.object.topic = topic | |
50 | - | |
51 | - # Set MimeType | |
52 | - exercise = self.request.FILES['file'] | |
53 | - try: | |
54 | - if exercise: | |
55 | - exercise_type = exercise.content_type | |
56 | - | |
57 | - # Check if exist a mimetype in database | |
58 | - try: | |
59 | - self.object.file_type = MimeType.objects.get(typ = exercise_type) | |
60 | - # Create if not | |
61 | - except: | |
62 | - mtype = MimeType.objects.create( | |
63 | - typ = exercise_type, | |
64 | - icon = mime_type_to_material_icons[exercise_type] | |
65 | - ) | |
66 | - mtype.save() | |
67 | - self.object.file_type = mtype | |
68 | - except: | |
69 | - print('Exercise not uploaded') | |
70 | - | |
71 | - self.object.save() | |
72 | - self.object.professors = topic.subject.professors.all() | |
73 | - self.object.students = topic.subject.students.all() | |
74 | - self.object.save() | |
75 | - #CREATE LOG | |
76 | - self.log_context['topic_id'] = topic.id | |
77 | - self.log_context['topic_name'] = topic.name | |
78 | - self.log_context['topic_slug'] = topic.slug | |
79 | - self.log_context['subject_id'] = topic.subject.id | |
80 | - self.log_context['subject_name'] = topic.subject.name | |
81 | - self.log_context['subject_slug'] = topic.subject.slug | |
82 | - | |
83 | - super(CreateExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | |
84 | - | |
85 | - | |
86 | - | |
87 | - #CREATE NOTIFICATION | |
88 | - super(CreateExercise, self).createNotification(message="uploaded a Exercise "+ self.object.name_exercise, actor=self.request.user, | |
89 | - resource_name=self.object.name_exercise, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), | |
90 | - users=self.object.topic.subject.students.all()) | |
91 | - | |
92 | - self.log_context['exercise_id'] = self.object.id | |
93 | - self.log_context['exercise_name'] = self.object.name_exercise | |
94 | - self.log_context['topic_id'] = self.object.topic.id | |
95 | - self.log_context['topic_name'] = self.object.topic.name | |
96 | - self.log_context['topic_slug'] = self.object.topic.slug | |
97 | - self.log_context['subject_id'] = self.object.topic.subject.id | |
98 | - self.log_context['subject_name'] = self.object.topic.subject.name | |
99 | - self.log_context['subject_slug'] = self.object.topic.subject.slug | |
100 | - self.log_context['course_id'] = self.object.topic.subject.course.id | |
101 | - self.log_context['course_name'] = self.object.topic.subject.course.name | |
102 | - self.log_context['course_slug'] = self.object.topic.subject.course.slug | |
103 | - self.log_context['course_category_id'] = self.object.topic.subject.course.category.id | |
104 | - self.log_context['course_category_name'] = self.object.topic.subject.course.category.name | |
105 | - | |
106 | - super(CreateExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | |
107 | - | |
108 | - return self.get_success_url() | |
109 | - | |
110 | - def get_context_data(self, **kwargs): | |
111 | - context = super(CreateExercise, self).get_context_data(**kwargs) | |
112 | - topic = get_object_or_404(Topic, slug=self.kwargs.get('slug')) | |
113 | - context['topic'] = topic | |
114 | - context['subject'] = topic.subject | |
115 | - context['subjects'] = topic.subject.course.subjects.all() | |
116 | - context['form'] = self.form_class | |
117 | - | |
118 | - try: | |
119 | - context['latest_exercise'] = Exercise.objects.latest('id') | |
120 | - except: | |
121 | - pass | |
122 | - return context | |
123 | - | |
124 | - def get_success_url(self): | |
125 | - self.success_url = redirect('course:exercise:render_exercise', id = self.object.id) | |
126 | - | |
127 | - return self.success_url | |
128 | - | |
129 | - | |
130 | -def render_exercise(request, id): | |
131 | - template_name = 'exercise/render_exercise.html' | |
132 | - exercise = get_object_or_404(Exercise, id = id) | |
133 | - | |
134 | - context = { | |
135 | - 'exercise': exercise | |
136 | - } | |
137 | - | |
138 | - log_context = {} | |
139 | - log_context['exercise_id'] = exercise.id | |
140 | - log_context['exercise_name'] = exercise.name_exercise | |
141 | - log_context['topic_id'] = exercise.topic.id | |
142 | - log_context['topic_name'] = exercise.topic.name | |
143 | - log_context['topic_slug'] = exercise.topic.slug | |
144 | - log_context['subject_id'] = exercise.topic.subject.id | |
145 | - log_context['subject_name'] = exercise.topic.subject.name | |
146 | - log_context['subject_slug'] = exercise.topic.subject.slug | |
147 | - log_context['course_id'] = exercise.topic.subject.course.id | |
148 | - log_context['course_name'] = exercise.topic.subject.course.name | |
149 | - log_context['course_slug'] = exercise.topic.subject.course.slug | |
150 | - log_context['course_category_id'] = exercise.topic.subject.course.category.id | |
151 | - log_context['course_category_name'] = exercise.topic.subject.course.category.name | |
152 | - | |
153 | - request.log_context = log_context | |
154 | - | |
155 | - return render(request, template_name, context) | |
156 | - | |
157 | - | |
158 | -class UpdateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView): | |
159 | - log_component = 'exercise' | |
160 | - log_resource = 'exercise' | |
161 | - log_action = 'update' | |
162 | - log_context = {} | |
163 | - | |
164 | - allowed_roles = ['student'] | |
165 | - login_url = reverse_lazy("core:home") | |
166 | - redirect_field_name = 'next' | |
167 | - model = Exercise | |
168 | - template_name = 'exercise/update_exercise.html' | |
169 | - form_class = UpdateExerciseForm | |
170 | - context_object_name = 'exercise' | |
171 | - success_url = reverse_lazy('course:exercise:render_exercise') | |
172 | - | |
173 | - def form_invalid(self, form, **kwargs): | |
174 | - context = super(UpdateExercise, self).form_invalid(form) | |
175 | - context.status_code = 400 | |
176 | - | |
177 | - return context | |
178 | - | |
179 | - | |
180 | - def form_valid(self, form): | |
181 | - self.object = form.save() | |
182 | - | |
183 | - self.log_context['exercise_id'] = self.object.id | |
184 | - self.log_context['exercise_name'] = self.object.name | |
185 | - self.log_context['topic_id'] = self.object.topic.id | |
186 | - self.log_context['topic_name'] = self.object.topic.name | |
187 | - self.log_context['topic_slug'] = self.object.topic.slug | |
188 | - self.log_context['subject_id'] = self.object.topic.subject.id | |
189 | - self.log_context['subject_name'] = self.object.topic.subject.name | |
190 | - self.log_context['subject_slug'] = self.object.topic.subject.slug | |
191 | - self.log_context['course_id'] = self.object.topic.subject.course.id | |
192 | - self.log_context['course_name'] = self.object.topic.subject.course.name | |
193 | - self.log_context['course_slug'] = self.object.topic.subject.course.slug | |
194 | - self.log_context['course_category_id'] = self.object.topic.subject.course.category.id | |
195 | - self.log_context['course_category_name'] = self.object.topic.subject.course.category.name | |
196 | - | |
197 | - super(UpdateExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | |
198 | - | |
199 | - return super(UpdateExercise, self).form_valid(form) | |
200 | - | |
201 | - def get_object(self, queryset=None): | |
202 | - return get_object_or_404(Exercise, slug = self.kwargs.get('slug')) | |
203 | - | |
204 | - def get_success_url(self): | |
205 | - self.success_url = reverse_lazy('course:exercise:render_exercise', args = (self.object.id, )) | |
206 | - | |
207 | - return self.success_url | |
208 | - | |
209 | - | |
210 | -class DeleteExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DeleteView): | |
211 | - log_component = 'exercise' | |
212 | - log_resource = 'exercise' | |
213 | - log_action = 'delete' | |
214 | - log_context = {} | |
215 | - | |
216 | - allowed_roles = ['student'] | |
217 | - login_url = reverse_lazy("core:home") | |
218 | - redirect_field_name = 'next' | |
219 | - model = Exercise | |
220 | - template_name = 'exercise/delete_exercise.html' | |
221 | - | |
222 | - def dispatch(self, *args, **kwargs): | |
223 | - exercise = get_object_or_404(Exercise, slug = self.kwargs.get('slug')) | |
224 | - if(not (exercise.topic.owner == self.request.user) and not(has_role(self.request.user, 'system_admin')) ): | |
225 | - return self.handle_no_permission() | |
226 | - return super(DeleteExercise, self).dispatch(*args, **kwargs) | |
227 | - | |
228 | - def get_context_data(self, **kwargs): | |
229 | - context = super(DeleteExercise, self).get_context_data(**kwargs) | |
230 | - context['course'] = self.object.topic.subject.course | |
231 | - context['subject'] = self.object.topic.subject | |
232 | - context['exercise'] = self.object | |
233 | - context["topic"] = self.object.topic | |
234 | - return context | |
235 | - | |
236 | - def get_success_url(self): | |
237 | - self.log_context['exercise_id'] = self.object.id | |
238 | - self.log_context['exercise_name'] = self.object.name | |
239 | - self.log_context['topic_id'] = self.object.topic.id | |
240 | - self.log_context['topic_name'] = self.object.topic.name | |
241 | - self.log_context['topic_slug'] = self.object.topic.slug | |
242 | - self.log_context['subject_id'] = self.object.topic.subject.id | |
243 | - self.log_context['subject_name'] = self.object.topic.subject.name | |
244 | - self.log_context['subject_slug'] = self.object.topic.subject.slug | |
245 | - self.log_context['course_id'] = self.object.topic.subject.course.id | |
246 | - self.log_context['course_name'] = self.object.topic.subject.course.name | |
247 | - self.log_context['course_slug'] = self.object.topic.subject.course.slug | |
248 | - self.log_context['course_category_id'] = self.object.topic.subject.course.category.id | |
249 | - self.log_context['course_category_name'] = self.object.topic.subject.course.category.name | |
250 | - | |
251 | - super(DeleteExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | |
252 | - | |
253 | - return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) | |
254 | 0 | \ No newline at end of file |