Commit ad886494baab59c536939456aa7d50b90815024a
1 parent
a61f25fb
Exists in
master
and in
5 other branches
improvimenting the exercise's model
Showing
11 changed files
with
182 additions
and
48 deletions
Show diff stats
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 #} |
@@ -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) |
@@ -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> |
@@ -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> {% trans "Replicate" %}</a></li> | ||
41 | + <li><a href=""> <i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans "Edit" %}</a></li> | ||
42 | + <li><a href="" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% 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 |