Commit f909c05997fff46583d9d75f92af0305e6cf8192
Exists in
master
and in
5 other branches
Merge
Showing
6 changed files
with
85 additions
and
27 deletions
Show diff stats
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-10-20 21:08 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.conf import settings | ||
6 | +from django.db import migrations, models | ||
7 | + | ||
8 | + | ||
9 | +class Migration(migrations.Migration): | ||
10 | + | ||
11 | + dependencies = [ | ||
12 | + ('courses', '0003_course_public'), | ||
13 | + ] | ||
14 | + | ||
15 | + operations = [ | ||
16 | + migrations.AlterField( | ||
17 | + model_name='course', | ||
18 | + name='students', | ||
19 | + field=models.ManyToManyField(blank=True, related_name='courses_student', to=settings.AUTH_USER_MODEL, verbose_name='Students'), | ||
20 | + ), | ||
21 | + ] |
courses/models.py
@@ -45,7 +45,7 @@ class Course(models.Model): | @@ -45,7 +45,7 @@ class Course(models.Model): | ||
45 | image = models.ImageField(verbose_name = _('Image'), blank = True, upload_to = 'courses/') | 45 | image = models.ImageField(verbose_name = _('Image'), blank = True, upload_to = 'courses/') |
46 | category = models.ForeignKey(CourseCategory, verbose_name = _('Category'), related_name='course_category') | 46 | category = models.ForeignKey(CourseCategory, verbose_name = _('Category'), related_name='course_category') |
47 | professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses_professors') | 47 | professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='courses_professors') |
48 | - students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student') | 48 | + students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='courses_student', blank = True) |
49 | public = models.BooleanField(_('Public')) | 49 | public = models.BooleanField(_('Public')) |
50 | 50 | ||
51 | class Meta: | 51 | class Meta: |
@@ -69,8 +69,7 @@ class Subject(models.Model): | @@ -69,8 +69,7 @@ class Subject(models.Model): | ||
69 | course = models.ForeignKey(Course, verbose_name = _('Course'), related_name="subjects") | 69 | course = models.ForeignKey(Course, verbose_name = _('Course'), related_name="subjects") |
70 | category = models.ForeignKey(CategorySubject, verbose_name = _('Category'), related_name='subject_category',null=True) | 70 | category = models.ForeignKey(CategorySubject, verbose_name = _('Category'), related_name='subject_category',null=True) |
71 | professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='professors_subjects') | 71 | professors = models.ManyToManyField(User,verbose_name=_('Professors'), related_name='professors_subjects') |
72 | - students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='subject_student') | ||
73 | - | 72 | + students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='subject_student', blank = True) |
74 | 73 | ||
75 | class Meta: | 74 | class Meta: |
76 | ordering = ('create_date','name') | 75 | ordering = ('create_date','name') |
courses/templates/course/view.html
@@ -28,7 +28,7 @@ | @@ -28,7 +28,7 @@ | ||
28 | </div> | 28 | </div> |
29 | </div> | 29 | </div> |
30 | 30 | ||
31 | -{% if user|has_role:'professor' or user|has_role:'system_admin' %} | 31 | +{% if user|has_role:'professor' and user in course.professors or user|has_role:'system_admin' %} |
32 | 32 | ||
33 | <div class="panel panel-primary navigation"> | 33 | <div class="panel panel-primary navigation"> |
34 | <div class="panel-heading"> | 34 | <div class="panel-heading"> |
@@ -56,7 +56,7 @@ | @@ -56,7 +56,7 @@ | ||
56 | <div class="col-xs-8 col-md-10 titleTopic"> | 56 | <div class="col-xs-8 col-md-10 titleTopic"> |
57 | <h4>{{course}}</h4> | 57 | <h4>{{course}}</h4> |
58 | </div> | 58 | </div> |
59 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | 59 | + {% if user|has_role:'professor' and user in course.professors or user|has_role:'system_admin' %} |
60 | <div class="col-xs-4 col-md-2" id="divMoreActions"> | 60 | <div class="col-xs-4 col-md-2" id="divMoreActions"> |
61 | <div class="btn-group"> | 61 | <div class="btn-group"> |
62 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 62 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
@@ -199,17 +199,19 @@ | @@ -199,17 +199,19 @@ | ||
199 | <h4 style="color:white">{{subject.name}}</h4> | 199 | <h4 style="color:white">{{subject.name}}</h4> |
200 | </a> | 200 | </a> |
201 | </div> | 201 | </div> |
202 | - <div class="col-xs-3 col-md-2" id="divMoreActions"> | ||
203 | - <div class="btn-group"> | ||
204 | - <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
205 | - <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
206 | - </button> | ||
207 | - <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
208 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal3"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
209 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeSubject2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
210 | - </ul> | 202 | + {% if user|has_role:'professor' and user in subject.professors or user|has_role:'system_admin' %} |
203 | + <div class="col-xs-3 col-md-2" id="divMoreActions"> | ||
204 | + <div class="btn-group"> | ||
205 | + <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
206 | + <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
207 | + </button> | ||
208 | + <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
209 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal3"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
210 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeSubject2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
211 | + </ul> | ||
212 | + </div> | ||
211 | </div> | 213 | </div> |
212 | - </div> | 214 | + {% endif %} |
213 | </div> | 215 | </div> |
214 | </div> | 216 | </div> |
215 | <div class="panel-body"> | 217 | <div class="panel-body"> |
@@ -244,17 +246,19 @@ | @@ -244,17 +246,19 @@ | ||
244 | <h4 style="color:white">{{subject.name}}</h4> | 246 | <h4 style="color:white">{{subject.name}}</h4> |
245 | </a> | 247 | </a> |
246 | </div> | 248 | </div> |
247 | - <div class="col-xs-3 col-md-2" id="divMoreActions"> | ||
248 | - <div class="btn-group"> | ||
249 | - <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
250 | - <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
251 | - </button> | ||
252 | - <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
253 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal3"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
254 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeSubject2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
255 | - </ul> | 249 | + {% if user|has_role:'professor' and user in subject.professors or user|has_role:'system_admin' %} |
250 | + <div class="col-xs-3 col-md-2" id="divMoreActions"> | ||
251 | + <div class="btn-group"> | ||
252 | + <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
253 | + <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
254 | + </button> | ||
255 | + <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
256 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal3"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
257 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeSubject2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
258 | + </ul> | ||
259 | + </div> | ||
256 | </div> | 260 | </div> |
257 | - </div> | 261 | + {% endif %} |
258 | </div> | 262 | </div> |
259 | </div> | 263 | </div> |
260 | <div class="panel-body"> | 264 | <div class="panel-body"> |
@@ -281,7 +285,7 @@ | @@ -281,7 +285,7 @@ | ||
281 | {% endfor %} | 285 | {% endfor %} |
282 | {% endif %} | 286 | {% endif %} |
283 | 287 | ||
284 | -{% if user|has_role:'professor' or user|has_role:'system_admin' %} | 288 | +{% if user|has_role:'professor' and user in course.professors or user|has_role:'system_admin' %} |
285 | 289 | ||
286 | <div class="form-group"> | 290 | <div class="form-group"> |
287 | <a href="{% url 'course:create_subject' course.slug %}" data-toggle="modal" data-target="" class="btn btn-primary btn-lg btn-block btn-raised">{% trans 'Create Subject' %}<div class="ripple-container"></div></a> | 291 | <a href="{% url 'course:create_subject' course.slug %}" data-toggle="modal" data-target="" class="btn btn-primary btn-lg btn-block btn-raised">{% trans 'Create Subject' %}<div class="ripple-container"></div></a> |
courses/views.py
@@ -187,7 +187,7 @@ class CourseView(LoginRequiredMixin, NotificationMixin, generic.DetailView): | @@ -187,7 +187,7 @@ class CourseView(LoginRequiredMixin, NotificationMixin, generic.DetailView): | ||
187 | if has_role(self.request.user,'system_admin'): | 187 | if has_role(self.request.user,'system_admin'): |
188 | courses = Course.objects.all() | 188 | courses = Course.objects.all() |
189 | elif has_role(self.request.user,'professor'): | 189 | elif has_role(self.request.user,'professor'): |
190 | - courses = self.request.user.courses.all() | 190 | + courses = self.request.user.courses_professors.all() |
191 | elif has_role(self.request.user, 'student'): | 191 | elif has_role(self.request.user, 'student'): |
192 | courses = self.request.user.courses_student.all() | 192 | courses = self.request.user.courses_student.all() |
193 | 193 |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-10-20 21:08 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.conf import settings | ||
6 | +from django.db import migrations, models | ||
7 | +import django.db.models.deletion | ||
8 | + | ||
9 | + | ||
10 | +class Migration(migrations.Migration): | ||
11 | + | ||
12 | + dependencies = [ | ||
13 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
14 | + ('exam', '0001_initial'), | ||
15 | + ] | ||
16 | + | ||
17 | + operations = [ | ||
18 | + migrations.CreateModel( | ||
19 | + name='AnswersStudent', | ||
20 | + fields=[ | ||
21 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
22 | + ('status', models.BooleanField(default=False, verbose_name='Answered')), | ||
23 | + ('answered_in', models.DateTimeField(auto_now=True, verbose_name='Answered Date')), | ||
24 | + ('answer', models.ManyToManyField(related_name='student_answer', to='exam.Answer', verbose_name='Answers Students')), | ||
25 | + ('exam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_exam', to='exam.Exam', verbose_name='Exam')), | ||
26 | + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student', to=settings.AUTH_USER_MODEL, verbose_name='Student')), | ||
27 | + ], | ||
28 | + options={ | ||
29 | + 'verbose_name': 'Answer Stundent', | ||
30 | + 'verbose_name_plural': 'Answers Student', | ||
31 | + }, | ||
32 | + ), | ||
33 | + ] |
users/admin.py
@@ -5,5 +5,6 @@ from .forms import AdminUserForm | @@ -5,5 +5,6 @@ from .forms import AdminUserForm | ||
5 | class UserAdmin(admin.ModelAdmin): | 5 | class UserAdmin(admin.ModelAdmin): |
6 | list_display = ['username', 'name', 'email', 'is_staff', 'is_active'] | 6 | list_display = ['username', 'name', 'email', 'is_staff', 'is_active'] |
7 | search_fields = ['username', 'name', 'email'] | 7 | search_fields = ['username', 'name', 'email'] |
8 | + form = AdminUserForm | ||
8 | 9 | ||
9 | admin.site.register(User, UserAdmin) | 10 | admin.site.register(User, UserAdmin) |