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 | 17 | </div> |
18 | 18 | <div class="panel-body"> |
19 | 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 | 22 | </div> |
22 | 23 | |
23 | 24 | <div class="modal fade" id="forumModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
... | ... | @@ -37,4 +38,4 @@ |
37 | 38 | </div> |
38 | 39 | </div> |
39 | 40 | </div> |
40 | -</div> | |
41 | 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 | 3 | <script src="{% static 'js/modals_requisitions.js'%}"></script> |
4 | 4 | <script src="{% static 'js/modal_poll.js'%}"></script> |
5 | 5 | |
6 | +{% if request.user|has_role:'professor, system_admin'%} | |
6 | 7 | {% for poll in polls %} |
7 | 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 | 9 | {% endfor %} |
9 | 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 | 16 | <div class="row" id="modal_poll"> |
11 | 17 | |
12 | 18 | </div> | ... | ... |
poll/admin.py
1 | 1 | from django.contrib import admin |
2 | 2 | |
3 | -from .models import Poll, Answer | |
3 | +from .models import Poll, Answer, AnswersStudent | |
4 | 4 | |
5 | 5 | class PollAdmin(admin.ModelAdmin): |
6 | 6 | list_display = ['name', 'slug','limit_date'] |
... | ... | @@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): |
10 | 10 | list_display = ['answer','order'] |
11 | 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 | 17 | admin.site.register(Poll, PollAdmin) |
14 | 18 | admin.site.register(Answer, AnswerAdmin) |
19 | +admin.site.register(AnswersStudent, AnswersStudentAdmin) | ... | ... |
... | ... | @@ -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 @@ |
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 | 27 | |
28 | 28 | def __str__(self): |
29 | 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 | 7 | |
8 | 8 | {% block title_poll %} |
9 | 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 | 11 | {% endblock title_poll %} |
12 | 12 | |
13 | 13 | {% block content_poll %} |
14 | 14 | <!-- Put ONLY your content here!!! --> |
15 | 15 | <div class="row"> |
16 | 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 | 26 | </div> |
19 | 27 | </div> |
20 | 28 | {% endblock content_poll %} |
21 | 29 | |
22 | 30 | {% block button_save %} |
23 | 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 | 35 | {% endblock button_save %} | ... | ... |
poll/tests/poll.py
... | ... | @@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse |
5 | 5 | |
6 | 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 | 9 | from poll.models import Poll |
10 | 10 | from users.models import User |
11 | 11 | |
... | ... | @@ -33,7 +33,7 @@ class PollTestCase(TestCase): |
33 | 33 | ) |
34 | 34 | assign_role(self.user_student, 'student') |
35 | 35 | |
36 | - self.category = Category( | |
36 | + self.category = CourseCategory( | |
37 | 37 | name = 'Categoria Teste', |
38 | 38 | ) |
39 | 39 | self.category.save() | ... | ... |
poll/views.py
... | ... | @@ -12,7 +12,7 @@ from django.db.models import Q |
12 | 12 | # from django.views.generic.edit import FormMixin |
13 | 13 | |
14 | 14 | from .forms import PollForm |
15 | -from .models import Poll, Answer | |
15 | +from .models import Poll, Answer, AnswersStudent | |
16 | 16 | from core.mixins import NotificationMixin |
17 | 17 | from users.models import User |
18 | 18 | from courses.models import Course, Topic |
... | ... | @@ -26,48 +26,14 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): |
26 | 26 | def get_object(self, queryset=None): |
27 | 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 | 29 | def get_context_data(self, **kwargs): |
56 | 30 | context = super(ViewPoll, self).get_context_data(**kwargs) |
57 | 31 | poll = self.object |
32 | + context["topic"] = poll.topic | |
58 | 33 | context['course'] = poll.topic.subject.course |
59 | 34 | context['subject'] = poll.topic.subject |
60 | 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 | 37 | return context |
72 | 38 | |
73 | 39 | |
... | ... | @@ -93,7 +59,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): |
93 | 59 | context.context_data['keys'] = keys |
94 | 60 | context.context_data['form'] = form |
95 | 61 | context.status_code = 400 |
96 | - print (context) | |
97 | 62 | # return self.render_to_response(context, status = 400) |
98 | 63 | return context |
99 | 64 | ... | ... |