Commit 5927b6dd0f2d7de9d5fab3619623a9df96863f44
1 parent
e0e9c3fb
Exists in
master
and in
5 other branches
Home course for teacher and student, issue #49
Showing
5 changed files
with
113 additions
and
95 deletions
Show diff stats
@@ -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): |