Commit ad886494baab59c536939456aa7d50b90815024a

Authored by Matheus Lins
1 parent a61f25fb

improvimenting the exercise's model

amadeus/urls.py
@@ -23,6 +23,7 @@ urlpatterns = [ @@ -23,6 +23,7 @@ urlpatterns = [
23 url(r'^home/', include('app.urls', namespace = 'app')), 23 url(r'^home/', include('app.urls', namespace = 'app')),
24 url(r'^courses/', include('courses.urls', namespace = 'course')), 24 url(r'^courses/', include('courses.urls', namespace = 'course')),
25 url(r'^users/', include('users.urls', namespace = 'users')), 25 url(r'^users/', include('users.urls', namespace = 'users')),
  26 + url(r'^exercise/', include('exercise.urls', namespace = 'exercise')),
26 url(r'^admin/', admin.site.urls), 27 url(r'^admin/', admin.site.urls),
27 url(r'^', include('core.urls', namespace = 'core')), 28 url(r'^', include('core.urls', namespace = 'core')),
28 #API 29 #API
courses/templates/subject/form_view_student.html
@@ -63,33 +63,6 @@ @@ -63,33 +63,6 @@
63 </ul> 63 </ul>
64 </div> 64 </div>
65 </div> 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 </div> 66 </div>
94 {% endif %} 67 {% endif %}
95 68
courses/templates/subject/form_view_teacher.html
@@ -125,21 +125,10 @@ @@ -125,21 +125,10 @@
125 </div> 125 </div>
126 <div class="col-xs-4 col-md-4"> 126 <div class="col-xs-4 col-md-4">
127 <div class="resource_inline"> 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 </div> 129 </div>
142 </div> 130 </div>
  131 + {% include "exercise/create_exercise.html" %}
143 </div> 132 </div>
144 133
145 {# opções de cancelar e editar no modo de edição #} 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 @@ @@ -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 from django.db import models 1 from django.db import models
2 from courses.models import Topic 2 from courses.models import Topic
3 from django.utils.translation import ugettext_lazy as _ 3 from django.utils.translation import ugettext_lazy as _
  4 +from users.models import User
4 5
5 """ 6 """
6 Function to return the path where the file should be saved 7 Function to return the path where the file should be saved
@@ -18,5 +19,7 @@ It represents the Exercises inside topic. @@ -18,5 +19,7 @@ It represents the Exercises inside topic.
18 19
19 class Exercise(models.Model): 20 class Exercise(models.Model):
20 topic = models.ForeignKey(Topic, verbose_name=_('Topic'), related_name='exercises') 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 file = models.FileField(upload_to='uploads/%Y/%m/%d') 24 file = models.FileField(upload_to='uploads/%Y/%m/%d')
22 name = models.CharField(max_length=100) 25 name = models.CharField(max_length=100)
exercise/templates/exercise/card_list_user.html 0 → 100644
@@ -0,0 +1,42 @@ @@ -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 \ No newline at end of file 43 \ No newline at end of file
exercise/templates/exercise/exercise_edit.html
1 {% load static i18n list_topic_foruns permission_tags %} 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 {% for exercise in exercises %} 3 {% for exercise in exercises %}
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> 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 <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> 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 @@ @@ -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,21 +5,21 @@ register = template.Library()
5 5
6 6
7 @register.inclusion_tag('exercise/exercise_list.html') 7 @register.inclusion_tag('exercise/exercise_list.html')
8 -def list_topic_exercise(request): 8 +def list_topic_exercise(request, topic):
9 context = { 9 context = {
10 'request': request, 10 'request': request,
11 } 11 }
12 - context['exercises'] = Exercise.objects.all() 12 + context['exercises'] = Exercise.objects.filter(topic=topic)
13 13
14 return context 14 return context
15 15
16 16
17 @register.inclusion_tag('exercise/exercise_edit.html') 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 context = { 19 context = {
20 'request': request, 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 return context 25 return context
exercise/urls.py
@@ -2,6 +2,7 @@ from django.conf.urls import url @@ -2,6 +2,7 @@ from django.conf.urls import url
2 from . import views 2 from . import views
3 3
4 urlpatterns = [ 4 urlpatterns = [
  5 + url(r'^home/(?P<slug>[\w_-]+)/$', views.HomeExercise.as_view(), name='home'),
5 url(r'^create_exercise/(?P<slug>[\w_-]+)/$', views.CreateExercise.as_view(), name='create_exercise'), 6 url(r'^create_exercise/(?P<slug>[\w_-]+)/$', views.CreateExercise.as_view(), name='create_exercise'),
6 url(r'^delete_exercise/(?P<slug>[\w_-]+)/$', views.DeleteExercise.as_view(), name='delete_exercise'), 7 url(r'^delete_exercise/(?P<slug>[\w_-]+)/$', views.DeleteExercise.as_view(), name='delete_exercise'),
7 url(r'^update_exercise/(?P<slug>[\w_-]+)/$', views.UpdateExercise.as_view(), name='update_exercise'), 8 url(r'^update_exercise/(?P<slug>[\w_-]+)/$', views.UpdateExercise.as_view(), name='update_exercise'),
exercise/views.py
1 from .forms import ExerciseForm, UpdateExerciseForm 1 from .forms import ExerciseForm, UpdateExerciseForm
2 from .models import Exercise 2 from .models import Exercise
3 -from files.utils import mime_type_to_material_icons  
4 from core.decorators import log_decorator 3 from core.decorators import log_decorator
5 from core.mixins import LogMixin, NotificationMixin 4 from core.mixins import LogMixin, NotificationMixin
6 from core.models import Log, MimeType 5 from core.models import Log, MimeType
@@ -13,8 +12,31 @@ from django.core.urlresolvers import reverse_lazy @@ -13,8 +12,31 @@ from django.core.urlresolvers import reverse_lazy
13 from django.shortcuts import render, get_object_or_404, redirect 12 from django.shortcuts import render, get_object_or_404, redirect
14 from django.urls import reverse 13 from django.urls import reverse
15 from django.views import generic 14 from django.views import generic
  15 +from files.utils import mime_type_to_material_icons
16 from rolepermissions.mixins import HasRoleMixin 16 from rolepermissions.mixins import HasRoleMixin
17 from rolepermissions.verifications import has_role 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 class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView): 42 class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView):
@@ -23,7 +45,7 @@ class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMix @@ -23,7 +45,7 @@ class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMix
23 log_action = 'create' 45 log_action = 'create'
24 log_component = {} 46 log_component = {}
25 47
26 - allowed_roles = ['student'] 48 + allowed_roles = ['student', 'professor']
27 login_url = reverse_lazy("core:home") 49 login_url = reverse_lazy("core:home")
28 redirect_field_name = 'next' 50 redirect_field_name = 'next'
29 model = Exercise 51 model = Exercise