diff --git a/core/templates/core/403.html b/core/templates/core/403.html
new file mode 100644
index 00000000..8e8c65a1
--- /dev/null
+++ b/core/templates/core/403.html
@@ -0,0 +1,8 @@
+{% extends "core/base.html" %}
+
+{% block content %}
+
+
403, Forbidden
+
+{% endblock %}
+
diff --git a/core/templates/core/404.html b/core/templates/core/404.html
new file mode 100644
index 00000000..46d4abe2
--- /dev/null
+++ b/core/templates/core/404.html
@@ -0,0 +1,9 @@
+{% extends "core/base.html" %}
+
+{% block content %}
+
+404, Not Found
+
+{% endblock %}
+
+
diff --git a/core/views/__init__.py b/core/views/__init__.py
index f569d411..989eb5bb 100644
--- a/core/views/__init__.py
+++ b/core/views/__init__.py
@@ -1,10 +1,18 @@
+from django.shortcuts import render
from django.http import HttpResponseForbidden
from django.core.exceptions import PermissionDenied
from django.views.generic.base import View
from core.models import Group
+def forbidden(request):
+ return render(request, "core/403.html")
+
+def not_found(request):
+ return render(request, "core/404.html")
+
+
# TODO: see models.py's TODO!
class CanEditPropMixin(View):
"""
@@ -19,8 +27,11 @@ class CanEditPropMixin(View):
user = self.request.user
if obj is None:
return res
+ # TODO: add permission scale validation, to allow some groups other than superuser to manipulate
+ # all objects of a class if they are in the right group
if user.is_superuser or user.groups.filter(name=obj.owner_group.name).exists():
return res
+ raise PermissionDenied
return HttpResponseForbidden("403, Forbidden")
class CanEditMixin(CanEditPropMixin):
@@ -29,8 +40,12 @@ class CanEditMixin(CanEditPropMixin):
object
"""
def dispatch(self, request, *arg, **kwargs):
- res = super(CanEditMixin, self).dispatch(request, *arg, **kwargs)
- if res.status_code != 403:
+ # TODO: WIP: fix permissions with exceptions!
+ try:
+ res = super(CanEditMixin, self).dispatch(request, *arg, **kwargs)
+ except PermissionDenied:
+ pass
+ except:
return res
obj = self.object
user = self.request.user
@@ -40,7 +55,8 @@ class CanEditMixin(CanEditPropMixin):
if user.groups.filter(name=g.name).exists():
return super(CanEditPropMixin, self).dispatch(request, *arg, **kwargs)
if isinstance(obj, User) and obj == user:
- return super(CanEditPropMixin, self).dispatch(request, *arg, **kwargs)
+ return super(CanEditPropMixin, self).dispatch(request, *arg, **kwargs)
+ raise PermissionDenied
return HttpResponseForbidden("403, Forbidden")
class CanViewMixin(CanEditMixin):
@@ -49,8 +65,11 @@ class CanViewMixin(CanEditMixin):
the object
"""
def dispatch(self, request, *arg, **kwargs):
- res = super(CanViewMixin, self).dispatch(request, *arg, **kwargs)
- if res.status_code != 403:
+ try:
+ res = super(CanViewMixin, self).dispatch(request, *arg, **kwargs)
+ except PermissionDenied:
+ pass
+ except:
return res
obj = self.object
user = self.request.user
diff --git a/sith/urls.py b/sith/urls.py
index a76c6f4e..aacf3e11 100644
--- a/sith/urls.py
+++ b/sith/urls.py
@@ -16,6 +16,9 @@ Including another URLconf
from django.conf.urls import include, url
from django.contrib import admin
+handler403 = "core.views.forbidden"
+handler404 = "core.views.not_found"
+
urlpatterns = [
url(r'^', include('core.urls', namespace="core", app_name="core")),
url(r'^admin/', include(admin.site.urls)),