Commit 36d375c3a559418d0ab86a2521a6ffb0e7912e6b
1 parent
209713f8
Exists in
master
and in
5 other branches
view delivery exercise #148
Showing
7 changed files
with
89 additions
and
68 deletions
Show diff stats
courses/templates/subject/form_view_teacher.html
... | ... | @@ -123,6 +123,19 @@ |
123 | 123 | </ul> |
124 | 124 | </div> |
125 | 125 | </div> |
126 | + <div class="resource_inline"> | |
127 | + <h4>{% trans 'Exercises' %}</h4> | |
128 | + </div> | |
129 | + <div class="resource_inline"> | |
130 | + {# dropdown de create exercício #} | |
131 | + <div class="dropdown"> | |
132 | + <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | |
133 | + <ul class="dropdown-menu" aria-labelledby="dLabel"> | |
134 | + <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Create a general exercise' %}</a></li> | |
135 | + </ul> | |
136 | + </div> | |
137 | + </div> | |
138 | + {% include "exercise/create_exercise.html" %} | |
126 | 139 | </div> |
127 | 140 | |
128 | 141 | {# opções de cancelar e editar no modo de edição #} | ... | ... |
courses/templates/topic/index.html
... | ... | @@ -120,7 +120,7 @@ |
120 | 120 | </div> |
121 | 121 | </div> |
122 | 122 | <div class="col-md-6"> |
123 | - <h3>{% trans 'Students - Especific Exercises' %}</h3> | |
123 | + <h3>{% trans 'Students - Specific Exercises' %}</h3> | |
124 | 124 | <br/> |
125 | 125 | </div> |
126 | 126 | {# mostra a lista de usuários caso seja um professor ou admin #} |
... | ... | @@ -128,8 +128,9 @@ |
128 | 128 | {% for user in users %} |
129 | 129 | {% include "exercise/card_list_user.html" %} |
130 | 130 | {% endfor %} |
131 | + {% endif %} | |
131 | 132 | {# caso seja um estudante, mostra a lista de exercícios proposta a ele #} |
132 | - {% elif user|has_role:'student'%} | |
133 | + {% if user|has_role:'student'%} | |
133 | 134 | {% for exercise in exercises %} |
134 | 135 | {% include "exercise/card_topic_exercises.html" %} |
135 | 136 | {% endfor %} | ... | ... |
courses/views.py
... | ... | @@ -16,7 +16,7 @@ from django.shortcuts import get_object_or_404 |
16 | 16 | from django.urls import reverse |
17 | 17 | from django.utils.translation import ugettext_lazy as _ |
18 | 18 | from django.views import generic |
19 | -from exercise.models import Exercise | |
19 | +from exercise.models import Exercise, File | |
20 | 20 | from files.forms import FileForm |
21 | 21 | from files.models import TopicFile |
22 | 22 | from functools import reduce |
... | ... | @@ -622,12 +622,13 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView): |
622 | 622 | activitys = Activity.objects.filter(topic__name = topic.name) |
623 | 623 | students_activit = User.objects.filter(activities__in = Activity.objects.all()) |
624 | 624 | materials = Material.objects.filter(topic = topic) |
625 | - if has_role(self.request.user, 'professor'): | |
626 | - users = User.objects.filter(subject_student__in = Subject.objects.all()) | |
627 | - context['users'] = users | |
628 | - elif has_role(self.request.user, 'student'): | |
629 | - exercises = Exercise.objects.all().filter(students=self.request.user) | |
630 | - context['exercises'] = exercises | |
625 | + | |
626 | + users = User.objects.filter(subject_student__in = Subject.objects.all()) | |
627 | + context['users'] = users | |
628 | + exercises = Exercise.objects.filter(Q(students=self.request.user)|Q(professors=self.request.user)) | |
629 | + context['exercises'] = exercises | |
630 | + files = File.objects.all() | |
631 | + context['files'] = files | |
631 | 632 | |
632 | 633 | context['topic'] = topic |
633 | 634 | context['subject'] = topic.subject | ... | ... |
exercise/migrations/0001_initial.py
1 | 1 | # -*- coding: utf-8 -*- |
2 | -# Generated by Django 1.10 on 2016-11-17 03:09 | |
2 | +# Generated by Django 1.10 on 2016-11-17 04:25 | |
3 | 3 | from __future__ import unicode_literals |
4 | 4 | |
5 | 5 | from decimal import Decimal |
6 | +from django.conf import settings | |
6 | 7 | from django.db import migrations, models |
7 | 8 | import django.db.models.deletion |
8 | 9 | |
... | ... | @@ -12,6 +13,9 @@ class Migration(migrations.Migration): |
12 | 13 | initial = True |
13 | 14 | |
14 | 15 | dependencies = [ |
16 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | |
17 | + ('courses', '0002_auto_20161117_0009'), | |
18 | + ('core', '0002_auto_20161117_0009'), | |
15 | 19 | ] |
16 | 20 | |
17 | 21 | operations = [ |
... | ... | @@ -24,6 +28,9 @@ class Migration(migrations.Migration): |
24 | 28 | ('end_date', models.DateField(verbose_name='End of Subject Date')), |
25 | 29 | ('grade', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=20, null=True)), |
26 | 30 | ('name', models.CharField(max_length=100)), |
31 | + ('professors', models.ManyToManyField(blank=True, related_name='professors_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Professors')), | |
32 | + ('students', models.ManyToManyField(blank=True, related_name='subject_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Students')), | |
33 | + ('topic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='courses.Topic', verbose_name='Topic')), | |
27 | 34 | ], |
28 | 35 | ), |
29 | 36 | migrations.CreateModel( |
... | ... | @@ -33,6 +40,7 @@ class Migration(migrations.Migration): |
33 | 40 | ('name', models.CharField(max_length=100)), |
34 | 41 | ('file', models.FileField(upload_to='uploads/%Y/%m/%d')), |
35 | 42 | ('exercise', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='file', to='exercise.Exercise')), |
43 | + ('file_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='file_files', to='core.MimeType', verbose_name='Type file')), | |
36 | 44 | ], |
37 | 45 | ), |
38 | 46 | ] | ... | ... |
exercise/migrations/0002_auto_20161117_0009.py
... | ... | @@ -1,36 +0,0 @@ |
1 | -# -*- coding: utf-8 -*- | |
2 | -# Generated by Django 1.10 on 2016-11-17 03:09 | |
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 | - ('exercise', '0001_initial'), | |
17 | - ('courses', '0002_auto_20161117_0009'), | |
18 | - ] | |
19 | - | |
20 | - operations = [ | |
21 | - migrations.AddField( | |
22 | - model_name='exercise', | |
23 | - name='professors', | |
24 | - field=models.ManyToManyField(blank=True, related_name='professors_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Professors'), | |
25 | - ), | |
26 | - migrations.AddField( | |
27 | - model_name='exercise', | |
28 | - name='students', | |
29 | - field=models.ManyToManyField(blank=True, related_name='subject_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | |
30 | - ), | |
31 | - migrations.AddField( | |
32 | - model_name='exercise', | |
33 | - name='topic', | |
34 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='courses.Topic', verbose_name='Topic'), | |
35 | - ), | |
36 | - ] |
exercise/models.py
... | ... | @@ -3,6 +3,7 @@ from decimal import Decimal |
3 | 3 | from django.db import models |
4 | 4 | from django.utils.translation import ugettext_lazy as _ |
5 | 5 | from users.models import User |
6 | +from core.models import MimeType | |
6 | 7 | |
7 | 8 | """ |
8 | 9 | Function to return the path where the file should be saved |
... | ... | @@ -35,6 +36,7 @@ class File(models.Model): |
35 | 36 | name = models.CharField(max_length=100) |
36 | 37 | file = models.FileField(upload_to='uploads/%Y/%m/%d') |
37 | 38 | exercise = models.ForeignKey(Exercise, related_name='file') |
38 | - | |
39 | + file_type = models.ForeignKey(MimeType, verbose_name=_('Type file'), related_name='file_files') | |
40 | + | |
39 | 41 | def __str__(self): |
40 | 42 | return self.name |
41 | 43 | \ No newline at end of file | ... | ... |
exercise/templates/exercise/card_list_user.html
1 | 1 | {% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises %} |
2 | 2 | |
3 | - <div class="col-md-12 col-sm-12 col-lg-12"> | |
4 | - <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false"> | |
5 | - <div class="group"><div class="panel panel-default"> | |
6 | - <div class="panel-heading topic ui-sortable-handle" role="tab"> | |
3 | +<div class="col-md-12 col-sm-12 col-lg-12"> | |
4 | + <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false"> | |
5 | + <div class="group"><div class="panel panel-default"> | |
6 | + <div class="panel-heading topic ui-sortable-handle" role="tab"> | |
7 | + <div class="row"> | |
8 | + <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{user.id}}" href=".collapseTopic-{{user.id}}" aria-expanded="false" aria-controls="collapseTopic-{{user.id}}"> | |
9 | + <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button> | |
10 | + </div> | |
11 | + <div class="col-xs-9 col-md-9 titleTopic"> | |
12 | + <a href="" role="button"> | |
13 | + <h4>{{user|capfirst}}</h4> | |
14 | + </a> | |
15 | + </div> | |
16 | + </div> | |
17 | + </div> | |
18 | + <div class="panel-collapse collapseTopic-{{user.id}} collapse in" role="tabpanel" aria-labelledby="heading_{{user.id}}" aria-expanded="true" aria-hidden="false"> | |
19 | + <div class="panel-body"> | |
7 | 20 | <div class="row"> |
8 | - <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{user.id}}" href=".collapseTopic-{{user.id}}" aria-expanded="false" aria-controls="collapseTopic-{{user.id}}"> | |
9 | - <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button> | |
21 | + <div class="col-md-4"> | |
22 | + <div class="resource_inline"> | |
23 | + <h4>{% trans 'Grade' %}</h4> | |
24 | + </div> | |
25 | + <div class="resource_inline"> | |
26 | + {# dropdown de create exercício #} | |
27 | + <div class="dropdown"> | |
28 | + <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | |
29 | + <ul class="dropdown-menu" aria-labelledby="dLabel"> | |
30 | + <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Give a grade' %}</a></li> | |
31 | + </ul> | |
32 | + </div> | |
33 | + </div> | |
10 | 34 | </div> |
11 | - <div class="col-xs-9 col-md-9 titleTopic"> | |
12 | - <a href="" role="button"> | |
13 | - <h4>{{user|capfirst}}</h4> | |
14 | - </a> | |
35 | + <div class="col-md-4"> | |
36 | + <div class="resource_inline"> | |
37 | + <h4>{% trans 'Delivery' %}</h4> | |
38 | + </div> | |
39 | + {% for file in files %} | |
40 | + <li>{{file.exercise}}: <a href="{{file.file.url}}" target="_blank">{{file.name}}</a></li> | |
41 | + {% endfor %} | |
42 | + | |
15 | 43 | </div> |
16 | - </div> | |
17 | - </div> | |
18 | - <div class="panel-collapse collapseTopic-{{user.id}} collapse in" role="tabpanel" aria-labelledby="heading_{{user.id}}" aria-expanded="true" aria-hidden="false"> | |
19 | - <div class="panel-body"> | |
20 | - <div class="presentation"> | |
21 | - <p> | |
22 | - <i> | |
23 | - | |
24 | - </i> | |
25 | - </p> | |
26 | - | |
44 | + <div class="col-md-4"> | |
45 | + <div class="resource_inline"> | |
46 | + <h4>{% trans 'Create' %}</h4> | |
47 | + </div> | |
48 | + <div class="resource_inline"> | |
49 | + {# dropdown de create exercício #} | |
50 | + <div class="dropdown"> | |
51 | + <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | |
52 | + <ul class="dropdown-menu" aria-labelledby="dLabel"> | |
53 | + <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Create a specific exercise' %}</a></li> | |
54 | + </ul> | |
55 | + </div> | |
56 | + </div> | |
57 | + {% include "exercise/create_exercise.html" %} | |
27 | 58 | </div> |
28 | 59 | </div> |
29 | 60 | </div> |
30 | 61 | </div> |
31 | 62 | </div> |
32 | 63 | </div> |
64 | +</div> | |
33 | 65 | </div> |
34 | 66 | \ No newline at end of file | ... | ... |