Commit 545ee28d64d146ce3b6ee478e3641fc3fa807dbc

Authored by fbormann
2 parents 51f155a7 7adeae94

Merge branch 'dev'

Showing 85 changed files with 1180 additions and 744 deletions   Show diff stats
@@ -49,3 +49,5 @@ coverage.xml @@ -49,3 +49,5 @@ coverage.xml
49 49
50 angular_api 50 angular_api
51 logs/ 51 logs/
  52 +amadeus/uploads/
  53 +links/static/images/
@@ -80,6 +80,40 @@ Para Classes que envolvem formulários: @@ -80,6 +80,40 @@ Para Classes que envolvem formulários:
80 * `CreateCourseForm` 80 * `CreateCourseForm`
81 * `UpdateCourseForm()` 81 * `UpdateCourseForm()`
82 82
  83 +
  84 +##API Description
  85 +We are using mostly viewsets ( http://www.django-rest-framework.org/api-guide/viewsets/) to build our API endpoints now, so all default methods and API points were kept.
  86 +
  87 +* model list(GET) = list all objects from that mode in pagination mode, each page has 10
  88 +* model detail(GET) = give the details of the objects and most important fields of the ones objects its has relationships.
  89 +* model create
  90 +
  91 +**Courses (URL: coursesapi)**
  92 +* course list ("/coursesapi/")
  93 +* course detail ("/coursesapi/id") (id is a parameter)
  94 +
  95 +**Subject (URL: subjectapi)**
  96 +* subject list ("/subjectapi/")
  97 +* subject detail ("/subjectapi/id") (id is a parameter)
  98 +
  99 +**Topic (URL: topicsapi)**
  100 +* topics list ("/topicsapi/")
  101 +* topic detail ("/topicsapi/id") (id is a parameter)
  102 +
  103 +**logs (URL: logs)**
  104 +* logs list ("/logs/")
  105 +* log detail ("/logs/id") (id is a parameter)
  106 +
  107 +#Obtaining an Access Token
  108 +* First build an application o "amadeus/o/applications" following this tutorial: http://django-oauth-toolkit.readthedocs.io/en/latest/tutorial/tutorial_01.html#create-an-oauth2-client-application
  109 +
  110 +* Then request, using a valid user, an access token using the following template (you'll have to know how to translate a GET Method into a POST one)
  111 +curl -X POST -d "grant_type=password&username=<user_name>&password=<password>" -u"<client_id>:<client_secret>" http://amadeus/o/token/
  112 +
  113 +* finally, with your access token you can use test using
  114 +curl -H "Authorization: Bearer <your_access_token>" -X POST -d"username=foo&password=bar" http://localhost:8000/users/ (inserting a new user)
  115 +
  116 +
83 ## Link's úteis 117 ## Link's úteis
84 [Git - Introdução e comandos básicos(PT-BR)](https://github.com/fernandomayer/git-rautu/blob/master/0_configuracao-inicial.md) 118 [Git - Introdução e comandos básicos(PT-BR)](https://github.com/fernandomayer/git-rautu/blob/master/0_configuracao-inicial.md)
85 119
amadeus/settings.py
@@ -43,6 +43,7 @@ INSTALLED_APPS = [ @@ -43,6 +43,7 @@ INSTALLED_APPS = [
43 43
44 'widget_tweaks', 44 'widget_tweaks',
45 'rolepermissions', 45 'rolepermissions',
  46 + 'oauth2_provider',
46 'rest_framework', 47 'rest_framework',
47 'django_bootstrap_breadcrumbs', 48 'django_bootstrap_breadcrumbs',
48 's3direct', 49 's3direct',
@@ -208,6 +209,22 @@ EMAIL_HOST_PASSWORD = &#39;amadeusteste&#39; @@ -208,6 +209,22 @@ EMAIL_HOST_PASSWORD = &#39;amadeusteste&#39;
208 # SMTP CONFIG 209 # SMTP CONFIG
209 # EMAIL_BACKEND = 'core.smtp.AmadeusEmailBackend' 210 # EMAIL_BACKEND = 'core.smtp.AmadeusEmailBackend'
210 211
  212 +#API CONFIG STARTS
  213 +#TELL the rest framework to use a different backend
  214 +REST_FRAMEWORK = {
  215 + 'DEFAULT_AUTHENTICATION_CLASSES':(
  216 + 'oauth2_provider.ext.rest_framework.OAuth2Authentication',),
  217 + 'DEFAULT_PERMISSION_CLASSES':(
  218 + 'rest_framework.permissions.IsAuthenticated',),
  219 + 'PAGE_SIZE': 10, #pagination purposes
  220 +}
  221 +
  222 +OAUTH2_PROVIDER = {
  223 + 'SCOPES':{'read':'Read scope', 'write': 'Write scope'}
  224 +}
  225 +#API CONFIG ENDS
  226 +
  227 +
211 #s3direct 228 #s3direct
212 229
213 # AWS keys 230 # AWS keys
amadeus/uploads/ciencia-da-computacao/teorica/tipfef/Apresentacao_da_Cadidatura_a_Marketing_-_Matheus_Lins.pptx
No preview for this file type
amadeus/uploads/ciencia-da-computacao/teorica/tipfef/Cartao_Outubro.pdf
No preview for this file type
amadeus/uploads/django-summernote/2016-11-03/46bdc2b1-ba27-4385-b504-89916637edca.jpg

25.6 KB

amadeus/uploads/django-summernote/2016-11-03/bde587ad-9c4a-4e81-b07d-8f8aa5dced21.jpeg

12.2 KB

amadeus/uploads/django-summernote/2016-11-03/eaa22970-1d01-4deb-8232-60fd2be4f9fa.jpeg

12.2 KB

amadeus/uploads/links/default.jpg

19.5 KB

amadeus/uploads/sistemas-de-informacao/algoritmo/topico-1/Riachuelo_Outubro.pdf
No preview for this file type
amadeus/uploads/users/Captura_de_tela_de_2016-09-21_21-09-40.png

165 KB

amadeus/urls.py
@@ -25,7 +25,8 @@ urlpatterns = [ @@ -25,7 +25,8 @@ urlpatterns = [
25 url(r'^users/', include('users.urls', namespace = 'users')), 25 url(r'^users/', include('users.urls', namespace = 'users')),
26 url(r'^admin/', admin.site.urls), 26 url(r'^admin/', admin.site.urls),
27 url(r'^', include('core.urls', namespace = 'core')), 27 url(r'^', include('core.urls', namespace = 'core')),
28 - 28 + #API
  29 + url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
29 #S3Direct 30 #S3Direct
30 url(r'^s3direct/', include('s3direct.urls')), 31 url(r'^s3direct/', include('s3direct.urls')),
31 url(r'^summernote/', include('django_summernote.urls')), 32 url(r'^summernote/', include('django_summernote.urls')),
1 from django import forms 1 from django import forms
  2 +from django.core.validators import validate_email
2 from .models import EmailBackend 3 from .models import EmailBackend
3 from django.utils.translation import ugettext_lazy as _ 4 from django.utils.translation import ugettext_lazy as _
4 5
5 class EmailBackendForm(forms.ModelForm): 6 class EmailBackendForm(forms.ModelForm):
  7 + def clean_default_from_email(self):
  8 + default_email = self.cleaned_data['default_from_email']
  9 + validate_email(default_email)
  10 + return default_email
6 11
7 class Meta: 12 class Meta:
8 model = EmailBackend 13 model = EmailBackend
app/templates/admin_settings.html
@@ -19,10 +19,19 @@ @@ -19,10 +19,19 @@
19 <!-- Nav tabs --> 19 <!-- Nav tabs -->
20 <ul class="nav nav-tabs md-pills pills-ins" role="tablist"> 20 <ul class="nav nav-tabs md-pills pills-ins" role="tablist">
21 <li class="nav-item"> 21 <li class="nav-item">
  22 + {% if form.safe_conection.errors or form.host.errors or form.default_from_email.errors %}
  23 + <a class="nav-link" data-toggle="tab" href="#panel1" role="tab"><i class="fa fa-cog"></i> {% trans "System" %}</a>
  24 + </li>
  25 + <li class="nav-item">
  26 + <a class="nav-link active" data-toggle="tab" href="#panel2" role="tab"><i class="fa fa-envelope"></i> {% trans "Mail Sender" %}</a>
  27 + </li>
  28 + {% else %}
22 <a class="nav-link active" data-toggle="tab" href="#panel1" role="tab"><i class="fa fa-cog"></i> {% trans "System" %}</a> 29 <a class="nav-link active" data-toggle="tab" href="#panel1" role="tab"><i class="fa fa-cog"></i> {% trans "System" %}</a>
23 - </li> 30 + </li>
24 <li class="nav-item"> 31 <li class="nav-item">
25 - <a class="nav-link" data-toggle="tab" href="#panel2" role="tab"><i class="fa fa-envelope"></i> {% trans "Mail Sender" %}</a> 32 + <a class="nav-link" data-toggle="tab" href="#panel2" role="tab"><i class="fa fa-envelope"></i> {% trans "Mail Sender" %}</a>
  33 + </li>
  34 + {% endif %}
26 </li> 35 </li>
27 <li class="nav-item"> 36 <li class="nav-item">
28 <a class="nav-link" data-toggle="tab" href="#panel3" role="tab"><i class="fa fa-lock"></i> {% trans "Security" %}</a> 37 <a class="nav-link" data-toggle="tab" href="#panel3" role="tab"><i class="fa fa-lock"></i> {% trans "Security" %}</a>
@@ -32,7 +41,11 @@ @@ -32,7 +41,11 @@
32 <!-- Tab panels --> 41 <!-- Tab panels -->
33 <div class="tab-content"> 42 <div class="tab-content">
34 <!--Panel 1--> 43 <!--Panel 1-->
  44 + {% if form.errors %}
  45 + <div class="tab-pane fade" id="panel1" role="tabpanel">
  46 + {% else %}
35 <div class="tab-pane fade in active" id="panel1" role="tabpanel"> 47 <div class="tab-pane fade in active" id="panel1" role="tabpanel">
  48 + {% endif %}
36 <div class="panel panel-default"> 49 <div class="panel panel-default">
37 <div class="panel-body"> 50 <div class="panel-body">
38 <h3><b>{% trans "General" %}</b></h3> 51 <h3><b>{% trans "General" %}</b></h3>
@@ -48,7 +61,11 @@ @@ -48,7 +61,11 @@
48 <!--/.Panel 1--> 61 <!--/.Panel 1-->
49 62
50 <!--Panel 2--> 63 <!--Panel 2-->
  64 + {% if form.errors %}
  65 + <div class="tab-pane fade in active" id="panel2" role="tabpanel">
  66 + {% else %}
51 <div class="tab-pane fade" id="panel2" role="tabpanel"> 67 <div class="tab-pane fade" id="panel2" role="tabpanel">
  68 + {% endif %}
52 <div class="panel panel-default"> 69 <div class="panel panel-default">
53 <form class="form-horizontal" method="post"> 70 <form class="form-horizontal" method="post">
54 {% csrf_token %} 71 {% csrf_token %}
@@ -59,7 +76,11 @@ @@ -59,7 +76,11 @@
59 <h4><b>{% trans "Settings" %}</b></b></h4> 76 <h4><b>{% trans "Settings" %}</b></b></h4>
60 <hr> 77 <hr>
61 <div class="form-group label-floating"> 78 <div class="form-group label-floating">
62 - <label class="control-label" for="{{ form.description.auto_id }}">{{ form.description.label }}</label> 79 + {% if form.description.field.required %}
  80 + <label class="control-label" for="{{ form.description.auto_id }}">{{ form.description.label }}<span>*</span></label>
  81 + {% else %}
  82 + <label class="control-label" for="{{ form.description.auto_id }}">{{ form.description.label }}</label>
  83 + {% endif %}
63 {% render_field form.description class='form-control' %} 84 {% render_field form.description class='form-control' %}
64 </div> 85 </div>
65 {% if form.description.errors %} 86 {% if form.description.errors %}
@@ -75,7 +96,11 @@ @@ -75,7 +96,11 @@
75 </div> 96 </div>
76 {% endif %} 97 {% endif %}
77 <div class="form-group label-floating"> 98 <div class="form-group label-floating">
78 - <label class="control-label" for="{{ form.host.auto_id }}">{{ form.host.label }}</label> 99 + {% if form.host.field.required %}
  100 + <label class="control-label" for="{{ form.host.auto_id }}">{{ form.host.label }}<span>*</span></label>
  101 + {% else %}
  102 + <label class="control-label" for="{{ form.host.auto_id }}">{{ form.host.label }}</label>
  103 + {% endif %}
79 {% render_field form.host class='form-control' %} 104 {% render_field form.host class='form-control' %}
80 </div> 105 </div>
81 {% if form.host.errors %} 106 {% if form.host.errors %}
@@ -91,7 +116,11 @@ @@ -91,7 +116,11 @@
91 </div> 116 </div>
92 {% endif %} 117 {% endif %}
93 <div class="form-group label-floating"> 118 <div class="form-group label-floating">
94 - <label for="{{ form.port.auto_id }}" class="control-label">{{ form.port.label }}</label> 119 + {% if form.port.field.required %}
  120 + <label class="control-label" for="{{ form.port.auto_id }}">{{ form.port.label }}<span>*</span></label>
  121 + {% else %}
  122 + <label class="control-label" for="{{ form.port.auto_id }}">{{ form.port.label }}</label>
  123 + {% endif %}
95 <div class="col-md-2"> 124 <div class="col-md-2">
96 {% render_field form.port class='form-control' onkeypress='campoNumerico(this,event);' %} 125 {% render_field form.port class='form-control' onkeypress='campoNumerico(this,event);' %}
97 </div> 126 </div>
@@ -120,7 +149,11 @@ @@ -120,7 +149,11 @@
120 <h4><b>{% trans "Security and authentication" %}</b></h4> 149 <h4><b>{% trans "Security and authentication" %}</b></h4>
121 <hr> 150 <hr>
122 <div class="form-group label-floating"> 151 <div class="form-group label-floating">
123 - <label class="control-label" for="{{ form.username.auto_id }}">{{ form.username.label }}</label> 152 + {% if form.username.field.required %}
  153 + <label class="control-label" for="{{ form.username.auto_id }}">{{ form.username.label }}<span>*</span></label>
  154 + {% else %}
  155 + <label class="control-label" for="{{ form.username.auto_id }}">{{ form.username.label }}</label>
  156 + {% endif %}
124 {% render_field form.username class='form-control' %} 157 {% render_field form.username class='form-control' %}
125 </div> 158 </div>
126 {% if form.username.errors %} 159 {% if form.username.errors %}
@@ -136,7 +169,11 @@ @@ -136,7 +169,11 @@
136 </div> 169 </div>
137 {% endif %} 170 {% endif %}
138 <div class="form-group label-floating"> 171 <div class="form-group label-floating">
139 - <label class="control-label" for="{{ form.password.auto_id }}">{{ form.password.label }}</label> 172 + {% if form.password.field.required %}
  173 + <label class="control-label" for="{{ form.password.auto_id }}">{{ form.password.label }}<span>*</span></label>
  174 + {% else %}
  175 + <label class="control-label" for="{{ form.password.auto_id }}">{{ form.password.label }}</label>
  176 + {% endif %}
140 {% render_field form.password type='password' class='form-control' %} 177 {% render_field form.password type='password' class='form-control' %}
141 </div> 178 </div>
142 {% if form.password.errors %} 179 {% if form.password.errors %}
@@ -152,7 +189,11 @@ @@ -152,7 +189,11 @@
152 </div> 189 </div>
153 {% endif %} 190 {% endif %}
154 <div class="form-group label-floating"> 191 <div class="form-group label-floating">
155 - <label class="control-label" for="{{ form.default_from_email.auto_id }}">{{ form.default_from_email.label }}</label> 192 + {% if form.default_from_email.field.required %}
  193 + <label class="control-label" for="{{ form.default_from_email.auto_id }}">{{ form.default_from_email.label }}<span>*</span></label>
  194 + {% else %}
  195 + <label class="control-label" for="{{ form.default_from_email.auto_id }}">{{ form.default_from_email.label }}</label>
  196 + {% endif %}
156 {% render_field form.default_from_email class='form-control' %} 197 {% render_field form.default_from_email class='form-control' %}
157 </div> 198 </div>
158 {% if form.default_from_email.errors %} 199 {% if form.default_from_email.errors %}
@@ -168,7 +209,11 @@ @@ -168,7 +209,11 @@
168 </div> 209 </div>
169 {% endif %} 210 {% endif %}
170 <div class="form-group"> 211 <div class="form-group">
171 - <p><b>{{ form.safe.connection.label }}</b></p> 212 + {% if form.safe_conection.fiel.required %}
  213 + <p><b>{{ form.safe_conection.label }}<span>*</span></b></p>
  214 + {% else %}
  215 + <p><b>{{ form.safe_conection.label }}</b></p>
  216 + {% endif %}
172 <div class="col-md-10"> 217 <div class="col-md-10">
173 <div class="radio radio-primary"> 218 <div class="radio radio-primary">
174 {% for value, text in form.safe_conection.field.choices %} 219 {% for value, text in form.safe_conection.field.choices %}
@@ -186,13 +231,13 @@ @@ -186,13 +231,13 @@
186 </div> 231 </div>
187 </div> 232 </div>
188 </div> 233 </div>
189 - {% if form.safe_connection.errors %} 234 + {% if form.safe_conection.errors %}
190 <div class="alert alert-danger alert-dismissible clearfix" role="alert"> 235 <div class="alert alert-danger alert-dismissible clearfix" role="alert">
191 <button type="button" class="close" data-dismiss="alert" aria-label="Close"> 236 <button type="button" class="close" data-dismiss="alert" aria-label="Close">
192 <span aria-hidden="true">&times;</span> 237 <span aria-hidden="true">&times;</span>
193 </button> 238 </button>
194 <ul> 239 <ul>
195 - {% for error in form.safe_connection.errors %} 240 + {% for error in form.safe_conection.errors %}
196 <li>{{ error }}</li> 241 <li>{{ error }}</li>
197 {% endfor %} 242 {% endfor %}
198 </ul> 243 </ul>
@@ -200,7 +245,7 @@ @@ -200,7 +245,7 @@
200 {% endif %} 245 {% endif %}
201 </div> 246 </div>
202 </div> 247 </div>
203 - <button type="submit" class="btn btn-success btn-raised">{% trans "Save changes" %}</button> 248 + <button type="submit" class="btn btn-success btn-raised" name="submit-settings">{% trans "Save changes" %}</button>
204 </div> 249 </div>
205 </form> 250 </form>
206 </div> 251 </div>
app/templates/home.html
@@ -66,6 +66,7 @@ @@ -66,6 +66,7 @@
66 {% breadcrumb 'Home' 'app:index' %} 66 {% breadcrumb 'Home' 'app:index' %}
67 {% endblock %} 67 {% endblock %}
68 68
  69 +
69 {% block render_breadcrumbs %} 70 {% block render_breadcrumbs %}
70 {% render_breadcrumbs %} 71 {% render_breadcrumbs %}
71 {% endblock %} 72 {% endblock %}
@@ -77,13 +78,10 @@ @@ -77,13 +78,10 @@
77 </div> 78 </div>
78 <div class="panel-body"> 79 <div class="panel-body">
79 <ul class="nav nav-pills nav-stacked"> 80 <ul class="nav nav-pills nav-stacked">
80 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
81 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
82 {% if user|has_role:'student' or not user.is_staff %} 81 {% if user|has_role:'student' or not user.is_staff %}
83 <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li> 82 <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>
84 <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li> 83 <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li>
85 {% endif %} 84 {% endif %}
86 - <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li>  
87 {% if user|has_role:'system_admin' %} 85 {% if user|has_role:'system_admin' %}
88 <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> 86 <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>
89 <li> <a href="{% url 'app:settings' %}">{% trans 'Settings' %}</a></li> 87 <li> <a href="{% url 'app:settings' %}">{% trans 'Settings' %}</a></li>
app/templates/home_professor.html
@@ -15,18 +15,6 @@ @@ -15,18 +15,6 @@
15 {% endblock %} 15 {% endblock %}
16 16
17 {% block sidebar %} 17 {% block sidebar %}
18 - <div class="panel panel-primary">  
19 - <div class="panel-heading">  
20 - <h5>{% trans 'Menu' %}</h5>  
21 - </div>  
22 - <div class="panel-body">  
23 - <ul class="nav nav-pills nav-stacked">  
24 - <li><a href="javascript:void(0)">{% trans 'Pending tasks' %}</a></li>  
25 - <li><a href="{% url 'course:create' %}">{% trans 'Create Course' %}</a></li>  
26 - <li><a href="{% url 'course:manage' %}">{% trans 'Manage Course' %}</a></li>  
27 - </ul>  
28 - </div>  
29 - </div>  
30 {% endblock %} 18 {% endblock %}
31 19
32 {% block content %} 20 {% block content %}
app/templates/home_student.html
@@ -16,19 +16,6 @@ @@ -16,19 +16,6 @@
16 16
17 17
18 {% block sidebar %} 18 {% block sidebar %}
19 - <div class="panel panel-primary">  
20 - <div class="panel-heading">  
21 - <h4>{% trans 'Menu' %}</h4>  
22 - </div>  
23 - <div class="panel-body">  
24 - <ul class="nav nav-pills nav-stacked">  
25 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
26 - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>  
27 - <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li>  
28 - <li><a href="javascript:void(0)">{% trans 'Google accounts' %}</a></li>  
29 - </ul>  
30 - </div>  
31 - </div>  
32 {% endblock %} 19 {% endblock %}
33 20
34 {% block content %} 21 {% block content %}
@@ -75,11 +75,12 @@ class AmadeusSettings(LoginRequiredMixin, HasRoleMixin, generic.CreateView): @@ -75,11 +75,12 @@ class AmadeusSettings(LoginRequiredMixin, HasRoleMixin, generic.CreateView):
75 75
76 def get_context_data(self, **kwargs): 76 def get_context_data(self, **kwargs):
77 context = super(AmadeusSettings, self).get_context_data(**kwargs) 77 context = super(AmadeusSettings, self).get_context_data(**kwargs)
78 - try:  
79 - setting = EmailBackend.objects.latest('id')  
80 - context['form'] = EmailBackendForm(instance = setting)  
81 - except:  
82 - pass 78 + if not self.request.method == 'POST':
  79 + try:
  80 + setting = EmailBackend.objects.latest('id')
  81 + context['form'] = EmailBackendForm(instance = setting)
  82 + except:
  83 + pass
83 return context 84 return context
84 85
85 86
core/decorators.py
@@ -38,7 +38,8 @@ def log_decorator(log_component = &#39;&#39;, log_action = &#39;&#39;, log_resource = &#39;&#39;): @@ -38,7 +38,8 @@ def log_decorator(log_component = &#39;&#39;, log_action = &#39;&#39;, log_resource = &#39;&#39;):
38 log = Log() 38 log = Log()
39 log.user = request.user 39 log.user = request.user
40 log.component = log_component 40 log.component = log_component
41 - log.context = json.dumps(request.log_context) 41 + #log.context = json.dumps(request.log_context)
  42 + log.context = request.log_context
42 log.action_resource = action_resource 43 log.action_resource = action_resource
43 44
44 log.save() 45 log.save()
@@ -16,7 +16,7 @@ class RegisterUserForm(forms.ModelForm): @@ -16,7 +16,7 @@ class RegisterUserForm(forms.ModelForm):
16 16
17 def validate_cpf(self, cpf): 17 def validate_cpf(self, cpf):
18 cpf = ''.join(re.findall('\d', str(cpf))) 18 cpf = ''.join(re.findall('\d', str(cpf)))
19 - 19 +
20 if cpfcnpj.validate(cpf): 20 if cpfcnpj.validate(cpf):
21 return True 21 return True
22 return False 22 return False
@@ -38,8 +38,8 @@ class RegisterUserForm(forms.ModelForm): @@ -38,8 +38,8 @@ class RegisterUserForm(forms.ModelForm):
38 cpf = self.cleaned_data['cpf'] 38 cpf = self.cleaned_data['cpf']
39 if User.objects.filter(cpf = cpf).exists(): 39 if User.objects.filter(cpf = cpf).exists():
40 raise forms.ValidationError(_('There is already a registeres User with this CPF')) 40 raise forms.ValidationError(_('There is already a registeres User with this CPF'))
41 - if not self.validate_cpf(cpf):  
42 - raise forms.ValidationError(_('Please enter a valid CPF')) 41 + # if not self.validate_cpf(cpf):
  42 + # raise forms.ValidationError(_('Please enter a valid CPF'))
43 return cpf 43 return cpf
44 44
45 def clean_password(self): 45 def clean_password(self):
@@ -68,12 +68,12 @@ class RegisterUserForm(forms.ModelForm): @@ -68,12 +68,12 @@ class RegisterUserForm(forms.ModelForm):
68 def save(self, commit=True): 68 def save(self, commit=True):
69 super(RegisterUserForm, self).save(commit=False) 69 super(RegisterUserForm, self).save(commit=False)
70 self.instance.set_password(self.cleaned_data['password']) 70 self.instance.set_password(self.cleaned_data['password'])
71 - 71 +
72 self.instance.save() 72 self.instance.save()
73 return self.instance 73 return self.instance
74 74
75 class Meta: 75 class Meta:
76 model = User 76 model = User
77 # exclude = ['is_staff', 'is_active'] 77 # exclude = ['is_staff', 'is_active']
78 - fields = ['username', 'name', 'email', 'city', 'state', 'gender', 'cpf', 'birth_date', 'phone', 'image', 'titration', 78 + fields = ['username', 'name', 'email', 'city', 'state', 'gender', 'cpf', 'birth_date', 'phone', 'image', 'titration',
79 'year_titration', 'institution', 'curriculum',] 79 'year_titration', 'institution', 'curriculum',]
80 \ No newline at end of file 80 \ No newline at end of file
core/middleware.py
1 from datetime import datetime 1 from datetime import datetime
  2 +import time
  3 +from django.core.urlresolvers import resolve
2 from django.shortcuts import get_object_or_404 4 from django.shortcuts import get_object_or_404
3 import json 5 import json
4 6
@@ -9,33 +11,24 @@ class TimeSpentMiddleware(object): @@ -9,33 +11,24 @@ class TimeSpentMiddleware(object):
9 self.get_response = get_response 11 self.get_response = get_response
10 12
11 def process_request(self, request): 13 def process_request(self, request):
12 - if not request.is_ajax():  
13 - log_id = request.session.get('log_id', None) 14 + app_names = resolve(request.path).app_names
14 15
15 - if not log_id is None:  
16 - log = get_object_or_404(Log, id = log_id) 16 + if not 'admin' in app_names:
  17 + if not request.is_ajax():
  18 + log_id = request.session.get('log_id', None)
17 19
18 - date_time_click = datetime.strptime(request.session.get('time_spent'), "%Y-%m-%d %H:%M:%S.%f")  
19 - _now = datetime.now()  
20 -  
21 - time_spent = _now - date_time_click  
22 -  
23 - secs = time_spent.total_seconds()  
24 - hours = int(secs / 3600)  
25 - minutes = int(secs / 60) % 60  
26 - secs = secs % 60 20 + if not log_id is None:
  21 + log = get_object_or_404(Log, id = log_id)
27 22
28 - log_context = json.loads(log.context) 23 + if type(log.context) == dict:
  24 + log_context = log.context
  25 + else:
  26 + log_context = json.loads(log.context)
29 27
30 - log_context['time_spent'] = {}  
31 - log_context['time_spent']['hours'] = hours  
32 - log_context['time_spent']['minutes'] = minutes  
33 - log_context['time_spent']['seconds'] = secs 28 + log_context['timestamp_end'] = str(int(time.time()))
34 29
35 - log.context = json.dumps(log_context)  
36 -  
37 - log.save()  
38 -  
39 - request.session['log_id'] = None 30 + log.context = log_context
40 31
  32 + log.save()
41 33
  34 + request.session['log_id'] = None
core/mixins.py
@@ -36,7 +36,8 @@ class LogMixin(object): @@ -36,7 +36,8 @@ class LogMixin(object):
36 36
37 log = Log() 37 log = Log()
38 log.user = actor 38 log.user = actor
39 - log.context = json.dumps(context) 39 + #log.context = json.dumps(context)
  40 + log.context = context
40 log.component = component 41 log.component = component
41 log.action_resource = action_resource 42 log.action_resource = action_resource
42 43
core/models.py
@@ -2,6 +2,7 @@ from django.db import models @@ -2,6 +2,7 @@ from django.db import models
2 from django.utils.translation import ugettext_lazy as _ 2 from django.utils.translation import ugettext_lazy as _
3 from users.models import User 3 from users.models import User
4 from autoslug.fields import AutoSlugField 4 from autoslug.fields import AutoSlugField
  5 +from django.contrib.postgres.fields import JSONField
5 # Create your models here. 6 # Create your models here.
6 7
7 class MimeType(models.Model): 8 class MimeType(models.Model):
@@ -102,7 +103,7 @@ class Notification(models.Model): @@ -102,7 +103,7 @@ class Notification(models.Model):
102 103
103 class Log(models.Model): 104 class Log(models.Model):
104 component = models.TextField(_('Component (Module / App)')) 105 component = models.TextField(_('Component (Module / App)'))
105 - context = models.TextField(_('Context'), blank = True) 106 + context = JSONField(_('Context'), blank = True)
106 action_resource = models.ForeignKey(Action_Resource, verbose_name = _('Action_Resource')) 107 action_resource = models.ForeignKey(Action_Resource, verbose_name = _('Action_Resource'))
107 user = models.ForeignKey(User, verbose_name = _('Actor')) 108 user = models.ForeignKey(User, verbose_name = _('Actor'))
108 datetime = models.DateTimeField(_("Date and Time of action"), auto_now_add = True) 109 datetime = models.DateTimeField(_("Date and Time of action"), auto_now_add = True)
core/serializers.py
@@ -4,4 +4,5 @@ from .models import Log @@ -4,4 +4,5 @@ from .models import Log
4 class LogSerializer(serializers.ModelSerializer): 4 class LogSerializer(serializers.ModelSerializer):
5 class Meta: 5 class Meta:
6 model = Log 6 model = Log
  7 + fields = '__all__'
7 8
8 \ No newline at end of file 9 \ No newline at end of file
core/static/css/base/amadeus.css
@@ -22,6 +22,9 @@ @@ -22,6 +22,9 @@
22 position: absolute; 22 position: absolute;
23 left: 30%; 23 left: 30%;
24 } 24 }
  25 +#btn-search{
  26 + margin-bottom: 0px;
  27 + }
25 .user-notification-img{ 28 .user-notification-img{
26 width:40%; 29 width:40%;
27 } 30 }
@@ -427,7 +430,7 @@ ul, li { @@ -427,7 +430,7 @@ ul, li {
427 .course-card-group{ 430 .course-card-group{
428 margin-bottom: 1%; 431 margin-bottom: 1%;
429 } 432 }
430 - 433 +.data_register_course p{ color: grey; }
431 .category-course-link{ 434 .category-course-link{
432 font-size: 24px; 435 font-size: 24px;
433 color: black !important; 436 color: black !important;
@@ -453,4 +456,4 @@ ul, li { @@ -453,4 +456,4 @@ ul, li {
453 456
454 #panel2 .col-md-2, #panel2 .col-md-10{ 457 #panel2 .col-md-2, #panel2 .col-md-10{
455 padding-left: 0; 458 padding-left: 0;
456 -}  
457 \ No newline at end of file 459 \ No newline at end of file
  460 +}
core/static/js/topic_editation_presentation_search.js 0 → 100644
@@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
  1 +
  2 +var x = 0;
  3 +$(".edit_card").on('click', function() {
  4 + $(".presentation").css('display','none');
  5 + $(".editation").css('display','block');
  6 +})
  7 +$(".edit_card_end").on('click', function() {
  8 + $(".editation").css('display','none');
  9 + $(".presentation").css('display','block');
  10 +})
  11 +
  12 +$("#bot").on('click', function(){
  13 + x = x+1;
  14 + console.log(2)
  15 + if(x%2 == 0){
  16 + console.log(0)
  17 + $("#down").attr('class', 'fa fa-caret-square-o-down');
  18 +}
  19 +else{
  20 + console.log(1)
  21 + $("#down").attr('class', 'fa fa-caret-square-o-up');
  22 +}
  23 +
  24 +})
  25 +$("#bot1").on('click', function(){
  26 + x = x+1;
  27 + console.log(2)
  28 + if(x%2 == 0){
  29 + console.log(0)
  30 + $("#down1").attr('class', 'fa fa-caret-square-o-down');
  31 +}
  32 +else{
  33 + console.log(1)
  34 + $("#down1").attr('class', 'fa fa-caret-square-o-up');
  35 +}
  36 +
  37 +})
  38 +
  39 +$("#bot2").on('click', function(){
  40 + x = x+1;
  41 + console.log(2)
  42 + if(x%2 == 0){
  43 + console.log(0)
  44 + $("#down2").attr('class', 'fa fa-caret-square-o-down');
  45 +}
  46 +else{
  47 + console.log(1)
  48 + $("#down2").attr('class', 'fa fa-caret-square-o-up');
  49 +}
  50 +
  51 +})
  52 +
  53 +$("#bot3").on('click', function(){
  54 + x = x+1;
  55 + console.log(2)
  56 + if(x%2 == 0){
  57 + console.log(0)
  58 + $("#down3").attr('class', 'fa fa-caret-square-o-down');
  59 +}
  60 +else{
  61 + console.log(1)
  62 + $("#down3").attr('class', 'fa fa-caret-square-o-up');
  63 +}
  64 +
  65 +})
  66 +$("#bot4").on('click', function(){
  67 + x = x+1;
  68 + console.log(2)
  69 + if(x%2 == 0){
  70 + console.log(0)
  71 + $("#down4").attr('class', 'fa fa-caret-square-o-down');
  72 +}
  73 +else{
  74 + console.log(1)
  75 + $("#down4").attr('class', 'fa fa-caret-square-o-up');
  76 +}
  77 +
  78 +})
  79 +
core/templates/base.html
@@ -54,6 +54,12 @@ @@ -54,6 +54,12 @@
54 {% endblock %} 54 {% endblock %}
55 {% block javascript %} 55 {% block javascript %}
56 {% endblock %} 56 {% endblock %}
  57 +
  58 + <!-- Summernote -->
  59 + <script src="http://podivej.se/js/summernote.min.js" type="text/javascript"></script>
  60 + <link href="http://podivej.se/css/summernote.css" type="text/css" rel="stylesheet" />
  61 + <link href="http://podivej.se/css/summernote-bs3.css" type="text/css" rel="stylesheet">
  62 +
57 </head> 63 </head>
58 <body> 64 <body>
59 {% block nav %} 65 {% block nav %}
@@ -66,20 +72,24 @@ @@ -66,20 +72,24 @@
66 </button> 72 </button>
67 <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a> 73 <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a>
68 </div> 74 </div>
69 - <div class="navbar-collapse collapse navbar-responsive-collapse"> 75 + <div class="navbar-collapse collapse navbar-responsive-collapse">
70 <div class="col-md-5 cards-content" id= 'NavBarSearch'> 76 <div class="col-md-5 cards-content" id= 'NavBarSearch'>
71 <form id="SearchForm" action="{% url 'users:search' %}" method="get" accept-charset="utf-8"> 77 <form id="SearchForm" action="{% url 'users:search' %}" method="get" accept-charset="utf-8">
72 <div class="input-group"> 78 <div class="input-group">
73 <div class="form-group is-empty" > 79 <div class="form-group is-empty" >
74 - <input type="text" class="form-control" placeholder="{% trans 'Search Files (.pdf, others) and/or activities' %}" name="search"></div> 80 + <input type="text" class="form-control" placeholder="{% trans 'Search Files (.pdf, others) and/or activities' %}" name="search">
  81 + </div>
75 <span class="input-group-btn input-group-sm"> 82 <span class="input-group-btn input-group-sm">
76 - <button type="submit" class="btn btn-fab btn-fab-mini">  
77 - <i class="glyphicon glyphicon-search" aria-hidden="true" style="color:#93C741"></i> 83 + <button type="submit" class="btn btn-primary" id="btn-search">
  84 + <i class="fa fa-search fa-2x" aria-hidden="true" style="color:#93C741"></i>
78 </button> 85 </button>
79 - </span> 86 + </span>
  87 +
  88 +
80 </div> 89 </div>
81 </form> 90 </form>
82 </div> 91 </div>
  92 +
83 <ul class="nav navbar-nav navbar-right notifications"> 93 <ul class="nav navbar-nav navbar-right notifications">
84 <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications"> 94 <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications">
85 <a class="dropdown-toggle" data-toggle="dropdown"> <span id="notification-count" class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell" aria-hidden="true"></i></a> 95 <a class="dropdown-toggle" data-toggle="dropdown"> <span id="notification-count" class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell" aria-hidden="true"></i></a>
@@ -109,53 +119,6 @@ @@ -109,53 +119,6 @@
109 <div class="row"> 119 <div class="row">
110 <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2"> 120 <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2">
111 {% block sidebar %} 121 {% block sidebar %}
112 - <div class="panel panel-primary navigation">  
113 - <div class="panel-heading">  
114 - <h4>{% trans "Menu" %}</h4>  
115 - </div>  
116 - <div class="panel-body">  
117 - <ul class="nav nav-pills nav-stacked">  
118 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
119 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
120 - {% if user|has_role:'student' or not user.is_staff %}  
121 - <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>  
122 - <li><a href="{% url 'core:all_courses' %}">{% trans 'All Courses' %}</a></li>  
123 - {% endif %}  
124 - <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li>  
125 - {% if user|has_role:'system_admin' %}  
126 - <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>  
127 - {% endif %}  
128 - {% if user|has_role:'system_admin' or user|has_role:'professor' %}  
129 - <li>  
130 - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a>  
131 - <div id="courses_list" class="collapse">  
132 - <ul class="nav nav-pill nav-stacked accordion_list">  
133 - {% for course in courses_list %}  
134 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
135 - {% endfor %}  
136 - </ul>  
137 - </div>  
138 - </li>  
139 - {% endif %}  
140 - </ul>  
141 - </div>  
142 - </div>  
143 -  
144 - {% if user|has_role:'professor' or user|has_role:'system_admin' %}  
145 -  
146 - <div class="panel panel-primary navigation">  
147 - <div class="panel-heading">  
148 - <h3 class="panel-title">{% trans 'Category' %}</h3>  
149 - </div>  
150 - <div class="panel-body">  
151 - <ul class="nav nav-pills nav-stacked">  
152 - <li><a href="{% url 'course:create_cat' %}">{% trans 'Create Category'%}</a></li>  
153 - <li><a href="{% url 'course:manage_cat' %}">{% trans 'List Category' %}</a></li>  
154 - </ul>  
155 - </div>  
156 - </div>  
157 -  
158 - {% endif %}  
159 {% endblock %} 122 {% endblock %}
160 </div> 123 </div>
161 <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> 124 <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10">
@@ -3,6 +3,19 @@ from django.contrib.auth import views as auth_views @@ -3,6 +3,19 @@ from django.contrib.auth import views as auth_views
3 from django.contrib.auth.views import password_reset, password_reset_done,password_reset_confirm, password_reset_complete 3 from django.contrib.auth.views import password_reset, password_reset_done,password_reset_confirm, password_reset_complete
4 from . import views 4 from . import views
5 5
  6 +#API IMPORTS
  7 +from rest_framework import routers
  8 +
  9 +from users.views import UserViewSet
  10 +from courses.views import CourseViewSet, TopicViewSet, SubjectViewSet
  11 +
  12 +#API CODE
  13 +router = routers.DefaultRouter()
  14 +router.register(r'logs', views.LogViewSet)
  15 +router.register(r'usersapi', UserViewSet)
  16 +router.register(r'coursesapi', CourseViewSet)
  17 +router.register(r'topicsapi', TopicViewSet)
  18 +router.register(r'subjectapi', SubjectViewSet)
6 19
7 urlpatterns = [ 20 urlpatterns = [
8 url(r'^$', views.login, name='home'), 21 url(r'^$', views.login, name='home'),
@@ -14,7 +27,8 @@ urlpatterns = [ @@ -14,7 +27,8 @@ urlpatterns = [
14 url(r'^guest/$', views.GuestView.as_view(), name='guest'), 27 url(r'^guest/$', views.GuestView.as_view(), name='guest'),
15 28
16 #API REST 29 #API REST
17 - url(r'^logs/$', views.get_log), 30 + url(r'^', include(router.urls)),
  31 + #url(r'^logs/$', views.get_log),
18 32
19 #Reset Password 33 #Reset Password
20 34
@@ -30,3 +44,5 @@ urlpatterns = [ @@ -30,3 +44,5 @@ urlpatterns = [
30 url(r'^done/$', password_reset_complete,{'template_name':'registration/passwor_reset_complete.html'}), 44 url(r'^done/$', password_reset_complete,{'template_name':'registration/passwor_reset_complete.html'}),
31 45
32 ] 46 ]
  47 +
  48 +
@@ -16,8 +16,9 @@ from rolepermissions.shortcuts import assign_role @@ -16,8 +16,9 @@ from rolepermissions.shortcuts import assign_role
16 from django.contrib.auth.decorators import login_required 16 from django.contrib.auth.decorators import login_required
17 #API REST IMPORTS 17 #API REST IMPORTS
18 from .serializers import LogSerializer 18 from .serializers import LogSerializer
19 -from rest_framework.renderers import JSONRenderer  
20 -from rest_framework.parsers import JSONParser 19 +from rest_framework import status, serializers, permissions, viewsets
  20 +from rest_framework.response import Response
  21 +from rest_framework.decorators import api_view
21 22
22 from .forms import RegisterUserForm 23 from .forms import RegisterUserForm
23 from .decorators import log_decorator, notification_decorator 24 from .decorators import log_decorator, notification_decorator
@@ -135,19 +136,10 @@ class GuestView (ListView): @@ -135,19 +136,10 @@ class GuestView (ListView):
135 context['categorys_courses'] = CourseCategory.objects.all() 136 context['categorys_courses'] = CourseCategory.objects.all()
136 return context 137 return context
137 138
138 -class JSONResponse(HttpResponse):  
139 - """  
140 - An HttpResponse that renders its content into JSON.  
141 - """  
142 - def __init__(self, data, **kwargs):  
143 - content = JSONRenderer().render(data)  
144 - kwargs['content_type'] = 'application/json'  
145 - super(JSONResponse, self).__init__(content, **kwargs) 139 +
146 140
147 #REST API VIEWS 141 #REST API VIEWS
148 -@login_required  
149 -def get_log(request):  
150 - if request.method == 'GET':  
151 - logs = Log.objects.all()  
152 - serializer = LogSerializer(logs, many=True)  
153 - return JSONResponse(serializer.data) 142 +class LogViewSet(viewsets.ModelViewSet):
  143 + permission_classes = [permissions.IsAuthenticated]
  144 + queryset = Log.objects.all()
  145 + serializer_class = LogSerializer
courses/forms.py
@@ -51,34 +51,37 @@ class CourseForm(forms.ModelForm): @@ -51,34 +51,37 @@ class CourseForm(forms.ModelForm):
51 class Meta: 51 class Meta:
52 model = Course 52 model = Course
53 fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date', 53 fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date',
54 - 'init_date', 'end_date', 'category',) 54 + 'init_date', 'end_date', 'category', 'coordenator')
55 labels = { 55 labels = {
56 - 'name': _('Name'),  
57 - 'objectivies': _('Objectives'),  
58 - 'content': _('Content'),  
59 - 'max_students': _('Number of studets maximum'),  
60 - 'init_register_date': _('Course registration start date'),  
61 - 'end_register_date': _('Course registration end date'),  
62 - 'init_date': _('Course start date'),  
63 - 'end_date': _('Course end date'),  
64 - 'category': _('CourseCategory'), 56 + 'name': _('Name'),
  57 + 'objectivies': _('Objectives'),
  58 + 'content': _('Content'),
  59 + 'max_students': _('Number of studets maximum'),
  60 + 'init_register_date': _('Course registration start date'),
  61 + 'end_register_date': _('Course registration end date'),
  62 + 'init_date': _('Course start date'),
  63 + 'end_date': _('Course end date'),
  64 + 'category': _('CourseCategory'),
  65 + 'coordenator': _('Coordenator'),
65 } 66 }
66 help_texts = { 67 help_texts = {
67 - 'name': _('Course name'),  
68 - 'objectivies': _('Course objective'),  
69 - 'content': _('Course modules'),  
70 - 'max_students': _('Max number of students that a class can have'),  
71 - 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),  
72 - 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),  
73 - 'init_date': _('Date that the course starts (dd/mm/yyyy)'),  
74 - 'end_date': _('Date that the course ends (dd/mm/yyyy)'),  
75 - 'category': _('CourseCategory which the course belongs'), 68 + 'name': _('Course name'),
  69 + 'objectivies': _('Course objective'),
  70 + 'content': _('Course modules'),
  71 + 'max_students': _('Max number of students that a class can have'),
  72 + 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),
  73 + 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),
  74 + 'init_date': _('Date that the course starts (dd/mm/yyyy)'),
  75 + 'end_date': _('Date that the course ends (dd/mm/yyyy)'),
  76 + 'category': _('CourseCategory which the course belongs'),
  77 + 'coordenator': _('Course Coordenator'),
76 } 78 }
77 79
78 widgets = { 80 widgets = {
79 - 'categoy': forms.Select(),  
80 - 'objectivies': SummernoteWidget(attrs={'cols': 80, 'rows': 5}),  
81 - 'content': SummernoteWidget(attrs={'cols': 80, 'rows': 5}), 81 + 'categoy': forms.Select(),
  82 + 'coordenator': forms.Select(),
  83 + 'objectivies': SummernoteWidget(attrs={'cols': 80, 'rows': 5}),
  84 + 'content': SummernoteWidget(attrs={'cols': 80, 'rows': 5}),
82 } 85 }
83 86
84 class UpdateCourseForm(CourseForm): 87 class UpdateCourseForm(CourseForm):
@@ -89,35 +92,38 @@ class UpdateCourseForm(CourseForm): @@ -89,35 +92,38 @@ class UpdateCourseForm(CourseForm):
89 class Meta: 92 class Meta:
90 model = Course 93 model = Course
91 fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date', 94 fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date',
92 - 'init_date', 'end_date', 'category','students',) 95 + 'init_date', 'end_date', 'category','students', 'coordenator')
93 labels = { 96 labels = {
94 - 'name': _('Name'),  
95 - 'objectivies': _('Objectives'),  
96 - 'content': _('Content'),  
97 - 'max_students': _('Number of studets maximum'),  
98 - 'init_register_date': _('Course registration start date'),  
99 - 'end_register_date': _('Course registration end date'),  
100 - 'init_date': _('Course start date'),  
101 - 'end_date': _('Course end date'),  
102 - 'category': _('CourseCategory'),  
103 - 'students': _('Student'), 97 + 'name': _('Name'),
  98 + 'objectivies': _('Objectives'),
  99 + 'content': _('Content'),
  100 + 'max_students': _('Number of studets maximum'),
  101 + 'init_register_date': _('Course registration start date'),
  102 + 'end_register_date': _('Course registration end date'),
  103 + 'init_date': _('Course start date'),
  104 + 'end_date': _('Course end date'),
  105 + 'category': _('CourseCategory'),
  106 + 'coordenator': _('Coordenator'),
  107 + 'students': _('Student'),
104 } 108 }
105 help_texts = { 109 help_texts = {
106 - 'name': _('Course name'),  
107 - 'objectivies': _('Course objective'),  
108 - 'content': _('Course modules'),  
109 - 'max_students': _('Max number of students that a class can have'),  
110 - 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),  
111 - 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),  
112 - 'init_date': _('Date that the course starts (dd/mm/yyyy)'),  
113 - 'end_date': _('Date that the course ends (dd/mm/yyyy)'),  
114 - 'category': _('CourseCategory which the course belongs'),  
115 - 'students': _("Course's Students"), 110 + 'name': _('Course name'),
  111 + 'objectivies': _('Course objective'),
  112 + 'content': _('Course modules'),
  113 + 'max_students': _('Max number of students that a class can have'),
  114 + 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),
  115 + 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),
  116 + 'init_date': _('Date that the course starts (dd/mm/yyyy)'),
  117 + 'end_date': _('Date that the course ends (dd/mm/yyyy)'),
  118 + 'category': _('CourseCategory which the course belongs'),
  119 + 'coordenator': _('Course Coordenator'),
  120 + 'students': _("Course's Students"),
116 } 121 }
117 widgets = { 122 widgets = {
118 - 'categoy': forms.Select(),  
119 - 'objectivies': SummernoteWidget(attrs={'cols': 80, 'rows': 5}),  
120 - 'content': SummernoteWidget(attrs={'cols': 80, 'rows': 5}), 123 + 'categoy': forms.Select(),
  124 + 'coordenator': forms.Select(),
  125 + 'objectivies': SummernoteWidget(attrs={'cols': 80, 'rows': 5}),
  126 + 'content': SummernoteWidget(attrs={'cols': 80, 'rows': 5}),
121 } 127 }
122 128
123 class SubjectForm(forms.ModelForm): 129 class SubjectForm(forms.ModelForm):
courses/migrations/0004_course_coordenator.py 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-08 15:00
  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 + dependencies = [
  13 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  14 + ('courses', '0003_remove_course_image'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.AddField(
  19 + model_name='course',
  20 + name='coordenator',
  21 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='course_coordenator', to=settings.AUTH_USER_MODEL, verbose_name='Coordenator'),
  22 + ),
  23 + ]
courses/models.py
@@ -47,6 +47,7 @@ class Course(models.Model): @@ -47,6 +47,7 @@ class Course(models.Model):
47 init_date = models.DateField(_('Begin of Course Date')) 47 init_date = models.DateField(_('Begin of Course Date'))
48 end_date = models.DateField(_('End of Course Date')) 48 end_date = models.DateField(_('End of Course Date'))
49 category = models.ForeignKey(CourseCategory, verbose_name = _('Category'), related_name='course_category') 49 category = models.ForeignKey(CourseCategory, verbose_name = _('Category'), related_name='course_category')
  50 + coordenator = models.ForeignKey(User, verbose_name = _('Coordenator'), related_name ='course_coordenator', null = True)
50 professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses_professors') 51 professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses_professors')
51 students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student', blank = True) 52 students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student', blank = True)
52 public = models.BooleanField(_('Public'), default=False) 53 public = models.BooleanField(_('Public'), default=False)
courses/serializers.py 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +from rest_framework import serializers
  2 +from .models import Course, Subject, Topic
  3 +from users.serializers import UserSerializer
  4 +
  5 +class CourseSerializer(serializers.ModelSerializer):
  6 + #The set comes from the ManyToMany Relationship in django
  7 + class Meta:
  8 + model = Course
  9 + fields = ('name', 'slug', 'objectivies', 'content', 'max_students', 'create_date',
  10 + 'init_register_date', 'end_register_date', 'init_date', 'end_date', 'public', 'category' ,'students', 'professors')
  11 +
  12 +class SubjectSerializer(serializers.ModelSerializer):
  13 + class Meta:
  14 + model = Subject
  15 + fields = ('name','slug','description','visible','init_date','course','category','professors','course','students')
  16 +
  17 +class TopicSerializer(serializers.ModelSerializer):
  18 + class Meta:
  19 + model = Topic
  20 + fields = ('name', 'slug','description','create_date','update_date','visible','owner','subject')
  21 +
  22 +
courses/static/js/modal_category.js
@@ -16,16 +16,16 @@ var Submite = { @@ -16,16 +16,16 @@ var Submite = {
16 } 16 }
17 } 17 }
18 18
19 -var modal = {  
20 - get: function (url, id_modal, id_div_modal){  
21 - $.get(url, function(data){  
22 - if($(id_modal).length){  
23 - $(id_div_modal).empty();  
24 - $(id_div_modal).append(data);  
25 - } else {  
26 - $(id_div_modal).append(data);  
27 - }  
28 - $(id_modal).modal('show');  
29 - });  
30 - }  
31 -};  
32 \ No newline at end of file 19 \ No newline at end of file
  20 +// var modal = {
  21 +// get: function (url, id_modal, id_div_modal){
  22 +// $.get(url, function(data){
  23 +// if($(id_modal).length){
  24 +// $(id_div_modal).empty();
  25 +// $(id_div_modal).append(data);
  26 +// } else {
  27 +// $(id_div_modal).append(data);
  28 +// }
  29 +// $(id_modal).modal('show');
  30 +// });
  31 +// }
  32 +// };
courses/static/js/topic_editation_presentation.js
  1 +
1 $(document).ready(function(){ 2 $(document).ready(function(){
2 - $(".editation").hide(); 3 + $(".editation").hide();
3 }); 4 });
  5 +
4 function show_editation(id_topic){ 6 function show_editation(id_topic){
5 $(".presentation_"+ id_topic).hide(); 7 $(".presentation_"+ id_topic).hide();
6 $(".editation_"+ id_topic).show(); 8 $(".editation_"+ id_topic).show();
  9 + $('#summernote').summernote({height: 300});
7 }; 10 };
8 11
9 function show_presentation(id_topic){ 12 function show_presentation(id_topic){
10 $(".editation_"+ id_topic).hide(); 13 $(".editation_"+ id_topic).hide();
11 $(".presentation_"+ id_topic).show(); 14 $(".presentation_"+ id_topic).show();
12 }; 15 };
13 -  
14 -  
courses/templates/category/create.html
1 -{% extends 'base.html' %} 1 +{% extends 'home.html' %}
2 2
3 {% load static i18n permission_tags %} 3 {% load static i18n permission_tags %}
4 {% load widget_tweaks %} 4 {% load widget_tweaks %}
@@ -11,17 +11,7 @@ @@ -11,17 +11,7 @@
11 {% endblock %} 11 {% endblock %}
12 12
13 {% block sidebar %} 13 {% block sidebar %}
14 - <div class="panel panel-primary navigation">  
15 - <div class="panel-heading">  
16 - <h5>{% trans 'Menu' %}</h5>  
17 - </div>  
18 - <div class="panel-body">  
19 - <ul class="nav nav-pills nav-stacked">  
20 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
21 - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>  
22 - </ul>  
23 - </div>  
24 - </div> 14 +{{block.super}}
25 15
26 {% if user|has_role:'professor' or user|has_role:'system_admin' %} 16 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
27 17
courses/templates/category/index.html
1 -{% extends 'base.html' %} 1 +{% extends 'home.html' %}
2 2
3 {% load static i18n %} 3 {% load static i18n %}
4 {% load static i18n permission_tags %} 4 {% load static i18n permission_tags %}
@@ -12,17 +12,7 @@ @@ -12,17 +12,7 @@
12 {% endblock %} 12 {% endblock %}
13 13
14 {% block sidebar %} 14 {% block sidebar %}
15 - <div class="panel panel-primary navigation">  
16 - <div class="panel-heading">  
17 - <h5>{% trans 'Menu' %}</h5>  
18 - </div>  
19 - <div class="panel-body">  
20 - <ul class="nav nav-pills nav-stacked">  
21 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
22 - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>  
23 - </ul>  
24 - </div>  
25 - </div> 15 +{{block.super}}
26 16
27 {% if user|has_role:'professor' or user|has_role:'system_admin' %} 17 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
28 18
@@ -83,7 +73,7 @@ @@ -83,7 +73,7 @@
83 </ul> 73 </ul>
84 </div> 74 </div>
85 </div> 75 </div>
86 - 76 +
87 </div> 77 </div>
88 </div> 78 </div>
89 </div> 79 </div>
courses/templates/category/update.html
1 -{% extends 'base.html' %} 1 +{% extends 'Home.html' %}
2 2
3 {% load static i18n %} 3 {% load static i18n %}
4 {% load static i18n permission_tags %} 4 {% load static i18n permission_tags %}
@@ -12,17 +12,7 @@ @@ -12,17 +12,7 @@
12 {% endblock %} 12 {% endblock %}
13 13
14 {% block sidebar %} 14 {% block sidebar %}
15 - <div class="panel panel-primary navigation">  
16 - <div class="panel-heading">  
17 - <h5>{% trans 'Menu' %}</h5>  
18 - </div>  
19 - <div class="panel-body">  
20 - <ul class="nav nav-pills nav-stacked">  
21 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
22 - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>  
23 - </ul>  
24 - </div>  
25 - </div> 15 +{{block.super}}
26 16
27 {% if user|has_role:'professor' or user|has_role:'system_admin' %} 17 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
28 18
courses/templates/course/course_card.html
@@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
34 <div class="panel-collapse collapseOne-{{course.slug}} collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0"> 34 <div class="panel-collapse collapseOne-{{course.slug}} collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0">
35 <div class="panel-body"> 35 <div class="panel-body">
36 <p><b>{% trans 'Course Name' %}: </b>{{course.name}}</p> 36 <p><b>{% trans 'Course Name' %}: </b>{{course.name}}</p>
  37 + <p><b>{% trans 'Coordenator' %}: </b>{{course.coordenator}}</p>
37 <p><b>{% trans 'Professor' %}: </b>{{course.professors.all.0}}</p> 38 <p><b>{% trans 'Professor' %}: </b>{{course.professors.all.0}}</p>
38 <p> 39 <p>
39 <b>{% trans 'Description' %}:</b> 40 <b>{% trans 'Description' %}:</b>
@@ -41,6 +42,14 @@ @@ -41,6 +42,14 @@
41 {{course.content | safe }} 42 {{course.content | safe }}
42 </i> 43 </i>
43 </p> 44 </p>
  45 + <div class="row">
  46 + <div class="col-xs-6 col-md-6 data_register_course">
  47 + <p><b>{% trans 'Init register' %}: </b>{{course.init_register_date}}</p>
  48 + </div>
  49 + <div class="col-xs-6 col-md-6 data_register_course">
  50 + <p><b>{% trans 'End register' %}: </b>{{course.end_register_date}}</p>
  51 + </div>
  52 + </div>
44 </div> 53 </div>
45 </div> 54 </div>
46 </div> 55 </div>
courses/templates/course/create.html
@@ -12,41 +12,48 @@ @@ -12,41 +12,48 @@
12 12
13 {% block content %} 13 {% block content %}
14 <div class="card card-content"> 14 <div class="card card-content">
15 - <div class="card-body">  
16 - <form method="post" action="" enctype="multipart/form-data">  
17 - {% csrf_token %}  
18 - {% for field in form %}  
19 - <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">  
20 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
21 - {% if field.auto_id == 'id_init_register_date' or field.auto_id == 'id_end_register_date' or field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date'%}  
22 - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> 15 + <div class="card-body">
  16 + <form method="post" action="" enctype="multipart/form-data">
  17 + {% csrf_token %}
  18 + {% for field in form %}
  19 + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
  20 + <label for="{{ field.auto_id }}">{{ field.label }}</label>
  21 + {% if field.auto_id == 'id_init_register_date' or field.auto_id == 'id_end_register_date' or field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date'%}
  22 + <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}">
23 23
24 - {% else %}  
25 - {% render_field field class='form-control' %}  
26 - {% endif %}  
27 - <span class="help-block">{{ field.help_text }}</span>  
28 - {% if field.errors %}  
29 - <div class="row">  
30 - </br>  
31 - <div class="alert alert-danger alert-dismissible" role="alert">  
32 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
33 - <span aria-hidden="true">&times;</span>  
34 - </button>  
35 - <ul>  
36 - {% for error in field.errors %}  
37 - <li>{{ error }}</li>  
38 - {% endfor %}  
39 - </ul>  
40 - </div>  
41 - </div>  
42 - {% endif %} 24 + {% else %}
  25 + {% render_field field class='form-control' %}
  26 + {% endif %}
  27 + <span class="help-block">{{ field.help_text }}</span>
  28 + {% if field.errors %}
  29 + <div class="row">
  30 + </br>
  31 + <div class="alert alert-danger alert-dismissible" role="alert">
  32 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  33 + <span aria-hidden="true">&times;</span>
  34 + </button>
  35 + <ul>
  36 + {% for error in field.errors %}
  37 + <li>{{ error }}</li>
  38 + {% endfor %}
  39 + </ul>
43 </div> 40 </div>
44 - {% endfor %}  
45 - <div class="row text-center">  
46 - <input type="submit" value="{% trans 'Create' %}" class="btn btn-primary" />  
47 - </div>  
48 - </form>  
49 - </div> 41 + </div>
  42 + {% endif %}
  43 + </div>
  44 + {% endfor %}
  45 + <div class="row text-center">
  46 + <input type="submit" value="{% trans 'Create' %}" class="btn btn-primary" />
  47 + </div>
  48 + </form>
  49 + </div>
50 </div> 50 </div>
51 </br> 51 </br>
  52 +<script type="text/javascript">
  53 + var locale = navigator.language || navigator.userLanguage;
  54 +
  55 + $('.date-picker').datepicker({
  56 + language: locale,
  57 + });
  58 +</script>
52 {% endblock %} 59 {% endblock %}
courses/templates/course/index.html
1 -{% extends 'home_professor.html' %} 1 +{% extends 'home.html' %}
2 2
3 {% load static i18n permission_tags %} 3 {% load static i18n permission_tags %}
4 {% load django_bootstrap_breadcrumbs %} 4 {% load django_bootstrap_breadcrumbs %}
@@ -11,37 +11,7 @@ @@ -11,37 +11,7 @@
11 {% endblock %} 11 {% endblock %}
12 12
13 {% block sidebar %} 13 {% block sidebar %}
14 - <div class="panel panel-primary">  
15 - <div class="panel-heading">  
16 - <h4>{% trans 'Menu' %}</h4>  
17 - </div>  
18 - <div class="panel-body">  
19 - <ul class="nav nav-pills nav-stacked">  
20 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
21 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
22 - {% if user|has_role:'student' or not user.is_staff %}  
23 - <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>  
24 - <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li>  
25 - {% endif %}  
26 - <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li>  
27 - {% if user|has_role:'system_admin' %}  
28 - <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>  
29 - {% endif %}  
30 - {% if user|has_role:'system_admin' or user|has_role:'professor' %}  
31 - <li>  
32 - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a>  
33 - <div id="courses_list" class="collapse">  
34 - <ul class="nav nav-pill nav-stacked accordion_list">  
35 - {% for course in courses_list %}  
36 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
37 - {% endfor %}  
38 - </ul>  
39 - </div>  
40 - </li>  
41 - {% endif %}  
42 - </ul>  
43 - </div>  
44 - </div> 14 +{{block.super}}
45 {% if user|has_role:'professor' or user|has_role:'system_admin' %} 15 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
46 <div class="panel panel-primary"> 16 <div class="panel panel-primary">
47 <div class="panel-heading"> 17 <div class="panel-heading">
@@ -130,8 +100,8 @@ @@ -130,8 +100,8 @@
130 </div> 100 </div>
131 </div> 101 </div>
132 </div> 102 </div>
133 -  
134 - 103 +
  104 +
135 {% endfor %} 105 {% endfor %}
136 </div> 106 </div>
137 {% if user|has_role:'professor' or user|has_role:'system_admin' %} 107 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
courses/templates/course/update.html
@@ -49,4 +49,11 @@ @@ -49,4 +49,11 @@
49 </br> 49 </br>
50 </br> 50 </br>
51 </br> 51 </br>
  52 +<script type="text/javascript">
  53 + var locale = navigator.language || navigator.userLanguage;
  54 +
  55 + $('.date-picker').datepicker({
  56 + language: locale,
  57 + });
  58 +</script>
52 {% endblock %} 59 {% endblock %}
53 \ No newline at end of file 60 \ No newline at end of file
courses/templates/course/view.html
@@ -22,37 +22,7 @@ @@ -22,37 +22,7 @@
22 {% endblock %} 22 {% endblock %}
23 23
24 {% block sidebar %} 24 {% block sidebar %}
25 - <div class="panel panel-primary">  
26 - <div class="panel-heading">  
27 - <h4>{% trans 'Menu' %}</h4>  
28 - </div>  
29 - <div class="panel-body">  
30 - <ul class="nav nav-pills nav-stacked">  
31 - <li><a href="{% url 'core:home' %}">{% trans "Home" %}</a></li>  
32 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
33 - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>  
34 - <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li>  
35 - <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li>  
36 - {# <li><a href="{% url 'course:participants' %}">{% trans 'Participants' %}</a></li> #}  
37 - {% if user|has_role:'system_admin' %}  
38 - <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>  
39 - {% endif %}  
40 - {% if user|has_role:'system_admin' or user|has_role:'professor' %}  
41 - <li>  
42 - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a>  
43 - <div id="courses_list" class="collapse">  
44 - <ul class="nav nav-pill nav-stacked accordion_list">  
45 - {% for course in courses_list %}  
46 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
47 - {% endfor %}  
48 - </ul>  
49 - </div>  
50 - </li>  
51 - {% endif %}  
52 - </ul>  
53 - </div>  
54 - </div>  
55 - 25 +{{ block.super}}
56 <div class="panel panel-primary"> 26 <div class="panel panel-primary">
57 <div class="panel-heading"> 27 <div class="panel-heading">
58 <h5>{% trans 'Categories' %}</h5> 28 <h5>{% trans 'Categories' %}</h5>
@@ -94,15 +64,22 @@ @@ -94,15 +64,22 @@
94 </div> 64 </div>
95 </div> 65 </div>
96 <div class="panel-body"> 66 <div class="panel-body">
97 - <p><b>{% trans 'Coordinator' %}: </b>{% for professor in course.professors.all %}{% if not forloop.first %},{% endif %}  
98 - {{professor}}{% if forloop.last %}.{% endif %}{% endfor %}</p> 67 + <p><b>{% trans 'Coordinator' %}: </b>{{course.coordenator}}</p>
  68 + <p><b>{% trans 'Teacher' %}: </b>{{course.professors.all.0}}</p>
99 <p> 69 <p>
100 <b>{% trans 'Description' %}:</b> 70 <b>{% trans 'Description' %}:</b>
101 <i> 71 <i>
102 {{ course.objectivies |safe }} 72 {{ course.objectivies |safe }}
103 </i> 73 </i>
104 </p> 74 </p>
105 - 75 + <div class="row">
  76 + <div class="col-xs-6 col-md-6 data_register_course">
  77 + <p><b>{% trans 'Begin of Course Date' %}: </b>{{course.init_date}}</p>
  78 + </div>
  79 + <div class="col-xs-6 col-md-6 data_register_course">
  80 + <p><b>{% trans 'End of Course Date' %}: </b>{{course.end_date}}</p>
  81 + </div>
  82 + </div>
106 </div> 83 </div>
107 </div> 84 </div>
108 85
@@ -151,9 +128,11 @@ @@ -151,9 +128,11 @@
151 <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> 128 <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>
152 </button> 129 </button>
153 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions"> 130 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
154 - <li><a href="{% url 'course:replicate_subject' subject.slug %}" data-toggle="modal" data-target="#myModal3"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans 'Replicate' %}</a></li>  
155 - <li><a href="javascript:delete_subject.get('{% url 'course:delete_subject' subject.slug %}','#subject','#modal_subject')" data-toggle="modal" data-target="#removeSubject"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans 'Remove' %}</a></li> 131 + <li><a href="{% url 'course:replicate_subject' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li>
  132 + <li><a href="{% url 'course:update_subject' subject.slug %}"> <i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>
  133 + <li><a href="{% url 'course:delete_subject' subject.slug %}" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>
156 </ul> 134 </ul>
  135 +
157 </div> 136 </div>
158 </div> 137 </div>
159 {% endif %} 138 {% endif %}
courses/templates/subject/form_view_teacher.html
1 {% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access%} 1 {% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access%}
2 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 'js/topic_editation_presentation.js' %}"></script>  
8 - <script type = "text/javascript" src="{% static 'js/links.js' %}"></script>  
9 -{% endblock %}  
10 <div class="panel panel-default cards-detail"> 3 <div class="panel panel-default cards-detail">
11 <div class="panel-heading topic"> 4 <div class="panel-heading topic">
12 <div class="row"> 5 <div class="row">
@@ -23,6 +16,8 @@ @@ -23,6 +16,8 @@
23 <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 16 <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
24 <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> 17 <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>
25 </button> 18 </button>
  19 +
  20 + {# dropdown de topic com as opções de replicar, editar e deletar #}
26 {% professor_subject topic.subject user as dropdown_topic %} 21 {% professor_subject topic.subject user as dropdown_topic %}
27 {% if dropdown_topic %} 22 {% if dropdown_topic %}
28 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions"> 23 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
@@ -30,13 +25,17 @@ @@ -30,13 +25,17 @@
30 <li><a href="javascript:show_editation('{{topic.slug}}')"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li> 25 <li><a href="javascript:show_editation('{{topic.slug}}')"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>
31 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeTopic"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li> 26 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeTopic"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>
32 </ul> 27 </ul>
  28 +
  29 +
33 {% endif %} 30 {% endif %}
34 </div> 31 </div>
35 - </div><!--column-->  
36 - </div><!--row--> 32 + </div>
  33 + </div>
37 </div> 34 </div>
38 <div class="panel-collapse collapseTopic-{{topic.slug}} topic_{{ topic.id }} collapse in" role="tabpanel" aria-labelledby="heading_{{topic.id}}" aria-expanded="true" aria-hidden="false"> 35 <div class="panel-collapse collapseTopic-{{topic.slug}} topic_{{ topic.id }} collapse in" role="tabpanel" aria-labelledby="heading_{{topic.id}}" aria-expanded="true" aria-hidden="false">
39 <div class="panel-body"> 36 <div class="panel-body">
  37 +
  38 + {# dados do tópico no modo de visualização #}
40 <div class="presentation_{{topic.slug}}"> 39 <div class="presentation_{{topic.slug}}">
41 <p> 40 <p>
42 <i> 41 <i>
@@ -44,66 +43,94 @@ @@ -44,66 +43,94 @@
44 </i> 43 </i>
45 </p> 44 </p>
46 </div> 45 </div>
  46 +
  47 + {# dados dos topicos no modo de edição #}
47 <div class="form-group editation editation_{{topic.slug}}"> 48 <div class="form-group editation editation_{{topic.slug}}">
48 <label class="control-label" for="focusedInput2">{% trans 'Name Topic' %}</label> 49 <label class="control-label" for="focusedInput2">{% trans 'Name Topic' %}</label>
49 <input type="text" class="form-control" value="{{topic}}"> 50 <input type="text" class="form-control" value="{{topic}}">
50 </div> 51 </div>
51 <div class="form-group editation editation_{{topic.slug}}"> 52 <div class="form-group editation editation_{{topic.slug}}">
52 <label class="control-label" for="focusedInput2">{% trans 'Description' %}</label> 53 <label class="control-label" for="focusedInput2">{% trans 'Description' %}</label>
53 - <textarea class="form-control" rows="3" id="textArea">{{topic.description}}</textarea> 54 + <textarea class="form-control" rows="3" id="summernote">{{topic.description}}</textarea>
54 </div> 55 </div>
  56 +
  57 + {# materiais do topico#}
55 <div class="row"> 58 <div class="row">
56 <div class="col-xs-6 col-md-6"> 59 <div class="col-xs-6 col-md-6">
57 <div class="resource_inline"> 60 <div class="resource_inline">
58 <h4>{% trans 'Material' %}</h4> 61 <h4>{% trans 'Material' %}</h4>
59 </div> 62 </div>
60 <div class="resource_inline"> 63 <div class="resource_inline">
  64 +
  65 + {# dropdown de create material #}
61 <div class="dropdown"> 66 <div class="dropdown">
62 <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> 67 <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>
63 <ul class="dropdown-menu" aria-labelledby="dLabel"> 68 <ul class="dropdown-menu" aria-labelledby="dLabel">
64 - <li><a href="javascript:get_modal_link('{% url 'course:links:create_link' topic.slug %}', '#createLinksModal','#divModalLink') ">{% trans 'Create a Link' %}</a></li>  
65 - <li><a href="javascript:get_modal_file('{% url 'course:file:create_file' topic.slug %}', '#fileModal', '#divModalFile')">{% trans "Create a file" %}</a></li> 69 + <li><a href="javascript:modal.get('{% url 'course:links:create_link' topic.slug %}', '#createLinksModal','#requisicoes_ajax') ">{% trans 'Create a Link' %}</a></li>
  70 + <li><a href="javascript:modal.get('{% url 'course:file:create_file' topic.slug %}', '#fileModal', '#requisicoes_ajax')">{% trans "Create a file" %}</a></li>
66 </ul> 71 </ul>
67 </div> 72 </div>
68 </div> 73 </div>
69 <div class="presentation_{{topic.slug}}"> 74 <div class="presentation_{{topic.slug}}">
  75 +
  76 + {# materiais do tópico no modo de visualização #}
70 <ul> 77 <ul>
71 {% list_topic_file request topic %} 78 {% list_topic_file request topic %}
72 {% list_topic_link request topic%} 79 {% list_topic_link request topic%}
73 </ul> 80 </ul>
74 </div> 81 </div>
75 <div class="editation editation_{{topic.slug}}"> 82 <div class="editation editation_{{topic.slug}}">
  83 +
  84 + {# materiais do tópico no modo de edição #}
76 <ul> 85 <ul>
77 {% list_topic_file_edit request topic %} 86 {% list_topic_file_edit request topic %}
78 {% list_topic_link_edit request topic%} 87 {% list_topic_link_edit request topic%}
79 </ul> 88 </ul>
80 </div> 89 </div>
81 </div> 90 </div>
  91 +
  92 + {# avaliações do topico #}
82 <div class="col-xs-4 col-md-4"> 93 <div class="col-xs-4 col-md-4">
83 <div class="resource_inline"> 94 <div class="resource_inline">
84 <h4>{% trans 'Activities' %}</h4> 95 <h4>{% trans 'Activities' %}</h4>
85 </div> 96 </div>
86 <div class="resource_inline"> 97 <div class="resource_inline">
  98 +
  99 + {# dropdown de avaliações #}
87 <div class="dropdown"> 100 <div class="dropdown">
88 <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> 101 <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>
89 <ul class="dropdown-menu" aria-labelledby="dLabel"> 102 <ul class="dropdown-menu" aria-labelledby="dLabel">
90 <li><a href="javascript:createForum('{% url 'course:forum:create' %}', '{{ topic.id }}')">{% trans 'Create Forum' %}</a></li> 103 <li><a href="javascript:createForum('{% url 'course:forum:create' %}', '{{ topic.id }}')">{% trans 'Create Forum' %}</a></li>
91 - <li><a href="javascript:modal.get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#modal_poll');">{% trans 'Create Poll' %}</a></li>  
92 - <li><a href="javascript:modal.get('{% url 'course:exam:create_exam' topic.slug%}','#exam','#modal_exam');">{% trans 'Create Exam' %}</a></li> 104 +
  105 + <li><a href="javascript:modal.get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#requisicoes_ajax');">{% trans 'Create Poll' %}</a></li>
93 </ul> 106 </ul>
94 </div> 107 </div>
95 </div> 108 </div>
96 - <ul>  
97 - {% list_topic_exam request topic %}  
98 - {% list_topic_poll request topic %}  
99 - {% list_topic_foruns request topic %}  
100 - </ul> 109 + <div class="presentation_{{topic.slug}}">
  110 +
  111 + {# avaliações do tópico no modo de visualização #}
  112 + <ul>
  113 + {% list_topic_poll request topic %}
  114 + {% list_topic_foruns request topic %}
  115 + </ul>
  116 + </div>
  117 + <div class="editation editation_{{topic.slug}}">
  118 +
  119 + {# avaliações do tópico no modo de edição #}
  120 + <ul>
  121 + {% list_topic_poll_teacher request topic %}
  122 + {% list_topic_foruns request topic %}
  123 + </ul>
  124 + </div>
  125 +
101 </div> 126 </div>
102 </div> 127 </div>
  128 +
  129 + {# opções de cancelar e editar no modo de edição #}
103 <div class="form-group editation editation_{{topic.slug}}"> 130 <div class="form-group editation editation_{{topic.slug}}">
104 <div class="col-md-10"> 131 <div class="col-md-10">
105 - <a href="javascript:show_presentation('{{topic.slug}}')" class="btn btn-raised btn-default">{% trans 'Cancel' %}</a>  
106 - <a href="javascript:show_presentation('{{topic.slug}}')" class="btn btn-raised btn-primary">{% trans 'Submit' %}</a> 132 + <a href="javascript:show_presentation('{{topic.slug}}')" class="btn btn-raised btn-default">{% trans 'Back' %}</a>
  133 + {# <a href="javascript:show_presentation('{{topic.slug}}')" class="btn btn-raised btn-primary">{% trans 'Submit' %}</a>#}
107 </div> 134 </div>
108 </div> 135 </div>
109 </div> 136 </div>
@@ -114,7 +141,7 @@ @@ -114,7 +141,7 @@
114 141
115 142
116 <!-- MODAL REMOVE TOPIC --> 143 <!-- MODAL REMOVE TOPIC -->
117 -<div class="modal" id="removeTopic"> 144 +<div class="modal" id="{{topic.slug}}">
118 <div class="modal-dialog"> 145 <div class="modal-dialog">
119 <div class="modal-content"> 146 <div class="modal-content">
120 <div class="modal-header"> 147 <div class="modal-header">
@@ -154,18 +181,18 @@ @@ -154,18 +181,18 @@
154 <label for="textArea" class="col-md-2 control-label">{% trans 'Code' %}:</label> 181 <label for="textArea" class="col-md-2 control-label">{% trans 'Code' %}:</label>
155 182
156 <div class="col-md-10"> 183 <div class="col-md-10">
157 - <textarea class="form-control" rows="2" id="textArea"></textarea>  
158 - <span class="help-block">{% trans 'Material description' %}</span> 184 + <textarea class="form-control" rows="2" id="textArea"></textarea>
  185 + <span class="help-block">{% trans 'Material description' %}</span>
159 </div> 186 </div>
160 </div> 187 </div>
161 <div class="form-group is-empty"> 188 <div class="form-group is-empty">
162 - <label for="number" class="col-md-2 control-label">{% trans 'Height' %}</label> 189 + <label for="number" class="col-md-2 control-label">{% trans 'Height' %}</label>
163 <div class="col-md-4"> 190 <div class="col-md-4">
164 <input type="number" class="form-control" id="inputNumber" placeholder="Heiht"> 191 <input type="number" class="form-control" id="inputNumber" placeholder="Heiht">
165 </div> 192 </div>
166 </div> 193 </div>
167 <div class="form-group is-empty"> 194 <div class="form-group is-empty">
168 - <label for="number" class="col-md-2 control-label">{% trans 'Weight' %}</label> 195 + <label for="number" class="col-md-2 control-label">{% trans 'Weight' %}</label>
169 <div class="col-md-4"> 196 <div class="col-md-4">
170 <input type="number" class="form-control" id="inputNumber" placeholder="Weight"> 197 <input type="number" class="form-control" id="inputNumber" placeholder="Weight">
171 </div> 198 </div>
@@ -175,7 +202,7 @@ @@ -175,7 +202,7 @@
175 </div> 202 </div>
176 <div class="modal-footer"> 203 <div class="modal-footer">
177 <!-- Don't remove that!!! 204 <!-- Don't remove that!!!
178 - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">Close</button>--> 205 + {# <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">Close</button>-->#}
179 206
180 <!-- Put curtom buttons here!!! --> 207 <!-- Put curtom buttons here!!! -->
181 <button type="button" class="btn btn-primary btn-raised">{% trans 'Confirm' %}</button> 208 <button type="button" class="btn btn-primary btn-raised">{% trans 'Confirm' %}</button>
@@ -185,85 +212,4 @@ @@ -185,85 +212,4 @@
185 </div> 212 </div>
186 <!-- EndModal --> 213 <!-- EndModal -->
187 214
188 -<!-- MODAL ACTIVITIES-->  
189 -<div class="modal fade" id="ActivityModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">  
190 - <div class="modal-dialog" role="document">  
191 - <div class="modal-content">  
192 - <div class="modal-header">  
193 - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>  
194 - <h4 class="modal-title" id="myModalLabel"></h4>  
195 - </div>  
196 - <div class="modal-body">  
197 - <form class="form-horizontal">  
198 215
199 - <fieldset>  
200 - <legend>{% trans 'Proposal Activity' %}</legend>  
201 - <div class="form-group is-empty">  
202 - <label for="NameIn" class="col-md-2 control-label">{% trans 'Name' %}:</label>  
203 - <div class="col-md-10">  
204 - <input type="text" id="NameIn" class="form-control">  
205 - </div>  
206 - </div>  
207 - <div class="form-group is-empty">  
208 - <label for="DescIn" class="col-md-2 control-label">{% trans 'Describe' %}:</label>  
209 - <div class="col-md-10">  
210 - <textarea class="form-control" id="DescIn" rows="2"></textarea>  
211 - </div>  
212 - </div>  
213 - <div class="form-group is-empty">  
214 - <label for="DateIn" class="col-md-2 control-label">{% trans 'Opening' %}: </label>  
215 - <div class="col-md-10">  
216 - <input type="text" id="DateIn" class="form-control date-picker" requerid="">  
217 - </div>  
218 - </div>  
219 - <div class="form-group is-empty">  
220 - <label for="DateIn" class="col-md-2 control-label">{% trans 'Ending' %}: </label>  
221 - <div class="col-md-10">  
222 - <input type="text" id="DateIn" class="form-control date-picker" requerid="">  
223 - </div>  
224 - </div>  
225 - <div class="form-group" style="margin-top: 0;">  
226 - <div class="col-md-offset-2 col-md-10">  
227 - <div class="checkbox">  
228 - <label>  
229 - <input type="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans 'Send Later' %}  
230 - </label>  
231 - </div>  
232 - </div>  
233 - </div>  
234 - <div class="form-group">  
235 - <div class="col-md-10 col-md-offset-2">  
236 - <button type="button" class="btn btn-default">{% trans 'Cancel' %}</button>  
237 - <button type="submit" class="btn btn-primary">{% trans 'Submit' %}</button>  
238 - </div>  
239 - </div>  
240 -  
241 -  
242 - </fieldset>  
243 - </form>  
244 - </div>  
245 - </div>  
246 - </div>  
247 -</div>  
248 -<!--EndModal-->  
249 -  
250 -  
251 -  
252 -<div class="modal fade" id="createForum" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">  
253 - <div class="modal-dialog" role="document">  
254 - <div class="modal-content">  
255 - <div class="modal-header">  
256 - <h4 class="modal-title" id="myModalLabel">{% trans 'Forum' %}</h4>  
257 - </div>  
258 - <div class="modal-body">  
259 - <section>  
260 - <div class="forum_form"></div>  
261 - </section>  
262 - </div>  
263 - <div class="modal-footer">  
264 - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans 'Close' %}</button>  
265 - <button type="button" onclick="$('#forum_create').submit();" class="btn btn-primary btn-raised">{% trans 'Create' %}</button>  
266 - </div>  
267 - </div>  
268 - </div>  
269 -</div>  
courses/templates/subject/index.html
1 -{% extends 'base.html' %} 1 +{% extends 'home.html' %}
2 2
3 {% load static i18n permission_tags professor_access %} 3 {% load static i18n permission_tags professor_access %}
4 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="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  13 + <script src="{% static 'js/modal_poll.js' %}"></script>
  14 +{% endblock %}
  15 +
5 {% block breadcrumbs %} 16 {% block breadcrumbs %}
6 -<ol class="breadcrumb">  
7 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
8 - <li><a href="{% url 'course:manage' %}">{% trans 'Courses' %}</a></li>  
9 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
10 - <li class="active">{{ subject }}</li>  
11 -</ol> 17 + <ol class="breadcrumb">
  18 + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>
  19 + <li><a href="{% url 'course:manage' %}">{% trans 'Courses' %}</a></li>
  20 + <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>
  21 + <li class="active">{{ subject }}</li>
  22 + </ol>
12 {% endblock %} 23 {% endblock %}
13 {% block sidebar %} 24 {% block sidebar %}
14 -<div class="panel panel-primary">  
15 - <div class="panel-heading">  
16 - <h4>{% trans 'Menu' %}</h4>  
17 - </div>  
18 - <div class="panel-body">  
19 - <ul class="nav nav-pills nav-stacked">  
20 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
21 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
22 - {% if user|has_role:'student' or not user.is_staff %}  
23 - <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>  
24 - <li><a href="{% url 'core:guest' %}">{% trans 'All Courses' %}</a></li>  
25 - {% endif %}  
26 - <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li>  
27 - {% if user|has_role:'system_admin' %}  
28 - <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>  
29 - {% endif %}  
30 - {% if user|has_role:'system_admin' or user|has_role:'professor' %}  
31 - <li>  
32 - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a>  
33 - <div id="courses_list" class="collapse">  
34 - <ul class="nav nav-pill nav-stacked accordion_list">  
35 - {% for course in courses_list %}  
36 - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>  
37 - {% endfor %}  
38 - </ul>  
39 - </div>  
40 - </li>  
41 - {% endif %}  
42 - </ul>  
43 - </div>  
44 -</div> 25 +{{block.super}}
45 26
46 27
47 {% endblock %} 28 {% endblock %}
48 29
49 {% block content %} 30 {% block content %}
50 - <div class="panel panel-info">  
51 - <div class="panel-heading course-detail"> 31 + <div class="panel panel-info">
  32 + <div class="panel-heading course-detail">
52 <div class="row"> 33 <div class="row">
53 - <div class="col-md-10 col-sm-10">  
54 - <h4>{{subject}}</h4>  
55 - </div>  
56 - <div class="col-xs-4 col-md-2 divMoreActions">  
57 - {% professor_subject subject user as subject_professor%}  
58 - {% if subject_professor %}  
59 - <div class="btn-group">  
60 - <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">  
61 - <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>  
62 - </button>  
63 - <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">  
64 - <li><a href="{% url 'course:replicate_subject' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li>  
65 - <li><a href="{% url 'course:update_subject' subject.slug %}" <i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>  
66 - <li><a href="{% url 'course:delete_subject' subject.slug %}" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>  
67 - </ul>  
68 - </div>  
69 - {% endif %}  
70 - </div>  
71 - </div>  
72 - </div>  
73 - <div class="panel-body">  
74 - <p><b>{% trans "Professor" %}:</b> {% for professor in subject.professors.all %}{% if not forloop.first %},{% endif %}  
75 - {{professor}}{% if forloop.last %}.{% endif %}{% endfor %}</p>  
76 - <p>  
77 - <b>{% trans "Description" %}:</b>  
78 - {{subject.description|safe}}  
79 - </p>  
80 - <div class="row">  
81 - <div class="col-xs-6 col-md-6">  
82 - <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>  
83 - </div>  
84 - <div class="col-xs-6 col-md-6">  
85 - <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>  
86 - </div> 34 + <div class="col-md-10 col-sm-10">
  35 + <h4>{{subject}}</h4>
  36 + </div>
  37 +
  38 + {# dropdown de subject com as opções de replicar, editar e deletar #}
  39 + <div class="col-xs-4 col-md-2 divMoreActions">
  40 + {% professor_subject subject user as subject_professor%}
  41 + {% if subject_professor %}
  42 + <div class="btn-group">
  43 + <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  44 + <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>
  45 + </button>
  46 + <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
  47 + <li><a href="{% url 'course:replicate_subject' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li>
  48 + <li><a href="{% url 'course:update_subject' subject.slug %}"> <i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>
  49 + <li><a href="{% url 'course:delete_subject' subject.slug %}" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>
  50 + </ul>
87 </div> 51 </div>
88 - </div> 52 + {% endif %}
  53 + </div>
  54 +
  55 + </div>
89 </div> 56 </div>
90 - {% for topic in topics %}  
91 - {% professor_subject topic.subject user as topic_professor%}  
92 - {% if topic_professor %}  
93 - {% include "subject/form_view_teacher.html" %}  
94 - {% else %}  
95 - {% include "subject/form_view_student.html" %}  
96 - {% endif %}  
97 - {% endfor %}  
98 - {% professor_subject subject user as professor_sub %}  
99 - {% if professor_sub %}  
100 - <div class="form-group">  
101 - <a href="{% url 'course:create_topic' subject.slug %}" data-toggle="modal" data-target="" class="btn btn-primary btn-lg btn-block btn-raised" name="create_topic">{% trans "Create Topic" %}<div class="ripple-container"></div></a> 57 +
  58 + {# informações do subject(professor, descrição etc) #}
  59 + <div class="panel-body">
  60 + <p><b>{% trans "Professor" %}:</b> {% for professor in subject.professors.all %}{% if not forloop.first %},{% endif %}
  61 + {{professor}}{% if forloop.last %}.{% endif %}{% endfor %}</p>
  62 + <p>
  63 + <b>{% trans "Description" %}:</b>
  64 + {{subject.description|safe}}
  65 + </p>
  66 + <div class="row">
  67 + <div class="col-xs-6 col-md-6">
  68 + <p><b>{% trans "Beginning" %}:</b> {{subject.init_date}}</p>
  69 + </div>
  70 + <div class="col-xs-6 col-md-6">
  71 + <p><b>{% trans "End" %}:</b> {{subject.end_date}}</p>
  72 + </div>
  73 + </div>
  74 + </div>
  75 +
  76 + </div>
  77 +
  78 + {# lista de tópicos #}
  79 + {% for topic in topics %}
  80 + {% professor_subject topic.subject user as topic_professor%}
  81 + {% if topic_professor %}
  82 + {% include "subject/form_view_teacher.html" %}
  83 + {% else %}
  84 + {% include "subject/form_view_student.html" %}
  85 + {% endif %}
  86 + {% endfor %}
  87 +
  88 + {# botão create topic #}
  89 + {% professor_subject subject user as professor_sub %}
  90 + {% if professor_sub %}
  91 + <div class="form-group">
  92 + <a href="{% url 'course:create_topic' subject.slug %}" data-toggle="modal" data-target="" class="btn btn-primary btn-lg btn-block btn-raised" name="create_topic">{% trans "Create Topic" %}<div class="ripple-container"></div></a>
  93 + </div>
  94 + {% endif %}
  95 +
  96 + {# local onde vai ser colocado todos os HTML's que retornan de uma requisição ajax feitas dentro de subject #}
  97 + <div class = 'row' id ="requisicoes_ajax">
  98 + {# Não mudar o id #}
  99 + </div>
  100 +
  101 + <div class="modal fade" id="createForum" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  102 + <div class="modal-dialog" role="document">
  103 + <div class="modal-content">
  104 + <div class="modal-header">
  105 + <h4 class="modal-title" id="myModalLabel">{% trans 'Forum' %}</h4>
  106 + </div>
  107 + <div class="modal-body">
  108 + <section>
  109 + <div class="forum_form"></div>
  110 + </section>
  111 + </div>
  112 + <div class="modal-footer">
  113 + <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans 'Close' %}</button>
  114 + <button type="button" onclick="$('#forum_create').submit();" class="btn btn-primary btn-raised">{% trans 'Create' %}</button>
  115 + </div>
102 </div> 116 </div>
103 - {% endif %} 117 + </div>
  118 + </div>
104 {% endblock %} 119 {% endblock %}
courses/templates/subject/poll_item_actions.html
1 {% load static i18n permission_tags professor_access %} 1 {% load static i18n permission_tags professor_access %}
2 2
3 -<script src="{% static 'js/modals_requisitions.js'%}"></script>  
4 -<script src="{% static 'js/modal_poll.js'%}"></script>  
5 -  
6 -  
7 -{% for poll in polls %}  
8 - {% professor_subject poll.topic.subject request.user as permission%}  
9 - {% if permission %}  
10 - <li id="poll_{{poll.slug}}"><i class="material-icons">{% trans 'poll' %}</i> <a href="javascript:modal.get('{% url 'course:poll:update_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a><a href="javascript:modal.get('{% url 'course:poll:delete_poll' poll.slug %}','#poll','#modal_poll');"><span class="glyphicon glyphicon-remove"></span></a></li>  
11 - {% else %}  
12 - <li id="poll_{{poll.slug}}"><i class="material-icons">{% trans 'poll' %}</i> <a href="javascript:modal.get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a></li>  
13 - {% endif %} 3 +<div id="list-topic-{{ topic.slug }}-poll">
  4 + {% for poll in polls %}
  5 + <li id="poll_{{poll.slug}}"><i class="fa fa-bar-chart"></i> <a href="javascript:modal.get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#requisicoes_ajax');">{{ poll }}</a></li>
14 {% endfor %} 6 {% endfor %}
15 -{# <button class="btn btn-primary btn-raised" onclick="javascript:modal.get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#modal_poll');">{% trans '+ Create Poll' %}</button> #}  
16 -<div class="row" id="modal_poll">  
17 -  
18 -  
19 -  
20 7
21 </div> 8 </div>
courses/templates/subject/poll_item_actions_teacher.html 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +{% load static i18n permission_tags professor_access %}
  2 +
  3 +<div id="list-topic-{{ topic.slug }}-poll-edit">
  4 + {% for poll in polls %}
  5 + <div id="poll_{{poll.slug}}_div">
  6 + <li class="icon_edit_remove" ><a href="javascript:modal.get('{% url 'course:poll:update_poll' poll.slug %}','#poll','#requisicoes_ajax');"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('{% url 'course:poll:delete_poll' poll.slug %}','#poll','#requisicoes_ajax');"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
  7 + <li><i class="fa fa-bar-chart"></i> <a href="javascript:modal.get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#requisicoes_ajax');">{{poll}}</a></li>
  8 + </div>
  9 + {% endfor %}
  10 +</div>
courses/templates/subject_category/index.html
1 -{% extends 'base.html' %} 1 +{% extends 'home.html' %}
2 2
3 {% load static i18n permission_tags professor_access%} 3 {% load static i18n permission_tags professor_access%}
4 4
@@ -12,27 +12,7 @@ @@ -12,27 +12,7 @@
12 {% endblock %} 12 {% endblock %}
13 13
14 {% block sidebar %} 14 {% block sidebar %}
15 -  
16 - <div class="panel panel-primary">  
17 -  
18 - <div class="panel-heading">  
19 - <h3 class="panel-title">{{course}}</h3>  
20 - </div>  
21 -  
22 - <div class="panel-body">  
23 - {% for category in subject_categories %}  
24 - <div class="row">  
25 - <div class="col-md-12 col-sm-12">  
26 - <a href="" class="btn btn-default text-left">{{subject}}</a>  
27 - </div>  
28 - </div>  
29 - {% endfor %}  
30 - </div>  
31 - </div>  
32 -  
33 - {% if user|has_role:'system_admin' or user|has_role:'professor' %}  
34 - <a href="" class="btn btn-primary btn-md btn-block">{% trans "Create Subject Category" %}</a>  
35 - {% endif %} 15 +{{block.super}}
36 {% endblock %} 16 {% endblock %}
37 17
38 {% block content %} 18 {% block content %}
courses/templates/topic/delete.html 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +{% load static i18n permission_tags %}
  2 +
  3 +<!-- Modal (remember to change the ids!!!) -->
  4 +<div class="modal fade" id="subject" tabindex="-1" role="dialog" aria-labelledby="{{topic.slug}}_delete">
  5 + <div class="modal-dialog" role="document">
  6 + <div class="modal-content">
  7 + <!-- Modal Header -->
  8 + <div class="modal-header">
  9 +
  10 + <h4 class="modal-title" id="{{topic.slug}}_delete">{% trans "Delete Course" %}</h4>
  11 + </div>
  12 + <!-- Modal Body -->
  13 + <div class="modal-body">
  14 + <!-- Put ONLY your content here!!! -->
  15 + <form id="delete_topic_{{topic.slug}}" action="" method="post">
  16 + {% csrf_token %}
  17 + <p>{% trans 'Are you sure you want to delete the subject' %} "{{subject.name}}"?</p>
  18 + </form>
  19 + </div>
  20 + <!-- Modal Footer -->
  21 + <div class="modal-footer">
  22 + <!-- Don't remove that!!! -->
  23 + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button>
  24 + <button type="submit" id="button" form="delete_topic_{{topic.slug}}" class="btn btn-primary btn-raised">{% trans "Delete" %}</button>
  25 + <script>
  26 + $("#delete_topic_{{topic.slug}}").submit(function(event) {
  27 + RemoveCourse.remove("{% url 'course:delete_subject' subject.slug %}",$(this).serialize(),"#subject_{{subject.slug}}");
  28 + event.preventDefault();
  29 + });
  30 + </script>
  31 + </div>
  32 + </div>
  33 + </div>
  34 +</div>
  35 +<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  36 +<script src="{% static 'js/modal_subject.js' %}"></script>
courses/templates/topic/index.html
1 -{% extends 'base.html' %} 1 +{% extends 'home.html' %}
2 2
3 {% load static i18n permission_tags professor_access %} 3 {% load static i18n permission_tags professor_access %}
4 4
@@ -27,21 +27,7 @@ @@ -27,21 +27,7 @@
27 {% endblock %} 27 {% endblock %}
28 28
29 {% block sidebar %} 29 {% block sidebar %}
30 -  
31 - <div class="panel panel-primary">  
32 - <div class="panel-heading">  
33 - <h5>{% trans 'Menu' %}</h5>  
34 - </div>  
35 - <div class="panel-body">  
36 - <ul class="nav nav-pills nav-stacked">  
37 - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>  
38 - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li>  
39 - </ul>  
40 - </div>  
41 - </div>  
42 -  
43 -  
44 - 30 +{{block.super}}
45 {% endblock %} 31 {% endblock %}
46 32
47 {% block content %} 33 {% block content %}
courses/templates/topic/link_topic_list.html
1 {% load static i18n list_topic_foruns permission_tags %} 1 {% load static i18n list_topic_foruns permission_tags %}
2 <div id="list-topic{{ topic.id }}-links"> 2 <div id="list-topic{{ topic.id }}-links">
3 {% for link in links%} 3 {% for link in links%}
4 - <li id = "link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li> 4 + <li id = "link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#requisicoes_ajax')">{{link.name}}</a></li>
5 {% endfor %} 5 {% endfor %}
6 </div> 6 </div>
7 -<div class = 'row' id ="divModalLink">  
8 -  
9 -</div>  
courses/templates/topic/link_topic_list_edit.html
1 {% load static i18n list_topic_foruns permission_tags %} 1 {% load static i18n list_topic_foruns permission_tags %}
2 <div id="list-topic{{ topic.id }}-links-edit"> 2 <div id="list-topic{{ topic.id }}-links-edit">
3 -{% for link in links%}  
4 -  
5 - <li class="icon_edit_remove" id = "link_edit_icon_{{ link.slug }}"> <a href="javascript:modal.get('{% url 'course:links:update_link' link.slug %}', '#linksModalEdit', '#divModalLinkUpdate')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('{% url 'course:links:delete_link' link.slug %}', '#linkDeleteModal', '#divModalLinkUpdate')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>  
6 - <li id = "link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li>  
7 -  
8 -{% endfor %}  
9 -</div>  
10 -  
11 -<div class="row" id="divModalLinkUpdate">  
12 - 3 + {% for link in links%}
  4 + <li class="icon_edit_remove" id = "link_edit_icon_{{ link.slug }}"> <a href="javascript:modal.get('{% url 'course:links:update_link' link.slug %}', '#linksModalEdit', '#requisicoes_ajax')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('{% url 'course:links:delete_link' link.slug %}', '#linkDeleteModal', '#requisicoes_ajax')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
  5 + <li id = "link_edit_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#requisicoes_ajax')">{{link.name}}</a></li>
  6 + {% endfor %}
13 </div> 7 </div>
courses/templates/topic/list_file.html
@@ -3,10 +3,10 @@ @@ -3,10 +3,10 @@
3 <div id="list-topic{{ topic.id }}-files"> 3 <div id="list-topic{{ topic.id }}-files">
4 {% for file in files %} 4 {% for file in files %}
5 <li id="file_{{ file.slug }}"><i class="material-icons">{{ file.file_type.icon }}</i> <a href="{% url 'course:file_material_view' file.slug %}" target="_blank">{{ file.name }}</a></li> 5 <li id="file_{{ file.slug }}"><i class="material-icons">{{ file.file_type.icon }}</i> <a href="{% url 'course:file_material_view' file.slug %}" target="_blank">{{ file.name }}</a></li>
6 - {% endfor %} 6 + {% endfor %}
7 </div> 7 </div>
8 -  
9 8
10 -<div class="row" id="divModalFile">  
11 9
12 -</div> 10 +{# <div class="row" id="divModalFile">#}
  11 +
  12 +{# </div>#}
courses/templates/topic/list_file_edit.html
@@ -2,11 +2,11 @@ @@ -2,11 +2,11 @@
2 2
3 <div id="list-topic{{ topic.id }}-files-edit"> 3 <div id="list-topic{{ topic.id }}-files-edit">
4 {% for file in files %} 4 {% for file in files %}
5 - <li class="icon_edit_remove" id="file_edit_icon_{{ file.slug }}"> <a href="javascript:modal.get('{% url 'course:file:update_file' file.slug %}', '#fileUpdateModal', '#divModalFileUpdate')" ><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('{% url 'course:file:delete_file' file.slug %}', '#fileDeleteModal', '#divModalFileUpdate')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li> 5 + <li class="icon_edit_remove" id="file_edit_icon_{{ file.slug }}"> <a href="javascript:modal.get('{% url 'course:file:update_file' file.slug %}', '#fileUpdateModal', '#requisicoes_ajax')" ><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('{% url 'course:file:delete_file' file.slug %}', '#fileDeleteModal', '#requisicoes_ajax')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
6 <li id="file_edit_{{ file.slug }}"><i class="material-icons">{{ file.file_type.icon }}</i> <a href="{{ file.file_url.url }}" target="_blank">{{ file.name }}</a></li> 6 <li id="file_edit_{{ file.slug }}"><i class="material-icons">{{ file.file_type.icon }}</i> <a href="{{ file.file_url.url }}" target="_blank">{{ file.name }}</a></li>
7 {% endfor %} 7 {% endfor %}
8 </div> 8 </div>
9 9
10 -<div class="row" id="divModalFileUpdate"> 10 +{# <div class="row" id="divModalFileUpdate">#}
11 11
12 -</div>  
13 \ No newline at end of file 12 \ No newline at end of file
  13 +{# </div>#}
courses/templatetags/list_topic_foruns.py
@@ -32,13 +32,14 @@ def list_topic_poll(request, topic): @@ -32,13 +32,14 @@ def list_topic_poll(request, topic):
32 32
33 return context 33 return context
34 34
35 -@register.inclusion_tag('subject/exam_item_actions.html')  
36 -def list_topic_exam(request, topic): 35 +
  36 +@register.inclusion_tag('subject/poll_item_actions_teacher.html')
  37 +def list_topic_poll_teacher(request, topic):
37 context = { 38 context = {
38 'request': request, 39 'request': request,
39 } 40 }
40 41
41 - context['exams'] = Exam.objects.filter(topic = topic) 42 + context['polls'] = Poll.objects.filter(topic = topic)
42 context['topic'] = topic 43 context['topic'] = topic
43 44
44 return context 45 return context
courses/urls.py
@@ -22,6 +22,7 @@ urlpatterns = [ @@ -22,6 +22,7 @@ urlpatterns = [
22 url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'), 22 url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'),
23 url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), 23 url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'),
24 url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), 24 url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
  25 + url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.DeleteTopic.as_view(), name='update_topic'),
25 url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), 26 url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'),
26 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), 27 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'),
27 url(r'^forum/', include('forum.urls', namespace = 'forum')), 28 url(r'^forum/', include('forum.urls', namespace = 'forum')),
courses/views.py
@@ -25,6 +25,11 @@ from courses.models import Material @@ -25,6 +25,11 @@ from courses.models import Material
25 from django.urls import reverse 25 from django.urls import reverse
26 26
27 from datetime import date, datetime 27 from datetime import date, datetime
  28 +import time
  29 +
  30 +#API IMPORTS
  31 +from rest_framework import viewsets, permissions
  32 +from .serializers import *
28 33
29 class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): 34 class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView):
30 35
@@ -142,7 +147,7 @@ class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView): @@ -142,7 +147,7 @@ class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView):
142 context['aparece'] = self.aparece 147 context['aparece'] = self.aparece
143 148
144 return context 149 return context
145 - 150 +
146 class CreateCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView): 151 class CreateCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView):
147 log_component = "course" 152 log_component = "course"
148 log_resource = "course" 153 log_resource = "course"
@@ -314,7 +319,7 @@ class DeleteCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.Delet @@ -314,7 +319,7 @@ class DeleteCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.Delet
314 self.log_context['course_category_name'] = self.object.category.name 319 self.log_context['course_category_name'] = self.object.category.name
315 320
316 super(DeleteCourseView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 321 super(DeleteCourseView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
317 - 322 +
318 return reverse_lazy('course:manage') 323 return reverse_lazy('course:manage')
319 324
320 325
@@ -341,10 +346,10 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView): @@ -341,10 +346,10 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView):
341 self.log_context['course_slug'] = course.slug 346 self.log_context['course_slug'] = course.slug
342 self.log_context['course_category_id'] = course.category.id 347 self.log_context['course_category_id'] = course.category.id
343 self.log_context['course_category_name'] = course.category.name 348 self.log_context['course_category_name'] = course.category.name
  349 + self.log_context['timestamp_start'] = str(int(time.time()))
344 350
345 super(CourseView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 351 super(CourseView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
346 352
347 - self.request.session['time_spent'] = str(datetime.now())  
348 self.request.session['log_id'] = Log.objects.latest('id').id 353 self.request.session['log_id'] = Log.objects.latest('id').id
349 354
350 category_sub = self.kwargs.get('category', None) 355 category_sub = self.kwargs.get('category', None)
@@ -359,7 +364,7 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView): @@ -359,7 +364,7 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView):
359 if not category_sub is None: 364 if not category_sub is None:
360 cat = get_object_or_404(CategorySubject, slug = category_sub) 365 cat = get_object_or_404(CategorySubject, slug = category_sub)
361 subjects = subjects.filter(category = cat) 366 subjects = subjects.filter(category = cat)
362 - 367 +
363 context['subjects'] = subjects 368 context['subjects'] = subjects
364 369
365 if has_role(self.request.user,'system_admin'): 370 if has_role(self.request.user,'system_admin'):
@@ -389,12 +394,12 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView): @@ -389,12 +394,12 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView):
389 394
390 return context 395 return context
391 396
392 -class DeleteView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.DeleteView): 397 +class DeleteTopic(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.DeleteView):
393 398
394 allowed_roles = ['professor', 'system_admin'] 399 allowed_roles = ['professor', 'system_admin']
395 login_url = reverse_lazy("core:home") 400 login_url = reverse_lazy("core:home")
396 redirect_field_name = 'next' 401 redirect_field_name = 'next'
397 - model = Course 402 + model = Topic
398 template_name = 'course/delete.html' 403 template_name = 'course/delete.html'
399 success_url = reverse_lazy('course:manage') 404 success_url = reverse_lazy('course:manage')
400 405
@@ -412,7 +417,7 @@ def subscribe_course(request, slug): @@ -412,7 +417,7 @@ def subscribe_course(request, slug):
412 417
413 if request.user in course.students.all(): 418 if request.user in course.students.all():
414 419
415 - log_context = {} 420 + log_context = {}
416 log_context['course_id'] = course.id 421 log_context['course_id'] = course.id
417 log_context['course_name'] = course.name 422 log_context['course_name'] = course.name
418 log_context['course_slug'] = course.slug 423 log_context['course_slug'] = course.slug
@@ -548,10 +553,10 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView): @@ -548,10 +553,10 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView):
548 self.log_context['course_slug'] = subject.course.slug 553 self.log_context['course_slug'] = subject.course.slug
549 self.log_context['course_category_id'] = subject.course.category.id 554 self.log_context['course_category_id'] = subject.course.category.id
550 self.log_context['course_category_name'] = subject.course.category.name 555 self.log_context['course_category_name'] = subject.course.category.name
  556 + self.log_context['timestamp_start'] = str(int(time.time()))
551 557
552 super(SubjectsView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 558 super(SubjectsView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
553 559
554 - self.request.session['time_spent'] = str(datetime.now())  
555 self.request.session['log_id'] = Log.objects.latest('id').id 560 self.request.session['log_id'] = Log.objects.latest('id').id
556 561
557 return super(SubjectsView, self).dispatch(*args, **kwargs) 562 return super(SubjectsView, self).dispatch(*args, **kwargs)
@@ -653,10 +658,10 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView): @@ -653,10 +658,10 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView):
653 self.log_context['course_slug'] = topic.subject.course.slug 658 self.log_context['course_slug'] = topic.subject.course.slug
654 self.log_context['course_category_id'] = topic.subject.course.category.id 659 self.log_context['course_category_id'] = topic.subject.course.category.id
655 self.log_context['course_category_name'] = topic.subject.course.category.name 660 self.log_context['course_category_name'] = topic.subject.course.category.name
  661 + self.log_context['timestamp_start'] = str(int(time.time()))
656 662
657 super(TopicsView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 663 super(TopicsView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
658 664
659 - self.request.session['time_spent'] = str(datetime.now())  
660 self.request.session['log_id'] = Log.objects.latest('id').id 665 self.request.session['log_id'] = Log.objects.latest('id').id
661 666
662 return super(TopicsView, self).dispatch(*args, **kwargs) 667 return super(TopicsView, self).dispatch(*args, **kwargs)
@@ -665,7 +670,7 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView): @@ -665,7 +670,7 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView):
665 topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) 670 topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
666 subject = topic.subject 671 subject = topic.subject
667 topics_q = Topic.objects.filter(subject = subject, visible=True) 672 topics_q = Topic.objects.filter(subject = subject, visible=True)
668 - 673 +
669 return topics_q 674 return topics_q
670 675
671 def get_context_data(self, **kwargs): 676 def get_context_data(self, **kwargs):
@@ -681,7 +686,7 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView): @@ -681,7 +686,7 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView):
681 context['students_activit'] = students_activit 686 context['students_activit'] = students_activit
682 context['materials'] = materials 687 context['materials'] = materials
683 context['form'] = ActivityForm 688 context['form'] = ActivityForm
684 - 689 +
685 return context 690 return context
686 691
687 692
@@ -716,7 +721,7 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMi @@ -716,7 +721,7 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMi
716 self.object.owner = self.request.user 721 self.object.owner = self.request.user
717 self.object.save() 722 self.object.save()
718 action = super(CreateTopicView, self).createorRetrieveAction("create Topic") 723 action = super(CreateTopicView, self).createorRetrieveAction("create Topic")
719 - super(CreateTopicView, self).createNotification("Topic "+ self.object.name + " was created", 724 + super(CreateTopicView, self).createNotification("Topic "+ self.object.name + " was created",
720 resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]), 725 resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]),
721 actor=self.request.user, users = self.object.subject.course.students.all() ) 726 actor=self.request.user, users = self.object.subject.course.students.all() )
722 727
@@ -733,7 +738,7 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMi @@ -733,7 +738,7 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMi
733 self.log_context['course_category_name'] = self.object.subject.course.category.name 738 self.log_context['course_category_name'] = self.object.subject.course.category.name
734 739
735 super(CreateTopicView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 740 super(CreateTopicView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
736 - 741 +
737 return super(CreateTopicView, self).form_valid(form) 742 return super(CreateTopicView, self).form_valid(form)
738 743
739 class UpdateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView): 744 class UpdateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView):
@@ -939,7 +944,7 @@ def subscribe_subject(request, slug): @@ -939,7 +944,7 @@ def subscribe_subject(request, slug):
939 subject.students.add(request.user) 944 subject.students.add(request.user)
940 945
941 if request.user in subject.students.all(): 946 if request.user in subject.students.all():
942 - log_context = {} 947 + log_context = {}
943 log_context['subject_id'] = subject.id 948 log_context['subject_id'] = subject.id
944 log_context['subject_name'] = subject.name 949 log_context['subject_name'] = subject.name
945 log_context['subject_slug'] = subject.slug 950 log_context['subject_slug'] = subject.slug
@@ -999,10 +1004,29 @@ class FileMaterialView(LoginRequiredMixin, LogMixin, generic.DetailView): @@ -999,10 +1004,29 @@ class FileMaterialView(LoginRequiredMixin, LogMixin, generic.DetailView):
999 self.log_context['course_slug'] = file.topic.subject.course.slug 1004 self.log_context['course_slug'] = file.topic.subject.course.slug
1000 self.log_context['course_category_id'] = file.topic.subject.course.category.id 1005 self.log_context['course_category_id'] = file.topic.subject.course.category.id
1001 self.log_context['course_category_name'] = file.topic.subject.course.category.name 1006 self.log_context['course_category_name'] = file.topic.subject.course.category.name
  1007 + self.log_context['timestamp_start'] = str(int(time.time()))
1002 1008
1003 super(FileMaterialView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 1009 super(FileMaterialView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
1004 1010
1005 - self.request.session['time_spent'] = str(datetime.now())  
1006 self.request.session['log_id'] = Log.objects.latest('id').id 1011 self.request.session['log_id'] = Log.objects.latest('id').id
1007 1012
1008 return super(FileMaterialView, self).dispatch(*args, **kwargs) 1013 return super(FileMaterialView, self).dispatch(*args, **kwargs)
  1014 +
  1015 +
  1016 +#API VIEWS
  1017 +class CourseViewSet(viewsets.ModelViewSet):
  1018 + queryset = Course.objects.all()
  1019 + serializer_class = CourseSerializer
  1020 + permissions_class = (permissions.IsAuthenticatedOrReadOnly)
  1021 +
  1022 +class SubjectViewSet(viewsets.ModelViewSet):
  1023 + queryset = Subject.objects.all()
  1024 + serializer_class = SubjectSerializer
  1025 + permissions_class = (permissions.IsAuthenticatedOrReadOnly)
  1026 +
  1027 +
  1028 +class TopicViewSet(viewsets.ModelViewSet):
  1029 + queryset = Topic.objects.all()
  1030 + serializer_class = TopicSerializer
  1031 + permissions_class = (permissions.IsAuthenticatedOrReadOnly)
  1032 +
exam/templates/exam/create.html
1 -{# {% extends "topic/index.html" %} #} 1 +{% extends "home.html" %}
2 2
3 {% load i18n widget_tweaks dict_access static%} 3 {% load i18n widget_tweaks dict_access static%}
4 4
@@ -87,17 +87,15 @@ @@ -87,17 +87,15 @@
87 </div> 87 </div>
88 </div> 88 </div>
89 </div> 89 </div>
90 -{% block script_exam %} 90 +
91 <script type="text/javascript"> 91 <script type="text/javascript">
92 92
93 var id = 1; 93 var id = 1;
94 $("#add_question").click(function(){ 94 $("#add_question").click(function(){
95 $.get("{% url 'course:exam:true_or_false_question' %}", function(data){ 95 $.get("{% url 'course:exam:true_or_false_question' %}", function(data){
96 - // var teste = String(data);  
97 - // teste.replace("#radiosTF", "W3Schools");  
98 - // alert(teste); 96 +
99 $("#questions").append(data); 97 $("#questions").append(data);
100 - // $("#radiosTF").attr("id", "true_id_" + id); 98 +
101 $("#0").attr("id","true_" + id++); 99 $("#0").attr("id","true_" + id++);
102 }); 100 });
103 }); 101 });
@@ -133,8 +131,7 @@ $(function() { @@ -133,8 +131,7 @@ $(function() {
133 }); 131 });
134 132
135 </script> 133 </script>
136 -{% endblock script_exam %}  
137 -{# <a href="" data-toggle="modal" data-target="#exam">modal</a> #}  
138 134
139 135
140 -{# {% endblock content %} #} 136 +
  137 +{% endblock content %}
exam/templates/exam/questions/multiple_choice_question.html
@@ -31,7 +31,7 @@ @@ -31,7 +31,7 @@
31 <!-- new alternative button --> 31 <!-- new alternative button -->
32 <div class="form-group"> 32 <div class="form-group">
33 <div class="col-md-12 col-md-offset-2"> 33 <div class="col-md-12 col-md-offset-2">
34 - <button type="button" class="btn btn-primary" id="newAlternative">{% trans 'New Alternative' %]</button> 34 + <button type="button" class="btn btn-primary" id="newAlternative">{% trans 'New Alternative' %}</button>
35 </div> 35 </div>
36 </div> 36 </div>
37 <div class="form-group"> 37 <div class="form-group">
@@ -9,15 +9,22 @@ from django.utils.translation import ugettext_lazy as _ @@ -9,15 +9,22 @@ from django.utils.translation import ugettext_lazy as _
9 from rolepermissions.verifications import has_role 9 from rolepermissions.verifications import has_role
10 from rolepermissions.verifications import has_object_permission 10 from rolepermissions.verifications import has_object_permission
11 from django.db.models import Q 11 from django.db.models import Q
  12 +from datetime import datetime
  13 +import time
12 # from django.views.generic.edit import FormMixin 14 # from django.views.generic.edit import FormMixin
13 15
14 from .forms import ExamForm 16 from .forms import ExamForm
15 from .models import Exam, Answer, AnswersStudent 17 from .models import Exam, Answer, AnswersStudent
16 -from core.mixins import NotificationMixin 18 +from core.mixins import LogMixin, NotificationMixin
  19 +from core.models import Log
17 from users.models import User 20 from users.models import User
18 from courses.models import Course, Topic 21 from courses.models import Course, Topic
19 22
20 -class ViewExam(LoginRequiredMixin,generic.DetailView): 23 +class ViewExam(LoginRequiredMixin, LogMixin, generic.DetailView):
  24 + log_component = 'exam'
  25 + log_resource = 'exam'
  26 + log_action = 'viewed'
  27 + log_context = {}
21 28
22 model = Exam 29 model = Exam
23 context_object_name = 'exam' 30 context_object_name = 'exam'
@@ -40,11 +47,34 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): @@ -40,11 +47,34 @@ class ViewExam(LoginRequiredMixin,generic.DetailView):
40 context['status'] = False 47 context['status'] = False
41 else: 48 else:
42 context['status'] = answered[0].status 49 context['status'] = answered[0].status
  50 +
  51 + self.log_context['exam_id'] = exam.id
  52 + self.log_context['topic_id'] = exam.topic.id
  53 + self.log_context['topic_name'] = exam.topic.name
  54 + self.log_context['topic_slug'] = exam.topic.slug
  55 + self.log_context['subject_id'] = exam.topic.subject.id
  56 + self.log_context['subject_name'] = exam.topic.subject.name
  57 + self.log_context['subject_slug'] = exam.topic.subject.slug
  58 + self.log_context['course_id'] = exam.topic.subject.course.id
  59 + self.log_context['course_name'] = exam.topic.subject.course.name
  60 + self.log_context['course_slug'] = exam.topic.subject.course.slug
  61 + self.log_context['course_category_id'] = exam.topic.subject.course.category.id
  62 + self.log_context['course_category_name'] = exam.topic.subject.course.category.name
  63 + self.request.session['time_spent'] = str(int(time.time()))
  64 +
  65 + super(ViewExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  66 +
  67 + self.request.session['log_id'] = Log.objects.latest('id').id
  68 +
43 return context 69 return context
44 70
45 71
46 72
47 -class CreateExam(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.CreateView): 73 +class CreateExam(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView):
  74 + log_component = 'exam'
  75 + log_resource = 'exam'
  76 + log_action = 'create'
  77 + log_context = {}
48 78
49 allowed_roles = ['professor', 'system_admin'] 79 allowed_roles = ['professor', 'system_admin']
50 login_url = reverse_lazy("core:home") 80 login_url = reverse_lazy("core:home")
@@ -83,6 +113,21 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.Crea @@ -83,6 +113,21 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.Crea
83 answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) 113 answer = Answer(answer=self.request.POST[key],order=key,exam=self.object)
84 answer.save() 114 answer.save()
85 115
  116 + self.log_context['exam_id'] = self.object.id
  117 + self.log_context['topic_id'] = self.object.topic.id
  118 + self.log_context['topic_name'] = self.object.topic.name
  119 + self.log_context['topic_slug'] = self.object.topic.slug
  120 + self.log_context['subject_id'] = self.object.topic.subject.id
  121 + self.log_context['subject_name'] = self.object.topic.subject.name
  122 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  123 + self.log_context['course_id'] = self.object.topic.subject.course.id
  124 + self.log_context['course_name'] = self.object.topic.subject.course.name
  125 + self.log_context['course_slug'] = self.object.topic.subject.course.slug
  126 + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
  127 + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
  128 +
  129 + super(CreateExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  130 +
86 return self.render_to_response(self.get_context_data(form = form), status = 200) 131 return self.render_to_response(self.get_context_data(form = form), status = 200)
87 132
88 def get_context_data(self, **kwargs): 133 def get_context_data(self, **kwargs):
@@ -93,7 +138,11 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.Crea @@ -93,7 +138,11 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.Crea
93 context['subjects'] = topic.subject.course.subjects.all() 138 context['subjects'] = topic.subject.course.subjects.all()
94 return context 139 return context
95 140
96 -class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): 141 +class UpdateExam(LoginRequiredMixin,HasRoleMixin, LogMixin, generic.UpdateView):
  142 + log_component = 'exam'
  143 + log_resource = 'exam'
  144 + log_action = 'update'
  145 + log_context = {}
97 146
98 allowed_roles = ['professor', 'system_admin'] 147 allowed_roles = ['professor', 'system_admin']
99 login_url = reverse_lazy("core:home") 148 login_url = reverse_lazy("core:home")
@@ -139,6 +188,21 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): @@ -139,6 +188,21 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView):
139 answer = Answer(answer=self.request.POST[key],order=key,exam=exam) 188 answer = Answer(answer=self.request.POST[key],order=key,exam=exam)
140 answer.save() 189 answer.save()
141 190
  191 + self.log_context['exam_id'] = self.object.id
  192 + self.log_context['topic_id'] = self.object.topic.id
  193 + self.log_context['topic_name'] = self.object.topic.name
  194 + self.log_context['topic_slug'] = self.object.topic.slug
  195 + self.log_context['subject_id'] = self.object.topic.subject.id
  196 + self.log_context['subject_name'] = self.object.topic.subject.name
  197 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  198 + self.log_context['course_id'] = self.object.topic.subject.course.id
  199 + self.log_context['course_name'] = self.object.topic.subject.course.name
  200 + self.log_context['course_slug'] = self.object.topic.subject.course.slug
  201 + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
  202 + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
  203 +
  204 + super(UpdateExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  205 +
142 return super(UpdateExam, self).form_valid(form) 206 return super(UpdateExam, self).form_valid(form)
143 207
144 def get_context_data(self, **kwargs): 208 def get_context_data(self, **kwargs):
@@ -158,7 +222,11 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): @@ -158,7 +222,11 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView):
158 222
159 return context 223 return context
160 224
161 -class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): 225 +class DeleteExam(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DeleteView):
  226 + log_component = 'exam'
  227 + log_resource = 'exam'
  228 + log_action = 'delete'
  229 + log_context = {}
162 230
163 allowed_roles = ['professor', 'system_admin'] 231 allowed_roles = ['professor', 'system_admin']
164 login_url = reverse_lazy("core:home") 232 login_url = reverse_lazy("core:home")
@@ -184,12 +252,31 @@ class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): @@ -184,12 +252,31 @@ class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
184 return context 252 return context
185 253
186 def get_success_url(self): 254 def get_success_url(self):
  255 + self.log_context['exam_id'] = self.object.id
  256 + self.log_context['topic_id'] = self.object.topic.id
  257 + self.log_context['topic_name'] = self.object.topic.name
  258 + self.log_context['topic_slug'] = self.object.topic.slug
  259 + self.log_context['subject_id'] = self.object.topic.subject.id
  260 + self.log_context['subject_name'] = self.object.topic.subject.name
  261 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  262 + self.log_context['course_id'] = self.object.topic.subject.course.id
  263 + self.log_context['course_name'] = self.object.topic.subject.course.name
  264 + self.log_context['course_slug'] = self.object.topic.subject.course.slug
  265 + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
  266 + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
  267 +
  268 + super(DeleteExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  269 +
187 return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) 270 return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug})
188 271
189 class AnswerExam(generic.TemplateView): 272 class AnswerExam(generic.TemplateView):
190 template_name = 'exam/answer.html' 273 template_name = 'exam/answer.html'
191 274
192 -class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): 275 +class AnswerStudentExam(LoginRequiredMixin, LogMixin, generic.CreateView):
  276 + log_component = 'exam'
  277 + log_resource = 'exam'
  278 + log_action = 'answer'
  279 + log_context = {}
193 280
194 model = AnswersStudent 281 model = AnswersStudent
195 fields = ['status'] 282 fields = ['status']
@@ -209,6 +296,37 @@ class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): @@ -209,6 +296,37 @@ class AnswerStudentExam(LoginRequiredMixin,generic.CreateView):
209 if(key != 'csrfmiddlewaretoken'): 296 if(key != 'csrfmiddlewaretoken'):
210 answers.answer.add(exam.answers.all().filter(order=key)[0]) 297 answers.answer.add(exam.answers.all().filter(order=key)[0])
211 298
  299 + self.log_context['exam_id'] = exam.id
  300 + self.log_context['topic_id'] = exam.topic.id
  301 + self.log_context['topic_name'] = exam.topic.name
  302 + self.log_context['topic_slug'] = exam.topic.slug
  303 + self.log_context['subject_id'] = exam.topic.subject.id
  304 + self.log_context['subject_name'] = exam.topic.subject.name
  305 + self.log_context['subject_slug'] = exam.topic.subject.slug
  306 + self.log_context['course_id'] = exam.topic.subject.course.id
  307 + self.log_context['course_name'] = exam.topic.subject.course.name
  308 + self.log_context['course_slug'] = exam.topic.subject.course.slug
  309 + self.log_context['course_category_id'] = exam.topic.subject.course.category.id
  310 + self.log_context['course_category_name'] = exam.topic.subject.course.category.name
  311 +
  312 + date_time_click = datetime.strptime(self.request.session.get('time_spent'), "%Y-%m-%d %H:%M:%S.%f")
  313 + _now = datetime.now()
  314 +
  315 + time_spent = _now - date_time_click
  316 +
  317 + secs = time_spent.total_seconds()
  318 + hours = int(secs / 3600)
  319 + minutes = int(secs / 60) % 60
  320 + secs = secs % 60
  321 +
  322 + self.log_context['timestamp_end'] = str(int(time.time()))
  323 + self.log_context['time_spent'] = {}
  324 + self.log_context['time_spent']['hours'] = hours
  325 + self.log_context['time_spent']['minutes'] = minutes
  326 + self.log_context['time_spent']['seconds'] = secs
  327 +
  328 + super(AnswerStudentExam, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  329 +
212 return self.render_to_response(self.get_context_data(form = form), status = 200) 330 return self.render_to_response(self.get_context_data(form = form), status = 200)
213 331
214 def get_context_data(self, **kwargs): 332 def get_context_data(self, **kwargs):
@@ -230,6 +348,9 @@ class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): @@ -230,6 +348,9 @@ class AnswerStudentExam(LoginRequiredMixin,generic.CreateView):
230 context['answers'] = answers 348 context['answers'] = answers
231 context['keys'] = keys 349 context['keys'] = keys
232 350
  351 + self.log_context['timestamp_start'] = str(int(time.time()))
  352 + self.request.session['time_spent'] = str(datetime.now())
  353 +
233 return context 354 return context
234 355
235 class MultipleChoiceQuestion(generic.TemplateView): 356 class MultipleChoiceQuestion(generic.TemplateView):
forum/views.py
@@ -8,6 +8,7 @@ from django.core.paginator import Paginator, EmptyPage @@ -8,6 +8,7 @@ from django.core.paginator import Paginator, EmptyPage
8 from django.http import Http404, JsonResponse 8 from django.http import Http404, JsonResponse
9 from django.urls import reverse 9 from django.urls import reverse
10 from django.template.loader import render_to_string 10 from django.template.loader import render_to_string
  11 +import time
11 12
12 from rolepermissions.mixins import HasRoleMixin 13 from rolepermissions.mixins import HasRoleMixin
13 from rolepermissions.verifications import has_object_permission 14 from rolepermissions.verifications import has_object_permission
@@ -229,10 +230,10 @@ class ForumDetailView(LoginRequiredMixin, LogMixin, generic.DetailView): @@ -229,10 +230,10 @@ class ForumDetailView(LoginRequiredMixin, LogMixin, generic.DetailView):
229 self.log_context['course_slug'] = forum.topic.subject.course.slug 230 self.log_context['course_slug'] = forum.topic.subject.course.slug
230 self.log_context['course_category_id'] = forum.topic.subject.course.category.id 231 self.log_context['course_category_id'] = forum.topic.subject.course.category.id
231 self.log_context['course_category_name'] = forum.topic.subject.course.category.name 232 self.log_context['course_category_name'] = forum.topic.subject.course.category.name
  233 + self.log_context['timestamp_start'] = str(int(time.time()))
232 234
233 super(ForumDetailView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 235 super(ForumDetailView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
234 236
235 - self.request.session['time_spent'] = str(datetime.datetime.now())  
236 self.request.session['log_id'] = Log.objects.latest('id').id 237 self.request.session['log_id'] = Log.objects.latest('id').id
237 238
238 return super(ForumDetailView, self).dispatch(*args, **kwargs) 239 return super(ForumDetailView, self).dispatch(*args, **kwargs)
links/static/js/links.js
@@ -4,5 +4,4 @@ function get_modal_link(url, id,div_content){ @@ -4,5 +4,4 @@ function get_modal_link(url, id,div_content){
4 $(div_content).append(data); 4 $(div_content).append(data);
5 $(id).modal('show'); 5 $(id).modal('show');
6 }); 6 });
7 -  
8 } 7 }
links/templates/links/create_link.html
@@ -45,6 +45,7 @@ @@ -45,6 +45,7 @@
45 {# // <script src="{% static 'js/links.js' %}"></script> #} 45 {# // <script src="{% static 'js/links.js' %}"></script> #}
46 <script type="text/javascript"> 46 <script type="text/javascript">
47 $("#form-link").submit(function(event) { 47 $("#form-link").submit(function(event) {
  48 + $("#createLinksModal").modal("hide");
48 var data = new FormData($('#form-link').get(0)); 49 var data = new FormData($('#form-link').get(0));
49 $.ajax({ 50 $.ajax({
50 url: "{% url 'course:links:create_link' topic.slug %}", 51 url: "{% url 'course:links:create_link' topic.slug %}",
@@ -54,15 +55,16 @@ @@ -54,15 +55,16 @@
54 processData: false, 55 processData: false,
55 contentType: false, 56 contentType: false,
56 success: function(data) { 57 success: function(data) {
57 - $('#createLinksModal').modal('hide'); 58 + $('#requisicoes_ajax').empty();
58 $('#list-topic{{ topic.id }}-links').append(data); 59 $('#list-topic{{ topic.id }}-links').append(data);
59 $('#list-topic{{ topic.id }}-links-edit').append(data); 60 $('#list-topic{{ topic.id }}-links-edit').append(data);
60 alertify.alert('Link successfully created!') 61 alertify.alert('Link successfully created!')
61 }, 62 },
62 error: function(data){ 63 error: function(data){
63 - $('.erro').html(data.responseText);  
64 - $('.modal-backdrop').remove();  
65 - $('#createLinksModal').modal(); 64 + $("div.modal-backdrop.fade.in").remove();
  65 + $('#requisicoes_ajax').empty();
  66 + $('#requisicoes_ajax').append(data.responseText);
  67 + $('#createLinksModal').modal('show');
66 alertify.alert('Invalid link, insert a valid one!'); 68 alertify.alert('Invalid link, insert a valid one!');
67 } 69 }
68 }); 70 });
links/templates/links/delete_link.html
@@ -40,6 +40,7 @@ @@ -40,6 +40,7 @@
40 <script type="text/javascript"> 40 <script type="text/javascript">
41 $("#form-delete-link").submit(function(event) { 41 $("#form-delete-link").submit(function(event) {
42 var data = new FormData($('#form-delete-link').get(0)); 42 var data = new FormData($('#form-delete-link').get(0));
  43 + $('#linkDeleteModal').modal('hide');
43 $.ajax({ 44 $.ajax({
44 url: "{% url 'course:links:delete_link' link.slug %}", 45 url: "{% url 'course:links:delete_link' link.slug %}",
45 type: $("#form-delete-link").attr('method'), 46 type: $("#form-delete-link").attr('method'),
@@ -48,16 +49,17 @@ @@ -48,16 +49,17 @@
48 processData: false, 49 processData: false,
49 contentType: false, 50 contentType: false,
50 success: function(data) { 51 success: function(data) {
51 - $('#linkDeleteModal').modal('hide'); 52 + $('#requisicoes_ajax').empty();
52 $('#link_{{ link.slug }}').remove(); 53 $('#link_{{ link.slug }}').remove();
53 $('#link_edit_icon_{{ link.slug }}').remove(); 54 $('#link_edit_icon_{{ link.slug }}').remove();
54 $('#link_edit_{{ link.slug }}').remove(); 55 $('#link_edit_{{ link.slug }}').remove();
55 alertify.alert('Link successfully deleted!') 56 alertify.alert('Link successfully deleted!')
56 }, 57 },
57 error: function(data){ 58 error: function(data){
58 - // $('.erro-update').html(data.responseText);  
59 - $('.modal-backdrop').remove();  
60 - $('#linkDeteleModal').modal(); 59 + $("div.modal-backdrop.fade.in").remove();
  60 + $('#requisicoes_ajax').empty();
  61 + $('#requisicoes_ajax').append(data.responseText);
  62 + $('#linkDeleteModal').modal('show');
61 alertify.alert('Error when trying to delete.'); 63 alertify.alert('Error when trying to delete.');
62 } 64 }
63 }); 65 });
links/templates/links/render_link.html
1 -<li id="link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li> 1 +<li id="link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#requisicoes_ajax')">{{link.name}}</a></li>
links/templates/links/update_link.html
@@ -50,6 +50,7 @@ @@ -50,6 +50,7 @@
50 {# // <script src="{% static 'js/links.js' %}"></script> #} 50 {# // <script src="{% static 'js/links.js' %}"></script> #}
51 <script type="text/javascript"> 51 <script type="text/javascript">
52 $("#form-update-link").submit(function(event) { 52 $("#form-update-link").submit(function(event) {
  53 + $('#linksModalEdit').modal('hide');
53 var data = new FormData($('#form-update-link').get(0)); 54 var data = new FormData($('#form-update-link').get(0));
54 $.ajax({ 55 $.ajax({
55 url: "{% url 'course:links:update_link' link.slug %}", 56 url: "{% url 'course:links:update_link' link.slug %}",
@@ -59,14 +60,15 @@ @@ -59,14 +60,15 @@
59 processData: false, 60 processData: false,
60 contentType: false, 61 contentType: false,
61 success: function(data) { 62 success: function(data) {
62 - $('#linksModalEdit').modal('hide'); 63 + $('#requisicoes_ajax').empty();
63 $('#link_edit_{{ link.slug }}').replaceWith(data); 64 $('#link_edit_{{ link.slug }}').replaceWith(data);
64 $('#link_{{ link.slug }}').replaceWith(data); 65 $('#link_{{ link.slug }}').replaceWith(data);
65 alertify.alert("Sucessfully Updated!") 66 alertify.alert("Sucessfully Updated!")
66 }, 67 },
67 error: function(data){ 68 error: function(data){
68 - $('.erro-update').html(data.responseText);  
69 - $('.modal-backdrop').remove(); 69 + $("div.modal-backdrop.fade.in").remove();
  70 + $('#requisicoes_ajax').empty();
  71 + $('#requisicoes_ajax').append(data.responseText);
70 $('#linksModalEdit').modal(); 72 $('#linksModalEdit').modal();
71 alertify.alert('Invalid link, insert a valid one!'); 73 alertify.alert('Invalid link, insert a valid one!');
72 } 74 }
links/templates/links/view_link.html
@@ -22,10 +22,6 @@ @@ -22,10 +22,6 @@
22 </div> 22 </div>
23 </div> 23 </div>
24 </div> 24 </div>
25 -  
26 -<div class = 'row' id ="divModalLink">  
27 -  
28 -</div>  
29 <!-- EndModal --> 25 <!-- EndModal -->
30 <script type="text/javascript"> 26 <script type="text/javascript">
31 $('.modal-backdrop').remove(); 27 $('.modal-backdrop').remove();
links/views.py
@@ -10,6 +10,7 @@ from core.mixins import NotificationMixin @@ -10,6 +10,7 @@ from core.mixins import NotificationMixin
10 from django.urls import reverse 10 from django.urls import reverse
11 from django.core.files.base import ContentFile 11 from django.core.files.base import ContentFile
12 from rolepermissions.verifications import has_role 12 from rolepermissions.verifications import has_role
  13 +import time
13 14
14 from core.models import Log 15 from core.models import Log
15 from core.mixins import LogMixin 16 from core.mixins import LogMixin
@@ -244,6 +245,7 @@ class ViewLink(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DetailView): @@ -244,6 +245,7 @@ class ViewLink(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DetailView):
244 self.log_context['course_slug'] = link.topic.subject.course.slug 245 self.log_context['course_slug'] = link.topic.subject.course.slug
245 self.log_context['course_category_id'] = link.topic.subject.course.category.id 246 self.log_context['course_category_id'] = link.topic.subject.course.category.id
246 self.log_context['course_category_name'] = link.topic.subject.course.category.name 247 self.log_context['course_category_name'] = link.topic.subject.course.category.name
  248 + self.log_context['timestamp_start'] = str(int(time.time()))
247 249
248 super(ViewLink, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 250 super(ViewLink, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
249 251
poll/models.py
@@ -12,7 +12,7 @@ class Poll(Activity): @@ -12,7 +12,7 @@ class Poll(Activity):
12 verbose_name_plural = _('Polls') 12 verbose_name_plural = _('Polls')
13 13
14 def __str__(self): 14 def __str__(self):
15 - return str(self.name) + str("/") + str(self.topic) 15 + return str(self.name)
16 16
17 class Answer(models.Model): 17 class Answer(models.Model):
18 answer = models.CharField(_("Answer"), max_length = 200) 18 answer = models.CharField(_("Answer"), max_length = 200)
poll/static/js/modal_poll.js
1 -//controles do modal  
2 -$(window).ready(function() { // utilizado para abrir o modal quando tiver tido algum erro no preenchimento do formulario  
3 - if($('.not_submited').length){  
4 - $('#poll').modal('show');  
5 - }  
6 -}); 1 +//
  2 +// //controles do modal
  3 +// $(window).ready(function() { // utilizado para abrir o modal quando tiver tido algum erro no preenchimento do formulario
  4 +// if($('.not_submited').length){
  5 +// $('#poll').modal('show');
  6 +// }
  7 +// });
  8 +
7 var Answer = { 9 var Answer = {
8 init: function(url) { // utilizado para adicionar um novo campo de resposta 10 init: function(url) { // utilizado para adicionar um novo campo de resposta
9 $.get(url, function(data){ 11 $.get(url, function(data){
@@ -17,24 +19,57 @@ var Answer = { @@ -17,24 +19,57 @@ var Answer = {
17 }; 19 };
18 20
19 var Submite = { 21 var Submite = {
20 - post: function(url,dados){ 22 + create: function(url,dados, slug){
21 $('#poll').modal('hide'); 23 $('#poll').modal('hide');
  24 + var poll = null;
22 $.post(url,dados, function(data){ 25 $.post(url,dados, function(data){
  26 + $.ajax({
  27 + method: "get",
  28 + url: data["view"],
  29 + success: function(view){
  30 + $('#list-topic-'+ slug +'-poll').append(view);
  31 + }
  32 + });
  33 + $.ajax({
  34 + method: "get",
  35 + url: data["edit"],
  36 + success: function(edit){
  37 + $('#list-topic-'+ slug +'-poll-edit').append(edit);
  38 + }
  39 + });
  40 + $("#requisicoes_ajax").empty();
  41 + alertify.alert('Poll successfully created!');
  42 + $("div.modal-backdrop.fade.in").remove();
23 }).fail(function(data){ 43 }).fail(function(data){
24 $("div.modal-backdrop.fade.in").remove(); 44 $("div.modal-backdrop.fade.in").remove();
25 - $("#modal_poll").empty();  
26 - $("#modal_poll").append(data.responseText); 45 + $("#requisicoes_ajax").empty();
  46 + $("#requisicoes_ajax").append(data.responseText);
  47 + $('#poll').modal('show');
  48 + });
  49 + },
  50 + update: function(url,dados, slug_poll, slug_topic){
  51 + $('#poll').modal('hide');
  52 + $.post(url,dados, function(data){
  53 + $('#list-topic-'+ slug_topic +'-poll #'+slug_poll).replaceWith(data);
  54 + $('#list-topic-'+ slug_topic +'-poll #'+slug_poll).replaceWith(data);
  55 + alertify.alert('Poll successfully updated!')
  56 + }).fail(function(data){
  57 + $("div.modal-backdrop.fade.in").remove();
  58 + $("#requisicoes_ajax").empty();
  59 + $("#requisicoes_ajax").append(data.responseText);
  60 + $('#poll').modal('show');
27 }); 61 });
28 }, 62 },
29 remove: function(url,dados, id_li_link){ 63 remove: function(url,dados, id_li_link){
30 $('#poll').modal('hide'); 64 $('#poll').modal('hide');
31 $.post(url,dados, function(data){ 65 $.post(url,dados, function(data){
32 $(id_li_link).remove(); 66 $(id_li_link).remove();
33 - $("#modal_poll").empty(); 67 + $(id_li_link+"_div").remove();
  68 + $("#requisicoes_ajax").empty();
34 $("div.modal-backdrop.fade.in").remove(); 69 $("div.modal-backdrop.fade.in").remove();
35 }).fail(function(){ 70 }).fail(function(){
36 - $("#modal_poll").empty();  
37 - $("#modal_poll").append(data); 71 + $("#requisicoes_ajax").empty();
  72 + $("#requisicoes_ajax").append(data);
38 $('#poll').modal('show'); 73 $('#poll').modal('show');
39 }); 74 });
40 } 75 }
poll/templates/poll/create.html
@@ -2,13 +2,6 @@ @@ -2,13 +2,6 @@
2 2
3 {% load i18n widget_tweaks dict_access static%} 3 {% load i18n widget_tweaks dict_access static%}
4 4
5 -{# {% block style %} #}  
6 - <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>  
7 - <script src="{% static 'js/modal_poll.js' %}"></script>  
8 -  
9 -{# {% endblock %} #}  
10 -  
11 -{# {% block content %} #}  
12 <!-- Modal (remember to change the ids!!!) --> 5 <!-- Modal (remember to change the ids!!!) -->
13 <div class="modal fade" id="poll" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 6 <div class="modal fade" id="poll" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
14 <div class="modal-dialog" role="document"> 7 <div class="modal-dialog" role="document">
@@ -178,7 +171,7 @@ @@ -178,7 +171,7 @@
178 }); 171 });
179 172
180 $("#form").submit(function(event) { 173 $("#form").submit(function(event) {
181 - Submite.post("{% url 'course:poll:create_poll' topic.slug %}",$(this).serialize()); 174 + Submite.create("{% url 'course:poll:create_poll' topic.slug %}",$(this).serialize(), "{{topic.slug}}");
182 event.preventDefault(); 175 event.preventDefault();
183 }); 176 });
184 </script> 177 </script>
poll/templates/poll/poll_edit.html 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +<div id="poll_{{poll.slug}}_div">
  2 + <li class="icon_edit_remove" ><a href="javascript:modal.get('{% url 'course:poll:update_poll' poll.slug %}','#poll','#requisicoes_ajax');"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('{% url 'course:poll:delete_poll' poll.slug %}','#poll','#requisicoes_ajax');"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
  3 + <li><i class="fa fa-bar-chart"></i> <a href="javascript:modal.get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#requisicoes_ajax');">{{poll}}</a></li>
  4 +</div>
poll/templates/poll/poll_view.html 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +<li id="poll_{{poll.slug}}"><i class="fa fa-bar-chart"></i> <a href="javascript:modal.get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#requisicoes_ajax');">{{ poll }}</a></li>
poll/templates/poll/remove.html
@@ -10,15 +10,15 @@ @@ -10,15 +10,15 @@
10 {% block content_poll %} 10 {% block content_poll %}
11 <script src="{% static 'js/modal_poll.js' %}"></script> 11 <script src="{% static 'js/modal_poll.js' %}"></script>
12 <!-- Put ONLY your content here!!! --> 12 <!-- Put ONLY your content here!!! -->
13 -<form id="delete_form" action="" method="post"> 13 +<form id="delete_poll" action="" method="post">
14 {% csrf_token %} 14 {% csrf_token %}
15 <p>{% trans 'Are you sure you want to delete the subject' %} "{{poll.name}}"?</p> 15 <p>{% trans 'Are you sure you want to delete the subject' %} "{{poll.name}}"?</p>
16 </form> 16 </form>
17 {% endblock content_poll %} 17 {% endblock content_poll %}
18 {% block button_save %} 18 {% block button_save %}
19 -<button type="submite" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> 19 +<button type="submite" id="button" form="delete_poll" class="btn btn-primary btn-raised">{% trans "Delete" %}</button>
20 <script> 20 <script>
21 - $("#delete_form").submit(function(event) { 21 + $("#delete_poll").submit(function(event) {
22 Submite.remove("{% url 'course:poll:delete_poll' poll.slug %}",$(this).serialize(),"#poll_{{poll.slug}}"); 22 Submite.remove("{% url 'course:poll:delete_poll' poll.slug %}",$(this).serialize(),"#poll_{{poll.slug}}");
23 event.preventDefault(); 23 event.preventDefault();
24 }); 24 });
poll/templates/poll/update.html
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
25 }); 25 });
26 26
27 $("#form").submit(function(event) { 27 $("#form").submit(function(event) {
28 - Submite.post("{% url 'course:poll:update_poll' poll.slug %}",$(this).serialize()); 28 + Submite.update("{% url 'course:poll:update_poll' poll.slug %}",$(this).serialize(), "{{poll.slug}}");
29 event.preventDefault(); 29 event.preventDefault();
30 }); 30 });
31 </script> 31 </script>
@@ -9,4 +9,6 @@ urlpatterns = [ @@ -9,4 +9,6 @@ urlpatterns = [
9 url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeletePoll.as_view(), name='delete_poll'), # poll 9 url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeletePoll.as_view(), name='delete_poll'), # poll
10 url(r'^answer/$', views.AnswerPoll.as_view(), name='answer_poll'), # poll 10 url(r'^answer/$', views.AnswerPoll.as_view(), name='answer_poll'), # poll
11 url(r'^answer-poll/(?P<slug>[\w\-_]+)/$', views.AnswerStudentPoll.as_view(), name='answer_student_poll'), # poll slug 11 url(r'^answer-poll/(?P<slug>[\w\-_]+)/$', views.AnswerStudentPoll.as_view(), name='answer_student_poll'), # poll slug
  12 + url(r'^poll-view/(?P<slug>[\w\-_]+)/$', views.render_poll_view, name='render_poll_view'), # poll slug
  13 + url(r'^poll-edit/(?P<slug>[\w\-_]+)/$', views.render_poll_edit, name='render_poll_edit'), # poll slug
12 ] 14 ]
@@ -10,6 +10,7 @@ from rolepermissions.verifications import has_role @@ -10,6 +10,7 @@ from rolepermissions.verifications import has_role
10 from rolepermissions.verifications import has_object_permission 10 from rolepermissions.verifications import has_object_permission
11 from django.db.models import Q 11 from django.db.models import Q
12 from django.urls import reverse 12 from django.urls import reverse
  13 +import time
13 14
14 from .forms import PollForm 15 from .forms import PollForm
15 from .models import Poll, Answer, AnswersStudent 16 from .models import Poll, Answer, AnswersStudent
@@ -20,6 +21,8 @@ from courses.models import Course, Topic @@ -20,6 +21,8 @@ from courses.models import Course, Topic
20 21
21 import datetime 22 import datetime
22 23
  24 +from django.http import JsonResponse
  25 +
23 class ViewPoll(LoginRequiredMixin, LogMixin, generic.DetailView): 26 class ViewPoll(LoginRequiredMixin, LogMixin, generic.DetailView):
24 log_component = "poll" 27 log_component = "poll"
25 log_resource = "poll" 28 log_resource = "poll"
@@ -46,10 +49,10 @@ class ViewPoll(LoginRequiredMixin, LogMixin, generic.DetailView): @@ -46,10 +49,10 @@ class ViewPoll(LoginRequiredMixin, LogMixin, generic.DetailView):
46 self.log_context['course_slug'] = poll.topic.subject.course.slug 49 self.log_context['course_slug'] = poll.topic.subject.course.slug
47 self.log_context['course_category_id'] = poll.topic.subject.course.category.id 50 self.log_context['course_category_id'] = poll.topic.subject.course.category.id
48 self.log_context['course_category_name'] = poll.topic.subject.course.category.name 51 self.log_context['course_category_name'] = poll.topic.subject.course.category.name
  52 + self.log_context['timestamp_start'] = str(int(time.time()))
49 53
50 super(ViewPoll, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 54 super(ViewPoll, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
51 55
52 - self.request.session['time_spent'] = str(datetime.datetime.now())  
53 self.request.session['log_id'] = Log.objects.latest('id').id 56 self.request.session['log_id'] = Log.objects.latest('id').id
54 57
55 return poll 58 return poll
@@ -96,7 +99,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge @@ -96,7 +99,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge
96 context.context_data['keys'] = keys 99 context.context_data['keys'] = keys
97 context.context_data['form'] = form 100 context.context_data['form'] = form
98 context.status_code = 400 101 context.status_code = 400
99 - s  
100 return context 102 return context
101 103
102 def form_valid(self, form): 104 def form_valid(self, form):
@@ -107,7 +109,7 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge @@ -107,7 +109,7 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge
107 self.object.save() 109 self.object.save()
108 110
109 super(CreatePoll, self).createNotification(message="created a Poll at "+ self.object.topic.name, actor=self.request.user, 111 super(CreatePoll, self).createNotification(message="created a Poll at "+ self.object.topic.name, actor=self.request.user,
110 - resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), 112 + resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]),
111 users=self.object.topic.subject.students.all()) 113 users=self.object.topic.subject.students.all())
112 for key in self.request.POST: 114 for key in self.request.POST:
113 if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): 115 if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'):
@@ -130,7 +132,14 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge @@ -130,7 +132,14 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge
130 132
131 super(CreatePoll, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 133 super(CreatePoll, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
132 134
133 - return self.render_to_response(self.get_context_data(form = form), status = 200) 135 + return JsonResponse({"view":reverse_lazy('course:poll:render_poll_view', kwargs={'slug' : self.object.slug}),
  136 + "edit":reverse_lazy('course:poll:render_poll_edit', kwargs={'slug' : self.object.slug}),
  137 + })
  138 +
  139 +
  140 + # def get_success_url(self):
  141 + # self.success_url = redirect('course:poll:render_poll', slug = self.object.slug)
  142 + # return self.success_url
134 143
135 def get_context_data(self, **kwargs): 144 def get_context_data(self, **kwargs):
136 context = super(CreatePoll, self).get_context_data(**kwargs) 145 context = super(CreatePoll, self).get_context_data(**kwargs)
@@ -141,6 +150,20 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge @@ -141,6 +150,20 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin, LogMixin, NotificationMixin,ge
141 context['subjects'] = topic.subject.course.subjects.all() 150 context['subjects'] = topic.subject.course.subjects.all()
142 return context 151 return context
143 152
  153 +def render_poll_view(request, slug):
  154 + template_name = 'poll/poll_view.html'
  155 + context = {
  156 + 'poll': get_object_or_404(Poll, slug = slug)
  157 + }
  158 + return render(request, template_name, context)
  159 +
  160 +def render_poll_edit(request, slug):
  161 + template_name = 'poll/poll_edit.html'
  162 + context = {
  163 + 'poll': get_object_or_404(Poll, slug = slug)
  164 + }
  165 + return render(request, template_name, context)
  166 +
144 class UpdatePoll(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView): 167 class UpdatePoll(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView):
145 log_component = "poll" 168 log_component = "poll"
146 log_resource = "poll" 169 log_resource = "poll"
@@ -293,6 +316,7 @@ class AnswerStudentPoll(LoginRequiredMixin, LogMixin, generic.CreateView): @@ -293,6 +316,7 @@ class AnswerStudentPoll(LoginRequiredMixin, LogMixin, generic.CreateView):
293 def dispatch(self, *args, **kwargs): 316 def dispatch(self, *args, **kwargs):
294 if self.request.method == 'GET': 317 if self.request.method == 'GET':
295 self.request.session['time_spent'] = str(datetime.datetime.now()) 318 self.request.session['time_spent'] = str(datetime.datetime.now())
  319 + self.log_context['timestamp_start'] = str(int(time.time()))
296 320
297 return super(AnswerStudentPoll, self).dispatch(*args, **kwargs) 321 return super(AnswerStudentPoll, self).dispatch(*args, **kwargs)
298 322
@@ -322,12 +346,13 @@ class AnswerStudentPoll(LoginRequiredMixin, LogMixin, generic.CreateView): @@ -322,12 +346,13 @@ class AnswerStudentPoll(LoginRequiredMixin, LogMixin, generic.CreateView):
322 self.log_context['course_slug'] = poll.topic.subject.course.slug 346 self.log_context['course_slug'] = poll.topic.subject.course.slug
323 self.log_context['course_category_id'] = poll.topic.subject.course.category.id 347 self.log_context['course_category_id'] = poll.topic.subject.course.category.id
324 self.log_context['course_category_name'] = poll.topic.subject.course.category.name 348 self.log_context['course_category_name'] = poll.topic.subject.course.category.name
  349 + self.log_context['timestamp_end'] = str(int(time.time()))
325 350
326 date_time_click = datetime.datetime.strptime(self.request.session.get('time_spent'), "%Y-%m-%d %H:%M:%S.%f") 351 date_time_click = datetime.datetime.strptime(self.request.session.get('time_spent'), "%Y-%m-%d %H:%M:%S.%f")
327 _now = datetime.datetime.now() 352 _now = datetime.datetime.now()
328 - 353 +
329 time_spent = _now - date_time_click 354 time_spent = _now - date_time_click
330 - 355 +
331 secs = time_spent.total_seconds() 356 secs = time_spent.total_seconds()
332 hours = int(secs / 3600) 357 hours = int(secs / 3600)
333 minutes = int(secs / 60) % 60 358 minutes = int(secs / 60) % 60
requirements.txt
@@ -6,9 +6,11 @@ dj-database-url==0.4.1 @@ -6,9 +6,11 @@ dj-database-url==0.4.1
6 Django==1.10 6 Django==1.10
7 django-autoslug==1.9.3 7 django-autoslug==1.9.3
8 django-bootstrap-breadcrumbs==0.8 8 django-bootstrap-breadcrumbs==0.8
  9 +django-braces==1.10.0
9 django-discover-runner==1.0 10 django-discover-runner==1.0
10 django-floppyforms==1.7.0 11 django-floppyforms==1.7.0
11 django-modalview==0.1.5 12 django-modalview==0.1.5
  13 +django-oauth-toolkit==0.10.0
12 django-role-permissions==1.2.1 14 django-role-permissions==1.2.1
13 django-s3direct==0.4.2 15 django-s3direct==0.4.2
14 django-summernote==0.8.6 16 django-summernote==0.8.6
@@ -19,10 +21,12 @@ gunicorn==19.6.0 @@ -19,10 +21,12 @@ gunicorn==19.6.0
19 Jinja2==2.8 21 Jinja2==2.8
20 lxml==3.6.4 22 lxml==3.6.4
21 MarkupSafe==0.23 23 MarkupSafe==0.23
  24 +oauthlib==1.0.3
22 Pillow==3.3.1 25 Pillow==3.3.1
23 psycopg2==2.6.2 26 psycopg2==2.6.2
24 pycpfcnpj==1.0.2 27 pycpfcnpj==1.0.2
25 requests==2.11.1 28 requests==2.11.1
  29 +six==1.10.0
26 slugify==0.0.1 30 slugify==0.0.1
27 validators==0.11.0 31 validators==0.11.0
28 Werkzeug==0.11.11 32 Werkzeug==0.11.11
users/serializers.py 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +from rest_framework import serializers
  2 +from .models import User
  3 +
  4 +class UserSerializer(serializers.ModelSerializer):
  5 + class Meta:
  6 + model = User
  7 + fields = ('username','email','name','city','state','gender','image','birth_date','phone',
  8 + 'cpf','type_profile','titration','year_titration','institution','curriculum','date_created',
  9 + 'is_staff','is_active')
users/templates/list_users.html
@@ -62,7 +62,7 @@ @@ -62,7 +62,7 @@
62 {% if acc.gender == 'M' %} 62 {% if acc.gender == 'M' %}
63 <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user"> 63 <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user">
64 {% else %} 64 {% else %}
65 - <img src="{% static 'img/female_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user"> 65 + <img src="{% static 'img/female_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user">
66 {% endif %} 66 {% endif %}
67 {% endif %} 67 {% endif %}
68 </div> 68 </div>
@@ -76,7 +76,7 @@ @@ -76,7 +76,7 @@
76 <a href="javascript:void(0)" class="btn btn-danger btn-raised btn-lg" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}">{% trans 'Delete' %}</a> 76 <a href="javascript:void(0)" class="btn btn-danger btn-raised btn-lg" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}">{% trans 'Delete' %}</a>
77 </div> 77 </div>
78 </div> 78 </div>
79 - 79 +
80 80
81 <!-- Modal --> 81 <!-- Modal -->
82 <div class="modal fade" id="DeleteModal{{ forloop.counter }}" tabindex="-1" role="dialog" aria-labelledby="DeleteModalLabel"> 82 <div class="modal fade" id="DeleteModal{{ forloop.counter }}" tabindex="-1" role="dialog" aria-labelledby="DeleteModalLabel">
@@ -87,10 +87,10 @@ @@ -87,10 +87,10 @@
87 <h4 class="modal-title" id="DeleteModalLabel">{% trans 'Confirm delete' %}</h4> 87 <h4 class="modal-title" id="DeleteModalLabel">{% trans 'Confirm delete' %}</h4>
88 </div> 88 </div>
89 <div class="modal-body"> 89 <div class="modal-body">
90 - {% trans 'Are you sure you want to delete the user' %} <b>{{acc.name}}</b>? 90 + {% trans 'Are you sure you want to delete the user' %} <b>{{acc.name}}</b>?
91 </div> 91 </div>
92 <div class="modal-footer"> 92 <div class="modal-footer">
93 - <a href="#" class="btn btn-raised btn-danger" data-dismiss="modal">{% trans 'Cancel' %}</a> 93 + <a href="#" class="btn btn-raised btn-danger" data-dismiss="modal">{% trans 'Cancel' %}</a>
94 <a href="{% url 'users:delete' acc.username %}" class="btn btn-raised btn-success" style="margin-top: 0">{% trans 'Delete' %}</a> 94 <a href="{% url 'users:delete' acc.username %}" class="btn btn-raised btn-success" style="margin-top: 0">{% trans 'Delete' %}</a>
95 </div> 95 </div>
96 </div> 96 </div>
users/templates/users/profile.html
@@ -43,7 +43,7 @@ @@ -43,7 +43,7 @@
43 <div class="col-lg-12"> 43 <div class="col-lg-12">
44 <div class="well well-lg"> 44 <div class="well well-lg">
45 <div class="row"> 45 <div class="row">
46 - 46 +
47 {% if user.image %} 47 {% if user.image %}
48 <div class="col-md-4" style="width: 200px;overflow:hidden;margin-left: 8em;height: 150px;background-image: url('{{user.image.url}}');background-position: center;background-size: cover;"> 48 <div class="col-md-4" style="width: 200px;overflow:hidden;margin-left: 8em;height: 150px;background-image: url('{{user.image.url}}');background-position: center;background-size: cover;">
49 {% else %} 49 {% else %}
@@ -51,7 +51,7 @@ @@ -51,7 +51,7 @@
51 {% if user.gender == 'M' %} 51 {% if user.gender == 'M' %}
52 <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user" style="margin-left: 8em;"> 52 <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user" style="margin-left: 8em;">
53 {% else %} 53 {% else %}
54 - <img src="{% static 'img/female_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user" style="margin-left: 8em;"> 54 + <img src="{% static 'img/female_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user" style="margin-left: 8em;">
55 {% endif %} 55 {% endif %}
56 {% endif %} 56 {% endif %}
57 </div> 57 </div>
@@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
65 {% else %} 65 {% else %}
66 <td> {% trans "OffLine" %}</td> 66 <td> {% trans "OffLine" %}</td>
67 {% endif %} 67 {% endif %}
68 - 68 +
69 </tr> 69 </tr>
70 <tr> 70 <tr>
71 <td>{% trans "Name" %}:</td> 71 <td>{% trans "Name" %}:</td>
@@ -94,7 +94,7 @@ @@ -94,7 +94,7 @@
94 {% else %} 94 {% else %}
95 <td>{% trans "Student" %}</td> 95 <td>{% trans "Student" %}</td>
96 {% endif %} 96 {% endif %}
97 - 97 +
98 </tr> 98 </tr>
99 <tr> 99 <tr>
100 <td>{% trans "CPF" %}:</td> 100 <td>{% trans "CPF" %}:</td>
@@ -104,7 +104,7 @@ @@ -104,7 +104,7 @@
104 {% else %} 104 {% else %}
105 <td>{% trans "doesn't possess CPF" %}</td> 105 <td>{% trans "doesn't possess CPF" %}</td>
106 {% endif %} 106 {% endif %}
107 - 107 +
108 </tr> 108 </tr>
109 <tr> 109 <tr>
110 <td>{% trans "Phone Number" %}:</td> 110 <td>{% trans "Phone Number" %}:</td>
@@ -113,7 +113,7 @@ @@ -113,7 +113,7 @@
113 {% else %} 113 {% else %}
114 <td>{% trans "doesn't possess Phone" %}</td> 114 <td>{% trans "doesn't possess Phone" %}</td>
115 {% endif %} 115 {% endif %}
116 - 116 +
117 </tr> 117 </tr>
118 <tr> 118 <tr>
119 <td>{% trans "Gender" %}:</td> 119 <td>{% trans "Gender" %}:</td>
users/templates/users/remove_account.html
@@ -29,7 +29,7 @@ @@ -29,7 +29,7 @@
29 <p>{% trans 'All data will be lost and havent how recover it.' %}</p> 29 <p>{% trans 'All data will be lost and havent how recover it.' %}</p>
30 <div class="row"> 30 <div class="row">
31 <div class="col-md-3 col-sm-2 col-xs-2"> 31 <div class="col-md-3 col-sm-2 col-xs-2">
32 - <a href="#" class="btn btn-raised btn-block btn-success" >{% trans 'Remove' %}</a> 32 + <a href="{% url 'users:remove' user.username %}" class="btn btn-raised btn-block btn-success" >{% trans 'Remove' %}</a>
33 </div> 33 </div>
34 <div class="col-md-3 col-sm-2 col-xs-2"> 34 <div class="col-md-3 col-sm-2 col-xs-2">
35 <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-danger" >{% trans 'Cancel' %}</a> 35 <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-danger" >{% trans 'Cancel' %}</a>
users/templates/users/search.html
1 -<html>  
2 -<h1> Links </h1>  
3 -{% for link in link_list %}  
4 - {{link.name}} </br>  
5 -{% endfor %}  
6 -  
7 -<h1> Polls </h1>  
8 -{% for poll in poll_list %}  
9 - {{poll.name}} </br>  
10 -{% endfor %}  
11 -  
12 -<h1> Exams </h1>  
13 -{% for exam in exam_list %}  
14 - {{exam.name}} </br>  
15 -{% endfor %}  
16 -  
17 -<h1> Forums </h1>  
18 -{% for forum in forum_list %}  
19 - {{forum.name}} </br>  
20 -{% endfor %}  
21 -  
22 -<h1> Files </h1>  
23 -{% for file in file_list %}  
24 - {{file.name}} </br>  
25 -{% endfor %}  
26 -</html> 1 +{% extends 'home.html' %}
  2 +
  3 +{% load i18n pagination django_bootstrap_breadcrumbs permission_tags static %}
  4 +{% block javascript %}
  5 + <script type="text/javascript" src="{% static 'js/forum.js' %}"></script>
  6 + <script src="{% static 'js/file.js' %}"></script>
  7 + <script type="text/javascript" src="{% static 'js/material.js' %}"></script>
  8 + <script type = "text/javascript" src="{% static 'js/links.js' %}"></script>
  9 + <script src="{% static 'js/modals_requisitions.js'%}"></script>
  10 + <script src="{% static 'js/modal_poll.js'%}"></script>
  11 +{% endblock %}
  12 +
  13 +{% block breadcrumbs %}
  14 + {{ block.super }}
  15 + {% breadcrumb 'Search' 'users:search' %}
  16 +
  17 +{% endblock %}
  18 +
  19 +
  20 +{% block content %}
  21 +<div class="jumbotron">
  22 +<h3>Search Result:</h3> {{qtd}} items found
  23 +
  24 +{% if link_list %}
  25 +<div class="panel-group">
  26 + <div class="panel panel-default">
  27 + <div class="panel-heading">
  28 + <h4 class="panel-title">
  29 + <a data-toggle="collapse" href="#Link" id="bot" style="color: black"> <i class="fa fa-caret-square-o-down" aria-hidden="true" id="down"></i>Links</a>
  30 + </h4>
  31 + </div>
  32 + <div id="Link" class="panel-collapse collapse">
  33 + <div class="panel-body">
  34 +
  35 +
  36 + {% for link in link_list %}
  37 + <li id = "link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li>
  38 + {% endfor %}
  39 + <div class = 'row' id ="divModalLink">
  40 +
  41 + </div>
  42 +
  43 + </div>
  44 +
  45 + </div>
  46 + </div>
  47 +</div>
  48 +{% endif%}
  49 +
  50 +{% if file_list %}
  51 +<div class="panel-group">
  52 + <div class="panel panel-default">
  53 + <div class="panel-heading">
  54 + <h4 class="panel-title">
  55 + <a data-toggle="collapse" href="#File" id="bot1" style="color: black"> <i class="fa fa-caret-square-o-down" aria-hidden="true" id="down1"></i>File</a>
  56 + </h4>
  57 + </div>
  58 + <div id="File" class="panel-collapse collapse">
  59 + <div class="panel-body">
  60 +
  61 + {% for file in file_list %}
  62 + <li id="file_{{ file.slug }}"><i class="material-icons">{{ file.file_type.icon }}</i> <a href="{% url 'course:file_material_view' file.slug %}" target="_blank">{{ file.name }}</a></li>
  63 + {% endfor%}
  64 +
  65 +
  66 + <div class="row" id="divModalFile">
  67 +
  68 + </div>
  69 + </div>
  70 +
  71 +
  72 + </div>
  73 + </div>
  74 +</div>
  75 +{% endif %}
  76 +
  77 +{% if forum_list %}
  78 +<div class="panel-group">
  79 + <div class="panel panel-default">
  80 + <div class="panel-heading">
  81 + <h4 class="panel-title">
  82 + <a data-toggle="collapse" href="#Forum" id="bot2" style="color: black"> <i class="fa fa-caret-square-o-down" aria-hidden="true" id="down2"></i>Forum</a>
  83 + </h4>
  84 + </div>
  85 + <div id="Forum" class="panel-collapse collapse">
  86 + <div class="panel-body">
  87 + {% for forum in forum_list %}
  88 + <li><i class="fa fa-commenting" aria-hidden="true"></i> <a id="forum_{{ forum.id }}" href="{% url 'course:forum:view' forum.slug %}"> {{ forum }}</a></li>
  89 + {% endfor %}
  90 +
  91 + </div>
  92 +
  93 + </div>
  94 + </div>
  95 +</div>
  96 +{% endif %}
  97 +
  98 +{% if exam_list %}
  99 +<div class="panel-group">
  100 + <div class="panel panel-default">
  101 + <div class="panel-heading">
  102 + <h4 class="panel-title">
  103 + <a data-toggle="collapse" href="#Exam" id="bot3" style="color: black"> <i class="fa fa-caret-square-o-down" aria-hidden="true" id="down3"></i>Exam</a>
  104 + </h4>
  105 + </div>
  106 + <div id="Exam" class="panel-collapse collapse">
  107 + <div class="panel-body">
  108 + {% for exam in exam_list %}
  109 + {{exam.name}}
  110 + {% endfor %}
  111 +
  112 + </div>
  113 +
  114 + </div>
  115 + </div>
  116 +</div>
  117 +{% endif %}
  118 +
  119 +{% if poll_list %}
  120 +<div class="panel-group">
  121 + <div class="panel panel-default">
  122 + <div class="panel-heading">
  123 + <h4 class="panel-title">
  124 + <a data-toggle="collapse" href="#Poll" id="bot4" style="color: black"> <i class="fa fa-caret-square-o-down" aria-hidden="true" id="down4"></i>Poll</a>
  125 + </h4>
  126 + </div>
  127 + <div id="Poll" class="panel-collapse collapse">
  128 + <div class="panel-body">
  129 +
  130 + {% for poll in poll_list %}
  131 + <li id="poll_{{poll.slug}}"><i class="material-icons">{% trans 'poll' %}</i> <a href="javascript:modal.get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a></li>
  132 + {% endfor %}
  133 +
  134 + <div class="row" id="modal_poll">
  135 +
  136 + </div>
  137 + </div>
  138 + </div>
  139 + </div>
  140 +</div>
  141 +{% endif %}
  142 +</div>
  143 +
  144 +
  145 +<script type="text/javascript" src="{% static 'js/amadeus.js' %}"> </script>
  146 +<script type="text/javascript" src="{% static 'js/topic_editation_presentation_search.js' %}"></script>
  147 +{% endblock %}
@@ -2,12 +2,14 @@ from django.conf.urls import url @@ -2,12 +2,14 @@ from django.conf.urls import url
2 2
3 from . import views 3 from . import views
4 4
  5 +
5 urlpatterns = [ 6 urlpatterns = [
6 url(r'^$', views.UsersListView.as_view(), name='manage'), 7 url(r'^$', views.UsersListView.as_view(), name='manage'),
7 url(r'^create/$', views.Create.as_view(), name='create'), 8 url(r'^create/$', views.Create.as_view(), name='create'),
8 url(r'^edit/(?P<username>[\w_-]+)/$', views.Update.as_view(), name='update'), 9 url(r'^edit/(?P<username>[\w_-]+)/$', views.Update.as_view(), name='update'),
9 url(r'^view/(?P<username>[\w_-]+)/$', views.View.as_view(), name='view'), 10 url(r'^view/(?P<username>[\w_-]+)/$', views.View.as_view(), name='view'),
10 - url(r'^delete/(?P<username>[\w_-]+)/$', views.delete, name='delete'), 11 + url(r'^delete/(?P<username>[\w_-]+)/$', views.delete_user, name='delete'),
  12 + url(r'^remove/(?P<username>[\w_-]+)/$', views.remove_account, name='remove'),
11 url(r'^profile/$', views.Profile.as_view(), name='profile'), 13 url(r'^profile/$', views.Profile.as_view(), name='profile'),
12 url(r'^search/$', views.SearchView.as_view(), name='search'), 14 url(r'^search/$', views.SearchView.as_view(), name='search'),
13 # 15 #
@@ -15,5 +17,5 @@ urlpatterns = [ @@ -15,5 +17,5 @@ urlpatterns = [
15 url(r'^profile/change_password/$', views.Change_password.as_view(), name='change_password'), 17 url(r'^profile/change_password/$', views.Change_password.as_view(), name='change_password'),
16 url(r'^profile/remove_account/$', views.Remove_account.as_view(), name='remove_account'), 18 url(r'^profile/remove_account/$', views.Remove_account.as_view(), name='remove_account'),
17 url(r'^profile/delete/$', views.DeleteUser.as_view(), name='delete_profile'), 19 url(r'^profile/delete/$', views.DeleteUser.as_view(), name='delete_profile'),
18 - 20 +
19 ] 21 ]
users/views.py
@@ -20,6 +20,10 @@ from files.models import * @@ -20,6 +20,10 @@ from files.models import *
20 from exam.models import * 20 from exam.models import *
21 from courses.models import * 21 from courses.models import *
22 22
  23 +#API IMPORTS
  24 +from rest_framework import viewsets
  25 +from .serializers import UserSerializer
  26 +from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly
23 27
24 # ================ ADMIN ======================= 28 # ================ ADMIN =======================
25 class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): 29 class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
@@ -106,12 +110,17 @@ class View(LoginRequiredMixin, generic.DetailView): @@ -106,12 +110,17 @@ class View(LoginRequiredMixin, generic.DetailView):
106 slug_field = 'username' 110 slug_field = 'username'
107 slug_url_kwarg = 'username' 111 slug_url_kwarg = 'username'
108 112
109 -def delete(request,username): 113 +def delete_user(request,username):
110 user = get_object_or_404(User,username = username) 114 user = get_object_or_404(User,username = username)
111 user.delete() 115 user.delete()
112 messages.success(request,_("User deleted Successfully!")) 116 messages.success(request,_("User deleted Successfully!"))
113 return redirect('users:manage') 117 return redirect('users:manage')
114 118
  119 +def remove_account(request,username):
  120 + user = get_object_or_404(User,username = username)
  121 + user.delete()
  122 + messages.success(request,_("User deleted Successfully!"))
  123 + return redirect('core:logout')
115 124
116 class Change_password(generic.TemplateView): 125 class Change_password(generic.TemplateView):
117 template_name = 'users/change_password.html' 126 template_name = 'users/change_password.html'
@@ -226,3 +235,12 @@ class SearchView(LoginRequiredMixin, generic.ListView): @@ -226,3 +235,12 @@ class SearchView(LoginRequiredMixin, generic.ListView):
226 context['qtd'] = qtd 235 context['qtd'] = qtd
227 236
228 return context 237 return context
  238 +
  239 +
  240 +# API VIEWS
  241 +
  242 +class UserViewSet(viewsets.ModelViewSet):
  243 + queryset = User.objects.all()
  244 + serializer_class = UserSerializer
  245 + permissions_classes = (IsAuthenticatedOrReadOnly,)
  246 +