Skip to content

Commit bb11ccd

Browse files
committed
fix model, serializer, restrict access to rest framework browser
1 parent 3fd7021 commit bb11ccd

File tree

5 files changed

+39
-16
lines changed

5 files changed

+39
-16
lines changed

django/gsmap/models.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,18 +508,24 @@ def title(self):
508508

509509
@property
510510
def email_domain(self):
511-
return self.author_email.split("@")[1]
511+
if self.author_email:
512+
return self.author_email.split("@")[1]
513+
return None
512514

513515
@property
514516
def email_hash(self):
515-
m = hashlib.sha512()
516-
m.update(SECRET_KEY.encode('ascii'))
517-
m.update(self.author_email.encode('ascii'))
518-
return m.hexdigest()
517+
if self.author_email:
518+
m = hashlib.sha512()
519+
m.update(SECRET_KEY.encode('ascii'))
520+
m.update(self.author_email.encode('ascii'))
521+
return m.hexdigest()
522+
return None
519523

520524
@property
521525
def email_hash_short(self):
522-
return self.email_hash[:12]
526+
if self.author_email:
527+
return self.email_hash[:12]
528+
return None
523529

524530
@property
525531
def description(self):

django/gsmap/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Meta:
2222
)
2323

2424
def validate(self, data):
25-
if not (data.get("workspace").annotations_open or data.get("workspace").poylgons_open):
25+
if not (data.get("workspace").annotations_open or data.get("workspace").polygon_open):
2626
raise serializers.ValidationError('Rating annotations is not allowed currently for this workspace.')
2727
if not data.get("author_email"):
2828
raise serializers.ValidationError('Adding annotations to this workspace requires an email.')

django/gsmap/views.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from django.views.generic import DetailView
99

10-
from rest_framework import generics, parsers
10+
from rest_framework import generics, parsers, renderers
1111
from rest_framework.response import Response
1212

1313
from gsmap.models import Workspace, Snapshot, Annotation, Category, Attachement
@@ -17,6 +17,16 @@
1717

1818
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY') or os.getenv('DJANGO_SECRET_KEY_DEV')
1919

20+
class StaffBrowsableMixin(object):
21+
def get_renderers(self):
22+
"""
23+
Add Browsable API renderer if user is staff.
24+
"""
25+
rends = self.renderer_classes
26+
if self.request.user and self.request.user.is_superuser:
27+
rends.append(renderers.BrowsableAPIRenderer)
28+
return [renderer() for renderer in rends]
29+
2030
class CustomLoginView(LoginView):
2131
"""
2232
Customized to include Workspace data in the request cookie
@@ -51,7 +61,7 @@ def logout(request):
5161
return response
5262

5363

54-
class SnapshotFileUploadView(generics.UpdateAPIView):
64+
class SnapshotFileUploadView(StaffBrowsableMixin, generics.UpdateAPIView):
5565
permission_classes = [IsUser,]
5666
queryset = Snapshot.objects.all()
5767
serializer_class = SnapshotDataUploadSerializer
@@ -72,12 +82,12 @@ def update(self, request, *args, **kwargs):
7282

7383
return Response(serializer.data)
7484

75-
class AnnotationCreateView(generics.CreateAPIView):
85+
class AnnotationCreateView(StaffBrowsableMixin, generics.CreateAPIView):
7686
queryset = Annotation.objects.all()
7787
serializer_class = AnnotationSerializer
7888
http_method_names = ['post',]
7989

80-
class AnnotationRateUpView(generics.UpdateAPIView):
90+
class AnnotationRateUpView(StaffBrowsableMixin, generics.UpdateAPIView):
8191
queryset = Annotation.objects.all()
8292
serializer_class = AnnotationRateUpSerializer
8393
lookup_url_kwarg = 'annotation_id'

django/main/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@
8686
'django.middleware.clickjacking.XFrameOptionsMiddleware',
8787
]
8888

89+
REST_FRAMEWORK = {
90+
# Only enable JSON renderer by default.
91+
'DEFAULT_RENDERER_CLASSES': [
92+
'rest_framework.renderers.JSONRenderer',
93+
],
94+
}
95+
8996
ROOT_URLCONF = 'main.urls'
9097

9198
TEMPLATES = [

etc/nginx/www.local.dev

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ server {
2323
ssl_certificate_key /etc/nginx/conf.d/localhost.key;
2424

2525
location = / {
26-
set $lang_sup "de,fr";
26+
set $lang_sup "de,fr,it,en";
2727
set_by_lua_file $lang_accept /etc/nginx/conf.d/lang.lua $lang_sup;
2828
return $scheme://$host:$server_port/$lang_accept;
2929
}
@@ -42,15 +42,15 @@ server {
4242
}
4343

4444
location ~* "^/([0-9a-z]{6})/?$" {
45-
set $lang_sup "de,fr";
45+
set $lang_sup "de,fr,en";
4646
set_by_lua_file $lang_accept /etc/nginx/conf.d/lang.lua $lang_sup;
4747
rewrite_by_lua_block {
4848
return ngx.redirect("/" .. ngx.var.lang_accept .. ngx.var.request_uri, 302)
4949
}
5050
}
5151

5252
location ~* "^/([0-9a-z]{5})/([0-9a-z]{6})/?$" {
53-
set $lang_sup "de,fr";
53+
set $lang_sup "de,fr,en";
5454
set_by_lua_file $lang_accept /etc/nginx/conf.d/lang.lua $lang_sup;
5555
rewrite_by_lua_block {
5656
return ngx.redirect("/" .. ngx.var.lang_accept .. ngx.var.request_uri, 302)
@@ -67,7 +67,7 @@ server {
6767
root /var/services/django;
6868
}
6969

70-
location ~ "^/(de|fr)/(?<hash>[0-9A-Z]{6})/?$" {
70+
location ~ "^/(de|fr|it|en)/(?<hash>[0-9A-Z]{6})/?$" {
7171
# dev proxy vue
7272
include "/etc/nginx/conf.d/proxy_conf.inc";
7373
include "/etc/nginx/conf.d/proxy_meta.inc";
@@ -77,7 +77,7 @@ server {
7777
#content_by_lua_file "/etc/nginx/conf.d/meta_dist.lua";
7878
}
7979

80-
location ~ "^/(de|fr)/([0-9A-Z]{5})/(?<hash>[0-9A-Z]{6})/?$" {
80+
location ~ "^/(de|fr|it|en)/([0-9A-Z]{5})/(?<hash>[0-9A-Z]{6})/?$" {
8181
# dev proxy vue
8282
include "/etc/nginx/conf.d/proxy_conf.inc";
8383
include "/etc/nginx/conf.d/proxy_meta.inc";

0 commit comments

Comments
 (0)