diff --git a/amadeus/settings.py b/amadeus/settings.py
index 8d9e77f..335b86f 100644
--- a/amadeus/settings.py
+++ b/amadeus/settings.py
@@ -58,6 +58,7 @@ INSTALLED_APPS = [
'poll',
'links',
'files',
+ 'exercise',
]
diff --git a/app/migrations/0001_initial.py b/app/migrations/0001_initial.py
index edc238c..d884aa3 100644
--- a/app/migrations/0001_initial.py
+++ b/app/migrations/0001_initial.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
from django.db import migrations, models
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
index 6fff7e8..066799c 100644
--- a/core/migrations/0001_initial.py
+++ b/core/migrations/0001_initial.py
@@ -1,9 +1,8 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
import autoslug.fields
-from django.conf import settings
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
@@ -14,7 +13,6 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@@ -35,7 +33,6 @@ class Migration(migrations.Migration):
name='Action_Resource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('action', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied')),
],
options={
'verbose_name': 'Action_Resource',
@@ -49,8 +46,6 @@ class Migration(migrations.Migration):
('component', models.TextField(verbose_name='Component (Module / App)')),
('context', django.contrib.postgres.fields.jsonb.JSONField(blank=True, verbose_name='Context')),
('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),
- ('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor')),
],
options={
'verbose_name': 'Log',
@@ -77,8 +72,6 @@ class Migration(migrations.Migration):
('read', models.BooleanField(default=False, verbose_name='Read')),
('datetime', models.DateTimeField(auto_now_add=True, verbose_name='Date and Time of action')),
('action_resource', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource')),
- ('actor', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User')),
],
options={
'verbose_name': 'Notification',
@@ -99,9 +92,4 @@ class Migration(migrations.Migration):
'verbose_name_plural': 'Resources',
},
),
- migrations.AddField(
- model_name='action_resource',
- name='resource',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Resource', verbose_name='Resource'),
- ),
]
diff --git a/core/migrations/0002_auto_20161114_0144.py b/core/migrations/0002_auto_20161114_0144.py
new file mode 100644
index 0000000..89d94ca
--- /dev/null
+++ b/core/migrations/0002_auto_20161114_0144.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('core', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='notification',
+ name='actor',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notification_Performer', to=settings.AUTH_USER_MODEL, verbose_name='Perfomer'),
+ ),
+ migrations.AddField(
+ model_name='notification',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notification_Actor', to=settings.AUTH_USER_MODEL, verbose_name='User'),
+ ),
+ migrations.AddField(
+ model_name='log',
+ name='action_resource',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action_Resource', verbose_name='Action_Resource'),
+ ),
+ migrations.AddField(
+ model_name='log',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Actor'),
+ ),
+ migrations.AddField(
+ model_name='action_resource',
+ name='action',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Action', verbose_name='Action_Applied'),
+ ),
+ migrations.AddField(
+ model_name='action_resource',
+ name='resource',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Resource', verbose_name='Resource'),
+ ),
+ ]
diff --git a/courses/admin.py b/courses/admin.py
index 1bb777a..bf42eb2 100644
--- a/courses/admin.py
+++ b/courses/admin.py
@@ -1,6 +1,6 @@
from django.contrib import admin
-from .models import CourseCategory, Course, Subject, Topic, Activity, Material, CategorySubject, Exercise
+from .models import CourseCategory, Course, Subject, Topic, Activity, Material, CategorySubject
class CategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'slug']
@@ -30,15 +30,10 @@ class MaterialAdmin(admin.ModelAdmin):
list_display = ['name', 'slug']
search_fields = ['name', 'slug']
-class ExerciseAdmin(admin.ModelAdmin):
- list_display = ['name']
- search_fields = ['name']
-
admin.site.register(CourseCategory, CategoryAdmin)
admin.site.register(Course, CourseAdmin)
admin.site.register(Subject, SubjectAdmin)
admin.site.register(Topic, TopicAdmin)
admin.site.register(Activity, ActivityAdmin)
admin.site.register(Material, MaterialAdmin)
-admin.site.register(Exercise, ExerciseAdmin)
admin.site.register(CategorySubject, CategorySubjectAdmin)
diff --git a/courses/migrations/0001_initial.py b/courses/migrations/0001_initial.py
index 8762129..4f2c706 100644
--- a/courses/migrations/0001_initial.py
+++ b/courses/migrations/0001_initial.py
@@ -1,9 +1,8 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
import autoslug.fields
-from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import s3direct.fields
@@ -15,7 +14,6 @@ class Migration(migrations.Migration):
dependencies = [
('core', '0001_initial'),
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@@ -25,7 +23,6 @@ class Migration(migrations.Migration):
('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')),
('limit_date', models.DateField(verbose_name='Deliver Date')),
('all_students', models.BooleanField(default=False, verbose_name='All Students')),
- ('students', models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students')),
],
bases=('core.resource',),
),
@@ -35,7 +32,6 @@ class Migration(migrations.Migration):
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('pdf', s3direct.fields.S3DirectField()),
('name', models.CharField(max_length=100)),
- ('diet', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity')),
],
options={
'verbose_name': 'Activity File',
@@ -72,9 +68,9 @@ class Migration(migrations.Migration):
('public', models.BooleanField(default=False, verbose_name='Public')),
],
options={
+ 'ordering': ('create_date', 'name'),
'verbose_name': 'Course',
'verbose_name_plural': 'Courses',
- 'ordering': ('create_date', 'name'),
},
),
migrations.CreateModel(
@@ -112,7 +108,6 @@ class Migration(migrations.Migration):
fields=[
('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='core.Resource')),
('all_students', models.BooleanField(default=False, verbose_name='All Students')),
- ('students', models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students')),
],
bases=('core.resource',),
),
@@ -128,15 +123,11 @@ class Migration(migrations.Migration):
('end_date', models.DateField(verbose_name='End of Subject Date')),
('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')),
- ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subject_category', to='courses.CategorySubject', verbose_name='Category')),
- ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course')),
- ('professors', models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors')),
- ('students', models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students')),
],
options={
+ 'ordering': ('create_date', 'name'),
'verbose_name': 'Subject',
'verbose_name_plural': 'Subjects',
- 'ordering': ('create_date', 'name'),
},
),
migrations.CreateModel(
@@ -146,7 +137,6 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=100, verbose_name='Name')),
('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
('description', models.TextField(blank=True, verbose_name='Description')),
- ('subjects', models.ManyToManyField(to='courses.Subject')),
],
options={
'verbose_name': 'subject category',
@@ -163,53 +153,11 @@ class Migration(migrations.Migration):
('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
('update_date', models.DateTimeField(auto_now=True, verbose_name='Date of last update')),
('visible', models.BooleanField(default=False, verbose_name='Visible')),
- ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Owner')),
- ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject')),
],
options={
+ 'ordering': ('create_date', 'name'),
'verbose_name': 'Topic',
'verbose_name_plural': 'Topics',
- 'ordering': ('create_date', 'name'),
},
),
- migrations.AddField(
- model_name='material',
- name='topic',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'),
- ),
- migrations.AddField(
- model_name='linkmaterial',
- name='material',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'),
- ),
- migrations.AddField(
- model_name='filematerial',
- name='material',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'),
- ),
- migrations.AddField(
- model_name='course',
- name='category',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'),
- ),
- migrations.AddField(
- model_name='course',
- name='coordenator',
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='course_coordenator', to=settings.AUTH_USER_MODEL, verbose_name='Coordenator'),
- ),
- migrations.AddField(
- model_name='course',
- name='professors',
- field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
- ),
- migrations.AddField(
- model_name='course',
- name='students',
- field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
- ),
- migrations.AddField(
- model_name='activity',
- name='topic',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'),
- ),
]
diff --git a/courses/migrations/0002_auto_20161114_0144.py b/courses/migrations/0002_auto_20161114_0144.py
new file mode 100644
index 0000000..fe1444e
--- /dev/null
+++ b/courses/migrations/0002_auto_20161114_0144.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('courses', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='topic',
+ name='owner',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Owner'),
+ ),
+ migrations.AddField(
+ model_name='topic',
+ name='subject',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='courses.Subject', verbose_name='Subject'),
+ ),
+ migrations.AddField(
+ model_name='subjectcategory',
+ name='subjects',
+ field=models.ManyToManyField(to='courses.Subject'),
+ ),
+ migrations.AddField(
+ model_name='subject',
+ name='category',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subject_category', to='courses.CategorySubject', verbose_name='Category'),
+ ),
+ migrations.AddField(
+ model_name='subject',
+ name='course',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='courses.Course', verbose_name='Course'),
+ ),
+ migrations.AddField(
+ model_name='subject',
+ name='professors',
+ field=models.ManyToManyField(related_name='professors_subjects', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
+ ),
+ migrations.AddField(
+ model_name='subject',
+ name='students',
+ field=models.ManyToManyField(blank=True, related_name='subject_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
+ ),
+ migrations.AddField(
+ model_name='material',
+ name='students',
+ field=models.ManyToManyField(related_name='materials', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
+ ),
+ migrations.AddField(
+ model_name='material',
+ name='topic',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='courses.Topic', verbose_name='Topic'),
+ ),
+ migrations.AddField(
+ model_name='linkmaterial',
+ name='material',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_link', to='courses.Material', verbose_name='Material'),
+ ),
+ migrations.AddField(
+ model_name='filematerial',
+ name='material',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_file', to='courses.Material', verbose_name='Material'),
+ ),
+ migrations.AddField(
+ model_name='course',
+ name='category',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_category', to='courses.CourseCategory', verbose_name='Category'),
+ ),
+ migrations.AddField(
+ model_name='course',
+ name='coordenator',
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='course_coordenator', to=settings.AUTH_USER_MODEL, verbose_name='Coordenator'),
+ ),
+ migrations.AddField(
+ model_name='course',
+ name='professors',
+ field=models.ManyToManyField(related_name='courses_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
+ ),
+ migrations.AddField(
+ model_name='course',
+ name='students',
+ field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
+ ),
+ migrations.AddField(
+ model_name='activityfile',
+ name='diet',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='courses.Activity'),
+ ),
+ migrations.AddField(
+ model_name='activity',
+ name='students',
+ field=models.ManyToManyField(related_name='activities', to=settings.AUTH_USER_MODEL, verbose_name='Students'),
+ ),
+ migrations.AddField(
+ model_name='activity',
+ name='topic',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='courses.Topic', verbose_name='Topic'),
+ ),
+ ]
diff --git a/courses/migrations/0002_exercise.py b/courses/migrations/0002_exercise.py
deleted file mode 100644
index 709d21a..0000000
--- a/courses/migrations/0002_exercise.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 19:30
-from __future__ import unicode_literals
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('courses', '0001_initial'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='Exercise',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('file', models.FileField(upload_to='uploads/%Y/%m/%d')),
- ('name', models.CharField(max_length=100)),
- ('exercise', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='material_exercise', to='courses.Material', verbose_name='Material')),
- ],
- ),
- ]
diff --git a/courses/models.py b/courses/models.py
index b98300d..1ecf84f 100644
--- a/courses/models.py
+++ b/courses/models.py
@@ -157,14 +157,6 @@ class LinkMaterial(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
url = models.URLField('Link', max_length=300)
-"""
-It represents the Exercises inside topic.
-"""
-
-class Exercise(models.Model):
- exercise = models.ForeignKey(Material, verbose_name = _('Material'), related_name='material_exercise')
- file = models.FileField(upload_to='uploads/%Y/%m/%d')
- name = models.CharField(max_length=100)
"""
It is a category for each subject.
diff --git a/courses/templates/exercise/create_exercise.html b/courses/templates/exercise/create_exercise.html
deleted file mode 100644
index 2cf8fa3..0000000
--- a/courses/templates/exercise/create_exercise.html
+++ /dev/null
@@ -1,74 +0,0 @@
-{% load widget_tweaks i18n %}
-
-
-
-{% block script_link %}
- {# // #}
-
-{% endblock script_link %}
\ No newline at end of file
diff --git a/courses/templates/exercise/exercise_edit.html b/courses/templates/exercise/exercise_edit.html
deleted file mode 100644
index 08e33d3..0000000
--- a/courses/templates/exercise/exercise_edit.html
+++ /dev/null
@@ -1,7 +0,0 @@
-{% load static i18n list_topic_foruns permission_tags %}
-
diff --git a/courses/templates/exercise/exercise_list.html b/courses/templates/exercise/exercise_list.html
deleted file mode 100644
index 1d46441..0000000
--- a/courses/templates/exercise/exercise_list.html
+++ /dev/null
@@ -1,6 +0,0 @@
-{% load static i18n list_topic_foruns permission_tags %}
-
diff --git a/courses/templates/subject/form_view_student.html b/courses/templates/subject/form_view_student.html
index e194dcc..0e8cde6 100644
--- a/courses/templates/subject/form_view_student.html
+++ b/courses/templates/subject/form_view_student.html
@@ -67,6 +67,15 @@
{% trans 'Exercises' %}
+
+ {# dropdown de create exercício #}
+
+
{# exercício do tópico no modo de visualização #}
diff --git a/courses/templatetags/list_topic_exercises.py b/courses/templatetags/list_topic_exercises.py
deleted file mode 100644
index 5a818dd..0000000
--- a/courses/templatetags/list_topic_exercises.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from django import template
-from courses.models import Exercise
-
-register = template.Library()
-
-
-@register.inclusion_tag('exercise/exercise_list.html')
-def list_topic_exercise(request):
- context = {
- 'request': request,
- }
- context['exercises'] = Exercise.objects.all()
-
- return context
-
-
-@register.inclusion_tag('exercise/exercise_edit.html')
-def list_topic_exercise_edit(request, exercise):
- context = {
- 'request': request,
- }
- context['exercises'] = Exercise.objects.all()
- context['exercise'] = exercise
-
- return context
diff --git a/courses/urls.py b/courses/urls.py
index 285da5f..4cc446e 100644
--- a/courses/urls.py
+++ b/courses/urls.py
@@ -2,38 +2,39 @@ from django.conf.urls import url, include
from . import views
urlpatterns = [
- url(r'^$', views.IndexView.as_view(), name='manage'),
- url(r'^all-courses/$', views.AllCoursesView.as_view(), name='all_courses'),
- url(r'^create/$', views.CreateCourseView.as_view(), name='create'),
- url(r'^replicate_course/(?P[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'),
- url(r'^replicate_subject/(?P[\w_-]+)/$', views.ReplicateSubjectView.as_view(), name='replicate_subject'),
- url(r'^edit/(?P[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'),
- url(r'^delete/(?P[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'),
- url(r'^subscribe/(?P[\w_-]+)/$', views.subscribe_course, name='subscribe'),
- url(r'^category/(?P[\w_-]+)/$', views.FilteredView.as_view(), name='filter'),
- url(r'^categories/view/$', views.IndexCatView.as_view(), name='manage_cat'),
- url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"),
- url(r'^categories/edit/(?P[\w_-]+)/$', views.UpdateCatView.as_view(), name='update_cat'),
- url(r'^categories/delete/(?P[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'),
- url(r'^subjects/(?P[\w_-]+)/$', views.SubjectsView.as_view(), name='view_subject'),
- url(r'^subjects/create/(?P[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'),
- url(r'^subjects/update/(?P[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'),
- url(r'^subjects/delete/(?P[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'),
- url(r'^subjects/subscribe/(?P[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'),
- url(r'^topics/create/(?P[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'),
- url(r'^topics/update/(?P[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
- url(r'^topics/update/(?P[\w_-]+)/$', views.DeleteTopic.as_view(), name='update_topic'),
- url(r'^topics/(?P[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'),
- url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'),
- url(r'^forum/', include('forum.urls', namespace = 'forum')),
- url(r'^poll/', include('poll.urls', namespace = 'poll')),
- url(r'^exam/', include('exam.urls', namespace = 'exam')),
- url(r'^files/', include('files.urls', namespace = 'file')),
- url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'),
- url(r'^subjects/file-material-view/(?P[\w_-]+)/$', views.FileMaterialView.as_view(), name='file_material_view'),
- url(r'^links/',include('links.urls',namespace = 'links')),
- url(r'^(?P[\w_-]+)/', include([
- url(r'^$', views.CourseView.as_view(), name='view'),
- url(r'^(?P[\w_-]+)/$', views.CourseView.as_view(), name='view_filter')
- ])),
+ url(r'^$', views.IndexView.as_view(), name='manage'),
+ url(r'^all-courses/$', views.AllCoursesView.as_view(), name='all_courses'),
+ url(r'^create/$', views.CreateCourseView.as_view(), name='create'),
+ url(r'^replicate_course/(?P[\w_-]+)/$', views.ReplicateCourseView.as_view(), name='replicate_course'),
+ url(r'^replicate_subject/(?P[\w_-]+)/$', views.ReplicateSubjectView.as_view(), name='replicate_subject'),
+ url(r'^edit/(?P[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'),
+ url(r'^delete/(?P[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'),
+ url(r'^subscribe/(?P[\w_-]+)/$', views.subscribe_course, name='subscribe'),
+ url(r'^category/(?P[\w_-]+)/$', views.FilteredView.as_view(), name='filter'),
+ url(r'^categories/view/$', views.IndexCatView.as_view(), name='manage_cat'),
+ url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"),
+ url(r'^categories/edit/(?P[\w_-]+)/$', views.UpdateCatView.as_view(), name='update_cat'),
+ url(r'^categories/delete/(?P[\w_-]+)/$', views.DeleteCatView.as_view(), name='delete_cat'),
+ url(r'^subjects/(?P[\w_-]+)/$', views.SubjectsView.as_view(), name='view_subject'),
+ url(r'^subjects/create/(?P[\w_-]+)/$', views.CreateSubjectView.as_view(), name='create_subject'),
+ url(r'^subjects/update/(?P[\w_-]+)/$', views.UpdateSubjectView.as_view(), name='update_subject'),
+ url(r'^subjects/delete/(?P[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'),
+ url(r'^subjects/subscribe/(?P[\w_-]+)/$', views.subscribe_subject, name='subscribe_subject'),
+ url(r'^topics/create/(?P[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'),
+ url(r'^topics/update/(?P[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'),
+ url(r'^topics/update/(?P[\w_-]+)/$', views.DeleteTopic.as_view(), name='update_topic'),
+ url(r'^topics/(?P[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'),
+ url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'),
+ url(r'^forum/', include('forum.urls', namespace = 'forum')),
+ url(r'^poll/', include('poll.urls', namespace = 'poll')),
+ url(r'^exam/', include('exam.urls', namespace = 'exam')),
+ url(r'^files/', include('files.urls', namespace = 'file')),
+ url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'),
+ url(r'^subjects/file-material-view/(?P[\w_-]+)/$', views.FileMaterialView.as_view(), name='file_material_view'),
+ url(r'^links/',include('links.urls',namespace = 'links')),
+ url(r'^exercise/', include('exercise.urls', namespace='exercise')),
+ url(r'^(?P[\w_-]+)/', include([
+ url(r'^$', views.CourseView.as_view(), name='view'),
+ url(r'^(?P[\w_-]+)/$', views.CourseView.as_view(), name='view_filter')
+ ])),
]
diff --git a/courses/views.py b/courses/views.py
index b74f55d..4e3d5c7 100644
--- a/courses/views.py
+++ b/courses/views.py
@@ -1,30 +1,30 @@
-from django.shortcuts import get_object_or_404
-from django.views import generic
+from .forms import CourseForm, UpdateCourseForm, CategoryCourseForm, SubjectForm,TopicForm,ActivityForm
+from .models import Course, Subject, CourseCategory, Topic, SubjectCategory, Activity, CategorySubject
+from core.decorators import log_decorator
+from core.mixins import LogMixin, NotificationMixin
+from core.models import Log
+from courses.models import Material
+from datetime import date, datetime
from django.contrib import messages
from django.contrib.auth.decorators import login_required
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.contrib.auth.mixins import LoginRequiredMixin
-from rolepermissions.mixins import HasRoleMixin
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse_lazy
-from django.utils.translation import ugettext_lazy as _
-from rolepermissions.verifications import has_role
from django.db.models import Q
-import operator
-from functools import reduce
-from rolepermissions.verifications import has_object_permission
from django.http import JsonResponse
-from .forms import CourseForm, UpdateCourseForm, CategoryCourseForm, SubjectForm,TopicForm,ActivityForm
-from .models import Course, Subject, CourseCategory,Topic, Exercise, SubjectCategory,Activity, CategorySubject
-from core.decorators import log_decorator
-from core.mixins import LogMixin, NotificationMixin
-from core.models import Log
-from users.models import User
+from django.shortcuts import get_object_or_404
+from django.urls import reverse
+from django.utils.translation import ugettext_lazy as _
+from django.views import generic
+from exercise.models import Exercise
from files.forms import FileForm
from files.models import TopicFile
-from courses.models import Material
-from django.urls import reverse
-
-from datetime import date, datetime
+from functools import reduce
+from rolepermissions.mixins import HasRoleMixin
+from rolepermissions.verifications import has_object_permission
+from rolepermissions.verifications import has_role
+from users.models import User
+import operator
import time
#API IMPORTS
@@ -566,7 +566,7 @@ class SubjectsView(LoginRequiredMixin, LogMixin, generic.ListView):
context['course'] = subject.course
context['subject'] = subject
context['topics'] = Topic.objects.filter(subject = subject)
- context['exercise'] = Exercise.objects.filter(exercise__topic__subject=subject)
+ context['exercise'] = Exercise.objects.filter(topic__subject=subject)
if has_role(self.request.user,'professor') or has_role(self.request.user,'system_admin'):
context['files'] = TopicFile.objects.filter(professor__name = self.request.user.name)
else:
diff --git a/exam/migrations/0001_initial.py b/exam/migrations/0001_initial.py
index 81703fe..1464ad5 100644
--- a/exam/migrations/0001_initial.py
+++ b/exam/migrations/0001_initial.py
@@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
-from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
@@ -13,7 +12,6 @@ class Migration(migrations.Migration):
dependencies = [
('courses', '0001_initial'),
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@@ -25,9 +23,9 @@ class Migration(migrations.Migration):
('order', models.PositiveSmallIntegerField(verbose_name='Order')),
],
options={
+ 'ordering': ('order',),
'verbose_name': 'Answer',
'verbose_name_plural': 'Answers',
- 'ordering': ('order',),
},
),
migrations.CreateModel(
@@ -61,14 +59,4 @@ class Migration(migrations.Migration):
name='exam',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_exam', to='exam.Exam', verbose_name='Exam'),
),
- migrations.AddField(
- model_name='answersstudent',
- name='student',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
- ),
- migrations.AddField(
- model_name='answer',
- name='exam',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'),
- ),
]
diff --git a/exam/migrations/0002_auto_20161114_0144.py b/exam/migrations/0002_auto_20161114_0144.py
new file mode 100644
index 0000000..a1493de
--- /dev/null
+++ b/exam/migrations/0002_auto_20161114_0144.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('exam', '0001_initial'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='answersstudent',
+ name='student',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
+ ),
+ migrations.AddField(
+ model_name='answer',
+ name='exam',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='exam.Exam', verbose_name='Answers'),
+ ),
+ ]
diff --git a/exercise/__init__.py b/exercise/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/exercise/__init__.py
diff --git a/exercise/admin.py b/exercise/admin.py
new file mode 100644
index 0000000..b2752a4
--- /dev/null
+++ b/exercise/admin.py
@@ -0,0 +1,8 @@
+from django.contrib import admin
+from .models import Exercise
+
+class ExerciseAdmin(admin.ModelAdmin):
+ list_display = ['name']
+ search_fields = ['name']
+
+admin.site.register(Exercise, ExerciseAdmin)
diff --git a/exercise/apps.py b/exercise/apps.py
new file mode 100644
index 0000000..9ff568a
--- /dev/null
+++ b/exercise/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class ExerciseConfig(AppConfig):
+ name = 'exercise'
diff --git a/exercise/forms.py b/exercise/forms.py
new file mode 100644
index 0000000..a36ad46
--- /dev/null
+++ b/exercise/forms.py
@@ -0,0 +1,19 @@
+from .models import Exercise
+from django import forms
+from django.core.exceptions import ValidationError, FieldError
+from django.utils.translation import ugettext_lazy as _
+import requests
+
+
+class ExerciseForm(forms.ModelForm):
+
+ class Meta:
+ model = Exercise
+ fields = ['name', 'file']
+
+
+class UpdateExerciseForm(forms.ModelForm):
+
+ class Meta:
+ model = Exercise
+ fields = ['name', 'file']
diff --git a/exercise/migrations/0001_initial.py b/exercise/migrations/0001_initial.py
new file mode 100644
index 0000000..2de77e8
--- /dev/null
+++ b/exercise/migrations/0001_initial.py
@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('courses', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Exercise',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('file', models.FileField(upload_to='uploads/%Y/%m/%d')),
+ ('name', models.CharField(max_length=100)),
+ ('topic', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exercises', to='courses.Topic', verbose_name='Topic')),
+ ],
+ ),
+ ]
diff --git a/exercise/migrations/__init__.py b/exercise/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/exercise/migrations/__init__.py
diff --git a/exercise/models.py b/exercise/models.py
new file mode 100644
index 0000000..f2664f8
--- /dev/null
+++ b/exercise/models.py
@@ -0,0 +1,22 @@
+from django.db import models
+from courses.models import Topic
+from django.utils.translation import ugettext_lazy as _
+
+"""
+ Function to return the path where the file should be saved
+"""
+
+
+def file_path(instance, filename):
+ return '/'.join([instance.topic.subject.course.slug, instance.topic.subject.slug, instance.topic.slug, filename])
+
+
+"""
+It represents the Exercises inside topic.
+"""
+
+
+class Exercise(models.Model):
+ topic = models.ForeignKey(Topic, verbose_name=_('Topic'), related_name='exercises')
+ file = models.FileField(upload_to='uploads/%Y/%m/%d')
+ name = models.CharField(max_length=100)
diff --git a/exercise/static/js/exercise.js b/exercise/static/js/exercise.js
new file mode 100644
index 0000000..a071569
--- /dev/null
+++ b/exercise/static/js/exercise.js
@@ -0,0 +1,7 @@
+function get_modal_link(url, id,div_content){
+ $.get(url, function (data) {
+ $(div_content).detach();
+ $(div_content).append(data);
+ $(id).modal('show');
+ });
+}
diff --git a/exercise/templates/exercise/create_exercise.html b/exercise/templates/exercise/create_exercise.html
new file mode 100644
index 0000000..1721df7
--- /dev/null
+++ b/exercise/templates/exercise/create_exercise.html
@@ -0,0 +1,82 @@
+{% load widget_tweaks i18n static %}
+
+
+
+
+
diff --git a/exercise/templates/exercise/delete_exercise.html b/exercise/templates/exercise/delete_exercise.html
new file mode 100644
index 0000000..4b7a289
--- /dev/null
+++ b/exercise/templates/exercise/delete_exercise.html
@@ -0,0 +1,66 @@
+{% load static widget_tweaks i18n %}
+
+
+
+
+
+
+
+
diff --git a/exercise/templates/exercise/exercise_edit.html b/exercise/templates/exercise/exercise_edit.html
new file mode 100644
index 0000000..b14c1ee
--- /dev/null
+++ b/exercise/templates/exercise/exercise_edit.html
@@ -0,0 +1,7 @@
+{% load static i18n list_topic_foruns permission_tags %}
+
diff --git a/exercise/templates/exercise/exercise_list.html b/exercise/templates/exercise/exercise_list.html
new file mode 100644
index 0000000..a6763db
--- /dev/null
+++ b/exercise/templates/exercise/exercise_list.html
@@ -0,0 +1,6 @@
+{% load static i18n list_topic_foruns permission_tags %}
+
diff --git a/exercise/templatetags/__init__.py b/exercise/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/exercise/templatetags/__init__.py
diff --git a/exercise/templatetags/list_topic_exercises.py b/exercise/templatetags/list_topic_exercises.py
new file mode 100644
index 0000000..34afbb7
--- /dev/null
+++ b/exercise/templatetags/list_topic_exercises.py
@@ -0,0 +1,25 @@
+from django import template
+from exercise.models import Exercise
+
+register = template.Library()
+
+
+@register.inclusion_tag('exercise/exercise_list.html')
+def list_topic_exercise(request):
+ context = {
+ 'request': request,
+ }
+ context['exercises'] = Exercise.objects.all()
+
+ return context
+
+
+@register.inclusion_tag('exercise/exercise_edit.html')
+def list_topic_exercise_edit(request, exercise):
+ context = {
+ 'request': request,
+ }
+ context['exercises'] = Exercise.objects.all()
+ context['exercise'] = exercise
+
+ return context
diff --git a/exercise/tests.py b/exercise/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/exercise/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/exercise/urls.py b/exercise/urls.py
new file mode 100644
index 0000000..d2ac137
--- /dev/null
+++ b/exercise/urls.py
@@ -0,0 +1,9 @@
+from django.conf.urls import url
+from . import views
+
+urlpatterns = [
+ url(r'^create_exercise/(?P[\w_-]+)/$', views.CreateExercise.as_view(), name='create_exercise'),
+ url(r'^delete_exercise/(?P[\w_-]+)/$', views.DeleteExercise.as_view(), name='delete_exercise'),
+ url(r'^update_exercise/(?P[\w_-]+)/$', views.UpdateExercise.as_view(), name='update_exercise'),
+ url(r'^render-exercise/(?P[0-9]+)/$', views.render_exercise, name='render_exercise'),
+]
diff --git a/exercise/views.py b/exercise/views.py
new file mode 100644
index 0000000..5b26728
--- /dev/null
+++ b/exercise/views.py
@@ -0,0 +1,253 @@
+from .forms import ExerciseForm, UpdateExerciseForm
+from .models import Exercise
+from files.utils import mime_type_to_material_icons
+from core.decorators import log_decorator
+from core.mixins import LogMixin, NotificationMixin
+from core.models import Log, MimeType
+from courses.models import Topic
+from datetime import datetime
+from django.conf import settings
+from django.contrib import messages
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.core.urlresolvers import reverse_lazy
+from django.shortcuts import render, get_object_or_404, redirect
+from django.urls import reverse
+from django.views import generic
+from rolepermissions.mixins import HasRoleMixin
+from rolepermissions.verifications import has_role
+
+
+class CreateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.CreateView):
+ log_component = 'exercise'
+ log_resource = 'exercise'
+ log_action = 'create'
+ log_component = {}
+
+ allowed_roles = ['student']
+ login_url = reverse_lazy("core:home")
+ redirect_field_name = 'next'
+ model = Exercise
+ template_name = 'exercise/create_exercise.html'
+ form_class = ExerciseForm
+ success_url = reverse_lazy('course:exercise:render_exercise')
+
+ log_component = "subject"
+ log_resource = "exercise"
+ log_action = "create"
+ log_context = {}
+ context_object_name = 'form'
+
+ def form_invalid(self, form, **kwargs):
+ context = super(CreateExercise, self).form_invalid(form)
+ context.status_code = 400
+
+ return context
+
+ def form_valid(self, form):
+ self.object = form.save(commit = False)
+ topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
+ self.object.topic = topic
+
+ self.object.name = str(self.object)
+
+
+ # Set MimeType
+ exercise = self.request.FILES['exercise_url']
+ try:
+ if exercise:
+ exercise_type = exercise.content_type
+
+ # Check if exist a mimetype in database
+ try:
+ self.object.exercise_type = MimeType.objects.get(typ = exercise_type)
+ # Create if not
+ except:
+ mtype = MimeType.objects.create(
+ typ = exercise_type,
+ icon = mime_type_to_material_icons[exercise_type]
+ )
+ mtype.save()
+ self.object.exercise_type = mtype
+ except:
+ print('Exercise not uploaded')
+
+ self.object.save()
+ #CREATE LOG
+ self.log_context['topic_id'] = topic.id
+ self.log_context['topic_name'] = topic.name
+ self.log_context['topic_slug'] = topic.slug
+ self.log_context['subject_id'] = topic.subject.id
+ self.log_context['subject_name'] = topic.subject.name
+ self.log_context['subject_slug'] = topic.subject.slug
+
+ super(CreateExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
+
+
+
+ #CREATE NOTIFICATION
+ super(CreateExercise, self).createNotification(message="uploaded a Exercise "+ self.object.name, actor=self.request.user,
+ resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]),
+ users=self.object.topic.subject.students.all())
+
+ self.log_context['exercise_id'] = self.object.id
+ self.log_context['exercise_name'] = self.object.name
+ self.log_context['topic_id'] = self.object.topic.id
+ self.log_context['topic_name'] = self.object.topic.name
+ self.log_context['topic_slug'] = self.object.topic.slug
+ self.log_context['subject_id'] = self.object.topic.subject.id
+ self.log_context['subject_name'] = self.object.topic.subject.name
+ self.log_context['subject_slug'] = self.object.topic.subject.slug
+ self.log_context['course_id'] = self.object.topic.subject.course.id
+ self.log_context['course_name'] = self.object.topic.subject.course.name
+ self.log_context['course_slug'] = self.object.topic.subject.course.slug
+ self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
+ self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
+
+ super(CreateExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
+
+ return self.get_success_url()
+
+ def get_context_data(self, **kwargs):
+ context = super(CreateExercise, self).get_context_data(**kwargs)
+ topic = get_object_or_404(Topic, slug=self.kwargs.get('slug'))
+ context['topic'] = topic
+ context['subject'] = topic.subject
+ context['subjects'] = topic.subject.course.subjects.all()
+ context['form'] = self.form_class
+
+ try:
+ context['latest_exercise'] = Exercise.objects.latest('id')
+ except:
+ pass
+ return context
+
+ def get_success_url(self):
+ self.success_url = redirect('course:exercise:render_exercise', id = self.object.id)
+
+ return self.success_url
+
+
+def render_exercise(request, id):
+ template_name = 'exercise/render_exercise.html'
+ exercise = get_object_or_404(Exercise, id = id)
+
+ context = {
+ 'exercise': exercise
+ }
+
+ log_context = {}
+ log_context['exercise_id'] = exercise.id
+ log_context['exercise_name'] = exercise.name
+ log_context['topic_id'] = exercise.topic.id
+ log_context['topic_name'] = exercise.topic.name
+ log_context['topic_slug'] = exercise.topic.slug
+ log_context['subject_id'] = exercise.topic.subject.id
+ log_context['subject_name'] = exercise.topic.subject.name
+ log_context['subject_slug'] = exercise.topic.subject.slug
+ log_context['course_id'] = exercise.topic.subject.course.id
+ log_context['course_name'] = exercise.topic.subject.course.name
+ log_context['course_slug'] = exercise.topic.subject.course.slug
+ log_context['course_category_id'] = exercise.topic.subject.course.category.id
+ log_context['course_category_name'] = exercise.topic.subject.course.category.name
+
+ request.log_context = log_context
+
+ return render(request, template_name, context)
+
+
+class UpdateExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView):
+ log_component = 'exercise'
+ log_resource = 'exercise'
+ log_action = 'update'
+ log_context = {}
+
+ allowed_roles = ['student']
+ login_url = reverse_lazy("core:home")
+ redirect_field_name = 'next'
+ model = Exercise
+ template_name = 'exercise/update_exercise.html'
+ form_class = UpdateExerciseForm
+ context_object_name = 'exercise'
+ success_url = reverse_lazy('course:exercise:render_exercise')
+
+ def form_invalid(self, form, **kwargs):
+ context = super(UpdateExercise, self).form_invalid(form)
+ context.status_code = 400
+
+ return context
+
+
+ def form_valid(self, form):
+ self.object = form.save()
+
+ self.log_context['exercise_id'] = self.object.id
+ self.log_context['exercise_name'] = self.object.name
+ self.log_context['topic_id'] = self.object.topic.id
+ self.log_context['topic_name'] = self.object.topic.name
+ self.log_context['topic_slug'] = self.object.topic.slug
+ self.log_context['subject_id'] = self.object.topic.subject.id
+ self.log_context['subject_name'] = self.object.topic.subject.name
+ self.log_context['subject_slug'] = self.object.topic.subject.slug
+ self.log_context['course_id'] = self.object.topic.subject.course.id
+ self.log_context['course_name'] = self.object.topic.subject.course.name
+ self.log_context['course_slug'] = self.object.topic.subject.course.slug
+ self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
+ self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
+
+ super(UpdateExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
+
+ return super(UpdateExercise, self).form_valid(form)
+
+ def get_object(self, queryset=None):
+ return get_object_or_404(Exercise, slug = self.kwargs.get('slug'))
+
+ def get_success_url(self):
+ self.success_url = reverse_lazy('course:exercise:render_exercise', args = (self.object.id, ))
+
+ return self.success_url
+
+
+class DeleteExercise(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DeleteView):
+ log_component = 'exercise'
+ log_resource = 'exercise'
+ log_action = 'delete'
+ log_context = {}
+
+ allowed_roles = ['student']
+ login_url = reverse_lazy("core:home")
+ redirect_field_name = 'next'
+ model = Exercise
+ template_name = 'exercise/delete_exercise.html'
+
+ def dispatch(self, *args, **kwargs):
+ exercise = get_object_or_404(Exercise, slug = self.kwargs.get('slug'))
+ if(not (exercise.topic.owner == self.request.user) and not(has_role(self.request.user, 'system_admin')) ):
+ return self.handle_no_permission()
+ return super(DeleteExercise, self).dispatch(*args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ context = super(DeleteExercise, self).get_context_data(**kwargs)
+ context['course'] = self.object.topic.subject.course
+ context['subject'] = self.object.topic.subject
+ context['exercise'] = self.object
+ context["topic"] = self.object.topic
+ return context
+
+ def get_success_url(self):
+ self.log_context['exercise_id'] = self.object.id
+ self.log_context['exercise_name'] = self.object.name
+ self.log_context['topic_id'] = self.object.topic.id
+ self.log_context['topic_name'] = self.object.topic.name
+ self.log_context['topic_slug'] = self.object.topic.slug
+ self.log_context['subject_id'] = self.object.topic.subject.id
+ self.log_context['subject_name'] = self.object.topic.subject.name
+ self.log_context['subject_slug'] = self.object.topic.subject.slug
+ self.log_context['course_id'] = self.object.topic.subject.course.id
+ self.log_context['course_name'] = self.object.topic.subject.course.name
+ self.log_context['course_slug'] = self.object.topic.subject.course.slug
+ self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
+ self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
+
+ super(DeleteExercise, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
+
+ return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug})
\ No newline at end of file
diff --git a/files/migrations/0001_initial.py b/files/migrations/0001_initial.py
index 62ddbc5..7afc54a 100644
--- a/files/migrations/0001_initial.py
+++ b/files/migrations/0001_initial.py
@@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
-from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import files.models
@@ -15,7 +14,6 @@ class Migration(migrations.Migration):
dependencies = [
('courses', '0001_initial'),
('core', '0001_initial'),
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@@ -26,12 +24,11 @@ class Migration(migrations.Migration):
('description', models.TextField(blank=True, verbose_name='Description')),
('file_url', models.FileField(upload_to=files.models.file_path, verbose_name='File')),
('file_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='topic_files', to='core.MimeType', verbose_name='Type file')),
- ('professor', models.ManyToManyField(related_name='file_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors')),
],
options={
+ 'ordering': ('-id',),
'verbose_name': 'File',
'verbose_name_plural': 'Files',
- 'ordering': ('-id',),
},
bases=('courses.material',),
),
diff --git a/files/migrations/0002_topicfile_professor.py b/files/migrations/0002_topicfile_professor.py
new file mode 100644
index 0000000..549ca29
--- /dev/null
+++ b/files/migrations/0002_topicfile_professor.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('files', '0001_initial'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='topicfile',
+ name='professor',
+ field=models.ManyToManyField(related_name='file_professors', to=settings.AUTH_USER_MODEL, verbose_name='Professors'),
+ ),
+ ]
diff --git a/forum/migrations/0001_initial.py b/forum/migrations/0001_initial.py
index 30c7e58..414d9ed 100644
--- a/forum/migrations/0001_initial.py
+++ b/forum/migrations/0001_initial.py
@@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
-from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
@@ -13,7 +12,6 @@ class Migration(migrations.Migration):
dependencies = [
('courses', '0001_initial'),
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@@ -38,8 +36,6 @@ class Migration(migrations.Migration):
('message', models.TextField(verbose_name='Post message')),
('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')),
('post_date', models.DateTimeField(auto_now_add=True, verbose_name='Post Date')),
- ('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')),
],
options={
'verbose_name': 'Post',
@@ -54,7 +50,6 @@ class Migration(migrations.Migration):
('modification_date', models.DateTimeField(auto_now=True, verbose_name='Modification Date')),
('answer_date', models.DateTimeField(auto_now_add=True, verbose_name='Answer Date')),
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Post', verbose_name='Post')),
- ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor')),
],
options={
'verbose_name': 'Post Answer',
diff --git a/forum/migrations/0002_auto_20161114_0144.py b/forum/migrations/0002_auto_20161114_0144.py
new file mode 100644
index 0000000..7f9cea5
--- /dev/null
+++ b/forum/migrations/0002_auto_20161114_0144.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('forum', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='postanswer',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor'),
+ ),
+ migrations.AddField(
+ model_name='post',
+ name='forum',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='forum.Forum', verbose_name='Forum'),
+ ),
+ migrations.AddField(
+ model_name='post',
+ name='user',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Autor'),
+ ),
+ ]
diff --git a/links/migrations/0001_initial.py b/links/migrations/0001_initial.py
index facb49e..548113e 100644
--- a/links/migrations/0001_initial.py
+++ b/links/migrations/0001_initial.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
from django.db import migrations, models
diff --git a/poll/migrations/0001_initial.py b/poll/migrations/0001_initial.py
index 9e03899..e6a24a6 100644
--- a/poll/migrations/0001_initial.py
+++ b/poll/migrations/0001_initial.py
@@ -1,8 +1,7 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:47
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
-from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
@@ -13,7 +12,6 @@ class Migration(migrations.Migration):
dependencies = [
('courses', '0001_initial'),
- migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
@@ -25,9 +23,9 @@ class Migration(migrations.Migration):
('order', models.PositiveSmallIntegerField(verbose_name='Order')),
],
options={
+ 'ordering': ('order',),
'verbose_name': 'Answer',
'verbose_name_plural': 'Answers',
- 'ordering': ('order',),
},
),
migrations.CreateModel(
@@ -59,14 +57,4 @@ class Migration(migrations.Migration):
name='poll',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Poll'),
),
- migrations.AddField(
- model_name='answersstudent',
- name='student',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundent', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
- ),
- migrations.AddField(
- model_name='answer',
- name='poll',
- field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='poll.Poll', verbose_name='Answers'),
- ),
]
diff --git a/poll/migrations/0002_auto_20161114_0144.py b/poll/migrations/0002_auto_20161114_0144.py
new file mode 100644
index 0000000..1e55b06
--- /dev/null
+++ b/poll/migrations/0002_auto_20161114_0144.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-11-14 04:44
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('poll', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='answersstudent',
+ name='student',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundent', to=settings.AUTH_USER_MODEL, verbose_name='Student'),
+ ),
+ migrations.AddField(
+ model_name='answer',
+ name='poll',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='poll.Poll', verbose_name='Answers'),
+ ),
+ ]
diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py
index 0d464b1..17cb67b 100644
--- a/users/migrations/0001_initial.py
+++ b/users/migrations/0001_initial.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Generated by Django 1.10 on 2016-11-13 17:42
+# Generated by Django 1.10 on 2016-11-14 04:44
from __future__ import unicode_literals
import django.contrib.auth.models
@@ -46,8 +46,8 @@ class Migration(migrations.Migration):
('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')),
],
options={
- 'verbose_name_plural': 'Users',
'verbose_name': 'User',
+ 'verbose_name_plural': 'Users',
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
--
libgit2 0.21.2