Commit ad886494baab59c536939456aa7d50b90815024a

Authored by Matheus Lins
1 parent a61f25fb

improvimenting the exercise's model

amadeus/urls.py
... ... @@ -23,6 +23,7 @@ urlpatterns = [
23 23 url(r'^home/', include('app.urls', namespace = 'app')),
24 24 url(r'^courses/', include('courses.urls', namespace = 'course')),
25 25 url(r'^users/', include('users.urls', namespace = 'users')),
  26 + url(r'^exercise/', include('exercise.urls', namespace = 'exercise')),
26 27 url(r'^admin/', admin.site.urls),
27 28 url(r'^', include('core.urls', namespace = 'core')),
28 29 #API
... ...
courses/templates/subject/form_view_student.html
... ... @@ -63,33 +63,6 @@
63 63 </ul>
64 64 </div>
65 65 </div>
66   - <div class="col-xs-4 col-md-4">
67   - <div class="resource_inline">
68   - <h4>{% trans 'Exercises' %}</h4>
69   - </div>
70   - <div class="resource_inline">
71   - {# dropdown de create exercício #}
72   - <div class="dropdown">
73   - <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>
74   - <ul class="dropdown-menu" aria-labelledby="dLabel">
75   - <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Create a Exercise' %}</a></li>
76   - </ul>
77   - </div>
78   - </div>
79   - <div class="presentation_{{exercise.slug}}">
80   - {# exercício do tópico no modo de visualização #}
81   - <ul>
82   - {% list_topic_exercise request %}
83   - </ul>
84   - </div>
85   - <div class="editation editation_{{exercise.slug}}">
86   - {# exercício do tópico no modo de edição #}
87   - <ul>
88   - {% list_topic_exercise_edit request exercise %}
89   - </ul>
90   - </div>
91   - </div>
92   - {% include "exercise/create_exercise.html" %}
93 66 </div>
94 67 {% endif %}
95 68  
... ...
courses/templates/subject/form_view_teacher.html
... ... @@ -125,21 +125,10 @@
125 125 </div>
126 126 <div class="col-xs-4 col-md-4">
127 127 <div class="resource_inline">
128   - <h4>{% trans 'Exercises' %}</h4>
129   - </div>
130   - <div class="presentation_{{exercise.slug}}">
131   - {# exercício do tópico no modo de visualização #}
132   - <ul>
133   - {% list_topic_exercise request %}
134   - </ul>
135   - </div>
136   - <div class="editation editation_{{exercise.slug}}">
137   - {# exercício do tópico no modo de edição #}
138   - <ul>
139   - {% list_topic_exercise_edit request exercise %}
140   - </ul>
  128 + <a href="{% url 'exercise:home' topic.slug %}"><h4>{% trans 'Exercises' %}</h4></a>
141 129 </div>
142 130 </div>
  131 + {% include "exercise/create_exercise.html" %}
143 132 </div>
144 133  
145 134 {# opções de cancelar e editar no modo de edição #}
... ...
exercise/migrations/0002_auto_20161116_2111.py 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 00:11
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.conf import settings
  6 +from django.db import migrations, models
  7 +
  8 +
  9 +class Migration(migrations.Migration):
  10 +
  11 + dependencies = [
  12 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  13 + ('exercise', '0001_initial'),
  14 + ]
  15 +
  16 + operations = [
  17 + migrations.AddField(
  18 + model_name='exercise',
  19 + name='professors',
  20 + field=models.ManyToManyField(related_name='professors_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
  21 + ),
  22 + migrations.AddField(
  23 + model_name='exercise',
  24 + name='students',
  25 + field=models.ManyToManyField(blank=True, related_name='subject_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  26 + ),
  27 + ]
... ...
exercise/models.py
1 1 from django.db import models
2 2 from courses.models import Topic
3 3 from django.utils.translation import ugettext_lazy as _
  4 +from users.models import User
4 5  
5 6 """
6 7 Function to return the path where the file should be saved
... ... @@ -18,5 +19,7 @@ It represents the Exercises inside topic.
18 19  
19 20 class Exercise(models.Model):
20 21 topic = models.ForeignKey(Topic, verbose_name=_('Topic'), related_name='exercises')
  22 + professors = models.ManyToManyField(User, verbose_name=_('Professors'), related_name='professors_exercise')
  23 + students = models.ManyToManyField(User, verbose_name=_('Students'), related_name='subject_exercise', blank = True)
21 24 file = models.FileField(upload_to='uploads/%Y/%m/%d')
22 25 name = models.CharField(max_length=100)
... ...
exercise/templates/exercise/card_list_user.html 0 → 100644
... ... @@ -0,0 +1,42 @@
  1 +{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises %}
  2 +
  3 +{% block javascript %}
  4 +<script type="text/javascript" src="{% static 'js/forum.js' %}"></script>
  5 +<script src="{% static 'js/file.js' %}"></script>
  6 +<script type="text/javascript" src="{% static 'js/material.js' %}"></script>
  7 +<script type = "text/javascript" src="{% static 'links.js' %}"></script>
  8 +{% endblock %}
  9 +<div class="cards-detail">
  10 + <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false">
  11 + <div class="group"><div class="panel panel-default">
  12 + <div class="panel-heading topic ui-sortable-handle" role="tab">
  13 + <div class="row">
  14 + <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{topic.slug}}" href=".collapseTopic-{{topic.slug}}" aria-expanded="false" aria-controls="collapseTopic-{{topic.slug}}">
  15 + <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button>
  16 + </div>
  17 + <div class="col-xs-9 col-md-9 titleTopic">
  18 + <a href="" role="button">
  19 + <h4>{{user|capfirst}}</h4>
  20 + </a>
  21 + </div>
  22 + </div>
  23 + </div>
  24 + <div class="panel-collapse collapseTopic-{{topic.slug}} collapse in" role="tabpanel" aria-labelledby="heading_{{topic.slug}}" aria-expanded="true" aria-hidden="false">
  25 + <div class="panel-body">
  26 + <div class="presentation">
  27 + <p>
  28 + <i>
  29 +
  30 + </i>
  31 + </p>
  32 +
  33 + </div>
  34 + </div>
  35 + </div>
  36 +
  37 + </div>
  38 +
  39 + </div>
  40 +
  41 +</div>
  42 +</div>
0 43 \ No newline at end of file
... ...
exercise/templates/exercise/exercise_edit.html
1 1 {% load static i18n list_topic_foruns permission_tags %}
2   -<div id="exercise-topic{{ exercise.id }}-exercises-edit">
  2 +<div id="exercise-topic{{ topic.id }}-exercises-edit">
3 3 {% for exercise in exercises %}
4 4 <li class="icon_edit_remove" id = "exercise_edit_icon_{{ exercise.slug }}"> <a href="javascript:modal.get('', '#exercisesModalEdit', '#requisicoes_ajax')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('', '#exerciseDeleteModal', '#requisicoes_ajax')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
5 5 <li id = "exercise_edit_{{ exercise.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('', '#viewExerciseModal','#requisicoes_ajax')">{{exercise.name}}</a></li>
... ...
exercise/templates/exercise/home.html 0 → 100644
... ... @@ -0,0 +1,76 @@
  1 +{% extends 'home.html' %}
  2 +
  3 +{% load static i18n permission_tags professor_access %}
  4 +
  5 +{% block javascript %}
  6 +<script type="text/javascript" src="{% static 'js/forum.js' %}"></script>
  7 +<script src="{% static 'js/file.js' %}"></script>
  8 +<script type="text/javascript" src="{% static 'js/material.js' %}"></script>
  9 +<script type="text/javascript" src="{% static 'js/modals_requisitions.js' %}"></script>
  10 +<script type = "text/javascript" src="{% static 'js/topic_editation_presentation.js' %}"></script>
  11 +<script type = "text/javascript" src="{% static 'js/links.js' %}"></script>
  12 +<script src="{% static 'js/modal_poll.js' %}"></script>
  13 +{% endblock %}
  14 +
  15 +{% block breadcrumbs %}
  16 +<ol class="breadcrumb">
  17 + <li><a href="">{% trans 'Home' %}</a></li>
  18 + <li><a href="">{% trans 'Courses' %}</a></li>
  19 + <li><a href="">{{ course }}</a></li>
  20 + <li class="active">{{ subject }}</li>
  21 +</ol>
  22 +{% endblock %}
  23 +
  24 +{% block content %}
  25 +<div class="panel panel-info">
  26 + <div class="panel-heading course-detail">
  27 + <div class="row">
  28 + <div class="col-md-10 col-sm-10">
  29 + <h4>{{subject}}</h4>
  30 + </div>
  31 +
  32 + {# dropdown de subject com as opções de replicar, editar e deletar #}
  33 + <div class="col-xs-4 col-md-2 divMoreActions">
  34 +
  35 + <div class="btn-group">
  36 + <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  37 + <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>
  38 + </button>
  39 + <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
  40 + <li><a href=""><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li>
  41 + <li><a href=""> <i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>
  42 + <li><a href="" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>
  43 + </ul>
  44 + </div>
  45 +
  46 + </div>
  47 +
  48 + </div>
  49 + </div>
  50 +
  51 + {# informações do subject(professor, descrição etc) #}
  52 + <div class="panel-body">
  53 + <p><b>{% trans "Professor" %}:</b> {% for professor in subject.professors.all %}{% if not forloop.first %},{% endif %}
  54 + {{professor}}{% if forloop.last %}.{% endif %}{% endfor %}</p>
  55 + <p>
  56 + <b>{% trans "Description" %}:</b>
  57 + {{subject.description|safe}}
  58 + </p>
  59 + <div class="row">
  60 + <div class="col-xs-6 col-md-6">
  61 + <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>
  62 + </div>
  63 + <div class="col-xs-6 col-md-6">
  64 + <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>
  65 + </div>
  66 + </div>
  67 + </div>
  68 +
  69 + </div>
  70 +
  71 + {# lista de usuários #}
  72 + {% for user in users %}
  73 + {% include "exercise/card_list_user.html" %}
  74 + {% endfor %}
  75 +
  76 + {% endblock %}
... ...
exercise/templatetags/list_topic_exercises.py
... ... @@ -5,21 +5,21 @@ register = template.Library()
5 5  
6 6  
7 7 @register.inclusion_tag('exercise/exercise_list.html')
8   -def list_topic_exercise(request):
  8 +def list_topic_exercise(request, topic):
9 9 context = {
10 10 'request': request,
11 11 }
12   - context['exercises'] = Exercise.objects.all()
  12 + context['exercises'] = Exercise.objects.filter(topic=topic)
13 13  
14 14 return context
15 15  
16 16  
17 17 @register.inclusion_tag('exercise/exercise_edit.html')
18   -def list_topic_exercise_edit(request, exercise):
  18 +def list_topic_exercise_edit(request, topic):
19 19 context = {
20 20 'request': request,
21 21 }
22   - context['exercises'] = Exercise.objects.all()
23   - context['exercise'] = exercise
  22 + context['exercises'] = Exercise.objects.filter(topic = topic)
  23 + context['topic'] = topic
24 24  
25 25 return context
... ...
exercise/urls.py
... ... @@ -2,6 +2,7 @@ from django.conf.urls import url
2 2 from . import views
3 3  
4 4 urlpatterns = [
  5 + url(r'^home/(?P<slug>[\w_-]+)/$', views.HomeExercise.as_view(), name='home'),
5 6 url(r'^create_exercise/(?P<slug>[\w_-]+)/$', views.CreateExercise.as_view(), name='create_exercise'),
6 7 url(r'^delete_exercise/(?P<slug>[\w_-]+)/$', views.DeleteExercise.as_view(), name='delete_exercise'),
7 8 url(r'^update_exercise/(?P<slug>[\w_-]+)/$', views.UpdateExercise.as_view(), name='update_exercise'),
... ...
exercise/views.py
1 1 from .forms import ExerciseForm, UpdateExerciseForm
2 2 from .models import Exercise
3   -from files.utils import mime_type_to_material_icons
4 3 from core.decorators import log_decorator
5 4 from core.mixins import LogMixin, NotificationMixin
6 5 from core.models import Log, MimeType
... ... @@ -13,8 +12,31 @@ from django.core.urlresolvers import reverse_lazy
13 12 from django.shortcuts import render, get_object_or_404, redirect
14 13 from django.urls import reverse
15 14 from django.views import generic
  15 +from files.utils import mime_type_to_material_icons
16 16 from rolepermissions.mixins import HasRoleMixin
17 17 from rolepermissions.verifications import has_role
  18 +from users.models import User
  19 +
  20 +
  21 +class HomeExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.ListView):
  22 +
  23 + allowed_roles = ['student', 'professor']
  24 + login_url = reverse_lazy("core:home")
  25 + redirect_field_name = 'next'
  26 + queryset = User.objects.all()
  27 + template_name = 'exercise/home.html'
  28 + context_object_name = 'users'
  29 + paginate_by = 10
  30 +
  31 + def get_context_data(self, **kwargs):
  32 + context = super(HomeExercise, self).get_context_data(**kwargs)
  33 + topic = get_object_or_404(Topic, slug=self.kwargs.get('slug'))
  34 + # users = self.queryset.filter(subject_student = )
  35 + context['topic'] = topic
  36 + # context['users'] = users
  37 + context['subject'] = topic.subject
  38 +
  39 + return context
18 40  
19 41  
20 42 class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView):
... ... @@ -23,7 +45,7 @@ class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMix
23 45 log_action = 'create'
24 46 log_component = {}
25 47  
26   - allowed_roles = ['student']
  48 + allowed_roles = ['student', 'professor']
27 49 login_url = reverse_lazy("core:home")
28 50 redirect_field_name = 'next'
29 51 model = Exercise
... ...