Commit d2acecc921f37ef978f550602103d48dcc257ab8
1 parent
fdd2a50b
Exists in
master
and in
5 other branches
Resolving url permissions [Issues: #192 & #195]
Showing
4 changed files
with
58 additions
and
2 deletions
Show diff stats
courses/permissions.py
@@ -2,6 +2,19 @@ from rolepermissions.permissions import register_object_checker | @@ -2,6 +2,19 @@ from rolepermissions.permissions import register_object_checker | ||
2 | from amadeus.roles import SystemAdmin | 2 | from amadeus.roles import SystemAdmin |
3 | 3 | ||
4 | @register_object_checker() | 4 | @register_object_checker() |
5 | +def view_topic(role, user, topic): | ||
6 | + if (role == SystemAdmin): | ||
7 | + return True | ||
8 | + | ||
9 | + if (user in topic.subject.course.professors.all() and user in topic.subject.professors.all()): | ||
10 | + return True | ||
11 | + | ||
12 | + if (user in topic.subject.course.students.all() and user in topic.subject.students.all()): | ||
13 | + return True | ||
14 | + | ||
15 | + return False | ||
16 | + | ||
17 | +@register_object_checker() | ||
5 | def edit_topic(role, user, topic): | 18 | def edit_topic(role, user, topic): |
6 | if (role == SystemAdmin): | 19 | if (role == SystemAdmin): |
7 | return True | 20 | return True |
@@ -12,6 +25,19 @@ def edit_topic(role, user, topic): | @@ -12,6 +25,19 @@ def edit_topic(role, user, topic): | ||
12 | return False | 25 | return False |
13 | 26 | ||
14 | @register_object_checker() | 27 | @register_object_checker() |
28 | +def view_subject(role, user, subject): | ||
29 | + if (role == SystemAdmin): | ||
30 | + return True | ||
31 | + | ||
32 | + if (user in subject.course.professors.all() and user in subject.professors.all()): | ||
33 | + return True | ||
34 | + | ||
35 | + if (user in subject.course.students.all() and user in subject.students.all()): | ||
36 | + return True | ||
37 | + | ||
38 | + return False | ||
39 | + | ||
40 | +@register_object_checker() | ||
15 | def edit_subject(role, user, subject): | 41 | def edit_subject(role, user, subject): |
16 | if (role == SystemAdmin): | 42 | if (role == SystemAdmin): |
17 | return True | 43 | return True |
courses/templates/course/view.html
@@ -157,7 +157,7 @@ | @@ -157,7 +157,7 @@ | ||
157 | <p><b>{% trans "End" %}: </b>{{subject.end_date}}</p> | 157 | <p><b>{% trans "End" %}: </b>{{subject.end_date}}</p> |
158 | </div> | 158 | </div> |
159 | </div> | 159 | </div> |
160 | - <a href="{% url 'course:view_subject' subject.slug %}" class="btn btn-raised btn-default center-block view_btn" {% if user|show_subject_subscribe:subject %}style="display:none"{% endif %}>{% trans 'View Subject' %}<div class="ripple-container"></div></a> | 160 | + <a href="{% url 'course:view_subject' subject.slug %}" class="btn btn-raised btn-default center-block view_btn" {% if user|hide_subscribe_view_btn:subject %}style="display:none"{% endif %}>{% trans 'View Subject' %}<div class="ripple-container"></div></a> |
161 | </div> | 161 | </div> |
162 | </div> | 162 | </div> |
163 | {% endfor %} | 163 | {% endfor %} |
@@ -209,7 +209,7 @@ | @@ -209,7 +209,7 @@ | ||
209 | <p><b>{% trans "End" %}: </b>{{subject.end_date}}</p> | 209 | <p><b>{% trans "End" %}: </b>{{subject.end_date}}</p> |
210 | </div> | 210 | </div> |
211 | </div> | 211 | </div> |
212 | - <a href="{% url 'course:view_subject' subject.slug %}" class="btn btn-raised btn-default center-block view_btn" {% if user|show_subject_subscribe:subject %}style="display:none"{% endif %}>{% trans 'View Subject' %}<div class="ripple-container"></div></a> | 212 | + <a href="{% url 'course:view_subject' subject.slug %}" class="btn btn-raised btn-default center-block view_btn" {% if user|hide_subscribe_view_btn:subject %}style="display:none"{% endif %}>{% trans 'View Subject' %}<div class="ripple-container"></div></a> |
213 | </div> | 213 | </div> |
214 | </div> | 214 | </div> |
215 | {% endif %} | 215 | {% endif %} |
courses/templatetags/custom_filters.py
@@ -4,6 +4,19 @@ from rolepermissions.verifications import has_role | @@ -4,6 +4,19 @@ from rolepermissions.verifications import has_role | ||
4 | register = template.Library() | 4 | register = template.Library() |
5 | 5 | ||
6 | @register.filter | 6 | @register.filter |
7 | +def hide_subscribe_view_btn(user, subject): | ||
8 | + if not user is None: | ||
9 | + if user.is_authenticated: | ||
10 | + if has_role(user, 'student') and not user.is_staff: | ||
11 | + if user in subject.course.students.all(): | ||
12 | + if not user in subject.students.all(): | ||
13 | + return True | ||
14 | + else: | ||
15 | + return True | ||
16 | + | ||
17 | + return False | ||
18 | + | ||
19 | +@register.filter | ||
7 | def show_subject_subscribe(user, subject): | 20 | def show_subject_subscribe(user, subject): |
8 | if not user is None: | 21 | if not user is None: |
9 | if user.is_authenticated: | 22 | if user.is_authenticated: |
courses/views.py
@@ -210,6 +210,7 @@ class CourseView( NotificationMixin, generic.DetailView): | @@ -210,6 +210,7 @@ class CourseView( NotificationMixin, generic.DetailView): | ||
210 | courses = None | 210 | courses = None |
211 | context = super(CourseView, self).get_context_data(**kwargs) | 211 | context = super(CourseView, self).get_context_data(**kwargs) |
212 | course = get_object_or_404(Course, slug = self.kwargs.get('slug')) | 212 | course = get_object_or_404(Course, slug = self.kwargs.get('slug')) |
213 | + | ||
213 | if has_role(self.request.user,'system_admin'): | 214 | if has_role(self.request.user,'system_admin'): |
214 | subjects = course.subjects.all() | 215 | subjects = course.subjects.all() |
215 | elif has_role(self.request.user,'professor'): | 216 | elif has_role(self.request.user,'professor'): |
@@ -381,6 +382,14 @@ class SubjectsView(LoginRequiredMixin, generic.ListView): | @@ -381,6 +382,14 @@ class SubjectsView(LoginRequiredMixin, generic.ListView): | ||
381 | context_object_name = 'subjects' | 382 | context_object_name = 'subjects' |
382 | model = Subject | 383 | model = Subject |
383 | 384 | ||
385 | + def dispatch(self, *args, **kwargs): | ||
386 | + subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) | ||
387 | + | ||
388 | + if(not has_object_permission('view_subject', self.request.user, subject)): | ||
389 | + return self.handle_no_permission() | ||
390 | + | ||
391 | + return super(SubjectsView, self).dispatch(*args, **kwargs) | ||
392 | + | ||
384 | def get_queryset(self): | 393 | def get_queryset(self): |
385 | subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) | 394 | subject = get_object_or_404(Subject, slug = self.kwargs.get('slug')) |
386 | course = subject.course | 395 | course = subject.course |
@@ -428,6 +437,14 @@ class TopicsView(LoginRequiredMixin, generic.ListView): | @@ -428,6 +437,14 @@ class TopicsView(LoginRequiredMixin, generic.ListView): | ||
428 | context_object_name = 'topics' | 437 | context_object_name = 'topics' |
429 | model = Topic | 438 | model = Topic |
430 | 439 | ||
440 | + def dispatch(self, *args, **kwargs): | ||
441 | + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | ||
442 | + | ||
443 | + if(not has_object_permission('view_topic', self.request.user, topic)): | ||
444 | + return self.handle_no_permission() | ||
445 | + | ||
446 | + return super(TopicsView, self).dispatch(*args, **kwargs) | ||
447 | + | ||
431 | def get_queryset(self): | 448 | def get_queryset(self): |
432 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | 449 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) |
433 | subject = topic.subject | 450 | subject = topic.subject |