Commit 81016d27252fe7dd1521c54436fd3dfebbf7628e

Authored by Matheus Lins
2 parents ede6717b 46b8be78

remove course

Showing 96 changed files with 2214 additions and 799 deletions   Show diff stats
amadeus/static/nothing.txt.py 0 → 100644
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>
@@ -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 = &#39;&#39;, actor = None, users = [], @@ -60,7 +60,7 @@ def notification_decorator(read = False, message = &#39;&#39;, 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 &quot;&quot; @@ -20,7 +20,7 @@ msgstr &quot;&quot;
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 &quot;&quot; @@ -36,7 +36,7 @@ msgstr &quot;&quot;
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 &quot;Senha&quot; @@ -64,11 +64,11 @@ msgstr &quot;Senha&quot;
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 &quot;Cadastrar&quot; @@ -80,11 +80,11 @@ msgstr &quot;Cadastrar&quot;
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 &quot;E-mail&quot; @@ -92,7 +92,7 @@ msgstr &quot;E-mail&quot;
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 &quot;Enviar&quot; @@ -100,7 +100,7 @@ msgstr &quot;Enviar&quot;
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 - ]  
core/migrations/0002_auto_20161022_0158.py 0 → 100644
@@ -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
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 #notification-dropdown{ 12 #notification-dropdown{
13 max-height: 500%; 13 max-height: 500%;
14 overflow: auto; 14 overflow: auto;
15 - width: 200px; 15 + width: 300px;
16 } 16 }
17 17
18 /* HEADER */ 18 /* HEADER */
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>
@@ -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 &quot;&quot; @@ -30,11 +30,11 @@ msgstr &quot;&quot;
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 &quot;Número máximo de estudantes&quot; @@ -42,11 +42,11 @@ msgstr &quot;Número máximo de estudantes&quot;
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 &quot;Categoria&quot; @@ -66,59 +66,59 @@ msgstr &quot;Categoria&quot;
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 &quot;&quot; @@ -147,7 +147,7 @@ msgstr &quot;&quot;
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 %}  
courses/templates/course/course_card.html 0 → 100644
@@ -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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; 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>&nbsp; Replicate</a></li>  
72 - <li><a href="{% url 'course:update' course.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; 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>&nbsp; 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>&nbsp; {% 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>&nbsp; {% trans "Replicate" %}</a></li>
  72 + <li><a href="{% url 'course:update' course.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% 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>&nbsp; {% 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 - ]  
exam/templates/exam/create.html.py 0 → 100644
@@ -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
exam/templates/exam/discursive_question.html.py 0 → 100644
@@ -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
exam/templates/exam/gap_filling_answer.html.py 0 → 100644
exam/templates/exam/gap_filling_question.html.py 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +XXXX XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX XXXXXXX
  2 + XXXXXX XXXXXXX XXXXXXXXXXXX
  3 +XXXXXX
exam/templates/exam/multiple_choice_answer.html.py 0 → 100644
exam/templates/exam/multiple_choice_question.html.py 0 → 100644
@@ -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
exam/templates/exam/remove.html.py 0 → 100644
exam/templates/exam/true_or_false_answer.html.py 0 → 100644
@@ -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
exam/templates/exam/true_or_false_question.html.py 0 → 100644
@@ -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/templates/exam/update.html.py 0 → 100644
exam/templates/exam/view.html.py 0 → 100644
@@ -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 - ]  
files/templates/files/create_file.html.py 0 → 100644
@@ -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
files/templates/files/delete_file.html.py 0 → 100644
@@ -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
files/templates/files/render_file.html.py 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +XXX XXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXX XX XXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXX
0 \ No newline at end of file 2 \ No newline at end of file
files/templates/files/update_file.html.py 0 → 100644
@@ -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 - ]  
forum/templates/forum/forum_form.html.py 0 → 100644
@@ -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
forum/templates/forum/forum_list.html.py 0 → 100644
@@ -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
forum/templates/forum/forum_view.html.py 0 → 100644
@@ -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 +
forum/templates/forum/render_forum.html.py 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +BBBB BBBB
  2 +
  3 +XXXXXXXXX
  4 +XXXXXXX gettext(u'Description') XXXXX XXXXX
  5 +XXXXXXX gettext(u'Opened in') XXXXX XXXXX
0 \ No newline at end of file 6 \ No newline at end of file
forum/templates/post/post_list.html.py 0 → 100644
@@ -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>
forum/templates/post/post_render.html.py 0 → 100644
@@ -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
forum/templates/post/post_update_form.html.py 0 → 100644
@@ -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
forum/templates/post_answers/post_answer_form.html.py 0 → 100644
@@ -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
forum/templates/post_answers/post_answer_list.html.py 0 → 100644
@@ -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
forum/templates/post_answers/post_answer_render.html.py 0 → 100644
@@ -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">&times;</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>
links/templates/links/create_link.html.py 0 → 100644
@@ -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
links/templates/links/delete_link.html.py 0 → 100644
@@ -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
links/templates/links/render_link.html 0 → 100644
@@ -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>
links/templates/links/render_link.html.py 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +XXXXXX XXXXXXXXX XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBBB BBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBBBXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
links/templates/links/update_link.html.py 0 → 100644
@@ -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
links/templates/links/view_link.html 0 → 100644
@@ -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>
links/templates/links/view_link.html.py 0 → 100644
@@ -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
@@ -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
poll/templates/poll/answer.html.py 0 → 100644
@@ -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
poll/templates/poll/answer_student.html.py 0 → 100644
@@ -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
poll/templates/poll/create.html.py 0 → 100644
@@ -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 +
poll/templates/poll/remove.html.py 0 → 100644
@@ -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
poll/templates/poll/update.html.py 0 → 100644
@@ -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
poll/templates/poll/view.html.py 0 → 100644
@@ -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
@@ -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)
requirements.txt.py 0 → 100644
@@ -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
runtime.txt.py 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +XXXXXXXXXXXX
0 \ No newline at end of file 2 \ No newline at end of file
staticfiles/sample.txt.py 0 → 100644
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +XXXX XXXX XXX XXXXXXX XX XXXX XXXXXXXX XX XXXXXXX
0 \ No newline at end of file 2 \ No newline at end of file