Commit 14d5a37370d3b638233fc1f6bf3d5224ffa0a7cd
1 parent
c6fdd0d7
Exists in
master
and in
5 other branches
templates de exame #171
Showing
12 changed files
with
297 additions
and
14 deletions
Show diff stats
amadeus/settings.py
courses/urls.py
| ... | ... | @@ -27,7 +27,7 @@ urlpatterns = [ |
| 27 | 27 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), |
| 28 | 28 | url(r'^forum/', include('forum.urls', namespace = 'forum')), |
| 29 | 29 | url(r'^poll/', include('poll.urls', namespace = 'poll')), |
| 30 | - # url(r'^exam/', include('exam.urls', namespace = 'exam')), | |
| 30 | + url(r'^exam/', include('exam.urls', namespace = 'exam')), | |
| 31 | 31 | url(r'^files/', include('files.urls', namespace = 'file')), |
| 32 | 32 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), |
| 33 | 33 | url(r'^links/',include('links.urls',namespace = 'links')), | ... | ... |
exam/templates/exam/create.html
| ... | ... | @@ -0,0 +1,116 @@ |
| 1 | +{% extends "base.html" %} | |
| 2 | + | |
| 3 | +{% load i18n %} | |
| 4 | + | |
| 5 | +{% block content %} | |
| 6 | +<div class="panel panel-info"> | |
| 7 | + <div class="panel-heading"> | |
| 8 | + {% block title_poll %} | |
| 9 | + <h1 class="panel-title">{% trans "New Exam" %}</h1> | |
| 10 | + {% endblock title_poll %} | |
| 11 | + </div> | |
| 12 | + <div class="panel-body"> | |
| 13 | + <div class="row form-group"> | |
| 14 | + <label for="exam_name" class="col-md-2 control-label">{% trans "Exam Name" %}</label> | |
| 15 | + <div class="col-md-10"> | |
| 16 | + <input type="text" name="exam_name" class="form-control" id="exam_name" placeholder="{% trans 'Exam Name' %}"> | |
| 17 | + </div> | |
| 18 | + </div> | |
| 19 | + <div class="row form-group"> | |
| 20 | + <label for="begin_date" class="col-md-2 control-label">{% trans "Exam's begin date" %}</label> | |
| 21 | + <div class="col-md-10"> | |
| 22 | + <input type="date" name="begin_date" class="form-control" id="begin_date" placeholder='{% trans "Begin Date" %}'> | |
| 23 | + </div> | |
| 24 | + </div> | |
| 25 | + <div class="row form-group"> | |
| 26 | + <label for="end_date" class="col-md-2 control-label">{% trans "Exam's end date" %}</label> | |
| 27 | + <div class="col-md-10"> | |
| 28 | + <input type="text" name="end_date" class="form-control" id="end_date" placeholder='{% trans "End Date" %}'> | |
| 29 | + </div> | |
| 30 | + </div> | |
| 31 | + <div class="row form-group"> | |
| 32 | + <div class="col-md-10"> | |
| 33 | + <div class="checkbox"> | |
| 34 | + <label> | |
| 35 | + <input type="checkbox" name="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans "Allow submissions after deadline?" %} | |
| 36 | + </label> | |
| 37 | + </div> | |
| 38 | + </div> | |
| 39 | + </div> | |
| 40 | + <div class="row form-group" id="questions"> | |
| 41 | + | |
| 42 | + </div> | |
| 43 | + <div class="row form-group"> | |
| 44 | + <label for="questionType" class="col-md-2 control-label">{% trans "Question Type" %}</label> | |
| 45 | + <div class="col-md-10"> | |
| 46 | + <select id="questionType" class="form-control" name="option_question" onchange="showDiv (this)"> | |
| 47 | + <option selected disabled>{% trans "Question Type" %}</option> | |
| 48 | + <option value="0">{% trans "Multiple Choice" %}</option> | |
| 49 | + <option value="1">{% trans "True or False" %}</option> | |
| 50 | + <option value="2">{% trans "Gap Filling" %}</option> | |
| 51 | + <option value="3">{% trans "Discursive Question" %}</option> | |
| 52 | + </select> | |
| 53 | + </div> | |
| 54 | + </div> | |
| 55 | + <div class="row"> | |
| 56 | + <div class="col-md-12"> | |
| 57 | + <button type="button" class="btn btn-primary btn-raised" id="add_question">{% trans "add question" %}</button> | |
| 58 | + </div> | |
| 59 | + </div> | |
| 60 | + </div> | |
| 61 | + <div class="panel-footer text-right"> | |
| 62 | + <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Create" %}</button> | |
| 63 | + </div> | |
| 64 | +</div> | |
| 65 | +<script> | |
| 66 | +var id = 1; | |
| 67 | +$("#add_question").click(function(){ | |
| 68 | + $.get("{% url 'course:exam:true_or_false_question' %}", function(data){ | |
| 69 | + // var teste = String(data); | |
| 70 | + // teste.replace("#radiosTF", "W3Schools"); | |
| 71 | + // alert(teste); | |
| 72 | + $("#questions").append(data); | |
| 73 | + // $("#radiosTF").attr("id", "true_id_" + id); | |
| 74 | + $("#0").attr("id","true_" + id++); | |
| 75 | + }); | |
| 76 | +}); | |
| 77 | + | |
| 78 | +var alternativeValue = 3; | |
| 79 | + | |
| 80 | +$('#newAlternative').click(function () { | |
| 81 | + var element = '<div class="radio radio-primary">' + | |
| 82 | + '<label>' + | |
| 83 | + '<input type="radio" name="alternatives" id="alternative4"' + 'value="' +alternativeValue + '">' + | |
| 84 | + '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>' + | |
| 85 | + '</label>' + | |
| 86 | + '</div>'; | |
| 87 | + $('#radios').append(element); | |
| 88 | + | |
| 89 | + alternativeValue++; | |
| 90 | +}); | |
| 91 | + | |
| 92 | +var tfAlternativeValue = 3; | |
| 93 | + | |
| 94 | +$('#tfAlternative').click(function () { | |
| 95 | + var element = '<div class="radio radio-primary">' + | |
| 96 | + '<label>' + | |
| 97 | + '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>' + | |
| 98 | + '</label>' + | |
| 99 | + '<label>' + | |
| 100 | + '<input type="radio" name="alternative' + tfAlternativeValue +'" value="T">' + | |
| 101 | + '</label>' + | |
| 102 | + '<label>' + | |
| 103 | + '<input type="radio" name="alternative2" value="F">' + | |
| 104 | + '</label>' + | |
| 105 | + '</div>'; | |
| 106 | + $('#radiosTF').append(element); | |
| 107 | + | |
| 108 | + tfAlternativeValue++; | |
| 109 | +}); | |
| 110 | + | |
| 111 | +$(function() { | |
| 112 | + $( "#begin_date,#end_date" ).datepicker(); | |
| 113 | +}); | |
| 114 | +</script> | |
| 115 | + | |
| 116 | +{% endblock content %} | ... | ... |
| ... | ... | @@ -0,0 +1,6 @@ |
| 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> | ... | ... |
| ... | ... | @@ -0,0 +1,40 @@ |
| 1 | +<div class="form-group" id="multipleChoice"> | |
| 2 | + | |
| 3 | + <label for="questionName" class="col-md-2 control-label">Question</label> | |
| 4 | + | |
| 5 | + | |
| 6 | + <div class="col-md-10"> | |
| 7 | + <textarea class="form-control" rows="1" id="questionName" placeholder="Wording"></textarea> | |
| 8 | + </div> | |
| 9 | + | |
| 10 | + | |
| 11 | +</div> | |
| 12 | +<div class="form-group"> | |
| 13 | + <label for="alternative" class="col-md-2 control-label">Alternatives</label> | |
| 14 | + <div class="col-md-10" id="radios"> | |
| 15 | + <div class="radio radio-primary"> | |
| 16 | + <label> | |
| 17 | + <input checked type="radio" name="alternatives" id="alternative1" value="1"> | |
| 18 | + <textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea> | |
| 19 | + </label> | |
| 20 | + </div> | |
| 21 | + <div class="radio radio-primary"> | |
| 22 | + <label> | |
| 23 | + <input type="radio" name="alternatives" id="alternative2" value="2"> | |
| 24 | + <textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea> | |
| 25 | + </label> | |
| 26 | + </div> | |
| 27 | + </div> | |
| 28 | +</div> | |
| 29 | +<!-- new alternative button --> | |
| 30 | +<div class="form-group"> | |
| 31 | + <div class="col-md-12 col-md-offset-2"> | |
| 32 | + <button type="button" class="btn btn-primary" id="newAlternative">New Alternative</button> | |
| 33 | + </div> | |
| 34 | +</div> | |
| 35 | +<div class="form-group"> | |
| 36 | + <div class="col-md-12 col-md-offset-2"> | |
| 37 | + <button type="submit" class="btn btn-primary">Save</button> | |
| 38 | + <button type="cancel" class="btn btn-default">Cancel</button> | |
| 39 | + </div> | |
| 40 | +</div> | ... | ... |
| ... | ... | @@ -0,0 +1,15 @@ |
| 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> | ... | ... |
| ... | ... | @@ -0,0 +1,67 @@ |
| 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/urls.py
| 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 | -# ] | |
| 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 | + | |
| 13 | + | |
| 14 | + url(r'^discursive-question/$',views.DiscursiveQuestion.as_view(), name="discursive_question"), | |
| 15 | + url(r'^gap-filling-question/$',views.GapFillingQuestion.as_view(), name="gap_filling_question"), | |
| 16 | + url(r'^gap-filling-answer/$',views.GapFillingAnswer.as_view(), name="gap_filling_answer"), | |
| 17 | + url(r'^multiple-choice-question/$',views.MultipleChoiceQuestion.as_view(), name="multiple_choice_question"), | |
| 18 | + url(r'^multiple-choice-answer/$',views.MultipleChoiceAnswer.as_view(), name="multiple_choice_answer"), | |
| 19 | + url(r'^true-or-false-question/$',views.TrueOrFalseQuestion.as_view(), name="true_or_false_question"), | |
| 20 | + url(r'^true-or-false-answer/$',views.TrueOrFalseAnswer.as_view(), name="true_or_false_answer"), | |
| 21 | +] | ... | ... |
exam/views.py
| ... | ... | @@ -24,7 +24,7 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): |
| 24 | 24 | template_name = 'exam/view.html' |
| 25 | 25 | |
| 26 | 26 | def get_object(self, queryset=None): |
| 27 | - return get_object_or_404(Exam, slug = self.kwargs.get('slug')) | |
| 27 | + return get_object_or_404(Topic, slug = self.kwargs.get('slug')) | |
| 28 | 28 | |
| 29 | 29 | def get_context_data(self, **kwargs): |
| 30 | 30 | context = super(ViewExam, self).get_context_data(**kwargs) |
| ... | ... | @@ -227,3 +227,29 @@ class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): |
| 227 | 227 | context['keys'] = keys |
| 228 | 228 | |
| 229 | 229 | return context |
| 230 | + | |
| 231 | +class MultipleChoiceQuestion(generic.TemplateView): | |
| 232 | + template_name = 'exam/multiple_choice_question.html' | |
| 233 | + | |
| 234 | + | |
| 235 | +class MultipleChoiceAnswer(generic.TemplateView): | |
| 236 | + template_name = 'exam/multiple_choice_answer.html' | |
| 237 | + | |
| 238 | + | |
| 239 | +class DiscursiveQuestion(generic.TemplateView): | |
| 240 | + template_name = 'exam/discursive_question.html' | |
| 241 | + | |
| 242 | + | |
| 243 | +class TrueOrFalseQuestion(generic.TemplateView): | |
| 244 | + template_name = 'exam/true_or_false_question.html' | |
| 245 | + | |
| 246 | + | |
| 247 | +class TrueOrFalseAnswer(generic.TemplateView): | |
| 248 | + template_name = 'exam/true_or_false_answer.html' | |
| 249 | + | |
| 250 | + | |
| 251 | +class GapFillingQuestion(generic.TemplateView): | |
| 252 | + template_name = 'exam/gap_filling_question.html' | |
| 253 | + | |
| 254 | +class GapFillingAnswer(generic.TemplateView): | |
| 255 | + template_name = 'exam/gap_filling_answer.html' | ... | ... |