Commit b869409bd7972f90e6cd67f9456afc8a04b9fce3

Authored by Gustavo Bernardo
2 parents 2e247b77 9e15e5dc

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

Showing 52 changed files with 939 additions and 555 deletions   Show diff stats
amadeus/urls.py
@@ -23,6 +23,7 @@ urlpatterns = [ @@ -23,6 +23,7 @@ urlpatterns = [
23 url(r'^home/', include('app.urls', namespace = 'app')), 23 url(r'^home/', include('app.urls', namespace = 'app')),
24 url(r'^courses/', 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'^exercise/', include('exercise.urls', namespace = 'exercise')),
26 url(r'^admin/', admin.site.urls), 27 url(r'^admin/', admin.site.urls),
27 url(r'^', include('core.urls', namespace = 'core')), 28 url(r'^', include('core.urls', namespace = 'core')),
28 #API 29 #API
app/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 from django.db import migrations, models 6 from django.db import migrations, models
@@ -23,11 +24,11 @@ class Migration(migrations.Migration): @@ -23,11 +24,11 @@ class Migration(migrations.Migration):
23 ('username', models.CharField(max_length=30, verbose_name='Email host username')), 24 ('username', models.CharField(max_length=30, verbose_name='Email host username')),
24 ('password', models.CharField(blank=True, max_length=30, verbose_name='Email host password')), 25 ('password', models.CharField(blank=True, max_length=30, verbose_name='Email host password')),
25 ('safe_conection', models.IntegerField(choices=[(0, 'No'), (1, 'TLS, if available'), (2, 'TLS'), (3, 'SSL')], default=0, verbose_name='Use safe conection')), 26 ('safe_conection', models.IntegerField(choices=[(0, 'No'), (1, 'TLS, if available'), (2, 'TLS'), (3, 'SSL')], default=0, verbose_name='Use safe conection')),
26 - ('default_from_email', models.EmailField(max_length=254, verbose_name='Default from email')), 27 + ('default_from_email', models.EmailField(blank=True, max_length=254, verbose_name='Default from email')),
27 ], 28 ],
28 options={ 29 options={
29 - 'verbose_name_plural': 'Amadeus SMTP settings',  
30 'verbose_name': 'Amadeus SMTP setting', 30 'verbose_name': 'Amadeus SMTP setting',
  31 + 'verbose_name_plural': 'Amadeus SMTP settings',
31 }, 32 },
32 ), 33 ),
33 ] 34 ]
app/migrations/0002_auto_20161115_2054.py 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 23:54
  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 + ('app', '0001_initial'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AlterField(
  16 + model_name='emailbackend',
  17 + name='default_from_email',
  18 + field=models.EmailField(max_length=254, verbose_name='Default from email'),
  19 + ),
  20 + ]
core/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 import autoslug.fields 6 import autoslug.fields
@@ -25,8 +26,8 @@ class Migration(migrations.Migration): @@ -25,8 +26,8 @@ class Migration(migrations.Migration):
25 ('created_date', models.DateTimeField(auto_now_add=True, verbose_name='Created Date')), 26 ('created_date', models.DateTimeField(auto_now_add=True, verbose_name='Created Date')),
26 ], 27 ],
27 options={ 28 options={
28 - 'verbose_name_plural': 'Actions',  
29 'verbose_name': 'Action', 29 'verbose_name': 'Action',
  30 + 'verbose_name_plural': 'Actions',
30 }, 31 },
31 ), 32 ),
32 migrations.CreateModel( 33 migrations.CreateModel(
@@ -35,8 +36,8 @@ class Migration(migrations.Migration): @@ -35,8 +36,8 @@ class Migration(migrations.Migration):
35 ('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')),
36 ], 37 ],
37 options={ 38 options={
38 - 'verbose_name_plural': 'Action_Resources',  
39 'verbose_name': 'Action_Resource', 39 'verbose_name': 'Action_Resource',
  40 + 'verbose_name_plural': 'Action_Resources',
40 }, 41 },
41 ), 42 ),
42 migrations.CreateModel( 43 migrations.CreateModel(
@@ -48,8 +49,8 @@ class Migration(migrations.Migration): @@ -48,8 +49,8 @@ class Migration(migrations.Migration):
48 ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')), 49 ('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),
49 ], 50 ],
50 options={ 51 options={
51 - 'verbose_name_plural': 'Logs',  
52 'verbose_name': 'Log', 52 'verbose_name': 'Log',
  53 + 'verbose_name_plural': 'Logs',
53 }, 54 },
54 ), 55 ),
55 migrations.CreateModel( 56 migrations.CreateModel(
@@ -60,8 +61,8 @@ class Migration(migrations.Migration): @@ -60,8 +61,8 @@ class Migration(migrations.Migration):
60 ('icon', models.CharField(max_length=50, unique=True, verbose_name='Icon')), 61 ('icon', models.CharField(max_length=50, unique=True, verbose_name='Icon')),
61 ], 62 ],
62 options={ 63 options={
63 - 'verbose_name_plural': 'Amadeus Mime Types',  
64 'verbose_name': 'Amadeus Mime Type', 64 'verbose_name': 'Amadeus Mime Type',
  65 + 'verbose_name_plural': 'Amadeus Mime Types',
65 }, 66 },
66 ), 67 ),
67 migrations.CreateModel( 68 migrations.CreateModel(
@@ -74,8 +75,8 @@ class Migration(migrations.Migration): @@ -74,8 +75,8 @@ class Migration(migrations.Migration):
74 ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')), 75 ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),
75 ], 76 ],
76 options={ 77 options={
77 - 'verbose_name_plural': 'Notifications',  
78 'verbose_name': 'Notification', 78 'verbose_name': 'Notification',
  79 + 'verbose_name_plural': 'Notifications',
79 }, 80 },
80 ), 81 ),
81 migrations.CreateModel( 82 migrations.CreateModel(
@@ -88,8 +89,8 @@ class Migration(migrations.Migration): @@ -88,8 +89,8 @@ class Migration(migrations.Migration):
88 ('url', models.CharField(default='', max_length=100, verbose_name='URL')), 89 ('url', models.CharField(default='', max_length=100, verbose_name='URL')),
89 ], 90 ],
90 options={ 91 options={
91 - 'verbose_name_plural': 'Resources',  
92 'verbose_name': 'Resource', 92 'verbose_name': 'Resource',
  93 + 'verbose_name_plural': 'Resources',
93 }, 94 },
94 ), 95 ),
95 ] 96 ]
core/migrations/0002_auto_20161115_1936.py 0 → 100644
@@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
  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='Performer'),
  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_20161116_1057.py
@@ -1,50 +0,0 @@ @@ -1,50 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 13:57  
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 - ('core', '0001_initial'),  
16 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
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='Performer'),  
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_20161117_0009.py 0 → 100644
@@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 03:09
  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='Performer'),
  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 + ]
courses/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 import autoslug.fields 6 import autoslug.fields
@@ -34,8 +35,8 @@ class Migration(migrations.Migration): @@ -34,8 +35,8 @@ class Migration(migrations.Migration):
34 ('name', models.CharField(max_length=100)), 35 ('name', models.CharField(max_length=100)),
35 ], 36 ],
36 options={ 37 options={
37 - 'verbose_name_plural': 'Activitys Files',  
38 'verbose_name': 'Activity File', 38 'verbose_name': 'Activity File',
  39 + 'verbose_name_plural': 'Activitys Files',
39 }, 40 },
40 ), 41 ),
41 migrations.CreateModel( 42 migrations.CreateModel(
@@ -47,8 +48,8 @@ class Migration(migrations.Migration): @@ -47,8 +48,8 @@ class Migration(migrations.Migration):
47 ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), 48 ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
48 ], 49 ],
49 options={ 50 options={
50 - 'verbose_name_plural': 'Categories',  
51 'verbose_name': 'Category', 51 'verbose_name': 'Category',
  52 + 'verbose_name_plural': 'Categories',
52 }, 53 },
53 ), 54 ),
54 migrations.CreateModel( 55 migrations.CreateModel(
@@ -68,9 +69,9 @@ class Migration(migrations.Migration): @@ -68,9 +69,9 @@ class Migration(migrations.Migration):
68 ('public', models.BooleanField(default=False, verbose_name='Public')), 69 ('public', models.BooleanField(default=False, verbose_name='Public')),
69 ], 70 ],
70 options={ 71 options={
  72 + 'verbose_name': 'Course',
71 'verbose_name_plural': 'Courses', 73 'verbose_name_plural': 'Courses',
72 'ordering': ('create_date', 'name'), 74 'ordering': ('create_date', 'name'),
73 - 'verbose_name': 'Course',  
74 }, 75 },
75 ), 76 ),
76 migrations.CreateModel( 77 migrations.CreateModel(
@@ -82,8 +83,8 @@ class Migration(migrations.Migration): @@ -82,8 +83,8 @@ class Migration(migrations.Migration):
82 ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')), 83 ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
83 ], 84 ],
84 options={ 85 options={
85 - 'verbose_name_plural': 'Categories',  
86 'verbose_name': 'Category', 86 'verbose_name': 'Category',
  87 + 'verbose_name_plural': 'Categories',
87 }, 88 },
88 ), 89 ),
89 migrations.CreateModel( 90 migrations.CreateModel(
@@ -127,9 +128,9 @@ class Migration(migrations.Migration): @@ -127,9 +128,9 @@ class Migration(migrations.Migration):
127 ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course')), 128 ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course')),
128 ], 129 ],
129 options={ 130 options={
  131 + 'verbose_name': 'Subject',
130 'verbose_name_plural': 'Subjects', 132 'verbose_name_plural': 'Subjects',
131 'ordering': ('create_date', 'name'), 133 'ordering': ('create_date', 'name'),
132 - 'verbose_name': 'Subject',  
133 }, 134 },
134 ), 135 ),
135 migrations.CreateModel( 136 migrations.CreateModel(
@@ -142,8 +143,8 @@ class Migration(migrations.Migration): @@ -142,8 +143,8 @@ class Migration(migrations.Migration):
142 ('subjects', models.ManyToManyField(to='courses.Subject')), 143 ('subjects', models.ManyToManyField(to='courses.Subject')),
143 ], 144 ],
144 options={ 145 options={
145 - 'verbose_name_plural': 'subject categories',  
146 'verbose_name': 'subject category', 146 'verbose_name': 'subject category',
  147 + 'verbose_name_plural': 'subject categories',
147 }, 148 },
148 ), 149 ),
149 migrations.CreateModel( 150 migrations.CreateModel(
@@ -159,9 +160,9 @@ class Migration(migrations.Migration): @@ -159,9 +160,9 @@ class Migration(migrations.Migration):
159 ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')), 160 ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')),
160 ], 161 ],
161 options={ 162 options={
  163 + 'verbose_name': 'Topic',
162 'verbose_name_plural': 'Topics', 164 'verbose_name_plural': 'Topics',
163 'ordering': ('create_date', 'name'), 165 'ordering': ('create_date', 'name'),
164 - 'verbose_name': 'Topic',  
165 }, 166 },
166 ), 167 ),
167 ] 168 ]
courses/migrations/0002_auto_20161115_1936.py 0 → 100644
@@ -0,0 +1,85 @@ @@ -0,0 +1,85 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
  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 + ('courses', '0001_initial'),
  16 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  17 + ]
  18 +
  19 + operations = [
  20 + migrations.AddField(
  21 + model_name='subject',
  22 + name='professors',
  23 + field=models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
  24 + ),
  25 + migrations.AddField(
  26 + model_name='subject',
  27 + name='students',
  28 + field=models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  29 + ),
  30 + migrations.AddField(
  31 + model_name='material',
  32 + name='students',
  33 + field=models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  34 + ),
  35 + migrations.AddField(
  36 + model_name='material',
  37 + name='topic',
  38 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'),
  39 + ),
  40 + migrations.AddField(
  41 + model_name='linkmaterial',
  42 + name='material',
  43 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'),
  44 + ),
  45 + migrations.AddField(
  46 + model_name='filematerial',
  47 + name='material',
  48 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'),
  49 + ),
  50 + migrations.AddField(
  51 + model_name='course',
  52 + name='category',
  53 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'),
  54 + ),
  55 + migrations.AddField(
  56 + model_name='course',
  57 + name='coordenator',
  58 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='course_coordenator', to=settings.AUTH_USER_MODEL, verbose_name='Coordenator'),
  59 + ),
  60 + migrations.AddField(
  61 + model_name='course',
  62 + name='professors',
  63 + field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
  64 + ),
  65 + migrations.AddField(
  66 + model_name='course',
  67 + name='students',
  68 + field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  69 + ),
  70 + migrations.AddField(
  71 + model_name='activityfile',
  72 + name='diet',
  73 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity'),
  74 + ),
  75 + migrations.AddField(
  76 + model_name='activity',
  77 + name='students',
  78 + field=models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  79 + ),
  80 + migrations.AddField(
  81 + model_name='activity',
  82 + name='topic',
  83 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'),
  84 + ),
  85 + ]
courses/migrations/0002_auto_20161116_1057.py
@@ -1,85 +0,0 @@ @@ -1,85 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 13:57  
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='subject',  
22 - name='professors',  
23 - field=models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),  
24 - ),  
25 - migrations.AddField(  
26 - model_name='subject',  
27 - name='students',  
28 - field=models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),  
29 - ),  
30 - migrations.AddField(  
31 - model_name='material',  
32 - name='students',  
33 - field=models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students'),  
34 - ),  
35 - migrations.AddField(  
36 - model_name='material',  
37 - name='topic',  
38 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'),  
39 - ),  
40 - migrations.AddField(  
41 - model_name='linkmaterial',  
42 - name='material',  
43 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'),  
44 - ),  
45 - migrations.AddField(  
46 - model_name='filematerial',  
47 - name='material',  
48 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'),  
49 - ),  
50 - migrations.AddField(  
51 - model_name='course',  
52 - name='category',  
53 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'),  
54 - ),  
55 - migrations.AddField(  
56 - model_name='course',  
57 - name='coordenator',  
58 - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='course_coordenator', to=settings.AUTH_USER_MODEL, verbose_name='Coordenator'),  
59 - ),  
60 - migrations.AddField(  
61 - model_name='course',  
62 - name='professors',  
63 - field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),  
64 - ),  
65 - migrations.AddField(  
66 - model_name='course',  
67 - name='students',  
68 - field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),  
69 - ),  
70 - migrations.AddField(  
71 - model_name='activityfile',  
72 - name='diet',  
73 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity'),  
74 - ),  
75 - migrations.AddField(  
76 - model_name='activity',  
77 - name='students',  
78 - field=models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students'),  
79 - ),  
80 - migrations.AddField(  
81 - model_name='activity',  
82 - name='topic',  
83 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'),  
84 - ),  
85 - ]  
courses/migrations/0002_auto_20161117_0009.py 0 → 100644
@@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 03:09
  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='subject',
  22 + name='professors',
  23 + field=models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
  24 + ),
  25 + migrations.AddField(
  26 + model_name='subject',
  27 + name='students',
  28 + field=models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  29 + ),
  30 + migrations.AddField(
  31 + model_name='material',
  32 + name='students',
  33 + field=models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  34 + ),
  35 + migrations.AddField(
  36 + model_name='material',
  37 + name='topic',
  38 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'),
  39 + ),
  40 + migrations.AddField(
  41 + model_name='linkmaterial',
  42 + name='material',
  43 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'),
  44 + ),
  45 + migrations.AddField(
  46 + model_name='filematerial',
  47 + name='material',
  48 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'),
  49 + ),
  50 + migrations.AddField(
  51 + model_name='course',
  52 + name='category',
  53 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'),
  54 + ),
  55 + migrations.AddField(
  56 + model_name='course',
  57 + name='coordenator',
  58 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='course_coordenator', to=settings.AUTH_USER_MODEL, verbose_name='Coordenator'),
  59 + ),
  60 + migrations.AddField(
  61 + model_name='activityfile',
  62 + name='diet',
  63 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity'),
  64 + ),
  65 + migrations.AddField(
  66 + model_name='activity',
  67 + name='students',
  68 + field=models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  69 + ),
  70 + migrations.AddField(
  71 + model_name='activity',
  72 + name='topic',
  73 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'),
  74 + ),
  75 + ]
courses/templates/subject/form_view_student.html
@@ -63,33 +63,6 @@ @@ -63,33 +63,6 @@
63 </ul> 63 </ul>
64 </div> 64 </div>
65 </div> 65 </div>
66 - <div class="col-xs-4 col-md-4">  
67 - <div class="resource_inline">  
68 - <h4>{% trans 'Exercises' %}</h4>  
69 - </div>  
70 - <div class="resource_inline">  
71 - {# dropdown de create exercício #}  
72 - <div class="dropdown">  
73 - <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>  
74 - <ul class="dropdown-menu" aria-labelledby="dLabel">  
75 - <li><a href="javascript:modal.get('{% url 'course:exercise:create_exercise' topic.slug %}', '#createExercisesModal','#requisicoes_ajax')">{% trans 'Create a Exercise' %}</a></li>  
76 - </ul>  
77 - </div>  
78 - </div>  
79 - <div class="presentation_{{exercise.slug}}">  
80 - {# exercício do tópico no modo de visualização #}  
81 - <ul>  
82 - {% list_topic_exercise request %}  
83 - </ul>  
84 - </div>  
85 - <div class="editation editation_{{exercise.slug}}">  
86 - {# exercício do tópico no modo de edição #}  
87 - <ul>  
88 - {% list_topic_exercise_edit request exercise %}  
89 - </ul>  
90 - </div>  
91 - </div>  
92 - {% include "exercise/create_exercise.html" %}  
93 </div> 66 </div>
94 {% endif %} 67 {% endif %}
95 68
courses/templates/subject/form_view_teacher.html
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button> 7 <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button>
8 </div> 8 </div>
9 <div class="col-xs-9 col-md-9 titleTopic"> 9 <div class="col-xs-9 col-md-9 titleTopic">
10 - <a role="button"> 10 + <a href="{% url 'course:view_topic' topic.slug %}" role="button">
11 <h4>{{topic}}</h4> 11 <h4>{{topic}}</h4>
12 </a> 12 </a>
13 </div><!--column --> 13 </div><!--column -->
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 {% professor_subject topic.subject user as dropdown_topic %} 21 {% professor_subject topic.subject user as dropdown_topic %}
22 {% if dropdown_topic %} 22 {% if dropdown_topic %}
23 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions"> 23 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
24 - <li><a href="" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li> 24 + <li><a href="{% url 'course:replicate_topic' topic.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li>
25 <li><a href="javascript:show_editation('{{topic.slug}}')"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li> 25 <li><a href="javascript:show_editation('{{topic.slug}}')"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>
26 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeTopic"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li> 26 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeTopic"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>
27 </ul> 27 </ul>
@@ -123,23 +123,6 @@ @@ -123,23 +123,6 @@
123 </ul> 123 </ul>
124 </div> 124 </div>
125 </div> 125 </div>
126 - <div class="col-xs-4 col-md-4">  
127 - <div class="resource_inline">  
128 - <h4>{% trans 'Exercises' %}</h4>  
129 - </div>  
130 - <div class="presentation_{{exercise.slug}}">  
131 - {# exercício do tópico no modo de visualização #}  
132 - <ul>  
133 - {% list_topic_exercise request %}  
134 - </ul>  
135 - </div>  
136 - <div class="editation editation_{{exercise.slug}}">  
137 - {# exercício do tópico no modo de edição #}  
138 - <ul>  
139 - {% list_topic_exercise_edit request exercise %}  
140 - </ul>  
141 - </div>  
142 - </div>  
143 </div> 126 </div>
144 127
145 {# opções de cancelar e editar no modo de edição #} 128 {# opções de cancelar e editar no modo de edição #}
courses/templates/subject/replicate.html
@@ -2,61 +2,51 @@ @@ -2,61 +2,51 @@
2 2
3 {% load static i18n permission_tags widget_tweaks %} 3 {% load static i18n permission_tags widget_tweaks %}
4 4
5 -{% block breadcrumbs %}  
6 - <ol class="breadcrumb">  
7 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
8 - <li class="active">{% trans 'Replicate Subject' %}</li>  
9 - </ol>  
10 -{% endblock %}  
11 -  
12 {% block content %} 5 {% block content %}
13 -<div class="panel panel-default"> 6 +
  7 + <div class="panel panel-default">
14 <div class="panel-body"> 8 <div class="panel-body">
15 <form class="form-group " method="post" action=""> 9 <form class="form-group " method="post" action="">
16 {% csrf_token %} 10 {% csrf_token %}
17 11
18 <div class="form-group {% if subject.name.errors %} has-error{% endif %}"> 12 <div class="form-group {% if subject.name.errors %} has-error{% endif %}">
19 - <label for="{{ id_name }}" class="control-label label-static"> {% trans 'Name' %}</label>  
20 - <input class="form-control" id="id_name" maxlength="100" name="name" type="text" required="True" value="{{subject.name}}">  
21 - <span class="help-block">{% trans 'Subject name' %}</span> 13 + <label for="id_name" class="control-label label-static"> {% trans 'Name'%}</label>
  14 + <textarea class="form-control" id="id_name" maxlength="100" rows="1" name="name" placeholder="Name" type="text" required >{{subject.name}}</textarea>
22 15
  16 + <span class="help-block">{% trans 'Subject name'%}</span>
23 </div> 17 </div>
24 18
25 - <div class="form-group {% if subject.name.errors %} has-error{% endif %}">  
26 - <label for="{{ id_description }}" class="control-label label-static"> {% trans 'Description' %} </label>  
27 - <textarea class="form-control" id="id_description" name="description" type="text" required="">{{subject.description}}</textarea>  
28 - <span class="help-block">{% trans 'Subject Description' %}</span> 19 + <div class="form-group">
  20 + <label for="id_description" class="control-label label-static"> {% trans 'Description'%}</label>
  21 + <textarea class="form-control" id="id_description" name="description" placeholder="Description" type="text" >{{subject.description}}</textarea>
29 22
  23 + <span class="help-block">{% trans 'Subject description'%}</span>
30 </div> 24 </div>
31 25
32 - <div class="form-group {% if subject.name.errors %} has-error{% endif %}">  
33 - <label for="{{ id_init_date }}" class="control-label label-static"> {% trans 'Init date' %}</label>  
34 - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DA E_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}">  
35 - <span class="help-block">{% trans 'Subject init date' %}</span> 26 + <div class="form-group">
  27 + <label for="id_init_date" class="control-label label-static"> {% trans 'Init date'%}</label>
  28 + <input type="text" class="form-control date-picker" name="init_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}">
36 29
  30 + <span class="help-block">{% trans 'Init date'%}</span>
37 </div> 31 </div>
38 32
39 - <div class="form-group {% if subject.name.errors %} has-error{% endif %}">  
40 - <label for="{{ id_end_date }}" class="control-label label-static"> {% trans 'End date' %}</label>  
41 - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DA E_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}">  
42 - <span class="help-block">{% trans 'Subject end date' %}</span>  
43 -  
44 - </div>  
45 - <div class="form-group {% if subject.name.errors %} has-error{% endif %}">  
46 - <label for="{{ id_visible }}" class="control-label label-static"> {% trans 'Visible?' %} </label>  
47 - <input type="checkbox" class="form-control" id="id_visible" name="visible" required="true"/>  
48 - <span class="help-block">{% trans 'Is it visible?' %}</span> 33 + <div class="form-group">
  34 + <label for="id_end_date" class="control-label label-static"> {% trans 'End date'%}</label>
  35 + <input type="text" class="form-control date-picker" name="end_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}">
49 36
  37 + <span class="help-block">{% trans 'End date'%}</span>
50 </div> 38 </div>
51 39
  40 + <div class="form-group">
  41 + <label for="id_visible" class="control-label label-static"> {% trans 'Visible'%}</label>
  42 + <input class="form-control" id="id_visible" name="visible" type="checkbox"/>
52 43
  44 + <span class="help-block">{% trans 'Is it visible?'%}</span>
53 </div> 45 </div>
54 -  
55 <div class="col-lg-offset-4 col-lg-4"> 46 <div class="col-lg-offset-4 col-lg-4">
56 - <button type="submit" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Replicate' %}</button> 47 + <button type="submite" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Replicate' %}</button>
57 </div> 48 </div>
58 </form> 49 </form>
59 -  
60 </div> 50 </div>
61 </div> 51 </div>
62 52
@@ -70,4 +60,4 @@ @@ -70,4 +60,4 @@
70 $('#id_description').summernote({height: 300}); 60 $('#id_description').summernote({height: 300});
71 }); 61 });
72 </script> 62 </script>
73 -{% endblock %}  
74 \ No newline at end of file 63 \ No newline at end of file
  64 +{% endblock content %}
courses/templates/topic/index.html
@@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
65 </div> 65 </div>
66 <div class="panel panel-default"> 66 <div class="panel panel-default">
67 <div class="panel-body"> 67 <div class="panel-body">
68 - {% include "topic/topic_card_student.html" %} 68 + {% include "topic/topic_card.html" %}
69 {% comment %} 69 {% comment %}
70 70
71 71
@@ -116,13 +116,22 @@ @@ -116,13 +116,22 @@
116 </fieldset> 116 </fieldset>
117 </form>--> 117 </form>-->
118 {% endcomment %} 118 {% endcomment %}
119 -  
120 -  
121 -  
122 -  
123 </div> 119 </div>
124 -  
125 -  
126 </div> 120 </div>
127 </div> 121 </div>
  122 + <div class="col-md-6">
  123 + <h3>{% trans 'Students - Especific Exercises' %}</h3>
  124 + <br/>
  125 + </div>
  126 + {# mostra a lista de usuários caso seja um professor ou admin #}
  127 + {% if user|has_role:'professor' or user|has_role:'system_admin' %}
  128 + {% for user in users %}
  129 + {% include "exercise/card_list_user.html" %}
  130 + {% endfor %}
  131 + {# caso seja um estudante, mostra a lista de exercícios proposta a ele #}
  132 + {% elif user|has_role:'student'%}
  133 + {% for exercise in exercises %}
  134 + {% include "exercise/card_topic_exercises.html" %}
  135 + {% endfor %}
  136 + {% endif %}
128 {% endblock %} 137 {% endblock %}
courses/templates/topic/replicate.html 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +{% extends 'subject/index.html' %}
  2 +
  3 +{% load static i18n permission_tags widget_tweaks %}
  4 +
  5 +{% block content %}
  6 +
  7 + <div class="panel panel-default">
  8 + <div class="panel-body">
  9 + <form class="form-group " method="post" action="">
  10 + {% csrf_token %}
  11 +
  12 + <div class="form-group {% if topic.name.errors %} has-error{% endif %}">
  13 + <label for="id_name" class="control-label label-static"> {% trans 'Name'%}</label>
  14 + <textarea class="form-control" id="id_name" maxlength="100" rows="1" name="name" placeholder="Name" type="text" required >{{topic.name}}</textarea>
  15 +
  16 + <span class="help-block">{% trans 'Topic name'%}</span>
  17 + </div>
  18 + <div class="form-group {% if topic.description.errors %} has-error{% endif %}">
  19 + <label for="id_description" class="control-label label-static"> {% trans 'Description'%}</label>
  20 + <textarea class="form-control" id="id_description" name="description" placeholder="Description" type="text"> {{topic.description}}</textarea>
  21 +
  22 + <span class="help-block">{% trans 'Topic description'%}</span>
  23 + </div>
  24 +
  25 + <div class="col-lg-offset-4 col-lg-4">
  26 + <button type="submit" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Create' %}</button>
  27 +
  28 + </div>
  29 + </form>
  30 + </div>
  31 + </div>
  32 +
  33 + <script type="text/javascript">
  34 + $(document).ready(function() {
  35 + $('#id_description').summernote({height: 300});
  36 + });
  37 + </script>
  38 +{% endblock content %}
courses/templates/topic/replicate_topic.html
@@ -1,38 +0,0 @@ @@ -1,38 +0,0 @@
1 -{% extends 'subject/index.html' %}  
2 -  
3 -{% load static i18n permission_tags widget_tweaks %}  
4 -  
5 -{% block content %}  
6 -  
7 - <div class="panel panel-default">  
8 - <div class="panel-body">  
9 - <form class="form-group " method="post" action="">  
10 - {% csrf_token %}  
11 -  
12 - <div class="form-group {% if topic.name.errors %} has-error{% endif %}">  
13 - <label for="id_name" class="control-label label-static"> {% trans 'Name'%}</label>  
14 - <input class="form-control" id="id_name" maxlength="100" name="name" placeholder="Name" type="text" value={{topic.name}} required />  
15 -  
16 - <span class="help-block">{% trans 'Topic name'%}</span>  
17 - </div>  
18 - <div class="form-group {% if topic.description.errors %} has-error{% endif %}">  
19 - <label for="id_description" class="control-label label-static"> {% trans 'Description'%}</label>  
20 - <textarea class="form-control" id="id_description" name="description" placeholder="Description" type="text"> {{topic.description}}</textarea>  
21 -  
22 - <span class="help-block">{% trans 'Topic description'%}</span>  
23 - </div>  
24 -  
25 - <div class="col-lg-offset-4 col-lg-4">  
26 - <button type="submit" class="btn btn-raised btn-primary btn-lg btn-block">{% trans 'Create' %}</button>  
27 -  
28 - </div>  
29 - </form>  
30 - </div>  
31 - </div>  
32 -  
33 - <script type="text/javascript">  
34 - $(document).ready(function() {  
35 - $('#id_description').summernote({height: 300});  
36 - });  
37 - </script>  
38 -{% endblock content %}  
courses/templates/topic/topic_card.html 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access%}
  2 +
  3 +
  4 +<div class="row">
  5 + <div class="col-xs-6 col-md-6">
  6 + <div class="resource_inline">
  7 + <h4>{% trans "Materials" %}</h4>
  8 + </div>
  9 +
  10 + <ul id="list-materials">
  11 + {% list_topic_file request topic %}
  12 + {% list_topic_link request topic%}
  13 +
  14 + </ul>
  15 + </div>
  16 + <div class="col-xs-6 col-md-6">
  17 + <div class="resource_inline">
  18 + <h4>{% trans "Activities" %}</h4>
  19 + </div>
  20 + <ul>
  21 + <div class="foruns_list">
  22 + {# {% list_topic_exam request topic %} #}
  23 + {% list_topic_poll request topic %}
  24 + {% list_topic_foruns request topic %}
  25 + </div>
  26 + </ul>
  27 + </div>
  28 +</div>
0 \ No newline at end of file 29 \ No newline at end of file
courses/templates/topic/topic_card_student.html
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 -{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access%}  
2 -  
3 -  
4 -<div class="row">  
5 - <div class="col-xs-6 col-md-6">  
6 - <div class="resource_inline">  
7 - <h4>{% trans "Materials" %}</h4>  
8 - </div>  
9 -  
10 - <ul id="list-materials">  
11 - {% list_topic_file request topic %}  
12 - {% list_topic_link request topic%}  
13 -  
14 - </ul>  
15 - </div>  
16 - <div class="col-xs-4 col-md-4">  
17 - <div class="resource_inline">  
18 - <h4>{% trans "Activities" %}</h4>  
19 - </div>  
20 - <ul>  
21 - <div class="foruns_list">  
22 - {% list_topic_exam request topic %}  
23 - {% list_topic_poll request topic %}  
24 - {% list_topic_foruns request topic %}  
25 - </div>  
26 - </ul>  
27 - </div>  
28 -  
29 -</div>  
courses/urls.py
@@ -6,7 +6,6 @@ urlpatterns = [ @@ -6,7 +6,6 @@ urlpatterns = [
6 url(r'^all-courses/$', views.AllCoursesView.as_view(), name='all_courses'), 6 url(r'^all-courses/$', views.AllCoursesView.as_view(), name='all_courses'),
7 url(r'^create/$', views.CreateCourseView.as_view(), name='create'), 7 url(r'^create/$', views.CreateCourseView.as_view(), name='create'),
8 url(r'^replicate_course/(?P<slug>[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'), 8 url(r'^replicate_course/(?P<slug>[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'),
9 - url(r'^replicate_subject/(?P<slug>[\w_-]+)/$', views.ReplicateSubjectView.as_view(), name='replicate_subject'),  
10 url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'), 9 url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'),
11 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'), 10 url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'),
12 url(r'^subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_course, name='subscribe'), 11 url(r'^subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_course, name='subscribe'),
@@ -19,10 +18,11 @@ urlpatterns = [ @@ -19,10 +18,11 @@ urlpatterns = [
19 url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'), 18 url(r'^subjects/create/(?P<slug>[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'),
20 url(r'^subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'), 19 url(r'^subjects/update/(?P<slug>[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'),
21 url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'), 20 url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'),
  21 + url(r'^subjects/replicate/(?P<slug>[\w_-]+)/$', views.ReplicateSubjectView.as_view(), name='replicate_subject'),
22 url(r'^subjects/subscribe/(?P<slug>[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'), 22 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'), 23 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'), 24 url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
25 - url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.DeleteTopic.as_view(), name='delete_topic'), 25 + url(r'^topics/delete/(?P<slug>[\w_-]+)/$', views.DeleteTopic.as_view(), name='delete_topic'),
26 url(r'^topics/replicate/(?P<slug>[\w_-]+)/$', views.ReplicateTopicView.as_view(), name='replicate_topic'), 26 url(r'^topics/replicate/(?P<slug>[\w_-]+)/$', views.ReplicateTopicView.as_view(), name='replicate_topic'),
27 url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), 27 url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'),
28 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), 28 url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'),
courses/views.py
@@ -562,39 +562,6 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView): @@ -562,39 +562,6 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView):
562 context['files'] = TopicFile.objects.filter(students__name = self.request.user.name) 562 context['files'] = TopicFile.objects.filter(students__name = self.request.user.name)
563 return context 563 return context
564 564
565 -class ReplicateSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin,generic.edit.CreateView):  
566 -  
567 - allowed_roles = ['professor', 'system_admin']  
568 - login_url = reverse_lazy("core:home")  
569 - redirect_field_name = 'next'  
570 - template_name = 'subject/replicate.html'  
571 - form_class = SubjectForm  
572 - success_url = reverse_lazy('course:view')  
573 -  
574 - def get_context_data(self, **kwargs):  
575 - context = super(ReplicateSubjectView, self).get_context_data(**kwargs)  
576 - subject = get_object_or_404(Subject, slug=self.kwargs.get('slug'))  
577 -  
578 - if has_role(self.request.user,'system_admin'):  
579 - subjects = Subject.objects.all()  
580 - context['subjects'] = subjects  
581 - elif has_role(self.request.user,'professor'):  
582 - subject = self.request.user.professors_subjects.all()  
583 - categorys_subjects = CategorySubject.objects.all()  
584 -  
585 - context['subject'] = subject  
586 - context['categorys_subjects'] = categorys_subjects  
587 - context['title'] = _("Replicate Subject")  
588 - context['now'] = date.today()  
589 - return context  
590 -  
591 - def form_valid(self, form):  
592 - self.object = form.save()  
593 -  
594 - return super(ReplicateSubjectView, self).form_valid(form)  
595 -  
596 - def get_success_url(self):  
597 - return reverse_lazy('course:view', kwargs={'slug' : self.object.slug})  
598 565
599 class UploadMaterialView(LoginRequiredMixin, generic.edit.CreateView): 566 class UploadMaterialView(LoginRequiredMixin, generic.edit.CreateView):
600 login_url = reverse_lazy("core:home") 567 login_url = reverse_lazy("core:home")
@@ -664,6 +631,12 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView): @@ -664,6 +631,12 @@ class TopicsView(LoginRequiredMixin, LogMixin, generic.ListView):
664 activitys = Activity.objects.filter(topic__name = topic.name) 631 activitys = Activity.objects.filter(topic__name = topic.name)
665 students_activit = User.objects.filter(activities__in = Activity.objects.all()) 632 students_activit = User.objects.filter(activities__in = Activity.objects.all())
666 materials = Material.objects.filter(topic = topic) 633 materials = Material.objects.filter(topic = topic)
  634 + if has_role(self.request.user, 'professor'):
  635 + users = User.objects.filter(subject_student__in = Subject.objects.all())
  636 + context['users'] = users
  637 + elif has_role(self.request.user, 'student'):
  638 + exercises = Exercise.objects.all().filter(students=self.request.user)
  639 + context['exercises'] = exercises
667 640
668 context['topic'] = topic 641 context['topic'] = topic
669 context['subject'] = topic.subject 642 context['subject'] = topic.subject
@@ -1018,13 +991,13 @@ class TopicViewSet(viewsets.ModelViewSet): @@ -1018,13 +991,13 @@ class TopicViewSet(viewsets.ModelViewSet):
1018 class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin,generic.edit.CreateView): 991 class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin,generic.edit.CreateView):
1019 log_component = "course" 992 log_component = "course"
1020 log_resource = "topic" 993 log_resource = "topic"
1021 - log_action = "create" 994 + log_action = "replicate"
1022 log_context = {} 995 log_context = {}
1023 996
1024 allowed_roles = ['professor', 'system_admin'] 997 allowed_roles = ['professor', 'system_admin']
1025 login_url = reverse_lazy("core:home") 998 login_url = reverse_lazy("core:home")
1026 - model = Topic  
1027 - template_name = 'topic/replicate_topic.html' 999 + redirect_field_name = 'next'
  1000 + template_name = 'topic/replicate.html'
1028 form_class = TopicForm 1001 form_class = TopicForm
1029 1002
1030 def get_success_url(self): 1003 def get_success_url(self):
@@ -1033,21 +1006,23 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati @@ -1033,21 +1006,23 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati
1033 def get_context_data(self, **kwargs): 1006 def get_context_data(self, **kwargs):
1034 context = super(ReplicateTopicView, self).get_context_data(**kwargs) 1007 context = super(ReplicateTopicView, self).get_context_data(**kwargs)
1035 topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) 1008 topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
1036 - subject = topic.subject 1009 + subject = Subject.objects.get(pk = topic.subject_id)
1037 context['course'] = subject.course 1010 context['course'] = subject.course
1038 context['subject'] = subject 1011 context['subject'] = subject
1039 context['subjects'] = subject.course.subjects.all() 1012 context['subjects'] = subject.course.subjects.all()
1040 context['topic'] = topic 1013 context['topic'] = topic
1041 return context 1014 return context
1042 1015
1043 -  
1044 def form_valid(self, form): 1016 def form_valid(self, form):
1045 - self.object.subject = self.object.subject.id 1017 + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
  1018 + subject = Subject.objects.get(pk = topic.subject_id)
  1019 +
1046 self.object = form.save(commit = False) 1020 self.object = form.save(commit = False)
  1021 + self.object.topic = topic
  1022 + self.object.subject = subject
1047 self.object.owner = self.request.user 1023 self.object.owner = self.request.user
1048 self.object.save() 1024 self.object.save()
1049 -  
1050 - action = super(ReplicateTopicView, self).createorRetrieveAction("replicate Topic") 1025 + action = super(ReplicateTopicView, self).createorRetrieveAction("create Topic")
1051 super(ReplicateTopicView, self).createNotification("Topic "+ self.object.name + " was created", 1026 super(ReplicateTopicView, self).createNotification("Topic "+ self.object.name + " was created",
1052 resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]), 1027 resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]),
1053 actor=self.request.user, users = self.object.subject.course.students.all() ) 1028 actor=self.request.user, users = self.object.subject.course.students.all() )
@@ -1067,3 +1042,55 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati @@ -1067,3 +1042,55 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati
1067 super(ReplicateTopicView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) 1042 super(ReplicateTopicView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
1068 1043
1069 return super(ReplicateTopicView, self).form_valid(form) 1044 return super(ReplicateTopicView, self).form_valid(form)
  1045 +
  1046 +class ReplicateSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView):
  1047 + log_component = "course"
  1048 + log_resource = "subject"
  1049 + log_action = "replicate"
  1050 + log_context = {}
  1051 +
  1052 + allowed_roles = ['professor', 'system_admin']
  1053 + login_url = reverse_lazy("core:home")
  1054 + redirect_field_name = 'next'
  1055 + template_name = 'subject/replicate.html'
  1056 + form_class = SubjectForm
  1057 +
  1058 + def get_success_url(self):
  1059 + return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.slug})
  1060 +
  1061 + def get_context_data(self, **kwargs):
  1062 + context = super(ReplicateSubjectView, self).get_context_data(**kwargs)
  1063 + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug'))
  1064 + course = Course.objects.get(pk=subject.course_id)
  1065 + context['course'] = course
  1066 + context['subjects'] = course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user]))
  1067 + context['subject'] = subject
  1068 + if (has_role(self.request.user,'system_admin')):
  1069 + context['subjects'] = course.subjects.all()
  1070 + return context
  1071 +
  1072 + def form_valid(self, form):
  1073 + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug'))
  1074 + course = Course.objects.get(pk=subject.course_id)
  1075 +
  1076 + self.object = form.save(commit = False)
  1077 + self.object.course = course
  1078 + self.object.save()
  1079 + self.object.professors.add(self.request.user)
  1080 + if self.object.visible:
  1081 + super(ReplicateSubjectView, self).createNotification( " created subject " + self.object.name, resource_name=self.object.name,
  1082 + resource_slug = self.object.slug, actor=self.request.user, users= self.object.course.students.all(),
  1083 + resource_link = reverse('course:view_subject', args=[self.object.slug]))
  1084 +
  1085 + self.log_context['subject_id'] = self.object.id
  1086 + self.log_context['subject_name'] = self.object.name
  1087 + self.log_context['subject_slug'] = self.object.slug
  1088 + self.log_context['course_id'] = course.id
  1089 + self.log_context['course_name'] = course.name
  1090 + self.log_context['course_slug'] = course.slug
  1091 + self.log_context['course_category_id'] = course.category.id
  1092 + self.log_context['course_category_name'] = course.category.name
  1093 +
  1094 + super(ReplicateSubjectView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  1095 +
  1096 + return super(ReplicateSubjectView, self).form_valid(form)
exam/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 from django.db import migrations, models 6 from django.db import migrations, models
@@ -23,9 +24,10 @@ class Migration(migrations.Migration): @@ -23,9 +24,10 @@ class Migration(migrations.Migration):
23 ('order', models.PositiveSmallIntegerField(verbose_name='Order')), 24 ('order', models.PositiveSmallIntegerField(verbose_name='Order')),
24 ], 25 ],
25 options={ 26 options={
  27 + 'verbose_name': 'Answer',
  28 + 'ordering': ('order',),
26 'verbose_name_plural': 'Answers', 29 'verbose_name_plural': 'Answers',
27 'ordering': ('order',), 30 'ordering': ('order',),
28 - 'verbose_name': 'Answer',  
29 }, 31 },
30 ), 32 ),
31 migrations.CreateModel( 33 migrations.CreateModel(
@@ -37,8 +39,8 @@ class Migration(migrations.Migration): @@ -37,8 +39,8 @@ class Migration(migrations.Migration):
37 ('answer', models.ManyToManyField(related_name='student_answer', to='exam.Answer', verbose_name='Answers Students')), 39 ('answer', models.ManyToManyField(related_name='student_answer', to='exam.Answer', verbose_name='Answers Students')),
38 ], 40 ],
39 options={ 41 options={
40 - 'verbose_name_plural': 'Answers Student',  
41 'verbose_name': 'Answer Stundent', 42 'verbose_name': 'Answer Stundent',
  43 + 'verbose_name_plural': 'Answers Student',
42 }, 44 },
43 ), 45 ),
44 migrations.CreateModel( 46 migrations.CreateModel(
@@ -49,8 +51,8 @@ class Migration(migrations.Migration): @@ -49,8 +51,8 @@ class Migration(migrations.Migration):
49 ('exibe', models.BooleanField(default=False, verbose_name='Exibe?')), 51 ('exibe', models.BooleanField(default=False, verbose_name='Exibe?')),
50 ], 52 ],
51 options={ 53 options={
52 - 'verbose_name_plural': 'Exams',  
53 'verbose_name': 'Exam', 54 'verbose_name': 'Exam',
  55 + 'verbose_name_plural': 'Exams',
54 }, 56 },
55 bases=('courses.activity',), 57 bases=('courses.activity',),
56 ), 58 ),
exam/migrations/0002_auto_20161115_1936.py 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
  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 + ('exam', '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='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
  24 + ),
  25 + migrations.AddField(
  26 + model_name='answer',
  27 + name='exam',
  28 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'),
  29 + ),
  30 + ]
exam/migrations/0002_auto_20161116_1057.py
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 13:57  
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 - ('exam', '0001_initial'),  
16 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
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='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'),  
24 - ),  
25 - migrations.AddField(  
26 - model_name='answer',  
27 - name='exam',  
28 - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'),  
29 - ),  
30 - ]  
exam/migrations/0002_auto_20161117_0009.py 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 03:09
  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 + ('exam', '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='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
  24 + ),
  25 + migrations.AddField(
  26 + model_name='answer',
  27 + name='exam',
  28 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'),
  29 + ),
  30 + ]
exercise/admin.py
1 from django.contrib import admin 1 from django.contrib import admin
2 -from .models import Exercise 2 +from .models import Exercise, File
3 3
4 class ExerciseAdmin(admin.ModelAdmin): 4 class ExerciseAdmin(admin.ModelAdmin):
5 list_display = ['name'] 5 list_display = ['name']
6 search_fields = ['name'] 6 search_fields = ['name']
7 7
  8 +class FileAdmin(admin.ModelAdmin):
  9 + list_display = ['name']
  10 + search_fields = ['name']
  11 +
8 admin.site.register(Exercise, ExerciseAdmin) 12 admin.site.register(Exercise, ExerciseAdmin)
  13 +admin.site.register(File, ExerciseAdmin)
exercise/forms.py
@@ -9,11 +9,11 @@ class ExerciseForm(forms.ModelForm): @@ -9,11 +9,11 @@ class ExerciseForm(forms.ModelForm):
9 9
10 class Meta: 10 class Meta:
11 model = Exercise 11 model = Exercise
12 - fields = ['name', 'file'] 12 + fields = ['name']
13 13
14 14
15 class UpdateExerciseForm(forms.ModelForm): 15 class UpdateExerciseForm(forms.ModelForm):
16 16
17 class Meta: 17 class Meta:
18 model = Exercise 18 model = Exercise
19 - fields = ['name', 'file'] 19 + fields = ['name']
exercise/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
  6 +from decimal import Decimal
5 from django.db import migrations, models 7 from django.db import migrations, models
6 import django.db.models.deletion 8 import django.db.models.deletion
7 9
@@ -11,7 +13,6 @@ class Migration(migrations.Migration): @@ -11,7 +13,6 @@ class Migration(migrations.Migration):
11 initial = True 13 initial = True
12 14
13 dependencies = [ 15 dependencies = [
14 - ('courses', '0001_initial'),  
15 ] 16 ]
16 17
17 operations = [ 18 operations = [
@@ -19,9 +20,20 @@ class Migration(migrations.Migration): @@ -19,9 +20,20 @@ class Migration(migrations.Migration):
19 name='Exercise', 20 name='Exercise',
20 fields=[ 21 fields=[
21 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 22 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22 - ('file', models.FileField(upload_to='uploads/%Y/%m/%d')), 23 + ('description', models.TextField(blank=True, verbose_name='Descrição')),
  24 + ('init_date', models.DateField(verbose_name='Begin of Subject Date')),
  25 + ('end_date', models.DateField(verbose_name='End of Subject Date')),
  26 + ('grade', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=20, null=True)),
23 ('name', models.CharField(max_length=100)), 27 ('name', models.CharField(max_length=100)),
24 - ('topic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='courses.Topic', verbose_name='Topic')), 28 + ],
  29 + ),
  30 + migrations.CreateModel(
  31 + name='File',
  32 + fields=[
  33 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  34 + ('name', models.CharField(max_length=100)),
  35 + ('file', models.FileField(upload_to='uploads/%Y/%m/%d')),
  36 + ('exercise', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='file', to='exercise.Exercise')),
25 ], 37 ],
26 ), 38 ),
27 ] 39 ]
exercise/migrations/0002_auto_20161117_0009.py 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 03:09
  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 + ('exercise', '0001_initial'),
  17 + ('courses', '0002_auto_20161117_0009'),
  18 + ]
  19 +
  20 + operations = [
  21 + migrations.AddField(
  22 + model_name='exercise',
  23 + name='professors',
  24 + field=models.ManyToManyField(blank=True, related_name='professors_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
  25 + ),
  26 + migrations.AddField(
  27 + model_name='exercise',
  28 + name='students',
  29 + field=models.ManyToManyField(blank=True, related_name='subject_exercise', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
  30 + ),
  31 + migrations.AddField(
  32 + model_name='exercise',
  33 + name='topic',
  34 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='courses.Topic', verbose_name='Topic'),
  35 + ),
  36 + ]
exercise/models.py
1 -from django.db import models  
2 from courses.models import Topic 1 from courses.models import Topic
  2 +from decimal import Decimal
  3 +from django.db import models
3 from django.utils.translation import ugettext_lazy as _ 4 from django.utils.translation import ugettext_lazy as _
  5 +from users.models import User
4 6
5 """ 7 """
6 Function to return the path where the file should be saved 8 Function to return the path where the file should be saved
@@ -15,8 +17,24 @@ def file_path(instance, filename): @@ -15,8 +17,24 @@ def file_path(instance, filename):
15 It represents the Exercises inside topic. 17 It represents the Exercises inside topic.
16 """ 18 """
17 19
18 -  
19 class Exercise(models.Model): 20 class Exercise(models.Model):
20 topic = models.ForeignKey(Topic, verbose_name=_('Topic'), related_name='exercises') 21 topic = models.ForeignKey(Topic, verbose_name=_('Topic'), related_name='exercises')
21 - file = models.FileField(upload_to='uploads/%Y/%m/%d') 22 + professors = models.ManyToManyField(User, verbose_name=_('Professors'), related_name='professors_exercise', blank=True)
  23 + students = models.ManyToManyField(User, verbose_name=_('Students'), related_name='subject_exercise', blank = True)
  24 + description = models.TextField(_('Descrição'), blank=True)
  25 + init_date = models.DateField(_('Begin of Subject Date'))
  26 + end_date = models.DateField(_('End of Subject Date'))
  27 + grade = models.DecimalField(max_digits=20, decimal_places=2, default=Decimal('0.00'), null=True)
  28 + name = models.CharField(max_length=100)
  29 +
  30 + def __str__(self):
  31 + return self.name
  32 +
  33 +
  34 +class File(models.Model):
22 name = models.CharField(max_length=100) 35 name = models.CharField(max_length=100)
  36 + file = models.FileField(upload_to='uploads/%Y/%m/%d')
  37 + exercise = models.ForeignKey(Exercise, related_name='file')
  38 +
  39 + def __str__(self):
  40 + return self.name
23 \ No newline at end of file 41 \ No newline at end of file
exercise/templates/exercise/card_list_user.html 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +{% load static i18n list_topic_foruns permission_tags widget_tweaks professor_access list_topic_exercises %}
  2 +
  3 + <div class="col-md-12 col-sm-12 col-lg-12">
  4 + <div class="panel-group accordion ui-accordion ui-widget ui-helper-reset ui-sortable" role="tablist" aria-multiselectable="false">
  5 + <div class="group"><div class="panel panel-default">
  6 + <div class="panel-heading topic ui-sortable-handle" role="tab">
  7 + <div class="row">
  8 + <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{user.id}}" href=".collapseTopic-{{user.id}}" aria-expanded="false" aria-controls="collapseTopic-{{user.id}}">
  9 + <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button>
  10 + </div>
  11 + <div class="col-xs-9 col-md-9 titleTopic">
  12 + <a href="" role="button">
  13 + <h4>{{user|capfirst}}</h4>
  14 + </a>
  15 + </div>
  16 + </div>
  17 + </div>
  18 + <div class="panel-collapse collapseTopic-{{user.id}} collapse in" role="tabpanel" aria-labelledby="heading_{{user.id}}" aria-expanded="true" aria-hidden="false">
  19 + <div class="panel-body">
  20 + <div class="presentation">
  21 + <p>
  22 + <i>
  23 +
  24 + </i>
  25 + </p>
  26 +
  27 + </div>
  28 + </div>
  29 + </div>
  30 + </div>
  31 + </div>
  32 + </div>
  33 +</div>
0 \ No newline at end of file 34 \ No newline at end of file
exercise/templates/exercise/card_topic_exercises.html 0 → 100644
@@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
  1 +{% load static widget_tweaks i18n %}
  2 +
  3 +<div class="col-lg-4 col-xs-4 col-sm-4">
  4 + <div class="panel panel-default">
  5 + <div class="panel-body">
  6 + <form class="form-horizontal">
  7 + <fieldset>
  8 + <center><legend>{{exercise.name}}</legend></center>
  9 + <div class="container-fluid">
  10 + <div class="form-group">
  11 + <label class="col-md-2 col-xs-2 col-sm-2 control-label">Describe: </label><br>
  12 + {% if exercise.description%}
  13 + {{exercise.description}}
  14 + {% else %}
  15 + {% trans "Don't have description" %}
  16 + {% endif %}
  17 + </div>
  18 + <div class="form-group">
  19 + <label class="col-md-2 col-xs-2 col-sm-2 control-label">Opening: </label><br>{{exercise.init_date}}
  20 +
  21 + </div>
  22 + <div class="form-group">
  23 + <label class="col-md-2 col-xs-2 col-sm-2 control-label">Ending: </label><br>{{exercise.end_date}}
  24 +
  25 + </div>
  26 + <div class="form-group">
  27 + <label for="nota" class="col-md-2 control-label">NOTA:
  28 + {% if exercise.grade %}
  29 + <div class="col-md-4">
  30 + <p id="nota" class="form-control">
  31 + {{exercise.grade}}
  32 + </p>
  33 + </div>
  34 + {% else %}
  35 + {% trans 'Not yet' %}
  36 + {% endif %}
  37 + </label>
  38 + </div>
  39 + {% if exercise.file %}
  40 + <div class="form-group">
  41 + <label for="DelExc" class="col-md-4 control-label"> <i class="fa fa-file-archive-o fa-3x" aria-hidden="true">
  42 + {% for file in exercise.file %}
  43 + <a href="{{exercise.file.url}}">{% trans 'File' %}</a>
  44 + {% endfor %}
  45 + </i>
  46 + </div>
  47 + {% else %}
  48 + <p>{% trans 'Exercise not yet' %}</p>
  49 + {% endif %}
  50 + {% if not exercise.grade %}
  51 + <div class="form-group">
  52 + <label class="col-md-6 control-label"><i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i>{% trans 'Teacher waiting corretion' %}
  53 + </div>
  54 + {% endif %}
  55 + </div>
  56 +
  57 + </fieldset>
  58 + </form>
  59 +
  60 + </div>
  61 + </div>
  62 +</div>
0 \ No newline at end of file 63 \ No newline at end of file
exercise/templates/exercise/exercise_edit.html
1 {% load static i18n list_topic_foruns permission_tags %} 1 {% load static i18n list_topic_foruns permission_tags %}
2 -<div id="exercise-topic{{ exercise.id }}-exercises-edit"> 2 +<div id="exercise-topic{{ topic.id }}-exercises-edit">
3 {% for exercise in exercises %} 3 {% for exercise in exercises %}
4 <li class="icon_edit_remove" id = "exercise_edit_icon_{{ exercise.slug }}"> <a href="javascript:modal.get('', '#exercisesModalEdit', '#requisicoes_ajax')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('', '#exerciseDeleteModal', '#requisicoes_ajax')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li> 4 <li class="icon_edit_remove" id = "exercise_edit_icon_{{ exercise.slug }}"> <a href="javascript:modal.get('', '#exercisesModalEdit', '#requisicoes_ajax')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:modal.get('', '#exerciseDeleteModal', '#requisicoes_ajax')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
5 <li id = "exercise_edit_{{ exercise.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('', '#viewExerciseModal','#requisicoes_ajax')">{{exercise.name}}</a></li> 5 <li id = "exercise_edit_{{ exercise.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:modal.get('', '#viewExerciseModal','#requisicoes_ajax')">{{exercise.name}}</a></li>
exercise/templatetags/list_topic_exercises.py
@@ -5,21 +5,21 @@ register = template.Library() @@ -5,21 +5,21 @@ register = template.Library()
5 5
6 6
7 @register.inclusion_tag('exercise/exercise_list.html') 7 @register.inclusion_tag('exercise/exercise_list.html')
8 -def list_topic_exercise(request): 8 +def list_topic_exercise(request, topic):
9 context = { 9 context = {
10 'request': request, 10 'request': request,
11 } 11 }
12 - context['exercises'] = Exercise.objects.all() 12 + context['exercises'] = Exercise.objects.filter(topic=topic)
13 13
14 return context 14 return context
15 15
16 16
17 @register.inclusion_tag('exercise/exercise_edit.html') 17 @register.inclusion_tag('exercise/exercise_edit.html')
18 -def list_topic_exercise_edit(request, exercise): 18 +def list_topic_exercise_edit(request, topic):
19 context = { 19 context = {
20 'request': request, 20 'request': request,
21 } 21 }
22 - context['exercises'] = Exercise.objects.all()  
23 - context['exercise'] = exercise 22 + context['exercises'] = Exercise.objects.filter(topic = topic)
  23 + context['topic'] = topic
24 24
25 return context 25 return context
exercise/views.py
1 from .forms import ExerciseForm, UpdateExerciseForm 1 from .forms import ExerciseForm, UpdateExerciseForm
2 from .models import Exercise 2 from .models import Exercise
3 -from files.utils import mime_type_to_material_icons  
4 from core.decorators import log_decorator 3 from core.decorators import log_decorator
5 from core.mixins import LogMixin, NotificationMixin 4 from core.mixins import LogMixin, NotificationMixin
6 from core.models import Log, MimeType 5 from core.models import Log, MimeType
@@ -13,8 +12,10 @@ from django.core.urlresolvers import reverse_lazy @@ -13,8 +12,10 @@ from django.core.urlresolvers import reverse_lazy
13 from django.shortcuts import render, get_object_or_404, redirect 12 from django.shortcuts import render, get_object_or_404, redirect
14 from django.urls import reverse 13 from django.urls import reverse
15 from django.views import generic 14 from django.views import generic
  15 +from files.utils import mime_type_to_material_icons
16 from rolepermissions.mixins import HasRoleMixin 16 from rolepermissions.mixins import HasRoleMixin
17 from rolepermissions.verifications import has_role 17 from rolepermissions.verifications import has_role
  18 +from users.models import User
18 19
19 20
20 class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView): 21 class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView):
@@ -23,7 +24,7 @@ class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMix @@ -23,7 +24,7 @@ class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMix
23 log_action = 'create' 24 log_action = 'create'
24 log_component = {} 25 log_component = {}
25 26
26 - allowed_roles = ['student'] 27 + allowed_roles = ['student', 'professor']
27 login_url = reverse_lazy("core:home") 28 login_url = reverse_lazy("core:home")
28 redirect_field_name = 'next' 29 redirect_field_name = 'next'
29 model = Exercise 30 model = Exercise
files/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +# Generated by Django 1.10 on 2016-11-15 22:36
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
@@ -12,8 +12,8 @@ class Migration(migrations.Migration): @@ -12,8 +12,8 @@ class Migration(migrations.Migration):
12 initial = True 12 initial = True
13 13
14 dependencies = [ 14 dependencies = [
15 - ('core', '0001_initial'),  
16 ('courses', '0001_initial'), 15 ('courses', '0001_initial'),
  16 + ('core', '0001_initial'),
17 ] 17 ]
18 18
19 operations = [ 19 operations = [
@@ -26,9 +26,10 @@ class Migration(migrations.Migration): @@ -26,9 +26,10 @@ class Migration(migrations.Migration):
26 ('file_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topic_files', to='core.MimeType', verbose_name='Type file')), 26 ('file_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topic_files', to='core.MimeType', verbose_name='Type file')),
27 ], 27 ],
28 options={ 28 options={
  29 + 'verbose_name': 'File',
  30 +
29 'verbose_name_plural': 'Files', 31 'verbose_name_plural': 'Files',
30 'ordering': ('-id',), 32 'ordering': ('-id',),
31 - 'verbose_name': 'File',  
32 }, 33 },
33 bases=('courses.material',), 34 bases=('courses.material',),
34 ), 35 ),
files/migrations/0002_topicfile_professor.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 from django.conf import settings 6 from django.conf import settings
@@ -11,8 +12,8 @@ class Migration(migrations.Migration): @@ -11,8 +12,8 @@ class Migration(migrations.Migration):
11 initial = True 12 initial = True
12 13
13 dependencies = [ 14 dependencies = [
14 - ('files', '0001_initial'),  
15 migrations.swappable_dependency(settings.AUTH_USER_MODEL), 15 migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  16 + ('files', '0001_initial'),
16 ] 17 ]
17 18
18 operations = [ 19 operations = [
forum/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 from django.db import migrations, models 6 from django.db import migrations, models
@@ -24,8 +25,8 @@ class Migration(migrations.Migration): @@ -24,8 +25,8 @@ class Migration(migrations.Migration):
24 ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), 25 ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')),
25 ], 26 ],
26 options={ 27 options={
27 - 'verbose_name_plural': 'Foruns',  
28 'verbose_name': 'Forum', 28 'verbose_name': 'Forum',
  29 + 'verbose_name_plural': 'Foruns',
29 }, 30 },
30 bases=('courses.activity',), 31 bases=('courses.activity',),
31 ), 32 ),
@@ -38,8 +39,8 @@ class Migration(migrations.Migration): @@ -38,8 +39,8 @@ class Migration(migrations.Migration):
38 ('post_date', models.DateTimeField(auto_now_add=True, verbose_name='Post Date')), 39 ('post_date', models.DateTimeField(auto_now_add=True, verbose_name='Post Date')),
39 ], 40 ],
40 options={ 41 options={
41 - 'verbose_name_plural': 'Posts',  
42 'verbose_name': 'Post', 42 'verbose_name': 'Post',
  43 + 'verbose_name_plural': 'Posts',
43 }, 44 },
44 ), 45 ),
45 migrations.CreateModel( 46 migrations.CreateModel(
@@ -52,8 +53,8 @@ class Migration(migrations.Migration): @@ -52,8 +53,8 @@ class Migration(migrations.Migration):
52 ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Post', verbose_name='Post')), 53 ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Post', verbose_name='Post')),
53 ], 54 ],
54 options={ 55 options={
55 - 'verbose_name_plural': 'Post Answers',  
56 'verbose_name': 'Post Answer', 56 'verbose_name': 'Post Answer',
  57 + 'verbose_name_plural': 'Post Answers',
57 }, 58 },
58 ), 59 ),
59 ] 60 ]
forum/migrations/0002_auto_20161115_1936.py 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
  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 + ('forum', '0001_initial'),
  16 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  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/migrations/0002_auto_20161116_1057.py
@@ -1,35 +0,0 @@ @@ -1,35 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 13:57  
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 - ('forum', '0001_initial'),  
16 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
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/migrations/0002_auto_20161117_0009.py 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 03:09
  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 + ]
links/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +# Generated by Django 1.10 on 2016-11-15 22:36
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
@@ -19,13 +19,13 @@ class Migration(migrations.Migration): @@ -19,13 +19,13 @@ class Migration(migrations.Migration):
19 name='Link', 19 name='Link',
20 fields=[ 20 fields=[
21 ('material_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Material')), 21 ('material_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Material')),
22 - ('link_url', models.URLField()),  
23 - ('link_description', models.CharField(max_length=200)), 22 + ('link_url', models.URLField(verbose_name='Link_URL')),
  23 + ('link_description', models.CharField(max_length=200, verbose_name='Description')),
24 ('image', models.ImageField(blank=True, upload_to='links/')), 24 ('image', models.ImageField(blank=True, upload_to='links/')),
25 ], 25 ],
26 options={ 26 options={
27 - 'verbose_name_plural': 'Links',  
28 'verbose_name': 'Link', 27 'verbose_name': 'Link',
  28 + 'verbose_name_plural': 'Links',
29 }, 29 },
30 bases=('courses.material',), 30 bases=('courses.material',),
31 ), 31 ),
links/migrations/0002_auto_20161116_1338.py
@@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 16:38  
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 - ('links', '0001_initial'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='link',  
17 - name='link_description',  
18 - field=models.TextField(verbose_name='Description'),  
19 - ),  
20 - migrations.AlterField(  
21 - model_name='link',  
22 - name='link_url',  
23 - field=models.URLField(verbose_name='Link_URL'),  
24 - ),  
25 - ]  
links/migrations/0003_auto_20161116_1340.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 16:40  
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 - ('links', '0002_auto_20161116_1338'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='link',  
17 - name='link_description',  
18 - field=models.TextField(max_length=200, verbose_name='Description'),  
19 - ),  
20 - ]  
links/migrations/0004_auto_20161116_1341.py
@@ -1,20 +0,0 @@ @@ -1,20 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 16:41  
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 - ('links', '0003_auto_20161116_1340'),  
12 - ]  
13 -  
14 - operations = [  
15 - migrations.AlterField(  
16 - model_name='link',  
17 - name='link_description',  
18 - field=models.CharField(max_length=200, verbose_name='Description'),  
19 - ),  
20 - ]  
poll/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 from django.db import migrations, models 6 from django.db import migrations, models
@@ -23,9 +24,9 @@ class Migration(migrations.Migration): @@ -23,9 +24,9 @@ class Migration(migrations.Migration):
23 ('order', models.PositiveSmallIntegerField(verbose_name='Order')), 24 ('order', models.PositiveSmallIntegerField(verbose_name='Order')),
24 ], 25 ],
25 options={ 26 options={
26 - 'verbose_name_plural': 'Answers',  
27 - 'ordering': ('order',),  
28 'verbose_name': 'Answer', 27 'verbose_name': 'Answer',
  28 + 'ordering': ('order',),
  29 + 'verbose_name_plural': 'Answers',
29 }, 30 },
30 ), 31 ),
31 migrations.CreateModel( 32 migrations.CreateModel(
@@ -37,8 +38,8 @@ class Migration(migrations.Migration): @@ -37,8 +38,8 @@ class Migration(migrations.Migration):
37 ('answer', models.ManyToManyField(related_name='answers_stundet', to='poll.Answer', verbose_name='Answers Students')), 38 ('answer', models.ManyToManyField(related_name='answers_stundet', to='poll.Answer', verbose_name='Answers Students')),
38 ], 39 ],
39 options={ 40 options={
40 - 'verbose_name_plural': 'Answers Student',  
41 'verbose_name': 'Answer Stundent', 41 'verbose_name': 'Answer Stundent',
  42 + 'verbose_name_plural': 'Answers Student',
42 }, 43 },
43 ), 44 ),
44 migrations.CreateModel( 45 migrations.CreateModel(
@@ -47,8 +48,8 @@ class Migration(migrations.Migration): @@ -47,8 +48,8 @@ class Migration(migrations.Migration):
47 ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')), 48 ('activity_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='courses.Activity')),
48 ], 49 ],
49 options={ 50 options={
50 - 'verbose_name_plural': 'Polls',  
51 'verbose_name': 'Poll', 51 'verbose_name': 'Poll',
  52 + 'verbose_name_plural': 'Polls',
52 }, 53 },
53 bases=('courses.activity',), 54 bases=('courses.activity',),
54 ), 55 ),
poll/migrations/0002_auto_20161115_1936.py 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
  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/migrations/0002_auto_20161116_1057.py
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -# -*- coding: utf-8 -*-  
2 -# Generated by Django 1.10 on 2016-11-16 13:57  
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 - ('poll', '0001_initial'),  
16 - migrations.swappable_dependency(settings.AUTH_USER_MODEL),  
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/migrations/0002_auto_20161117_0009.py 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-17 03:09
  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 + ]
users/migrations/0001_initial.py
1 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 -# Generated by Django 1.10 on 2016-11-16 13:57 2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 from __future__ import unicode_literals 4 from __future__ import unicode_literals
4 5
5 import django.contrib.auth.models 6 import django.contrib.auth.models
@@ -30,14 +31,14 @@ class Migration(migrations.Migration): @@ -30,14 +31,14 @@ class Migration(migrations.Migration):
30 ('city', models.CharField(blank=True, max_length=90, verbose_name='City')), 31 ('city', models.CharField(blank=True, max_length=90, verbose_name='City')),
31 ('state', models.CharField(blank=True, max_length=30, verbose_name='State')), 32 ('state', models.CharField(blank=True, max_length=30, verbose_name='State')),
32 ('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1, verbose_name='Gender')), 33 ('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1, verbose_name='Gender')),
33 - ('image', models.ImageField(blank=True, null=True, upload_to='users/', verbose_name='Photo')),  
34 - ('birth_date', models.DateField(null=True, verbose_name='Birth Date')), 34 + ('image', models.ImageField(blank=True, null=True, upload_to='users/', verbose_name='Image')),
  35 + ('birth_date', models.DateField(verbose_name='Birth Date')),
35 ('phone', models.CharField(blank=True, max_length=30, verbose_name='Phone')), 36 ('phone', models.CharField(blank=True, max_length=30, verbose_name='Phone')),
36 - ('cpf', models.CharField(blank=True, max_length=15, null=True, verbose_name='CPF')), 37 + ('cpf', models.CharField(max_length=15, verbose_name='Cpf')),
37 ('type_profile', models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Student')], default=2, null=True, verbose_name='Type')), 38 ('type_profile', models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Student')], default=2, null=True, verbose_name='Type')),
38 ('titration', models.CharField(blank=True, max_length=50, null=True, verbose_name='Titration')), 39 ('titration', models.CharField(blank=True, max_length=50, null=True, verbose_name='Titration')),
39 ('year_titration', models.CharField(blank=True, max_length=4, null=True, verbose_name='Year of titration')), 40 ('year_titration', models.CharField(blank=True, max_length=4, null=True, verbose_name='Year of titration')),
40 - ('institution', models.CharField(blank=True, max_length=50, null=True, verbose_name='Institution')), 41 + ('institution', models.CharField(blank=True, max_length=50, null=True, verbose_name='Institution where he had titration')),
41 ('curriculum', models.FileField(blank=True, null=True, upload_to='users/curriculum/', verbose_name='Curriculum')), 42 ('curriculum', models.FileField(blank=True, null=True, upload_to='users/curriculum/', verbose_name='Curriculum')),
42 ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), 43 ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')),
43 ('is_staff', models.BooleanField(default=False, verbose_name='Administrador')), 44 ('is_staff', models.BooleanField(default=False, verbose_name='Administrador')),
@@ -46,8 +47,8 @@ class Migration(migrations.Migration): @@ -46,8 +47,8 @@ class Migration(migrations.Migration):
46 ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), 47 ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
47 ], 48 ],
48 options={ 49 options={
49 - 'verbose_name_plural': 'Users',  
50 'verbose_name': 'User', 50 'verbose_name': 'User',
  51 + 'verbose_name_plural': 'Users',
51 }, 52 },
52 managers=[ 53 managers=[
53 ('objects', django.contrib.auth.models.UserManager()), 54 ('objects', django.contrib.auth.models.UserManager()),
users/migrations/0002_auto_20161115_1941.py 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 22:41
  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 + ('users', '0001_initial'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AlterField(
  16 + model_name='user',
  17 + name='birth_date',
  18 + field=models.DateField(null=True, verbose_name='Birth Date'),
  19 + ),
  20 + ]
users/migrations/0003_auto_20161115_2054.py 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-11-15 23:54
  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 + ('users', '0002_auto_20161115_1941'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AlterField(
  16 + model_name='user',
  17 + name='cpf',
  18 + field=models.CharField(blank=True, max_length=15, null=True, verbose_name='CPF'),
  19 + ),
  20 + migrations.AlterField(
  21 + model_name='user',
  22 + name='image',
  23 + field=models.ImageField(blank=True, null=True, upload_to='users/', verbose_name='Photo'),
  24 + ),
  25 + migrations.AlterField(
  26 + model_name='user',
  27 + name='institution',
  28 + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Institution'),
  29 + ),
  30 + ]