Commit fa76f97b7ec3f6b6d23e387cb757ec7203fe853d

Authored by Felipe Henrique de Almeida Bormann
1 parent 3c790105
Exists in pdf_file_html and in 1 other branch dev

successfully removed exam app from project

amadeus/settings.py
... ... @@ -56,7 +56,6 @@ INSTALLED_APPS = [
56 56 'app',
57 57 'courses',
58 58 'forum',
59   - 'exam',
60 59 'poll',
61 60 'links',
62 61 'files',
... ...
courses/templates/subject/exam_item_actions.html
... ... @@ -1,20 +0,0 @@
1   -{% load static i18n permission_tags professor_access %}
2   -
3   -<script src="{% static 'js/modals_requisitions.js'%}"></script>
4   -<script src="{% static 'js/modal_exam.js'%}"></script>
5   -
6   -{% for exam in exams %}
7   - {% professor_subject exam.topic.subject request.user as permission%}
8   - {% if permission %}
9   - <li id="exam_{{exam.slug}}"><i class="material-icons">{% trans 'exam' %}</i> <a href="javascript:modal.get('{% url 'course:exam:update_exam' exam.slug %}','#exam','#modal_exam');">{{ exam.name }}</a><a href="javascript:modal.get('{% url 'course:exam:delete_exam' exam.slug %}','#exam','#modal_exam');"><span class="glyphicon glyphicon-remove"></span></a></li>
10   - {% else %}
11   - <li id="exam_{{exam.slug}}"><i class="material-icons">{% trans 'exam' %}</i> <a href="javascript:modal.get('{% url 'course:exam:view_exam' exam.slug %}','#exam','#modal_exam');">{{ exam.name }}</a></li>
12   - {% endif %}
13   - {% endfor %}
14   -{# <button class="btn btn-primary btn-raised" onclick="javascript:modal.get('{% url 'course:exam:create_exam' topic.slug%}','#exam','#modal_exam');">{% trans '+ Create Exam' %}</button> #}
15   -<div class="row" id="modal_exam">
16   -
17   -
18   -
19   -
20   -</div>
courses/templates/topic/topic_card.html
... ... @@ -19,7 +19,6 @@
19 19 </div>
20 20 <ul>
21 21 <div class="foruns_list">
22   - {# {% list_topic_exam request topic %} #}
23 22 {% list_topic_poll request topic %}
24 23 {% list_topic_foruns request topic %}
25 24 </div>
... ...
courses/templates/topic/update.html
... ... @@ -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="{% url 'course:exam:create_exam' topic.slug %}">{% trans 'Create exam' %}</a></li>
88 87 </ul>
89 88 </div>
90 89 </div>
... ...
courses/templates/topic/view.html
... ... @@ -52,7 +52,7 @@
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 54  
55   - <li><a href="{% url 'course:exam:create_exam' topic.slug %}">{% trans 'Create exam' %}</a></li>
  55 +
56 56 </ul>
57 57 </div>
58 58 </div>
... ...
courses/urls.py
... ... @@ -28,7 +28,6 @@ urlpatterns = [
28 28 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'),
29 29 url(r'^forum/', include('forum.urls', namespace = 'forum')),
30 30 url(r'^poll/', include('poll.urls', namespace = 'poll')),
31   - url(r'^exam/', include('exam.urls', namespace = 'exam')),
32 31 url(r'^files/', include('files.urls', namespace = 'file')),
33 32 url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'),
34 33 url(r'^subjects/file-material-view/(?P<slug>[\w_-]+)/$', views.FileMaterialView.as_view(), name='file_material_view'),
... ...
exam/__init__.py
exam/admin.py
... ... @@ -1,21 +0,0 @@
1   -from django.contrib import admin
2   -
3   -from .models import Exam, Answer, AnswersStudent, Question, Alternative
4   -
5   -class ExamAdmin(admin.ModelAdmin):
6   - list_display = ['name', 'slug','begin_date','limit_date']
7   - search_fields = ['name','slug']
8   -
9   -class AnswerAdmin(admin.ModelAdmin):
10   - list_display = ['answer','order']
11   - search_fields = ['answer']
12   -
13   -class AnswersStudentAdmin(admin.ModelAdmin):
14   - list_display = ['student','exam','answered_in']
15   - search_fields = ['student','exam']
16   -
17   -admin.site.register(Exam, ExamAdmin)
18   -admin.site.register(Answer, AnswerAdmin)
19   -admin.site.register(AnswersStudent, AnswersStudentAdmin)
20   -admin.site.register(Question)
21   -admin.site.register(Alternative)
exam/apps.py
... ... @@ -1,5 +0,0 @@
1   -from django.apps import AppConfig
2   -
3   -
4   -class ExamConfig(AppConfig):
5   - name = 'exam'
exam/forms.py
... ... @@ -1,37 +0,0 @@
1   -from django import forms
2   -from django.utils.translation import ugettext_lazy as _
3   -from users.models import User
4   -from .models import Exam
5   -
6   -class ExamForm(forms.ModelForm):
7   -
8   - def __init__(self, *args, **kwargs):
9   - super(ExamForm, self).__init__(*args, **kwargs)
10   - self.fields["all_students"].required = False
11   - self.fields["all_students"].initial = False
12   - self.fields["students"].required = False
13   -
14   - def clean_all_students(self):
15   - if('all_students' not in self.data):
16   - if('students' in self.data):
17   - return False
18   - raise forms.ValidationError(_('It is required one these fields.'))
19   - else:
20   - all_students = self.data['all_students']
21   - if(not all_students):
22   - raise forms.ValidationError(_('It is required one these fields.'))
23   - return True
24   -
25   -
26   - class Meta:
27   - model = Exam
28   - fields = ['name','begin_date','limit_date','students','all_students', 'begin_exam', 'end_exam']
29   -
30   - widgets = {
31   - 'name': forms.TextInput(attrs={'placeholder': 'Exam?'}),
32   - 'begin_date': forms.DateTimeInput(
33   - attrs={'placeholder': _('Start date to resolve the exam')}),
34   - 'limit_date': forms.DateTimeInput(
35   - attrs={'placeholder': _('Maximum date permited to resolve the exam')}),
36   - 'student': forms.Select(),
37   - }
exam/locale/pt_BR/LC_MESSAGES/django.po
... ... @@ -1,190 +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-23 23:58-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   -#: .\forms.py:18 .\forms.py:22
22   -msgid "It is required one these fields."
23   -msgstr "É requerido um destes campos."
24   -
25   -#: .\forms.py:33
26   -msgid "Start date to resolve the exam"
27   -msgstr "Data de início para resolver o exame"
28   -
29   -#: .\forms.py:35
30   -msgid "Maximum date permited to resolve the exam"
31   -msgstr "Data máxima permitida para resolver o exame"
32   -
33   -#: .\models.py:9
34   -msgid "Begin of Course Date"
35   -msgstr "Data de início do curso"
36   -
37   -#: .\models.py:10
38   -msgid "Exibe?"
39   -msgstr "Exibir?"
40   -
41   -#: .\models.py:13 .\models.py:35
42   -msgid "Exam"
43   -msgstr "Exame"
44   -
45   -#: .\models.py:14
46   -msgid "Exams"
47   -msgstr "Exames"
48   -
49   -#: .\models.py:21 .\models.py:27 .\templates\exam\view.html:26
50   -msgid "Answer"
51   -msgstr "Resposta"
52   -
53   -#: .\models.py:22
54   -msgid "Order"
55   -msgstr "Ordem"
56   -
57   -#: .\models.py:23 .\models.py:28
58   -msgid "Answers"
59   -msgstr "Respostas"
60   -
61   -#: .\models.py:34
62   -msgid "Answered"
63   -msgstr "Respondida"
64   -
65   -#: .\models.py:36
66   -msgid "Answers Students"
67   -msgstr "Resposta dos estudantes"
68   -
69   -#: .\models.py:37
70   -msgid "Student"
71   -msgstr "Estudante"
72   -
73   -#: .\models.py:38
74   -msgid "Answered Date"
75   -msgstr "Data da resposta"
76   -
77   -#: .\models.py:41
78   -msgid "Answer Stundent"
79   -msgstr "Resposta do estudante"
80   -
81   -#: .\models.py:42
82   -msgid "Answers Student"
83   -msgstr "Respostas dos estudantes"
84   -
85   -#: .\templates\exam\create.html:13
86   -msgid "Create a Exam"
87   -msgstr "Criar um Exame"
88   -
89   -#: .\templates\exam\create.html:17 .\templates\exam\create.html:19
90   -msgid "Exam Name"
91   -msgstr "Nome do exame"
92   -
93   -#: .\templates\exam\create.html:23
94   -msgid "Exam's begin date"
95   -msgstr "Data de início do exame"
96   -
97   -#: .\templates\exam\create.html:25
98   -msgid "Begin Date"
99   -msgstr "Data de início"
100   -
101   -#: .\templates\exam\create.html:27
102   -msgid "Exam's end date"
103   -msgstr "Data final do exame"
104   -
105   -#: .\templates\exam\create.html:29
106   -msgid "End Date"
107   -msgstr "Data final"
108   -
109   -#: .\templates\exam\create.html:36
110   -msgid "Allow submissions after deadline?"
111   -msgstr "Permitir submissões após o prazo?"
112   -
113   -#: .\templates\exam\create.html:48
114   -msgid "Close"
115   -msgstr "Fechar"
116   -
117   -#: .\templates\exam\create.html:51
118   -msgid "Create"
119   -msgstr "Criar"
120   -
121   -#: .\templates\exam\questions\discursive_question.html:2
122   -#: .\templates\exam\questions\discursive_question.html:4
123   -#: .\templates\exam\questions\multiple_choice_question.html:5
124   -#: .\templates\exam\questions\true_or_false_question.html:20
125   -#: .\templates\exam\questions\true_or_false_question.html:25
126   -msgid "Question"
127   -msgstr "Questão"
128   -
129   -#: .\templates\exam\questions\gap_filling_question.html:2
130   -msgid "Gap Filling Question"
131   -msgstr "Questão de preenchimento de lacunas"
132   -
133   -#: .\templates\exam\questions\multiple_choice_question.html:15
134   -msgid "Alternatives"
135   -msgstr "Alternativas"
136   -
137   -#: .\templates\exam\questions\multiple_choice_question.html:34
138   -#: .\templates\exam\questions\true_or_false_question.html:45
139   -msgid "New Alternative"
140   -msgstr "Nova alternativa"
141   -
142   -#: .\templates\exam\questions\true_or_false_answer.html:9
143   -msgid "Write your alternative"
144   -msgstr "Escreva sua alternativa"
145   -
146   -#: .\templates\exam\questions\true_or_false_question.html:37
147   -msgid "Alternatives: T/F"
148   -msgstr "Alternativas: V/F"
149   -
150   -#: .\templates\exam\remove.html:7
151   -msgid "Delete Exam"
152   -msgstr "Apagar exame"
153   -
154   -#: .\templates\exam\remove.html:15
155   -msgid "Are you sure you want to delete the subject"
156   -msgstr "Você tem certeza que deseja apagar o assunto?"
157   -
158   -#: .\templates\exam\remove.html:20
159   -msgid "Delete"
160   -msgstr "Apagar"
161   -
162   -#: .\templates\exam\update.html:7
163   -msgid "Update a Exam"
164   -msgstr "Atualizar um Exame"
165   -
166   -#: .\templates\exam\update.html:12
167   -msgid "Update"
168   -msgstr "Atualizar"
169   -
170   -#: .\templates\exam\view.html:17
171   -msgid "Limit date:"
172   -msgstr "Data limite:"
173   -
174   -#~ msgid "Question Type"
175   -#~ msgstr "Tipo de questão"
176   -
177   -#~ msgid "Multiple Choice"
178   -#~ msgstr "Múltipla escolha"
179   -
180   -#~ msgid "True or False"
181   -#~ msgstr "Verdadeiro ou falso"
182   -
183   -#~ msgid "Gap Filling"
184   -#~ msgstr "Preenchimento de lacunas"
185   -
186   -#~ msgid "Discursive Question"
187   -#~ msgstr "Questão discursiva"
188   -
189   -#~ msgid "add question"
190   -#~ msgstr "Adicionar questão"
exam/migrations/0001_initial.py
... ... @@ -1,62 +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.db import migrations, models
6   -import django.db.models.deletion
7   -
8   -
9   -class Migration(migrations.Migration):
10   -
11   - initial = True
12   -
13   - dependencies = [
14   - ('courses', '0001_initial'),
15   - ]
16   -
17   - operations = [
18   - migrations.CreateModel(
19   - name='Answer',
20   - fields=[
21   - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22   - ('answer', models.CharField(max_length=300, verbose_name='Answer')),
23   - ('order', models.PositiveSmallIntegerField(verbose_name='Order')),
24   - ],
25   - options={
26   - 'verbose_name': 'Answer',
27   - 'verbose_name_plural': 'Answers',
28   - 'ordering': ('order',),
29   - },
30   - ),
31   - migrations.CreateModel(
32   - name='AnswersStudent',
33   - fields=[
34   - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
35   - ('status', models.BooleanField(default=False, verbose_name='Answered')),
36   - ('answered_in', models.DateTimeField(auto_now=True, verbose_name='Answered Date')),
37   - ('answer', models.ManyToManyField(related_name='student_answer', to='exam.Answer', verbose_name='Answers Students')),
38   - ],
39   - options={
40   - 'verbose_name': 'Answer Stundent',
41   - 'verbose_name_plural': 'Answers Student',
42   - },
43   - ),
44   - migrations.CreateModel(
45   - name='Exam',
46   - fields=[
47   - ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')),
48   - ('begin_date', models.DateField(blank=True, verbose_name='Begin of Course Date')),
49   - ('exibe', models.BooleanField(default=False, verbose_name='Exibe?')),
50   - ],
51   - options={
52   - 'verbose_name': 'Exam',
53   - 'verbose_name_plural': 'Exams',
54   - },
55   - bases=('courses.activity',),
56   - ),
57   - migrations.AddField(
58   - model_name='answersstudent',
59   - name='exam',
60   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_exam', to='exam.Exam', verbose_name='Exam'),
61   - ),
62   - ]
exam/migrations/0002_auto_20161124_1217.py
... ... @@ -1,30 +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   - migrations.swappable_dependency(settings.AUTH_USER_MODEL),
16   - ('exam', '0001_initial'),
17   - ]
18   -
19   - operations = [
20   - migrations.AddField(
21   - model_name='answersstudent',
22   - name='student',
23   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
24   - ),
25   - migrations.AddField(
26   - model_name='answer',
27   - name='exam',
28   - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'),
29   - ),
30   - ]
exam/migrations/0003_auto_20161125_0808.py
... ... @@ -1,28 +0,0 @@
1   -# -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-25 11:08
3   -from __future__ import unicode_literals
4   -
5   -from django.db import migrations, models
6   -import django.utils.timezone
7   -
8   -
9   -class Migration(migrations.Migration):
10   -
11   - dependencies = [
12   - ('exam', '0002_auto_20161124_1217'),
13   - ]
14   -
15   - operations = [
16   - migrations.AddField(
17   - model_name='exam',
18   - name='begin_exam',
19   - field=models.DateField(blank=True, default=django.utils.timezone.now, verbose_name='Begin of Exam'),
20   - preserve_default=False,
21   - ),
22   - migrations.AddField(
23   - model_name='exam',
24   - name='end_exam',
25   - field=models.DateField(blank=True, default=django.utils.timezone.now, verbose_name='End of Exam'),
26   - preserve_default=False,
27   - ),
28   - ]
exam/migrations/__init__.py
exam/models.py
... ... @@ -1,56 +0,0 @@
1   -from django.utils.translation import ugettext_lazy as _
2   -from django.db import models
3   -from autoslug.fields import AutoSlugField
4   -from users.models import User
5   -from core.models import Resource
6   -from courses.models import Activity
7   -
8   -class Exam(Activity):
9   - begin_date = models.DateField(_('Begin of Course Date'), blank=True)
10   - begin_exam = models.DateField(_('Begin of Exam'), blank = True)
11   - end_exam = models.DateField(_('End of Exam'), blank = True)
12   - exibe = models.BooleanField(_('Exibe?'), default=False)
13   -
14   - class Meta:
15   - verbose_name = _('Exam')
16   - verbose_name_plural = _('Exams')
17   -
18   - def __str__(self):
19   - return str(self.name) + str("/") + str(self.topic)
20   -
21   -
22   -class Answer(models.Model):
23   - answer = models.CharField(_("Answer"), max_length = 300)
24   - order = models.PositiveSmallIntegerField(_("Order"))
25   - exam = models.ForeignKey(Exam, verbose_name = _('Answers'), related_name='answers')
26   -
27   - class Meta:
28   - ordering = ('order',)
29   - verbose_name = _('Answer')
30   - verbose_name_plural = _('Answers')
31   -
32   - def __str__(self):
33   - return str(self.answer) + str("/") + str(self.exam)
34   -
35   -class AnswersStudent(models.Model):
36   - status = models.BooleanField(_("Answered"), default=False)
37   - exam = models.ForeignKey(Exam, verbose_name = _('Exam'), related_name='student_exam')
38   - answer = models.ManyToManyField(Answer,verbose_name = _('Answers Students'), related_name='student_answer')
39   - student = models.ForeignKey(User, verbose_name = _('Student'), related_name='student')
40   - answered_in = models.DateTimeField(_("Answered Date"),auto_now=True)
41   -
42   - class Meta:
43   - verbose_name = _('Answer Stundent')
44   - verbose_name_plural = _('Answers Student')
45   -
46   - def __str__(self):
47   - return str(self.student) + str("/") + str(self.exam)
48   -
49   -class Question(models.Model):
50   - exam = models.ForeignKey(Exam, verbose_name=_('Exam'), related_name='question_exam')
51   - statement = models.TextField(_("Statement"), blank=False)
52   -
53   -class Alternative(models.Model):
54   - question = models.ForeignKey(Question, verbose_name=_("Question"), related_name="alternative_question")
55   - statement = models.TextField(_("Statement"), blank=False)
56   - answer = models.BooleanField(_("answer"), default=False)
57 0 \ No newline at end of file
exam/permissions.py
... ... @@ -1,22 +0,0 @@
1   -from rolepermissions.permissions import register_object_checker
2   -from amadeus.roles import SystemAdmin
3   -
4   -@register_object_checker()
5   -def edit_exam(role, user, exam):
6   - if (role == SystemAdmin):
7   - return True
8   -
9   - if (user in exam.topic.subject.professors.all()):
10   - return True
11   -
12   - return False
13   -
14   -@register_object_checker()
15   -def delete_exam(role, user, exam):
16   - if (role == SystemAdmin):
17   - return True
18   -
19   - if (user in exam.topic.subject.professors.all()):
20   - return True
21   -
22   - return False
exam/static/css/exam.css
... ... @@ -1,4 +0,0 @@
1   -.primary-label-TF{
2   - padding-left: 0px;
3   -}
4   -.title-questions-exam{padding-left:1.5%;}
5 0 \ No newline at end of file
exam/static/js/Exam.js
... ... @@ -1,130 +0,0 @@
1   -
2   - //Insert question choice
3   - function showDiv (elem, questionType_id) {
4   - if (elem.value == 0) {
5   - var questionChoice =
6   - '<div id="questionChoice_'+questionType_id+'">' +
7   - '<div class="row form-group">'+
8   - '<label for="question-name" class="col-md-2 control-label">Question</label>'+
9   - '<div class="col-md-10">'+
10   - '<textarea class="form-control" rows="1" id="question-name" placeholder="Wording"></textarea>'+
11   - '</div>'+
12   - '</div>'+
13   - '<div class="row form-group">'+
14   - '<label for="alternatives" class="col-md-2 control-label">Alternatives</label>'+
15   - '<div class="col-md-10" id="radios_'+questionType_id+'">'+
16   - '<div class="radio radio-primary form-group">'+
17   - '<label>'+
18   - '<input checked type="radio" name="multiple-choice" id="alternative1" value="1">'+
19   - '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>'+
20   - '</label>'+
21   - '</div>'+
22   - '<div class="radio radio-primary form-group">'+
23   - '<label>'+
24   - '<input type="radio" name="multiple-choice" id="alternative2" value="2">'+
25   - '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>'+
26   - '</label>'+
27   - '</div>'+
28   - '</div>'+
29   - '</div>'+
30   - '<div class="row form-group">'+
31   - '<div class="col-md-8 col-md-offset-2">'+
32   - '<button type="button" class="btn btn-raised btn-primary" id="newAlternative_'+questionType_id+'" onclick="functionNewAlternative(radios_'+questionType_id+')">New Alternative</button>'+
33   - '</div>'+
34   - '</div>'+
35   - '</div>';
36   - } else if (elem.value == 1) {
37   - var questionChoice =
38   - '<div id="questionChoice_'+questionType_id+'">'+
39   - '<div class="row form-group">'+
40   - '<label for="question-name" class="col-md-2 control-label">Question True or False</label>'+
41   - '<div class="col-md-10">'+
42   - '<textarea class="form-control" rows="1" id="question-name" placeholder="Wording"></textarea>'+
43   - '</div>'+
44   - '</div>'+
45   - '<div class="row form-group">'+
46   - '<label for="alternative" class="col-md-2 control-label">Alternatives: T/F</label>'+
47   - '<div class="col-md-10" id="radiosTF_'+questionType_id+'">'+
48   - '<div class="radio radio-primary form-group" value="1">'+
49   - '<label class="primary-label-TF">'+
50   - '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>'+
51   - '</label>'+
52   - '<label>'+
53   - '<input type="radio" name="true-or-false-1" value="T">'+
54   - '</label>'+
55   - '<label>'+
56   - '<input type="radio" name="true-or-false-1" value="F">'+
57   - '</label>'+
58   - '</div>'+
59   - '<div class="radio radio-primary form-group" value="2">'+
60   - '<label class="primary-label-TF">'+
61   - '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>'+
62   - '</label>'+
63   - '<label>'+
64   - '<input type="radio" name="true-or-false-2" value="T">'+
65   - '</label>'+
66   - '<label>'+
67   - '<input type="radio" name="true-or-false-2" value="F">'+
68   - '</label>'+
69   - '</div>'+
70   - '</div>'+
71   - '</div>'+
72   - '<div class="row form-group">'+
73   - '<div class="col-md-8 col-md-offset-2">'+
74   - '<button type="button" class="btn btn-raised btn-primary" id="newAlternative_'+questionType_id+'" onclick="functionNewAlternativeTF(radiosTF_'+questionType_id+')">New Alternative</button>'+
75   - '</div>'+
76   - '</div>'+
77   - '</div>';
78   - } else if (elem.value == 3) {
79   - var questionChoice =
80   - '<div id="questionChoice_'+questionType_id+'">'+
81   - '<div class="row form-group">'+
82   - '<label for="question-name" class="col-md-2 control-label">Name Question discursive</label>'+
83   - '<div class="col-md-10">'+
84   - '<textarea class="form-control" rows="2" id="question" placeholder="Wording"></textarea>'+
85   - '</div>'+
86   - '</div>'+
87   - '</div>';
88   - }
89   - if(document.getElementById('questionChoice_'+ questionType_id)){
90   - $('#questionChoice_'+ questionType_id).detach();
91   - }
92   - $(questionChoice).insertBefore('#hr_'+questionType_id);
93   - $('.primary-label-TF').css('padding-left', '0px');
94   - $.material.init() //O material deve ser iniciado aqui para funcionar os botoes de radio.
95   - }
96   -//Bug quando criamos sem ser na ordem
97   -function functionNewAlternative(Question_Id){
98   - var alternative = parseInt($(Question_Id).find("input:last").val()) + 1;
99   - var element = '<div class="radio radio-primary form-group">' +
100   - '<label>' +
101   - '<input type="radio" name="alternatives" id="alternative_'+alternative+'_'+Question_Id+'"' + 'value="'+alternative+'">' +
102   - '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>' +
103   - '</label>'+
104   - '</div>';
105   - $(Question_Id).append(element);
106   - $.material.init() //O material deve ser iniciado aqui para funcionar os botoes de radio.
107   -}
108   -function functionNewAlternativeTF(Question_Id){
109   - var alternative = parseInt($('#radiosTF_1').find('div:last').attr('value')) + 1;
110   - var element =
111   - '<div class="radio radio-primary form-group" value="'+alternative+'">'+
112   - '<label class="primary-label-TF" >'+
113   - '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>'+
114   - '</label>'+
115   - '<label>'+
116   - '<input type="radio" name="true-or-false-2" value="T">'+
117   - '</label>'+
118   - '<label>'+
119   - '<input type="radio" name="true-or-false-2" value="F">'+
120   - '</label>'+
121   - '</div>';
122   - $(Question_Id).append(element);
123   - $('.primary-label-TF').css('padding-left', '0px');
124   - $.material.init() //O material deve ser iniciado aqui para funcionar os botoes de radio.
125   -}
126   -var locale = navigator.language || navigator.userLanguage;
127   -
128   - $('.date-picker').datepicker({
129   - language: locale,
130   - });
131 0 \ No newline at end of file
exam/templates/exam/create.html
... ... @@ -1,112 +0,0 @@
1   -{% extends 'subject/index.html' %}
2   -
3   -{% load i18n widget_tweaks static django_bootstrap_breadcrumbs %}
4   -
5   -{% block style %}
6   - <link rel="stylesheet" type="text/css" href="{% static 'css/exam.css' %}">
7   -{% endblock %}
8   -
9   -{% block breadcrumbs %}
10   - {{ block.super }}
11   - {% breadcrumb 'Create exam' 'course:create_exam' %}
12   -{% endblock breadcrumbs %}
13   -
14   -{% block content %}
15   -<div class="panel panel-primary">
16   - <div class="panel-heading">
17   - <h4 class="panel-title" id="exam-title">{% trans "Create a Exam" %}</h4>
18   - </div>
19   - <div class="panel-body">
20   - {% csrf_token %}
21   - {% for field in form %}
22   - {% if field.auto_id != 'id_begin_exam' and field.auto_id != 'id_end_exam' and field.auto_id != 'id_begin_date' and field.auto_id != 'id_limit_date' %}
23   - <div class="row form-group">
24   - {% if field.field.required %}
25   - <label for="{{ field.auto_id }}" class="col-md-2 control-label">{{ field.label }}</label>
26   - {% else %}
27   - <label for="{{ field.auto_id }}" class="col-md-2 control-label">{{ field.label }}</label>
28   - {% endif %}
29   - <div class="col-md-10">
30   - {% if field.auto_id == 'id_all_students' %}
31   - {% render_field field class='form-control input-sm' %}
32   - {% else %}
33   - {% render_field field class='form-control input-sm' %}
34   - {% endif %}
35   - </div>
36   - </div>
37   - {% endif %}
38   - {% endfor %}
39   - <div class="row form-group">
40   - {% for field in form %}
41   - {% if field.auto_id == 'id_begin_date' or field.auto_id == 'id_limit_date' %}
42   - {% if field.field.required %}
43   - <label for="{{ field.auto_id }}" class="col-md-2 control-label">{{ field.label }}</label>
44   - {% else %}
45   - <label for="{{ field.auto_id }}" class="col-md-2 control-label">{{ field.label }}</label>
46   - {% endif %}
47   - <div class="col-md-4">
48   - {% render_field field class='form-control date-picker' %}
49   - </div>
50   - {% endif %}
51   - {% endfor %}
52   - </div>
53   -
54   - <div class="row form-group">
55   - <div class="col-md-10">
56   - <div class="checkbox">
57   - <label>
58   - <input type="checkbox" name="checkbox"><span class="checkbox-material"></span> {% trans "Allow submissions after deadline?" %}
59   - </label>
60   - </div>
61   - </div>
62   - </div>
63   - <div class="row form-group" id="buttonAddQuestion">
64   - <div class="col-md-10">
65   - <button id="addQuestion" type="button" class="btn btn-raised btn-default">Add new question buton</button>
66   - </div>
67   - </div>
68   - </div>
69   - <div class="panel-footer">
70   - <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button>
71   - {% block button_save %}
72   - <!-- Put curtom buttons here!!! -->
73   - <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Create" %}</button>
74   - {% endblock button_save %}
75   - </div>
76   -</div>
77   -
78   -{% block javascript %}
79   - <script type="text/javascript">
80   - //Insert Create select with question type
81   - var idQuestionType = 1;
82   - $("#addQuestion").on("click", function(event){
83   - var title = '<h3 class="title-questions-exam">Choice your questions:</h3><br/>';
84   - var element =
85   - '<div class="row form-group" id="questionType_' + idQuestionType +'">' +
86   - '<label for="questionType" class="col-md-2 control-label">' +
87   - '{% trans "Question Type" %}</label>' + '<div class="col-md-10">' +
88   - '<select id="questionType'+ idQuestionType +'" class="form-control" name="option_question" onchange="showDiv (this, '+ idQuestionType +')">' +
89   - '<option selected disabled>{% trans "Question Type" %}</option>' +
90   - '<option value="0">{% trans "Multiple Choice" %}</option>' +
91   - '<option value="1">{% trans "True or False" %}</option>' +
92   - '<option value="2">{% trans "Gap Filling" %}</option>' +
93   - '<option value="3">{% trans "Discursive Question" %}</option>' +
94   - '</select>' +
95   - '</div>' +
96   - '</div>' + '<hr id="hr_'+idQuestionType+'">'
97   - ;
98   - if (idQuestionType == 1){
99   - $(title).insertBefore('#buttonAddQuestion');
100   - $(element).insertBefore('#buttonAddQuestion');
101   - }else{
102   - var idhr = '#hr_'+(idQuestionType-1);
103   - $(element).insertAfter(idhr);
104   - }
105   - idQuestionType++;
106   - })
107   - </script>
108   - <script src="{% static 'js/Exam.js' %}"></script>
109   - <!-- Init material Bootstrap -->
110   - <script type="text/javascript">$.material.init()</script><!-- O botao radio volta a funcionar quando coloco essa função-->
111   -{% endblock %}
112   -{% endblock content %}
exam/templates/exam/questions/discursive_question.html
... ... @@ -1,6 +0,0 @@
1   -<div class="form-group" id="discursiveQuestion">
2   - <label for="question" class="col-md-2 control-label">{% trans "Question" %}</label>
3   - <div class="col-md-10">
4   - <textarea class="form-control" rows="1" id="question" placeholder="{% trans 'Question' %}"></textarea>
5   - </div>
6   -</div>
exam/templates/exam/questions/gap_filling_answer.html
exam/templates/exam/questions/gap_filling_question.html
... ... @@ -1,3 +0,0 @@
1   -<div class="form-group" id="gapFilling" style="display: none;">
2   - <p>{% trans 'Gap Filling Question' %}</p>
3   -</div>
exam/templates/exam/questions/multiple_choice_answer.html
exam/templates/exam/questions/multiple_choice_question.html
... ... @@ -1,42 +0,0 @@
1   -{% load i18n %}
2   -
3   -<div class="form-group" id="multipleChoice">
4   -
5   - <label for="questionName" class="col-md-2 control-label">{% trans 'Question' %}</label>
6   -
7   -
8   - <div class="col-md-10">
9   - <textarea class="form-control" rows="1" id="questionName" placeholder="Wording"></textarea>
10   - </div>
11   -
12   -
13   -</div>
14   -<div class="form-group">
15   - <label for="alternative" class="col-md-2 control-label">{% trans 'Alternatives' %}</label>
16   - <div class="col-md-10" id="radios">
17   - <div class="radio radio-primary">
18   - <label>
19   - <input checked type="radio" name="alternatives" id="alternative1" value="1">
20   - <textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>
21   - </label>
22   - </div>
23   - <div class="radio radio-primary">
24   - <label>
25   - <input type="radio" name="alternatives" id="alternative2" value="2">
26   - <textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>
27   - </label>
28   - </div>
29   - </div>
30   -</div>
31   -<!-- new alternative button -->
32   -<div class="form-group">
33   - <div class="col-md-12 col-md-offset-2">
34   - <button type="button" class="btn btn-primary" id="newAlternative">{% trans 'New Alternative' %}</button>
35   - </div>
36   -</div>
37   -<div class="form-group">
38   - <div class="col-md-12 col-md-offset-2">
39   - <button type="submit" class="btn btn-primary">Save</button>
40   - <button type="cancel" class="btn btn-default">Cancel</button>
41   - </div>
42   -</div>
exam/templates/exam/questions/true_or_false_answer.html
... ... @@ -1,15 +0,0 @@
1   -{% load i18n %}
2   -
3   -<div class="row form-group" >
4   - <div class="col-md-1">
5   - </br>
6   - <label><span class="glyphicon glyphicon-move"></span></label>
7   - </div>
8   - <div class="col-md-10">
9   - <input class="form-control" placeholder='{% trans "Write your alternative" %}'></input>
10   - </div>
11   - <div class="col-md-1">
12   - </br>
13   - <label><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></label>
14   - </div>
15   -</div>
exam/templates/exam/questions/true_or_false_question.html
... ... @@ -1,67 +0,0 @@
1   -{# {% extends "base.html" %} #}
2   -
3   -{% load i18n %}
4   -{# {% block content %} #}
5   -<style>
6   - .glyphicon-remove:hover {
7   - cursor: pointer;
8   - }
9   - .glyphicon-move:hover {
10   - cursor: move;
11   - }
12   -</style>
13   -<div class="" id="0">
14   - <div class="row form-group">
15   - <div class="col-md-1">
16   - </br>
17   - <label><span class="glyphicon glyphicon-move"></span></label>
18   - </div>
19   - <div class="col-md-2">
20   - <label for="questionName" class="control-label">{% trans "Question" %}</label>
21   - </div>
22   - <div class="col-md-9">
23   - <div class="row">
24   - <div class="col-md-11">
25   - <input class="form-control" id="questionName" placeholder="{% trans 'Question' %}"></input>
26   - </div>
27   - <div class="col-md-1">
28   - </br>
29   - <label><span class="glyphicon glyphicon-remove"></span></label>
30   - </div>
31   - </div>
32   - </div>
33   -
34   - </div>
35   - <div class="row">
36   - <div class="col-md-offset-1 col-md-2">
37   - <label class="control-label">{% trans "Alternatives: T/F" %}</label>
38   - </div>
39   - <div class="col-md-9" id="radiosTF">
40   - {% include "exam/true_or_false_answer.html" %}
41   - </div>
42   - </div>
43   - <div class="form-group">
44   - <div class="col-md-9 col-md-offset-3">
45   - <button type="button" class="btn btn-primary btn-raised" id="new_alternative">{% trans "New Alternative" %}</button>
46   - </div>
47   - </div>
48   -</div>
49   -<script type="text/javascript">
50   - $("#new_alternative").click(function(){
51   - $.get("{% url 'course:exam:true_or_false_answer' %}", function(data){
52   - $("#radiosTF").append(data);
53   - });
54   - });
55   - //deve ser importado apenas depois do html
56   - $( "#radiosTF" ).sortable({ // utilizado para fazer a re-organização das respostas
57   - delay: 100,
58   - distance: 5,
59   - update: function( event, ui ) {
60   - var cont = 1;
61   - $("#radiosTF div div input").each(function(){
62   - $(this).attr('name',cont++);
63   - });
64   - },
65   - });
66   -</script>
67   -{# {% endblock content %} #}
exam/templates/exam/remove.html
... ... @@ -1,27 +0,0 @@
1   -{% extends "exam/create.html" %}
2   -
3   -{% load i18n static%}
4   -
5   -{% block title_exam %}
6   -<!-- Put your title here!!! -->
7   -<h4 class="modal-title" id="myModalLabel">{% trans "Delete Exam" %}</h4>
8   -{% endblock title_exam %}
9   -
10   -{% block content_exam %}
11   -<script src="{% static 'js/modal_exam.js' %}"></script>
12   -<!-- Put ONLY your content here!!! -->
13   -<form id="delete_form" action="" method="post">
14   - {% csrf_token %}
15   - <p>{% trans 'Are you sure you want to delete the subject' %} "{{exam.name}}"?</p>
16   -</form>
17   -{% endblock content_exam %}
18   -
19   -{% block button_save %}
20   -<button type="submite" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button>
21   -<script>
22   - $("#delete_form").submit(function(event) {
23   - Submite.remove("{% url 'course:exam:delete_exam' exam.slug %}",$(this).serialize(),"#exam_{{exam.slug}}");
24   - event.preventDefault();
25   - });
26   -</script>
27   -{% endblock button_save %}
exam/templates/exam/update.html
... ... @@ -1,32 +0,0 @@
1   -{% extends "exam/create.html" %}
2   -
3   -{% load i18n dict_access static%}
4   -
5   -{% block title_exam %}
6   -<!-- Put your title here!!! -->
7   -<h4 class="modal-title" id="myModalLabel">{% trans "Update a Exam" %}</h4>
8   -{% endblock title_exam %}
9   -
10   -{% block button_save %}
11   -<!-- Put curtom buttons here!!! -->
12   -<button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Update" %}</button>
13   -{% endblock button_save %}
14   -
15   -{% block script_exam %}
16   -<script type="text/javascript">
17   - var locale = navigator.language || navigator.userLanguage;
18   -
19   - $('.date-picker').datepicker({
20   - language: locale,
21   - });
22   -// Este js tem que ficar aqui se não o button add não vai funcionar
23   - $("#add").click(function (){
24   - Answer.init('{% url "course:exam:answer_exam" %}');
25   - });
26   -
27   - $("#form").submit(function(event) {
28   - Submite.post("{% url 'course:exam:update_exam' exam.slug %}",$(this).serialize());
29   - event.preventDefault();
30   - });
31   -</script>
32   -{% endblock script_exam %}
exam/templates/exam/view.html
... ... @@ -1,28 +0,0 @@
1   -{% extends "exam/create.html" %}
2   -
3   -{% load i18n dict_access static%}
4   -
5   -{% block style %}
6   -{% endblock %}
7   -
8   -{% block title_exam %}
9   -<!-- Put your title here!!! -->
10   -<h4 class="modal-title" id="myModalLabel">{{exam.name}}</h4>
11   -{% endblock title_exam %}
12   -
13   -{% block content_exam %}
14   -<!-- Put ONLY your content here!!! -->
15   -<div class="row">
16   - <div class="col-md-10 col-md-offset-1">
17   - <p>{% trans "Limit date:" %} {{exam.limit_date|date:'d/m/y'}}</p>
18   - </div>
19   -
20   -</div>
21   -{% endblock content_exam %}
22   -
23   -{% block button_save %}
24   -<!-- Put curtom buttons here!!! -->
25   -{% if not status %}
26   -<button type="button" onclick="javascript:modal.get('{% url 'course:exam:answer_student_exam' exam.slug%}','#exam','#modal_exam');$('div.modal-backdrop.fade.in').remove();" class="btn btn-primary btn-raised">{% trans "Answer" %}</button>
27   -{% endif %}
28   -{% endblock button_save %}
exam/templatetags/__init__.py
exam/templatetags/dict_access.py
... ... @@ -1,13 +0,0 @@
1   -from django import template
2   -
3   -from forum.models import Forum
4   -
5   -register = template.Library()
6   -
7   -"""
8   - Template tag to load all the foruns of a post
9   -"""
10   -
11   -@register.filter
12   -def value(dictionary, key):
13   - return dictionary[key]
exam/tests.py
... ... @@ -1,3 +0,0 @@
1   -from django.test import TestCase
2   -
3   -# Create your tests here.
exam/urls.py
... ... @@ -1,19 +0,0 @@
1   -from django.conf.urls import url
2   -
3   -from . import views
4   -
5   -urlpatterns = [
6   - url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), # exam slug
7   - url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), # topic slug
8   - url(r'^view/(?P<slug>[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), # exam slug
9   - url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), # exam
10   - url(r'^answer/$', views.AnswerExam.as_view(), name='answer_exam'), # exam
11   - url(r'^answer-exam/(?P<slug>[\w\-_]+)/$', views.AnswerStudentExam.as_view(), name='answer_student_exam'), # exam slug
12   - url(r'^discursive-question/$',views.DiscursiveQuestion.as_view(), name="discursive_question"),
13   - url(r'^gap-filling-question/$',views.GapFillingQuestion.as_view(), name="gap_filling_question"),
14   - url(r'^gap-filling-answer/$',views.GapFillingAnswer.as_view(), name="gap_filling_answer"),
15   - url(r'^multiple-choice-question/$',views.MultipleChoiceQuestion.as_view(), name="multiple_choice_question"),
16   - url(r'^multiple-choice-answer/$',views.MultipleChoiceAnswer.as_view(), name="multiple_choice_answer"),
17   - url(r'^true-or-false-question/$',views.TrueOrFalseQuestion.as_view(), name="true_or_false_question"),
18   - url(r'^true-or-false-answer/$',views.TrueOrFalseAnswer.as_view(), name="true_or_false_answer"),
19   -]
exam/views.py
... ... @@ -1,380 +0,0 @@
1   -from django.shortcuts import render, get_object_or_404, redirect
2   -from django.views import generic
3   -from django.contrib.auth.decorators import login_required
4   -from django.core.paginator import Paginator, EmptyPage
5   -from django.contrib.auth.mixins import LoginRequiredMixin
6   -from rolepermissions.mixins import HasRoleMixin
7   -from django.core.urlresolvers import reverse_lazy
8   -from django.utils.translation import ugettext_lazy as _
9   -from rolepermissions.verifications import has_role
10   -from rolepermissions.verifications import has_object_permission
11   -from django.db.models import Q
12   -from datetime import datetime
13   -import time
14   -# from django.views.generic.edit import FormMixin
15   -
16   -from .forms import ExamForm
17   -from .models import Exam, Answer, AnswersStudent
18   -from core.mixins import LogMixin, NotificationMixin
19   -from core.models import Log
20   -from users.models import User
21   -from courses.models import Course, Topic
22   -
23   -class ViewExam(LoginRequiredMixin, LogMixin, generic.DetailView):
24   - log_component = 'exam'
25   - log_resource = 'exam'
26   - log_action = 'viewed'
27   - log_context = {}
28   -
29   - model = Exam
30   - context_object_name = 'exam'
31   - template_name = 'exam/view.html'
32   -
33   - def get_object(self, queryset=None):
34   - return get_object_or_404(Topic, slug = self.kwargs.get('slug'))
35   -
36   - def get_context_data(self, **kwargs):
37   - context = super(ViewExam, self).get_context_data(**kwargs)
38   - exam = self.object
39   - context["topic"] = exam.topic
40   - context['course'] = exam.topic.subject.course
41   - context['subject'] = exam.topic.subject
42   - context['subjects'] = exam.topic.subject.course.subjects.all()
43   -
44   - answered = AnswersStudent.objects.filter(exam = exam, student=self.request.user)
45   - print (answered)
46   - if answered.count()<1:
47   - context['status'] = False
48   - else:
49   - context['status'] = answered[0].status
50   -
51   - self.log_context['exam_id'] = exam.id
52   - self.log_context['topic_id'] = exam.topic.id
53   - self.log_context['topic_name'] = exam.topic.name
54   - self.log_context['topic_slug'] = exam.topic.slug
55   - self.log_context['subject_id'] = exam.topic.subject.id
56   - self.log_context['subject_name'] = exam.topic.subject.name
57   - self.log_context['subject_slug'] = exam.topic.subject.slug
58   - self.log_context['course_id'] = exam.topic.subject.course.id
59   - self.log_context['course_name'] = exam.topic.subject.course.name
60   - self.log_context['course_slug'] = exam.topic.subject.course.slug
61   - self.log_context['course_category_id'] = exam.topic.subject.course.category.id
62   - self.log_context['course_category_name'] = exam.topic.subject.course.category.name
63   - self.request.session['time_spent'] = str(int(time.time()))
64   -
65   - super(ViewExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
66   -
67   - self.request.session['log_id'] = Log.objects.latest('id').id
68   -
69   - return context
70   -
71   -
72   -
73   -class CreateExam(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView):
74   - log_component = 'exam'
75   - log_resource = 'exam'
76   - log_action = 'create'
77   - log_context = {}
78   -
79   - allowed_roles = ['professor', 'system_admin']
80   - login_url = reverse_lazy("core:home")
81   - redirect_field_name = 'next'
82   - model = Exam
83   - form_class = ExamForm
84   - context_object_name = 'exam'
85   - template_name = 'exam/create.html'
86   -
87   - def form_invalid(self, form,**kwargs):
88   - context = super(CreateExam, self).form_invalid(form)
89   - answers = {}
90   - for key in self.request.POST:
91   - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'):
92   - answers[key] = self.request.POST[key]
93   -
94   - keys = sorted(answers)
95   - context.context_data['answers'] = answers
96   - context.context_data['keys'] = keys
97   - context.context_data['form'] = form
98   - context.status_code = 400
99   - return context
100   -
101   - def form_valid(self, form):
102   - self.object = form.save(commit = False)
103   - topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
104   - self.object.topic = topic
105   - self.object.name = str(self.object)
106   - self.object.save()
107   -
108   - super(CreateExam, self).createNotification(message="created an Exam "+ self.object.name, actor=self.request.user,
109   - resource_name=self.object.name, resource_link= reverse('course:exam:view_exam', args=[self.object.slug]),
110   - users=self.object.topic.subject.students.all())
111   - for key in self.request.POST:
112   - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'):
113   - answer = Answer(answer=self.request.POST[key],order=key,exam=self.object)
114   - answer.save()
115   -
116   - self.log_context['exam_id'] = self.object.id
117   - self.log_context['topic_id'] = self.object.topic.id
118   - self.log_context['topic_name'] = self.object.topic.name
119   - self.log_context['topic_slug'] = self.object.topic.slug
120   - self.log_context['subject_id'] = self.object.topic.subject.id
121   - self.log_context['subject_name'] = self.object.topic.subject.name
122   - self.log_context['subject_slug'] = self.object.topic.subject.slug
123   - self.log_context['course_id'] = self.object.topic.subject.course.id
124   - self.log_context['course_name'] = self.object.topic.subject.course.name
125   - self.log_context['course_slug'] = self.object.topic.subject.course.slug
126   - self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
127   - self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
128   -
129   - super(CreateExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
130   -
131   - return self.render_to_response(self.get_context_data(form = form), status = 200)
132   -
133   - def get_context_data(self, **kwargs):
134   - context = super(CreateExam, self).get_context_data(**kwargs)
135   - topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
136   - context['course'] = topic.subject.course
137   - context['subject'] = topic.subject
138   - context['subjects'] = topic.subject.course.subjects.all()
139   - return context
140   -
141   -class UpdateExam(LoginRequiredMixin,HasRoleMixin, LogMixin, generic.UpdateView):
142   - log_component = 'exam'
143   - log_resource = 'exam'
144   - log_action = 'update'
145   - log_context = {}
146   -
147   - allowed_roles = ['professor', 'system_admin']
148   - login_url = reverse_lazy("core:home")
149   - redirect_field_name = 'next'
150   - model = Exam
151   - form_class = ExamForm
152   - context_object_name = 'exam'
153   - template_name = 'exam/update.html'
154   - success_url = reverse_lazy('core:home')
155   -
156   - def dispatch(self, *args, **kwargs):
157   - exam = get_object_or_404(Exam, slug = self.kwargs.get('slug'))
158   - if(not has_object_permission('edit_exam', self.request.user, exam)):
159   - return self.handle_no_permission()
160   - return super(UpdateExam, self).dispatch(*args, **kwargs)
161   -
162   - def get_object(self, queryset=None):
163   - return get_object_or_404(Exam, slug = self.kwargs.get('slug'))
164   -
165   - def form_invalid(self, form,**kwargs):
166   - context = super(UpdateExam, self).form_invalid(form)
167   - answers = {}
168   - for key in self.request.POST:
169   - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key!= 'exibe' and key != 'all_students' and key != 'students'):
170   - answers[key] = self.request.POST[key]
171   -
172   - keys = sorted(answers)
173   - context.context_data['answers'] = answers
174   - context.context_data['keys'] = keys
175   - context.context_data['form'] = form
176   - context.status_code = 400
177   - return context
178   -
179   - def form_valid(self, form):
180   - exam = self.object
181   - exam = form.save(commit = False)
182   - exam.answers.all().delete()
183   - exam.save()
184   -
185   -
186   - for key in self.request.POST:
187   - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key!= 'exibe' and key != 'all_students' and key != 'students'):
188   - answer = Answer(answer=self.request.POST[key],order=key,exam=exam)
189   - answer.save()
190   -
191   - self.log_context['exam_id'] = self.object.id
192   - self.log_context['topic_id'] = self.object.topic.id
193   - self.log_context['topic_name'] = self.object.topic.name
194   - self.log_context['topic_slug'] = self.object.topic.slug
195   - self.log_context['subject_id'] = self.object.topic.subject.id
196   - self.log_context['subject_name'] = self.object.topic.subject.name
197   - self.log_context['subject_slug'] = self.object.topic.subject.slug
198   - self.log_context['course_id'] = self.object.topic.subject.course.id
199   - self.log_context['course_name'] = self.object.topic.subject.course.name
200   - self.log_context['course_slug'] = self.object.topic.subject.course.slug
201   - self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
202   - self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
203   -
204   - super(UpdateExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
205   -
206   - return super(UpdateExam, self).form_valid(form)
207   -
208   - def get_context_data(self, **kwargs):
209   - context = super(UpdateExam, self).get_context_data(**kwargs)
210   - exam = self.object
211   - context['course'] = exam.topic.subject.course
212   - context['subject'] = exam.topic.subject
213   - context['subjects'] = exam.topic.subject.course.subjects.all()
214   -
215   - answers = {}
216   - for answer in exam.answers.all():
217   - answers[answer.order] = answer.answer
218   -
219   - keys = sorted(answers)
220   - context['answers'] = answers
221   - context['keys'] = keys
222   -
223   - return context
224   -
225   -class DeleteExam(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DeleteView):
226   - log_component = 'exam'
227   - log_resource = 'exam'
228   - log_action = 'delete'
229   - log_context = {}
230   -
231   - allowed_roles = ['professor', 'system_admin']
232   - login_url = reverse_lazy("core:home")
233   - redirect_field_name = 'next'
234   - model = Exam
235   - template_name = 'exam/remove.html'
236   -
237   - def dispatch(self, *args, **kwargs):
238   - exam = get_object_or_404(Exam, slug = self.kwargs.get('slug'))
239   - if(not has_object_permission('delete_exam', self.request.user, exam)):
240   - return self.handle_no_permission()
241   - return super(DeleteExam, self).dispatch(*args, **kwargs)
242   -
243   -
244   - def get_context_data(self, **kwargs):
245   - context = super(DeleteExam, self).get_context_data(**kwargs)
246   - context['course'] = self.object.topic.subject.course
247   - context['subject'] = self.object.topic.subject
248   - context['exam'] = self.object
249   - context['subjects'] = self.object.topic.subject.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
250   - if (has_role(self.request.user,'system_admin')):
251   - context['subjects'] = self.object.topic.subject.course.subjects.all()
252   - return context
253   -
254   - def get_success_url(self):
255   - self.log_context['exam_id'] = self.object.id
256   - self.log_context['topic_id'] = self.object.topic.id
257   - self.log_context['topic_name'] = self.object.topic.name
258   - self.log_context['topic_slug'] = self.object.topic.slug
259   - self.log_context['subject_id'] = self.object.topic.subject.id
260   - self.log_context['subject_name'] = self.object.topic.subject.name
261   - self.log_context['subject_slug'] = self.object.topic.subject.slug
262   - self.log_context['course_id'] = self.object.topic.subject.course.id
263   - self.log_context['course_name'] = self.object.topic.subject.course.name
264   - self.log_context['course_slug'] = self.object.topic.subject.course.slug
265   - self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
266   - self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
267   -
268   - super(DeleteExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
269   -
270   - return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug})
271   -
272   -class AnswerExam(generic.TemplateView):
273   - template_name = 'exam/answer.html'
274   -
275   -class AnswerStudentExam(LoginRequiredMixin, LogMixin, generic.CreateView):
276   - log_component = 'exam'
277   - log_resource = 'exam'
278   - log_action = 'answer'
279   - log_context = {}
280   -
281   - model = AnswersStudent
282   - fields = ['status']
283   - context_object_name = 'answer'
284   - template_name = 'exam/answer_student.html'
285   -
286   - def form_valid(self, form):
287   - exam = get_object_or_404(Exam, slug = self.kwargs.get('slug'))
288   - answers = AnswersStudent(
289   - status = True,
290   - exam = exam,
291   - student = self.request.user,
292   - )
293   - answers.save()
294   -
295   - for key in self.request.POST:
296   - if(key != 'csrfmiddlewaretoken'):
297   - answers.answer.add(exam.answers.all().filter(order=key)[0])
298   -
299   - self.log_context['exam_id'] = exam.id
300   - self.log_context['topic_id'] = exam.topic.id
301   - self.log_context['topic_name'] = exam.topic.name
302   - self.log_context['topic_slug'] = exam.topic.slug
303   - self.log_context['subject_id'] = exam.topic.subject.id
304   - self.log_context['subject_name'] = exam.topic.subject.name
305   - self.log_context['subject_slug'] = exam.topic.subject.slug
306   - self.log_context['course_id'] = exam.topic.subject.course.id
307   - self.log_context['course_name'] = exam.topic.subject.course.name
308   - self.log_context['course_slug'] = exam.topic.subject.course.slug
309   - self.log_context['course_category_id'] = exam.topic.subject.course.category.id
310   - self.log_context['course_category_name'] = exam.topic.subject.course.category.name
311   -
312   - date_time_click = datetime.strptime(self.request.session.get('time_spent'), "%Y-%m-%d %H:%M:%S.%f")
313   - _now = datetime.now()
314   -
315   - time_spent = _now - date_time_click
316   -
317   - secs = time_spent.total_seconds()
318   - hours = int(secs / 3600)
319   - minutes = int(secs / 60) % 60
320   - secs = secs % 60
321   -
322   - self.log_context['timestamp_end'] = str(int(time.time()))
323   - self.log_context['time_spent'] = {}
324   - self.log_context['time_spent']['hours'] = hours
325   - self.log_context['time_spent']['minutes'] = minutes
326   - self.log_context['time_spent']['seconds'] = secs
327   -
328   - super(AnswerStudentExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
329   -
330   - return self.render_to_response(self.get_context_data(form = form), status = 200)
331   -
332   - def get_context_data(self, **kwargs):
333   - context = super(AnswerStudentExam, self).get_context_data(**kwargs)
334   - print (self.kwargs.get('slug'))
335   - exam = get_object_or_404(Exam, slug = self.kwargs.get('slug'))
336   - context['exam'] = exam
337   - context['topic'] = exam.topic
338   - context['course'] = exam.topic.subject.course
339   - context['subject'] = exam.topic.subject
340   - context['subjects'] = exam.topic.subject.course.subjects.all()
341   -
342   - print (self.request.method)
343   - answers = {}
344   - for answer in exam.answers.all():
345   - answers[answer.order] = answer.answer
346   -
347   - keys = sorted(answers)
348   - context['answers'] = answers
349   - context['keys'] = keys
350   -
351   - self.log_context['timestamp_start'] = str(int(time.time()))
352   - self.request.session['time_spent'] = str(datetime.now())
353   -
354   - return context
355   -
356   -class MultipleChoiceQuestion(generic.TemplateView):
357   - template_name = 'exam/multiple_choice_question.html'
358   -
359   -
360   -class MultipleChoiceAnswer(generic.TemplateView):
361   - template_name = 'exam/multiple_choice_answer.html'
362   -
363   -
364   -class DiscursiveQuestion(generic.TemplateView):
365   - template_name = 'exam/discursive_question.html'
366   -
367   -
368   -class TrueOrFalseQuestion(generic.TemplateView):
369   - template_name = 'exam/true_or_false_question.html'
370   -
371   -
372   -class TrueOrFalseAnswer(generic.TemplateView):
373   - template_name = 'exam/true_or_false_answer.html'
374   -
375   -
376   -class GapFillingQuestion(generic.TemplateView):
377   - template_name = 'exam/gap_filling_question.html'
378   -
379   -class GapFillingAnswer(generic.TemplateView):
380   - template_name = 'exam/gap_filling_answer.html'
users/templates/users/search.html
... ... @@ -94,26 +94,7 @@
94 94 </div>
95 95 {% endif %}
96 96  
97   -{% if exam_list %}
98   -<div class="panel-group">
99   - <div class="panel panel-default">
100   - <div class="panel-heading">
101   - <h4 class="panel-title">
102   - <a data-toggle="collapse" href="#Exam" id="bot3" style="color: black"> <i class="fa fa-caret-square-o-down" aria-hidden="true" id="down3"></i>Exam</a>
103   - </h4>
104   - </div>
105   - <div id="Exam" class="panel-collapse collapse">
106   - <div class="panel-body">
107   - {% for exam in exam_list %}
108   - {{exam.name}}
109   - {% endfor %}
110 97  
111   - </div>
112   -
113   - </div>
114   - </div>
115   -</div>
116   -{% endif %}
117 98  
118 99 {% if poll_list %}
119 100 <div class="panel-group">
... ...
users/views.py
... ... @@ -17,7 +17,7 @@ from links.models import Link
17 17 from poll.models import *
18 18 from forum.models import *
19 19 from files.models import *
20   -from exam.models import *
  20 +
21 21 from courses.models import *
22 22  
23 23 #API IMPORTS
... ... @@ -224,7 +224,6 @@ class SearchView(LoginRequiredMixin, generic.ListView):
224 224 link_list = []
225 225 file_list = []
226 226 poll_list = []
227   - exam_list = []
228 227 forum_list = []
229 228 qtd = 0
230 229  
... ... @@ -233,39 +232,35 @@ class SearchView(LoginRequiredMixin, generic.ListView):
233 232 link_list = Link.objects.filter( Q(name__icontains=search)).order_by('name')
234 233 file_list = TopicFile.objects.filter(Q(name__icontains=search)).order_by('name')
235 234 poll_list = Poll.objects.filter(Q(name__icontains=search)).order_by('name')
236   - exam_list = Exam.objects.filter(Q(name__icontains=search)).order_by('name')
237 235 forum_list = Forum.objects.filter(Q(name__icontains=search)).order_by('name')
238   - qtd = len(link_list) + len(file_list) + len(poll_list) + len(exam_list) + len(forum_list)
  236 + qtd = len(link_list) + len(file_list) + len(poll_list) + len(forum_list)
239 237  
240 238 elif has_role(self.request.user,'professor'):
241 239 topics = Topic.objects.filter(owner = self.request.user)
242 240 links = Link.objects.all()
243 241 files = TopicFile.objects.all()
244 242 polls = Poll.objects.all()
245   - exams = Exam.objects.all()
  243 +
246 244 forums = Forum.objects.all()
247 245 if search != '':
248 246 link_list = sorted([link for link in links for topic in topics if (link.topic == topic) and ( search in link.name ) ],key = lambda x:x.name)
249   - exam_list = sorted([exam for exam in exams for topic in topics if (exam.topic == topic) and ( search in exam.name ) ],key = lambda x:x.name)
250 247 file_list = sorted([arquivo for arquivo in files for topic in topics if (arquivo.topic == topic) and (search in arquivo.name ) ],key = lambda x:x.name)
251 248 poll_list = sorted([poll for poll in polls for topic in topics if (poll.topic == topic) and ( search in poll.name ) ],key = lambda x:x.name)
252 249 forum_list = sorted([forum for forum in forums for topic in topics if (forum.topic == topic) and ( search in forum.name ) ],key = lambda x:x.name)
253   - qtd = len(link_list) + len(file_list) + len(poll_list) + len(exam_list) + len(forum_list)
  250 + qtd = len(link_list) + len(file_list) + len(poll_list) + len(forum_list)
254 251  
255 252 elif has_role(self.request.user, 'student'):
256 253 if search != '':
257 254 link_list = Link.objects.filter( Q(name__icontains=search) and Q(students__name = self.request.user.name)).order_by('name')
258 255 file_list = TopicFile.objects.filter(Q(name__icontains=search) and Q(students__name = self.request.user.name)).order_by('name')
259 256 poll_list = Poll.objects.filter(Q(name__icontains=search)and Q(students__name = self.request.user.name)).order_by('name')
260   - exam_list = Exam.objects.filter(Q(name__icontains=search)and Q(students__name = self.request.user.name)).order_by('name')
261 257 forum_list = Forum.objects.filter(Q(name__icontains=search)and Q(students__name = self.request.user.name)).order_by('name')
262   - qtd = len(link_list) + len(file_list) + len(poll_list) + len(exam_list) + len(forum_list)
  258 + qtd = len(link_list) + len(file_list) + len(poll_list) + len(forum_list)
263 259  
264 260 translated = _('You searched for... ')
265 261 context['link_list'] = link_list
266 262 context['file_list'] = file_list
267 263 context['poll_list'] = poll_list
268   - context['exam_list'] = exam_list
269 264 context['forum_list'] = forum_list
270 265 context['qtd'] = qtd
271 266 context['search'] = translated + search
... ...