Commit 6f0a7a5079d5b14acce914892db64d42a86b0268

Authored by filipecmedeiros
2 parents e6a9118d f89a35b2

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

amadeus/settings.py
@@ -48,6 +48,7 @@ INSTALLED_APPS = [ @@ -48,6 +48,7 @@ INSTALLED_APPS = [
48 'courses', 48 'courses',
49 'users', 49 'users',
50 'forum', 50 'forum',
  51 + 'poll',
51 ] 52 ]
52 53
53 MIDDLEWARE_CLASSES = [ 54 MIDDLEWARE_CLASSES = [
core/templates/base.html
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 8
9 <meta http-equiv="Cache-Control" content="no-cache, no-store" /> 9 <meta http-equiv="Cache-Control" content="no-cache, no-store" />
10 <link href="{% static 'img/favicon.ico' %}" rel="shortcut icon" /> 10 <link href="{% static 'img/favicon.ico' %}" rel="shortcut icon" />
11 - 11 +
12 <!-- Roboto font --> 12 <!-- Roboto font -->
13 <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700" type="text/css"> 13 <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:300,400,500,700" type="text/css">
14 <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> 14 <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
@@ -18,11 +18,11 @@ @@ -18,11 +18,11 @@
18 <script type="text/javascript" src="{% static 'js/vendor/jquery-ui.js' %}"></script> 18 <script type="text/javascript" src="{% static 'js/vendor/jquery-ui.js' %}"></script>
19 19
20 <!-- Bootstrap and themes (material) --> 20 <!-- Bootstrap and themes (material) -->
21 - <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/bootstrap.min.css' %}"> 21 + <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
22 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/material.min.css' %}"> 22 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/material.min.css' %}">
23 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/ripples.min.css' %}"> 23 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/ripples.min.css' %}">
24 - <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/datepicker.css' %}">  
25 - <script type="text/javascript" src="{% static 'js/vendor/bootstrap.min.js' %}"></script> 24 + <link rel="stylesheet" type="text/css" href="{% static 'css/datepicker.css' %}">
  25 + <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script>
26 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script> 26 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script>
27 <script type="text/javascript" src="{% static 'js/vendor/material.min.js' %}"></script> 27 <script type="text/javascript" src="{% static 'js/vendor/material.min.js' %}"></script>
28 <script type="text/javascript" src="{% static 'js/vendor/ripples.min.js' %}"></script> 28 <script type="text/javascript" src="{% static 'js/vendor/ripples.min.js' %}"></script>
@@ -141,8 +141,6 @@ @@ -141,8 +141,6 @@
141 </div> 141 </div>
142 </div> 142 </div>
143 </div> 143 </div>
144 -  
145 -  
146 </div> 144 </div>
147 </div> 145 </div>
148 </body> 146 </body>
courses/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-09-22 05:46 2 +# Generated by Django 1.10 on 2016-09-28 20:27
3 from __future__ import unicode_literals 3 from __future__ import unicode_literals
4 4
5 import autoslug.fields 5 import autoslug.fields
@@ -22,7 +22,6 @@ class Migration(migrations.Migration): @@ -22,7 +22,6 @@ class Migration(migrations.Migration):
22 name='Activity', 22 name='Activity',
23 fields=[ 23 fields=[
24 ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')), 24 ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')),
25 - ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),  
26 ('limit_date', models.DateTimeField(verbose_name='Deliver Date')), 25 ('limit_date', models.DateTimeField(verbose_name='Deliver Date')),
27 ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='student')), 26 ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='student')),
28 ], 27 ],
@@ -37,8 +36,8 @@ class Migration(migrations.Migration): @@ -37,8 +36,8 @@ class Migration(migrations.Migration):
37 ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')), 36 ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')),
38 ], 37 ],
39 options={ 38 options={
40 - 'verbose_name_plural': 'Categories',  
41 'verbose_name': 'Category', 39 'verbose_name': 'Category',
  40 + 'verbose_name_plural': 'Categories',
42 }, 41 },
43 ), 42 ),
44 migrations.CreateModel( 43 migrations.CreateModel(
@@ -57,20 +56,19 @@ class Migration(migrations.Migration): @@ -57,20 +56,19 @@ class Migration(migrations.Migration):
57 ('end_date', models.DateField(verbose_name='End of Course Date')), 56 ('end_date', models.DateField(verbose_name='End of Course Date')),
58 ('image', models.ImageField(blank=True, upload_to='courses/', verbose_name='Image')), 57 ('image', models.ImageField(blank=True, upload_to='courses/', verbose_name='Image')),
59 ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Category', verbose_name='Category')), 58 ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Category', verbose_name='Category')),
60 - ('professors', models.ManyToManyField(related_name='courses', to=settings.AUTH_USER_MODEL, verbose_name='Professors')), 59 + ('professors', models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors')),
61 ('students', models.ManyToManyField(related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students')), 60 ('students', models.ManyToManyField(related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students')),
62 ], 61 ],
63 options={ 62 options={
  63 + 'verbose_name': 'Course',
64 'verbose_name_plural': 'Courses', 64 'verbose_name_plural': 'Courses',
65 'ordering': ('create_date', 'name'), 65 'ordering': ('create_date', 'name'),
66 - 'verbose_name': 'Course',  
67 }, 66 },
68 ), 67 ),
69 migrations.CreateModel( 68 migrations.CreateModel(
70 name='Material', 69 name='Material',
71 fields=[ 70 fields=[
72 ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')), 71 ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')),
73 - ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),  
74 ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='student')), 72 ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='student')),
75 ], 73 ],
76 bases=('core.resource',), 74 bases=('core.resource',),
@@ -91,9 +89,23 @@ class Migration(migrations.Migration): @@ -91,9 +89,23 @@ class Migration(migrations.Migration):
91 ('professors', models.ManyToManyField(related_name='subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors')), 89 ('professors', models.ManyToManyField(related_name='subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors')),
92 ], 90 ],
93 options={ 91 options={
  92 + 'verbose_name': 'Subject',
94 'verbose_name_plural': 'Subjects', 93 'verbose_name_plural': 'Subjects',
95 'ordering': ('create_date', 'name'), 94 'ordering': ('create_date', 'name'),
96 - 'verbose_name': 'Subject', 95 + },
  96 + ),
  97 + migrations.CreateModel(
  98 + name='SubjectCategory',
  99 + fields=[
  100 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  101 + ('name', models.CharField(max_length=100, verbose_name='Name')),
  102 + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
  103 + ('description', models.TextField(blank=True, verbose_name='Description')),
  104 + ('subjects', models.ManyToManyField(to='courses.Subject')),
  105 + ],
  106 + options={
  107 + 'verbose_name': 'subject category',
  108 + 'verbose_name_plural': 'subject categories',
97 }, 109 },
98 ), 110 ),
99 migrations.CreateModel( 111 migrations.CreateModel(
@@ -110,9 +122,9 @@ class Migration(migrations.Migration): @@ -110,9 +122,9 @@ class Migration(migrations.Migration):
110 ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')), 122 ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')),
111 ], 123 ],
112 options={ 124 options={
  125 + 'verbose_name': 'Topic',
113 'verbose_name_plural': 'Topics', 126 'verbose_name_plural': 'Topics',
114 'ordering': ('create_date', 'name'), 127 'ordering': ('create_date', 'name'),
115 - 'verbose_name': 'Topic',  
116 }, 128 },
117 ), 129 ),
118 migrations.AddField( 130 migrations.AddField(
courses/migrations/0002_auto_20160926_0026.py
@@ -1,38 +0,0 @@ @@ -1,38 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-26 03:26  
3 -from __future__ import unicode_literals  
4 -  
5 -import autoslug.fields  
6 -from django.db import migrations, models  
7 -  
8 -  
9 -class Migration(migrations.Migration):  
10 -  
11 - dependencies = [  
12 - ('courses', '0001_initial'),  
13 - ]  
14 -  
15 - operations = [  
16 - migrations.CreateModel(  
17 - name='SubjectCategory',  
18 - fields=[  
19 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
20 - ('name', models.CharField(max_length=100, verbose_name='Name')),  
21 - ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),  
22 - ('description', models.TextField(blank=True, verbose_name='Description')),  
23 - ('subjects', models.ManyToManyField(to='courses.Subject')),  
24 - ],  
25 - options={  
26 - 'verbose_name_plural': 'subject categories',  
27 - 'verbose_name': 'subject category',  
28 - },  
29 - ),  
30 - migrations.RemoveField(  
31 - model_name='activity',  
32 - name='create_date',  
33 - ),  
34 - migrations.RemoveField(  
35 - model_name='material',  
36 - name='create_date',  
37 - ),  
38 - ]  
courses/migrations/0003_auto_20160927_1945.py
@@ -1,52 +0,0 @@ @@ -1,52 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-27 22:45  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.conf import settings  
6 -from django.db import migrations, models  
7 -import django.db.models.deletion  
8 -  
9 -  
10 -class Migration(migrations.Migration):  
11 -  
12 - dependencies = [  
13 - ('courses', '0002_auto_20160926_0026'),  
14 - ]  
15 -  
16 - operations = [  
17 - migrations.CreateModel(  
18 - name='Answer',  
19 - fields=[  
20 - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),  
21 - ('answer', models.CharField(max_length=200, verbose_name='Answer')),  
22 - ('order', models.PositiveSmallIntegerField(verbose_name='Order')),  
23 - ],  
24 - options={  
25 - 'verbose_name_plural': 'Answers',  
26 - 'verbose_name': 'Answer',  
27 - 'ordering': ('order',),  
28 - },  
29 - ),  
30 - migrations.CreateModel(  
31 - name='Poll',  
32 - fields=[  
33 - ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')),  
34 - ('question', models.CharField(max_length=300, verbose_name='Question')),  
35 - ],  
36 - options={  
37 - 'verbose_name_plural': 'Polls',  
38 - 'verbose_name': 'Poll',  
39 - },  
40 - bases=('courses.activity',),  
41 - ),  
42 - migrations.AlterField(  
43 - model_name='course',  
44 - name='professors',  
45 - field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),  
46 - ),  
47 - migrations.AddField(  
48 - model_name='answer',  
49 - name='poll',  
50 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='courses.Poll', verbose_name='Answers'),  
51 - ),  
52 - ]  
courses/models.py
@@ -105,35 +105,11 @@ It is a category for each subject. @@ -105,35 +105,11 @@ It is a category for each subject.
105 """ 105 """
106 class SubjectCategory(models.Model): 106 class SubjectCategory(models.Model):
107 name = models.CharField(_('Name'), max_length= 100) 107 name = models.CharField(_('Name'), max_length= 100)
108 - slug = AutoSlugField(_("Slug"),populate_from='name',unique=True) 108 + slug = AutoSlugField(_("Slug"),populate_from='name',unique=True)
109 description = models.TextField(_('Description'), blank = True) 109 description = models.TextField(_('Description'), blank = True)
110 subjects = models.ManyToManyField(Subject) 110 subjects = models.ManyToManyField(Subject)
111 111
112 class Meta: 112 class Meta:
113 verbose_name = _('subject category') 113 verbose_name = _('subject category')
114 verbose_name_plural = _('subject categories') 114 verbose_name_plural = _('subject categories')
115 -  
116 -class Poll(Activity):  
117 - question = models.CharField(_('Question'), max_length = 300)  
118 -  
119 - class Meta:  
120 - #ordering = ('create_date','name')  
121 - verbose_name = _('Poll')  
122 - verbose_name_plural = _('Polls')  
123 -  
124 - def __str__(self):  
125 - return str(self.question) + str("/") + str(self.topic)  
126 -  
127 -class Answer(models.Model):  
128 - answer = models.CharField(_("Answer"), max_length = 200)  
129 - order = models.PositiveSmallIntegerField(_("Order"))  
130 - poll = models.ForeignKey(Poll, verbose_name = _('Answers'), related_name='answers')  
131 -  
132 - class Meta:  
133 - ordering = ('order',)  
134 - verbose_name = _('Answer')  
135 - verbose_name_plural = _('Answers')  
136 -  
137 - def __str__(self):  
138 - return str(self.question) + str("/") + str(self.topic)  
139 - 115 +
courses/templates/poll/poll.html
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
1 -{% extends "topic/index.html" %}  
2 -  
3 -{% load i18n %}  
4 -  
5 -{% block style %}  
6 - <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>  
7 -{% endblock %}  
8 -  
9 -{% block content %}  
10 -<div class="col-md-8 col-md-offset-2">  
11 - <div class="panel panel-primary">  
12 - <div class="panel-heading">  
13 - <h3 class="panel-title">  
14 - <span class="glyphicon glyphicon-hand-right"></span> Question?</h3>  
15 - </div>  
16 - <div class="container-fluid">  
17 - <form id="form" class="" action="" method="post">  
18 - <div class="row form-group">  
19 - <div class="col-md-1">  
20 - </br>  
21 - <label><span class="glyphicon glyphicon-menu-hamburger"></span></label>  
22 - </div>  
23 - <div class="col-md-10">  
24 - <div class="form-control-md has-success is-empty">  
25 - <input type="text" class="form-control" placeholder="Email address default size">  
26 - <span class="help-block">Please enter a valid email address</span>  
27 - </div>  
28 - </div>  
29 - <div class="col-md-1">  
30 - </br>  
31 - <label><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></label>  
32 - </div>  
33 - </div>  
34 - </form>  
35 - </br>  
36 - </div>  
37 -  
38 - </div>  
39 - <div class="panel-footer text-center">  
40 - <button type="button" id="add" class="btn btn-primary btn-block btn-sm">add</button>  
41 - <a href="#" class="small">View Result</a>  
42 - </div>  
43 - </div>  
44 -<script type="text/javascript">  
45 -$( "#form" ).sortable({  
46 - delay: 100,  
47 - distance: 5,  
48 -});  
49 -$("#add").click(function() {  
50 - $("#form").append('<div class="row form-group"><div class="col-md-1"></br><label><span class="glyphicon glyphicon-menu-hamburger"></span></label></div><div class="col-md-10"><div class="form-group-md has-success is-empty"><input type="text" class="form-control" placeholder="Email address default size"><span class="help-block">Please enter a valid email address</span></div></div><div class="col-md-1"></br><label><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></label></div></br></div>');  
51 -});  
52 -</script>  
53 -{% endblock content %}  
courses/templates/subject/form_view_teacher.html
@@ -32,16 +32,6 @@ @@ -32,16 +32,6 @@
32 <div class="modal-body"> 32 <div class="modal-body">
33 <section> 33 <section>
34 <div class="forum_topics"></div> 34 <div class="forum_topics"></div>
35 - <div class="form-group">  
36 - <div class="input-group">  
37 - <textarea type="text" id="addon3a" class="form-control" placeholder="{% trans 'Post a comment...' %}"></textarea>  
38 - <span class="input-group-btn">  
39 - <button type="button" class="btn btn-fab btn-fab-mini">  
40 - <i class="material-icons">send</i>  
41 - </button>  
42 - </span>  
43 - </div>  
44 - </div>  
45 </section> 35 </section>
46 </div> 36 </div>
47 <div class="modal-footer"> 37 <div class="modal-footer">
courses/urls.py
1 -from django.conf.urls import url 1 +from django.conf.urls import url, include
2 2
3 from . import views 3 from . import views
4 4
@@ -22,6 +22,8 @@ urlpatterns = [ @@ -22,6 +22,8 @@ urlpatterns = [
22 url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), 22 url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
23 url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), 23 url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'),
24 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), 24 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'),
25 - url(r'^to/poll/to/$', views.Poll.as_view(), name='poll'), 25 +
  26 +
  27 + url(r'^poll/', include('poll.urls', namespace = 'poll'))
26 28
27 ] 29 ]
courses/views.py
@@ -455,27 +455,3 @@ class IndexSubjectCategoryView(LoginRequiredMixin, generic.ListView): @@ -455,27 +455,3 @@ class IndexSubjectCategoryView(LoginRequiredMixin, generic.ListView):
455 context = super(IndexSubjectCategoryView, self).get_context_data(**kwargs) 455 context = super(IndexSubjectCategoryView, self).get_context_data(**kwargs)
456 context['subject_categories'] = SubjectCategory.objects.all() 456 context['subject_categories'] = SubjectCategory.objects.all()
457 return context 457 return context
458 -  
459 -  
460 -class Poll(generic.TemplateView):  
461 -  
462 - # login_url = reverse_lazy("core:home")  
463 - # redirect_field_name = 'next'  
464 - # model = Course  
465 - # context_object_name = 'course'  
466 - template_name = 'poll/poll.html'  
467 - # queryset = Course.objects.all()  
468 -  
469 - # def get_queryset(self):  
470 - # return Course.objects.all()[0]  
471 -  
472 - def get_context_data(self, **kwargs):  
473 - context = super(Poll, self).get_context_data(**kwargs)  
474 - course = Course.objects.all()[0]  
475 - context['course'] = course  
476 - context['subject'] = course.subjects.all()[0]  
477 - context['subjects'] = course.subjects.all()  
478 - # if (has_role(self.request.user,'system_admin')):  
479 - # context['subjects'] = self.object.course.subjects.all()  
480 - return context  
481 -  
forum/forms.py
1 from django import forms 1 from django import forms
2 from django.utils.translation import ugettext_lazy as _ 2 from django.utils.translation import ugettext_lazy as _
3 -from .models import Forum, PostAnswer 3 +from .models import Forum, Post, PostAnswer
4 4
5 class ForumForm(forms.ModelForm): 5 class ForumForm(forms.ModelForm):
6 6
@@ -19,6 +19,19 @@ class ForumForm(forms.ModelForm): @@ -19,6 +19,19 @@ class ForumForm(forms.ModelForm):
19 'description': forms.Textarea(attrs={'cols': 80, 'rows': 5}), 19 'description': forms.Textarea(attrs={'cols': 80, 'rows': 5}),
20 } 20 }
21 21
  22 +class PostForm(forms.ModelForm):
  23 +
  24 + class Meta:
  25 + model = Post
  26 + fields = ('message', 'forum', )
  27 + labels = {
  28 + 'message': _('Message')
  29 + }
  30 + widgets = {
  31 + 'message': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
  32 + 'forum': forms.HiddenInput(),
  33 + }
  34 +
22 class PostAnswerForm(forms.ModelForm): 35 class PostAnswerForm(forms.ModelForm):
23 36
24 class Meta: 37 class Meta:
forum/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-09-22 20:41 2 +# Generated by Django 1.10 on 2016-09-28 20:27
3 from __future__ import unicode_literals 3 from __future__ import unicode_literals
4 4
5 from django.conf import settings 5 from django.conf import settings
@@ -21,8 +21,9 @@ class Migration(migrations.Migration): @@ -21,8 +21,9 @@ class Migration(migrations.Migration):
21 name='Forum', 21 name='Forum',
22 fields=[ 22 fields=[
23 ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')), 23 ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')),
24 - ('title', models.CharField(max_length=100, verbose_name='Title')),  
25 ('description', models.TextField(blank=True, verbose_name='Description')), 24 ('description', models.TextField(blank=True, verbose_name='Description')),
  25 + ('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')),
  26 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')),
26 ], 27 ],
27 options={ 28 options={
28 'verbose_name': 'Forum', 29 'verbose_name': 'Forum',
@@ -35,6 +36,7 @@ class Migration(migrations.Migration): @@ -35,6 +36,7 @@ class Migration(migrations.Migration):
35 fields=[ 36 fields=[
36 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 37 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
37 ('message', models.TextField(verbose_name='Post message')), 38 ('message', models.TextField(verbose_name='Post message')),
  39 + ('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')),
38 ('post_date', models.DateTimeField(auto_now_add=True, verbose_name='Post Date')), 40 ('post_date', models.DateTimeField(auto_now_add=True, verbose_name='Post Date')),
39 ('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum')), 41 ('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum')),
40 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')), 42 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')),
@@ -49,6 +51,7 @@ class Migration(migrations.Migration): @@ -49,6 +51,7 @@ class Migration(migrations.Migration):
49 fields=[ 51 fields=[
50 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 52 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
51 ('message', models.TextField(verbose_name='Answer message')), 53 ('message', models.TextField(verbose_name='Answer message')),
  54 + ('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')),
52 ('answer_date', models.DateTimeField(auto_now_add=True, verbose_name='Answer Date')), 55 ('answer_date', models.DateTimeField(auto_now_add=True, verbose_name='Answer Date')),
53 ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Post', verbose_name='Post')), 56 ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Post', verbose_name='Post')),
54 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')), 57 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')),
forum/migrations/0002_remove_forum_title.py
@@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-22 20:43  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.db import migrations  
6 -  
7 -  
8 -class Migration(migrations.Migration):  
9 -  
10 - dependencies = [  
11 - ('forum', '0001_initial'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.RemoveField(  
16 - model_name='forum',  
17 - name='title',  
18 - ),  
19 - ]  
forum/migrations/0003_forum_create_date.py
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-28 02:17  
3 -from __future__ import unicode_literals  
4 -  
5 -from django.db import migrations, models  
6 -import django.utils.timezone  
7 -  
8 -  
9 -class Migration(migrations.Migration):  
10 -  
11 - dependencies = [  
12 - ('forum', '0002_remove_forum_title'),  
13 - ]  
14 -  
15 - operations = [  
16 - migrations.AddField(  
17 - model_name='forum',  
18 - name='create_date',  
19 - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='Create Date'),  
20 - preserve_default=False,  
21 - ),  
22 - ]  
forum/migrations/0004_auto_20160928_1558.py
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-09-28 18:58  
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 - ('forum', '0003_forum_create_date'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AddField(  
16 - model_name='forum',  
17 - name='modification_date',  
18 - field=models.DateTimeField(auto_now=True, verbose_name='Modification Date'),  
19 - ),  
20 - migrations.AddField(  
21 - model_name='post',  
22 - name='modification_date',  
23 - field=models.DateTimeField(auto_now=True, verbose_name='Modification Date'),  
24 - ),  
25 - migrations.AddField(  
26 - model_name='postanswer',  
27 - name='modification_date',  
28 - field=models.DateTimeField(auto_now=True, verbose_name='Modification Date'),  
29 - ),  
30 - ]  
forum/static/js/forum.js
@@ -9,6 +9,24 @@ function showForum(url, forum_id) { @@ -9,6 +9,24 @@ function showForum(url, forum_id) {
9 data: {'forum_id': forum_id}, 9 data: {'forum_id': forum_id},
10 success: function(data) { 10 success: function(data) {
11 $(".forum_topics").html(data); 11 $(".forum_topics").html(data);
  12 +
  13 + var frm = $('#form_post');
  14 + frm.submit(function () {
  15 + $.ajax({
  16 + type: frm.attr('method'),
  17 + url: frm.attr('action'),
  18 + data: frm.serialize(),
  19 + success: function (data) {
  20 + $("#posts_list").append(data);
  21 + frm[0].reset();
  22 + },
  23 + error: function(data) {
  24 + console.log(frm.serialize());
  25 + console.log('Error');
  26 + }
  27 + });
  28 + return false;
  29 + });
12 } 30 }
13 }); 31 });
14 32
forum/templates/forum/forum_list.html
1 {% load i18n permission_tags list_post %} 1 {% load i18n permission_tags list_post %}
  2 +{% load widget_tweaks %}
2 3
3 <div class="comments-list"> 4 <div class="comments-list">
4 <div class="section-heading"> 5 <div class="section-heading">
@@ -8,7 +9,45 @@ @@ -8,7 +9,45 @@
8 </div> 9 </div>
9 </div> 10 </div>
10 11
11 -{% list_posts request forum %} 12 +<div id="posts_list">
  13 + {% list_posts request forum %}
  14 +</div>
  15 +
  16 +<form id="form_post" method="post" action="{% url 'forum:create_post' %}" enctype="multipart/form-data">
  17 + {% csrf_token %}
  18 + {% for field in form %}
  19 + {% if field.field.widget.input_type == 'hidden' %}
  20 + {% render_field field class='form-control' value=forum.id %}
  21 + {% else %}
  22 + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
  23 + <div class="input-group">
  24 + {% render_field field class='form-control' placeholder="Post a message" %}
  25 + <span class="help-block">{{ field.help_text }}</span>
  26 + {% if field.errors %}
  27 + <div class="row">
  28 + <br />
  29 + <div class="alert alert-danger alert-dismissible" role="alert">
  30 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  31 + <span aria-hidden="true">&times;</span>
  32 + </button>
  33 + <ul>
  34 + {% for error in field.errors %}
  35 + <li>{{ error }}</li>
  36 + {% endfor %}
  37 + </ul>
  38 + </div>
  39 + </div>
  40 + {% endif %}
  41 + <span class="input-group-btn">
  42 + <button type="submit" class="btn btn-fab btn-fab-mini">
  43 + <i class="material-icons">send</i>
  44 + </button>
  45 + </span>
  46 + </div>
  47 + </div>
  48 + {% endif %}
  49 + {% endfor %}
  50 +</form>
12 51
13 <!--{% if foruns|length > 0 %} 52 <!--{% if foruns|length > 0 %}
14 {% for forum in foruns %} 53 {% for forum in foruns %}
forum/templates/post/post_render.html 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +{% load i18n permission_tags %}
  2 +
  3 +<div class="row">
  4 + <div id="post_{{ post.id }}" class="col-sm-12 col-xs-12">
  5 + <h3 class="user-name">
  6 + {{ post.user }}
  7 + <div class="pull-right">
  8 + <a href="javascript:answer('{{ post.id }}', '{% url 'forum:reply_post' %}');">
  9 + <i class="material-icons">reply</i>
  10 + </a>
  11 + {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user == post.user %}
  12 + <div class="btn-group icon-more-horiz">
  13 + <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  14 + <i class="material-icons">more_horiz</i>
  15 + </a>
  16 + <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
  17 + <li><a href="javascript:void(0)"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li>
  18 + <li><a href="javascript:void(0)"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li>
  19 + </ul>
  20 + </div>
  21 + {% endif %}
  22 + </div>
  23 + </h3>
  24 + <div class="card-data">
  25 + <p class="comment-date"><i class="fa fa-clock-o"></i> {{ post.post_date }}</p>
  26 + </div>
  27 + <p class="comment-text">{{ post.message|linebreaks }}</p>
  28 + <div class="answer_post"></div>
  29 + </div>
  30 +</div>
0 \ No newline at end of file 31 \ No newline at end of file
forum/templates/post_answers/post_answer_form.html
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
25 </div> 25 </div>
26 {% endif %} 26 {% endif %}
27 <span class="input-group-btn"> 27 <span class="input-group-btn">
28 - <button type="button" class="btn btn-fab btn-fab-mini"> 28 + <button type="submit" class="btn btn-fab btn-fab-mini">
29 <i class="material-icons">send</i> 29 <i class="material-icons">send</i>
30 </button> 30 </button>
31 </span> 31 </span>
@@ -7,6 +7,8 @@ urlpatterns = [ @@ -7,6 +7,8 @@ urlpatterns = [
7 url(r'^$', views.ForumIndex.as_view(), name='index'), 7 url(r'^$', views.ForumIndex.as_view(), name='index'),
8 url(r'^create$', views.CreateForumView.as_view(), name='create'), 8 url(r'^create$', views.CreateForumView.as_view(), name='create'),
9 url(r'^posts$', views.PostIndex.as_view(), name='posts'), 9 url(r'^posts$', views.PostIndex.as_view(), name='posts'),
  10 + url(r'^create_post$', views.CreatePostView.as_view(), name='create_post'),
  11 + url(r'^render+post/([\w_-]+)/$', views.render_post, name='render_post'),
10 url(r'^post_answers$', views.PostAnswerIndex.as_view(), name='post_answers'), 12 url(r'^post_answers$', views.PostAnswerIndex.as_view(), name='post_answers'),
11 url(r'^reply_post$', views.CreatePostAnswerView.as_view(), name='reply_post'), 13 url(r'^reply_post$', views.CreatePostAnswerView.as_view(), name='reply_post'),
12 ] 14 ]
forum/views.py
1 from django.shortcuts import render, get_object_or_404 1 from django.shortcuts import render, get_object_or_404
2 -from django.core.urlresolvers import reverse_lazy 2 +from django.core.urlresolvers import reverse, reverse_lazy
3 from django.utils.translation import ugettext_lazy as _ 3 from django.utils.translation import ugettext_lazy as _
4 from django.views import generic 4 from django.views import generic
5 from django.contrib.auth.mixins import LoginRequiredMixin 5 from django.contrib.auth.mixins import LoginRequiredMixin
@@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin @@ -7,7 +7,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
7 from .models import Forum, Post, PostAnswer 7 from .models import Forum, Post, PostAnswer
8 from courses.models import Topic 8 from courses.models import Topic
9 9
10 -from .forms import ForumForm, PostAnswerForm 10 +from .forms import ForumForm, PostForm, PostAnswerForm
11 11
12 class ForumIndex(LoginRequiredMixin, generic.ListView): 12 class ForumIndex(LoginRequiredMixin, generic.ListView):
13 login_url = reverse_lazy("core:home") 13 login_url = reverse_lazy("core:home")
@@ -20,6 +20,12 @@ class ForumIndex(LoginRequiredMixin, generic.ListView): @@ -20,6 +20,12 @@ class ForumIndex(LoginRequiredMixin, generic.ListView):
20 forum_id = self.request.GET.get('forum_id', 0) 20 forum_id = self.request.GET.get('forum_id', 0)
21 21
22 context = Forum.objects.get(id = forum_id) 22 context = Forum.objects.get(id = forum_id)
  23 +
  24 + return context
  25 +
  26 + def get_context_data(self, **kwargs):
  27 + context = super(ForumIndex, self).get_context_data(**kwargs)
  28 + context['form'] = PostForm()
23 29
24 return context 30 return context
25 31
@@ -43,6 +49,33 @@ class PostIndex(LoginRequiredMixin, generic.ListView): @@ -43,6 +49,33 @@ class PostIndex(LoginRequiredMixin, generic.ListView):
43 49
44 return context 50 return context
45 51
  52 +class CreatePostView(LoginRequiredMixin, generic.edit.CreateView):
  53 + login_url = reverse_lazy("core:home")
  54 + redirect_field_name = 'next'
  55 +
  56 + form_class = PostForm
  57 +
  58 + def form_valid(self, form):
  59 + self.object = form.save(commit = False)
  60 + self.object.user = self.request.user
  61 +
  62 + self.object.save()
  63 +
  64 + return super(CreatePostView, self).form_valid(form)
  65 +
  66 + def get_success_url(self):
  67 + self.success_url = reverse('forum:render_post', args = (self.object.id, ))
  68 +
  69 + return self.success_url
  70 +
  71 +def render_post(request, post):
  72 + last_post = get_object_or_404(Post, id = post)
  73 +
  74 + context = {}
  75 + context['post'] = last_post
  76 +
  77 + return render(request, "post/post_render.html", context)
  78 +
46 class PostAnswerIndex(LoginRequiredMixin, generic.ListView): 79 class PostAnswerIndex(LoginRequiredMixin, generic.ListView):
47 login_url = reverse_lazy("core:home") 80 login_url = reverse_lazy("core:home")
48 redirect_field_name = 'next' 81 redirect_field_name = 'next'
poll/__init__.py 0 → 100644
poll/admin.py 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +from django.contrib import admin
  2 +
  3 +# Register your models here.
poll/apps.py 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +from django.apps import AppConfig
  2 +
  3 +
  4 +class PollConfig(AppConfig):
  5 + name = 'poll'
poll/migrations/0001_initial.py 0 → 100644
@@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-09-28 20:27
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations, models
  6 +import django.db.models.deletion
  7 +
  8 +
  9 +class Migration(migrations.Migration):
  10 +
  11 + initial = True
  12 +
  13 + dependencies = [
  14 + ('courses', '0001_initial'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.CreateModel(
  19 + name='Answer',
  20 + fields=[
  21 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  22 + ('answer', models.CharField(max_length=200, verbose_name='Answer')),
  23 + ('order', models.PositiveSmallIntegerField(verbose_name='Order')),
  24 + ],
  25 + options={
  26 + 'verbose_name': 'Answer',
  27 + 'verbose_name_plural': 'Answers',
  28 + 'ordering': ('order',),
  29 + },
  30 + ),
  31 + migrations.CreateModel(
  32 + name='Poll',
  33 + fields=[
  34 + ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')),
  35 + ('question', models.CharField(max_length=300, verbose_name='Question')),
  36 + ],
  37 + options={
  38 + 'verbose_name': 'Poll',
  39 + 'verbose_name_plural': 'Polls',
  40 + },
  41 + bases=('courses.activity',),
  42 + ),
  43 + migrations.AddField(
  44 + model_name='answer',
  45 + name='poll',
  46 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='poll.Poll', verbose_name='Answers'),
  47 + ),
  48 + ]
poll/migrations/__init__.py 0 → 100644
poll/models.py 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +from django.utils.translation import ugettext_lazy as _
  2 +from django.db import models
  3 +from autoslug.fields import AutoSlugField
  4 +from users.models import User
  5 +from core.models import Resource
  6 +from courses.models import Activity
  7 +
  8 +class Poll(Activity):
  9 + question = models.CharField(_('Question'), max_length = 300)
  10 +
  11 + class Meta:
  12 + #ordering = ('create_date','name')
  13 + verbose_name = _('Poll')
  14 + verbose_name_plural = _('Polls')
  15 +
  16 + def __str__(self):
  17 + return str(self.question) + str("/") + str(self.topic)
  18 +
  19 +class Answer(models.Model):
  20 + answer = models.CharField(_("Answer"), max_length = 200)
  21 + order = models.PositiveSmallIntegerField(_("Order"))
  22 + poll = models.ForeignKey(Poll, verbose_name = _('Answers'), related_name='answers')
  23 +
  24 + class Meta:
  25 + ordering = ('order',)
  26 + verbose_name = _('Answer')
  27 + verbose_name_plural = _('Answers')
  28 +
  29 + def __str__(self):
  30 + return str(self.question) + str("/") + str(self.topic)
poll/templates/poll/poll.html 0 → 100644
@@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
  1 +{% extends "topic/index.html" %}
  2 +
  3 +{% load i18n %}
  4 +
  5 +{% block style %}
  6 + <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  7 +{% endblock %}
  8 +
  9 +{% block content %}
  10 +<div class="col-md-8 col-md-offset-2">
  11 + <div class="panel panel-primary">
  12 + <div class="panel-heading">
  13 + <h3 class="panel-title">
  14 + <span class="glyphicon glyphicon-hand-right"></span> Question?</h3>
  15 + </div>
  16 + <div class="container-fluid">
  17 + <form id="form" class="" action="" method="post">
  18 + <div class="row form-group">
  19 + <div class="col-md-1">
  20 + </br>
  21 + <label><a href=""><span class="glyphicon glyphicon-move"></span></a></label>
  22 + </div>
  23 + <div class="col-md-10">
  24 + <div class="form-control-md has-success is-empty">
  25 + <input type="text" class="form-control" placeholder="Email address default size">
  26 + <span class="help-block">{% trans "Possible Answer" %}</span>
  27 + </div>
  28 + </div>
  29 + <div class="col-md-1">
  30 + </br>
  31 + <label><a href=""><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></a></label>
  32 + </div>
  33 + </div>
  34 + </form>
  35 + </br>
  36 + </div>
  37 +
  38 + </div>
  39 + <div class="panel-footer text-center">
  40 + <button type="button" id="add" class="btn btn-primary btn-block btn-sm">add</button>
  41 + </div>
  42 + </div>
  43 +<script type="text/javascript">
  44 +$( "#form" ).sortable({
  45 + delay: 100,
  46 + distance: 5,
  47 +});
  48 +$("#add").click(function() {
  49 + $("#form").append('<div class="row form-group"><div class="col-md-1"></br><label><a href=""><span class="glyphicon glyphicon-move"></span></a></label></div><div class="col-md-10"><div class="form-group-md has-success is-empty"><input type="text" class="form-control" placeholder="Email address default size"><span class="help-block">Please enter a valid email address</span></div></div><div class="col-md-1"></br><label><a href=""><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></a></label></div></br></div>');
  50 +});
  51 +</script>
  52 +{% endblock content %}
poll/tests.py 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +from django.test import TestCase
  2 +
  3 +# Create your tests here.
poll/urls.py 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +from django.conf.urls import url
  2 +
  3 +from . import views
  4 +
  5 +urlpatterns = [
  6 + url(r'^to/poll/to/$', views.Poll.as_view(), name='poll'),
  7 +
  8 +]
poll/views.py 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +from django.shortcuts import render, get_object_or_404, redirect
  2 +from django.views import generic
  3 +from django.contrib.auth.decorators import login_required
  4 +from django.core.paginator import Paginator, EmptyPage
  5 +from django.contrib.auth.mixins import LoginRequiredMixin
  6 +from rolepermissions.mixins import HasRoleMixin
  7 +from django.core.urlresolvers import reverse_lazy
  8 +from django.utils.translation import ugettext_lazy as _
  9 +from rolepermissions.verifications import has_role
  10 +from rolepermissions.verifications import has_object_permission
  11 +
  12 +# from .forms import CourseForm, UpdateCourseForm, CategoryForm, SubjectForm,TopicForm
  13 +# from .models import Course, Subject, Category,Topic, SubjectCategory
  14 +from core.mixins import NotificationMixin
  15 +from users.models import User
  16 +from courses.models import Course
  17 +
  18 +class Poll(generic.TemplateView):
  19 +
  20 + # login_url = reverse_lazy("core:home")
  21 + # redirect_field_name = 'next'
  22 + # model = Course
  23 + # context_object_name = 'course'
  24 + template_name = 'poll/poll.html'
  25 + # queryset = Course.objects.all()
  26 +
  27 + # def get_queryset(self):
  28 + # return Course.objects.all()[0]
  29 +
  30 + def get_context_data(self, **kwargs):
  31 + context = super(Poll, self).get_context_data(**kwargs)
  32 + course = Course.objects.all()[0]
  33 + context['course'] = course
  34 + context['subject'] = course.subjects.all()[0]
  35 + context['subjects'] = course.subjects.all()
  36 + # if (has_role(self.request.user,'system_admin')):
  37 + # context['subjects'] = self.object.course.subjects.all()
  38 + return context
requirements.txt
@@ -10,7 +10,6 @@ itsdangerous==0.24 @@ -10,7 +10,6 @@ itsdangerous==0.24
10 Jinja2==2.8 10 Jinja2==2.8
11 MarkupSafe==0.23 11 MarkupSafe==0.23
12 Pillow==3.3.1 12 Pillow==3.3.1
13 -pkg-resources==0.0.0  
14 pycpfcnpj==1.0.2 13 pycpfcnpj==1.0.2
15 six==1.10.0 14 six==1.10.0
16 slugify==0.0.1 15 slugify==0.0.1