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 | ... | ... |