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 | 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 #} | ... | ... |
... | ... | @@ -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) | ... | ... |
... | ... | @@ -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> | ... | ... |
... | ... | @@ -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 | 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 | ... | ... |