Commit 6f0a7a5079d5b14acce914892db64d42a86b0268
Exists in
master
and in
5 other branches
Merge branch 'dev' of https://github.com/amadeusproject/amadeuslms into dev
Showing
32 changed files
with
363 additions
and
298 deletions
Show diff stats
amadeus/settings.py
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">×</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 %} |
@@ -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> |
forum/urls.py
@@ -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' |
@@ -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 | + ] |
@@ -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) |
@@ -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 %} |
@@ -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 |