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 @@ |
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 | 31 | image = models.ImageField(verbose_name = _('Image'), blank = True, upload_to = 'courses/') |
32 | 32 | category = models.ForeignKey(Category, verbose_name = _('Category')) |
33 | 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 | 36 | class Meta: |
36 | 37 | ordering = ('create_date','name') | ... | ... |
courses/templates/course/view.html
1 | -{% extends 'course/index.html' %} | |
1 | +{% extends 'base.html' %} | |
2 | 2 | |
3 | 3 | {% load static i18n permission_tags %} |
4 | 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 | 10 | {% block breadcrumbs %} |
7 | 11 | |
8 | 12 | {{ block.super }} |
... | ... | @@ -10,104 +14,81 @@ |
10 | 14 | |
11 | 15 | {% endblock %} |
12 | 16 | |
13 | - | |
14 | 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 | 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 | 44 | {% endblock %} |
65 | 45 | |
66 | 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 | 89 | {% endblock %} |
111 | 90 | |
91 | + | |
112 | 92 | {% block rightbar %} |
93 | + | |
113 | 94 | {% endblock rightbar %} | ... | ... |
courses/urls.py
... | ... | @@ -6,7 +6,7 @@ urlpatterns = [ |
6 | 6 | url(r'^$', views.IndexView.as_view(), name='manage'), |
7 | 7 | url(r'^create/$', views.CreateView.as_view(), name='create'), |
8 | 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 | 10 | url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name='delete'), |
11 | 11 | url(r'^category/(?P<slug>[\w_-]+)/$', views.FilteredView.as_view(), name='filter'), |
12 | 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 | 75 | |
76 | 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 | 80 | login_url = reverse_lazy("core:home") |
81 | 81 | redirect_field_name = 'next' |
... | ... | @@ -84,11 +84,25 @@ class View(LoginRequiredMixin, NotificationMixin, generic.DetailView): |
84 | 84 | template_name = 'course/view.html' |
85 | 85 | |
86 | 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 | 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 | 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 | 106 | return context |
93 | 107 | |
94 | 108 | class DeleteView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.DeleteView): | ... | ... |