Commit 5927b6dd0f2d7de9d5fab3619623a9df96863f44

Authored by Jailson Dias
1 parent e0e9c3fb

Home course for teacher and student, issue #49

courses/migrations/0012_course_students.py 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-15 02:57
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.conf import settings
  6 +from django.db import migrations, models
  7 +
  8 +
  9 +class Migration(migrations.Migration):
  10 +
  11 + dependencies = [
  12 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  13 + ('courses', '0011_auto_20160914_2126'),
  14 + ]
  15 +
  16 + operations = [
  17 + migrations.AddField(
  18 + model_name='course',
  19 + name='students',
  20 + field=models.ManyToManyField(related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  21 + ),
  22 + ]
courses/models.py
@@ -31,6 +31,7 @@ class Course(models.Model): @@ -31,6 +31,7 @@ class Course(models.Model):
31 image = models.ImageField(verbose_name = _('Image'), blank = True, upload_to = 'courses/') 31 image = models.ImageField(verbose_name = _('Image'), blank = True, upload_to = 'courses/')
32 category = models.ForeignKey(Category, verbose_name = _('Category')) 32 category = models.ForeignKey(Category, verbose_name = _('Category'))
33 professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses') 33 professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses')
  34 + students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student')
34 35
35 class Meta: 36 class Meta:
36 ordering = ('create_date','name') 37 ordering = ('create_date','name')
courses/templates/course/view.html
1 -{% extends 'course/index.html' %} 1 +{% extends 'base.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 %}
5 5
  6 +{% block style %}
  7 + <link rel="stylesheet" href="{% static 'css/course/course.css' %}">
  8 +{% endblock style %}
  9 +
6 {% block breadcrumbs %} 10 {% block breadcrumbs %}
7 11
8 {{ block.super }} 12 {{ block.super }}
@@ -10,104 +14,81 @@ @@ -10,104 +14,81 @@
10 14
11 {% endblock %} 15 {% endblock %}
12 16
13 -  
14 {% block sidebar %} 17 {% block sidebar %}
15 -  
16 -{{block.super}}  
17 -<div class="row">  
18 - <div class="col-md-12">  
19 - <div class="panel panel-primary navigation">  
20 - <div class="panel-heading">  
21 - <h5>{% trans 'Subjects' %}</h5>  
22 - </div>  
23 - <div class="panel-body">  
24 - <ul class="nav nav-pills nav-stacked">  
25 - {% for subject in subjects %}  
26 - <li><a href="">{{subject.name}}</a></li>  
27 - {% endfor %}  
28 - </ul>  
29 - </div>  
30 - </div>  
31 - </div> 18 +<div class="panel panel-primary navigation">
  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="{% url 'app:index' %}">{% trans "Home" %}</a></li>
  25 + <li><a href="{% url 'users:profile' %}">{% trans "Profile" %}</a></li>
  26 + {# <li><a href="">{% trans "Courses" %}</a></li>#}
  27 + </ul>
  28 + </div>
  29 +</div>
  30 +{% if courses.count > 0 %}
  31 +<div class="panel panel-primary navigation">
  32 + <div class="panel-heading">
  33 + <h5>{% trans "Courses" %}</h5>
  34 + </div>
  35 + <div class="panel-body">
  36 + <ul class="nav nav-pills nav-stacked">
  37 + {% for course in courses %}
  38 + <li><a href="{% url 'course:view' course.slug %}">{{course}}</a></li>
  39 + {% endfor %}
  40 + </ul>
  41 + </div>
32 </div> 42 </div>
33 -<!--<div class="list-group">  
34 - <a href="{% url 'course:manage' %}" class="list-group-item">  
35 - {% trans 'Courses' %}  
36 - </a>  
37 - <a href="{% url 'course:view' course.slug %}" class="list-group-item active">  
38 - {% trans 'Course Info' %}  
39 - </a>  
40 - <a href="" class="list-group-item">  
41 - {% trans 'Manage Modules' %}  
42 - </a>  
43 - {% if user|has_role:'professor, system_admin' %}  
44 - <a href="{% url 'course:create' %}" class="list-group-item">  
45 - {% trans 'Create Course' %}  
46 - </a>  
47 - <a href="{% url 'course:update' course.slug %}" class="list-group-item">  
48 - {% trans 'Edit Course' %}  
49 - </a>  
50 - <a href="#" class="list-group-item">  
51 - {% trans 'Participants' %}  
52 - </a>  
53 - <a href="" class="list-group-item">  
54 - {% trans 'Course avaliations' %}  
55 - </a>  
56 - <a href="" class="list-group-item">  
57 - {% trans 'Duplicate Course' %}  
58 - </a>  
59 - <a href="{% url 'course:delete' course.slug %}" class="list-group-item">  
60 - {% trans 'Delete Course' %}  
61 - </a>  
62 - {% endif %}  
63 - </div> --> 43 +{% endif %}
64 {% endblock %} 44 {% endblock %}
65 45
66 {% block content %} 46 {% block content %}
  47 +<h3>{% trans "Subjects" %}</h3>
  48 +{% for subject in subjects %}
  49 + <div class="panel panel-info">
  50 + <div class="panel-heading">
  51 + <div class="row">
  52 +<div class="col-md-10">
67 53
68 -<div class="row">  
69 - <div class="col-sm-3">  
70 - <img src="{{ course.image.url }}" class="img-responsive" />  
71 - </div>  
72 - <div class="col-sm-9">  
73 - <h4>{{ course }}</h4>  
74 - <span class="label label-info">{{ course.category }}</span>  
75 - <span class="label label-warning">{{ course.max_students }} alunos no máximo</span>  
76 - <p>  
77 - <strong>{% trans 'Subscribes:' %} </strong> <em>de</em> <u>{{ course.init_register_date }}</u> <em>até</em> <u>{{ course.end_register_date }}</u>  
78 - </p>  
79 - <p>  
80 - <strong>{% trans 'Period:' %} </strong> <em>de</em> <u>{{ course.init_date }}</u> <em>até</em> <u>{{ course.end_date }}</u>  
81 - </p>  
82 - </div>  
83 - </div>  
84 - <div class="row">  
85 - <div class="col-sm-12">  
86 - <p>  
87 - <strong>{% trans 'Objectives:' %} </strong> {{ course.objectivies|linebreaks }}  
88 - </p>  
89 - <p>  
90 - <strong>{% trans 'Work Plan:' %} </strong> {{ course.content|linebreaks }}  
91 - </p>  
92 - </div>  
93 - </div>  
94 - <div class="row">  
95 - <div class="col-md-12">  
96 - <h3>Subjects</h3>  
97 - {% for subject in subjects %}  
98 - <div class="panel panel-info">  
99 - <div class="panel-heading">  
100 - <h3 class="panel-title">Subject 1</h3>  
101 - </div>  
102 - <div class="panel-body">  
103 - Dummy Info  
104 - </div>  
105 - </div>  
106 - {% endfor %}  
107 - </div>  
108 - </div> 54 + <h3 class="panel-title"><a href="{% url 'course:view_subject' subject.slug %}"></a>{{subject}}</h3>
109 55
  56 + </div>
  57 + <div class="col-md-2 text-right">
  58 + {% if user|has_role:'professor, system_admin' %}
  59 + <a href="{% url 'course:update_subject' subject.slug %}" style="padding: 3px; margin: 3px;" class="btn btn-sm btn-default">
  60 + <span class="glyphicon glyphicon-edit"></span>
  61 + </a>
  62 + <a href="{% url 'course:delete_subject' subject.slug %}" style="padding: 3px; margin: 3px;" class="btn btn-sm btn-danger">
  63 + <span class="glyphicon glyphicon-trash"></span>
  64 + </a>
  65 + {% endif %}
  66 + </div>
  67 +</div>
  68 + </div>
  69 + <div class="panel-body">
  70 + <p><b>{% trans "Professor" %}: </b>{% for professor in subject.professors.all %}{% if not forloop.first %},{% endif %}
  71 + {{professor}}{% if forloop.last %}.{% endif %}{% endfor %}</p>
  72 + <p>
  73 + <b>{% trans "Description" %}: </b>
  74 + <i>
  75 + {{subject.description}}
  76 + </i>
  77 + </p>
  78 + <div class="row">
  79 + <div class="col-xs-6 col-md-6">
  80 + {# <p><b>{% trans "Begining" %}: </b>{{subject.init_date}}</p>#}
  81 + </div>
  82 + <div class="col-xs-6 col-md-6">
  83 + {# <p><b>End: </b>23/08/2019</p>#}
  84 + </div>
  85 + </div>
  86 + </div>
  87 + </div>
  88 +{% endfor %}
110 {% endblock %} 89 {% endblock %}
111 90
  91 +
112 {% block rightbar %} 92 {% block rightbar %}
  93 +
113 {% endblock rightbar %} 94 {% endblock rightbar %}
courses/urls.py
@@ -6,7 +6,7 @@ urlpatterns = [ @@ -6,7 +6,7 @@ urlpatterns = [
6 url(r'^$', views.IndexView.as_view(), name='manage'), 6 url(r'^$', views.IndexView.as_view(), name='manage'),
7 url(r'^create/$', views.CreateView.as_view(), name='create'), 7 url(r'^create/$', views.CreateView.as_view(), name='create'),
8 url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name='update'), 8 url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name='update'),
9 - url(r'^(?P<slug>[\w_-]+)/$', views.View.as_view(), name='view'), 9 + url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'),
10 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name='delete'), 10 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name='delete'),
11 url(r'^category/(?P<slug>[\w_-]+)/$', views.FilteredView.as_view(), name='filter'), 11 url(r'^category/(?P<slug>[\w_-]+)/$', views.FilteredView.as_view(), name='filter'),
12 url(r'^categories/$', views.IndexCatView.as_view(), name='manage_cat'), 12 url(r'^categories/$', views.IndexCatView.as_view(), name='manage_cat'),
courses/views.py
@@ -75,7 +75,7 @@ class UpdateView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): @@ -75,7 +75,7 @@ class UpdateView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
75 75
76 return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine) 76 return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine)
77 77
78 -class View(LoginRequiredMixin, NotificationMixin, generic.DetailView): 78 +class CourseView(LoginRequiredMixin, NotificationMixin, generic.DetailView):
79 79
80 login_url = reverse_lazy("core:home") 80 login_url = reverse_lazy("core:home")
81 redirect_field_name = 'next' 81 redirect_field_name = 'next'
@@ -84,11 +84,25 @@ class View(LoginRequiredMixin, NotificationMixin, generic.DetailView): @@ -84,11 +84,25 @@ class View(LoginRequiredMixin, NotificationMixin, generic.DetailView):
84 template_name = 'course/view.html' 84 template_name = 'course/view.html'
85 85
86 def get_context_data(self, **kwargs): 86 def get_context_data(self, **kwargs):
87 - context = super(View, self).get_context_data(**kwargs) 87 + context = super(CourseView, self).get_context_data(**kwargs)
88 course = get_object_or_404(Course, slug = self.kwargs.get('slug')) 88 course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
89 - subjects = Subject.objects.filter(Q(visible=True) | Q(professors__in=[self.request.user]) | Q(course = course)) 89 + if has_role(self.request.user,'system_admin'):
  90 + subjects = Subject.objects.all()
  91 + elif has_role(self.request.user,'professor'):
  92 + subjects = course.subjects.filter(professors__in=[self.request.user])
  93 + elif has_role(self.request.user, 'student'):
  94 + subjects = course.subjects.filter(visible=True)
90 context['subjects'] = subjects 95 context['subjects'] = subjects
91 96
  97 + if has_role(self.request.user,'system_admin'):
  98 + courses = Course.objects.all()
  99 + elif has_role(self.request.user,'professor'):
  100 + courses = self.request.user.courses.all()
  101 + elif has_role(self.request.user, 'student'):
  102 + courses = self.request.user.courses_student.all()
  103 + context['courses'] = courses
  104 + context['title'] = course.name
  105 +
92 return context 106 return context
93 107
94 class DeleteView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.DeleteView): 108 class DeleteView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.DeleteView):