Commit 524efcb7016aa3dc0945a96cdcde76bd6d2c1ab0
Exists in
master
and in
5 other branches
dev merge
Showing
15 changed files
with
229 additions
and
80 deletions
Show diff stats
courses/templates/subject/form_view_teacher.html
@@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
4 | <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> | 4 | <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> |
5 | <script src="{% static 'js/file.js' %}"></script> | 5 | <script src="{% static 'js/file.js' %}"></script> |
6 | <script type="text/javascript" src="{% static 'js/material.js' %}"></script> | 6 | <script type="text/javascript" src="{% static 'js/material.js' %}"></script> |
7 | - <script type = "text/javascript" src="{% static 'links.js' %}"></script> | 7 | + <script type = "text/javascript" src="{% static 'js/links.js' %}"></script> |
8 | {% endblock %} | 8 | {% endblock %} |
9 | <div class="panel panel-default cards-detail"> | 9 | <div class="panel panel-default cards-detail"> |
10 | <div class="panel-heading topic"> | 10 | <div class="panel-heading topic"> |
@@ -39,7 +39,7 @@ | @@ -39,7 +39,7 @@ | ||
39 | </div><!--column--> | 39 | </div><!--column--> |
40 | </div><!--row--> | 40 | </div><!--row--> |
41 | </div> | 41 | </div> |
42 | - <div class="panel-collapse collapseTopic-{{topic.slug}} collapse in" role="tabpanel" aria-labelledby="heading_{{topic.id}}" aria-expanded="true" aria-hidden="false"> | 42 | + <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"> |
43 | <div class="panel-body"> | 43 | <div class="panel-body"> |
44 | <div class="presentation" id="presentation_{{topic.slug}}"> | 44 | <div class="presentation" id="presentation_{{topic.slug}}"> |
45 | <p> | 45 | <p> |
@@ -86,7 +86,7 @@ | @@ -86,7 +86,7 @@ | ||
86 | </div> | 86 | </div> |
87 | </div> | 87 | </div> |
88 | </div><!--EndPresentation--> | 88 | </div><!--EndPresentation--> |
89 | - <div class="editation" id="editation_{{topic.slug}}"> | 89 | + <div class="editation topic_{{ topic.id }}" id="editation_{{topic.slug}}"> |
90 | <div class="form-group"> | 90 | <div class="form-group"> |
91 | <label class="control-label" for="focusedInput2">{% trans 'Name Topic' %}</label> | 91 | <label class="control-label" for="focusedInput2">{% trans 'Name Topic' %}</label> |
92 | <input type="text" class="form-control" value="{{topic}}"> | 92 | <input type="text" class="form-control" value="{{topic}}"> |
@@ -140,11 +140,7 @@ | @@ -140,11 +140,7 @@ | ||
140 | </div> | 140 | </div> |
141 | </div> | 141 | </div> |
142 | </div><!--EndEditation--> | 142 | </div><!--EndEditation--> |
143 | - {% professor_subject topic.subject user as professor_links %} | ||
144 | - {% if professor_links%} | ||
145 | - {% include "links/create_link.html" %} | ||
146 | - {% include "links/delete_link.html" %} | ||
147 | - {% endif %} | 143 | + |
148 | </div> | 144 | </div> |
149 | </div> | 145 | </div> |
150 | </div> | 146 | </div> |
@@ -287,10 +283,7 @@ | @@ -287,10 +283,7 @@ | ||
287 | <!--EndModal--> | 283 | <!--EndModal--> |
288 | 284 | ||
289 | <!-- MODAL LINK EDIT--> | 285 | <!-- MODAL LINK EDIT--> |
290 | -{% professor_subject topic.subject user as links_update %} | ||
291 | -{% if links_update%} | ||
292 | - {% include "links/update_link.html" %} | ||
293 | -{% endif %} | 286 | + |
294 | 287 | ||
295 | <!-- EndModal --> | 288 | <!-- EndModal --> |
296 | 289 | ||
@@ -313,5 +306,3 @@ | @@ -313,5 +306,3 @@ | ||
313 | </div> | 306 | </div> |
314 | </div> | 307 | </div> |
315 | </div> | 308 | </div> |
316 | - | ||
317 | - |
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><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}}</a></li> | 4 | + <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> |
5 | {% endfor %} | 5 | {% endfor %} |
6 | </div> | 6 | </div> |
7 | <div class = 'row' id ="divModalLink"> | 7 | <div class = 'row' id ="divModalLink"> |
courses/templates/topic/link_topic_list_edit.html
@@ -2,8 +2,12 @@ | @@ -2,8 +2,12 @@ | ||
2 | <div id="list-topic{{ topic.id }}-links-edit"> | 2 | <div id="list-topic{{ topic.id }}-links-edit"> |
3 | {% for link in links%} | 3 | {% for link in links%} |
4 | 4 | ||
5 | - <li class="icon_edit_remove"> <a href="#" data-toggle="modal" data-target="#linksModalEdit"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="#" data-toggle="modal" data-target="#removeLink"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li> | ||
6 | - <li><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}}</a></li> | 5 | + <li class="icon_edit_remove" id = "link_edit_icon_{{ link.slug }}"> <a href="javascript:get_modal_link('{% url 'course:links:update_link' link.slug %}', '#linksModalEdit', '#divModalLinkUpdate')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:get_modal_link('{% 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_edit_{{ 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> | ||
7 | 7 | ||
8 | {% endfor %} | 8 | {% endfor %} |
9 | </div> | 9 | </div> |
10 | + | ||
11 | +<div class="row" id="divModalLinkUpdate"> | ||
12 | + | ||
13 | +</div> |
forum/static/js/forum.js
@@ -47,7 +47,7 @@ function createForum(url, topic) { | @@ -47,7 +47,7 @@ function createForum(url, topic) { | ||
47 | $(".forum_form").html(data); | 47 | $(".forum_form").html(data); |
48 | $("#id_topic").val(topic); | 48 | $("#id_topic").val(topic); |
49 | 49 | ||
50 | - setForumCreateFormSubmit(); | 50 | + setForumCreateFormSubmit(topic); |
51 | } | 51 | } |
52 | }); | 52 | }); |
53 | 53 | ||
@@ -59,7 +59,7 @@ function createForum(url, topic) { | @@ -59,7 +59,7 @@ function createForum(url, topic) { | ||
59 | * Function to set the forum's create form submit function | 59 | * Function to set the forum's create form submit function |
60 | * | 60 | * |
61 | */ | 61 | */ |
62 | -function setForumCreateFormSubmit() { | 62 | +function setForumCreateFormSubmit(topic) { |
63 | $('.date-picker').datepicker({ | 63 | $('.date-picker').datepicker({ |
64 | language: locale, | 64 | language: locale, |
65 | }); | 65 | }); |
@@ -72,13 +72,13 @@ function setForumCreateFormSubmit() { | @@ -72,13 +72,13 @@ function setForumCreateFormSubmit() { | ||
72 | data: frm.serialize(), | 72 | data: frm.serialize(), |
73 | dataType: "json", | 73 | dataType: "json", |
74 | success: function (data) { | 74 | success: function (data) { |
75 | - $('.foruns_list').append("<li><i class='fa fa-commenting' aria-hidden='true'></i> <a id='forum_"+data.forum_id+"' href='"+data.url+"'> "+data.name+"</a></li>"); | 75 | + $(".topic_" + topic).find('.foruns_list').append("<li><i class='fa fa-commenting' aria-hidden='true'></i> <a id='forum_"+data.forum_id+"' href='"+data.url+"'> "+data.name+"</a></li>"); |
76 | 76 | ||
77 | $("#createForum").modal('hide'); | 77 | $("#createForum").modal('hide'); |
78 | }, | 78 | }, |
79 | error: function(data) { | 79 | error: function(data) { |
80 | $(".forum_form").html(data.responseText); | 80 | $(".forum_form").html(data.responseText); |
81 | - setForumCreateFormSubmit(); | 81 | + setForumCreateFormSubmit(topic); |
82 | } | 82 | } |
83 | }); | 83 | }); |
84 | return false; | 84 | return false; |
links/admin.py
@@ -3,8 +3,8 @@ from django.contrib import admin | @@ -3,8 +3,8 @@ from django.contrib import admin | ||
3 | from .models import Link | 3 | from .models import Link |
4 | 4 | ||
5 | class LinkAdmin(admin.ModelAdmin): | 5 | class LinkAdmin(admin.ModelAdmin): |
6 | - list_display = ['name', 'link_url','link_description'] | ||
7 | - search_fields = ['name', 'link_url','link_description'] | 6 | + list_display = ['name', 'slug','link_url','link_description'] |
7 | + search_fields = ['name','slug' ,'link_url','link_description'] | ||
8 | 8 | ||
9 | 9 | ||
10 | admin.site.register(Link, LinkAdmin) | 10 | admin.site.register(Link, LinkAdmin) |
links/forms.py
@@ -21,6 +21,15 @@ class CreateLinkForm(forms.ModelForm): | @@ -21,6 +21,15 @@ class CreateLinkForm(forms.ModelForm): | ||
21 | fields = ['name','link_url','link_description'] | 21 | fields = ['name','link_url','link_description'] |
22 | 22 | ||
23 | class UpdateLinkForm(forms.ModelForm): | 23 | class UpdateLinkForm(forms.ModelForm): |
24 | + def clean_link_url(self): | ||
25 | + link_url = self.cleaned_data['link_url'] | ||
26 | + try: | ||
27 | + resposta = requests.head(link_url) | ||
28 | + if resposta.status_code >= 400: | ||
29 | + raise forms.ValidationError(_('Invalid url!')) | ||
30 | + except requests.ConnectionError: | ||
31 | + raise forms.ValidationError(_('Invalid url!')) | ||
32 | + return link_url | ||
24 | class Meta: | 33 | class Meta: |
25 | model = Link | 34 | model = Link |
26 | fields = ['name','link_url','link_description'] | 35 | fields = ['name','link_url','link_description'] |
links/templates/links/create_link.html
@@ -13,6 +13,7 @@ | @@ -13,6 +13,7 @@ | ||
13 | <form method="post" action="" id="form-link" enctype="multipart/form-data"> | 13 | <form method="post" action="" id="form-link" enctype="multipart/form-data"> |
14 | {% csrf_token %} | 14 | {% csrf_token %} |
15 | {% for field in form %} | 15 | {% for field in form %} |
16 | + <div class ="form-group"> | ||
16 | {% if field.field.required %} | 17 | {% if field.field.required %} |
17 | <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | 18 | <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> |
18 | {% endif %} | 19 | {% endif %} |
@@ -29,9 +30,10 @@ | @@ -29,9 +30,10 @@ | ||
29 | </ul> | 30 | </ul> |
30 | </div> | 31 | </div> |
31 | {% endif %} | 32 | {% endif %} |
33 | + </div> | ||
32 | {% endfor %} | 34 | {% endfor %} |
33 | <div class="form-group"> | 35 | <div class="form-group"> |
34 | - <a href="javascript:void(0)" class="btn btn-raised btn-default" data-dismiss="modal">{% trans 'Cancel' %}</a> | 36 | + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Cancel" %}</button> |
35 | <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button> | 37 | <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button> |
36 | </div> | 38 | </div> |
37 | <!-- .end Card --> | 39 | <!-- .end Card --> |
@@ -41,7 +43,7 @@ | @@ -41,7 +43,7 @@ | ||
41 | </div> | 43 | </div> |
42 | <!-- EndModal --> | 44 | <!-- EndModal --> |
43 | {% block script_link %} | 45 | {% block script_link %} |
44 | - {# // <script src="{% static '/links.js' %}"></script> #} | 46 | + {# // <script src="{% static 'js/links.js' %}"></script> #} |
45 | <script type="text/javascript"> | 47 | <script type="text/javascript"> |
46 | $("#form-link").submit(function(event) { | 48 | $("#form-link").submit(function(event) { |
47 | var data = new FormData($('#form-link').get(0)); | 49 | var data = new FormData($('#form-link').get(0)); |
links/templates/links/delete_link.html
1 | -{% load widget_tweaks i18n %} | ||
2 | -<!-- MODAL REMOVE LINK --> | ||
3 | -<div class="modal" id="removeLink"> | ||
4 | - <div class="modal-dialog"> | ||
5 | - <div class="modal-content"> | ||
6 | - <div class="modal-header"> | ||
7 | - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button> | ||
8 | - <h4 class="modal-title"></h4> | ||
9 | - </div> | ||
10 | - <div class="modal-body"> | ||
11 | - <p>{% trans 'Do you really want to delete this link?' %}</p> | ||
12 | - </div> | ||
13 | - <div class="modal-footer"> | ||
14 | - <!-- --> | ||
15 | - <button type="button" class="btn btn-primary btn-default" data-dismiss="modal">{% trans 'Cancel' %}</button> | ||
16 | - <a href="http://www.google.com" target="_self"><button type="button" class="btn btn-primary" data-dismiss="modal" aria-hidden="true">{% trans 'Confirm' %}</button></a> | 1 | +{% load static widget_tweaks i18n %} |
17 | 2 | ||
18 | - </div> | 3 | +<!-- MODAL DELETE LINK --> |
4 | +<link rel="stylesheet" type="text/css" href="{% static 'css/link.css' %}"> | ||
5 | + | ||
6 | +<div class="erro-update"> | ||
7 | + <div class="modal fade" id="linkDeleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteLinkLabel" style="z-index: 10"> | ||
8 | + <div class="modal-dialog" role="document"> | ||
9 | + <div class="modal-content"> | ||
10 | + <div class="modal-header"> | ||
11 | + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||
12 | + <h4 class="modal-title" id="deleteLinkLabel">{% trans 'Delete Link' %}</h4> | ||
13 | + </div> | ||
14 | + <div class="modal-body"> | ||
15 | + <!-- Card --> | ||
16 | + <form class="form-horizontal" method="post" id="form-delete-link" enctype="multipart/form-data"> | ||
17 | + {% csrf_token %} | ||
18 | + <fieldset> | ||
19 | + <div class="col-md-12"> | ||
20 | + {% trans "Are you sure to delete the link " %} <strong>"{{ link.name }}"</strong> </a> of {{ link.topic.name }}? | ||
21 | + </div> | ||
22 | + <div class="form-group"> | ||
23 | + <div class="col-md-12"> | ||
24 | + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | ||
25 | + <button class="btn btn-raised btn-primary" type="submit">{% trans 'Delete' %}</button> | ||
26 | + </div> | ||
27 | + </div> | ||
28 | + </fieldset> | ||
29 | + </form> | ||
30 | + <!-- .end Card --> | ||
31 | + </div> | ||
32 | + </div> | ||
33 | + </div> | ||
19 | </div> | 34 | </div> |
20 | - </div> | ||
21 | </div> | 35 | </div> |
22 | -<!-- END --> | 36 | + |
37 | +{% block script_link %} | ||
38 | + | ||
39 | + {# // <script src="{% static 'js/link.js' %}"></script> #} | ||
40 | + <script type="text/javascript"> | ||
41 | + $("#form-delete-link").submit(function(event) { | ||
42 | + var data = new FormData($('#form-delete-link').get(0)); | ||
43 | + $.ajax({ | ||
44 | + url: "{% url 'course:links:delete_link' link.slug %}", | ||
45 | + type: $("#form-delete-link").attr('method'), | ||
46 | + data: data, | ||
47 | + cache: false, | ||
48 | + processData: false, | ||
49 | + contentType: false, | ||
50 | + success: function(data) { | ||
51 | + $('#linkDeleteModal').modal('hide'); | ||
52 | + $('#link_{{ link.slug }}').remove(); | ||
53 | + $('#link_edit_icon_{{ link.slug }}').remove(); | ||
54 | + $('#link_edit_{{ link.slug }}').remove(); | ||
55 | + alertify.alert('Link successfully deleted!') | ||
56 | + }, | ||
57 | + error: function(data){ | ||
58 | + // $('.erro-update').html(data.responseText); | ||
59 | + $('.modal-backdrop').remove(); | ||
60 | + $('#linkDeteleModal').modal(); | ||
61 | + alertify.alert('Error when trying to delete.'); | ||
62 | + } | ||
63 | + }); | ||
64 | + event.preventDefault(); | ||
65 | + }); | ||
66 | + </script> | ||
67 | +{% endblock script_link %} | ||
68 | +<!-- EndModal --> |
links/templates/links/render_link.html
1 | -<li><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}}</a></li> | 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> |
links/templates/links/update_link.html
@@ -5,29 +5,73 @@ | @@ -5,29 +5,73 @@ | ||
5 | <div class="modal-content"> | 5 | <div class="modal-content"> |
6 | <div class="modal-header"> | 6 | <div class="modal-header"> |
7 | <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | 7 | <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
8 | - <h4 class="modal-title" id="myModalLabel">{% trans 'Links' %}</h4> | 8 | + <h4 class="modal-title" id="myModalLabel">{% trans 'Edit Link' %}</h4> |
9 | </div> | 9 | </div> |
10 | <div class="modal-body"> | 10 | <div class="modal-body"> |
11 | <!-- Card --> | 11 | <!-- Card --> |
12 | + <form class="form-horizontal" method="post" id="form-update-link" enctype="multipart/form-data"> | ||
13 | + {% csrf_token %} | ||
14 | + {% for field in form %} | ||
15 | + <div class="form-group is-empty"> | ||
16 | + <div class="col-md-12"> | ||
17 | + {% if field.field.required %} | ||
18 | + <label for="{{ field.auto_id }}" class="control-label">{{ field.label }}<span>*</span></label> | ||
19 | + {% else %} | ||
20 | + <label for="{{ field.auto_id }}" class=" control-label">{{ field.label }}</label> | ||
21 | + {% endif %} | ||
22 | + {% render_field field class='form-control input-sm' %} | ||
23 | + </div> | ||
24 | + </div> | ||
25 | + {% if field.errors %} | ||
26 | + <div class="alert alert-danger alert-dismissible clearfix" role="alert"> | ||
27 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
28 | + <span aria-hidden="true">×</span> | ||
29 | + </button> | ||
30 | + <ul> | ||
31 | + {% for error in field.errors %} | ||
32 | + <li>{{ error }}</li> | ||
33 | + {% endfor %} | ||
34 | + </ul> | ||
35 | + </div> | ||
36 | + {% endif %} | ||
37 | + {% endfor %} | ||
12 | <div class="form-group"> | 38 | <div class="form-group"> |
13 | - <label class="control-label" for="inputDefault">{% trans 'Name' %}</label> | ||
14 | - <input value="Python" type="text" class="form-control" id="inputDefault"> | 39 | + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Cancel" %}</button> |
40 | + <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button> | ||
15 | </div> | 41 | </div> |
16 | - <div class="form-group"> | ||
17 | - <label class="control-label" for="inputDefault">{% trans 'URL' %}</label> | ||
18 | - <input value="https://www.python.org/" type="text" class="form-control" id="inputDefault"> | ||
19 | - </div> | ||
20 | - <div class="form-group is-empty"> | ||
21 | - <label class="control-label" for="inputDefault">{% trans 'Description' %}</label> | ||
22 | - <textarea class="form-control" rows="3"></textarea> | ||
23 | - </div> | ||
24 | - <div class="form-group"> | ||
25 | - <a href="javascript:void(0)" class="btn btn-raised btn-default" data-dismiss="modal">{% trans 'Cancel' %}</a> | ||
26 | - <a href="javascript:void(0)" class="btn btn-raised btn-primary">{% trans 'Submit' %}</a> | ||
27 | - </div> | ||
28 | <!-- .end Card --> | 42 | <!-- .end Card --> |
29 | </div> | 43 | </div> |
30 | </div> | 44 | </div> |
31 | </div> | 45 | </div> |
32 | </div> | 46 | </div> |
33 | <!-- EndModal --> | 47 | <!-- EndModal --> |
48 | +{% block script_link %} | ||
49 | + | ||
50 | + {# // <script src="{% static 'js/links.js' %}"></script> #} | ||
51 | + <script type="text/javascript"> | ||
52 | + $("#form-update-link").submit(function(event) { | ||
53 | + var data = new FormData($('#form-update-link').get(0)); | ||
54 | + $.ajax({ | ||
55 | + url: "{% url 'course:links:update_link' link.slug %}", | ||
56 | + type: $("#form-update-link").attr('method'), | ||
57 | + data: data, | ||
58 | + cache: false, | ||
59 | + processData: false, | ||
60 | + contentType: false, | ||
61 | + success: function(data) { | ||
62 | + $('#linksModalEdit').modal('hide'); | ||
63 | + $('#link_edit_{{ link.slug }}').replaceWith(data); | ||
64 | + $('#link_{{ link.slug }}').replaceWith(data); | ||
65 | + alertify.alert("Sucessfully Updated!") | ||
66 | + }, | ||
67 | + error: function(data){ | ||
68 | + $('.erro-update').html(data.responseText); | ||
69 | + $('.modal-backdrop').remove(); | ||
70 | + $('#linksModalEdit').modal(); | ||
71 | + alertify.alert('Invalid link, insert a valid one!'); | ||
72 | + } | ||
73 | + }); | ||
74 | + event.preventDefault(); | ||
75 | + }); | ||
76 | + </script> | ||
77 | +{% endblock script_link %} |
links/tests.py
@@ -154,7 +154,9 @@ class LinkTestCase(TestCase): | @@ -154,7 +154,9 @@ class LinkTestCase(TestCase): | ||
154 | url = reverse('course:links:update_link',kwargs={'slug': self.link.slug}) | 154 | url = reverse('course:links:update_link',kwargs={'slug': self.link.slug}) |
155 | print("slug",self.link.slug) | 155 | print("slug",self.link.slug) |
156 | data = { | 156 | data = { |
157 | + "name" : 'testinglink', | ||
157 | "link_description":'new description', | 158 | "link_description":'new description', |
159 | + "link_url" : 'teste.com', | ||
158 | } | 160 | } |
159 | self.assertEqual(Link.objects.all()[0].link_description, "testdescription") # old description | 161 | self.assertEqual(Link.objects.all()[0].link_description, "testdescription") # old description |
160 | response = self.client.post(url, data) | 162 | response = self.client.post(url, data) |
links/urls.py
@@ -3,8 +3,8 @@ from . import views | @@ -3,8 +3,8 @@ from . import views | ||
3 | 3 | ||
4 | urlpatterns = [ | 4 | urlpatterns = [ |
5 | url(r'^create_link/(?P<slug>[\w_-]+)/$', views.CreateLink.as_view(), name='create_link'), | 5 | url(r'^create_link/(?P<slug>[\w_-]+)/$', views.CreateLink.as_view(), name='create_link'), |
6 | - url(r'^deletelink/(?P<linkname>[\w_-]+)/$', views.deleteLink,name = 'delete_link'), | ||
7 | - url(r'^updatelink/(?P<slug>[\w_-]+)/$', views.UpdateLink.as_view(),name = 'update_link'), | ||
8 | - url(r'^render-link/(?P<id>[0-9]+)/$', views.render_link, name='render_link'), | 6 | + url(r'^delete_link/(?P<slug>[\w_-]+)/$', views.DeleteLink.as_view(),name = 'delete_link'), |
7 | + url(r'^update_link/(?P<slug>[\w_-]+)/$', views.UpdateLink.as_view(),name = 'update_link'), | ||
8 | + url(r'^render-link/(?P<slug>[\w_-]+)/$', views.render_link, name='render_link'), | ||
9 | url(r'^view_link/(?P<slug>[\w_-]+)/$',views.ViewLink.as_view(),name = 'view_link') | 9 | url(r'^view_link/(?P<slug>[\w_-]+)/$',views.ViewLink.as_view(),name = 'view_link') |
10 | ] | 10 | ] |
links/views.py
@@ -9,7 +9,7 @@ from rolepermissions.mixins import HasRoleMixin | @@ -9,7 +9,7 @@ from rolepermissions.mixins import HasRoleMixin | ||
9 | from core.mixins import NotificationMixin | 9 | 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 | - | 12 | +from rolepermissions.verifications import has_role |
13 | 13 | ||
14 | from .image_crawler import * | 14 | from .image_crawler import * |
15 | from courses.models import Topic | 15 | from courses.models import Topic |
@@ -62,20 +62,37 @@ class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.Cr | @@ -62,20 +62,37 @@ class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.Cr | ||
62 | context["topic"] = topic | 62 | context["topic"] = topic |
63 | return context | 63 | return context |
64 | def get_success_url(self): | 64 | def get_success_url(self): |
65 | - self.success_url = redirect('course:links:render_link', id = self.object.id) | 65 | + self.success_url = redirect('course:links:render_link', slug = self.object.slug) |
66 | return self.success_url | 66 | return self.success_url |
67 | -def deleteLink(request,linkname): | ||
68 | - link = get_object_or_404(Link,name = linkname) | ||
69 | - link.delete() | ||
70 | - template_name = 'links/delete_link.html' | ||
71 | - messages.success(request,_("Link deleted Successfully!")) | ||
72 | 67 | ||
73 | - return redirect('course:manage') | 68 | +class DeleteLink(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): |
69 | + allowed_roles = ['professor', 'system_admin'] | ||
70 | + login_url = reverse_lazy("core:home") | ||
71 | + redirect_field_name = 'next' | ||
72 | + model = Link | ||
73 | + template_name = 'links/delete_link.html' | ||
74 | + | ||
75 | + def dispatch(self, *args, **kwargs): | ||
76 | + link = get_object_or_404(Link, slug = self.kwargs.get('slug')) | ||
77 | + if(not (link.topic.owner == self.request.user) and not(has_role(self.request.user, 'system_admin')) ): | ||
78 | + return self.handle_no_permission() | ||
79 | + return super(DeleteLink, self).dispatch(*args, **kwargs) | ||
80 | + | ||
81 | + def get_context_data(self, **kwargs): | ||
82 | + context = super(DeleteLink, self).get_context_data(**kwargs) | ||
83 | + context['course'] = self.object.topic.subject.course | ||
84 | + context['subject'] = self.object.topic.subject | ||
85 | + context['link'] = self.object | ||
86 | + context["topic"] = self.object.topic | ||
87 | + return context | ||
74 | 88 | ||
75 | -def render_link(request, id): | 89 | + def get_success_url(self): |
90 | + return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) | ||
91 | + | ||
92 | +def render_link(request, slug): | ||
76 | template_name = 'links/render_link.html' | 93 | template_name = 'links/render_link.html' |
77 | context = { | 94 | context = { |
78 | - 'link': get_object_or_404(Link, id = id) | 95 | + 'link': get_object_or_404(Link, slug = slug) |
79 | } | 96 | } |
80 | return render(request, template_name, context) | 97 | return render(request, template_name, context) |
81 | 98 | ||
@@ -85,18 +102,41 @@ class UpdateLink(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | @@ -85,18 +102,41 @@ class UpdateLink(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | ||
85 | template_name = 'links/update_link.html' | 102 | template_name = 'links/update_link.html' |
86 | form_class = UpdateLinkForm | 103 | form_class = UpdateLinkForm |
87 | success_url = reverse_lazy('course:links:render_link') | 104 | success_url = reverse_lazy('course:links:render_link') |
88 | - def form_valid(self, form): | ||
89 | - form.save() | ||
90 | - messages.success(self.request, _('Link updated successfully!')) | ||
91 | 105 | ||
92 | - return super(UpdateLink, self).form_valid(form) | 106 | + def form_invalid(self,form): |
107 | + context = super(UpdateLink, self).form_invalid(form) | ||
108 | + context.status_code = 400 | ||
93 | 109 | ||
110 | + return context | ||
111 | + def form_valid(self, form): | ||
112 | + formulario = form | ||
113 | + if formulario.has_changed(): | ||
114 | + if 'link_url' in formulario.changed_data: | ||
115 | + self.object = form.save() | ||
116 | + self.link = Link.objects.get(slug = self.object.slug) | ||
117 | + self.formato,self.baixado = get_images(self.link.link_url,self.link.slug) | ||
118 | + self.caminho = 'links/static/images/%s'%(self.link.slug)+'%s'%(self.formato) | ||
119 | + self.setImage() | ||
120 | + else: | ||
121 | + form.save() | ||
122 | + else: | ||
123 | + form.save() | ||
124 | + return super(UpdateLink, self).form_valid(form) | ||
125 | + def setImage(self): | ||
126 | + if self.baixado: | ||
127 | + with open(self.caminho,'rb') as f: | ||
128 | + data = f.read() | ||
129 | + nome = '%s'%(self.link.slug)+"%s"%(self.formato) | ||
130 | + self.object.image.save(nome,ContentFile(data)) | ||
131 | + else: | ||
132 | + with open('links/static/images/default.jpg','rb') as f: | ||
133 | + data = f.read() | ||
134 | + self.object.image.save('default.jpg',ContentFile(data)) | ||
94 | def get_object(self, queryset=None): | 135 | def get_object(self, queryset=None): |
95 | self.object = get_object_or_404(Link, slug = self.kwargs.get('slug')) | 136 | self.object = get_object_or_404(Link, slug = self.kwargs.get('slug')) |
96 | - print(self.object.link_description) | ||
97 | return self.object | 137 | return self.object |
98 | def get_success_url(self): | 138 | def get_success_url(self): |
99 | - self.success_url = redirect('course:links:render_link', id = self.object.id) | 139 | + self.success_url = reverse_lazy('course:links:render_link', args = (self.object.slug, )) |
100 | return self.success_url | 140 | return self.success_url |
101 | class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): | 141 | class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): |
102 | allowed_roles = ['professor', 'system_admin'] | 142 | allowed_roles = ['professor', 'system_admin'] |
@@ -109,7 +149,7 @@ class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): | @@ -109,7 +149,7 @@ class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): | ||
109 | context['link'] = link | 149 | context['link'] = link |
110 | return context | 150 | return context |
111 | def get_success_url(self): | 151 | def get_success_url(self): |
112 | - self.success_url = redirect('course:links:render_link', id = self.object.id) | 152 | + self.success_url = redirect('course:links:render_link', slug = self.object.slug) |
113 | return self.success_url | 153 | return self.success_url |
114 | def get_queryset(self): | 154 | def get_queryset(self): |
115 | self.queryset = Link.objects.filter(slug = self.kwargs.get('slug')) | 155 | self.queryset = Link.objects.filter(slug = self.kwargs.get('slug')) |