Commit 7522fcafc2eb15a5fbeca6237ba09e1127173c51

Authored by Matheus Lins
2 parents 36d375c3 b869409b

conflit

app/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 from django.db import migrations, models
... ... @@ -23,7 +24,7 @@ class Migration(migrations.Migration):
23 24 ('username', models.CharField(max_length=30, verbose_name='Email host username')),
24 25 ('password', models.CharField(blank=True, max_length=30, verbose_name='Email host password')),
25 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 29 options={
29 30 'verbose_name': 'Amadeus SMTP setting',
... ...
app/migrations/0002_auto_20161115_2054.py 0 → 100644
... ... @@ -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 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 import autoslug.fields
... ...
core/migrations/0002_auto_20161115_1936.py 0 → 100644
... ... @@ -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 + ]
... ...
courses/context_processors.py
... ... @@ -8,9 +8,6 @@ def courses(request):
8 8 if request.user.is_staff:
9 9 context['courses_list'] = Course.objects.all()
10 10 else:
11   - #context['courses_list'] =
12   - context['courses_list'] = Course.objects.all()
13   -
14   - #context['courses_list'] = Course.objects.filter(professors__in = [request.user])
  11 + context['courses_list'] = Course.objects.filter(professors__in = [request.user])
15 12 return context
16 13 return context
... ...
courses/forms.py
... ... @@ -18,30 +18,64 @@ class CategoryCourseForm(forms.ModelForm):
18 18  
19 19  
20 20 class CourseForm(forms.ModelForm):
21   -
  21 + def clean_end_register_date(self):
  22 + init_register_date = self.cleaned_data['init_register_date']
  23 + end_register_date = self.cleaned_data['end_register_date']
  24 +
  25 + if init_register_date and end_register_date and end_register_date < init_register_date:
  26 + raise forms.ValidationError(_('The end date may not be before the start date.'))
  27 + return end_register_date
  28 +
  29 + def clean_init_date(self):
  30 + end_register_date = self.cleaned_data['end_register_date']
  31 + init_date = self.cleaned_data['init_date']
  32 +
  33 + if end_register_date and init_date and init_date <= end_register_date:
  34 + raise forms.ValidationError(_('The course start date must be after the end of registration.'))
  35 + return init_date
  36 +
  37 + def clean_end_date(self):
  38 + init_date = self.cleaned_data['init_date']
  39 + end_date = self.cleaned_data['end_date']
  40 +
  41 + if init_date and end_date and end_date < init_date:
  42 + raise forms.ValidationError(_('The end date may not be before the start date.'))
  43 + return end_date
22 44  
23 45  
24 46 class Meta:
25 47 model = Course
26   - fields = ('name', 'description',
27   - 'category', 'coordenator','public')
  48 + fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date',
  49 + 'init_date', 'end_date', 'category', 'coordenator','public')
28 50 labels = {
29 51 'name': _('Name'),
  52 + 'objectivies': _('Objectives'),
30 53 'content': _('Content'),
  54 + 'max_students': _('Number of studets maximum'),
  55 + 'init_register_date': _('Course registration start date'),
  56 + 'end_register_date': _('Course registration end date'),
  57 + 'init_date': _('Course start date'),
  58 + 'end_date': _('Course end date'),
31 59 'category': _('Category'),
32 60 'coordenator': _('Coordenator'),
33 61 'public':_('Public'),
34 62 }
35 63 help_texts = {
36 64 'name': _('Course name'),
  65 + 'objectivies': _('Course objective'),
37 66 'content': _('Course modules'),
  67 + 'max_students': _('Max number of students that a class can have'),
  68 + 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),
  69 + 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),
  70 + 'init_date': _('Date that the course starts (dd/mm/yyyy)'),
  71 + 'end_date': _('Date that the course ends (dd/mm/yyyy)'),
38 72 'category': _('CourseCategory which the course belongs'),
39 73 'coordenator': _('Course Coordenator'),
40 74 'public':_('To define if the course can be accessed by people not registered'),
41 75 }
42 76  
43 77 widgets = {
44   - 'category': forms.Select(),
  78 + 'ategoy': forms.Select(),
45 79 'coordenator': forms.Select(),
46 80 'content': SummernoteWidget(),
47 81 'objectivies': SummernoteWidget(),
... ... @@ -49,31 +83,70 @@ class CourseForm(forms.ModelForm):
49 83  
50 84 class UpdateCourseForm(CourseForm):
51 85  
  86 + def clean_end_register_date(self):
  87 + init_register_date = self.cleaned_data['init_register_date']
  88 + end_register_date = self.cleaned_data['end_register_date']
  89 +
  90 + if init_register_date and end_register_date and end_register_date < init_register_date:
  91 + raise forms.ValidationError(_('The end date may not be before the start date.'))
  92 + return end_register_date
  93 +
  94 + def clean_init_date(self):
  95 + end_register_date = self.cleaned_data['end_register_date']
  96 + init_date = self.cleaned_data['init_date']
  97 +
  98 + if end_register_date and init_date and init_date <= end_register_date:
  99 + raise forms.ValidationError(_('The course start date must be after the end of registration.'))
  100 + return init_date
  101 +
  102 + def clean_end_date(self):
  103 + init_date = self.cleaned_data['init_date']
  104 + end_date = self.cleaned_data['end_date']
  105 +
  106 + if init_date and end_date and end_date < init_date:
  107 + raise forms.ValidationError(_('The end date may not be before the start date.'))
  108 + return end_date
  109 +
52 110 def __init__(self, *args, **kwargs):
53 111 super(UpdateCourseForm, self).__init__(*args, **kwargs)
  112 + self.fields["students"].required = False
54 113  
55 114 class Meta:
56 115 model = Course
57   - fields = ('name', 'description',
58   - 'category', 'coordenator','public')
  116 + fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date',
  117 + 'init_date', 'end_date', 'category','students', 'coordenator','public')
59 118 labels = {
60 119 'name': _('Name'),
61   - 'description': _('Description'),
  120 + 'objectivies': _('Objectives'),
  121 + 'content': _('Content'),
  122 + 'max_students': _('Number of studets maximum'),
  123 + 'init_register_date': _('Course registration start date'),
  124 + 'end_register_date': _('Course registration end date'),
  125 + 'init_date': _('Course start date'),
  126 + 'end_date': _('Course end date'),
62 127 'category': _('Category'),
63 128 'coordenator': _('Coordenator'),
  129 + 'students': _('Student'),
64 130 'public':_('Public'),
65 131 }
66 132 help_texts = {
67 133 'name': _('Course name'),
68   - 'description': _('Description about the course'),
  134 + 'objectivies': _('Course objective'),
  135 + 'content': _('Course modules'),
  136 + 'max_students': _('Max number of students that a class can have'),
  137 + 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),
  138 + 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),
  139 + 'init_date': _('Date that the course starts (dd/mm/yyyy)'),
  140 + 'end_date': _('Date that the course ends (dd/mm/yyyy)'),
69 141 'category': _('CourseCategory which the course belongs'),
70 142 'coordenator': _('Course Coordenator'),
  143 + 'students': _("Course's Students"),
71 144 'public':_('To define if the course can be accessed by people not registered'),
72 145 }
73 146 widgets = {
74   - 'category': forms.Select(),
  147 + 'categoy': forms.Select(),
75 148 'coordenator': forms.Select(),
76   - 'description': SummernoteWidget(),
  149 + 'content': SummernoteWidget(),
77 150 'objectivies': SummernoteWidget(),
78 151 }
79 152  
... ...
courses/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 import autoslug.fields
... ... @@ -57,13 +58,20 @@ class Migration(migrations.Migration):
57 58 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
58 59 ('name', models.CharField(max_length=100, verbose_name='Name')),
59 60 ('slug', autoslug.fields.AutoSlugField(editable=False, populate_from='name', unique=True, verbose_name='Slug')),
60   - ('description', models.TextField(blank=True, verbose_name='Content')),
  61 + ('objectivies', models.TextField(blank=True, verbose_name='Objectivies')),
  62 + ('content', models.TextField(blank=True, verbose_name='Content')),
  63 + ('max_students', models.PositiveIntegerField(blank=True, verbose_name='Maximum Students')),
  64 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Creation Date')),
  65 + ('init_register_date', models.DateField(verbose_name='Register Date (Begin)')),
  66 + ('end_register_date', models.DateField(verbose_name='Register Date (End)')),
  67 + ('init_date', models.DateField(verbose_name='Begin of Course Date')),
  68 + ('end_date', models.DateField(verbose_name='End of Course Date')),
61 69 ('public', models.BooleanField(default=False, verbose_name='Public')),
62 70 ],
63 71 options={
64 72 'verbose_name': 'Course',
65   - 'ordering': ('name',),
66 73 'verbose_name_plural': 'Courses',
  74 + 'ordering': ('create_date', 'name'),
67 75 },
68 76 ),
69 77 migrations.CreateModel(
... ... @@ -121,8 +129,8 @@ class Migration(migrations.Migration):
121 129 ],
122 130 options={
123 131 'verbose_name': 'Subject',
124   - 'ordering': ('create_date', 'name'),
125 132 'verbose_name_plural': 'Subjects',
  133 + 'ordering': ('create_date', 'name'),
126 134 },
127 135 ),
128 136 migrations.CreateModel(
... ... @@ -153,8 +161,8 @@ class Migration(migrations.Migration):
153 161 ],
154 162 options={
155 163 'verbose_name': 'Topic',
156   - 'ordering': ('create_date', 'name'),
157 164 'verbose_name_plural': 'Topics',
  165 + 'ordering': ('create_date', 'name'),
158 166 },
159 167 ),
160 168 ]
... ...
courses/migrations/0002_auto_20161115_1936.py 0 → 100644
... ... @@ -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/models.py
... ... @@ -38,13 +38,22 @@ class Course(models.Model):
38 38  
39 39 name = models.CharField(_('Name'), max_length = 100)
40 40 slug = AutoSlugField(_("Slug"),populate_from='name',unique=True)
41   - description = models.TextField(_('Content'), blank = True)
  41 + objectivies = models.TextField(_('Objectivies'), blank = True)
  42 + content = models.TextField(_('Content'), blank = True)
  43 + max_students = models.PositiveIntegerField(_('Maximum Students'), blank = True)
  44 + create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True)
  45 + init_register_date = models.DateField(_('Register Date (Begin)'))
  46 + end_register_date = models.DateField(_('Register Date (End)'))
  47 + init_date = models.DateField(_('Begin of Course Date'))
  48 + end_date = models.DateField(_('End of Course Date'))
42 49 category = models.ForeignKey(CourseCategory, verbose_name = _('Category'), related_name='course_category')
43 50 coordenator = models.ForeignKey(User, verbose_name = _('Coordenator'), related_name ='course_coordenator', null = True)
  51 + professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses_professors')
  52 + students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student', blank = True)
44 53 public = models.BooleanField(_('Public'), default=False)
45 54  
46 55 class Meta:
47   - ordering = ('name',)
  56 + ordering = ('create_date','name')
48 57 verbose_name = _('Course')
49 58 verbose_name_plural = _('Courses')
50 59  
... ...
courses/permissions.py
... ... @@ -6,10 +6,10 @@ def view_topic(role, user, topic):
6 6 if (role == SystemAdmin):
7 7 return True
8 8  
9   - if user in topic.subject.professors.all():
  9 + if (user in topic.subject.course.professors.all() and user in topic.subject.professors.all()):
10 10 return True
11 11  
12   - if user in topic.subject.students.all():
  12 + if (user in topic.subject.course.students.all() and user in topic.subject.students.all()):
13 13 return True
14 14  
15 15 return False
... ... @@ -29,10 +29,10 @@ def view_subject(role, user, subject):
29 29 if (role == SystemAdmin):
30 30 return True
31 31  
32   - if user in subject.professors.all():
  32 + if (user in subject.course.professors.all() and user in subject.professors.all()):
33 33 return True
34 34  
35   - if user in subject.students.all():
  35 + if (user in subject.course.students.all() and user in subject.students.all()):
36 36 return True
37 37  
38 38 return False
... ...
courses/templates/course/course_card.html
... ... @@ -35,14 +35,21 @@
35 35 <div class="panel-body">
36 36 <p><b>{% trans 'Course Name' %}: </b>{{course.name}}</p>
37 37 <p><b>{% trans 'Coordenator' %}: </b>{{course.coordenator}}</p>
38   -
  38 + <p><b>{% trans 'Professor' %}: </b>{{course.professors.all.0}}</p>
39 39 <p>
40 40 <b>{% trans 'Description' %}:</b>
41 41 <i>
42   - {{course.description | safe }}
  42 + {{course.content | safe }}
43 43 </i>
44 44 </p>
45   -
  45 + <div class="row">
  46 + <div class="col-xs-6 col-md-6 data_register_course">
  47 + <p><b>{% trans 'Init register' %}: </b>{{course.init_register_date}}</p>
  48 + </div>
  49 + <div class="col-xs-6 col-md-6 data_register_course">
  50 + <p><b>{% trans 'End register' %}: </b>{{course.end_register_date}}</p>
  51 + </div>
  52 + </div>
46 53 </div>
47 54 </div>
48 55 </div>
... ... @@ -52,7 +59,7 @@
52 59 <div class="modal-dialog" role="document">
53 60 <div class="modal-content">
54 61 <div class="modal-header">
55   - <h4 class="modal-title">{% trans 'Replicate Course' %}</h4>
  62 + <h4 class="modal-title">{% trans 'Repicate Course' %}</h4>
56 63 </div>
57 64 <div class="modal-body">
58 65 <section>
... ...
courses/templates/course/index.html
... ... @@ -52,9 +52,9 @@
52 52 </div>
53 53 <div id="{{category.slug}}" class="panel-collapse collapse">
54 54 {% for course in category.course_category %}
55   -
56   - {% include "course/course_card.html" %}
57   -
  55 + {# {% if user in course.students.all or user in course.professors.all or user|has_role:'system_admin' %}#}
  56 + {% include "course/course_card.html" %}
  57 + {# {% endif %}#}
58 58 {% endfor %}
59 59 </div>
60 60 </div>
... ...
courses/templates/course/view.html
... ... @@ -48,13 +48,21 @@
48 48 </div>
49 49 <div class="panel-body">
50 50 <p><b>{% trans 'Coordinator' %}: </b>{{course.coordenator}}</p>
  51 + <p><b>{% trans 'Teacher' %}: </b>{{course.professors.all.0}}</p>
51 52 <p>
52 53 <b>{% trans 'Description' %}:</b>
53 54 <i>
54   - {{ course.description |safe }}
  55 + {{ course.objectivies |safe }}
55 56 </i>
56 57 </p>
57   -
  58 + <div class="row">
  59 + <div class="col-xs-6 col-md-6 data_register_course">
  60 + <p><b>{% trans 'Begin of Course Date' %}: </b>{{course.init_date}}</p>
  61 + </div>
  62 + <div class="col-xs-6 col-md-6 data_register_course">
  63 + <p><b>{% trans 'End of Course Date' %}: </b>{{course.end_date}}</p>
  64 + </div>
  65 + </div>
58 66 </div>
59 67 </div>
60 68  
... ...
courses/templatetags/course_value_field.py
... ... @@ -11,12 +11,28 @@ def value_field(course, field):
11 11 value = ""
12 12 if field == 'name':
13 13 value = course.name
  14 + elif field == 'objectivies':
  15 + value = course.objectivies
14 16 elif field == 'content':
15 17 value = course.content
  18 + elif field == 'max_students':
  19 + value = course.max_students
  20 + elif field == 'init_register_date':
  21 + value = course.init_register_date
  22 + elif field == 'end_register_date':
  23 + value = course.end_register_date
  24 + elif field == 'init_date':
  25 + value = course.init_date
  26 + elif field == 'end_date':
  27 + value = course.end_date
16 28 elif field == 'coordenator':
17 29 value = course.coordenator
18 30 elif field == 'category':
19 31 value = course.category
  32 + elif field == 'professors':
  33 + value = course.professors.all()
  34 + elif field == 'students':
  35 + value = course.students.all()
20 36 elif field == 'public':
21 37 value = course.public
22 38  
... ...
courses/templatetags/custom_filters.py
... ... @@ -8,8 +8,9 @@ def hide_subscribe_view_btn(user, subject):
8 8 if not user is None:
9 9 if user.is_authenticated:
10 10 if has_role(user, 'student') and not user.is_staff:
11   - if user in subject.students.all():
12   - return True
  11 + if user in subject.course.students.all():
  12 + if not user in subject.students.all():
  13 + return True
13 14 else:
14 15 return True
15 16  
... ... @@ -20,7 +21,7 @@ def show_subject_subscribe(user, subject):
20 21 if not user is None:
21 22 if user.is_authenticated:
22 23 if has_role(user, 'student') and not user.is_staff:
23   - if not user in subject.students.all() and subject.show_subscribe:
  24 + if not user in subject.students.all() and user in subject.course.students.all() and subject.show_subscribe:
24 25 return True
25 26  
26 27 return False
... ...
courses/views.py
... ... @@ -56,7 +56,7 @@ def course_category(list_courses):
56 56 if (cat):
57 57 categorys_courses.append(cat)
58 58  
59   - return categorys_courses
  59 + return sorted(list(categorys_courses),key = lambda x:x.name)
60 60  
61 61 class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView):
62 62  
... ... @@ -91,9 +91,13 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView):
91 91 list_courses = None
92 92 if has_role(self.request.user,'system_admin'):
93 93 list_courses = self.get_queryset().order_by('name')
94   - else:
95   - list_courses = self.get_queryset().all()
96   -
  94 + # categorys_courses = CourseCategory.objects.all()
  95 + elif has_role(self.request.user,'professor'):
  96 + list_courses = self.get_queryset().filter(professors__in = [self.request.user]).order_by('name')
  97 + # categorys_courses = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct()
  98 + elif has_role(self.request.user, 'student'):
  99 + list_courses = self.get_queryset().filter(students__in = [self.request.user]).order_by('name')
  100 +
97 101 context['categorys_courses'] = course_category(list_courses)
98 102 return context
99 103  
... ... @@ -132,6 +136,7 @@ class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView):
132 136 list_courses = self.get_queryset()
133 137  
134 138 context['categorys_courses'] = course_category(list_courses)
  139 +
135 140 return context
136 141  
137 142 class CreateCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView):
... ... @@ -357,6 +362,10 @@ class CourseView(LogMixin, NotificationMixin, generic.DetailView):
357 362  
358 363 if has_role(self.request.user,'system_admin'):
359 364 courses = Course.objects.all()
  365 + elif has_role(self.request.user,'professor'):
  366 + courses = self.request.user.courses_professors.all()
  367 + elif has_role(self.request.user, 'student'):
  368 + courses = self.request.user.courses_student.all()
360 369 else:
361 370 courses = Course.objects.filter(public = True)
362 371  
... ... @@ -673,7 +682,7 @@ class CreateTopicView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMi
673 682 action = super(CreateTopicView, self).createorRetrieveAction("create Topic")
674 683 super(CreateTopicView, self).createNotification("Topic "+ self.object.name + " was created",
675 684 resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]),
676   - actor=self.request.user, users = self.object.subject.students.all() )
  685 + actor=self.request.user, users = self.object.subject.course.students.all() )
677 686  
678 687 self.log_context['topic_id'] = self.object.id
679 688 self.log_context['topic_name'] = self.object.name
... ... @@ -777,7 +786,7 @@ class CreateSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, Notification
777 786 self.object.professors.add(self.request.user)
778 787 if self.object.visible:
779 788 super(CreateSubjectView, self).createNotification( " created subject " + self.object.name, resource_name=self.object.name,
780   - resource_slug = self.object.slug, actor=self.request.user,
  789 + resource_slug = self.object.slug, actor=self.request.user, users= self.object.course.students.all(),
781 790 resource_link = reverse('course:view_subject', args=[self.object.slug]))
782 791  
783 792 self.log_context['subject_id'] = self.object.id
... ... @@ -890,7 +899,7 @@ class DeleteSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.Dele
890 899 def subscribe_subject(request, slug):
891 900 subject = get_object_or_404(Subject, slug = slug)
892 901  
893   - if request.user not in subject.students.all():
  902 + if request.user in subject.course.students.all():
894 903 subject.students.add(request.user)
895 904  
896 905 if request.user in subject.students.all():
... ... @@ -1017,7 +1026,7 @@ class ReplicateTopicView (LoginRequiredMixin, HasRoleMixin, LogMixin, Notificati
1017 1026 action = super(ReplicateTopicView, self).createorRetrieveAction("create Topic")
1018 1027 super(ReplicateTopicView, self).createNotification("Topic "+ self.object.name + " was created",
1019 1028 resource_name=self.object.name, resource_link= reverse('course:view_topic',args=[self.object.slug]),
1020   - actor=self.request.user, users = self.object.subject.students.all() )
  1029 + actor=self.request.user, users = self.object.subject.course.students.all() )
1021 1030  
1022 1031 self.log_context['topic_id'] = self.object.id
1023 1032 self.log_context['topic_name'] = self.object.name
... ... @@ -1071,7 +1080,7 @@ class ReplicateSubjectView(LoginRequiredMixin, HasRoleMixin, LogMixin, Notificat
1071 1080 self.object.professors.add(self.request.user)
1072 1081 if self.object.visible:
1073 1082 super(ReplicateSubjectView, self).createNotification( " created subject " + self.object.name, resource_name=self.object.name,
1074   - resource_slug = self.object.slug, actor=self.request.user, users= self.object.students.all(),
  1083 + resource_slug = self.object.slug, actor=self.request.user, users= self.object.course.students.all(),
1075 1084 resource_link = reverse('course:view_subject', args=[self.object.slug]))
1076 1085  
1077 1086 self.log_context['subject_id'] = self.object.id
... ...
exam/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 from django.db import migrations, models
... ... @@ -26,6 +27,7 @@ class Migration(migrations.Migration):
26 27 'verbose_name': 'Answer',
27 28 'ordering': ('order',),
28 29 'verbose_name_plural': 'Answers',
  30 + 'ordering': ('order',),
29 31 },
30 32 ),
31 33 migrations.CreateModel(
... ...
exam/migrations/0002_auto_20161115_1936.py 0 → 100644
... ... @@ -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 + ]
... ...
exercise/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
  2 +<<<<<<< HEAD
2 3 # Generated by Django 1.10 on 2016-11-17 04:25
  4 +=======
  5 +
  6 +# Generated by Django 1.10 on 2016-11-15 22:36
  7 +>>>>>>> b869409bd7972f90e6cd67f9456afc8a04b9fce3
3 8 from __future__ import unicode_literals
4 9  
5 10 from decimal import Decimal
... ...
files/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
3 3 from __future__ import unicode_literals
4 4  
5 5 from django.db import migrations, models
... ... @@ -27,8 +27,9 @@ class Migration(migrations.Migration):
27 27 ],
28 28 options={
29 29 'verbose_name': 'File',
30   - 'ordering': ('-id',),
  30 +
31 31 'verbose_name_plural': 'Files',
  32 + 'ordering': ('-id',),
32 33 },
33 34 bases=('courses.material',),
34 35 ),
... ...
files/migrations/0002_topicfile_professor.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 from django.conf import settings
... ...
forum/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 from django.db import migrations, models
... ...
forum/migrations/0002_auto_20161115_1936.py 0 → 100644
... ... @@ -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 + ]
... ...
links/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +# Generated by Django 1.10 on 2016-11-15 22:36
3 3 from __future__ import unicode_literals
4 4  
5 5 from django.db import migrations, models
... ...
poll/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 from django.db import migrations, models
... ...
poll/migrations/0002_auto_20161115_1936.py 0 → 100644
... ... @@ -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 + ]
... ...
users/migrations/0001_initial.py
1 1 # -*- coding: utf-8 -*-
2   -# Generated by Django 1.10 on 2016-11-17 03:09
  2 +
  3 +# Generated by Django 1.10 on 2016-11-15 22:36
3 4 from __future__ import unicode_literals
4 5  
5 6 import django.contrib.auth.models
... ... @@ -30,14 +31,14 @@ class Migration(migrations.Migration):
30 31 ('city', models.CharField(blank=True, max_length=90, verbose_name='City')),
31 32 ('state', models.CharField(blank=True, max_length=30, verbose_name='State')),
32 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 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 38 ('type_profile', models.IntegerField(blank=True, choices=[(1, 'Professor'), (2, 'Student')], default=2, null=True, verbose_name='Type')),
38 39 ('titration', models.CharField(blank=True, max_length=50, null=True, verbose_name='Titration')),
39 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 42 ('curriculum', models.FileField(blank=True, null=True, upload_to='users/curriculum/', verbose_name='Curriculum')),
42 43 ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')),
43 44 ('is_staff', models.BooleanField(default=False, verbose_name='Administrador')),
... ...
users/migrations/0002_auto_20161115_1941.py 0 → 100644
... ... @@ -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 @@
  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 + ]
... ...