Skip to content
This repository was archived by the owner on Apr 17, 2023. It is now read-only.

Commit 4466984

Browse files
authored
Merge pull request #21 from biocompute-objects/22.05
22.05
2 parents f429990 + a1ac742 commit 4466984

File tree

4 files changed

+109
-47
lines changed

4 files changed

+109
-47
lines changed

admin_only/db.sqlite3.dev

168 KB
Binary file not shown.

core/serializers.py

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
from django.db.models.query import QuerySet
1+
#!/usr/bin/env python3
2+
"""Custom Serializers
3+
"""
24
from rest_framework import serializers
35
from rest_framework_jwt.settings import api_settings
46
from django.contrib.auth.models import User
5-
6-
# API model
7-
from .models import ApiInfo, Profile
7+
from django.contrib.auth.models import Group
8+
from core.models import ApiInfo, Profile
89

910
# Groups require special processing.
10-
# Source: https://stackoverflow.com/questions/33844003/how-to-serialize-groups-of-a-user-with-django-rest-framework/33844179
11-
from django.contrib.auth.models import Group
11+
# Source: https://stackoverflow.com/questions/33844003/
12+
# how-to-serialize-groups-of-a-user-with-django-rest-framework/33844179
1213

1314
class ChangePasswordSerializer(serializers.Serializer):
14-
"""
15-
Serializer for password change endpoint.
15+
"""Serializer for password change endpoint.
1616
1717
* Provideds serializer for an old password and a new password
1818
@@ -21,68 +21,78 @@ class ChangePasswordSerializer(serializers.Serializer):
2121
"""
2222

2323
model = User
24-
2524
old_password = serializers.CharField(required=True)
2625
new_password = serializers.CharField(required=True)
2726

2827
# Profile serializer
2928
class ProfileSerializer(serializers.ModelSerializer):
29+
"""Profile serializer
3030
31-
# username = serializers.SlugRelatedField(slug_field = 'username', queryset = User.objects.all())
32-
33-
class Meta:
34-
model = Profile
35-
fields = ('username', 'public', 'affiliation', 'orcid')
36-
37-
38-
39-
# Profile serializer
40-
class ProfileSerializer(serializers.ModelSerializer):
41-
42-
# username = serializers.SlugRelatedField(slug_field = 'username', queryset = User.objects.all())
31+
username = serializers.SlugRelatedField(slug_field = 'username', queryset = User.objects.all())
32+
"""
4333

4434
class Meta:
35+
"""Meta"""
4536
model = Profile
4637
fields = ('username', 'public', 'affiliation', 'orcid')
4738

4839

49-
5040
# API serializer
5141
class ApiSerializer(serializers.ModelSerializer):
42+
"""API Serializer
43+
44+
Only if the username on portal and the API are the same...
45+
"""
5246

53-
# Only if the username on portal and the API are the same...
54-
# username = serializers.SlugRelatedField(slug_field = 'username', queryset = User.objects.all())
55-
5647
class Meta:
48+
"""Meta"""
5749
model = ApiInfo
58-
fields = ('username', 'hostname', 'human_readable_hostname', 'public_hostname', 'token', 'other_info',)
50+
fields = (
51+
'username',
52+
'hostname',
53+
'human_readable_hostname',
54+
'public_hostname',
55+
'token',
56+
'other_info'
57+
)
5958

6059

6160
class GroupSerializer(serializers.ModelSerializer):
62-
61+
"""Group Serializer"""
6362
class Meta:
63+
"""Meta"""
6464
model = Group
6565
fields = ('name',)
6666

6767

6868
class UserSerializer(serializers.ModelSerializer):
69-
69+
"""User Serializer"""
7070
apiinfo = ApiSerializer(source='custom_user', many=True)
7171
groups = GroupSerializer(many=True)
7272
profile = ProfileSerializer(many=False)
7373

7474
class Meta:
75+
"""Meta"""
7576
model = User
76-
fields = ('username', 'password', 'first_name', 'last_name', 'email', 'profile', 'groups', 'apiinfo')
77+
fields = (
78+
'username',
79+
'password',
80+
'first_name',
81+
'last_name',
82+
'email',
83+
'profile',
84+
'groups',
85+
'apiinfo'
86+
)
7787

7888

7989
class UserSerializerWithToken(serializers.ModelSerializer):
80-
90+
"""User Serializer"""
8191
token = serializers.SerializerMethodField()
8292
password = serializers.CharField(write_only=True)
8393

8494
def get_token(self, obj):
85-
95+
"""Get Token"""
8696
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
8797
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
8898

@@ -92,7 +102,8 @@ def get_token(self, obj):
92102
return token
93103

94104
def create(self, validated_data):
95-
105+
"""Create
106+
"""
96107
password = validated_data.pop('password', None)
97108
instance = self.Meta.model(**validated_data)
98109

@@ -103,5 +114,6 @@ def create(self, validated_data):
103114
return instance
104115

105116
class Meta:
117+
"Meta"
106118
model = User
107119
fields = ('token', 'username', 'password', 'first_name', 'last_name', 'email', 'groups',)

core/urls.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,19 @@
44
"""
55

66
from django.urls import path, include
7-
from core.views import current_user, add_api, remove_api, CreateUser, update_user, ChangePasswordView, register_prefix, view_prefixes
87
from django.contrib.staticfiles.storage import staticfiles_storage
98
from django.views.generic.base import RedirectView
109
from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token, verify_jwt_token
10+
from core.views import (
11+
current_user,
12+
add_api,
13+
remove_api,
14+
CreateUser,
15+
update_user,
16+
ChangePasswordView,
17+
register_prefix,
18+
view_prefixes
19+
)
1120

1221
urlpatterns = [
1322
path('favicon.ico', RedirectView.as_view(url=staticfiles_storage.url('img/favicon.ico'))),
@@ -20,7 +29,10 @@
2029
path('users/token-refresh/', refresh_jwt_token),
2130
path('users/token-verify/', verify_jwt_token),
2231
path('users/change_password/', ChangePasswordView.as_view()),
23-
path('users/password_reset/', include('django_rest_passwordreset.urls', namespace='password_reset')),
32+
path('users/password_reset/', include(
33+
'django_rest_passwordreset.urls',
34+
namespace='password_reset')
35+
),
2436
path('users/register_prefix/<str:username>/<str:prefix>', register_prefix, name='register'),
2537
path('users/prefixes/', view_prefixes, name='view'),
2638
]

portalusers/utils.py

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,59 @@
1-
from core.serializers import UserSerializer, ApiSerializer
1+
#!/usr/bin/env python3
2+
"""Utils
3+
"""
24

5+
import json
6+
import requests
7+
from rest_framework import status
8+
from rest_framework.response import Response
9+
from core.serializers import UserSerializer
10+
from core.models import ApiInfo
11+
12+
def update_api_info(api):
13+
"""Update API info"""
14+
15+
url = api['public_hostname']+'/api/accounts/describe/'
16+
token = api['token']
17+
header = {'Authorization': f'Token {token}'}
18+
19+
try:
20+
response = requests.post(url, headers=header)
21+
except requests.exceptions.ConnectionError:
22+
return Response(status=status.HTTP_503_SERVICE_UNAVAILABLE,
23+
data='ConnectionError'
24+
)
25+
26+
if response.status_code == 401:
27+
return Response(status=status.HTTP_401_UNAUTHORIZED,
28+
data=json.loads(response.text)
29+
)
30+
if response.status_code is 400:
31+
return Response(status=status.HTTP_400_BAD_REQUEST,
32+
data=json.loads(response.text)
33+
)
34+
35+
return Response(status=status.HTTP_200_OK, data=json.loads(response.text))
336

437
def my_jwt_response_handler(token, user=None, request=None):
38+
"""JWT
39+
40+
BAD SOLUTION!!!
41+
Couldn't get the groups to work quite right, so a bit hacky here.
42+
TODO: refer to API code for a cleaner way to do this.
43+
"""
544

6-
# BAD SOLUTION!!!
7-
# Couldn't get the groups to work quite right, so a bit hacky here.
845
user_info = UserSerializer(user, context={'request': request}).data
9-
print('user')
10-
print(user)
11-
print('------')
12-
print('user_info')
13-
print(user_info)
46+
for api in user_info['apiinfo']:
47+
api_object = ApiInfo.objects.get(token=api['token'])
48+
api_update = update_api_info(api)
49+
if api_update.status_code == 200:
50+
# import pdb; pdb.set_trace()
51+
api_object.other_info = api_update.data['other_info']
52+
53+
api_object.other_info['status'] = api_update.status_code
54+
api_object.save()
1455

15-
# TODO: refer to API code for a cleaner way to do this.
56+
# print(api_object.other_info)
1657
user_info['groups'] = [list(i.items())[0][1] for i in user_info['groups']]
1758

18-
return {
19-
'token': token,
20-
'user': user_info
21-
}
59+
return {'token': token, 'user': user_info}

0 commit comments

Comments
 (0)