Commit a225b178bf42da5980e9edb477241d6702ee7c17

Authored by Jailson Dias
2 parents 14d5a373 e0d5e2f8

Merge branch 'dev' of https://github.com/amadeusproject/amadeuslms into dev

app/templates/home.html
... ... @@ -31,11 +31,11 @@
31 31 // Configure the url we're about to hit
32 32 setTimeout(function (){
33 33 $.ajax({
34   - url: baseUrl,
  34 + url: baseUrl,
35 35 data: {'page': pageNum},
36 36 success: function(data) {
37 37 $("#loading").hide();
38   -
  38 +
39 39 $("#timeline").append(data);
40 40 },
41 41 complete: function(data, textStatus){
... ... @@ -46,7 +46,7 @@
46 46 }, 1000)
47 47 };
48 48  
49   - $(document).ready(function(){
  49 + $(document).ready(function(){
50 50 $(window).bind('scroll', loadOnScroll);
51 51 });
52 52 </script>
... ... @@ -62,70 +62,48 @@
62 62 {% endblock %}
63 63  
64 64 {% block sidebar %}
65   - <div class="panel panel-primary">
  65 + <div class="panel panel-primary navigation">
66 66 <div class="panel-heading">
67   - <img src="{{ user.image_url }}" id="img" class="img-rounded">
68   - <p></p>
69   - <div class="row">
70   - <div class="col-xs-3 col-md-3">
71   - <i class="fa fa-facebook-official fa-2x" aria-hidden="true"></i>
72   - </div>
73   - <div class="col-xs-3 col-md-3">
74   - <i class="fa fa-twitter fa-2x" aria-hidden="true"></i>
75   - </div>
76   - <div class="col-xs-3 col-md-3">
77   - <i class="fa fa-linkedin-square fa-2x" aria-hidden="true"></i>
78   - </div>
79   - <div class="col-xs-3 col-md-3">
80   - <i class="fa fa-google-plus-official fa-2x" aria-hidden="true"></i>
81   - </div>
82   - </div>
83   - </div>
84   - <div class="panel-body">
85   - <ul class="nav nav-pills nav-stacked">
86   - <li> <a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>
87   - <li> <a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>
88   - <li> <a href="#">{% trans 'Pending Tasks' %}</a></li>
89   - {% if user|has_role:'student' and not user.is_staff %}
90   - <li> <a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>
91   - {% endif %}
92   - {% if user|has_role:'system_admin' %}
93   - <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>
94   - {% endif %}
95   - {% if user|has_role:'system_admin' or user|has_role:'professor' %}
96   - <li>
97   - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a>
98   -
99   - <div id="courses_list" class="collapse">
100   - <ul class="nav nav-pill nav-stacked accordion_list">
101   - {% for course in courses_list %}
102   - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>
103   - {% endfor %}
104   - </ul>
105   - </div>
106   - </li>
107   - {% endif %}
108   - </ul>
109   - </div>
110   - </div>
  67 + <h4>Menu</h4>
  68 + </div>
  69 + <div class="panel-body">
  70 + <ul class="nav nav-pills nav-stacked">
  71 + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>
  72 + <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>
  73 + {% if user|has_role:'student' or not user.is_staff %}
  74 + <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li>
  75 + {% endif %}
  76 + {% if user|has_role:'system_admin' %}
  77 + <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>
  78 + {% endif %}
  79 + {% if user|has_role:'system_admin' or user|has_role:'professor' %}
  80 + <li>
  81 + <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a>
  82 + <div id="courses_list" class="collapse">
  83 + <ul class="nav nav-pill nav-stacked accordion_list">
  84 + {% for course in courses_list %}
  85 + <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li>
  86 + {% endfor %}
  87 + </ul>
  88 + </div>
  89 + </li>
  90 + {% endif %}
  91 + </ul>
  92 + </div>
  93 + </div>
111 94 {% endblock %}
112 95  
113 96 {% block content %}
114 97 {% if user|has_role:'system_admin' %}
115   - <h3>{% trans 'Courses' %}</h3>
116   -
117   - <div id="timeline">
118   - {% include page_template %}
119   - </div>
120   -
  98 + <h3>{% trans 'Courses' %}</h3>
  99 + <div id="timeline">
  100 + {% include page_template %}
  101 + </div>
121 102 {% else %}
122   -
123   - <div id="timeline">
124   - {% include page_template %}
125   - </div>
126   -
  103 + <div id="timeline">
  104 + {% include page_template %}
  105 + </div>
127 106 {% endif %}
128   -
129 107 <div id="loading" class="alert alert-primary" role="alert" style="display: none">
130 108 <center>
131 109 <span class="fa fa-spin fa-circle-o-notch"></span>
... ...
app/templates/home_student.html
... ... @@ -18,7 +18,7 @@
18 18 {% block sidebar %}
19 19 <div class="panel panel-primary navigation">
20 20 <div class="panel-heading">
21   - <h5>{% trans 'Menu' %}</h5>
  21 + <h4>{% trans 'Menu' %}</h4>
22 22 </div>
23 23 <div class="panel-body">
24 24 <ul class="nav nav-pills nav-stacked">
... ...
core/static/css/base/amadeus.css
... ... @@ -276,7 +276,7 @@ a.alert_message:hover{color : grey}
276 276  
277 277 /*Logo register user*/
278 278 #logo{
279   - max-width: 30%;
  279 + max-width: 40%;
280 280 margin-top: 1em;
281 281 margin-bottom: 1em;
282 282 }
... ...
core/templates/base.html
... ... @@ -109,7 +109,7 @@
109 109 {% endblock %}
110 110 </div>
111 111  
112   -
  112 +
113 113 </div>
114 114 </div>
115 115 </div>
... ... @@ -117,7 +117,7 @@
117 117 <script src="{% static 'js/main.js' %}"></script>
118 118 <script type="text/javascript" src="{% static 'js/topic_editation_presentation.js' %}"></script>
119 119 {% block script_file %}
120   -
  120 +
121 121 {% endblock script_file %}
122 122 </body>
123 123  
... ...
core/templates/guest.html 0 → 100644
... ... @@ -0,0 +1,177 @@
  1 +{% extends 'base.html' %}
  2 +
  3 +{% block breadcrumbs %}
  4 + <div class="col-md-12">
  5 + <form id="searchform" action="{% url 'course:manage' %}" method="get" accept-charset="utf-8">
  6 + <div class="input-group">
  7 + <div class="form-group is-empty">
  8 + <input type="search" class="form-control" placeholder="Search Courses" name="q" id="searchbox"></div>
  9 + <span class="input-group-btn input-group-sm">
  10 + <button type="button" class="btn btn-fab btn-fab-mini">
  11 + <i class="material-icons">search</i>
  12 + </button>
  13 + </span>
  14 + </div>
  15 + </form>
  16 + </div>
  17 +
  18 + <div class="col-md-12">
  19 + <div class="btn-group btn-group-justified btn-group-raised">
  20 + <a href="?category=all" class="btn btn-raised btn-info">Todos</a>
  21 + {% for category_course in categorys_courses %}
  22 + <a href="?category={{category_course.name}}" class="btn btn-raised btn-primary">{{category_course.name}}</a>
  23 + {% endfor %}
  24 + </div>
  25 + </div>
  26 +
  27 +{% endblock %}
  28 +
  29 +
  30 +{% block content %}
  31 +
  32 + {% for course in courses %}
  33 + <div class="panel panel-info">
  34 + <div class="panel-heading">
  35 + <h3 class="panel-title">{{course.name}}</h3>
  36 + </div>
  37 +
  38 + <div class="panel-body">
  39 + <p><b>Course Name: </b>{{course.name}}</p>
  40 + <p><b>Begining: </b>{{course.init_date}}</p>
  41 + <p><b>End: </b>{{course.end_date}}</p>
  42 + <p><b>Professor: </b>{{course.professors.name}}</p>
  43 + <p>
  44 + <b>Description:</b>
  45 + <i>
  46 + {{course.content}}
  47 + </i>
  48 + </p>
  49 + </div>
  50 + </div>
  51 + {% endfor %}
  52 +{% endblock %}
  53 +
  54 +
  55 +
  56 +{% comment %}
  57 +
  58 +
  59 +
  60 +
  61 +</fieldset>
  62 + <div class="col-md-12">
  63 + {% if courses|length > 0 %}
  64 + {% if request.GET.category == 'all' or none or request.GET.category == '' %}
  65 + {% for course in list_courses %}
  66 + <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false">
  67 + <div class="group">
  68 + <div class="panel panel-info">
  69 + <div class="panel-heading" role="tab">
  70 + <div class="row">
  71 + <div class="col-xs-9 col-md-9 titleTopic">
  72 + <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed">
  73 + <h4 style="color:white">{{course.name}}</h4>
  74 + </a>
  75 + </div>
  76 + </div>
  77 + </div>
  78 + <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0">
  79 + <div class="panel-body">
  80 + <p><b>Course Name: </b>{{course.name}}</p>
  81 + <p><b>Duration (in semesters): </b>09</p>
  82 + <p><b>Coordinator: </b>{{course.professors}}</p>
  83 + <p>
  84 + <b>Description:</b>
  85 + <i>
  86 + {{course.description}}
  87 + </i>
  88 + </p>
  89 + <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">'View Course<div class="ripple-container"></div></a>
  90 + </div>
  91 + </div>
  92 + </div>
  93 + </div>
  94 + </div>
  95 + {% endfor %}
  96 + {% else %}
  97 + {% for course in courses_category %}
  98 + {% if course.category.name == request.GET.category %}
  99 + <!-- Put your content here! -->
  100 + <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false">
  101 + <div class="group">
  102 + <div class="panel panel-info">
  103 + <div class="panel-heading" role="tab">
  104 + <div class="row">
  105 + <div class="col-xs-9 col-md-9 titleTopic">
  106 + <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed">
  107 + <h4 style="color:white">{{course.name}}</h4>
  108 + </a>
  109 + </div>
  110 + </div>
  111 + </div>
  112 + <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0">
  113 + <div class="panel-body">
  114 + <p><b>Course Name: </b>{{course.name}}</p>
  115 + <p><b>Duration (in semesters): </b>09</p>
  116 + <p><b>Coordinator: </b>{{course.professors}}</p>
  117 + <p>
  118 + <b>Description:</b>
  119 + <i>
  120 + {{course.description}}
  121 + </i>
  122 + </p>
  123 + <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">View Course<div class="ripple-container"></div></a>
  124 + </div>
  125 + </div>
  126 + </div>
  127 + </div>
  128 + </div>
  129 + {% endif %}
  130 + {% endfor %}
  131 + {% endif %}
  132 + {% else %}
  133 + No courses found
  134 + {% endif %}
  135 + <div class="group">
  136 + <div class="modal" id="removeCourse">
  137 + <div class="modal-dialog">
  138 + <div class="modal-content">
  139 + <div class="modal-header">
  140 + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button>
  141 + <h4 class="modal-title"></h4>
  142 + </div>
  143 + <div class="modal-body">
  144 + <p>Delete your course?</p>
  145 + </div>
  146 + <div class="modal-footer">
  147 +
  148 + <a href="http://127.0.0.1:8080/html/screens/users/profile_user.html" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a>
  149 +
  150 + </div>
  151 + </div>
  152 + </div>
  153 + </div>
  154 + </div>
  155 + </div>
  156 + <div class="col-md-12">
  157 + <nav aria-label="Page navigation">
  158 + <ul class="pagination">
  159 + {% if page_obj.has_previous %}
  160 + <li>
  161 + <a href="?page={{ page_obj.previous_page_number }}"><span><<</span></a>
  162 + </li>
  163 + {% endif %}
  164 + {% for page_number in paginator.page_range %}
  165 + <li{% if page_obj.number == page_number %} class="active"{% endif %}>
  166 + <a href="?page={{ page_number }}">{{ page_number }}</a>
  167 + </li>
  168 + {% endfor %}
  169 + {% if page_obj.has_next %}
  170 + <li>
  171 + <a href="?page={{ page_obj.next_page_number }}"><span>>></span></a>
  172 + </li>
  173 + {% endif %}
  174 + </ul>
  175 + </nav>
  176 + </div>
  177 +{% endcomment %}
... ...
core/templates/index.html
... ... @@ -61,7 +61,7 @@
61 61 <a href="{% url 'core:password_reset' %}">{% trans "Forgot your password?" %}</a>
62 62 </div>
63 63 <div class="col-md-6 col-xs-6 col-sm-6 col-lg-6 text-center">
64   - <button type="button" class="btn btn-flat" formaction="#" style="position: initial;">{% trans 'Guest' %}</button>
  64 + <a class="btn btn-flat" href="{% url 'core:guest' %}" formaction="#" style="position: initial;">{% trans 'Guest' %}</a>
65 65 </div>
66 66 <div class="col-md-6 col-xs-6 col-sm-6 col-lg-6 text-center">
67 67 <button type="submite" class="btn btn-flat btn-success" form="form-login" style="position: initial;">{% trans 'Login' %}</button>
... ...
core/templates/register_user.html
... ... @@ -18,14 +18,16 @@
18 18 </div>
19 19 {% endfor %}
20 20 {% endif %}
21   - <div class="row logo-row">
22   - <div class="col-lg-offset-2 col-lg-9">
  21 + <div class="row">
  22 + <div class="col-lg-offset-2 col-lg-8 col-md-offset-2 col-md-8 col-xs-offset-2 col-xs-8 col-sm-offset-2 col-sm-8">
  23 + <div class="col-lg-8 col-md-8 col-xs-8 col-sm-8">
23 24 <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus" id="logo">
  25 + </div>
24 26 </div>
25 27 </div>
26 28  
27 29 <div class="row">
28   - <div class="">
  30 + <div class="col-lg-8 col-lg-offset-1 col-md-8 col-md-offset-1 col-sm-8 col-sm-offset-1 col-xs-8 col-xs-offset-1">
29 31 <div class="card">
30 32 <div class="card-content">
31 33 <div class="card-body">
... ...
core/urls.py
... ... @@ -11,6 +11,7 @@ urlpatterns = [
11 11 url(r'^logout/$', auth_views.logout, {'next_page': 'core:home'}, name='logout'),
12 12 url(r'^notification/([0-9]+)/$', views.processNotification, name='notification_read'),
13 13 url(r'^getNotifications/$', views.getNotifications, name='getNotifications'),
  14 + url(r'^guest/$', views.guest, name='guest'),
14 15  
15 16 #Reset Password
16 17  
... ...
core/views.py
... ... @@ -18,7 +18,7 @@ from .forms import RegisterUserForm
18 18 from .decorators import log_decorator, notification_decorator
19 19  
20 20 from users.models import User
21   -
  21 +from courses.models import Course, CourseCategory
22 22  
23 23 def index(request):
24 24 context = {
... ... @@ -113,3 +113,9 @@ def getNotifications(request):
113 113  
114 114 html = render_to_string("notifications.html", context)
115 115 return HttpResponse(html)
  116 +
  117 +def guest (request):
  118 + context = {
  119 + 'courses': Course.objects.filter(public=True)
  120 + }
  121 + return render(request, 'guest.html', context)
116 122 \ No newline at end of file
... ...
courses/migrations/0003_course_public.py 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-10-19 13:19
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations, models
  6 +
  7 +
  8 +class Migration(migrations.Migration):
  9 +
  10 + dependencies = [
  11 + ('courses', '0002_auto_20161018_1842'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AddField(
  16 + model_name='course',
  17 + name='public',
  18 + field=models.BooleanField(default=False, verbose_name='Public'),
  19 + preserve_default=False,
  20 + ),
  21 + ]
... ...
courses/models.py
... ... @@ -46,6 +46,7 @@ class Course(models.Model):
46 46 category = models.ForeignKey(CourseCategory, verbose_name = _('Category'), related_name='course_category')
47 47 professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses_professors')
48 48 students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student')
  49 + public = models.BooleanField(_('Public'))
49 50  
50 51 class Meta:
51 52 ordering = ('create_date','name')
... ...
courses/static/js/course.js
... ... @@ -0,0 +1,21 @@
  1 +/*
  2 +*
  3 +* Function to subscribe (works for courses and subjects)
  4 +*
  5 +*/
  6 +function subscribe(elem, url, confirm_message) {
  7 + alertify.confirm(confirm_message, function(){
  8 + $.ajax({
  9 + dataType: "json",
  10 + url: url,
  11 + success: function (data) {
  12 + if (data.status == "ok") {
  13 + elem.disabled(true);
  14 + alertify.success(data.message);
  15 + } else {
  16 + alertify.error(data.message);
  17 + }
  18 + }
  19 + });
  20 + });
  21 +}
0 22 \ No newline at end of file
... ...
courses/static/js/modal_category.js 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +
  2 +var Submite = {
  3 + remove: function(url,dados,id_li_link){
  4 + $('#category').modal('hide');
  5 + $.post(url,dados, function(data){
  6 + $(id_li_link).remove();
  7 + $("#modal_category").empty();
  8 + $("div.modal-backdrop.fade.in").remove();
  9 + alertify.success("Category removed successfully!");
  10 + }).fail(function(){
  11 + $("#modal_category").empty();
  12 + $("#modal_category").append(data);
  13 + $('#category').modal('show');
  14 + });
  15 + }
  16 +}
  17 +
  18 +var modal = {
  19 + get: function (url, id_modal, id_div_modal){
  20 + $.get(url, function(data){
  21 + if($(id_modal).length){
  22 + $(id_div_modal).empty();
  23 + $(id_div_modal).append(data);
  24 + } else {
  25 + $(id_div_modal).append(data);
  26 + }
  27 + $(id_modal).modal('show');
  28 + });
  29 + }
  30 +};
0 31 \ No newline at end of file
... ...
courses/templates/category/create.html
... ... @@ -74,7 +74,7 @@
74 74 {% endif %}
75 75 {% endfor %}
76 76 <div class="row text-center">
77   - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />
  77 + <button type="submit" class="btn btn-primary btn-raised">{% trans "Save" %}</button>
78 78 </div>
79 79 </form>
80 80 </div>
... ...
courses/templates/category/delete.html
1   -{% extends 'base.html' %}
2   -
3   -{% load static i18n %}
4 1 {% load static i18n permission_tags %}
5 2  
6   -{% block breadcrumbs %}
7   - <ol class="breadcrumb">
8   - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>
9   - <li class="active">{% trans 'Manage Categories' %}</li>
10   - </ol>
11   -{% endblock %}
  3 +<!-- Modal (remember to change the ids!!!) -->
  4 +<div class="modal fade" id="category" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  5 + <div class="modal-dialog" role="document">
  6 + <div class="modal-content">
  7 + <!-- Modal Header -->
  8 + <div class="modal-header">
12 9  
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>
  10 + <h4 class="modal-title" id="myModalLabel">{% trans "Delete Category" %}</h4>
  11 + </div>
  12 + <!-- Modal Body -->
  13 + <div class="modal-body">
  14 + <!-- Put ONLY your content here!!! -->
  15 + <form id="delete_form" action="" method="post">
  16 + {% csrf_token %}
  17 + <p>{% trans 'Are you sure you want to delete the subject' %} "{{category.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_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button>
  25 + <script>
  26 + $("#delete_form").submit(function(event) {
  27 + Submite.remove("{% url 'course:delete_cat' category.slug %}",$(this).serialize(),"#category_{{category.slug}}");
  28 + event.preventDefault();
  29 + });
  30 + </script>
  31 + </div>
24 32 </div>
25   -
26   -{% if user|has_role:'professor' or user|has_role:'system_admin' %}
27   -
28   - <div class="panel panel-primary navigation">
29   - <div class="panel-heading">
30   - <h3 class="panel-title">Actions</h3>
31   - </div>
32   - <div class="panel-body">
33   - <ul class="nav nav-pills nav-stacked">
34   - <li><a href="javascript:void(0)">Replicate Course</a></li>
35   - <li><a href="{% url 'course:create' %}">Create Course</a></li>
36   - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li>
37   - </ul>
38   - </div>
39   - </div>
40   - <div class="panel panel-primary navigation">
41   - <div class="panel-heading">
42   - <h3 class="panel-title">Category</h3>
43   - </div>
44   - <div class="panel-body">
45   - <ul class="nav nav-pills nav-stacked">
46   - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li>
47   - <li><a href="{% url 'course:manage_cat' %}">List Category</a></li>
48   - </ul>
49   - </div>
50   - </div>
51   -{% endif %}
52   -{% endblock %}
53   -
54   -{% block content %}
55   - <div class="card card-content">
56   - <div class="card-body">
57   - <form action="" method="post">{% csrf_token %}
58   - <h1>{% trans 'Are you sure you want to delete the category' %} "{{ object }}"?</h1>
59   - <input type="submit" class="btn btn-success btn-sm" value="{% trans 'Yes' %}" />
60   - <a href="{% url 'course:manage_cat' %}" class="btn btn-danger btn-sm">{% trans 'No' %}</a>
61   - </form>
62   - </div>
63   - </div>
64   -{% endblock %}
  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_category.js' %}"></script>
... ...
courses/templates/category/index.html
... ... @@ -82,7 +82,8 @@
82 82 <td class="text-center">
83 83 <a href="{% url 'course:view_cat' category.slug %}" class="btn btn-info btn-sm"><span class="glyphicon glyphicon-eye-open"></span></a>
84 84 <a href="{% url 'course:update_cat' category.slug %}" class="btn btn-primary btn-sm"><span class="glyphicon glyphicon-edit"></span></a>
85   - <a href="{% url 'course:delete_cat' category.slug %}" class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></a>
  85 + <a href="javascript:modal.get('{% url 'course:delete_cat' category.slug %}','#category','#modal_category');" class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></a>
  86 +
86 87 </td>
87 88 </tr>
88 89 {% endfor %}
... ... @@ -96,4 +97,6 @@
96 97 </tbody>
97 98 </table>
98 99 </div>
99   -{% endblock %}
  100 + <div class="row" id="modal_category">
  101 +<script src="{% static 'js/modal_category.js' %}"></script>
  102 +{% endblock %}
100 103 \ No newline at end of file
... ...
courses/templates/category/update.html
... ... @@ -87,7 +87,7 @@
87 87 {% endif %}
88 88 {% endfor %}
89 89 <div class="row text-center">
90   - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />
  90 + <button type="submit" class="btn btn-primary btn-raised">{% trans "Save" %}</button>
91 91 </div>
92 92 </form>
93 93 </div>
... ...
courses/templates/course/index.html
... ... @@ -11,18 +11,18 @@
11 11 {% endblock %}
12 12  
13 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 'core:home' %}">{% trans 'Home' %}</a></li>
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>
  14 +<div class="panel panel-primary navigation">
  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 'core:home' %}">{% trans 'Home' %}</a></li>
  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>
25 24 </div>
  25 +</div>
26 26  
27 27 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
28 28  
... ... @@ -98,13 +98,13 @@
98 98 <div class="panel panel-info">
99 99 <div class="panel-heading" role="tab">
100 100 <div class="row">
101   - <div class="col-xs-9 col-md-9 titleTopic">
  101 + <div class="col-xs-9 col-md-10 titleTopic">
102 102 <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed">
103 103 <h4 style="color:white">{{course.name}}</h4>
104 104 </a>
105 105 </div>
106 106 {% if user|has_role:'professor' or user|has_role:'system_admin' %}
107   - <div class="col-xs-4 col-md-3" id="divMoreActions">
  107 + <div class="col-xs-4 col-md-2" id="divMoreActions">
108 108 <div class="btn-group">
109 109 <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
110 110 <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>
... ...
courses/templates/subject/index.html
... ... @@ -36,12 +36,12 @@
36 36 <div class="panel panel-info">
37 37 <div class="panel-heading">
38 38 <div class="row">
39   - <div class="col-md-10 col-sm-9">
  39 + <div class="col-md-10 col-sm-10">
40 40 <h3>{{subject}}</h3>
41 41 </div>
42 42 {% professor_subject subject user as subject_professor%}
43 43 {% if subject_professor %}
44   - <div class="col-xs-4 col-md-3 divMoreActions">
  44 + <div class="col-xs-4 col-md-2 divMoreActions">
45 45 <div class="btn-group">
46 46 <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
47 47 <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i>
... ...
courses/urls.py
... ... @@ -8,6 +8,7 @@ urlpatterns = [
8 8 url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'),
9 9 url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'),
10 10 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'),
  11 + url(r'^subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_course, name='subscribe'),
11 12 url(r'^category/(?P<slug>[\w_-]+)/$', views.FilteredView.as_view(), name='filter'),
12 13 url(r'^categories/view/$', views.IndexCatView.as_view(), name='manage_cat'),
13 14 url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"),
... ... @@ -18,6 +19,7 @@ urlpatterns = [
18 19 url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'),
19 20 url(r'^subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'),
20 21 url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'),
  22 + url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'),
21 23 url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'),
22 24 url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
23 25 url(r'^topics/createlink/$', linkviews.CreateLink.as_view(),name = 'create_link'),
... ... @@ -31,7 +33,4 @@ urlpatterns = [
31 33 url(r'^files/', include('files.urls', namespace = 'file')),
32 34 url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'),
33 35 url(r'^links/',include('links.urls',namespace = 'links')),
34   -
35   -
36   -
37   -]
  36 +]
38 37 \ No newline at end of file
... ...
courses/views.py
... ... @@ -10,7 +10,7 @@ from django.utils.translation import ugettext_lazy as _
10 10 from rolepermissions.verifications import has_role
11 11 from django.db.models import Q
12 12 from rolepermissions.verifications import has_object_permission
13   -from django.http import HttpResponseRedirect
  13 +from django.http import HttpResponseRedirect, JsonResponse
14 14  
15 15 from .forms import CourseForm, UpdateCourseForm, CategoryCourseForm, SubjectForm,TopicForm,ActivityForm
16 16 from .models import Course, Subject, CourseCategory,Topic, SubjectCategory,Activity, CategorySubject
... ... @@ -35,10 +35,10 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView):
35 35 list_courses = None
36 36 categorys_courses = None
37 37 if has_role(self.request.user,'professor') or has_role(self.request.user,'system_admin'):
38   - list_courses = Course.objects.filter(professors__name = self.request.user.name).order_by('name')
  38 + list_courses = Course.objects.filter(Q(professors = True)|Q(professors__name = self.request.user.name)).order_by('name')
39 39 categorys_courses = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct()
40 40 else:
41   - list_courses = Course.objects.filter(students__name = self.request.user.name)
  41 + list_courses = Course.objects.filter(Q(students = True)|Q(students__name = self.request.user.name)).order_by('name')
42 42 categorys_courses = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct()
43 43  
44 44 courses_category = Course.objects.filter(category__name = self.request.GET.get('category'))
... ... @@ -227,6 +227,15 @@ class DeleteView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.De
227 227  
228 228 return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine)
229 229  
  230 +@login_required
  231 +def subscribe_course(request, slug):
  232 + course = get_object_or_404(Course, slug = slug)
  233 +
  234 + if course.students.add(request.user):
  235 + return JsonResponse({"status": "ok", "message": _("Successfully subscribed to the course!")})
  236 + else:
  237 + return JsonResponse({"status": "erro", "message": _("An error has occured. Could not subscribe to this course, try again later")})
  238 +
230 239 class FilteredView(LoginRequiredMixin, generic.ListView):
231 240  
232 241 login_url = reverse_lazy("core:home")
... ... @@ -296,6 +305,19 @@ class DeleteCatView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
296 305 model = CourseCategory
297 306 template_name = 'category/delete.html'
298 307  
  308 + def dispatch(self, *args, **kwargs):
  309 + category = get_object_or_404(CourseCategory, slug = self.kwargs.get('slug'))
  310 + if(not has_object_permission('delete_category', self.request.user, category)):
  311 + return self.handle_no_permission()
  312 + return super(DeleteCatView, self).dispatch(*args, **kwargs)
  313 +
  314 +
  315 + def get_context_data(self, **kwargs):
  316 + context = super(DeleteCatView, self).get_context_data(**kwargs)
  317 + context['course'] = self.object.course_category
  318 + context['category'] = self.object
  319 + return context
  320 +
299 321 def get_success_url(self):
300 322 messages.success(self.request, _('Category deleted successfully!'))
301 323 return reverse_lazy('course:manage_cat')
... ... @@ -526,6 +548,17 @@ class DeleteSubjectView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
526 548 def get_success_url(self):
527 549 return reverse_lazy('course:view', kwargs={'slug' : self.object.course.slug})
528 550  
  551 +@login_required
  552 +def subscribe_subject(request, slug):
  553 + subject = get_object_or_404(Subject, slug = slug)
  554 +
  555 + if request.user.courses_student.filter(slug = slug).exists():
  556 + if subject.students.add(request.user):
  557 + return JsonResponse({"status": "ok", "message": _("Successfully subscribed to the subject!")})
  558 + else:
  559 + return JsonResponse({"status": "erro", "message": _("An error has occured. Could not subscribe to this subject, try again later")})
  560 + else:
  561 + return JsonResponse({"status": "erro", "message": _("You're not subscribed in the course yet.")})
529 562  
530 563 class IndexSubjectCategoryView(LoginRequiredMixin, generic.ListView):
531 564 allowed_roles = ['professor', 'system_admin']
... ...