Commit 61689fc2d836dc187ee1e3e779e99e31ac26293d
1 parent
e2cc437c
Exists in
master
and in
5 other branches
criado o model de respostas do aluno e ajustes no template de visualizar enquete…
… pelo aluno #146, #174
Showing
9 changed files
with
102 additions
and
47 deletions
Show diff stats
courses/templates/subject/form_view_student.html
@@ -17,7 +17,8 @@ | @@ -17,7 +17,8 @@ | ||
17 | </div> | 17 | </div> |
18 | <div class="panel-body"> | 18 | <div class="panel-body"> |
19 | <p>{{topic.description|linebreaks}}</p> | 19 | <p>{{topic.description|linebreaks}}</p> |
20 | - {% list_topic_foruns request topic %} | 20 | + {% list_topic_foruns request topic %} |
21 | + {% list_topic_poll request topic %} | ||
21 | </div> | 22 | </div> |
22 | 23 | ||
23 | <div class="modal fade" id="forumModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | 24 | <div class="modal fade" id="forumModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
@@ -37,4 +38,4 @@ | @@ -37,4 +38,4 @@ | ||
37 | </div> | 38 | </div> |
38 | </div> | 39 | </div> |
39 | </div> | 40 | </div> |
40 | -</div> | ||
41 | \ No newline at end of file | 41 | \ No newline at end of file |
42 | +</div> |
courses/templates/subject/poll_item_actions.html
1 | -{% load static i18n %} | 1 | +{% load static i18n permission_tags%} |
2 | 2 | ||
3 | <script src="{% static 'js/modals_requisitions.js'%}"></script> | 3 | <script src="{% static 'js/modals_requisitions.js'%}"></script> |
4 | <script src="{% static 'js/modal_poll.js'%}"></script> | 4 | <script src="{% static 'js/modal_poll.js'%}"></script> |
5 | 5 | ||
6 | +{% if request.user|has_role:'professor, system_admin'%} | ||
6 | {% for poll in polls %} | 7 | {% for poll in polls %} |
7 | <li id="poll_{{poll.slug}}"><i class="material-icons">poll</i> <a href="javascript:get('{% url 'course:poll:update_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a><a href="javascript:get('{% url 'course:poll:delete_poll' poll.slug %}','#poll','#modal_poll');"><span class="glyphicon glyphicon-remove"></span></a></li> | 8 | <li id="poll_{{poll.slug}}"><i class="material-icons">poll</i> <a href="javascript:get('{% url 'course:poll:update_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a><a href="javascript:get('{% url 'course:poll:delete_poll' poll.slug %}','#poll','#modal_poll');"><span class="glyphicon glyphicon-remove"></span></a></li> |
8 | {% endfor %} | 9 | {% endfor %} |
9 | <button class="btn btn-primary btn-raised" onclick="javascript:get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#modal_poll');">{% trans '+ Create Poll' %}</button> | 10 | <button class="btn btn-primary btn-raised" onclick="javascript:get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#modal_poll');">{% trans '+ Create Poll' %}</button> |
11 | +{% else %} | ||
12 | +{% for poll in polls %} | ||
13 | + <li id="poll_{{poll.slug}}"><i class="material-icons">poll</i> <a href="javascript:get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a></li> | ||
14 | +{% endfor %} | ||
15 | +{% endif %} | ||
10 | <div class="row" id="modal_poll"> | 16 | <div class="row" id="modal_poll"> |
11 | 17 | ||
12 | </div> | 18 | </div> |
poll/admin.py
1 | from django.contrib import admin | 1 | from django.contrib import admin |
2 | 2 | ||
3 | -from .models import Poll, Answer | 3 | +from .models import Poll, Answer, AnswersStudent |
4 | 4 | ||
5 | class PollAdmin(admin.ModelAdmin): | 5 | class PollAdmin(admin.ModelAdmin): |
6 | list_display = ['name', 'slug','limit_date'] | 6 | list_display = ['name', 'slug','limit_date'] |
@@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): | @@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): | ||
10 | list_display = ['answer','order'] | 10 | list_display = ['answer','order'] |
11 | search_fields = ['answer'] | 11 | search_fields = ['answer'] |
12 | 12 | ||
13 | +class AnswersStudentAdmin(admin.ModelAdmin): | ||
14 | + list_display = ['student','poll','answered_in'] | ||
15 | + search_fields = ['student','poll'] | ||
16 | + | ||
13 | admin.site.register(Poll, PollAdmin) | 17 | admin.site.register(Poll, PollAdmin) |
14 | admin.site.register(Answer, AnswerAdmin) | 18 | admin.site.register(Answer, AnswerAdmin) |
19 | +admin.site.register(AnswersStudent, AnswersStudentAdmin) |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-10-12 18:26 | ||
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 | + dependencies = [ | ||
13 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
14 | + ('poll', '0001_initial'), | ||
15 | + ] | ||
16 | + | ||
17 | + operations = [ | ||
18 | + migrations.CreateModel( | ||
19 | + name='AnswersStudent', | ||
20 | + fields=[ | ||
21 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
22 | + ('status', models.BooleanField(default=False, verbose_name='Answered')), | ||
23 | + ('answered_in', models.DateTimeField(auto_now=True, verbose_name='Answered Date')), | ||
24 | + ('answer', models.ManyToManyField(related_name='answers_stundet', to='poll.Answer', verbose_name='Answers Students')), | ||
25 | + ('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Answers')), | ||
26 | + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundent', to=settings.AUTH_USER_MODEL, verbose_name='Student')), | ||
27 | + ], | ||
28 | + options={ | ||
29 | + 'verbose_name': 'Answer Stundent', | ||
30 | + 'verbose_name_plural': 'Answers Student', | ||
31 | + }, | ||
32 | + ), | ||
33 | + ] |
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-10-12 19:38 | ||
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 | + dependencies = [ | ||
12 | + ('poll', '0002_answersstudent'), | ||
13 | + ] | ||
14 | + | ||
15 | + operations = [ | ||
16 | + migrations.AlterField( | ||
17 | + model_name='answersstudent', | ||
18 | + name='poll', | ||
19 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Poll'), | ||
20 | + ), | ||
21 | + ] |
poll/models.py
@@ -27,3 +27,17 @@ class Answer(models.Model): | @@ -27,3 +27,17 @@ class Answer(models.Model): | ||
27 | 27 | ||
28 | def __str__(self): | 28 | def __str__(self): |
29 | return str(self.answer) + str("/") + str(self.poll) | 29 | return str(self.answer) + str("/") + str(self.poll) |
30 | + | ||
31 | +class AnswersStudent(models.Model): | ||
32 | + status = models.BooleanField(_("Answered"), default=False) | ||
33 | + poll = models.ForeignKey(Poll, verbose_name = _('Poll'), related_name='answers_stundet') | ||
34 | + answer = models.ManyToManyField(Answer,verbose_name = _('Answers Students'), related_name='answers_stundet') | ||
35 | + student = models.ForeignKey(User, verbose_name = _('Student'), related_name='answers_stundent') | ||
36 | + answered_in = models.DateTimeField(_("Answered Date"),auto_now=True) | ||
37 | + | ||
38 | + class Meta: | ||
39 | + verbose_name = _('Answer Stundent') | ||
40 | + verbose_name_plural = _('Answers Student') | ||
41 | + | ||
42 | + def __str__(self): | ||
43 | + return str(self.student) + str("/") + str(self.poll) |
poll/templates/poll/view.html
@@ -7,19 +7,29 @@ | @@ -7,19 +7,29 @@ | ||
7 | 7 | ||
8 | {% block title_poll %} | 8 | {% block title_poll %} |
9 | <!-- Put your title here!!! --> | 9 | <!-- Put your title here!!! --> |
10 | -<h4 class="modal-title" id="myModalLabel">{{poll}}</h4> | 10 | +<h4 class="modal-title" id="myModalLabel">{{poll.name}}</h4> |
11 | {% endblock title_poll %} | 11 | {% endblock title_poll %} |
12 | 12 | ||
13 | {% block content_poll %} | 13 | {% block content_poll %} |
14 | <!-- Put ONLY your content here!!! --> | 14 | <!-- Put ONLY your content here!!! --> |
15 | <div class="row"> | 15 | <div class="row"> |
16 | <div class="col-md-10 col-md-offset-1"> | 16 | <div class="col-md-10 col-md-offset-1"> |
17 | - <h3>{% trans "Limit date:" %} {{poll.limit_date|date:'d/m/y'}}</h3> | 17 | + <p>{% trans "Limit date:" %} {{poll.limit_date|date:'d/m/y'}}</p> |
18 | + </div> | ||
19 | + <div class="col-md-10 col-md-offset-1"> | ||
20 | + <p>{% trans "Status:" %} | ||
21 | + {% if status %} | ||
22 | + {% trans "Poll answered" %} | ||
23 | + {% else %} | ||
24 | + {% trans "Poll don't yet answered" %} | ||
25 | + {% endif %} | ||
18 | </div> | 26 | </div> |
19 | </div> | 27 | </div> |
20 | {% endblock content_poll %} | 28 | {% endblock content_poll %} |
21 | 29 | ||
22 | {% block button_save %} | 30 | {% block button_save %} |
23 | <!-- Put curtom buttons here!!! --> | 31 | <!-- Put curtom buttons here!!! --> |
24 | -<button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Answer" %}</button> | 32 | +{% if not status %} |
33 | +<button type="button" class="btn btn-primary btn-raised">{% trans "Answer" %}</button> | ||
34 | +{% endif %} | ||
25 | {% endblock button_save %} | 35 | {% endblock button_save %} |
poll/tests/poll.py
@@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse | @@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse | ||
5 | 5 | ||
6 | from rolepermissions.shortcuts import assign_role | 6 | from rolepermissions.shortcuts import assign_role |
7 | 7 | ||
8 | -from courses.models import Category, Course, Subject, Topic | 8 | +from courses.models import CourseCategory, Course, Subject, Topic |
9 | from poll.models import Poll | 9 | from poll.models import Poll |
10 | from users.models import User | 10 | from users.models import User |
11 | 11 | ||
@@ -33,7 +33,7 @@ class PollTestCase(TestCase): | @@ -33,7 +33,7 @@ class PollTestCase(TestCase): | ||
33 | ) | 33 | ) |
34 | assign_role(self.user_student, 'student') | 34 | assign_role(self.user_student, 'student') |
35 | 35 | ||
36 | - self.category = Category( | 36 | + self.category = CourseCategory( |
37 | name = 'Categoria Teste', | 37 | name = 'Categoria Teste', |
38 | ) | 38 | ) |
39 | self.category.save() | 39 | self.category.save() |
poll/views.py
@@ -12,7 +12,7 @@ from django.db.models import Q | @@ -12,7 +12,7 @@ from django.db.models import Q | ||
12 | # from django.views.generic.edit import FormMixin | 12 | # from django.views.generic.edit import FormMixin |
13 | 13 | ||
14 | from .forms import PollForm | 14 | from .forms import PollForm |
15 | -from .models import Poll, Answer | 15 | +from .models import Poll, Answer, AnswersStudent |
16 | from core.mixins import NotificationMixin | 16 | from core.mixins import NotificationMixin |
17 | from users.models import User | 17 | from users.models import User |
18 | from courses.models import Course, Topic | 18 | from courses.models import Course, Topic |
@@ -26,48 +26,14 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): | @@ -26,48 +26,14 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): | ||
26 | def get_object(self, queryset=None): | 26 | def get_object(self, queryset=None): |
27 | return get_object_or_404(Poll, slug = self.kwargs.get('slug')) | 27 | return get_object_or_404(Poll, slug = self.kwargs.get('slug')) |
28 | 28 | ||
29 | - def form_invalid(self, form,**kwargs): | ||
30 | - context = super(ViewPoll, self).form_invalid(form) | ||
31 | - answers = {} | ||
32 | - for key in self.request.POST: | ||
33 | - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): | ||
34 | - answers[key] = self.request.POST[key] | ||
35 | - | ||
36 | - keys = sorted(answers) | ||
37 | - context.context_data['answers'] = answers | ||
38 | - context.context_data['keys'] = keys | ||
39 | - return context | ||
40 | - | ||
41 | - def form_valid(self, form): | ||
42 | - poll = self.object | ||
43 | - poll = form.save(commit = False) | ||
44 | - poll.answers.all().delete() | ||
45 | - poll.save() | ||
46 | - | ||
47 | - | ||
48 | - for key in self.request.POST: | ||
49 | - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): | ||
50 | - answer = Answer(answer=self.request.POST[key],order=key,poll=poll) | ||
51 | - answer.save() | ||
52 | - | ||
53 | - return super(ViewPoll, self).form_valid(form) | ||
54 | - | ||
55 | def get_context_data(self, **kwargs): | 29 | def get_context_data(self, **kwargs): |
56 | context = super(ViewPoll, self).get_context_data(**kwargs) | 30 | context = super(ViewPoll, self).get_context_data(**kwargs) |
57 | poll = self.object | 31 | poll = self.object |
32 | + context["topic"] = poll.topic | ||
58 | context['course'] = poll.topic.subject.course | 33 | context['course'] = poll.topic.subject.course |
59 | context['subject'] = poll.topic.subject | 34 | context['subject'] = poll.topic.subject |
60 | context['subjects'] = poll.topic.subject.course.subjects.all() | 35 | context['subjects'] = poll.topic.subject.course.subjects.all() |
61 | - | ||
62 | - answers = {} | ||
63 | - for answer in poll.answers.all(): | ||
64 | - answers[answer.order] = answer.answer | ||
65 | - | ||
66 | - keys = sorted(answers) | ||
67 | - context['answers'] = answers | ||
68 | - context['keys'] = keys | ||
69 | - | ||
70 | - print (context) | 36 | + context['status'] = AnswersStudent.objects.get(poll=poll, student=self.request.user).status |
71 | return context | 37 | return context |
72 | 38 | ||
73 | 39 | ||
@@ -93,7 +59,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -93,7 +59,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
93 | context.context_data['keys'] = keys | 59 | context.context_data['keys'] = keys |
94 | context.context_data['form'] = form | 60 | context.context_data['form'] = form |
95 | context.status_code = 400 | 61 | context.status_code = 400 |
96 | - print (context) | ||
97 | # return self.render_to_response(context, status = 400) | 62 | # return self.render_to_response(context, status = 400) |
98 | return context | 63 | return context |
99 | 64 |