Skip to content
This repository was archived by the owner on Jan 26, 2021. It is now read-only.

Commit e440df8

Browse files
committed
Stop volunteers from accessing admin urls.
Fixes #325
1 parent 3804832 commit e440df8

File tree

6 files changed

+36
-18
lines changed

6 files changed

+36
-18
lines changed

vms/administrator/utils.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from functools import wraps
2+
from django.shortcuts import render
3+
4+
def admin_required(func):
5+
@wraps(func)
6+
def wrapped_view(request, *args, **kwargs):
7+
admin = hasattr(request.user, 'administrator')
8+
if not admin:
9+
return render(request, 'vms/no_admin_rights.html', status=403)
10+
return func(request, *args, **kwargs)
11+
return wrapped_view

vms/administrator/views.py

+4-16
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,17 @@
1313
from django.views.generic.edit import FormView, UpdateView
1414
from django.views.generic import View
1515
from administrator.models import Administrator
16+
from administrator.utils import admin_required
1617
from django.utils.decorators import method_decorator
1718

1819

1920
class AdministratorLoginRequiredMixin(object):
2021

2122
@method_decorator(login_required)
2223
def dispatch(self, request, *args, **kwargs):
23-
user = request.user
24-
admin = None
25-
try:
26-
admin = user.administrator
27-
except ObjectDoesNotExist:
28-
pass
24+
admin = hasattr(request.user, 'administrator')
2925
if not admin:
30-
return render(request, 'vms/no_admin_rights.html')
26+
return render(request, 'vms/no_admin_rights.html', status=403)
3127
else:
3228
return super(AdministratorLoginRequiredMixin, self).dispatch(request, *args, **kwargs)
3329

@@ -81,14 +77,6 @@ def post(self, request, *args, **kwargs):
8177

8278

8379
@login_required
80+
@admin_required
8481
def settings(request):
85-
user = request.user
86-
admin = None
87-
try:
88-
admin = user.administrator
89-
except ObjectDoesNotExist:
90-
pass
91-
if not admin:
92-
return HttpResponse(status=403)
93-
9482
return HttpResponseRedirect(reverse('event:list'))

vms/event/views.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from django.shortcuts import render_to_response
1717
from django.http import Http404
1818

19-
2019
class AdministratorLoginRequiredMixin(object):
2120

2221
@method_decorator(login_required)
@@ -112,7 +111,7 @@ def post(self, request, *args, **kwargs):
112111
return render(request, 'event/edit.html', {'form': form,})
113112

114113

115-
class EventListView(LoginRequiredMixin, ListView):
114+
class EventListView(LoginRequiredMixin, AdministratorLoginRequiredMixin, ListView):
116115
model_form = Event
117116
template_name = "event/list.html"
118117

vms/registration/utils.py

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from functools import wraps
2+
from django.shortcuts import render
3+
4+
def volunteer_denied(func):
5+
@wraps(func)
6+
def wrapper(request, *args, **kwargs):
7+
if request.user.is_authenticated():
8+
if not hasattr(request.user, 'administrator'):
9+
return render(request, 'vms/no_admin_rights.html', status=403)
10+
return func(request, *args, **kwargs)
11+
return wrapper
12+

vms/registration/views.py

+6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.views.generic.edit import FormView
77
from django.views.generic import TemplateView
88
from django.core.urlresolvers import reverse_lazy
9+
from django.utils.decorators import method_decorator
910
from administrator.forms import AdministratorForm
1011
from organization.services import (get_organizations_ordered_by_name,
1112
get_organization_by_id)
@@ -14,6 +15,7 @@
1415
from registration.forms import UserForm
1516
from registration.phone_validate import validate_phone
1617
from administrator.models import *
18+
from registration.utils import volunteer_denied
1719

1820

1921
class AdministratorSignupView(TemplateView):
@@ -30,6 +32,10 @@ class AdministratorSignupView(TemplateView):
3032
organization_list = get_organizations_ordered_by_name()
3133
phone_error = False
3234

35+
@method_decorator(volunteer_denied)
36+
def dispatch(self, *args, **kwargs):
37+
return super(AdministratorSignupView, self).dispatch(*args, **kwargs)
38+
3339
def get(self, request):
3440
user_form = UserForm(prefix="usr")
3541
administrator_form = AdministratorForm(prefix="admin")

vms/volunteer/views.py

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.views.generic.detail import DetailView
1111
from django.views.generic import ListView
1212
from braces.views import LoginRequiredMixin, AnonymousRequiredMixin
13+
from administrator.utils import admin_required
1314
from organization.services import *
1415
from shift.services import *
1516
from event.services import get_signed_up_events_for_volunteer
@@ -162,6 +163,7 @@ def post(self, request, *args, **kwargs):
162163
'job_list': job_list, 'event_list': event_list, 'selected_event': event_name,
163164
'selected_job': job_name})
164165
@login_required
166+
@admin_required
165167
def search(request):
166168
if request.method == 'POST':
167169
form = SearchVolunteerForm(request.POST)

0 commit comments

Comments
 (0)