Commit 81016d27252fe7dd1521c54436fd3dfebbf7628e
Exists in
master
and in
5 other branches
remove course
Showing
96 changed files
with
2214 additions
and
799 deletions
Show diff stats
amadeus/urls.py
| @@ -21,7 +21,7 @@ from django.contrib import admin | @@ -21,7 +21,7 @@ from django.contrib import admin | ||
| 21 | 21 | ||
| 22 | urlpatterns = [ | 22 | urlpatterns = [ |
| 23 | url(r'^home/', include('app.urls', namespace = 'app')), | 23 | url(r'^home/', include('app.urls', namespace = 'app')), |
| 24 | - url(r'^course/', include('courses.urls', namespace = 'course')), | 24 | + url(r'^courses/', include('courses.urls', namespace = 'course')), |
| 25 | url(r'^users/', include('users.urls', namespace = 'users')), | 25 | url(r'^users/', include('users.urls', namespace = 'users')), |
| 26 | url(r'^admin/', admin.site.urls), | 26 | url(r'^admin/', admin.site.urls), |
| 27 | url(r'^', include('core.urls', namespace = 'core')), | 27 | url(r'^', include('core.urls', namespace = 'core')), |
app/templates/home_teacher_student_content.html
| @@ -4,19 +4,14 @@ | @@ -4,19 +4,14 @@ | ||
| 4 | 4 | ||
| 5 | 5 | ||
| 6 | <div class="well timeLine"> | 6 | <div class="well timeLine"> |
| 7 | - <div class="row"> | ||
| 8 | - <div class="col-md-12"> | ||
| 9 | - <p><a href="#"></a></p><h6><a href="#"><i>Default Path to Notification</i></a></h6><p></p> | ||
| 10 | - </div> | ||
| 11 | - </div> | 7 | + |
| 12 | <div class="row"> | 8 | <div class="row"> |
| 13 | <div class="col-xs-2 col-md-1"> | 9 | <div class="col-xs-2 col-md-1"> |
| 14 | <img class="imgTimeLine" src="{{ notification.user.image_url }}"> | 10 | <img class="imgTimeLine" src="{{ notification.user.image_url }}"> |
| 15 | </div> | 11 | </div> |
| 16 | <div class="col-xs-10 col-md-11"> | 12 | <div class="col-xs-10 col-md-11"> |
| 17 | - <i class="fa fa-pencil-square-o" aria-hidden="true"></i> | ||
| 18 | - <a href=""><h4 class="resource_inline"><b>{{ notification.user }}</b></h4></a> | ||
| 19 | - <p class="resource_inline">{{notification.message}} em : <a href="{% url 'core:notification_read' notification.id %}">Recurso</a></p> | 13 | + <h4 class="resource_inline"><b>{{ notification.actor.username }}</b></h4> |
| 14 | + <p class="resource_inline">{{notification.message}} em : <a href="{% url 'core:notification_read' notification.id %}">{{ notification.action_resource.resource.name }}</a></p> | ||
| 20 | <p class="timePost"><i> {{ notification.datetime|timesince }} {% trans "ago" %} </i></p> | 15 | <p class="timePost"><i> {{ notification.datetime|timesince }} {% trans "ago" %} </i></p> |
| 21 | </div> | 16 | </div> |
| 22 | </div> | 17 | </div> |
app/views.py
| @@ -40,7 +40,6 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin): | @@ -40,7 +40,6 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin): | ||
| 40 | else: | 40 | else: |
| 41 | self.template_name = "home_teacher_student_content.html" | 41 | self.template_name = "home_teacher_student_content.html" |
| 42 | 42 | ||
| 43 | - super(AppIndex, self).createNotification("testando notificacao de login", resource_name="home", resource_link="/") | ||
| 44 | return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs) | 43 | return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs) |
| 45 | 44 | ||
| 46 | 45 |
core/decorators.py
| @@ -60,7 +60,7 @@ def notification_decorator(read = False, message = '', actor = None, users = [], | @@ -60,7 +60,7 @@ def notification_decorator(read = False, message = '', actor = None, users = [], | ||
| 60 | if action.exists(): | 60 | if action.exists(): |
| 61 | action = action[0] | 61 | action = action[0] |
| 62 | else: | 62 | else: |
| 63 | - action = Action(name = not_action) | 63 | + action = Action(name = not_action) |
| 64 | action.save() | 64 | action.save() |
| 65 | 65 | ||
| 66 | if resource.exists(): | 66 | if resource.exists(): |
core/locale/pt_BR/LC_MESSAGES/django.po
| @@ -20,7 +20,7 @@ msgstr "" | @@ -20,7 +20,7 @@ msgstr "" | ||
| 20 | 20 | ||
| 21 | #: core/models.py:15 core/models.py:36 | 21 | #: core/models.py:15 core/models.py:36 |
| 22 | msgid "Name" | 22 | msgid "Name" |
| 23 | -msgstr "" | 23 | +msgstr "Nome" |
| 24 | 24 | ||
| 25 | #: core/models.py:16 core/models.py:37 | 25 | #: core/models.py:16 core/models.py:37 |
| 26 | msgid "Created Date" | 26 | msgid "Created Date" |
| @@ -36,7 +36,7 @@ msgstr "" | @@ -36,7 +36,7 @@ msgstr "" | ||
| 36 | 36 | ||
| 37 | #: core/models.py:61 | 37 | #: core/models.py:61 |
| 38 | msgid "message" | 38 | msgid "message" |
| 39 | -msgstr "" | 39 | +msgstr "mensagem" |
| 40 | 40 | ||
| 41 | #: core/models.py:62 | 41 | #: core/models.py:62 |
| 42 | msgid "Actor" | 42 | msgid "Actor" |
| @@ -64,11 +64,11 @@ msgstr "Senha" | @@ -64,11 +64,11 @@ msgstr "Senha" | ||
| 64 | 64 | ||
| 65 | #: core/templates/index.html:44 | 65 | #: core/templates/index.html:44 |
| 66 | msgid "Remember Email" | 66 | msgid "Remember Email" |
| 67 | -msgstr "" | 67 | +msgstr "Lembrar Senha" |
| 68 | 68 | ||
| 69 | #: core/templates/index.html:53 | 69 | #: core/templates/index.html:53 |
| 70 | msgid "Guest" | 70 | msgid "Guest" |
| 71 | -msgstr "" | 71 | +msgstr "Convidado" |
| 72 | 72 | ||
| 73 | #: core/templates/index.html:56 | 73 | #: core/templates/index.html:56 |
| 74 | msgid "Login" | 74 | msgid "Login" |
| @@ -80,11 +80,11 @@ msgstr "Cadastrar" | @@ -80,11 +80,11 @@ msgstr "Cadastrar" | ||
| 80 | 80 | ||
| 81 | #: core/templates/register_user.html:29 | 81 | #: core/templates/register_user.html:29 |
| 82 | msgid "User Register" | 82 | msgid "User Register" |
| 83 | -msgstr "" | 83 | +msgstr "Registrar Usuário" |
| 84 | 84 | ||
| 85 | #: core/templates/register_user.html:53 | 85 | #: core/templates/register_user.html:53 |
| 86 | msgid "Save" | 86 | msgid "Save" |
| 87 | -msgstr "" | 87 | +msgstr "Salvar" |
| 88 | 88 | ||
| 89 | #: core/templates/remember_password.html:18 | 89 | #: core/templates/remember_password.html:18 |
| 90 | msgid "E-mail" | 90 | msgid "E-mail" |
| @@ -92,7 +92,7 @@ msgstr "E-mail" | @@ -92,7 +92,7 @@ msgstr "E-mail" | ||
| 92 | 92 | ||
| 93 | #: core/templates/remember_password.html:22 | 93 | #: core/templates/remember_password.html:22 |
| 94 | msgid "Registration" | 94 | msgid "Registration" |
| 95 | -msgstr "" | 95 | +msgstr "Registrar" |
| 96 | 96 | ||
| 97 | #: core/templates/remember_password.html:26 | 97 | #: core/templates/remember_password.html:26 |
| 98 | msgid "Send" | 98 | msgid "Send" |
| @@ -100,7 +100,7 @@ msgstr "Enviar" | @@ -100,7 +100,7 @@ msgstr "Enviar" | ||
| 100 | 100 | ||
| 101 | #: core/views.py:31 | 101 | #: core/views.py:31 |
| 102 | msgid "User successfully registered!" | 102 | msgid "User successfully registered!" |
| 103 | -msgstr "" | 103 | +msgstr "Usuario cadastrado com sucesso" |
| 104 | 104 | ||
| 105 | #: core/views.py:54 | 105 | #: core/views.py:54 |
| 106 | msgid "E-mail or password are incorrect!" | 106 | msgid "E-mail or password are incorrect!" |
core/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:31 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | import autoslug.fields | 5 | import autoslug.fields |
| 6 | +from django.conf import settings | ||
| 6 | from django.db import migrations, models | 7 | from django.db import migrations, models |
| 7 | import django.db.models.deletion | 8 | import django.db.models.deletion |
| 8 | 9 | ||
| @@ -12,6 +13,7 @@ class Migration(migrations.Migration): | @@ -12,6 +13,7 @@ class Migration(migrations.Migration): | ||
| 12 | initial = True | 13 | initial = True |
| 13 | 14 | ||
| 14 | dependencies = [ | 15 | dependencies = [ |
| 16 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 15 | ] | 17 | ] |
| 16 | 18 | ||
| 17 | operations = [ | 19 | operations = [ |
| @@ -20,21 +22,23 @@ class Migration(migrations.Migration): | @@ -20,21 +22,23 @@ class Migration(migrations.Migration): | ||
| 20 | fields=[ | 22 | fields=[ |
| 21 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | 23 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
| 22 | ('name', models.CharField(max_length=100, verbose_name='Name')), | 24 | ('name', models.CharField(max_length=100, verbose_name='Name')), |
| 25 | + ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from=('name',), unique=True, verbose_name='Slug')), | ||
| 23 | ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')), | 26 | ('created_date', models.DateField(auto_now_add=True, verbose_name='Created Date')), |
| 24 | ], | 27 | ], |
| 25 | options={ | 28 | options={ |
| 26 | - 'verbose_name': 'Action', | ||
| 27 | 'verbose_name_plural': 'Actions', | 29 | 'verbose_name_plural': 'Actions', |
| 30 | + 'verbose_name': 'Action', | ||
| 28 | }, | 31 | }, |
| 29 | ), | 32 | ), |
| 30 | migrations.CreateModel( | 33 | migrations.CreateModel( |
| 31 | name='Action_Resource', | 34 | name='Action_Resource', |
| 32 | fields=[ | 35 | fields=[ |
| 33 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | 36 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
| 37 | + ('action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied')), | ||
| 34 | ], | 38 | ], |
| 35 | options={ | 39 | options={ |
| 36 | - 'verbose_name': 'Action_Resource', | ||
| 37 | 'verbose_name_plural': 'Action_Resources', | 40 | 'verbose_name_plural': 'Action_Resources', |
| 41 | + 'verbose_name': 'Action_Resource', | ||
| 38 | }, | 42 | }, |
| 39 | ), | 43 | ), |
| 40 | migrations.CreateModel( | 44 | migrations.CreateModel( |
| @@ -42,10 +46,12 @@ class Migration(migrations.Migration): | @@ -42,10 +46,12 @@ class Migration(migrations.Migration): | ||
| 42 | fields=[ | 46 | fields=[ |
| 43 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | 47 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
| 44 | ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')), | 48 | ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')), |
| 49 | + ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')), | ||
| 50 | + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor')), | ||
| 45 | ], | 51 | ], |
| 46 | options={ | 52 | options={ |
| 47 | - 'verbose_name': 'Log', | ||
| 48 | 'verbose_name_plural': 'Logs', | 53 | 'verbose_name_plural': 'Logs', |
| 54 | + 'verbose_name': 'Log', | ||
| 49 | }, | 55 | }, |
| 50 | ), | 56 | ), |
| 51 | migrations.CreateModel( | 57 | migrations.CreateModel( |
| @@ -56,8 +62,8 @@ class Migration(migrations.Migration): | @@ -56,8 +62,8 @@ class Migration(migrations.Migration): | ||
| 56 | ('icon', models.CharField(max_length=50, unique=True, verbose_name='Icon')), | 62 | ('icon', models.CharField(max_length=50, unique=True, verbose_name='Icon')), |
| 57 | ], | 63 | ], |
| 58 | options={ | 64 | options={ |
| 59 | - 'verbose_name': 'Amadeus Mime Type', | ||
| 60 | 'verbose_name_plural': 'Amadeus Mime Types', | 65 | 'verbose_name_plural': 'Amadeus Mime Types', |
| 66 | + 'verbose_name': 'Amadeus Mime Type', | ||
| 61 | }, | 67 | }, |
| 62 | ), | 68 | ), |
| 63 | migrations.CreateModel( | 69 | migrations.CreateModel( |
| @@ -68,10 +74,12 @@ class Migration(migrations.Migration): | @@ -68,10 +74,12 @@ class Migration(migrations.Migration): | ||
| 68 | ('read', models.BooleanField(default=False, verbose_name='Read')), | 74 | ('read', models.BooleanField(default=False, verbose_name='Read')), |
| 69 | ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')), | 75 | ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')), |
| 70 | ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')), | 76 | ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')), |
| 77 | + ('actor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer')), | ||
| 78 | + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User')), | ||
| 71 | ], | 79 | ], |
| 72 | options={ | 80 | options={ |
| 73 | - 'verbose_name': 'Notification', | ||
| 74 | 'verbose_name_plural': 'Notifications', | 81 | 'verbose_name_plural': 'Notifications', |
| 82 | + 'verbose_name': 'Notification', | ||
| 75 | }, | 83 | }, |
| 76 | ), | 84 | ), |
| 77 | migrations.CreateModel( | 85 | migrations.CreateModel( |
| @@ -84,8 +92,13 @@ class Migration(migrations.Migration): | @@ -84,8 +92,13 @@ class Migration(migrations.Migration): | ||
| 84 | ('url', models.CharField(default='', max_length=100, verbose_name='URL')), | 92 | ('url', models.CharField(default='', max_length=100, verbose_name='URL')), |
| 85 | ], | 93 | ], |
| 86 | options={ | 94 | options={ |
| 87 | - 'verbose_name': 'Resource', | ||
| 88 | 'verbose_name_plural': 'Resources', | 95 | 'verbose_name_plural': 'Resources', |
| 96 | + 'verbose_name': 'Resource', | ||
| 89 | }, | 97 | }, |
| 90 | ), | 98 | ), |
| 99 | + migrations.AddField( | ||
| 100 | + model_name='action_resource', | ||
| 101 | + name='resource', | ||
| 102 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Resource', verbose_name='Resource'), | ||
| 103 | + ), | ||
| 91 | ] | 104 | ] |
core/migrations/0002_auto_20161018_1842.py
| @@ -1,50 +0,0 @@ | @@ -1,50 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | ||
| 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 | - initial = True | ||
| 13 | - | ||
| 14 | - dependencies = [ | ||
| 15 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 16 | - ('core', '0001_initial'), | ||
| 17 | - ] | ||
| 18 | - | ||
| 19 | - operations = [ | ||
| 20 | - migrations.AddField( | ||
| 21 | - model_name='notification', | ||
| 22 | - name='actor', | ||
| 23 | - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer'), | ||
| 24 | - ), | ||
| 25 | - migrations.AddField( | ||
| 26 | - model_name='notification', | ||
| 27 | - name='user', | ||
| 28 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User'), | ||
| 29 | - ), | ||
| 30 | - migrations.AddField( | ||
| 31 | - model_name='log', | ||
| 32 | - name='action_resource', | ||
| 33 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource'), | ||
| 34 | - ), | ||
| 35 | - migrations.AddField( | ||
| 36 | - model_name='log', | ||
| 37 | - name='user', | ||
| 38 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor'), | ||
| 39 | - ), | ||
| 40 | - migrations.AddField( | ||
| 41 | - model_name='action_resource', | ||
| 42 | - name='action', | ||
| 43 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied'), | ||
| 44 | - ), | ||
| 45 | - migrations.AddField( | ||
| 46 | - model_name='action_resource', | ||
| 47 | - name='resource', | ||
| 48 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Resource', verbose_name='Resource'), | ||
| 49 | - ), | ||
| 50 | - ] |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | ||
| 2 | +# Generated by Django 1.10 on 2016-10-22 04:58 | ||
| 3 | +from __future__ import unicode_literals | ||
| 4 | + | ||
| 5 | +import autoslug.fields | ||
| 6 | +from django.db import migrations | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class Migration(migrations.Migration): | ||
| 10 | + | ||
| 11 | + dependencies = [ | ||
| 12 | + ('core', '0001_initial'), | ||
| 13 | + ] | ||
| 14 | + | ||
| 15 | + operations = [ | ||
| 16 | + migrations.AlterField( | ||
| 17 | + model_name='action', | ||
| 18 | + name='slug', | ||
| 19 | + field=autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug'), | ||
| 20 | + ), | ||
| 21 | + ] |
core/mixins.py
| @@ -41,22 +41,23 @@ class LogMixin(object): | @@ -41,22 +41,23 @@ class LogMixin(object): | ||
| 41 | class NotificationMixin(object): | 41 | class NotificationMixin(object): |
| 42 | message = "" | 42 | message = "" |
| 43 | read = False | 43 | read = False |
| 44 | - action_name = '' | 44 | + action_slug = '' |
| 45 | resource_name = '' | 45 | resource_name = '' |
| 46 | 46 | ||
| 47 | - def createNotification(self, message='', actor=None, users = User.objects.all(), resource_slug='' ,action_name = '', resource_name='', resource_link=''): #the default will be a broadcast | ||
| 48 | - action = Action.objects.filter(name = action_name) | 47 | + def createNotification(self, message='', actor=None, users = User.objects.all(), resource_slug='' ,action_slug = '', |
| 48 | + resource_name='', resource_link=''): #the default will be a broadcast | ||
| 49 | + action = Action.objects.filter(slug = action_slug) | ||
| 49 | resource = Resource.objects.filter(slug = resource_slug) | 50 | resource = Resource.objects.filter(slug = resource_slug) |
| 50 | if action.exists(): | 51 | if action.exists(): |
| 51 | action = action[0] | 52 | action = action[0] |
| 52 | else: | 53 | else: |
| 53 | - action = Action(name = self.action_name) | 54 | + action = Action(name = action_slug) |
| 54 | action.save() | 55 | action.save() |
| 55 | 56 | ||
| 56 | if resource.exists(): | 57 | if resource.exists(): |
| 57 | resource = resource[0] | 58 | resource = resource[0] |
| 58 | else: | 59 | else: |
| 59 | - resource = Resource(name = self.resource_name, url= resource_link) | 60 | + resource = Resource(name = resource_name, url= resource_link) |
| 60 | resource.save() | 61 | resource.save() |
| 61 | 62 | ||
| 62 | action_resource = Action_Resource.objects.filter(action = action, resource = resource) | 63 | action_resource = Action_Resource.objects.filter(action = action, resource = resource) |
| @@ -76,3 +77,9 @@ class NotificationMixin(object): | @@ -76,3 +77,9 @@ class NotificationMixin(object): | ||
| 76 | """ | 77 | """ |
| 77 | Not quite sure how to do about it""" | 78 | Not quite sure how to do about it""" |
| 78 | return super(NotificationMixin, self).dispatch(request, *args, **kwargs) | 79 | return super(NotificationMixin, self).dispatch(request, *args, **kwargs) |
| 80 | + | ||
| 81 | + def createorRetrieveAction(self, action_name): | ||
| 82 | + action = Action.objects.filter(name=action_name) | ||
| 83 | + if action is None: | ||
| 84 | + action = Action(name=action_name) | ||
| 85 | + return action | ||
| 79 | \ No newline at end of file | 86 | \ No newline at end of file |
core/models.py
| @@ -25,6 +25,7 @@ class Action(models.Model): | @@ -25,6 +25,7 @@ class Action(models.Model): | ||
| 25 | """ | 25 | """ |
| 26 | 26 | ||
| 27 | name = models.CharField(_('Name'), max_length = 100) | 27 | name = models.CharField(_('Name'), max_length = 100) |
| 28 | + slug = AutoSlugField(_("Slug"), populate_from=('name'), unique=True) | ||
| 28 | created_date = models.DateField(_('Created Date'), auto_now_add=True) | 29 | created_date = models.DateField(_('Created Date'), auto_now_add=True) |
| 29 | 30 | ||
| 30 | class Meta: | 31 | class Meta: |
| @@ -84,7 +85,7 @@ class Notification(models.Model): | @@ -84,7 +85,7 @@ class Notification(models.Model): | ||
| 84 | @action_resource: The Object that holds the information about which action was perfomed on the Resource | 85 | @action_resource: The Object that holds the information about which action was perfomed on the Resource |
| 85 | @actor: The user who applied the action | 86 | @actor: The user who applied the action |
| 86 | """ | 87 | """ |
| 87 | - | 88 | + |
| 88 | message = models.TextField(_('Message')) | 89 | message = models.TextField(_('Message')) |
| 89 | user = models.ForeignKey(User, related_name = _('%(class)s_Actor'), verbose_name= _('User')) | 90 | user = models.ForeignKey(User, related_name = _('%(class)s_Actor'), verbose_name= _('User')) |
| 90 | read = models.BooleanField(_('Read'), default = False) | 91 | read = models.BooleanField(_('Read'), default = False) |
core/static/css/base/amadeus.css
core/templates/notifications.html
| @@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
| 6 | <a href="{% url 'core:notification_read' notification.id %}"><div class="list-group-item"> | 6 | <a href="{% url 'core:notification_read' notification.id %}"><div class="list-group-item"> |
| 7 | <div class="row-picture"> | 7 | <div class="row-picture"> |
| 8 | <img class="circle" src="http://lorempixel.com/56/56/people/1" alt="icon"> | 8 | <img class="circle" src="http://lorempixel.com/56/56/people/1" alt="icon"> |
| 9 | - <div class="least-content pull-right">{{ notification.datetime }}</div> | 9 | + <div class="least-content ">{{ notification.datetime }}</div> |
| 10 | </div> | 10 | </div> |
| 11 | <div class="row-content"> | 11 | <div class="row-content"> |
| 12 | <p class="list-group-item-text">{{ notification.message }}</p> | 12 | <p class="list-group-item-text">{{ notification.message }}</p> |
core/views.py
| @@ -68,7 +68,6 @@ def remember_password(request): | @@ -68,7 +68,6 @@ def remember_password(request): | ||
| 68 | context['danger'] = 'E-mail does not send' | 68 | context['danger'] = 'E-mail does not send' |
| 69 | return render(request, "remember_password.html",context) | 69 | return render(request, "remember_password.html",context) |
| 70 | 70 | ||
| 71 | -@notification_decorator(message='just connected') | ||
| 72 | @log_decorator('Acessar', 'Sistema') | 71 | @log_decorator('Acessar', 'Sistema') |
| 73 | def login(request): | 72 | def login(request): |
| 74 | context = {} | 73 | context = {} |
courses/locale/pt_BR/LC_MESSAGES/django.po
| @@ -30,11 +30,11 @@ msgstr "" | @@ -30,11 +30,11 @@ msgstr "" | ||
| 30 | 30 | ||
| 31 | #: courses/forms.py:26 | 31 | #: courses/forms.py:26 |
| 32 | msgid "Objectives" | 32 | msgid "Objectives" |
| 33 | -msgstr "" | 33 | +msgstr "Objetivos" |
| 34 | 34 | ||
| 35 | #: courses/forms.py:27 courses/models.py:23 | 35 | #: courses/forms.py:27 courses/models.py:23 |
| 36 | msgid "Content" | 36 | msgid "Content" |
| 37 | -msgstr "" | 37 | +msgstr "Conteúdo" |
| 38 | 38 | ||
| 39 | #: courses/forms.py:28 | 39 | #: courses/forms.py:28 |
| 40 | msgid "Number of studets maximum" | 40 | msgid "Number of studets maximum" |
| @@ -42,11 +42,11 @@ msgstr "Número máximo de estudantes" | @@ -42,11 +42,11 @@ msgstr "Número máximo de estudantes" | ||
| 42 | 42 | ||
| 43 | #: courses/forms.py:29 | 43 | #: courses/forms.py:29 |
| 44 | msgid "Course registration start date" | 44 | msgid "Course registration start date" |
| 45 | -msgstr "" | 45 | +msgstr "Início das inscrições" |
| 46 | 46 | ||
| 47 | #: courses/forms.py:30 | 47 | #: courses/forms.py:30 |
| 48 | msgid "Course registration end date" | 48 | msgid "Course registration end date" |
| 49 | -msgstr "" | 49 | +msgstr "Fim da Inscrições" |
| 50 | 50 | ||
| 51 | #: courses/forms.py:31 | 51 | #: courses/forms.py:31 |
| 52 | msgid "Course start date" | 52 | msgid "Course start date" |
| @@ -66,59 +66,59 @@ msgstr "Categoria" | @@ -66,59 +66,59 @@ msgstr "Categoria" | ||
| 66 | 66 | ||
| 67 | #: courses/forms.py:37 | 67 | #: courses/forms.py:37 |
| 68 | msgid "Course name" | 68 | msgid "Course name" |
| 69 | -msgstr "" | 69 | +msgstr "Nome do Curso" |
| 70 | 70 | ||
| 71 | #: courses/forms.py:38 | 71 | #: courses/forms.py:38 |
| 72 | msgid "Course objective" | 72 | msgid "Course objective" |
| 73 | -msgstr "" | 73 | +msgstr "Objetivo do Curso" |
| 74 | 74 | ||
| 75 | #: courses/forms.py:39 | 75 | #: courses/forms.py:39 |
| 76 | msgid "Course modules" | 76 | msgid "Course modules" |
| 77 | -msgstr "" | 77 | +msgstr "Ḿódulos do curso" |
| 78 | 78 | ||
| 79 | #: courses/forms.py:40 | 79 | #: courses/forms.py:40 |
| 80 | msgid "Max number of students that a class can have" | 80 | msgid "Max number of students that a class can have" |
| 81 | -msgstr "" | 81 | +msgstr "Número máximo de estudantes que uma classe pode ter" |
| 82 | 82 | ||
| 83 | #: courses/forms.py:41 | 83 | #: courses/forms.py:41 |
| 84 | msgid "Date that starts the registration period of the course (dd/mm/yyyy)" | 84 | msgid "Date that starts the registration period of the course (dd/mm/yyyy)" |
| 85 | -msgstr "" | 85 | +msgstr "Data do começo do período de inscrição do curso (dia/mês/ano)" |
| 86 | 86 | ||
| 87 | #: courses/forms.py:42 | 87 | #: courses/forms.py:42 |
| 88 | msgid "Date that ends the registration period of the course (dd/mm/yyyy)" | 88 | msgid "Date that ends the registration period of the course (dd/mm/yyyy)" |
| 89 | -msgstr "" | 89 | +msgstr "Data do termino do período de inscrição do curso (dia/mês/ano)" |
| 90 | 90 | ||
| 91 | #: courses/forms.py:43 | 91 | #: courses/forms.py:43 |
| 92 | msgid "Date that the course starts (dd/mm/yyyy)" | 92 | msgid "Date that the course starts (dd/mm/yyyy)" |
| 93 | -msgstr "" | 93 | +msgstr "Data que o curso começa (dia/mês/ano)" |
| 94 | 94 | ||
| 95 | #: courses/forms.py:44 | 95 | #: courses/forms.py:44 |
| 96 | msgid "Date that the course ends (dd/mm/yyyy)" | 96 | msgid "Date that the course ends (dd/mm/yyyy)" |
| 97 | -msgstr "" | 97 | +msgstr "Data que o curso termina (dia/mês/ano)" |
| 98 | 98 | ||
| 99 | #: courses/forms.py:45 | 99 | #: courses/forms.py:45 |
| 100 | msgid "Representative image of the course" | 100 | msgid "Representative image of the course" |
| 101 | -msgstr "" | 101 | +msgstr "Imagem representativa do curso" |
| 102 | 102 | ||
| 103 | #: courses/forms.py:46 | 103 | #: courses/forms.py:46 |
| 104 | msgid "Category which the course belongs" | 104 | msgid "Category which the course belongs" |
| 105 | -msgstr "" | 105 | +msgstr "Categoria ao qual o curso pertence" |
| 106 | 106 | ||
| 107 | #: courses/forms.py:59 courses/models.py:46 | 107 | #: courses/forms.py:59 courses/models.py:46 |
| 108 | msgid "Description" | 108 | msgid "Description" |
| 109 | -msgstr "" | 109 | +msgstr "Descrição" |
| 110 | 110 | ||
| 111 | #: courses/forms.py:60 | 111 | #: courses/forms.py:60 |
| 112 | msgid "Is it visible?" | 112 | msgid "Is it visible?" |
| 113 | -msgstr "" | 113 | +msgstr "Visível?" |
| 114 | 114 | ||
| 115 | #: courses/forms.py:63 | 115 | #: courses/forms.py:63 |
| 116 | msgid "Module's name" | 116 | msgid "Module's name" |
| 117 | -msgstr "" | 117 | +msgstr "nome do módulo" |
| 118 | 118 | ||
| 119 | #: courses/forms.py:64 | 119 | #: courses/forms.py:64 |
| 120 | msgid "Modules's description" | 120 | msgid "Modules's description" |
| 121 | -msgstr "" | 121 | +msgstr "descrição do módulo" |
| 122 | 122 | ||
| 123 | #: courses/forms.py:65 | 123 | #: courses/forms.py:65 |
| 124 | msgid "Is the module visible?" | 124 | msgid "Is the module visible?" |
| @@ -147,7 +147,7 @@ msgstr "" | @@ -147,7 +147,7 @@ msgstr "" | ||
| 147 | 147 | ||
| 148 | #: courses/models.py:24 | 148 | #: courses/models.py:24 |
| 149 | msgid "Maximum Students" | 149 | msgid "Maximum Students" |
| 150 | -msgstr "" | 150 | +msgstr "Quantidade máximo de estudantes" |
| 151 | 151 | ||
| 152 | #: courses/models.py:26 | 152 | #: courses/models.py:26 |
| 153 | msgid "Register Date (Begin)" | 153 | msgid "Register Date (Begin)" |
courses/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:32 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | import autoslug.fields | 5 | import autoslug.fields |
| 6 | +from django.conf import settings | ||
| 6 | from django.db import migrations, models | 7 | from django.db import migrations, models |
| 7 | import django.db.models.deletion | 8 | import django.db.models.deletion |
| 8 | import s3direct.fields | 9 | import s3direct.fields |
| @@ -14,6 +15,7 @@ class Migration(migrations.Migration): | @@ -14,6 +15,7 @@ class Migration(migrations.Migration): | ||
| 14 | 15 | ||
| 15 | dependencies = [ | 16 | dependencies = [ |
| 16 | ('core', '0001_initial'), | 17 | ('core', '0001_initial'), |
| 18 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 17 | ] | 19 | ] |
| 18 | 20 | ||
| 19 | operations = [ | 21 | operations = [ |
| @@ -23,6 +25,7 @@ class Migration(migrations.Migration): | @@ -23,6 +25,7 @@ class Migration(migrations.Migration): | ||
| 23 | ('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 | ('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 | ('limit_date', models.DateField(verbose_name='Deliver Date')), | 26 | ('limit_date', models.DateField(verbose_name='Deliver Date')), |
| 25 | ('all_students', models.BooleanField(default=False, verbose_name='All Students')), | 27 | ('all_students', models.BooleanField(default=False, verbose_name='All Students')), |
| 28 | + ('students', models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students')), | ||
| 26 | ], | 29 | ], |
| 27 | bases=('core.resource',), | 30 | bases=('core.resource',), |
| 28 | ), | 31 | ), |
| @@ -32,10 +35,11 @@ class Migration(migrations.Migration): | @@ -32,10 +35,11 @@ class Migration(migrations.Migration): | ||
| 32 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | 35 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
| 33 | ('pdf', s3direct.fields.S3DirectField()), | 36 | ('pdf', s3direct.fields.S3DirectField()), |
| 34 | ('name', models.CharField(max_length=100)), | 37 | ('name', models.CharField(max_length=100)), |
| 38 | + ('diet', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity')), | ||
| 35 | ], | 39 | ], |
| 36 | options={ | 40 | options={ |
| 37 | - 'verbose_name': 'Activity File', | ||
| 38 | 'verbose_name_plural': 'Activitys Files', | 41 | 'verbose_name_plural': 'Activitys Files', |
| 42 | + 'verbose_name': 'Activity File', | ||
| 39 | }, | 43 | }, |
| 40 | ), | 44 | ), |
| 41 | migrations.CreateModel( | 45 | migrations.CreateModel( |
| @@ -47,8 +51,8 @@ class Migration(migrations.Migration): | @@ -47,8 +51,8 @@ class Migration(migrations.Migration): | ||
| 47 | ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')), | 51 | ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')), |
| 48 | ], | 52 | ], |
| 49 | options={ | 53 | options={ |
| 50 | - 'verbose_name': 'Category', | ||
| 51 | 'verbose_name_plural': 'Categories', | 54 | 'verbose_name_plural': 'Categories', |
| 55 | + 'verbose_name': 'Category', | ||
| 52 | }, | 56 | }, |
| 53 | ), | 57 | ), |
| 54 | migrations.CreateModel( | 58 | migrations.CreateModel( |
| @@ -66,11 +70,12 @@ class Migration(migrations.Migration): | @@ -66,11 +70,12 @@ class Migration(migrations.Migration): | ||
| 66 | ('init_date', models.DateField(verbose_name='Begin of Course Date')), | 70 | ('init_date', models.DateField(verbose_name='Begin of Course Date')), |
| 67 | ('end_date', models.DateField(verbose_name='End of Course Date')), | 71 | ('end_date', models.DateField(verbose_name='End of Course Date')), |
| 68 | ('image', models.ImageField(blank=True, upload_to='courses/', verbose_name='Image')), | 72 | ('image', models.ImageField(blank=True, upload_to='courses/', verbose_name='Image')), |
| 73 | + ('public', models.BooleanField(verbose_name='Public')), | ||
| 69 | ], | 74 | ], |
| 70 | options={ | 75 | options={ |
| 71 | - 'ordering': ('create_date', 'name'), | ||
| 72 | - 'verbose_name': 'Course', | ||
| 73 | 'verbose_name_plural': 'Courses', | 76 | 'verbose_name_plural': 'Courses', |
| 77 | + 'verbose_name': 'Course', | ||
| 78 | + 'ordering': ('create_date', 'name'), | ||
| 74 | }, | 79 | }, |
| 75 | ), | 80 | ), |
| 76 | migrations.CreateModel( | 81 | migrations.CreateModel( |
| @@ -82,8 +87,8 @@ class Migration(migrations.Migration): | @@ -82,8 +87,8 @@ class Migration(migrations.Migration): | ||
| 82 | ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')), | 87 | ('create_date', models.DateField(auto_now_add=True, verbose_name='Creation Date')), |
| 83 | ], | 88 | ], |
| 84 | options={ | 89 | options={ |
| 85 | - 'verbose_name': 'Category', | ||
| 86 | 'verbose_name_plural': 'Categories', | 90 | 'verbose_name_plural': 'Categories', |
| 91 | + 'verbose_name': 'Category', | ||
| 87 | }, | 92 | }, |
| 88 | ), | 93 | ), |
| 89 | migrations.CreateModel( | 94 | migrations.CreateModel( |
| @@ -108,6 +113,7 @@ class Migration(migrations.Migration): | @@ -108,6 +113,7 @@ class Migration(migrations.Migration): | ||
| 108 | fields=[ | 113 | fields=[ |
| 109 | ('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')), | 114 | ('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')), |
| 110 | ('all_students', models.BooleanField(default=False, verbose_name='All Students')), | 115 | ('all_students', models.BooleanField(default=False, verbose_name='All Students')), |
| 116 | + ('students', models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students')), | ||
| 111 | ], | 117 | ], |
| 112 | bases=('core.resource',), | 118 | bases=('core.resource',), |
| 113 | ), | 119 | ), |
| @@ -123,11 +129,15 @@ class Migration(migrations.Migration): | @@ -123,11 +129,15 @@ class Migration(migrations.Migration): | ||
| 123 | ('end_date', models.DateField(verbose_name='End of Subject Date')), | 129 | ('end_date', models.DateField(verbose_name='End of Subject Date')), |
| 124 | ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), | 130 | ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), |
| 125 | ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')), | 131 | ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')), |
| 132 | + ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subject_category', to='courses.CategorySubject', verbose_name='Category')), | ||
| 133 | + ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course')), | ||
| 134 | + ('professors', models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors')), | ||
| 135 | + ('students', models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students')), | ||
| 126 | ], | 136 | ], |
| 127 | options={ | 137 | options={ |
| 128 | - 'ordering': ('create_date', 'name'), | ||
| 129 | - 'verbose_name': 'Subject', | ||
| 130 | 'verbose_name_plural': 'Subjects', | 138 | 'verbose_name_plural': 'Subjects', |
| 139 | + 'verbose_name': 'Subject', | ||
| 140 | + 'ordering': ('create_date', 'name'), | ||
| 131 | }, | 141 | }, |
| 132 | ), | 142 | ), |
| 133 | migrations.CreateModel( | 143 | migrations.CreateModel( |
| @@ -137,10 +147,11 @@ class Migration(migrations.Migration): | @@ -137,10 +147,11 @@ class Migration(migrations.Migration): | ||
| 137 | ('name', models.CharField(max_length=100, verbose_name='Name')), | 147 | ('name', models.CharField(max_length=100, verbose_name='Name')), |
| 138 | ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')), | 148 | ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')), |
| 139 | ('description', models.TextField(blank=True, verbose_name='Description')), | 149 | ('description', models.TextField(blank=True, verbose_name='Description')), |
| 150 | + ('subjects', models.ManyToManyField(to='courses.Subject')), | ||
| 140 | ], | 151 | ], |
| 141 | options={ | 152 | options={ |
| 142 | - 'verbose_name': 'subject category', | ||
| 143 | 'verbose_name_plural': 'subject categories', | 153 | 'verbose_name_plural': 'subject categories', |
| 154 | + 'verbose_name': 'subject category', | ||
| 144 | }, | 155 | }, |
| 145 | ), | 156 | ), |
| 146 | migrations.CreateModel( | 157 | migrations.CreateModel( |
| @@ -153,11 +164,48 @@ class Migration(migrations.Migration): | @@ -153,11 +164,48 @@ class Migration(migrations.Migration): | ||
| 153 | ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), | 164 | ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), |
| 154 | ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')), | 165 | ('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')), |
| 155 | ('visible', models.BooleanField(default=False, verbose_name='Visible')), | 166 | ('visible', models.BooleanField(default=False, verbose_name='Visible')), |
| 167 | + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Owner')), | ||
| 168 | + ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')), | ||
| 156 | ], | 169 | ], |
| 157 | options={ | 170 | options={ |
| 158 | - 'ordering': ('create_date', 'name'), | ||
| 159 | - 'verbose_name': 'Topic', | ||
| 160 | 'verbose_name_plural': 'Topics', | 171 | 'verbose_name_plural': 'Topics', |
| 172 | + 'verbose_name': 'Topic', | ||
| 173 | + 'ordering': ('create_date', 'name'), | ||
| 161 | }, | 174 | }, |
| 162 | ), | 175 | ), |
| 176 | + migrations.AddField( | ||
| 177 | + model_name='material', | ||
| 178 | + name='topic', | ||
| 179 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'), | ||
| 180 | + ), | ||
| 181 | + migrations.AddField( | ||
| 182 | + model_name='linkmaterial', | ||
| 183 | + name='material', | ||
| 184 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'), | ||
| 185 | + ), | ||
| 186 | + migrations.AddField( | ||
| 187 | + model_name='filematerial', | ||
| 188 | + name='material', | ||
| 189 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'), | ||
| 190 | + ), | ||
| 191 | + migrations.AddField( | ||
| 192 | + model_name='course', | ||
| 193 | + name='category', | ||
| 194 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'), | ||
| 195 | + ), | ||
| 196 | + migrations.AddField( | ||
| 197 | + model_name='course', | ||
| 198 | + name='professors', | ||
| 199 | + field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'), | ||
| 200 | + ), | ||
| 201 | + migrations.AddField( | ||
| 202 | + model_name='course', | ||
| 203 | + name='students', | ||
| 204 | + field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 205 | + ), | ||
| 206 | + migrations.AddField( | ||
| 207 | + model_name='activity', | ||
| 208 | + name='topic', | ||
| 209 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'), | ||
| 210 | + ), | ||
| 163 | ] | 211 | ] |
courses/migrations/0002_auto_20161018_1842.py
| @@ -1,105 +0,0 @@ | @@ -1,105 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | ||
| 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 | - initial = True | ||
| 13 | - | ||
| 14 | - dependencies = [ | ||
| 15 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 16 | - ('courses', '0001_initial'), | ||
| 17 | - ] | ||
| 18 | - | ||
| 19 | - operations = [ | ||
| 20 | - migrations.AddField( | ||
| 21 | - model_name='topic', | ||
| 22 | - name='owner', | ||
| 23 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Owner'), | ||
| 24 | - ), | ||
| 25 | - migrations.AddField( | ||
| 26 | - model_name='topic', | ||
| 27 | - name='subject', | ||
| 28 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject'), | ||
| 29 | - ), | ||
| 30 | - migrations.AddField( | ||
| 31 | - model_name='subjectcategory', | ||
| 32 | - name='subjects', | ||
| 33 | - field=models.ManyToManyField(to='courses.Subject'), | ||
| 34 | - ), | ||
| 35 | - migrations.AddField( | ||
| 36 | - model_name='subject', | ||
| 37 | - name='category', | ||
| 38 | - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subject_category', to='courses.CategorySubject', verbose_name='Category'), | ||
| 39 | - ), | ||
| 40 | - migrations.AddField( | ||
| 41 | - model_name='subject', | ||
| 42 | - name='course', | ||
| 43 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course'), | ||
| 44 | - ), | ||
| 45 | - migrations.AddField( | ||
| 46 | - model_name='subject', | ||
| 47 | - name='professors', | ||
| 48 | - field=models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors'), | ||
| 49 | - ), | ||
| 50 | - migrations.AddField( | ||
| 51 | - model_name='subject', | ||
| 52 | - name='students', | ||
| 53 | - field=models.ManyToManyField(related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 54 | - ), | ||
| 55 | - migrations.AddField( | ||
| 56 | - model_name='material', | ||
| 57 | - name='students', | ||
| 58 | - field=models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 59 | - ), | ||
| 60 | - migrations.AddField( | ||
| 61 | - model_name='material', | ||
| 62 | - name='topic', | ||
| 63 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'), | ||
| 64 | - ), | ||
| 65 | - migrations.AddField( | ||
| 66 | - model_name='linkmaterial', | ||
| 67 | - name='material', | ||
| 68 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'), | ||
| 69 | - ), | ||
| 70 | - migrations.AddField( | ||
| 71 | - model_name='filematerial', | ||
| 72 | - name='material', | ||
| 73 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'), | ||
| 74 | - ), | ||
| 75 | - migrations.AddField( | ||
| 76 | - model_name='course', | ||
| 77 | - name='category', | ||
| 78 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'), | ||
| 79 | - ), | ||
| 80 | - migrations.AddField( | ||
| 81 | - model_name='course', | ||
| 82 | - name='professors', | ||
| 83 | - field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'), | ||
| 84 | - ), | ||
| 85 | - migrations.AddField( | ||
| 86 | - model_name='course', | ||
| 87 | - name='students', | ||
| 88 | - field=models.ManyToManyField(related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 89 | - ), | ||
| 90 | - migrations.AddField( | ||
| 91 | - model_name='activityfile', | ||
| 92 | - name='diet', | ||
| 93 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity'), | ||
| 94 | - ), | ||
| 95 | - migrations.AddField( | ||
| 96 | - model_name='activity', | ||
| 97 | - name='students', | ||
| 98 | - field=models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 99 | - ), | ||
| 100 | - migrations.AddField( | ||
| 101 | - model_name='activity', | ||
| 102 | - name='topic', | ||
| 103 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'), | ||
| 104 | - ), | ||
| 105 | - ] |
courses/migrations/0003_course_public.py
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-19 13:19 | ||
| 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 | - ('courses', '0002_auto_20161018_1842'), | ||
| 12 | - ] | ||
| 13 | - | ||
| 14 | - operations = [ | ||
| 15 | - migrations.AddField( | ||
| 16 | - model_name='course', | ||
| 17 | - name='public', | ||
| 18 | - field=models.BooleanField(default=False, verbose_name='Public'), | ||
| 19 | - preserve_default=False, | ||
| 20 | - ), | ||
| 21 | - ] |
courses/migrations/0004_auto_20161020_1808.py
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-20 21:08 | ||
| 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 | - ('courses', '0003_course_public'), | ||
| 13 | - ] | ||
| 14 | - | ||
| 15 | - operations = [ | ||
| 16 | - migrations.AlterField( | ||
| 17 | - model_name='course', | ||
| 18 | - name='students', | ||
| 19 | - field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 20 | - ), | ||
| 21 | - ] |
courses/migrations/0005_auto_20161021_1749.py
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-21 20:49 | ||
| 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 | - ('courses', '0004_auto_20161020_1808'), | ||
| 13 | - ] | ||
| 14 | - | ||
| 15 | - operations = [ | ||
| 16 | - migrations.AlterField( | ||
| 17 | - model_name='subject', | ||
| 18 | - name='students', | ||
| 19 | - field=models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
| 20 | - ), | ||
| 21 | - ] |
courses/models.py
| @@ -7,6 +7,7 @@ from core.models import Resource, MimeType | @@ -7,6 +7,7 @@ from core.models import Resource, MimeType | ||
| 7 | from s3direct.fields import S3DirectField | 7 | from s3direct.fields import S3DirectField |
| 8 | 8 | ||
| 9 | from django.core.urlresolvers import reverse | 9 | from django.core.urlresolvers import reverse |
| 10 | +from core.models import Resource | ||
| 10 | 11 | ||
| 11 | class CourseCategory(models.Model): | 12 | class CourseCategory(models.Model): |
| 12 | 13 |
courses/static/js/course.js
| 1 | /* | 1 | /* |
| 2 | * | 2 | * |
| 3 | +* Function to get a cookie stored on browser | ||
| 4 | +* | ||
| 5 | +*/ | ||
| 6 | +function getCookie(name) { | ||
| 7 | + var cookieValue = null; | ||
| 8 | + if (document.cookie && document.cookie !== '') { | ||
| 9 | + var cookies = document.cookie.split(';'); | ||
| 10 | + for (var i = 0; i < cookies.length; i++) { | ||
| 11 | + var cookie = jQuery.trim(cookies[i]); | ||
| 12 | + // Does this cookie string begin with the name we want? | ||
| 13 | + if (cookie.substring(0, name.length + 1) === (name + '=')) { | ||
| 14 | + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); | ||
| 15 | + break; | ||
| 16 | + } | ||
| 17 | + } | ||
| 18 | + } | ||
| 19 | + return cookieValue; | ||
| 20 | +} | ||
| 21 | +/* | ||
| 22 | +* | ||
| 3 | * Function to subscribe (works for courses and subjects) | 23 | * Function to subscribe (works for courses and subjects) |
| 4 | * | 24 | * |
| 5 | */ | 25 | */ |
| @@ -19,4 +39,28 @@ function subscribe(elem, url, id, confirm_message) { | @@ -19,4 +39,28 @@ function subscribe(elem, url, id, confirm_message) { | ||
| 19 | } | 39 | } |
| 20 | }); | 40 | }); |
| 21 | }); | 41 | }); |
| 42 | +} | ||
| 43 | + | ||
| 44 | +/* | ||
| 45 | +* | ||
| 46 | +* Function to delete a course | ||
| 47 | +* | ||
| 48 | +*/ | ||
| 49 | +function delete_course(url, course, message, return_url) { | ||
| 50 | + alertify.confirm(message, function(){ | ||
| 51 | + var csrftoken = getCookie('csrftoken'); | ||
| 52 | + | ||
| 53 | + $.ajax({ | ||
| 54 | + method: 'post', | ||
| 55 | + beforeSend: function (request) { | ||
| 56 | + request.setRequestHeader('X-CSRFToken', csrftoken); | ||
| 57 | + }, | ||
| 58 | + url: url, | ||
| 59 | + success: function(data) { | ||
| 60 | + alertify.alert('Remove Course', 'Course removed successfully!', function(){ | ||
| 61 | + window.location.href = return_url; | ||
| 62 | + }); | ||
| 63 | + } | ||
| 64 | + }); | ||
| 65 | + }); | ||
| 22 | } | 66 | } |
| 23 | \ No newline at end of file | 67 | \ No newline at end of file |
courses/templates/category/index.html
| @@ -80,7 +80,6 @@ | @@ -80,7 +80,6 @@ | ||
| 80 | <td>{{ category }}</td> | 80 | <td>{{ category }}</td> |
| 81 | <td>{{ category.slug }}</td> | 81 | <td>{{ category.slug }}</td> |
| 82 | <td class="text-center"> | 82 | <td class="text-center"> |
| 83 | - <a href="{% url 'course:view_cat' category.slug %}" class="btn btn-info btn-sm"><span class="glyphicon glyphicon-eye-open"></span></a> | ||
| 84 | <a href="{% url 'course:update_cat' category.slug %}" class="btn btn-primary btn-sm"><span class="glyphicon glyphicon-edit"></span></a> | 83 | <a href="{% url 'course:update_cat' category.slug %}" class="btn btn-primary btn-sm"><span class="glyphicon glyphicon-edit"></span></a> |
| 85 | <a href="javascript:modal.get('{% url 'course:delete_cat' category.slug %}','#category','#modal_category');" class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></a> | 84 | <a href="javascript:modal.get('{% url 'course:delete_cat' category.slug %}','#category','#modal_category');" class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></a> |
| 86 | </td> | 85 | </td> |
courses/templates/category/view.html
| @@ -1,69 +0,0 @@ | @@ -1,69 +0,0 @@ | ||
| 1 | -{% extends 'base.html' %} | ||
| 2 | - | ||
| 3 | -{% load static i18n permission_tags %} | ||
| 4 | -{% load widget_tweaks %} | ||
| 5 | -{% load static i18n %} | ||
| 6 | - | ||
| 7 | - | ||
| 8 | -{% block breadcrumbs %} | ||
| 9 | - <ol class="breadcrumb"> | ||
| 10 | - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | ||
| 11 | - <li class="active">{{ category }}</li> | ||
| 12 | - </ol> | ||
| 13 | -{% endblock %} | ||
| 14 | - | ||
| 15 | -{% block sidebar %} | ||
| 16 | - <div class="panel panel-primary navigation"> | ||
| 17 | - <div class="panel-heading"> | ||
| 18 | - <h5>{% trans 'Menu' %}</h5> | ||
| 19 | - </div> | ||
| 20 | - <div class="panel-body"> | ||
| 21 | - <ul class="nav nav-pills nav-stacked"> | ||
| 22 | - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | ||
| 23 | - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | ||
| 24 | - </ul> | ||
| 25 | - </div> | ||
| 26 | - </div> | ||
| 27 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
| 28 | - | ||
| 29 | - <div class="panel panel-primary navigation"> | ||
| 30 | - <div class="panel-heading"> | ||
| 31 | - <h3 class="panel-title">Actions</h3> | ||
| 32 | - </div> | ||
| 33 | - <div class="panel-body"> | ||
| 34 | - <ul class="nav nav-pills nav-stacked"> | ||
| 35 | - <li><a href="javascript:void(0)">Replicate Course</a></li> | ||
| 36 | - <li><a href="{% url 'course:create' %}">Create Course</a></li> | ||
| 37 | - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
| 38 | - </ul> | ||
| 39 | - </div> | ||
| 40 | - </div> | ||
| 41 | - | ||
| 42 | - <div class="panel panel-primary navigation"> | ||
| 43 | - <div class="panel-heading"> | ||
| 44 | - <h3 class="panel-title">Category</h3> | ||
| 45 | - </div> | ||
| 46 | - <div class="panel-body"> | ||
| 47 | - <ul class="nav nav-pills nav-stacked"> | ||
| 48 | - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
| 49 | - <li><a href="{% url 'course:manage_cat' %}">List Category</a></li> | ||
| 50 | - <li><a href="{% url 'course:delete_cat' category.slug %}">Remove Category</a></li> | ||
| 51 | - <li><a href="{% url 'course:update_cat' category.slug %}">Update Category</a></li> | ||
| 52 | - </ul> | ||
| 53 | - </div> | ||
| 54 | - </div> | ||
| 55 | - {% endif %} | ||
| 56 | -{% endblock %} | ||
| 57 | - | ||
| 58 | -{% block content %} | ||
| 59 | - <div class="card card-content"> | ||
| 60 | - <div class="card-body"> | ||
| 61 | - <div class="row"> | ||
| 62 | - <div class="col-sm-12"> | ||
| 63 | - <p><b>{% trans 'Name:' %} </b> {{ category }}</p> | ||
| 64 | - <p><b>{% trans 'Slug:' %} </b> {{ category.slug }}</p> | ||
| 65 | - </div> | ||
| 66 | - </div> | ||
| 67 | - </div> | ||
| 68 | - </div> | ||
| 69 | -{% endblock %} |
| @@ -0,0 +1,44 @@ | @@ -0,0 +1,44 @@ | ||
| 1 | +{% load static i18n permission_tags %} | ||
| 2 | +{% load django_bootstrap_breadcrumbs %} | ||
| 3 | + | ||
| 4 | +<div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> | ||
| 5 | + <div class="group"> | ||
| 6 | + <div class="panel panel-info"> | ||
| 7 | + <div class="panel-heading" role="tab"> | ||
| 8 | + <div class="row"> | ||
| 9 | + <div class="col-xs-9 col-md-10 titleTopic"> | ||
| 10 | + <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed"> | ||
| 11 | + <h4 style="color:white">{{course.name}}</h4> | ||
| 12 | + </a> | ||
| 13 | + </div> | ||
| 14 | + {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
| 15 | + <div class="col-xs-4 col-md-2" id="divMoreActions"> | ||
| 16 | + <div class="btn-group"> | ||
| 17 | + <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
| 18 | + <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
| 19 | + </button> | ||
| 20 | + <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
| 21 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li> | ||
| 22 | + <li><a href="javascript:delete_course('{% url 'course:delete' course.slug %}', '{{ course.slug }}', '{% trans "Are you sure you want to delete this course?" %}', '{% url 'course:manage' %}')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>{% trans 'Remove' %}</a></li> | ||
| 23 | + </ul> | ||
| 24 | + </div> | ||
| 25 | + </div> | ||
| 26 | + {% endif %} | ||
| 27 | + </div> | ||
| 28 | + </div> | ||
| 29 | + <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0"> | ||
| 30 | + <div class="panel-body"> | ||
| 31 | + <p><b>Course Name: </b>{{course.name}}</p> | ||
| 32 | + <p><b>Coordinator: </b>{{course.professors.all.0}}</p> | ||
| 33 | + <p> | ||
| 34 | + <b>Description:</b> | ||
| 35 | + <i> | ||
| 36 | + {{course.content}} | ||
| 37 | + </i> | ||
| 38 | + </p> | ||
| 39 | + <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">{% trans 'View Course' %}<div class="ripple-container"></div></a> | ||
| 40 | + </div> | ||
| 41 | + </div> | ||
| 42 | + </div> | ||
| 43 | + </div> | ||
| 44 | + </div> | ||
| 0 | \ No newline at end of file | 45 | \ No newline at end of file |
courses/templates/course/index.html
| @@ -90,121 +90,19 @@ | @@ -90,121 +90,19 @@ | ||
| 90 | {% if courses|length > 0 %} | 90 | {% if courses|length > 0 %} |
| 91 | {% if request.GET.category == 'all' or none or request.GET.category == '' %} | 91 | {% if request.GET.category == 'all' or none or request.GET.category == '' %} |
| 92 | {% for course in list_courses %} | 92 | {% for course in list_courses %} |
| 93 | - <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> | ||
| 94 | - <div class="group"> | ||
| 95 | - <div class="panel panel-info"> | ||
| 96 | - <div class="panel-heading" role="tab"> | ||
| 97 | - <div class="row"> | ||
| 98 | - <div class="col-xs-9 col-md-10 titleTopic"> | ||
| 99 | - <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed"> | ||
| 100 | - <h4 style="color:white">{{course.name}}</h4> | ||
| 101 | - </a> | ||
| 102 | - </div> | ||
| 103 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
| 104 | - <div class="col-xs-4 col-md-2" id="divMoreActions"> | ||
| 105 | - <div class="btn-group"> | ||
| 106 | - <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
| 107 | - <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
| 108 | - </button> | ||
| 109 | - <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
| 110 | - <li><a href="" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
| 111 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeCourse"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
| 112 | - </ul> | ||
| 113 | - </div> | ||
| 114 | - </div> | ||
| 115 | - {% endif %} | ||
| 116 | - </div> | ||
| 117 | - </div> | ||
| 118 | - <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0"> | ||
| 119 | - <div class="panel-body"> | ||
| 120 | - <p><b>Course Name: </b>{{course.name}}</p> | ||
| 121 | - <p><b>Duration (in semesters): </b>09</p> | ||
| 122 | - <p><b>Coordinator: </b>{{course.professors}}</p> | ||
| 123 | - <p> | ||
| 124 | - <b>Description:</b> | ||
| 125 | - <i> | ||
| 126 | - {{course.description}} | ||
| 127 | - </i> | ||
| 128 | - </p> | ||
| 129 | - <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">{% trans 'View Course' %}<div class="ripple-container"></div></a> | ||
| 130 | - </div> | ||
| 131 | - </div> | ||
| 132 | - </div> | ||
| 133 | - </div> | ||
| 134 | - </div> | 93 | + {% include "course/course_card.html" %} |
| 135 | {% endfor %} | 94 | {% endfor %} |
| 136 | {% else %} | 95 | {% else %} |
| 137 | {% for course in courses_category %} | 96 | {% for course in courses_category %} |
| 138 | {% if course.category.name == request.GET.category %} | 97 | {% if course.category.name == request.GET.category %} |
| 139 | <!-- Put your content here! --> | 98 | <!-- Put your content here! --> |
| 140 | - <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> | ||
| 141 | - <div class="group"> | ||
| 142 | - <div class="panel panel-info"> | ||
| 143 | - <div class="panel-heading" role="tab"> | ||
| 144 | - <div class="row"> | ||
| 145 | - <div class="col-xs-9 col-md-9 titleTopic"> | ||
| 146 | - <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed"> | ||
| 147 | - <h4 style="color:white">{{course.name}}</h4> | ||
| 148 | - </a> | ||
| 149 | - </div> | ||
| 150 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
| 151 | - <div class="col-xs-4 col-md-3" id="divMoreActions"> | ||
| 152 | - <div class="btn-group"> | ||
| 153 | - <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
| 154 | - <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
| 155 | - </button> | ||
| 156 | - <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
| 157 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
| 158 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeCourse"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
| 159 | - </ul> | ||
| 160 | - </div> | ||
| 161 | - </div> | ||
| 162 | - {% endif %} | ||
| 163 | - </div> | ||
| 164 | - </div> | ||
| 165 | - <div class="panel-collapse collapseOne collapse in" role="tabpanel" aria-labelledby="headingOne" aria-expanded="true" aria-hidden="false" tabindex="0"> | ||
| 166 | - <div class="panel-body"> | ||
| 167 | - <p><b>Course Name: </b>{{course.name}}</p> | ||
| 168 | - <p><b>Duration (in semesters): </b>09</p> | ||
| 169 | - <p><b>Coordinator: </b>{{course.professors}}</p> | ||
| 170 | - <p> | ||
| 171 | - <b>Description:</b> | ||
| 172 | - <i> | ||
| 173 | - {{course.description}} | ||
| 174 | - </i> | ||
| 175 | - </p> | ||
| 176 | - <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">{% trans 'View Course' %}<div class="ripple-container"></div></a> | ||
| 177 | - </div> | ||
| 178 | - </div> | ||
| 179 | - </div> | ||
| 180 | - </div> | ||
| 181 | - </div> | 99 | + {% include "course/course_card.html" %} |
| 182 | {% endif %} | 100 | {% endif %} |
| 183 | {% endfor %} | 101 | {% endfor %} |
| 184 | {% endif %} | 102 | {% endif %} |
| 185 | {% else %} | 103 | {% else %} |
| 186 | {% trans 'No courses found' %} | 104 | {% trans 'No courses found' %} |
| 187 | {% endif %} | 105 | {% endif %} |
| 188 | - <div class="group"> | ||
| 189 | - <div class="modal" id="removeCourse"> | ||
| 190 | - <div class="modal-dialog"> | ||
| 191 | - <div class="modal-content"> | ||
| 192 | - <div class="modal-header"> | ||
| 193 | - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button> | ||
| 194 | - <h4 class="modal-title"></h4> | ||
| 195 | - </div> | ||
| 196 | - <div class="modal-body"> | ||
| 197 | - <p>Delete your course?</p> | ||
| 198 | - </div> | ||
| 199 | - <div class="modal-footer"> | ||
| 200 | - | ||
| 201 | - <a href="http://127.0.0.1:8080/html/screens/users/profile_user.html" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a> | ||
| 202 | - | ||
| 203 | - </div> | ||
| 204 | - </div> | ||
| 205 | - </div> | ||
| 206 | - </div> | ||
| 207 | - </div> | ||
| 208 | </div> | 106 | </div> |
| 209 | <div class="col-md-12"> | 107 | <div class="col-md-12"> |
| 210 | <nav aria-label="Page navigation"> | 108 | <nav aria-label="Page navigation"> |
| @@ -227,4 +125,6 @@ | @@ -227,4 +125,6 @@ | ||
| 227 | </ul> | 125 | </ul> |
| 228 | </nav> | 126 | </nav> |
| 229 | </div> | 127 | </div> |
| 128 | + | ||
| 129 | + <script type="text/javascript" src="{% static 'js/course.js' %}"></script> | ||
| 230 | {% endblock %} | 130 | {% endblock %} |
courses/templates/course/view.html
| @@ -37,14 +37,14 @@ | @@ -37,14 +37,14 @@ | ||
| 37 | 37 | ||
| 38 | <div class="panel panel-primary navigation"> | 38 | <div class="panel panel-primary navigation"> |
| 39 | <div class="panel-heading"> | 39 | <div class="panel-heading"> |
| 40 | - <h3 class="panel-title">Actions</h3> | 40 | + <h3 class="panel-title">{% trans "Actions" %}</h3> |
| 41 | </div> | 41 | </div> |
| 42 | <div class="panel-body"> | 42 | <div class="panel-body"> |
| 43 | <ul class="nav nav-pills nav-stacked"> | 43 | <ul class="nav nav-pills nav-stacked"> |
| 44 | - <li><a href="teacher/course_participants_teacher.html" target="_self">Participants</a></li> | ||
| 45 | - <li><a href="javascript:void(0)">Replicate Subject</a></li> | ||
| 46 | - <li><a href="javascript:void(0)">Create Subject</a></li> | ||
| 47 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal">Create Topic</a></li> | 44 | + <li><a href="teacher/course_participants_teacher.html" target="_self"> {% trans "Participants" %}</a></li> |
| 45 | + <li><a href="javascript:void(0)">{% trans "Replicate Subject" %}</a></li> | ||
| 46 | + <li><a href="javascript:void(0)">{% trans "Create Subject" %}</a></li> | ||
| 47 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal">{% trans "Create Topic" %}</a></li> | ||
| 48 | </ul> | 48 | </ul> |
| 49 | </div> | 49 | </div> |
| 50 | </div> | 50 | </div> |
| @@ -67,10 +67,10 @@ | @@ -67,10 +67,10 @@ | ||
| 67 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | 67 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> |
| 68 | <div class="ripple-container"></div></button> | 68 | <div class="ripple-container"></div></button> |
| 69 | <ul class="dropdown-menu" aria-labelledby="moreActions"> | 69 | <ul class="dropdown-menu" aria-labelledby="moreActions"> |
| 70 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#createSubject"><i class="fa fa-plus-square-o" aria-hidden="true"></i> Create Subject</a></li> | ||
| 71 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
| 72 | - <li><a href="{% url 'course:update' course.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Edit</a></li> | ||
| 73 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | 70 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#createSubject"><i class="fa fa-plus-square-o" aria-hidden="true"></i> {% trans "Create Subject" %}</a></li> |
| 71 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i> {% trans "Replicate" %}</a></li> | ||
| 72 | + <li><a href="{% url 'course:update' course.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans "Edit" %}</a></li> | ||
| 73 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans "Remove" %}</a></li> | ||
| 74 | </ul> | 74 | </ul> |
| 75 | </div> | 75 | </div> |
| 76 | </div> | 76 | </div> |
| @@ -79,7 +79,6 @@ | @@ -79,7 +79,6 @@ | ||
| 79 | </div> | 79 | </div> |
| 80 | <div class="panel-body"> | 80 | <div class="panel-body"> |
| 81 | <p><b>Course Name: </b>{{course.name}}</p> | 81 | <p><b>Course Name: </b>{{course.name}}</p> |
| 82 | - <p><b>Duration (in semesters): </b>09</p> | ||
| 83 | <p><b>Coordinator: </b>{{course.professors}}</p> | 82 | <p><b>Coordinator: </b>{{course.professors}}</p> |
| 84 | <p> | 83 | <p> |
| 85 | <b>Description:</b> | 84 | <b>Description:</b> |
| @@ -90,75 +89,20 @@ | @@ -90,75 +89,20 @@ | ||
| 90 | 89 | ||
| 91 | </div> | 90 | </div> |
| 92 | </div> | 91 | </div> |
| 93 | - <div class="btn-group btn-group-justified btn-group-raised"> | ||
| 94 | - <a href="{% url 'course:manage' %}" class="btn btn-raised btn-info">Todos</a> | ||
| 95 | - {% for category_subject in categorys_subjects %} | ||
| 96 | - <a href="?category={{category_subject.name}}" class="btn btn-raised btn-primary">{{category_subject.name}}</a> | ||
| 97 | - {% endfor %} | ||
| 98 | - </div> | 92 | + |
| 99 | <!-- MODAL CREATE SUBJECT --> | 93 | <!-- MODAL CREATE SUBJECT --> |
| 100 | <div class="modal" tabindex="-1" role="dialog " id="createSubject"> | 94 | <div class="modal" tabindex="-1" role="dialog " id="createSubject"> |
| 101 | <div class="modal-dialog"> | 95 | <div class="modal-dialog"> |
| 102 | <div class="modal-content"> | 96 | <div class="modal-content"> |
| 103 | <div class="modal-header"> | 97 | <div class="modal-header"> |
| 104 | - <h4 class="modal-title">Create a New Subject</h4> | 98 | + <h4 class="modal-title">{% trans "Create a New Subject" %}</h4> |
| 105 | </div> | 99 | </div> |
| 106 | <div class="modal-body"> | 100 | <div class="modal-body"> |
| 107 | <div> | 101 | <div> |
| 108 | - <!--<form class="form-horizontal"> | ||
| 109 | - <div class="form-group is-empty"> | ||
| 110 | - <label class="control-label col-md-2 col-md-offset-1 col-xs-2 col-xs-offset-1">Name</label> | ||
| 111 | - <div class="col-md-8 col-xs-8"> | ||
| 112 | - <input type="text" class="form-control" name="nameSubject"> | ||
| 113 | - </div> | ||
| 114 | - </div> | ||
| 115 | - <div class="form-group is-empty"> | ||
| 116 | - <label class="control-label col-md-2 col-md-offset-1 col-xs-2 col-xs-offset-1">Description</label> | ||
| 117 | - <div class="col-md-8 col-xs-8"> | ||
| 118 | - <textarea class="form-control" rows="3" id="textAreaSubject"></textarea> | ||
| 119 | - <span class="help-block">Sign the description of the course.</span> | ||
| 120 | - </div> | ||
| 121 | - </div> | ||
| 122 | - <div class="form-group is-empty"> | ||
| 123 | - <label class="control-label col-md-2 col-md-offset-1 col-xs-2 col-xs-offset-1">Goals</label> | ||
| 124 | - <div class="col-md-8 col-xs-8"> | ||
| 125 | - <textarea class="form-control" rows="3" id="textAreaSubject"></textarea> | ||
| 126 | - <span class="help-block">Sign the objectives of the course until the end of the course.</span> | ||
| 127 | - </div> | ||
| 128 | - </div> | ||
| 129 | - <div class="form-group is-empty"> | ||
| 130 | - <label class="control-label col-md-2 col-md-offset-1 col-xs-2 col-xs-offset-1">Students Limit</label> | ||
| 131 | - <div class="col-md-8 col-xs-8"> | ||
| 132 | - <input type="number" class="form-control" name="StudentLimit"> | ||
| 133 | - </div> | ||
| 134 | - </div> | ||
| 135 | - <div class="row"> | ||
| 136 | - <div class="col-md-6 col-xs-12"> | ||
| 137 | - <div class="row"> | ||
| 138 | - <div class="form-group is-empty"> | ||
| 139 | - <label class="control-label col-md-4 col-xs-4 col-xs-offset-1">Begining</label> | ||
| 140 | - <div class="col-md-8 col-xs-6"> | ||
| 141 | - <input type="date" class="form-control" name="BeginDate"> | ||
| 142 | - </div> | ||
| 143 | - </div> | ||
| 144 | - </div> | ||
| 145 | - </div> | ||
| 146 | - <div class="col-md-6 col-xs-12"> | ||
| 147 | - <div class="row"> | ||
| 148 | - <div class="form-group is-empty"> | ||
| 149 | - <label class="control-label col-md-4 col-xs-4 col-xs-offset-1">End</label> | ||
| 150 | - <div class="col-md-8 col-xs-6"> | ||
| 151 | - <input type="date" class="form-control" name="EndDate"> | ||
| 152 | - </div> | ||
| 153 | - </div> | ||
| 154 | - </div> | ||
| 155 | - </div> | ||
| 156 | - </div> | ||
| 157 | - </form>--> | ||
| 158 | </div> | 102 | </div> |
| 159 | <div class="modal-footer"> | 103 | <div class="modal-footer"> |
| 160 | - <button type="button" data-dismiss="modal" class="btn btn-default">Cancel</button> | ||
| 161 | - <a href="#" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a> | 104 | + <button type="button" data-dismiss="modal" class="btn btn-default">{% trans "Cancel" %}</button> |
| 105 | + <a href="#" target="_self"><button type="button" class="btn btn-primary"> {% trans "Confirm" %}</button></a> | ||
| 162 | </div> | 106 | </div> |
| 163 | </div> | 107 | </div> |
| 164 | </div> | 108 | </div> |
| @@ -181,11 +125,11 @@ | @@ -181,11 +125,11 @@ | ||
| 181 | <h4 class="modal-title"></h4> | 125 | <h4 class="modal-title"></h4> |
| 182 | </div> | 126 | </div> |
| 183 | <div class="modal-body"> | 127 | <div class="modal-body"> |
| 184 | - <p>Are you sure you want to remove this subject?</p> | 128 | + <p>{% trans "Are you sure you want to remove this subject?" %}</p> |
| 185 | </div> | 129 | </div> |
| 186 | <div class="modal-footer"> | 130 | <div class="modal-footer"> |
| 187 | 131 | ||
| 188 | - <a href="http://127.0.0.1:8080/html/screens/users/teacher/home_course_teacher.html" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a> | 132 | + <a href="http://127.0.0.1:8080/html/screens/users/teacher/home_course_teacher.html" target="_self"><button type="button" class="btn btn-primary">{% trans "Confirm" %}</button></a> |
| 189 | 133 | ||
| 190 | </div> | 134 | </div> |
| 191 | </div> | 135 | </div> |
| @@ -300,7 +244,7 @@ | @@ -300,7 +244,7 @@ | ||
| 300 | {% endfor %} | 244 | {% endfor %} |
| 301 | {% endif %} | 245 | {% endif %} |
| 302 | 246 | ||
| 303 | -{% if user|has_role:'professor' and user in course.professors or user|has_role:'system_admin' %} | 247 | +{% if user|has_role:'professor' and user in course.professors.all or user|has_role:'system_admin' %} |
| 304 | 248 | ||
| 305 | <div class="form-group"> | 249 | <div class="form-group"> |
| 306 | <a href="{% url 'course:create_subject' course.slug %}" data-toggle="modal" data-target="" class="btn btn-primary btn-lg btn-block btn-raised">{% trans 'Create Subject' %}<div class="ripple-container"></div></a> | 250 | <a href="{% url 'course:create_subject' course.slug %}" data-toggle="modal" data-target="" class="btn btn-primary btn-lg btn-block btn-raised">{% trans 'Create Subject' %}<div class="ripple-container"></div></a> |
| @@ -316,11 +260,11 @@ | @@ -316,11 +260,11 @@ | ||
| 316 | <h4 class="modal-title"></h4> | 260 | <h4 class="modal-title"></h4> |
| 317 | </div> | 261 | </div> |
| 318 | <div class="modal-body"> | 262 | <div class="modal-body"> |
| 319 | - <p>Are you sure you want to remove this subject?</p> | 263 | + <p> {% trans "Are you sure you want to remove this subject?" %}</p> |
| 320 | </div> | 264 | </div> |
| 321 | <div class="modal-footer"> | 265 | <div class="modal-footer"> |
| 322 | 266 | ||
| 323 | - <a href="http://127.0.0.1:8080/html/screens/users/teacher/home_course_teacher.html" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a> | 267 | + <a href="http://127.0.0.1:8080/html/screens/users/teacher/home_course_teacher.html" target="_self"><button type="button" class="btn btn-primary">{% trans "Confirm" %}</button></a> |
| 324 | 268 | ||
| 325 | </div> | 269 | </div> |
| 326 | </div> | 270 | </div> |
courses/templates/subject/form_view_teacher.html
| @@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
| 4 | <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> | 4 | <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> |
| 5 | <script src="{% static 'js/file.js' %}"></script> | 5 | <script src="{% static 'js/file.js' %}"></script> |
| 6 | <script type="text/javascript" src="{% static 'js/material.js' %}"></script> | 6 | <script type="text/javascript" src="{% static 'js/material.js' %}"></script> |
| 7 | - <script type = "text/javascript" src="{% static 'link.js' %}"></script> | 7 | + <script type = "text/javascript" src="{% static 'links.js' %}"></script> |
| 8 | {% endblock %} | 8 | {% endblock %} |
| 9 | 9 | ||
| 10 | <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false"> | 10 | <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false"> |
| @@ -55,7 +55,7 @@ | @@ -55,7 +55,7 @@ | ||
| 55 | <div class="dropdown"> | 55 | <div class="dropdown"> |
| 56 | <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | 56 | <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> |
| 57 | <ul class="dropdown-menu" aria-labelledby="dLabel"> | 57 | <ul class="dropdown-menu" aria-labelledby="dLabel"> |
| 58 | - <li><a href=" javascript:get_modal_link('{% url 'course:links:create_link' %}', '#createLinksModal','#divModalLink') ">Create a Link<div class="ripple-container"><div class="ripple ripple-on ripple-out" style="left: 54.5312px; top: 22px; background-color: rgb(0, 150, 136); transform: scale(20);"></div></div></a></li> | 58 | + <li><a href=" javascript:get_modal_link('{% url 'course:links:create_link' topic.slug %}', '#createLinksModal','#divModalLink') ">Create a Link<div class="ripple-container"><div class="ripple ripple-on ripple-out" style="left: 54.5312px; top: 22px; background-color: rgb(0, 150, 136); transform: scale(20);"></div></div></a></li> |
| 59 | <li> | 59 | <li> |
| 60 | <a href="javascript:get_modal_file('{% url 'course:file:create_file' topic.slug %}', '#fileModal', '#divModalFile')"> | 60 | <a href="javascript:get_modal_file('{% url 'course:file:create_file' topic.slug %}', '#fileModal', '#divModalFile')"> |
| 61 | {% trans "Create a file" %} | 61 | {% trans "Create a file" %} |
| @@ -116,7 +116,7 @@ | @@ -116,7 +116,7 @@ | ||
| 116 | <div class="dropdown"> | 116 | <div class="dropdown"> |
| 117 | <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> | 117 | <a href="#" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-plus-circle fa-lg" aria-hidden="true"></i></a> |
| 118 | <ul class="dropdown-menu" aria-labelledby="dLabel"> | 118 | <ul class="dropdown-menu" aria-labelledby="dLabel"> |
| 119 | - <li><a href="javascript:get_modal_link('{% url 'course:links:create_link' %}', '#createLinksModal','#divModalLink')">Create a Link</a></li> | 119 | + <li><a href="javascript:get_modal_link('{% url 'course:links:create_link' topic.slug %}', '#createLinksModal','#divModalLink')">Create a Link</a></li> |
| 120 | <li> | 120 | <li> |
| 121 | <a href="#"> | 121 | <a href="#"> |
| 122 | {% trans "Create a file" %} | 122 | {% trans "Create a file" %} |
| @@ -178,7 +178,7 @@ | @@ -178,7 +178,7 @@ | ||
| 178 | </div> | 178 | </div> |
| 179 | <div class="modal-footer"> | 179 | <div class="modal-footer"> |
| 180 | 180 | ||
| 181 | - <a href="http://localhost:8080/html/screens/users/profile_user.html" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a> | 181 | + <a href="" target="_self"><button type="button" class="btn btn-primary">Confirm</button></a> |
| 182 | 182 | ||
| 183 | </div> | 183 | </div> |
| 184 | </div> | 184 | </div> |
courses/templates/topic/index.html
| @@ -30,20 +30,24 @@ | @@ -30,20 +30,24 @@ | ||
| 30 | </ul> | 30 | </ul> |
| 31 | </div> | 31 | </div> |
| 32 | </div> | 32 | </div> |
| 33 | - <div class="panel panel-primary navigation"> | ||
| 34 | - <div class="panel-heading"> | ||
| 35 | - <h3 class="panel-title">Actions</h3> | ||
| 36 | - </div> | ||
| 37 | - <div class="panel-body"> | ||
| 38 | - <ul class="nav nav-pills nav-stacked"> | ||
| 39 | - <li><a href="javascript:void(0)">Participants</a></li> | ||
| 40 | - <li><a href="javascript:void(0)">Replicate subject</a></li> | ||
| 41 | - <li><a href="javascript:void(0)">Create subject</a></li> | ||
| 42 | - <li><a href="javascript:void(0)">Edit subject</a></li> | ||
| 43 | - <li><a href="javascript:void(0)">Remove subject</a></li> | ||
| 44 | - </ul> | 33 | + |
| 34 | + {% if user|has_role:'professor' %} | ||
| 35 | + <div class="panel panel-primary navigation"> | ||
| 36 | + <div class="panel-heading"> | ||
| 37 | + <h3 class="panel-title">Actions</h3> | ||
| 38 | + </div> | ||
| 39 | + <div class="panel-body"> | ||
| 40 | + <ul class="nav nav-pills nav-stacked"> | ||
| 41 | + <li><a href="javascript:void(0)">Participants</a></li> | ||
| 42 | + <li><a href="javascript:void(0)">Replicate subject</a></li> | ||
| 43 | + <li><a href="javascript:void(0)">Create subject</a></li> | ||
| 44 | + <li><a href="javascript:void(0)">Edit subject</a></li> | ||
| 45 | + <li><a href="javascript:void(0)">Remove subject</a></li> | ||
| 46 | + </ul> | ||
| 47 | + </div> | ||
| 45 | </div> | 48 | </div> |
| 46 | -</div> | 49 | + {% endif %} |
| 50 | + | ||
| 47 | {% endblock %} | 51 | {% endblock %} |
| 48 | 52 | ||
| 49 | {% block content %} | 53 | {% block content %} |
| @@ -132,11 +136,8 @@ | @@ -132,11 +136,8 @@ | ||
| 132 | </div> | 136 | </div> |
| 133 | </fieldset> | 137 | </fieldset> |
| 134 | </form> | 138 | </form> |
| 135 | -{% empty %} | ||
| 136 | - {% trans 'No activity found' %} | ||
| 137 | -{% endfor %} | ||
| 138 | 139 | ||
| 139 | -<ul class="pagination pagination-sm"> | 140 | + <ul class="pagination pagination-sm"> |
| 140 | <li class="disabled"><a href="javascript:void(0)">«</a></li> | 141 | <li class="disabled"><a href="javascript:void(0)">«</a></li> |
| 141 | <li class="active"><a href="javascript:void(0)">1</a></li> | 142 | <li class="active"><a href="javascript:void(0)">1</a></li> |
| 142 | <li><a href="javascript:void(0)">2</a></li> | 143 | <li><a href="javascript:void(0)">2</a></li> |
| @@ -145,6 +146,11 @@ | @@ -145,6 +146,11 @@ | ||
| 145 | <li><a href="javascript:void(0)">5</a></li> | 146 | <li><a href="javascript:void(0)">5</a></li> |
| 146 | <li><a href="javascript:void(0)">»</a></li> | 147 | <li><a href="javascript:void(0)">»</a></li> |
| 147 | </ul> | 148 | </ul> |
| 149 | +{% empty %} | ||
| 150 | + {% trans 'No activity found' %} | ||
| 151 | +{% endfor %} | ||
| 152 | + | ||
| 153 | + | ||
| 148 | 154 | ||
| 149 | </div> | 155 | </div> |
| 150 | 156 |
courses/templates/topic/link_topic_list.html
| 1 | {% load static i18n list_topic_foruns permission_tags %} | 1 | {% load static i18n list_topic_foruns permission_tags %} |
| 2 | +<div id="list-topic{{ topic.id }}-links"> | ||
| 2 | {% for link in links%} | 3 | {% for link in links%} |
| 3 | - <li><i class="fa fa-link" aria-hidden="true"></i> <a href="#" data-toggle="modal" data-target="#linksModal{{slug}}{{ forloop.counter }}">{{link}}</a></li> | ||
| 4 | - <!--MODAL VIEW LINK--> | ||
| 5 | - <div class="modal fade" id="linksModal{{slug}}{{ forloop.counter}}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | ||
| 6 | - <div class="modal-dialog" role="document"> | ||
| 7 | - <div class="modal-content"> | ||
| 8 | - <div class="modal-header"> | ||
| 9 | - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||
| 10 | - <h4 class="modal-title" id="myModalLabel">Link</h4> | ||
| 11 | - </div> | ||
| 12 | - <div class="modal-body"> | ||
| 13 | - <!-- Card --> | ||
| 14 | - <article class="card animated fadeInLeft"> | ||
| 15 | - <div class="card-block"> | ||
| 16 | - <b class="card-title">{{link.name}}</b><p></p> | ||
| 17 | - <p class="card-text"> </p><p>{{link.link_description}}</p> | ||
| 18 | - <a href="{{ link.link_url }}" class="btn btn-primary">Read more</a> | ||
| 19 | - </div> | ||
| 20 | - </article> | ||
| 21 | - <!-- .end Card --> | ||
| 22 | - </div> | ||
| 23 | - </div> | ||
| 24 | - </div> | ||
| 25 | - </div> | ||
| 26 | - <!-- EndModal --> | 4 | + <li><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link}}</a></li> |
| 27 | {% endfor %} | 5 | {% endfor %} |
| 6 | +</div> | ||
| 7 | +<div class = 'row' id ="divModalLink"> | ||
| 8 | + | ||
| 9 | +</div> |
courses/templates/topic/link_topic_list_edit.html
| 1 | {% load static i18n list_topic_foruns permission_tags %} | 1 | {% load static i18n list_topic_foruns permission_tags %} |
| 2 | +<div id="list-topic{{ topic.id }}-links-edit"> | ||
| 2 | {% for link in links%} | 3 | {% for link in links%} |
| 4 | + | ||
| 3 | <li class="icon_edit_remove"> <a href="#" data-toggle="modal" data-target="#linksModalEdit"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="#" data-toggle="modal" data-target="#removeLink"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li> | 5 | <li class="icon_edit_remove"> <a href="#" data-toggle="modal" data-target="#linksModalEdit"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="#" data-toggle="modal" data-target="#removeLink"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li> |
| 4 | - <li><i class="fa fa-link" aria-hidden="true"></i> <a href="#" data-toggle="modal" data-target="#linksModal{{slug}}{{ forloop.counter }}">{{link}}</a></li> | 6 | + <li><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link}}</a></li> |
| 5 | 7 | ||
| 6 | - <!--MODAL VIEW LINK--> | ||
| 7 | - <div class="modal fade" id="linksModal{{slug}}{{ forloop.counter}}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | ||
| 8 | - <div class="modal-dialog" role="document"> | ||
| 9 | - <div class="modal-content"> | ||
| 10 | - <div class="modal-header"> | ||
| 11 | - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||
| 12 | - <h4 class="modal-title" id="myModalLabel">Link</h4> | ||
| 13 | - </div> | ||
| 14 | - <div class="modal-body"> | ||
| 15 | - <!-- Card --> | ||
| 16 | - <article class="card animated fadeInLeft"> | ||
| 17 | - <div class="card-block"> | ||
| 18 | - <b class="card-title">{{link.name}}</b><p></p> | ||
| 19 | - <p class="card-text"> </p><p>{{link.link_description}}</p> | ||
| 20 | - <a href="{{ link.link_url }}" class="btn btn-primary">Read more</a> | ||
| 21 | - </div> | ||
| 22 | - </article> | ||
| 23 | - <!-- .end Card --> | ||
| 24 | - </div> | ||
| 25 | - </div> | ||
| 26 | - </div> | ||
| 27 | - </div> | ||
| 28 | - <!-- EndModal --> | ||
| 29 | {% endfor %} | 8 | {% endfor %} |
| 30 | - <div class = "row" id="divModalLink"> | ||
| 31 | - </div> | 9 | +</div> |
courses/templatetags/custom_filters.py
| @@ -7,7 +7,7 @@ register = template.Library() | @@ -7,7 +7,7 @@ register = template.Library() | ||
| 7 | def show_subject_subscribe(user, subject): | 7 | def show_subject_subscribe(user, subject): |
| 8 | if not user is None: | 8 | if not user is None: |
| 9 | if user.is_authenticated: | 9 | if user.is_authenticated: |
| 10 | - if has_role(user, 'student'): | 10 | + if has_role(user, 'student') and not user.is_staff: |
| 11 | if not user in subject.students.all() and subject.show_subscribe: | 11 | if not user in subject.students.all() and subject.show_subscribe: |
| 12 | return True | 12 | return True |
| 13 | 13 | ||
| @@ -17,7 +17,7 @@ def show_subject_subscribe(user, subject): | @@ -17,7 +17,7 @@ def show_subject_subscribe(user, subject): | ||
| 17 | def show_course_subscribe(user, course): | 17 | def show_course_subscribe(user, course): |
| 18 | if not user is None: | 18 | if not user is None: |
| 19 | if user.is_authenticated: | 19 | if user.is_authenticated: |
| 20 | - if has_role(user, 'student'): | 20 | + if has_role(user, 'student') and not user.is_staff: |
| 21 | if not user in course.students.all() and course.show_subscribe: | 21 | if not user in course.students.all() and course.show_subscribe: |
| 22 | return True | 22 | return True |
| 23 | 23 |
courses/templatetags/list_topic_foruns.py
| @@ -59,7 +59,7 @@ def list_topic_link_edit(request,topic): | @@ -59,7 +59,7 @@ def list_topic_link_edit(request,topic): | ||
| 59 | 'request':request | 59 | 'request':request |
| 60 | } | 60 | } |
| 61 | context['links'] = Link.objects.filter(topic = topic) | 61 | context['links'] = Link.objects.filter(topic = topic) |
| 62 | - context['slug'] = topic.slug | 62 | + context['topic'] = topic |
| 63 | return context | 63 | return context |
| 64 | 64 | ||
| 65 | @register.inclusion_tag('topic/link_topic_list.html') | 65 | @register.inclusion_tag('topic/link_topic_list.html') |
| @@ -68,5 +68,5 @@ def list_topic_link(request,topic): | @@ -68,5 +68,5 @@ def list_topic_link(request,topic): | ||
| 68 | 'request':request | 68 | 'request':request |
| 69 | } | 69 | } |
| 70 | context['links'] = Link.objects.filter(topic = topic) | 70 | context['links'] = Link.objects.filter(topic = topic) |
| 71 | - context['slug'] = topic.slug | 71 | + context['topic'] = topic |
| 72 | return context | 72 | return context |
courses/urls.py
| 1 | from django.conf.urls import url, include | 1 | from django.conf.urls import url, include |
| 2 | 2 | ||
| 3 | from . import views | 3 | from . import views |
| 4 | -from links import views as linkviews | ||
| 5 | urlpatterns = [ | 4 | urlpatterns = [ |
| 6 | url(r'^$', views.IndexView.as_view(), name='manage'), | 5 | url(r'^$', views.IndexView.as_view(), name='manage'), |
| 7 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), | 6 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), |
| @@ -13,7 +12,6 @@ urlpatterns = [ | @@ -13,7 +12,6 @@ urlpatterns = [ | ||
| 13 | url(r'^categories/view/$', views.IndexCatView.as_view(), name='manage_cat'), | 12 | url(r'^categories/view/$', views.IndexCatView.as_view(), name='manage_cat'), |
| 14 | url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"), | 13 | url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"), |
| 15 | url(r'^categories/edit/(?P<slug>[\w_-]+)/$', views.UpdateCatView.as_view(), name='update_cat'), | 14 | url(r'^categories/edit/(?P<slug>[\w_-]+)/$', views.UpdateCatView.as_view(), name='update_cat'), |
| 16 | - url(r'^categories/(?P<slug>[\w_-]+)/$', views.ViewCat.as_view(), name='view_cat'), | ||
| 17 | url(r'^categories/delete/(?P<slug>[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'), | 15 | url(r'^categories/delete/(?P<slug>[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'), |
| 18 | url(r'^subjects/(?P<slug>[\w_-]+)/$', views.SubjectsView.as_view(), name='view_subject'), | 16 | url(r'^subjects/(?P<slug>[\w_-]+)/$', views.SubjectsView.as_view(), name='view_subject'), |
| 19 | url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'), | 17 | url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'), |
| @@ -22,9 +20,6 @@ urlpatterns = [ | @@ -22,9 +20,6 @@ urlpatterns = [ | ||
| 22 | url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'), | 20 | url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'), |
| 23 | url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), | 21 | url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), |
| 24 | 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'), |
| 25 | - url(r'^topics/createlink/$', linkviews.CreateLink.as_view(),name = 'create_link'), | ||
| 26 | - url(r'^topics/deletelink/(?P<linkname>[\w_-]+)/$', linkviews.deleteLink,name = 'delete_link'), | ||
| 27 | - url(r'^topics/updatelink/(?P<linkname>[\w_-]+)/$', linkviews.UpdateLink.as_view(),name = 'update_link'), | ||
| 28 | 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'), |
| 29 | 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'), |
| 30 | url(r'^forum/', include('forum.urls', namespace = 'forum')), | 25 | url(r'^forum/', include('forum.urls', namespace = 'forum')), |
| @@ -33,4 +28,4 @@ urlpatterns = [ | @@ -33,4 +28,4 @@ urlpatterns = [ | ||
| 33 | url(r'^files/', include('files.urls', namespace = 'file')), | 28 | url(r'^files/', include('files.urls', namespace = 'file')), |
| 34 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), | 29 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), |
| 35 | url(r'^links/',include('links.urls',namespace = 'links')), | 30 | url(r'^links/',include('links.urls',namespace = 'links')), |
| 36 | -] | ||
| 37 | \ No newline at end of file | 31 | \ No newline at end of file |
| 32 | +] |
courses/views.py
| @@ -19,6 +19,8 @@ from users.models import User | @@ -19,6 +19,8 @@ from users.models import User | ||
| 19 | from files.forms import FileForm | 19 | from files.forms import FileForm |
| 20 | from files.models import TopicFile | 20 | from files.models import TopicFile |
| 21 | 21 | ||
| 22 | +from django.urls import reverse | ||
| 23 | + | ||
| 22 | from datetime import date | 24 | from datetime import date |
| 23 | 25 | ||
| 24 | class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | 26 | class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): |
| @@ -45,7 +47,6 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | @@ -45,7 +47,6 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | ||
| 45 | categorys_courses = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct() | 47 | categorys_courses = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct() |
| 46 | 48 | ||
| 47 | courses_category = Course.objects.filter(category__name = self.request.GET.get('category')) | 49 | courses_category = Course.objects.filter(category__name = self.request.GET.get('category')) |
| 48 | - | ||
| 49 | none = None | 50 | none = None |
| 50 | q = self.request.GET.get('category', None) | 51 | q = self.request.GET.get('category', None) |
| 51 | if q is None: | 52 | if q is None: |
| @@ -295,13 +296,6 @@ class UpdateCatView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | @@ -295,13 +296,6 @@ class UpdateCatView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | ||
| 295 | messages.success(self.request, _('Category updated successfully!')) | 296 | messages.success(self.request, _('Category updated successfully!')) |
| 296 | return reverse_lazy('course:update_cat', kwargs={'slug' : self.object.slug}) | 297 | return reverse_lazy('course:update_cat', kwargs={'slug' : self.object.slug}) |
| 297 | 298 | ||
| 298 | -class ViewCat(LoginRequiredMixin, generic.DetailView): | ||
| 299 | - login_url = reverse_lazy("core:home") | ||
| 300 | - redirect_field_name = 'next' | ||
| 301 | - model = CourseCategory | ||
| 302 | - template_name = 'category/view.html' | ||
| 303 | - context_object_name = 'category' | ||
| 304 | - | ||
| 305 | class DeleteCatView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | 299 | class DeleteCatView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): |
| 306 | 300 | ||
| 307 | allowed_roles = ['professor', 'system_admin'] | 301 | allowed_roles = ['professor', 'system_admin'] |
| @@ -432,7 +426,11 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, gener | @@ -432,7 +426,11 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, NotificationMixin, gener | ||
| 432 | self.object.subject = subject | 426 | self.object.subject = subject |
| 433 | self.object.owner = self.request.user | 427 | self.object.owner = self.request.user |
| 434 | self.object.save() | 428 | self.object.save() |
| 435 | - | 429 | + action = super(CreateTopicView, self).createorRetrieveAction("create Topic") |
| 430 | + super(CreateTopicView, self).createNotification("Topic "+ self.object.name + " was created", | ||
| 431 | + resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]), | ||
| 432 | + actor=self.request.user, users = self.object.subject.course.students.all() ) | ||
| 433 | + | ||
| 436 | return super(CreateTopicView, self).form_valid(form) | 434 | return super(CreateTopicView, self).form_valid(form) |
| 437 | 435 | ||
| 438 | class UpdateTopicView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | 436 | class UpdateTopicView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): |
exam/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:32 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | +from django.conf import settings | ||
| 5 | from django.db import migrations, models | 6 | from django.db import migrations, models |
| 6 | import django.db.models.deletion | 7 | import django.db.models.deletion |
| 7 | 8 | ||
| @@ -11,6 +12,7 @@ class Migration(migrations.Migration): | @@ -11,6 +12,7 @@ class Migration(migrations.Migration): | ||
| 11 | initial = True | 12 | initial = True |
| 12 | 13 | ||
| 13 | dependencies = [ | 14 | dependencies = [ |
| 15 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 14 | ('courses', '0001_initial'), | 16 | ('courses', '0001_initial'), |
| 15 | ] | 17 | ] |
| 16 | 18 | ||
| @@ -23,9 +25,22 @@ class Migration(migrations.Migration): | @@ -23,9 +25,22 @@ class Migration(migrations.Migration): | ||
| 23 | ('order', models.PositiveSmallIntegerField(verbose_name='Order')), | 25 | ('order', models.PositiveSmallIntegerField(verbose_name='Order')), |
| 24 | ], | 26 | ], |
| 25 | options={ | 27 | options={ |
| 26 | - 'ordering': ('order',), | ||
| 27 | - 'verbose_name': 'Answer', | ||
| 28 | 'verbose_name_plural': 'Answers', | 28 | 'verbose_name_plural': 'Answers', |
| 29 | + 'verbose_name': 'Answer', | ||
| 30 | + 'ordering': ('order',), | ||
| 31 | + }, | ||
| 32 | + ), | ||
| 33 | + migrations.CreateModel( | ||
| 34 | + name='AnswersStudent', | ||
| 35 | + fields=[ | ||
| 36 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
| 37 | + ('status', models.BooleanField(default=False, verbose_name='Answered')), | ||
| 38 | + ('answered_in', models.DateTimeField(auto_now=True, verbose_name='Answered Date')), | ||
| 39 | + ('answer', models.ManyToManyField(related_name='student_answer', to='exam.Answer', verbose_name='Answers Students')), | ||
| 40 | + ], | ||
| 41 | + options={ | ||
| 42 | + 'verbose_name_plural': 'Answers Student', | ||
| 43 | + 'verbose_name': 'Answer Stundent', | ||
| 29 | }, | 44 | }, |
| 30 | ), | 45 | ), |
| 31 | migrations.CreateModel( | 46 | migrations.CreateModel( |
| @@ -35,12 +50,22 @@ class Migration(migrations.Migration): | @@ -35,12 +50,22 @@ class Migration(migrations.Migration): | ||
| 35 | ('begin_date', models.DateField(blank=True, verbose_name='Begin of Course Date')), | 50 | ('begin_date', models.DateField(blank=True, verbose_name='Begin of Course Date')), |
| 36 | ], | 51 | ], |
| 37 | options={ | 52 | options={ |
| 38 | - 'verbose_name': 'Exam', | ||
| 39 | 'verbose_name_plural': 'Exams', | 53 | 'verbose_name_plural': 'Exams', |
| 54 | + 'verbose_name': 'Exam', | ||
| 40 | }, | 55 | }, |
| 41 | bases=('courses.activity',), | 56 | bases=('courses.activity',), |
| 42 | ), | 57 | ), |
| 43 | migrations.AddField( | 58 | migrations.AddField( |
| 59 | + model_name='answersstudent', | ||
| 60 | + name='exam', | ||
| 61 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_exam', to='exam.Exam', verbose_name='Exam'), | ||
| 62 | + ), | ||
| 63 | + migrations.AddField( | ||
| 64 | + model_name='answersstudent', | ||
| 65 | + name='student', | ||
| 66 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'), | ||
| 67 | + ), | ||
| 68 | + migrations.AddField( | ||
| 44 | model_name='answer', | 69 | model_name='answer', |
| 45 | name='exam', | 70 | name='exam', |
| 46 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'), | 71 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'), |
exam/migrations/0002_answersstudent.py
| @@ -1,33 +0,0 @@ | @@ -1,33 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-20 21:08 | ||
| 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 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 14 | - ('exam', '0001_initial'), | ||
| 15 | - ] | ||
| 16 | - | ||
| 17 | - operations = [ | ||
| 18 | - migrations.CreateModel( | ||
| 19 | - name='AnswersStudent', | ||
| 20 | - fields=[ | ||
| 21 | - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
| 22 | - ('status', models.BooleanField(default=False, verbose_name='Answered')), | ||
| 23 | - ('answered_in', models.DateTimeField(auto_now=True, verbose_name='Answered Date')), | ||
| 24 | - ('answer', models.ManyToManyField(related_name='student_answer', to='exam.Answer', verbose_name='Answers Students')), | ||
| 25 | - ('exam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_exam', to='exam.Exam', verbose_name='Exam')), | ||
| 26 | - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='Student')), | ||
| 27 | - ], | ||
| 28 | - options={ | ||
| 29 | - 'verbose_name': 'Answer Stundent', | ||
| 30 | - 'verbose_name_plural': 'Answers Student', | ||
| 31 | - }, | ||
| 32 | - ), | ||
| 33 | - ] |
| @@ -0,0 +1,116 @@ | @@ -0,0 +1,116 @@ | ||
| 1 | +BBBBBBB BBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BBBB BBBB | ||
| 4 | + | ||
| 5 | +BBBBB BBBBBBB | ||
| 6 | +XXXX XXXXXXXXXXXX XXXXXXXXXXXX | ||
| 7 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + BBBBB BBBBBBBBBB | ||
| 9 | + XXX XXXXXXXXXXXXXXXXXXXX gettext(u'New Exam') XXXXX | ||
| 10 | + BBBBBBBB BBBBBBBBBB | ||
| 11 | + XXXXXX | ||
| 12 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 14 | + XXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX gettext(u'Exam Name') XXXXXXXX | ||
| 15 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 16 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Exam Name') XX | ||
| 17 | + XXXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 20 | + XXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX gettext(u"Exam's begin date") XXXXXXXX | ||
| 21 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 22 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Begin Date') XX | ||
| 23 | + XXXXXX | ||
| 24 | + XXXXXX | ||
| 25 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 26 | + XXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX gettext(u"Exam's end date") XXXXXXXX | ||
| 27 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 28 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'End Date') XX | ||
| 29 | + XXXXXX | ||
| 30 | + XXXXXX | ||
| 31 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 32 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 33 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 34 | + XXXXXXX | ||
| 35 | + XXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Allow submissions after deadline?') | ||
| 36 | + XXXXXXXX | ||
| 37 | + XXXXXX | ||
| 38 | + XXXXXX | ||
| 39 | + XXXXXX | ||
| 40 | + XXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXX | ||
| 41 | + | ||
| 42 | + XXXXXX | ||
| 43 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 44 | + XXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX gettext(u'Question Type') XXXXXXXX | ||
| 45 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 46 | + XXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXX | ||
| 47 | + XXXXXXX XXXXXXXX XXXXXXXXX gettext(u'Question Type') XXXXXXXXX | ||
| 48 | + XXXXXXX XXXXXXXXXX gettext(u'Multiple Choice') XXXXXXXXX | ||
| 49 | + XXXXXXX XXXXXXXXXX gettext(u'True or False') XXXXXXXXX | ||
| 50 | + XXXXXXX XXXXXXXXXX gettext(u'Gap Filling') XXXXXXXXX | ||
| 51 | + XXXXXXX XXXXXXXXXX gettext(u'Discursive Question') XXXXXXXXX | ||
| 52 | + XXXXXXXXX | ||
| 53 | + XXXXXX | ||
| 54 | + XXXXXX | ||
| 55 | + XXXX XXXXXXXXXXXX | ||
| 56 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 57 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXX gettext(u'add question') XXXXXXXXX | ||
| 58 | + XXXXXX | ||
| 59 | + XXXXXX | ||
| 60 | + XXXXXX | ||
| 61 | + XXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX | ||
| 62 | + XXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Create') XXXXXXXXX | ||
| 63 | + XXXXXX | ||
| 64 | +XXXXXX | ||
| 65 | +XXXXXXXX | ||
| 66 | +XXX XX X XX | ||
| 67 | +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 68 | + XXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBXX XXXXXXXXXXXXXXX | ||
| 69 | + XX XXX XXXXX X XXXXXXXXXXXXX | ||
| 70 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 71 | + XX XXXXXXXXXXXXX | ||
| 72 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 73 | + XX XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX X XXXX | ||
| 74 | + XXXXXXXXXXXXXXXXXXXXXXXXX X XXXXXX | ||
| 75 | + XXX | ||
| 76 | +XXX | ||
| 77 | + | ||
| 78 | +XXX XXXXXXXXXXXXXXXX X XX | ||
| 79 | + | ||
| 80 | +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX X | ||
| 81 | + XXX XXXXXXX X XXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXX X | ||
| 82 | + XXXXXXXXX X | ||
| 83 | + XXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX X XXXXXXXXX XXXXXXXXXXXXXXXXX X XXXX X | ||
| 84 | + XXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 85 | + XXXXXXXXXX X | ||
| 86 | + XXXXXXXXX | ||
| 87 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 88 | + | ||
| 89 | + XXXXXXXXXXXXXXXXXXX | ||
| 90 | +XXX | ||
| 91 | + | ||
| 92 | +XXX XXXXXXXXXXXXXXXXXX X XX | ||
| 93 | + | ||
| 94 | +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX X | ||
| 95 | + XXX XXXXXXX X XXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXX X | ||
| 96 | + XXXXXXXXX X | ||
| 97 | + XXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 98 | + XXXXXXXXXX X | ||
| 99 | + XXXXXXXXX X | ||
| 100 | + XXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX X XXXXXXXXXXXXXXXXXX XXX XXXXXXXXXXX X | ||
| 101 | + XXXXXXXXXX X | ||
| 102 | + XXXXXXXXX X | ||
| 103 | + XXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXX X | ||
| 104 | + XXXXXXXXXX X | ||
| 105 | + XXXXXXXXX | ||
| 106 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 107 | + | ||
| 108 | + XXXXXXXXXXXXXXXXXXXXX | ||
| 109 | +XXX | ||
| 110 | + | ||
| 111 | +XXXXXXXXXXXX X | ||
| 112 | + XX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX | ||
| 113 | +XXX | ||
| 114 | +XXXXXXXXX | ||
| 115 | + | ||
| 116 | +BBBBBBBB BBBBBBB |
| @@ -0,0 +1,6 @@ | @@ -0,0 +1,6 @@ | ||
| 1 | +XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 2 | + XXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX gettext(u'Question') XXXXXXXX | ||
| 3 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 4 | + XXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Question') XXXXXXXXXXXXX | ||
| 5 | + XXXXXX | ||
| 6 | +XXXXXX |
| @@ -0,0 +1,40 @@ | @@ -0,0 +1,40 @@ | ||
| 1 | +XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX | ||
| 2 | + | ||
| 3 | + XXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 4 | + | ||
| 5 | + | ||
| 6 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXXXXX | ||
| 9 | + | ||
| 10 | + | ||
| 11 | +XXXXXX | ||
| 12 | +XXXX XXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + XXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXX | ||
| 15 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXXXXX | ||
| 16 | + XXXXXXX | ||
| 17 | + XXXXXX XXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 18 | + XXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 19 | + XXXXXXXX | ||
| 20 | + XXXXXX | ||
| 21 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXXXXX | ||
| 22 | + XXXXXXX | ||
| 23 | + XXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 24 | + XXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 25 | + XXXXXXXX | ||
| 26 | + XXXXXX | ||
| 27 | + XXXXXX | ||
| 28 | +XXXXXX | ||
| 29 | +XXXX XXX XXXXXXXXXXX XXXXXX XXX | ||
| 30 | +XXXX XXXXXXXXXXXXXXXXXXX | ||
| 31 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 32 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX | ||
| 33 | + XXXXXX | ||
| 34 | +XXXXXX | ||
| 35 | +XXXX XXXXXXXXXXXXXXXXXXX | ||
| 36 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 37 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 38 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 39 | + XXXXXX | ||
| 40 | +XXXXXX |
| @@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
| 1 | +BBBB BBBB | ||
| 2 | + | ||
| 3 | +XXXX XXXXXXXXXX XXXXXXXXXXX X | ||
| 4 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 5 | + XXXXX | ||
| 6 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXXXX | ||
| 8 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 9 | + XXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Write your alternative') XXXXXXXXXX | ||
| 10 | + XXXXXX | ||
| 11 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 12 | + XXXXX | ||
| 13 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + XXXXXX | ||
| 15 | +XXXXXX |
| @@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
| 1 | + | ||
| 2 | + | ||
| 3 | +BBBB BBBB | ||
| 4 | + | ||
| 5 | +XXXXXXX | ||
| 6 | + XXXXXXXXXXXXXXXXXXXXXXX X | ||
| 7 | + XXXXXXX XXXXXXXX | ||
| 8 | + X | ||
| 9 | + XXXXXXXXXXXXXXXXXXXXX X | ||
| 10 | + XXXXXXX XXXXX | ||
| 11 | + X | ||
| 12 | +XXXXXXXX | ||
| 13 | +XXXX XXXXXXXX XXXXXXX | ||
| 14 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 15 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 16 | + XXXXX | ||
| 17 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 20 | + XXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX gettext(u'Question') XXXXXXXX | ||
| 21 | + XXXXXX | ||
| 22 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 23 | + XXXX XXXXXXXXXXXX | ||
| 24 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 25 | + XXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Question') XXXXXXXXXX | ||
| 26 | + XXXXXX | ||
| 27 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 28 | + XXXXX | ||
| 29 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 30 | + XXXXXX | ||
| 31 | + XXXXXX | ||
| 32 | + XXXXXX | ||
| 33 | + | ||
| 34 | + XXXXXX | ||
| 35 | + XXXX XXXXXXXXXXXX | ||
| 36 | + XXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 37 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXX gettext(u'Alternatives: T/F') XXXXXXXX | ||
| 38 | + XXXXXX | ||
| 39 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXX | ||
| 40 | + BBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||
| 41 | + XXXXXX | ||
| 42 | + XXXXXX | ||
| 43 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 44 | + XXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 45 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'New Alternative') XXXXXXXXX | ||
| 46 | + XXXXXX | ||
| 47 | + XXXXXX | ||
| 48 | +XXXXXX | ||
| 49 | +XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 50 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 51 | + XXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBXX XXXXXXXXXXXXXXX | ||
| 52 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 53 | + XXX | ||
| 54 | + XXX | ||
| 55 | + XXXXXX XXX XXXXXXXXX XXXXXX XXXXXX XX XXXX | ||
| 56 | + XX XXXXXXXXXXX XXXXXXXXXXXX XX XXXXXXXXX XXXX XXXXX X XXXXXXXXXXXXXX XXX XXXXXXXXX | ||
| 57 | + XXXXXX XXXX | ||
| 58 | + XXXXXXXXX XX | ||
| 59 | + XXXXXXX XXXXXXXXX XXXXXX XX X X | ||
| 60 | + XXX XXXX X XX | ||
| 61 | + XXXXXXXXXXXX XXX XXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 62 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 63 | + XXX | ||
| 64 | + XX | ||
| 65 | + XXX | ||
| 66 | +XXXXXXXXX | ||
| 67 | + |
exam/views.py
| @@ -44,7 +44,7 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): | @@ -44,7 +44,7 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): | ||
| 44 | 44 | ||
| 45 | 45 | ||
| 46 | 46 | ||
| 47 | -class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | 47 | +class CreateExam(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.CreateView): |
| 48 | 48 | ||
| 49 | allowed_roles = ['professor', 'system_admin'] | 49 | allowed_roles = ['professor', 'system_admin'] |
| 50 | login_url = reverse_lazy("core:home") | 50 | login_url = reverse_lazy("core:home") |
| @@ -72,8 +72,12 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -72,8 +72,12 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
| 72 | self.object = form.save(commit = False) | 72 | self.object = form.save(commit = False) |
| 73 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | 73 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) |
| 74 | self.object.topic = topic | 74 | self.object.topic = topic |
| 75 | + self.object.name = str(self.object) | ||
| 75 | self.object.save() | 76 | self.object.save() |
| 76 | 77 | ||
| 78 | + super(CreateExam, self).createNotification(message="created an Exam "+ self.object.name, actor=self.request.user, | ||
| 79 | + resource_name=self.object.name, resource_link= reverse('course:exam:view_exam', args=[self.object.slug]), | ||
| 80 | + users=self.object.topic.subject.students.all()) | ||
| 77 | for key in self.request.POST: | 81 | for key in self.request.POST: |
| 78 | if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): | 82 | if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): |
| 79 | answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) | 83 | answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) |
files/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:32 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | +from django.conf import settings | ||
| 5 | from django.db import migrations, models | 6 | from django.db import migrations, models |
| 6 | import django.db.models.deletion | 7 | import django.db.models.deletion |
| 7 | import files.models | 8 | import files.models |
| @@ -14,6 +15,7 @@ class Migration(migrations.Migration): | @@ -14,6 +15,7 @@ class Migration(migrations.Migration): | ||
| 14 | dependencies = [ | 15 | dependencies = [ |
| 15 | ('courses', '0001_initial'), | 16 | ('courses', '0001_initial'), |
| 16 | ('core', '0001_initial'), | 17 | ('core', '0001_initial'), |
| 18 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 17 | ] | 19 | ] |
| 18 | 20 | ||
| 19 | operations = [ | 21 | operations = [ |
| @@ -24,10 +26,11 @@ class Migration(migrations.Migration): | @@ -24,10 +26,11 @@ class Migration(migrations.Migration): | ||
| 24 | ('description', models.TextField(blank=True, verbose_name='Description')), | 26 | ('description', models.TextField(blank=True, verbose_name='Description')), |
| 25 | ('file_url', models.FileField(upload_to=files.models.file_path, verbose_name='File')), | 27 | ('file_url', models.FileField(upload_to=files.models.file_path, verbose_name='File')), |
| 26 | ('file_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topic_files', to='core.MimeType', verbose_name='Type file')), | 28 | ('file_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topic_files', to='core.MimeType', verbose_name='Type file')), |
| 29 | + ('professor', models.ManyToManyField(related_name='file_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors')), | ||
| 27 | ], | 30 | ], |
| 28 | options={ | 31 | options={ |
| 29 | - 'ordering': ('-id',), | ||
| 30 | 'verbose_name': 'File', | 32 | 'verbose_name': 'File', |
| 33 | + 'ordering': ('-id',), | ||
| 31 | 'verbose_name_plural': 'Files', | 34 | 'verbose_name_plural': 'Files', |
| 32 | }, | 35 | }, |
| 33 | bases=('courses.material',), | 36 | bases=('courses.material',), |
files/migrations/0002_topicfile_professor.py
| @@ -1,24 +0,0 @@ | @@ -1,24 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | ||
| 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 | - initial = True | ||
| 12 | - | ||
| 13 | - dependencies = [ | ||
| 14 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 15 | - ('files', '0001_initial'), | ||
| 16 | - ] | ||
| 17 | - | ||
| 18 | - operations = [ | ||
| 19 | - migrations.AddField( | ||
| 20 | - model_name='topicfile', | ||
| 21 | - name='professor', | ||
| 22 | - field=models.ManyToManyField(related_name='file_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'), | ||
| 23 | - ), | ||
| 24 | - ] |
| @@ -0,0 +1,114 @@ | @@ -0,0 +1,114 @@ | ||
| 1 | +BBBB BBBBBB BBBBBBBBBBBBB BBBB | ||
| 2 | + | ||
| 3 | +XXXX XXXXX XXXXXX XXXX XXX | ||
| 4 | +XXXX XXXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 6 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 7 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 9 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Add File') XXXXX | ||
| 11 | + XXXXXX | ||
| 12 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXX XXXX XXX | ||
| 14 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | + BBBBBBBBBB | ||
| 16 | + BB BBBBBBBB | ||
| 17 | + BBB BBBBBBB BB BBBBBBBB | ||
| 18 | + XXXX XXXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 19 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 20 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 21 | + XXXXXXXXX | ||
| 22 | + XXXXXXX | ||
| 23 | + XXXXXX | ||
| 24 | + BBBBBB | ||
| 25 | + BBBBB | ||
| 26 | + XXXXXXXXXX | ||
| 27 | + BBB BBBBB BB BBBB | ||
| 28 | + XXXX XXXXXXXXXXXXXXXXX XXXXXXXBB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 29 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 30 | + BB BBBBBBBBBBBBBBBBBBBB | ||
| 31 | + XXXXXX XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 32 | + BBBB | ||
| 33 | + XXXXXX XXXXXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 34 | + BBBBB | ||
| 35 | + BB BBBBBBBBBBBBB BB BBBBBBBBBBBBB | ||
| 36 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBB BBBBBBBBB | ||
| 37 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 38 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Choose your file...') XX | ||
| 39 | + XXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 40 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXX XXXXXXXXXXXXXX | ||
| 41 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 42 | + XXXXXXXXX | ||
| 43 | + XXXXXXX | ||
| 44 | + XXXXXX | ||
| 45 | + BBBB | ||
| 46 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBB BBBBBBBBB | ||
| 47 | + XXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 48 | + BBBBB | ||
| 49 | + XXXXXX | ||
| 50 | + | ||
| 51 | + BB BBBBBBBBBBBB | ||
| 52 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXX | ||
| 53 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 54 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 55 | + XXXXXXXXX | ||
| 56 | + XXXX | ||
| 57 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 58 | + XXXXXXXXX | ||
| 59 | + BBBBBB | ||
| 60 | + XXXXX | ||
| 61 | + XXXXXX | ||
| 62 | + BBBBB | ||
| 63 | + XXXXXX | ||
| 64 | + BBBBBB | ||
| 65 | + | ||
| 66 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 67 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 68 | + XXXXXXXXX XXXX XXXX XXXXXXXXX XXXXXX XXXXXXXXXXXX | ||
| 69 | + XXXXXX | ||
| 70 | + XXXXXX | ||
| 71 | + | ||
| 72 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 73 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 74 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Close') XXXXXXXXX | ||
| 75 | + XXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 76 | + XXXXXX | ||
| 77 | + XXXXXX | ||
| 78 | + XXXXXXXXXXX | ||
| 79 | + XXXXXXX | ||
| 80 | + XXXX XXXX XXXX XXX | ||
| 81 | + XXXXXX | ||
| 82 | + XXXXXX | ||
| 83 | + XXXXXX | ||
| 84 | + XXXXXX | ||
| 85 | +XXXXXX | ||
| 86 | + | ||
| 87 | +BBBBB BBBBBBBBBBB | ||
| 88 | + | ||
| 89 | + | ||
| 90 | + XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 91 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 92 | + XXX XXXX X XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 93 | + XXXXXXXX | ||
| 94 | + XXXX XBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBXX | ||
| 95 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 96 | + XXXXX XXXXX | ||
| 97 | + XXXXXX XXXXXX | ||
| 98 | + XXXXXXXXXXXX XXXXXX | ||
| 99 | + XXXXXXXXXXXX XXXXXX | ||
| 100 | + XXXXXXXX XXXXXXXXXXXXXX X | ||
| 101 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 102 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 103 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 104 | + XX | ||
| 105 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 106 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 107 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 108 | + XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 109 | + X | ||
| 110 | + XXX | ||
| 111 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 112 | + XXX | ||
| 113 | + XXXXXXXXX | ||
| 114 | +BBBBBBBB BBBBBBBBBBB | ||
| 0 | \ No newline at end of file | 115 | \ No newline at end of file |
| @@ -0,0 +1,77 @@ | @@ -0,0 +1,77 @@ | ||
| 1 | +BBBB BBBBBB BBBBBBBBBBBBB BBBB | ||
| 2 | + | ||
| 3 | +XXXX XXXXX XXXXXX XXXX XXX | ||
| 4 | +XXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXBBBBBB BBBBBBBBBBBBBBXX | ||
| 5 | + | ||
| 6 | +XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXX | ||
| 8 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 11 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Delete File') XXXXX | ||
| 13 | + XXXXXX | ||
| 14 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 15 | + XXXX XXXX XXX | ||
| 16 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 17 | + BBBBBBBBBB | ||
| 18 | + BB BBBBBBBB | ||
| 19 | + BBB BBBBBBB BB BBBBBBBB | ||
| 20 | + XXXX XXXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 21 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 22 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 23 | + XXXXXXXXX | ||
| 24 | + XXXXXXX | ||
| 25 | + XXXXXX | ||
| 26 | + BBBBBB | ||
| 27 | + BBBBB | ||
| 28 | + XXXXXXXXXX | ||
| 29 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 30 | + gettext(u'Are you sure to delete ') XX XXXXXXX XXXXXXXXXXXXXXX X XXXX XX X | ||
| 31 | + XXXXXX | ||
| 32 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 33 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 34 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Close') XXXXXXXXX | ||
| 35 | + XXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 36 | + XXXXXX | ||
| 37 | + XXXXXX | ||
| 38 | + XXXXXXXXXXX | ||
| 39 | + XXXXXXX | ||
| 40 | + XXXX XXXX XXXX XXX | ||
| 41 | + XXXXXX | ||
| 42 | + XXXXXX | ||
| 43 | + XXXXXX | ||
| 44 | + XXXXXX | ||
| 45 | +XXXXXX | ||
| 46 | + | ||
| 47 | +BBBBB BBBBBBBBBBB | ||
| 48 | + | ||
| 49 | + | ||
| 50 | + XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 51 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 52 | + XXX XXXX X XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 53 | + XXXXXXXX | ||
| 54 | + XXXX XBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX | ||
| 55 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 56 | + XXXXX XXXXX | ||
| 57 | + XXXXXX XXXXXX | ||
| 58 | + XXXXXXXXXXXX XXXXXX | ||
| 59 | + XXXXXXXXXXXX XXXXXX | ||
| 60 | + XXXXXXXX XXXXXXXXXXXXXX X | ||
| 61 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 62 | + XXXXXXXXXXXXXXXXXXXXX | ||
| 63 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 64 | + XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 65 | + XX | ||
| 66 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 67 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 68 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 69 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 70 | + XXXXXXXXXXXXXX | ||
| 71 | + X | ||
| 72 | + XXX | ||
| 73 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 74 | + XXX | ||
| 75 | + XXXXXXXXX | ||
| 76 | +BBBBBBBB BBBBBBBBBBB | ||
| 77 | +XXXX XXXXXXXX XXX | ||
| 0 | \ No newline at end of file | 78 | \ No newline at end of file |
| @@ -0,0 +1,120 @@ | @@ -0,0 +1,120 @@ | ||
| 1 | +BBBB BBBBBB BBBBBBBBBBBBB BBBB | ||
| 2 | + | ||
| 3 | +XXXX XXXXX XXXXXX XXXX XXX | ||
| 4 | +XXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXBBBBBB BBBBBBBBBBBBBBXX | ||
| 5 | + | ||
| 6 | +XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXX | ||
| 8 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 11 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Edit File') XXXXX | ||
| 13 | + XXXXXX | ||
| 14 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 15 | + XXXX XXXX XXX | ||
| 16 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 17 | + BBBBBBBBBB | ||
| 18 | + BB BBBBBBBB | ||
| 19 | + BBB BBBBBBB BB BBBBBBBB | ||
| 20 | + XXXX XXXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 21 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 22 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 23 | + XXXXXXXXX | ||
| 24 | + XXXXXXX | ||
| 25 | + XXXXXX | ||
| 26 | + BBBBBB | ||
| 27 | + BBBBB | ||
| 28 | + XXXXXXXXXX | ||
| 29 | + BBB BBBBB BB BBBB | ||
| 30 | + XXXX XXXXXXXXXXXXXXXXX XXXXXXXBB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 31 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 32 | + BB BBBBBBBBBBBBBBBBBBBB | ||
| 33 | + XXXXXX XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 34 | + BBBB | ||
| 35 | + XXXXXX XXXXXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 36 | + BBBBB | ||
| 37 | + BB BBBBBBBBBBBBB BB BBBBBBBBBBBBB | ||
| 38 | + XXXXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXX | ||
| 39 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 40 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Choose your file...') XX | ||
| 41 | + XXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 42 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXX XXXXXXXXXXXXXX | ||
| 43 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 44 | + XXXXXXXXX | ||
| 45 | + XXXXXXX | ||
| 46 | + XXXXXX | ||
| 47 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 48 | + XX XXXXXXX XXXXXXXXXXXXXXXX gettext(u'See current file') XXXX | ||
| 49 | + XXXXXX | ||
| 50 | + BBBB | ||
| 51 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBB BBBBBBBBB | ||
| 52 | + XXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 53 | + BBBBB | ||
| 54 | + XXXXXX | ||
| 55 | + | ||
| 56 | + BB BBBBBBBBBBBB | ||
| 57 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXX | ||
| 58 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 59 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 60 | + XXXXXXXXX | ||
| 61 | + XXXX | ||
| 62 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 63 | + XXXXXXXXX | ||
| 64 | + BBBBBB | ||
| 65 | + XXXXX | ||
| 66 | + XXXXXX | ||
| 67 | + BBBBB | ||
| 68 | + XXXXXX | ||
| 69 | + BBBBBB | ||
| 70 | + | ||
| 71 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 72 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 73 | + XXXXXXXXX XXXX XXXX XXXXXXXXX XXXXXX XXXXXXXXXXXX | ||
| 74 | + XXXXXX | ||
| 75 | + XXXXXX | ||
| 76 | + | ||
| 77 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 78 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 79 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Close') XXXXXXXXX | ||
| 80 | + XXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 81 | + XXXXXX | ||
| 82 | + XXXXXX | ||
| 83 | + XXXXXXXXXXX | ||
| 84 | + XXXXXXX | ||
| 85 | + XXXX XXXX XXXX XXX | ||
| 86 | + XXXXXX | ||
| 87 | + XXXXXX | ||
| 88 | + XXXXXX | ||
| 89 | + XXXXXX | ||
| 90 | +XXXXXX | ||
| 91 | + | ||
| 92 | +BBBBB BBBBBBBBBBB | ||
| 93 | + | ||
| 94 | + | ||
| 95 | + XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 96 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 97 | + XXX XXXX X XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 98 | + XXXXXXXX | ||
| 99 | + XXXX XBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX | ||
| 100 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 101 | + XXXXX XXXXX | ||
| 102 | + XXXXXX XXXXXX | ||
| 103 | + XXXXXXXXXXXX XXXXXX | ||
| 104 | + XXXXXXXXXXXX XXXXXX | ||
| 105 | + XXXXXXXX XXXXXXXXXXXXXX X | ||
| 106 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 107 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 108 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 109 | + XX | ||
| 110 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 111 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 112 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 113 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 114 | + X | ||
| 115 | + XXX | ||
| 116 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 117 | + XXX | ||
| 118 | + XXXXXXXXX | ||
| 119 | +BBBBBBBB BBBBBBBBBBB | ||
| 120 | +XXXX XXXXXXXX XXX | ||
| 0 | \ No newline at end of file | 121 | \ No newline at end of file |
files/views.py
| @@ -11,9 +11,10 @@ from .models import TopicFile | @@ -11,9 +11,10 @@ from .models import TopicFile | ||
| 11 | from .utils import mime_type_to_material_icons | 11 | from .utils import mime_type_to_material_icons |
| 12 | from courses.models import Topic | 12 | from courses.models import Topic |
| 13 | from core.models import MimeType | 13 | from core.models import MimeType |
| 14 | +from core.mixins import NotificationMixin | ||
| 14 | 15 | ||
| 15 | # Create your views here. | 16 | # Create your views here. |
| 16 | -class CreateFile(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | 17 | +class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.edit.CreateView): |
| 17 | allowed_roles = ['professor', 'system_admin'] | 18 | allowed_roles = ['professor', 'system_admin'] |
| 18 | login_url = reverse_lazy("core:home") | 19 | login_url = reverse_lazy("core:home") |
| 19 | redirect_field_name = 'next' | 20 | redirect_field_name = 'next' |
| @@ -32,6 +33,10 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | @@ -32,6 +33,10 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | ||
| 32 | self.object = form.save(commit = False) | 33 | self.object = form.save(commit = False) |
| 33 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | 34 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) |
| 34 | self.object.topic = topic | 35 | self.object.topic = topic |
| 36 | + | ||
| 37 | + self.object.name = str(self.object) | ||
| 38 | + | ||
| 39 | + | ||
| 35 | # Set MimeType | 40 | # Set MimeType |
| 36 | file = self.request.FILES['file_url'] | 41 | file = self.request.FILES['file_url'] |
| 37 | try: | 42 | try: |
| @@ -54,6 +59,10 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | @@ -54,6 +59,10 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | ||
| 54 | # self.object.file_type = MimeType.objects.get(id = 1) | 59 | # self.object.file_type = MimeType.objects.get(id = 1) |
| 55 | 60 | ||
| 56 | self.object.save() | 61 | self.object.save() |
| 62 | + #CREATE NOTIFICATION | ||
| 63 | + super(CreateFile, self).createNotification(message="uploaded a File "+ self.object.name, actor=self.request.user, | ||
| 64 | + resource_name=self.object.name, resource_link= reverse('course:file:create_file', args=[self.object.slug]), | ||
| 65 | + users=self.object.topic.subject.students.all()) | ||
| 57 | 66 | ||
| 58 | return self.get_success_url() | 67 | return self.get_success_url() |
| 59 | 68 |
forum/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:32 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | +from django.conf import settings | ||
| 5 | from django.db import migrations, models | 6 | from django.db import migrations, models |
| 6 | import django.db.models.deletion | 7 | import django.db.models.deletion |
| 7 | 8 | ||
| @@ -12,6 +13,7 @@ class Migration(migrations.Migration): | @@ -12,6 +13,7 @@ class Migration(migrations.Migration): | ||
| 12 | 13 | ||
| 13 | dependencies = [ | 14 | dependencies = [ |
| 14 | ('courses', '0001_initial'), | 15 | ('courses', '0001_initial'), |
| 16 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 15 | ] | 17 | ] |
| 16 | 18 | ||
| 17 | operations = [ | 19 | operations = [ |
| @@ -24,8 +26,8 @@ class Migration(migrations.Migration): | @@ -24,8 +26,8 @@ class Migration(migrations.Migration): | ||
| 24 | ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), | 26 | ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), |
| 25 | ], | 27 | ], |
| 26 | options={ | 28 | options={ |
| 27 | - 'verbose_name': 'Forum', | ||
| 28 | 'verbose_name_plural': 'Foruns', | 29 | 'verbose_name_plural': 'Foruns', |
| 30 | + 'verbose_name': 'Forum', | ||
| 29 | }, | 31 | }, |
| 30 | bases=('courses.activity',), | 32 | bases=('courses.activity',), |
| 31 | ), | 33 | ), |
| @@ -36,10 +38,12 @@ class Migration(migrations.Migration): | @@ -36,10 +38,12 @@ class Migration(migrations.Migration): | ||
| 36 | ('message', models.TextField(verbose_name='Post message')), | 38 | ('message', models.TextField(verbose_name='Post message')), |
| 37 | ('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')), | 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')), |
| 41 | + ('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum')), | ||
| 42 | + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')), | ||
| 39 | ], | 43 | ], |
| 40 | options={ | 44 | options={ |
| 41 | - 'verbose_name': 'Post', | ||
| 42 | 'verbose_name_plural': 'Posts', | 45 | 'verbose_name_plural': 'Posts', |
| 46 | + 'verbose_name': 'Post', | ||
| 43 | }, | 47 | }, |
| 44 | ), | 48 | ), |
| 45 | migrations.CreateModel( | 49 | migrations.CreateModel( |
| @@ -50,10 +54,11 @@ class Migration(migrations.Migration): | @@ -50,10 +54,11 @@ class Migration(migrations.Migration): | ||
| 50 | ('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')), | 54 | ('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')), |
| 51 | ('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')), |
| 52 | ('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')), |
| 57 | + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')), | ||
| 53 | ], | 58 | ], |
| 54 | options={ | 59 | options={ |
| 55 | - 'verbose_name': 'Post Answer', | ||
| 56 | 'verbose_name_plural': 'Post Answers', | 60 | 'verbose_name_plural': 'Post Answers', |
| 61 | + 'verbose_name': 'Post Answer', | ||
| 57 | }, | 62 | }, |
| 58 | ), | 63 | ), |
| 59 | ] | 64 | ] |
forum/migrations/0002_auto_20161018_1842.py
| @@ -1,35 +0,0 @@ | @@ -1,35 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | ||
| 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 | - initial = True | ||
| 13 | - | ||
| 14 | - dependencies = [ | ||
| 15 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 16 | - ('forum', '0001_initial'), | ||
| 17 | - ] | ||
| 18 | - | ||
| 19 | - operations = [ | ||
| 20 | - migrations.AddField( | ||
| 21 | - model_name='postanswer', | ||
| 22 | - name='user', | ||
| 23 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor'), | ||
| 24 | - ), | ||
| 25 | - migrations.AddField( | ||
| 26 | - model_name='post', | ||
| 27 | - name='forum', | ||
| 28 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum'), | ||
| 29 | - ), | ||
| 30 | - migrations.AddField( | ||
| 31 | - model_name='post', | ||
| 32 | - name='user', | ||
| 33 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor'), | ||
| 34 | - ), | ||
| 35 | - ] |
| @@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
| 1 | +BBBB BBBBBB BBBB | ||
| 2 | +BBBB BBBBBBBBBBBBB | ||
| 3 | + | ||
| 4 | +XXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXBB BBBBBBBB BBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + BBBBBBBBBB | ||
| 6 | + BBB BBBBB BB BBBB | ||
| 7 | + XXXX XXXXXXXXXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 8 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBB | ||
| 9 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB | ||
| 10 | + BBBB | ||
| 11 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 12 | + BBBBBBBBBBBB BBBBB | ||
| 13 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + BB BBBBBBBBBBBB | ||
| 15 | + XXXX XXXXXXXXXXXX | ||
| 16 | + XXX XX | ||
| 17 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 18 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 19 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 20 | + XXXXXXXXX | ||
| 21 | + XXXX | ||
| 22 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 23 | + XXXXXXXXX | ||
| 24 | + BBBBBB | ||
| 25 | + XXXXX | ||
| 26 | + XXXXXX | ||
| 27 | + XXXXXX | ||
| 28 | + BBBBB | ||
| 29 | + BBBBB | ||
| 30 | + XXXXXX | ||
| 31 | + BBBBBB | ||
| 32 | +XXXXXXX | ||
| 0 | \ No newline at end of file | 33 | \ No newline at end of file |
| @@ -0,0 +1,66 @@ | @@ -0,0 +1,66 @@ | ||
| 1 | +BBBB BBBB BBBBBBBBBBBBBBB BBBBBBBBB | ||
| 2 | +BBBB BBBBBBBBBBBBB | ||
| 3 | + | ||
| 4 | +XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 6 | + XXXX | ||
| 7 | + | ||
| 8 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 9 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB BBBBBBBBBBBB BB BBBBBBBBB | ||
| 10 | + BBBBBBBBBB | ||
| 11 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 12 | + XX XXXXXXXXXX XXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 13 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + XXXX | ||
| 15 | + XXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 16 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Edit') XXXXXXXXX | ||
| 17 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBB BBBBBBBBXX XXX X gettext(u'Are you sure you want to delete this forum?') XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Delete') XXXXXXXXX | ||
| 18 | + XXXXX | ||
| 19 | + XXXXXX | ||
| 20 | + BBBBB | ||
| 21 | + XXXXXX | ||
| 22 | + XXXXX | ||
| 23 | + XXXXXXX gettext(u'Description') XXXXX XXXXX | ||
| 24 | + XXXXXXX gettext(u'Opened in') XXXXX XXXXX | ||
| 25 | + XXXXXX | ||
| 26 | +XXXXXX | ||
| 27 | + | ||
| 28 | +XXXX XXXXXXXXXXXXXXXX | ||
| 29 | + BBBBBBBBBB BBBBBBB BBBBB | ||
| 30 | +XXXXXX | ||
| 31 | + | ||
| 32 | +XXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 33 | + BBBBBBBBBB | ||
| 34 | + BBB BBBBB BB BBBB | ||
| 35 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBB | ||
| 36 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBB | ||
| 37 | + BBBB | ||
| 38 | + XXXX XXXXXXXXXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 39 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 40 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBB B BBBBBBBB | ||
| 41 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 42 | + BB BBBBBBBBBBBB | ||
| 43 | + XXXX XXXXXXXXXXXX | ||
| 44 | + XXX XX | ||
| 45 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 46 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 47 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 48 | + XXXXXXXXX | ||
| 49 | + XXXX | ||
| 50 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 51 | + XXXXXXXXX | ||
| 52 | + BBBBBB | ||
| 53 | + XXXXX | ||
| 54 | + XXXXXX | ||
| 55 | + XXXXXX | ||
| 56 | + BBBBB | ||
| 57 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 58 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXX XXXXXXXXXXXXXX | ||
| 59 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 60 | + XXXXXXXXX | ||
| 61 | + XXXXXXX | ||
| 62 | + XXXXXX | ||
| 63 | + XXXXXX | ||
| 64 | + BBBBB | ||
| 65 | + BBBBBB | ||
| 66 | +XXXXXXX | ||
| 0 | \ No newline at end of file | 67 | \ No newline at end of file |
| @@ -0,0 +1,131 @@ | @@ -0,0 +1,131 @@ | ||
| 1 | +BBBBBBB BBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BBBB BBBBBB BBBB BBBBBBBBBBBBBBB BBBBBBBBB | ||
| 4 | +BBBB BBBBBBBBBBBBB | ||
| 5 | + | ||
| 6 | +BBBBB BBBBBBBBBB | ||
| 7 | + XXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXBBBBBB BBBBBBBBBBBBBXXXXXXXXXXX | ||
| 8 | +BBBBBBBB | ||
| 9 | + | ||
| 10 | +BBBBB BBBBBBBBBBB | ||
| 11 | + | ||
| 12 | + XXX XXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXXXX XXXXXXBBB BBBBBBBBBBBXX gettext(u'Home') XXXXXXXXX | ||
| 14 | + XXXXXX XXXXXXBBB BBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBXXXXXXXXXXX | ||
| 15 | + BB BBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||
| 16 | + XXX XXXXXXXXXXXXXXX gettext(u'Forum') XXXXX | ||
| 17 | + BBBB | ||
| 18 | + XXX XXXXXXXXXXXXXXXXXXXX | ||
| 19 | + BBBBB | ||
| 20 | + | ||
| 21 | + XXXXX | ||
| 22 | +BBBBBBBB | ||
| 23 | + | ||
| 24 | +BBBBB BBBBBBB | ||
| 25 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXX | ||
| 26 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 27 | + XXXX gettext(u'Menu') XXXXX | ||
| 28 | + XXXXXX | ||
| 29 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 30 | + XXX XXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXX | ||
| 31 | + XXXXXX XXXXXXBBB BBBBBBBBBBBBBBBXX gettext(u'Profile') XXXXXXXXX | ||
| 32 | + XXXXXX XXXXXXBBB BBBBBBBBBBBBBBBXX gettext(u'My Courses') XXXXXXXXX | ||
| 33 | + XXXXX | ||
| 34 | + XXXXXX | ||
| 35 | + XXXXXX | ||
| 36 | + | ||
| 37 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB BBBBBBBBBBBB BB BBBBBBBBB | ||
| 38 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXX | ||
| 39 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 40 | + XXX XXXXXXXXXXXXXXXXXXXX gettext(u'Actions') XXXXX | ||
| 41 | + XXXXXX | ||
| 42 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 43 | + XXX XXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXX | ||
| 44 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBB BBBBBBBBXX XXX X gettext(u'Forum edited successfully!') XXXX gettext(u'Edit') XXXXXXXXX | ||
| 45 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBB BBBBBBBBXX XXX X gettext(u'Are you sure you want to delete this forum?') XX XBBB BBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBXXXX gettext(u'Delete') XXXXXXXXX | ||
| 46 | + XXXXX | ||
| 47 | + XXXXXX | ||
| 48 | + XXXXXX | ||
| 49 | + BBBBB | ||
| 50 | +BBBBBBBB | ||
| 51 | + | ||
| 52 | +BBBBB BBBBBBB | ||
| 53 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXXXXX | ||
| 54 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 55 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 56 | + XXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX | ||
| 57 | + XXXXXXXXX | ||
| 58 | + XXXXXXX gettext(u'Description') XXXXX XXXXX | ||
| 59 | + XXXXXXX gettext(u'Opened in') XXXXX XXXXX | ||
| 60 | + XXXXXX | ||
| 61 | + XXXXXX | ||
| 62 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 63 | + XXX XX | ||
| 64 | + XXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 65 | + BBBBBBBBBB | ||
| 66 | + BBB BBBBB BB BBBB | ||
| 67 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBB | ||
| 68 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBB | ||
| 69 | + BBBB | ||
| 70 | + XXXX XXXXXXXXXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 71 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 72 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBB B BBBBBBBB | ||
| 73 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 74 | + BB BBBBBBBBBBBB | ||
| 75 | + XXXX XXXXXXXXXXXX | ||
| 76 | + XXX XX | ||
| 77 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 78 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 79 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 80 | + XXXXXXXXX | ||
| 81 | + XXXX | ||
| 82 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 83 | + XXXXXXXXX | ||
| 84 | + BBBBBB | ||
| 85 | + XXXXX | ||
| 86 | + XXXXXX | ||
| 87 | + XXXXXX | ||
| 88 | + BBBBB | ||
| 89 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 90 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXX XXXXXXXXXXXXXX | ||
| 91 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 92 | + XXXXXXXXX | ||
| 93 | + XXXXXXX | ||
| 94 | + XXXXXX | ||
| 95 | + XXXXXX | ||
| 96 | + BBBBB | ||
| 97 | + BBBBBB | ||
| 98 | + XXXXXXX | ||
| 99 | + XXX XX | ||
| 100 | + XXXXXX | ||
| 101 | + XXXX XXXXXXXXXXXXXXXX | ||
| 102 | + BBBBBBBBBB BBBBBBB BBBBB | ||
| 103 | + XXXXXX | ||
| 104 | + XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXX | ||
| 105 | + XXXXXXXX | ||
| 106 | + XXXXX XXXXXXXXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 107 | + XXXXXXXXX | ||
| 108 | + XXXXXX | ||
| 109 | + XXXXXX | ||
| 110 | + XXXXXX | ||
| 111 | + XXXX XXXXX XX XXXX XXXXX XXXX XXXX XXX | ||
| 112 | + XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 113 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 114 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 115 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 116 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX gettext(u'Forum') XXXXX | ||
| 117 | + XXXXXX | ||
| 118 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 119 | + XXXXXXXXX | ||
| 120 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 121 | + XXXXXXXXXX | ||
| 122 | + XXXXXX | ||
| 123 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 124 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Close') XXXXXXXXX | ||
| 125 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Update') XXXXXXXXX | ||
| 126 | + XXXXXX | ||
| 127 | + XXXXXX | ||
| 128 | + XXXXXX | ||
| 129 | + XXXXXX | ||
| 130 | +BBBBBBBB | ||
| 131 | + |
| @@ -0,0 +1,56 @@ | @@ -0,0 +1,56 @@ | ||
| 1 | +BBBB BBBB BBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BB BBBBBBBBBBBB B B | ||
| 4 | + BBB BBBB BB BBBBB | ||
| 5 | + XXXX XXXXXXXXXXXX | ||
| 6 | + XXXX XXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXX | ||
| 7 | + XXX XXXXXXXXXXXXXXXXXX | ||
| 8 | + | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 10 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXX XBBB BBBBBBBBBBBBBBBBBBBBBBBBBXXXXX | ||
| 11 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXXX | ||
| 13 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBB BB BBBBBBBBB | ||
| 14 | + BBBBBBBBBB | ||
| 15 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 16 | + XX XXXXXXXXXX XXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 17 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 18 | + XXXX | ||
| 19 | + XXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 20 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBXX XXX X gettext(u'Post edited successfully!') XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Edit') XXXXXXXXX | ||
| 21 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Remove') XXXXXXXXX | ||
| 22 | + XXXXX | ||
| 23 | + XXXXXX | ||
| 24 | + BBBBB | ||
| 25 | + XXXXXX | ||
| 26 | + XXXXX | ||
| 27 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 28 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 29 | + XX XXXXXXXXXXXXXXXXXXXXX | ||
| 30 | + XX XXXXXXXXX XXXXXXXXXXXXXXXX FFFFFFFFF gettext(u'ago') | ||
| 31 | + BB BBBBBBBBBBBBBBBB | ||
| 32 | + XXXX X gettext(u'Edited') XXXXX | ||
| 33 | + BBBBB | ||
| 34 | + XXXX | ||
| 35 | + XXXXXX | ||
| 36 | + XX XXXXXXXXXXXXXXXXXXXXXFFFFFFFFFFXXXX | ||
| 37 | + XXXXXX | ||
| 38 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 39 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 40 | + BBBBBBBBBBBBBBBB BBBBBBB BBBB | ||
| 41 | + XXXXXX | ||
| 42 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXX | ||
| 43 | + XXXXXXXX | ||
| 44 | + XXXXX XXXXXXXXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 45 | + XXXXXXXXX | ||
| 46 | + XXXXXX | ||
| 47 | + XXXXXX | ||
| 48 | + XXXXXX | ||
| 49 | + BBBBBB | ||
| 50 | +BBBBB | ||
| 51 | + | ||
| 52 | +BB BBB BBBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBB | ||
| 53 | + XX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X XBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXX | ||
| 54 | + gettext(u'Load more posts') | ||
| 55 | + XXXX | ||
| 56 | +BBBBB | ||
| 0 | \ No newline at end of file | 57 | \ No newline at end of file |
forum/templates/post/post_render.html
| @@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
| 15 | <i class="material-icons">more_horiz</i> | 15 | <i class="material-icons">more_horiz</i> |
| 16 | </a> | 16 | </a> |
| 17 | <ul class="dropdown-menu pull-right" aria-labelledby="dropdownMenu1"> | 17 | <ul class="dropdown-menu pull-right" aria-labelledby="dropdownMenu1"> |
| 18 | - <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}', '{% trans 'Post edited successfully!' %}')"></li> | 18 | + <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}', '{% trans 'Post edited successfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> |
| 19 | <li><a href="javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 19 | <li><a href="javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
| 20 | </ul> | 20 | </ul> |
| 21 | </div> | 21 | </div> |
| @@ -26,7 +26,7 @@ | @@ -26,7 +26,7 @@ | ||
| 26 | <div class="card-data"> | 26 | <div class="card-data"> |
| 27 | <p class="comment-date"> | 27 | <p class="comment-date"> |
| 28 | <i class="fa fa-clock-o"></i> {{ post.post_date|timesince }} {% trans 'ago' %} | 28 | <i class="fa fa-clock-o"></i> {{ post.post_date|timesince }} {% trans 'ago' %} |
| 29 | - {% if post.post_date != post.modifiction_date %} | 29 | + {% if post.is_modified %} |
| 30 | <em> - {% trans 'Edited' %}</em> | 30 | <em> - {% trans 'Edited' %}</em> |
| 31 | {% endif %} | 31 | {% endif %} |
| 32 | </p> | 32 | </p> |
| @@ -0,0 +1,41 @@ | @@ -0,0 +1,41 @@ | ||
| 1 | +BBBB BBBB BBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +XXXX XXXXXXXXXXXX | ||
| 4 | + XXXX XXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXX | ||
| 5 | + XXX XXXXXXXXXXXXXXXXXX | ||
| 6 | + | ||
| 7 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 8 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXX XBBB BBBBBBBBBBBBBBBBBBBBBBBBBXXXXX | ||
| 9 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXX | ||
| 11 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB BBBBBBBBBBBB BB BBBBBBBBB | ||
| 12 | + BBBBBBBBBB | ||
| 13 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 14 | + XX XXXXXXXXXX XXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 16 | + XXXX | ||
| 17 | + XXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 18 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBXX XXX X gettext(u'Post edited successfully!') XXXXXXXXX | ||
| 19 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBXX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Remove') XXXXXXXXX | ||
| 20 | + XXXXX | ||
| 21 | + XXXXXX | ||
| 22 | + BBBBB | ||
| 23 | + XXXXXX | ||
| 24 | + XXXXX | ||
| 25 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 26 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 27 | + XX XXXXXXXXXXXXXXXXXXXXX | ||
| 28 | + XX XXXXXXXXX XXXXXXXXXXXXXXXX FFFFFFFFF gettext(u'ago') | ||
| 29 | + BB BBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBBBB | ||
| 30 | + XXXX X gettext(u'Edited') XXXXX | ||
| 31 | + BBBBB | ||
| 32 | + XXXX | ||
| 33 | + XXXXXX | ||
| 34 | + XX XXXXXXXXXXXXXXXXXXXXXFFFFFFFFFFXXXX | ||
| 35 | + XXXXXX | ||
| 36 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 37 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 38 | + BBBBBBBBBBBBBBBB BBBBBBB BBBB | ||
| 39 | + XXXXXX | ||
| 40 | + XXXXXX | ||
| 41 | +XXXXXX | ||
| 0 | \ No newline at end of file | 42 | \ No newline at end of file |
| @@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
| 1 | +BBBB BBBB BBBBBBBBBBBBBBB BBBBBBBBB | ||
| 2 | +BBBB BBBBBBBBBBBBB | ||
| 3 | + | ||
| 4 | +XXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + BBBBBBBBBB | ||
| 6 | + BBB BBBBB BB BBBB | ||
| 7 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBB | ||
| 8 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB | ||
| 9 | + BBBB | ||
| 10 | + XXXX XXXXXXXXXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 11 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 12 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBB B BBBBBBBB | ||
| 13 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + BB BBBBBBBBBBBB | ||
| 15 | + XXXX XXXXXXXXXXXX | ||
| 16 | + XXX XX | ||
| 17 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 18 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 19 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 20 | + XXXXXXXXX | ||
| 21 | + XXXX | ||
| 22 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 23 | + XXXXXXXXX | ||
| 24 | + BBBBBB | ||
| 25 | + XXXXX | ||
| 26 | + XXXXXX | ||
| 27 | + XXXXXX | ||
| 28 | + BBBBB | ||
| 29 | + XXXXXX | ||
| 30 | + XXXXXX | ||
| 31 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 32 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX gettext(u'Cancel') XXXXXXXXX | ||
| 33 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Save changes') XXXXXXXXX | ||
| 34 | + XXXXXX | ||
| 35 | + BBBBB | ||
| 36 | + BBBBBB | ||
| 37 | +XXXXXXX | ||
| 0 | \ No newline at end of file | 38 | \ No newline at end of file |
| @@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
| 1 | +BBBB BBBBBB BBBB | ||
| 2 | +BBBB BBBBBBBBBBBBB | ||
| 3 | + | ||
| 4 | +XXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXBB BBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + BBBBBBBBBB | ||
| 6 | + BBB BBBBB BB BBBB | ||
| 7 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBB | ||
| 8 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB | ||
| 9 | + BBBB | ||
| 10 | + XXXX XXXXXXXXXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBB XXXXXXXXXXXXXX | ||
| 11 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 13 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB | ||
| 14 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | + BB BBBBBBBBBBBB | ||
| 16 | + XXXX XXXXXXXXXXXX | ||
| 17 | + XXX XX | ||
| 18 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 19 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 20 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 21 | + XXXXXXXXX | ||
| 22 | + XXXX | ||
| 23 | + BBB BBBBB BB BBBBBBBBBBBB | ||
| 24 | + XXXXXXXXX | ||
| 25 | + BBBBBB | ||
| 26 | + XXXXX | ||
| 27 | + XXXXXX | ||
| 28 | + XXXXXX | ||
| 29 | + BBBBB | ||
| 30 | + BB BBBBBB | ||
| 31 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 32 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX gettext(u'Cancel') XXXXXXXXX | ||
| 33 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Save changes') XXXXXXXXX | ||
| 34 | + XXXXXX | ||
| 35 | + BBBB | ||
| 36 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXX | ||
| 37 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXX XXXXXXXXXXXXXX | ||
| 38 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 39 | + XXXXXXXXX | ||
| 40 | + XXXXXXX | ||
| 41 | + BBBBB | ||
| 42 | + XXXXXX | ||
| 43 | + XXXXXX | ||
| 44 | + BBBBB | ||
| 45 | + BBBBBB | ||
| 46 | +XXXXXXX | ||
| 0 | \ No newline at end of file | 47 | \ No newline at end of file |
| @@ -0,0 +1,44 @@ | @@ -0,0 +1,44 @@ | ||
| 1 | +BBBB BBBB BBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BB BBBBBBBBBBBBBB B B | ||
| 4 | + BBB BBBBBB BB BBBBBBB | ||
| 5 | + XXXXX | ||
| 6 | + XXXX XXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXX | ||
| 7 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXX | ||
| 8 | + XXX XXXXXXXXXXXXXXXXXX | ||
| 9 | + | ||
| 10 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBB BB BBBBBBBBBBB | ||
| 11 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 13 | + XX XXXXXXXXXX XXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | + XXXX | ||
| 16 | + XXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 17 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX XXX X gettext(u'Answer edited sucessfully!') XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Edit') XXXXXXXXX | ||
| 18 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX XXX X gettext(u'Are you sure you want to delete this answer?') XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Remove') XXXXXXXXX | ||
| 19 | + XXXXX | ||
| 20 | + XXXXXX | ||
| 21 | + XXXXXX | ||
| 22 | + BBBBB | ||
| 23 | + XXXXX | ||
| 24 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 25 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 26 | + XX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXXXX FFFFFFFFF gettext(u'ago') | ||
| 27 | + BB BBBBBBBBBBBBBBBBBB | ||
| 28 | + XXXX X gettext(u'Edited') XXXXX | ||
| 29 | + BBBBB | ||
| 30 | + XXXX | ||
| 31 | + XXXXXX | ||
| 32 | + XX XXXXXXXXXXXXXXXXXXXXXFFFFFFFFFFXXXX | ||
| 33 | + XXXXXX | ||
| 34 | + XXXXXX | ||
| 35 | + XXXXXX | ||
| 36 | + XXXXXX | ||
| 37 | + BBBBBB | ||
| 38 | +BBBBB | ||
| 39 | + | ||
| 40 | +BB BBB BBBBBBBBBBBBBBB BB BBBBBBBBBBBBBBBBBBB | ||
| 41 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X X XBBB BBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 42 | + gettext(u'Load more answers') | ||
| 43 | + XXXX | ||
| 44 | +BBBBB | ||
| 0 | \ No newline at end of file | 45 | \ No newline at end of file |
| @@ -0,0 +1,34 @@ | @@ -0,0 +1,34 @@ | ||
| 1 | +BBBB BBBB BBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +XXXXX | ||
| 4 | + XXXX XXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXX | ||
| 6 | + XXX XXXXXXXXXXXXXXXXXX | ||
| 7 | + | ||
| 8 | + BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB BBBBBBBBBBBB BB BBBBBBBBBBB | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 11 | + XX XXXXXXXXXX XXXXXXXXXXX XXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 12 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXX | ||
| 14 | + XXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX XXX X gettext(u'Answer edited sucessfully!') XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Edit') XXXXXXXXX | ||
| 16 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX XXX X gettext(u'Are you sure you want to delete this answer?') XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gettext(u'Remove') XXXXXXXXX | ||
| 17 | + XXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXXXX | ||
| 20 | + BBBBB | ||
| 21 | + XXXXX | ||
| 22 | + XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 23 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 24 | + XX XXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXXXX FFFFFFFFF gettext(u'ago') | ||
| 25 | + BB BBBBBBBBBBBBBBBBBB | ||
| 26 | + XXXX X gettext(u'Edited') XXXXX | ||
| 27 | + BBBBB | ||
| 28 | + XXXX | ||
| 29 | + XXXXXX | ||
| 30 | + XX XXXXXXXXXXXXXXXXXXXXXFFFFFFFFFFXXXX | ||
| 31 | + XXXXXX | ||
| 32 | + XXXXXX | ||
| 33 | + XXXXXX | ||
| 34 | +XXXXXX | ||
| 0 | \ No newline at end of file | 35 | \ No newline at end of file |
forum/views.py
| @@ -9,8 +9,11 @@ from django.http import Http404 | @@ -9,8 +9,11 @@ from django.http import Http404 | ||
| 9 | 9 | ||
| 10 | from .models import Forum, Post, PostAnswer | 10 | from .models import Forum, Post, PostAnswer |
| 11 | from courses.models import Topic | 11 | from courses.models import Topic |
| 12 | +from core.mixins import NotificationMixin | ||
| 13 | +from core.models import Action, Resource | ||
| 12 | 14 | ||
| 13 | from .forms import ForumForm, PostForm, PostAnswerForm | 15 | from .forms import ForumForm, PostForm, PostAnswerForm |
| 16 | +from django.urls import reverse | ||
| 14 | 17 | ||
| 15 | """ | 18 | """ |
| 16 | Forum Section | 19 | Forum Section |
| @@ -36,7 +39,7 @@ class ForumIndex(LoginRequiredMixin, generic.ListView): | @@ -36,7 +39,7 @@ class ForumIndex(LoginRequiredMixin, generic.ListView): | ||
| 36 | 39 | ||
| 37 | return context | 40 | return context |
| 38 | 41 | ||
| 39 | -class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | 42 | +class CreateForumView(LoginRequiredMixin, generic.edit.CreateView, NotificationMixin): |
| 40 | login_url = reverse_lazy("core:home") | 43 | login_url = reverse_lazy("core:home") |
| 41 | redirect_field_name = 'next' | 44 | redirect_field_name = 'next' |
| 42 | 45 | ||
| @@ -52,6 +55,11 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | @@ -52,6 +55,11 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | ||
| 52 | def get_success_url(self): | 55 | def get_success_url(self): |
| 53 | self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) | 56 | self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) |
| 54 | 57 | ||
| 58 | + | ||
| 59 | + action = super(CreateForumView, self).createorRetrieveAction("create Topic") | ||
| 60 | + super(CreateForumView, self).createNotification("Forum "+ self.object.name + " was created", | ||
| 61 | + resource_name=self.object.name, resource_link= reverse('course:forum:view', args=[self.object.slug]), | ||
| 62 | + actor=self.request.user, users = self.object.topic.subject.students.all() ) | ||
| 55 | return self.success_url | 63 | return self.success_url |
| 56 | 64 | ||
| 57 | def render_forum(request, forum): | 65 | def render_forum(request, forum): |
| @@ -144,7 +152,7 @@ def load_posts(request, forum_id): | @@ -144,7 +152,7 @@ def load_posts(request, forum_id): | ||
| 144 | 152 | ||
| 145 | return render(request, 'post/post_list.html', context) | 153 | return render(request, 'post/post_list.html', context) |
| 146 | 154 | ||
| 147 | -class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | 155 | +class CreatePostView(LoginRequiredMixin, generic.edit.CreateView, NotificationMixin): |
| 148 | login_url = reverse_lazy("core:home") | 156 | login_url = reverse_lazy("core:home") |
| 149 | redirect_field_name = 'next' | 157 | redirect_field_name = 'next' |
| 150 | 158 | ||
| @@ -155,6 +163,8 @@ class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | @@ -155,6 +163,8 @@ class CreatePostView(LoginRequiredMixin, generic.edit.CreateView): | ||
| 155 | self.object.user = self.request.user | 163 | self.object.user = self.request.user |
| 156 | 164 | ||
| 157 | self.object.save() | 165 | self.object.save() |
| 166 | + super(CreatePostView, self).createNotification(self.object.user.username + " posted on " + self.object.forum,name, | ||
| 167 | + resource_slug = self.object.forum.slug, actor=self.request.user, users= self.object.forum.topic.subject.students.all()) | ||
| 158 | 168 | ||
| 159 | return super(CreatePostView, self).form_valid(form) | 169 | return super(CreatePostView, self).form_valid(form) |
| 160 | 170 |
links/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:32 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | from django.db import migrations, models | 5 | from django.db import migrations, models |
| @@ -23,8 +23,8 @@ class Migration(migrations.Migration): | @@ -23,8 +23,8 @@ class Migration(migrations.Migration): | ||
| 23 | ('link_description', models.CharField(max_length=200)), | 23 | ('link_description', models.CharField(max_length=200)), |
| 24 | ], | 24 | ], |
| 25 | options={ | 25 | options={ |
| 26 | - 'verbose_name': 'Link', | ||
| 27 | 'verbose_name_plural': 'Links', | 26 | 'verbose_name_plural': 'Links', |
| 27 | + 'verbose_name': 'Link', | ||
| 28 | }, | 28 | }, |
| 29 | bases=('courses.material',), | 29 | bases=('courses.material',), |
| 30 | ), | 30 | ), |
links/static/links.js
| 1 | function get_modal_link(url, id,div_content){ | 1 | function get_modal_link(url, id,div_content){ |
| 2 | $.get(url, function (data) { | 2 | $.get(url, function (data) { |
| 3 | - //alert(data); | ||
| 4 | - // $(div_content).empty(); | ||
| 5 | - // $(div_content).append(data); | 3 | + $(div_content).empty(); |
| 4 | + $(div_content).append(data); | ||
| 6 | $(id).modal('show'); | 5 | $(id).modal('show'); |
| 7 | }); | 6 | }); |
| 8 | 7 |
links/templates/links/create_link.html
| 1 | +{% load widget_tweaks i18n %} | ||
| 2 | + | ||
| 1 | <!--MODAL CREATE LINK--> | 3 | <!--MODAL CREATE LINK--> |
| 2 | -<div class="modal fade" id="createLinksModal" tabindex="-1" role="dialog" aria-labelledby="createLink" style="display: none;"> | 4 | +<div class="modal fade" id="createLinksModal" tabindex="-1" role="dialog" aria-labelledby="createLink"> |
| 3 | <div class="modal-dialog" role="document"> | 5 | <div class="modal-dialog" role="document"> |
| 4 | <div class="modal-content"> | 6 | <div class="modal-content"> |
| 5 | <div class="modal-header"> | 7 | <div class="modal-header"> |
| @@ -8,25 +10,59 @@ | @@ -8,25 +10,59 @@ | ||
| 8 | </div> | 10 | </div> |
| 9 | <div class="modal-body"> | 11 | <div class="modal-body"> |
| 10 | <!-- Card --> | 12 | <!-- Card --> |
| 11 | - <div class="form-group is-empty"> | ||
| 12 | - <label class="control-label" for="inputDefault">Name</label> | ||
| 13 | - <input type="text" class="form-control" id="inputDefault"> | ||
| 14 | - </div> | ||
| 15 | - <div class="form-group is-empty"> | ||
| 16 | - <label class="control-label" for="inputDefault">Url</label> | ||
| 17 | - <input type="text" class="form-control" id="inputDefault"> | ||
| 18 | - </div> | ||
| 19 | - <div class="form-group is-empty"> | ||
| 20 | - <label class="control-label" for="inputDefault">Descrição</label> | ||
| 21 | - <textarea class="form-control" rows="3"></textarea> | ||
| 22 | - </div> | 13 | + <form method="post" action="" id="form-link" enctype="multipart/form-data"> |
| 14 | + {% csrf_token %} | ||
| 15 | + {% if messages %} | ||
| 16 | + {% for message in messages %} | ||
| 17 | + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert"> | ||
| 18 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
| 19 | + <span aria-hidden="true">×</span> | ||
| 20 | + </button> | ||
| 21 | + <p>{{ message }}</p> | ||
| 22 | + </div> | ||
| 23 | + {% endfor %} | ||
| 24 | + {% endif %} | ||
| 25 | + {% for field in form %} | ||
| 26 | + {% if field.field.required %} | ||
| 27 | + <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
| 28 | + {% else %} | ||
| 29 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
| 30 | + {% endif %} | ||
| 31 | + {% render_field field class='form-control' %} | ||
| 32 | + {% endfor %} | ||
| 23 | <div class="form-group"> | 33 | <div class="form-group"> |
| 24 | <a href="javascript:void(0)" class="btn btn-raised btn-default" data-dismiss="modal">Cancel</a> | 34 | <a href="javascript:void(0)" class="btn btn-raised btn-default" data-dismiss="modal">Cancel</a> |
| 25 | - <a href="javascript:void(0)" class="btn btn-raised btn-primary">Submit</a> | ||
| 26 | - </div> | 35 | + <button class="btn btn-raised btn-primary" type="submit">Submit</button> |
| 36 | + </div> | ||
| 27 | <!-- .end Card --> | 37 | <!-- .end Card --> |
| 28 | </div> | 38 | </div> |
| 29 | </div> | 39 | </div> |
| 30 | </div> | 40 | </div> |
| 31 | </div> | 41 | </div> |
| 32 | <!-- EndModal --> | 42 | <!-- EndModal --> |
| 43 | + | ||
| 44 | +{# // <script src="{% static '/links.js' %}"></script> #} | ||
| 45 | +<script type="text/javascript"> | ||
| 46 | + $("#form-link").submit(function(event) { | ||
| 47 | + var data = new FormData($('#form-link').get(0)); | ||
| 48 | + $.ajax({ | ||
| 49 | + url: "{% url 'course:links:create_link' topic.slug %}", | ||
| 50 | + type: $("#form-link").attr('method'), | ||
| 51 | + data: data, | ||
| 52 | + cache: false, | ||
| 53 | + processData: false, | ||
| 54 | + contentType: false, | ||
| 55 | + success: function(data) { | ||
| 56 | + $('#createLinksModal').modal('hide'); | ||
| 57 | + $('#list-topic{{ topic.id }}-links').append(data); | ||
| 58 | + $('#list-topic{{ topic.id }}-links-edit').append(data); | ||
| 59 | + }, | ||
| 60 | + error: function(data){ | ||
| 61 | + $('.erro').html(data.responseText); | ||
| 62 | + $('.modal-backdrop').remove(); | ||
| 63 | + $('#createLinksModal').modal(); | ||
| 64 | + } | ||
| 65 | + }); | ||
| 66 | + event.preventDefault(); | ||
| 67 | + }); | ||
| 68 | +</script> |
| @@ -0,0 +1,58 @@ | @@ -0,0 +1,58 @@ | ||
| 1 | +BBBB BBBBBBBBBBBBB BBBB | ||
| 2 | + | ||
| 3 | +XXXXXXXXX XXXXXX XXXXXXX | ||
| 4 | +XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 6 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 9 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX X XXX XXXXXXXXX | ||
| 10 | + XXXXXX | ||
| 11 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXXX XXXX XXX | ||
| 13 | + XXXXX XXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + BBBBBBBBBB | ||
| 15 | + BBB BBBBB BB BBBB | ||
| 16 | + BB BBBBBBBBBBBBBBBBBBBB | ||
| 17 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 18 | + BBBB | ||
| 19 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 20 | + BBBBB | ||
| 21 | + BBBBBBBBBBBB BBBBB BBBBBBBBBBBBBBBBBBBB | ||
| 22 | + BBBBBB | ||
| 23 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 24 | + XX XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 25 | + XXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 26 | + XXXXXX | ||
| 27 | + XXXX XXXX XXXX XXX | ||
| 28 | + XXXXXX | ||
| 29 | + XXXXXX | ||
| 30 | + XXXXXX | ||
| 31 | +XXXXXX | ||
| 32 | +XXXX XXXXXXXX XXX | ||
| 33 | + | ||
| 34 | + | ||
| 35 | +XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 36 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 37 | + XXX XXXX X XXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 38 | + XXXXXXXX | ||
| 39 | + XXXX XBBB BBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBXX | ||
| 40 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 41 | + XXXXX XXXXX | ||
| 42 | + XXXXXX XXXXXX | ||
| 43 | + XXXXXXXXXXXX XXXXXX | ||
| 44 | + XXXXXXXXXXXX XXXXXX | ||
| 45 | + XXXXXXXX XXXXXXXXXXXXXX X | ||
| 46 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 47 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 48 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 49 | + XX | ||
| 50 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 51 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 52 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 53 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 54 | + X | ||
| 55 | + XXX | ||
| 56 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 57 | + XXX | ||
| 58 | +XXXXXXXXX |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | +XXXX XXXXX XXXXXX XXXX XXX | ||
| 2 | +XXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 3 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 4 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 6 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXX XXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXXXXX | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXXX XXX XXXXXX XXXX XX XXXXXX XXXX XXXXXXXXX | ||
| 11 | + XXXXXX | ||
| 12 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXX XXX | ||
| 14 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 16 | + | ||
| 17 | + XXXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXXXX | ||
| 20 | +XXXXXX | ||
| 21 | +XXXX XXX XXX |
| @@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
| 1 | +<li><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link}}</a></li> |
| @@ -0,0 +1 @@ | @@ -0,0 +1 @@ | ||
| 1 | +XXXXXX XXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| @@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
| 1 | +XXXX XXXXX XXXX XXXXXXX | ||
| 2 | +XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 3 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 4 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 6 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXXXXX | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXX XXXX XXX | ||
| 11 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 12 | + XXXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 13 | + XXXXXX XXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX | ||
| 14 | + XXXXXX | ||
| 15 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 16 | + XXXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 17 | + XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXX XXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 20 | + XXXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 21 | + XXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX | ||
| 22 | + XXXXXX | ||
| 23 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 24 | + XX XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 25 | + XX XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 26 | + XXXXXX | ||
| 27 | + XXXX XXXX XXXX XXX | ||
| 28 | + XXXXXX | ||
| 29 | + XXXXXX | ||
| 30 | + XXXXXX | ||
| 31 | +XXXXXX | ||
| 32 | +XXXX XXXXXXXX XXX |
| @@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
| 1 | +{% load static i18n list_topic_foruns permission_tags %} | ||
| 2 | +<!--MODAL VIEW LINK--> | ||
| 3 | +<div class="modal fade" data-backdrop="false" id="viewLinkModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | ||
| 4 | + <div class="modal-dialog" role="document"> | ||
| 5 | + <div class="modal-content"> | ||
| 6 | + <div class="modal-header"> | ||
| 7 | + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||
| 8 | + <h4 class="modal-title" id="myModalLabel">Link</h4> | ||
| 9 | + </div> | ||
| 10 | + <div class="modal-body"> | ||
| 11 | + <!-- Card --> | ||
| 12 | + <article class="card animated fadeInLeft"> | ||
| 13 | + <img class="card-img-top img-responsive" src="https://www.python.org/static/opengraph-icon-200x200.png" align="left"> | ||
| 14 | + <div class="card-block"> | ||
| 15 | + <b class="card-title">{{link.name}}</b><p></p> | ||
| 16 | + <p class="card-text"> </p><p>{{link.link_description}}</p> | ||
| 17 | + <a href="{{ link.link_url }}" class="btn btn-primary">Read more</a> | ||
| 18 | + </div> | ||
| 19 | + </article> | ||
| 20 | + <!-- .end Card --> | ||
| 21 | + </div> | ||
| 22 | + </div> | ||
| 23 | + </div> | ||
| 24 | +</div> | ||
| 25 | + | ||
| 26 | +<div class = 'row' id ="divModalLink"> | ||
| 27 | + | ||
| 28 | +</div> | ||
| 29 | +<!-- EndModal --> | ||
| 30 | +<script type="text/javascript"> | ||
| 31 | +$('.modal-backdrop').remove(); | ||
| 32 | +</script> |
| @@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
| 1 | +BBBB BBBBBB BBBB BBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBB | ||
| 2 | +XXXXXXXXX XXXX XXXXXXX | ||
| 3 | +XXXX XXXXXXXXXXXX XXXXX XXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 4 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 6 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 9 | + XXXXXX | ||
| 10 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 11 | + XXXX XXXX XXX | ||
| 12 | + XXXXXXXX XXXXXXXXXXX XXXXXXXX XXXXXXXXXXXX | ||
| 13 | + XXXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 14 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 15 | + XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 16 | + XX XXXXXXXXXXXXXXXXXX XXXXXXXXXXX | ||
| 17 | + XX XXXXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXXXXXXXX | ||
| 20 | + XXXX XXXX XXXX XXX | ||
| 21 | + XXXXXX | ||
| 22 | + XXXXXX | ||
| 23 | + XXXXXX | ||
| 24 | +XXXXXX | ||
| 25 | + | ||
| 26 | +XXXX XXXXX X XXXXX XX XXXXXXXXXXXXXXXX | ||
| 27 | + | ||
| 28 | +XXXXXX | ||
| 29 | +XXXX XXXXXXXX XXX | ||
| 30 | +XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 31 | +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 32 | +XXXXXXXXX |
links/tests.py
| @@ -6,6 +6,7 @@ from django.utils.translation import ugettext_lazy as _ | @@ -6,6 +6,7 @@ from django.utils.translation import ugettext_lazy as _ | ||
| 6 | from users.models import User | 6 | from users.models import User |
| 7 | from .models import * | 7 | from .models import * |
| 8 | from .forms import * | 8 | from .forms import * |
| 9 | +from courses.models import CourseCategory, Course, Subject, Topic | ||
| 9 | 10 | ||
| 10 | # Create your tests here. | 11 | # Create your tests here. |
| 11 | class LinkTestCase(TestCase): | 12 | class LinkTestCase(TestCase): |
| @@ -19,6 +20,62 @@ class LinkTestCase(TestCase): | @@ -19,6 +20,62 @@ class LinkTestCase(TestCase): | ||
| 19 | password = 'testing' | 20 | password = 'testing' |
| 20 | ) | 21 | ) |
| 21 | assign_role(self.user, 'system_admin') | 22 | assign_role(self.user, 'system_admin') |
| 23 | + self.teacher = User.objects.create_user( | ||
| 24 | + username = 'teacher', | ||
| 25 | + email = 'teacherg@school.com', | ||
| 26 | + is_staff = True, | ||
| 27 | + is_active = True, | ||
| 28 | + password = 'teaching' | ||
| 29 | + ) | ||
| 30 | + assign_role(self.teacher, 'professor') | ||
| 31 | + | ||
| 32 | + self.user_student = User.objects.create_user( | ||
| 33 | + username = 'student', | ||
| 34 | + email = 'student@amadeus.com', | ||
| 35 | + is_staff = False, | ||
| 36 | + is_active = True, | ||
| 37 | + password = 'testing', | ||
| 38 | + type_profile = 2 | ||
| 39 | + ) | ||
| 40 | + assign_role(self.user_student, 'student') | ||
| 41 | + | ||
| 42 | + self.category = CourseCategory( | ||
| 43 | + name = 'Categoria Teste', | ||
| 44 | + slug = 'categoria_teste' | ||
| 45 | + ) | ||
| 46 | + self.category.save() | ||
| 47 | + | ||
| 48 | + self.course = Course( | ||
| 49 | + name = 'Curso Teste', | ||
| 50 | + slug = 'curso_teste', | ||
| 51 | + max_students = 50, | ||
| 52 | + init_register_date = '2016-08-26', | ||
| 53 | + end_register_date = '2016-10-01', | ||
| 54 | + init_date = '2016-10-05', | ||
| 55 | + end_date = '2017-10-05', | ||
| 56 | + category = self.category, | ||
| 57 | + public = True, | ||
| 58 | + ) | ||
| 59 | + self.course.save() | ||
| 60 | + self.subject = Subject( | ||
| 61 | + name = 'Subject Test', | ||
| 62 | + description = "description of the subject test", | ||
| 63 | + visible = True, | ||
| 64 | + init_date = '2016-10-05', | ||
| 65 | + end_date = '2017-10-05', | ||
| 66 | + course = self.course, | ||
| 67 | + ) | ||
| 68 | + self.subject.save() | ||
| 69 | + self.subject.professors.add(self.teacher) | ||
| 70 | + | ||
| 71 | + self.topic = Topic( | ||
| 72 | + name = 'Topic Test', | ||
| 73 | + description = "description of the topic test", | ||
| 74 | + subject = self.subject, | ||
| 75 | + owner = self.teacher, | ||
| 76 | + ) | ||
| 77 | + self.topic.save() | ||
| 78 | + ''' | ||
| 22 | def test_create_link(self): | 79 | def test_create_link(self): |
| 23 | self.client.login(username='user', password = 'testing') | 80 | self.client.login(username='user', password = 'testing') |
| 24 | links = Link.objects.all().count() | 81 | links = Link.objects.all().count() |
| @@ -42,19 +99,78 @@ class LinkTestCase(TestCase): | @@ -42,19 +99,78 @@ class LinkTestCase(TestCase): | ||
| 42 | } | 99 | } |
| 43 | response = self.client.post(url, data,format = 'json') | 100 | response = self.client.post(url, data,format = 'json') |
| 44 | self.assertEqual(Link.objects.filter(name= data['name']).exists(),False) #Verificada não existência do link com campo errado | 101 | self.assertEqual(Link.objects.filter(name= data['name']).exists(),False) #Verificada não existência do link com campo errado |
| 102 | + ''' | ||
| 103 | + def test_create_link_teacher(self): | ||
| 104 | + self.client.login(username='teacher', password = 'teaching') | ||
| 105 | + links = Link.objects.all().count() | ||
| 106 | + self.assertEqual(Link.objects.all().count(),links) #Before creating the link | ||
| 107 | + topic = Topic.objects.get(name = 'Topic Test') | ||
| 108 | + url = reverse('course:links:create_link',kwargs={'slug': topic.slug}) | ||
| 109 | + data = { | ||
| 110 | + 'name' : 'testinglink', | ||
| 111 | + "link_description" : 'testdescription', | ||
| 112 | + "link_url" : 'teste.com' | ||
| 113 | + } | ||
| 114 | + data['topic'] = topic | ||
| 115 | + response = self.client.post(url, data,format = 'json') | ||
| 116 | + link1 = Link.objects.get(name = data['name']) #Link criado com os dados inseridos corretamente | ||
| 117 | + self.assertEqual(Link.objects.filter(name= link1.name).exists(),True) #Verificada existência do link | ||
| 118 | + self.assertEqual(Link.objects.all().count(),links+1) #After creating link1, if OK, the link was created successfully. | ||
| 119 | + self.assertEqual(response.status_code, 302) #If OK, User is getting redirected correctly. | ||
| 120 | + self.assertTemplateUsed(template_name = 'links/create_link.html') | ||
| 121 | + data = { | ||
| 122 | + 'name' : 'testlink2', | ||
| 123 | + "link_description" : 'testdescription2', | ||
| 124 | + "link_url" : 'teste', | ||
| 125 | + } | ||
| 126 | + data['topic'] = topic | ||
| 127 | + response = self.client.post(url, data,format = 'json') | ||
| 128 | + self.assertEqual(Link.objects.filter(name= data['name']).exists(),False) #Verificada não existência do link com campo errado | ||
| 129 | + | ||
| 130 | + def test_create_link_student(self): | ||
| 131 | + self.client.login(username='student', password = 'testing') | ||
| 132 | + topic = Topic.objects.get(name = 'Topic Test') | ||
| 133 | + links = Link.objects.all().count() | ||
| 134 | + self.assertEqual(Link.objects.all().count(),links) #Before creating the link | ||
| 135 | + url = reverse('course:links:create_link',kwargs={'slug': topic.slug}) | ||
| 136 | + data = { | ||
| 137 | + 'name' : 'testinglink', | ||
| 138 | + "description" : 'testdescription', | ||
| 139 | + "link" : 'teste.com' | ||
| 140 | + } | ||
| 141 | + data['topic'] = topic | ||
| 142 | + response = self.client.post(url, data,format = 'json') | ||
| 143 | + self.assertEqual(response.status_code, 403) #Status code = 403, Permissão negada para usuário estudante. | ||
| 45 | 144 | ||
| 46 | - # def test_update_link(): | ||
| 47 | - # pass | 145 | + def test_update_link(self): |
| 146 | + self.client.login(username='teacher', password = 'teaching') | ||
| 147 | + topic = Topic.objects.get(name = 'Topic Test') | ||
| 148 | + self.link = Link.objects.create( | ||
| 149 | + name = 'testinglink', | ||
| 150 | + link_description = 'testdescription', | ||
| 151 | + link_url = 'teste.com', | ||
| 152 | + topic = topic | ||
| 153 | + ) | ||
| 154 | + url = reverse('course:links:update_link',kwargs={'slug': self.link.slug}) | ||
| 155 | + print("slug",self.link.slug) | ||
| 156 | + data = { | ||
| 157 | + "link_description":'new description', | ||
| 158 | + } | ||
| 159 | + self.assertEqual(Link.objects.all()[0].link_description, "testdescription") # old description | ||
| 160 | + response = self.client.post(url, data) | ||
| 161 | + self.assertEqual(Link.objects.all()[0].link_description, 'new description') # new description | ||
| 48 | def test_delete_link(self): | 162 | def test_delete_link(self): |
| 163 | + topic = Topic.objects.get(name = 'Topic Test') | ||
| 49 | self.link = Link.objects.create( | 164 | self.link = Link.objects.create( |
| 50 | name = 'testinglink', | 165 | name = 'testinglink', |
| 51 | - description = 'testdescription', | ||
| 52 | - link = 'teste.com' | 166 | + link_description = 'testdescription', |
| 167 | + link_url = 'teste.com', | ||
| 168 | + topic = topic | ||
| 53 | ) | 169 | ) |
| 54 | self.client.login(username='user', password = 'testing') | 170 | self.client.login(username='user', password = 'testing') |
| 55 | links = Link.objects.all().count() | 171 | links = Link.objects.all().count() |
| 56 | deletedlink = Link.objects.get(name = self.link.name) | 172 | deletedlink = Link.objects.get(name = self.link.name) |
| 57 | - url = reverse('course:delete_link',kwargs={'linkname': self.link.name}) | 173 | + url = reverse('course:links:delete_link',kwargs={'linkname': self.link.name}) |
| 58 | self.assertEqual(Link.objects.all().count(),links) | 174 | self.assertEqual(Link.objects.all().count(),links) |
| 59 | response = self.client.post(url) | 175 | response = self.client.post(url) |
| 60 | self.assertEqual(Link.objects.all().count(),links - 1) #Objeto removido | 176 | self.assertEqual(Link.objects.all().count(),links - 1) #Objeto removido |
links/urls.py
| @@ -2,7 +2,9 @@ from django.conf.urls import url, include | @@ -2,7 +2,9 @@ from django.conf.urls import url, include | ||
| 2 | from . import views | 2 | from . import views |
| 3 | 3 | ||
| 4 | urlpatterns = [ | 4 | urlpatterns = [ |
| 5 | - url(r'^$', views.CreateLink.as_view(), name='create_link'), | 5 | + url(r'^create_link/(?P<slug>[\w_-]+)/$', views.CreateLink.as_view(), name='create_link'), |
| 6 | url(r'^deletelink/(?P<linkname>[\w_-]+)/$', views.deleteLink,name = 'delete_link'), | 6 | url(r'^deletelink/(?P<linkname>[\w_-]+)/$', views.deleteLink,name = 'delete_link'), |
| 7 | - url(r'^updatelink/(?P<linkname>[\w_-]+)/$', views.UpdateLink.as_view(),name = 'update_link'), | 7 | + url(r'^updatelink/(?P<slug>[\w_-]+)/$', views.UpdateLink.as_view(),name = 'update_link'), |
| 8 | + url(r'^render-link/(?P<id>[0-9]+)/$', views.render_link, name='render_link'), | ||
| 9 | + url(r'^view_link/(?P<slug>[\w_-]+)/$',views.ViewLink.as_view(),name = 'view_link') | ||
| 8 | ] | 10 | ] |
links/views.py
| @@ -4,42 +4,92 @@ from django.core.urlresolvers import reverse_lazy | @@ -4,42 +4,92 @@ from django.core.urlresolvers import reverse_lazy | ||
| 4 | from django.contrib import messages | 4 | from django.contrib import messages |
| 5 | from django.utils.translation import ugettext_lazy as _ | 5 | from django.utils.translation import ugettext_lazy as _ |
| 6 | from django.shortcuts import get_object_or_404,redirect | 6 | from django.shortcuts import get_object_or_404,redirect |
| 7 | +from django.contrib.auth.mixins import LoginRequiredMixin | ||
| 8 | +from rolepermissions.mixins import HasRoleMixin | ||
| 7 | 9 | ||
| 10 | +from courses.models import Topic | ||
| 8 | from .models import Link | 11 | from .models import Link |
| 9 | from .forms import * | 12 | from .forms import * |
| 13 | +from core.mixins import NotificationMixin | ||
| 14 | +from django.urls import reverse | ||
| 10 | 15 | ||
| 11 | # Create your views here. | 16 | # Create your views here. |
| 12 | -class CreateLink(generic.CreateView): | 17 | +class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.CreateView): |
| 18 | + allowed_roles = ['professor', 'system_admin'] | ||
| 13 | template_name = 'links/create_link.html' | 19 | template_name = 'links/create_link.html' |
| 14 | form_class = CreateLinkForm | 20 | form_class = CreateLinkForm |
| 15 | success_url = reverse_lazy('course:manage') | 21 | success_url = reverse_lazy('course:manage') |
| 16 | context_object_name = 'form' | 22 | context_object_name = 'form' |
| 17 | 23 | ||
| 18 | def form_valid(self, form): | 24 | def form_valid(self, form): |
| 19 | - form.save() | 25 | + self.object = form.save(commit = False) |
| 26 | + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | ||
| 27 | + self.object.topic = topic | ||
| 20 | messages.success(self.request, _('Link created successfully!')) | 28 | messages.success(self.request, _('Link created successfully!')) |
| 21 | - messages.error(self.request, _("An error occurred when trying to create the link")) | ||
| 22 | - return super(CreateLink, self).form_valid(form) | 29 | + |
| 30 | + self.object.save() | ||
| 31 | + super(CreateLink, self).createNotification(message="created a Link at "+ self.object.topic.name, actor=self.request.user, | ||
| 32 | + resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), | ||
| 33 | + users=self.object.topic.subject.students.all()) | ||
| 34 | + | ||
| 35 | + return self.get_success_url() | ||
| 23 | def get_context_data(self,**kwargs): | 36 | def get_context_data(self,**kwargs): |
| 24 | context = {} | 37 | context = {} |
| 25 | context['links'] = Link.objects.all() | 38 | context['links'] = Link.objects.all() |
| 26 | context['form'] = CreateLinkForm | 39 | context['form'] = CreateLinkForm |
| 40 | + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | ||
| 41 | + context["topic"] = topic | ||
| 27 | return context | 42 | return context |
| 28 | - | 43 | + def get_success_url(self): |
| 44 | + self.success_url = redirect('course:links:render_link', id = self.object.id) | ||
| 45 | + return self.success_url | ||
| 29 | def deleteLink(request,linkname): | 46 | def deleteLink(request,linkname): |
| 30 | link = get_object_or_404(Link,name = linkname) | 47 | link = get_object_or_404(Link,name = linkname) |
| 31 | link.delete() | 48 | link.delete() |
| 32 | template_name = 'links/delete_link.html' | 49 | template_name = 'links/delete_link.html' |
| 33 | messages.success(request,_("Link deleted Successfully!")) | 50 | messages.success(request,_("Link deleted Successfully!")) |
| 34 | - messages.error(request, _("An error occurred when trying to delete the link")) | 51 | + |
| 35 | return redirect('course:manage') | 52 | return redirect('course:manage') |
| 53 | + | ||
| 54 | +def render_link(request, id): | ||
| 55 | + template_name = 'links/render_link.html' | ||
| 56 | + context = { | ||
| 57 | + 'link': get_object_or_404(Link, id = id) | ||
| 58 | + } | ||
| 59 | + return render(request, template_name, context) | ||
| 60 | + | ||
| 36 | #Referencia no delete link para adicionar quando resolver o problema do context {% url 'course:delete' link.name %} | 61 | #Referencia no delete link para adicionar quando resolver o problema do context {% url 'course:delete' link.name %} |
| 37 | -class UpdateLink(generic.UpdateView): | 62 | +class UpdateLink(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): |
| 63 | + allowed_roles = ['professor', 'system_admin'] | ||
| 38 | template_name = 'links/update_link.html' | 64 | template_name = 'links/update_link.html' |
| 39 | form_class = UpdateLinkForm | 65 | form_class = UpdateLinkForm |
| 40 | - success_url = reverse_lazy('course:manage') | 66 | + success_url = reverse_lazy('course:links:render_link') |
| 41 | def form_valid(self, form): | 67 | def form_valid(self, form): |
| 42 | form.save() | 68 | form.save() |
| 43 | messages.success(self.request, _('Link updated successfully!')) | 69 | messages.success(self.request, _('Link updated successfully!')) |
| 44 | 70 | ||
| 45 | return super(UpdateLink, self).form_valid(form) | 71 | return super(UpdateLink, self).form_valid(form) |
| 72 | + | ||
| 73 | + def get_object(self, queryset=None): | ||
| 74 | + self.object = get_object_or_404(Link, slug = self.kwargs.get('slug')) | ||
| 75 | + print(self.object.link_description) | ||
| 76 | + return self.object | ||
| 77 | + def get_success_url(self): | ||
| 78 | + self.success_url = redirect('course:links:render_link', id = self.object.id) | ||
| 79 | + return self.success_url | ||
| 80 | +class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): | ||
| 81 | + allowed_roles = ['professor', 'system_admin'] | ||
| 82 | + template_name = 'links/view_link.html' | ||
| 83 | + success_url = reverse_lazy('course:links:render_link') | ||
| 84 | + context_object_name = 'link' | ||
| 85 | + def get_context_data(self,**kwargs): | ||
| 86 | + context = {} | ||
| 87 | + link = Link.objects.get(slug = self.kwargs.get('slug')) | ||
| 88 | + context['link'] = link | ||
| 89 | + return context | ||
| 90 | + def get_success_url(self): | ||
| 91 | + self.success_url = redirect('course:links:render_link', id = self.object.id) | ||
| 92 | + return self.success_url | ||
| 93 | + def get_queryset(self): | ||
| 94 | + self.queryset = Link.objects.filter(slug = self.kwargs.get('slug')) | ||
| 95 | + return self.queryset |
poll/migrations/0001_initial.py
| 1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | 2 | +# Generated by Django 1.10 on 2016-10-22 04:32 |
| 3 | from __future__ import unicode_literals | 3 | from __future__ import unicode_literals |
| 4 | 4 | ||
| 5 | +from django.conf import settings | ||
| 5 | from django.db import migrations, models | 6 | from django.db import migrations, models |
| 6 | import django.db.models.deletion | 7 | import django.db.models.deletion |
| 7 | 8 | ||
| @@ -12,6 +13,7 @@ class Migration(migrations.Migration): | @@ -12,6 +13,7 @@ class Migration(migrations.Migration): | ||
| 12 | 13 | ||
| 13 | dependencies = [ | 14 | dependencies = [ |
| 14 | ('courses', '0001_initial'), | 15 | ('courses', '0001_initial'), |
| 16 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 15 | ] | 17 | ] |
| 16 | 18 | ||
| 17 | operations = [ | 19 | operations = [ |
| @@ -57,4 +59,14 @@ class Migration(migrations.Migration): | @@ -57,4 +59,14 @@ class Migration(migrations.Migration): | ||
| 57 | name='poll', | 59 | name='poll', |
| 58 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Poll'), | 60 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Poll'), |
| 59 | ), | 61 | ), |
| 62 | + migrations.AddField( | ||
| 63 | + model_name='answersstudent', | ||
| 64 | + name='student', | ||
| 65 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundent', to=settings.AUTH_USER_MODEL, verbose_name='Student'), | ||
| 66 | + ), | ||
| 67 | + migrations.AddField( | ||
| 68 | + model_name='answer', | ||
| 69 | + name='poll', | ||
| 70 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='poll.Poll', verbose_name='Answers'), | ||
| 71 | + ), | ||
| 60 | ] | 72 | ] |
poll/migrations/0002_auto_20161018_1842.py
| @@ -1,30 +0,0 @@ | @@ -1,30 +0,0 @@ | ||
| 1 | -# -*- coding: utf-8 -*- | ||
| 2 | -# Generated by Django 1.10 on 2016-10-18 21:42 | ||
| 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 | - initial = True | ||
| 13 | - | ||
| 14 | - dependencies = [ | ||
| 15 | - migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
| 16 | - ('poll', '0001_initial'), | ||
| 17 | - ] | ||
| 18 | - | ||
| 19 | - operations = [ | ||
| 20 | - migrations.AddField( | ||
| 21 | - model_name='answersstudent', | ||
| 22 | - name='student', | ||
| 23 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundent', to=settings.AUTH_USER_MODEL, verbose_name='Student'), | ||
| 24 | - ), | ||
| 25 | - migrations.AddField( | ||
| 26 | - model_name='answer', | ||
| 27 | - name='poll', | ||
| 28 | - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='poll.Poll', verbose_name='Answers'), | ||
| 29 | - ), | ||
| 30 | - ] |
poll/models.py
| @@ -8,7 +8,6 @@ from courses.models import Activity | @@ -8,7 +8,6 @@ from courses.models import Activity | ||
| 8 | class Poll(Activity): | 8 | class Poll(Activity): |
| 9 | 9 | ||
| 10 | class Meta: | 10 | class Meta: |
| 11 | - #ordering = ('create_date','name') | ||
| 12 | verbose_name = _('Poll') | 11 | verbose_name = _('Poll') |
| 13 | verbose_name_plural = _('Polls') | 12 | verbose_name_plural = _('Polls') |
| 14 | 13 |
| @@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
| 1 | + | ||
| 2 | +BBBB BBBB | ||
| 3 | + | ||
| 4 | +XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 5 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 6 | + XXXXX | ||
| 7 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | + XXXXXX | ||
| 9 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 10 | + XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 11 | + XXXXXX XXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Answer') XX | ||
| 12 | + XXXXX XXXXXXXXXXXXXXXXXXX gettext(u'Possible answer for the question') XXXXXXX | ||
| 13 | + XXXXXX | ||
| 14 | + XXXXXX | ||
| 15 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 16 | + XXXXX | ||
| 17 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 18 | + XXXXXX | ||
| 19 | +XXXXXX |
| @@ -0,0 +1,34 @@ | @@ -0,0 +1,34 @@ | ||
| 1 | +BBBBBBB BBBBBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BBBB BBBB BBBBBB BBBBBBBBBBB | ||
| 4 | + | ||
| 5 | +BBBBB BBBBBBBBBB | ||
| 6 | +XXXX XXX XXXX XXXXX XXXXXXX XXX | ||
| 7 | +XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | +BBBBBBBB BBBBBBBBBB | ||
| 9 | + | ||
| 10 | +BBBBB BBBBBBBBBBBB | ||
| 11 | +XXXXX XXXXXXXXXXXXXXXX XXXXXXXX XXXXXXXXX XXXXXXXXXXXXXX | ||
| 12 | + BBBBBBBBBB | ||
| 13 | + BBB BBB BB BBBB | ||
| 14 | + XXXX XXXXXXXXXX XXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBBXX | ||
| 15 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXX XXXXXXXXXXX | ||
| 16 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 17 | + XXXXXXX | ||
| 18 | + XXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX FFFFFFFFF | ||
| 19 | + XXXXXXXX | ||
| 20 | + XXXXXX | ||
| 21 | + XXXXXX | ||
| 22 | + XXXXXX | ||
| 23 | + BBBBBB | ||
| 24 | +XXXXXXX | ||
| 25 | +BBBBBBBB BBBBBBBBBBBB | ||
| 26 | +BBBBB BBBBBBBBBBB | ||
| 27 | +XXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Answer') XXXXXXXXX | ||
| 28 | +XXXXXXXX | ||
| 29 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 30 | + XXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXXXXXXXXXXXXXXXXXXXXXXX | ||
| 31 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 32 | + XXX | ||
| 33 | +XXXXXXXXX | ||
| 34 | +BBBBBBBB BBBBBBBBBBB |
| @@ -0,0 +1,181 @@ | @@ -0,0 +1,181 @@ | ||
| 1 | + | ||
| 2 | + | ||
| 3 | +BBBB BBBB BBBBBBBBBBBBB BBBBBBBBBBB BBBBBB | ||
| 4 | + | ||
| 5 | + | ||
| 6 | + XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 7 | + XXXXXXX XXXXXBBBBBB BBBBBBBBBBBBBBBBBBXXXXXXXXXXX | ||
| 8 | + | ||
| 9 | + | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +XXXX XXXXX XXXXXXXXX XX XXXXXX XXX XXXXXXX XXX | ||
| 13 | +XXXX XXXXXXXXXXXX XXXXX XXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | + XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | ||
| 15 | + XXXX XXXXXXXXXXXXXXXXXXXXXX | ||
| 16 | + | ||
| 17 | + XXXX XXXXX XXXXXX XXX | ||
| 18 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 19 | + | ||
| 20 | + BBBBB BBBBBBBBBB | ||
| 21 | + XXXX XXX XXXX XXXXX XXXXXXX XXX | ||
| 22 | + XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX gettext(u'Create a Poll') XXXXX | ||
| 23 | + BBBBBBBB BBBBBBBBBB | ||
| 24 | + XXXXXX | ||
| 25 | + XXXX XXXXX XXXX XXX | ||
| 26 | + XXXX XXXXXXXXXXXXXXXXXXX | ||
| 27 | + | ||
| 28 | + BBBBB BBBBBBBBBBBB | ||
| 29 | + XXXX XXX XXXX XXXX XXXXXXX XXXXXXX XXX | ||
| 30 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 31 | + XXXX XXXXXXXXXX XXXXXXXXXXXX | ||
| 32 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 33 | + XXXXX | ||
| 34 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 35 | + XXXXXX | ||
| 36 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 37 | + XXXX XXXXXXXXXXXXXXXXXXXX | ||
| 38 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXX BB BBBBBBBBBBBBBBB BB BBBBXXXXXXXX BBBBB XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Question?') XX | ||
| 39 | + XXXXX XXXXXXXXXXXXXXXXXXX gettext(u'A Question to be answered') XXXXXXX | ||
| 40 | + XXXXXX | ||
| 41 | + XXXXXX | ||
| 42 | + BB BBBBBBBBBBBBBBBB | ||
| 43 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXX | ||
| 44 | + XXXXX | ||
| 45 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 46 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 47 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 48 | + XXXXXXXXX | ||
| 49 | + XXXX | ||
| 50 | + BBB BBBBB BB BBBBBBBBBBBBBBBB | ||
| 51 | + XXXXXXXXX | ||
| 52 | + BBBBBB | ||
| 53 | + XXXXX | ||
| 54 | + XXXXXX | ||
| 55 | + XXXXXX | ||
| 56 | + BBBBB | ||
| 57 | + XXXXXX | ||
| 58 | + XXXXX XXXXXXXXX XXXXXXXX XXXXXXXXX XXXXXXXXXXXXXX | ||
| 59 | + BBBBBBBBBB | ||
| 60 | + BBB BBB BB BBBB | ||
| 61 | + XXXX XXXXXXXXXX XXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBBXX | ||
| 62 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 63 | + XXXXX | ||
| 64 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 65 | + XXXXXX | ||
| 66 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 67 | + XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 68 | + XXXXXX XXXXXXXXXXX XXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Answer') X XXXXXXXFFFFFFFFFXX | ||
| 69 | + XXXXX XXXXXXXXXXXXXXXXXXX gettext(u'Possible answer for the question') XXXXXXX | ||
| 70 | + XXXXXX | ||
| 71 | + XXXXXX | ||
| 72 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 73 | + XXXXX | ||
| 74 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 75 | + XXXXXX | ||
| 76 | + XXXXXX | ||
| 77 | + BBBBB | ||
| 78 | + XXXX XXXXXXXXXX XXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBBXX | ||
| 79 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 80 | + XXXXX | ||
| 81 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 82 | + XXXXXX | ||
| 83 | + XXXX XXXXXXXXXXXXXXXXXX | ||
| 84 | + XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXX | ||
| 85 | + XXXXXX XXXXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX gettext(u'Answer') XX | ||
| 86 | + XXXXX XXXXXXXXXXXXXXXXXXX gettext(u'Possible answer for the question') XXXXXXX | ||
| 87 | + XXXXXX | ||
| 88 | + XXXXXX | ||
| 89 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 90 | + XXXXX | ||
| 91 | + XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 92 | + XXXXXX | ||
| 93 | + XXXXXX | ||
| 94 | + BBBBBB | ||
| 95 | + XXXXXXX | ||
| 96 | + XXXXX | ||
| 97 | + XXXXXX | ||
| 98 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXXXXXXXX | ||
| 99 | + XXXX XXXXXXXXXX XXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBBXX | ||
| 100 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 101 | + | ||
| 102 | + XXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXX BB BBBBBBBBBBBBBBBBBBBBB BB BBBBXXXXXXXBB BBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFBBBBBBBBBXBBBBBX | ||
| 103 | + BB BBBBBBBBBBBBBBBBBBBBBB | ||
| 104 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 105 | + XXXXX | ||
| 106 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 107 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 108 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 109 | + XXXXXXXXX | ||
| 110 | + XXXX | ||
| 111 | + BBB BBBBB BB BBBBBBBBBBBBBBBBBBBBBB | ||
| 112 | + XXXXXXXXX | ||
| 113 | + BBBBBB | ||
| 114 | + XXXXX | ||
| 115 | + XXXXXX | ||
| 116 | + XXXXXX | ||
| 117 | + BBBBB | ||
| 118 | + XXXXXX | ||
| 119 | + | ||
| 120 | + XXXX XXXXXXXXXX XXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBBXX | ||
| 121 | + XXXXXX XXXXXXXXXXXXXXX | ||
| 122 | + BBBBBBBBBBBB BBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBB | ||
| 123 | + XXXXXX | ||
| 124 | + XXXX XXXXXXXXXX XXXXXXXXXX BB BBBBBBBBBBBBBB XXXXXXXXX BBBBBXX | ||
| 125 | + XXXX XXXXXXXXXXXXXXXXX | ||
| 126 | + XXXXXXX | ||
| 127 | + BBBBBBBBBBBB BBBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBBBBBB BBBBBBBBBBBXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 128 | + XXXXXXXX | ||
| 129 | + XXXXXX | ||
| 130 | + BB BBBBBBBBBBBBBBBBBBBBBBBB | ||
| 131 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 132 | + XXXXX | ||
| 133 | + XXXX XXXXXXXXXXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX | ||
| 134 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX | ||
| 135 | + XXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 136 | + XXXXXXXXX | ||
| 137 | + XXXX | ||
| 138 | + BBB BBBBB BB BBBBBBBBBBBBBBBBBBBBBBBB | ||
| 139 | + XXXXXXXXX | ||
| 140 | + BBBBBB | ||
| 141 | + XXXXX | ||
| 142 | + XXXXXX | ||
| 143 | + XXXXXX | ||
| 144 | + BBBBB | ||
| 145 | + XXXXXX | ||
| 146 | + | ||
| 147 | + BBBBBBBB BBBBBBBBBBBB | ||
| 148 | + XXXXXX | ||
| 149 | + | ||
| 150 | + XXXX XXXXX XXXXXX XXX | ||
| 151 | + XXXX XXXXXXXXXXXXXXXXXXXXX | ||
| 152 | + | ||
| 153 | + XXXX XXXXX XXXXXX XXXXXXX XXX | ||
| 154 | + XXXXXXX XXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXX gettext(u'Close') XXXXXXXXX | ||
| 155 | + BBBBB BBBBBBBBBBB | ||
| 156 | + XXXX XXX XXXXXX XXXXXXX XXXXXXX XXX | ||
| 157 | + XXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Create') XXXXXXXXX | ||
| 158 | + BBBBBBBB BBBBBBBBBBB | ||
| 159 | + XXXXXX | ||
| 160 | + | ||
| 161 | + XXXXXX | ||
| 162 | + XXXXXX | ||
| 163 | +XXXXXX | ||
| 164 | +XXXXXXX XXXXXBBBBBB BBBBBBBBBBBBBBBBBBBBBXX | ||
| 165 | +XX XXXX XX XXX XXX XXXXX XXXX XX XXX X XXXXXXXX XXX XXX XXXXXXXXX | ||
| 166 | +XXXXXXXXX | ||
| 167 | +BBBBB BBBBBBBBBBB | ||
| 168 | +XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 169 | +XX XXXX XX XXX XXX XXXXX XXXX XX XXX X XXXXXX XXX XXX XXX XXXXXXXXX | ||
| 170 | + XXXXXXXXXXXXXXXXXXXXXXXX XXX | ||
| 171 | + XXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBXXX | ||
| 172 | + XXX | ||
| 173 | + | ||
| 174 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 175 | + XXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBBXXXXXXXXXXXXXXXXXXXXXXX | ||
| 176 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 177 | + XXX | ||
| 178 | +XXXXXXXXX | ||
| 179 | +BBBBBBBB BBBBBBBBBBB | ||
| 180 | + | ||
| 181 | + |
| @@ -0,0 +1,26 @@ | @@ -0,0 +1,26 @@ | ||
| 1 | +BBBBBBB BBBBBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BBBB BBBB BBBBBB | ||
| 4 | + | ||
| 5 | +BBBBB BBBBBBBBBB | ||
| 6 | +XXXX XXX XXXX XXXXX XXXXXXX XXX | ||
| 7 | +XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX gettext(u'Delete Poll') XXXXX | ||
| 8 | +BBBBBBBB BBBBBBBBBB | ||
| 9 | + | ||
| 10 | +BBBBB BBBBBBBBBBBB | ||
| 11 | +XXXXXXX XXXXXBBBBBB BBBBBBBBBBBBBBBBBBXXXXXXXXXXX | ||
| 12 | +XXXX XXX XXXX XXXX XXXXXXX XXXXXXX XXX | ||
| 13 | +XXXXX XXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXXXXXXXX | ||
| 14 | + BBBBBBBBBB | ||
| 15 | + XXX gettext(u'Are you sure you want to delete the subject') XXXXXXX | ||
| 16 | +XXXXXXX | ||
| 17 | +BBBBBBBB BBBBBBBBBBBB | ||
| 18 | +BBBBB BBBBBBBBBBB | ||
| 19 | +XXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Delete') XXXXXXXXX | ||
| 20 | +XXXXXXXX | ||
| 21 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 22 | + XXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 23 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 24 | + XXX | ||
| 25 | +XXXXXXXXX | ||
| 26 | +BBBBBBBB BBBBBBBBBBB |
| @@ -0,0 +1,27 @@ | @@ -0,0 +1,27 @@ | ||
| 1 | +BBBBBBB BBBBBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BBBB BBBB BBBBBBBBBBB BBBBBB | ||
| 4 | + | ||
| 5 | +BBBBB BBBBBBBBBB | ||
| 6 | +XXXX XXX XXXX XXXXX XXXXXXX XXX | ||
| 7 | +XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX gettext(u'Update a Poll') XXXXX | ||
| 8 | +BBBBBBBB BBBBBBBBBB | ||
| 9 | + | ||
| 10 | +BBBBB BBBBBBBBBBB | ||
| 11 | +XXXX XXX XXXXXX XXXXXXX XXXXXXX XXX | ||
| 12 | +XXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Update') XXXXXXXXX | ||
| 13 | +BBBBBBBB BBBBBBBBBBB | ||
| 14 | + | ||
| 15 | +BBBBB BBBBBBBBBBB | ||
| 16 | +XXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 17 | +XX XXXX XX XXX XXX XXXXX XXXX XX XXX X XXXXXX XXX XXX XXX XXXXXXXXX | ||
| 18 | + XXXXXXXXXXXXXXXXXXXXXXXX XXX | ||
| 19 | + XXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBXXX | ||
| 20 | + XXX | ||
| 21 | + | ||
| 22 | + XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X | ||
| 23 | + XXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXXXXXXXXXXXXXXXXXXXXXXX | ||
| 24 | + XXXXXXXXXXXXXXXXXXXXXXX | ||
| 25 | + XXX | ||
| 26 | +XXXXXXXXX | ||
| 27 | +BBBBBBBB BBBBBBBBBBB |
| @@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
| 1 | +BBBBBBB BBBBBBBBBBBBBBBBBB | ||
| 2 | + | ||
| 3 | +BBBB BBBB BBBBBBBBBBB BBBBBB | ||
| 4 | + | ||
| 5 | +BBBBB BBBBB | ||
| 6 | +BBBBBBBB | ||
| 7 | + | ||
| 8 | +BBBBB BBBBBBBBBB | ||
| 9 | +XXXX XXX XXXX XXXXX XXXXXXX XXX | ||
| 10 | +XXX XXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX | ||
| 11 | +BBBBBBBB BBBBBBBBBB | ||
| 12 | + | ||
| 13 | +BBBBB BBBBBBBBBBBB | ||
| 14 | +XXXX XXX XXXX XXXX XXXXXXX XXXXXXX XXX | ||
| 15 | +XXXX XXXXXXXXXXXX | ||
| 16 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 17 | + XXX gettext(u'Limit date:') FFFFFFFFFFFFXXXX | ||
| 18 | + XXXXXX | ||
| 19 | + XXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX | ||
| 20 | + XXX gettext(u'Status:') | ||
| 21 | + BB BBBBBB | ||
| 22 | + gettext(u'Poll answered') | ||
| 23 | + BBBB | ||
| 24 | + gettext(u"Poll don't yet answered") | ||
| 25 | + BBBBB | ||
| 26 | + XXXXXX | ||
| 27 | +XXXXXX | ||
| 28 | +BBBBBBBB BBBBBBBBBBBB | ||
| 29 | + | ||
| 30 | +BBBBB BBBBBBBBBBB | ||
| 31 | +XXXX XXX XXXXXX XXXXXXX XXXXXXX XXX | ||
| 32 | +BB BBB BBBBBB | ||
| 33 | +XXXXXXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXX XXXXXXXXXXX XXXXXXXXXXXX gettext(u'Answer') XXXXXXXXX | ||
| 34 | +BBBBB | ||
| 35 | +BBBBBBBB BBBBBBBBBBB |
poll/views.py
| @@ -9,7 +9,7 @@ from django.utils.translation import ugettext_lazy as _ | @@ -9,7 +9,7 @@ from django.utils.translation import ugettext_lazy as _ | ||
| 9 | from rolepermissions.verifications import has_role | 9 | from rolepermissions.verifications import has_role |
| 10 | from rolepermissions.verifications import has_object_permission | 10 | from rolepermissions.verifications import has_object_permission |
| 11 | from django.db.models import Q | 11 | from django.db.models import Q |
| 12 | -# from django.views.generic.edit import FormMixin | 12 | +from django.urls import reverse |
| 13 | 13 | ||
| 14 | from .forms import PollForm | 14 | from .forms import PollForm |
| 15 | from .models import Poll, Answer, AnswersStudent | 15 | from .models import Poll, Answer, AnswersStudent |
| @@ -41,7 +41,7 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): | @@ -41,7 +41,7 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): | ||
| 41 | return context | 41 | return context |
| 42 | 42 | ||
| 43 | 43 | ||
| 44 | -class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | 44 | +class CreatePoll(LoginRequiredMixin,HasRoleMixin, NotificationMixin,generic.CreateView): |
| 45 | 45 | ||
| 46 | allowed_roles = ['professor', 'system_admin'] | 46 | allowed_roles = ['professor', 'system_admin'] |
| 47 | login_url = reverse_lazy("core:home") | 47 | login_url = reverse_lazy("core:home") |
| @@ -63,15 +63,19 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -63,15 +63,19 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
| 63 | context.context_data['keys'] = keys | 63 | context.context_data['keys'] = keys |
| 64 | context.context_data['form'] = form | 64 | context.context_data['form'] = form |
| 65 | context.status_code = 400 | 65 | context.status_code = 400 |
| 66 | - # return self.render_to_response(context, status = 400) | 66 | + s |
| 67 | return context | 67 | return context |
| 68 | 68 | ||
| 69 | def form_valid(self, form): | 69 | def form_valid(self, form): |
| 70 | self.object = form.save(commit = False) | 70 | self.object = form.save(commit = False) |
| 71 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | 71 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) |
| 72 | self.object.topic = topic | 72 | self.object.topic = topic |
| 73 | + self.object.name = str(self.object) | ||
| 73 | self.object.save() | 74 | self.object.save() |
| 74 | 75 | ||
| 76 | + super(CreatePoll, self).createNotification(message="created a Poll at "+ self.object.topic.name, actor=self.request.user, | ||
| 77 | + resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), | ||
| 78 | + users=self.object.topic.subject.students.all()) | ||
| 75 | for key in self.request.POST: | 79 | for key in self.request.POST: |
| 76 | if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): | 80 | if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): |
| 77 | answer = Answer(answer=self.request.POST[key],order=key,poll=self.object) | 81 | answer = Answer(answer=self.request.POST[key],order=key,poll=self.object) |
| @@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
| 1 | +XXXXXXXXXX | ||
| 2 | +XXXXXXXXXXXXXXXXX | ||
| 3 | +XXXXXXXXXXX | ||
| 4 | +XXXXXXXXXXXXXXXXXXXXXX | ||
| 5 | +XXXXXXXXXXXX | ||
| 6 | +XXXXXXXXXXXXXXXXXXXXXX | ||
| 7 | +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 8 | +XXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 9 | +XXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 10 | +XXXXXXXXXXXXXXXXXXXXXXX | ||
| 11 | +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 12 | +XXXXXXXXXXXXXXXXXXXXXX | ||
| 13 | +XXXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 14 | +XXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| 15 | +XXXXXXXXXXXXXXXX | ||
| 16 | +XXXXXXXXXXX | ||
| 17 | +XXXXXXXXXXXXXXXX | ||
| 18 | +XXXXXXXXXXXXX | ||
| 19 | +XXXXXXXXXXXXXXX | ||
| 20 | +XXXXXXXXXXXXXXXX | ||
| 21 | +XXXXXXXXXXX | ||
| 22 | +XXXXXXXXXXXXXXXXXX | ||
| 23 | +XXXXXXXXXXXXXXXXX | ||
| 24 | +XXXXXXXXXXXXXXXXX | ||
| 0 | \ No newline at end of file | 25 | \ No newline at end of file |