Skip to content

Commit 3909baa

Browse files
committed
config app_name for all url reverse lookups, allow url versioning
1 parent e58c8e6 commit 3909baa

File tree

8 files changed

+36
-30
lines changed

8 files changed

+36
-30
lines changed

arena_account/settings.py

+1
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
"rest_framework.parsers.MultiPartParser",
125125
"rest_framework.parsers.JSONParser",
126126
],
127+
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.NamespaceVersioning",
127128
}
128129

129130
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'

arena_account/urls.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
from django.urls import include, path
1919

2020
urlpatterns = [
21-
path("user/", include("users.urls")),
21+
# configure user api version based endpoints
22+
path("user/", include("users.urls", namespace="v1")),
23+
path("user/v2/", include("users.urls", namespace="v2")),
24+
25+
# include admin paths
2226
path("user/admin/", admin.site.urls),
2327
path("user/accounts/", include("allauth.urls")),
2428
]

users/forms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class SceneForm(forms.ModelForm):
4444
editors = forms.ModelMultipleChoiceField(
4545
queryset=User.objects.all().order_by('username'),
4646
widget=autocomplete.ModelSelect2Multiple(
47-
url='user-autocomplete',
47+
url='users:user-autocomplete',
4848
forward=(forward.Self(), ),
4949
attrs={'data-minimum-input-length': 2},
5050
), required=False)

users/templates/users/header.html

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
</head>
2727

2828
<body>
29-
{% url 'login' as login_url %}
29+
{% url 'users:login' as login_url %}
3030
<!-- avoid navbar for users who have not logged in on login form yet-->
3131
{% if user.is_authenticated or request.get_full_path != login_url %}
3232

@@ -108,13 +108,13 @@
108108
{{user.get_username}}</a>
109109
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
110110
<li><a class="dropdown-item" href="{{request.scheme}}://{{request.get_host}}/conf/versions.html">Version</a></li>
111-
<li><a class="dropdown-item" href="{% url 'user_profile' %}">Profile</a></li>
112-
<li><a class="dropdown-item" href="{% url 'logout' %}">Logout</a></li>
111+
<li><a class="dropdown-item" href="{% url 'users:user_profile' %}">Profile</a></li>
112+
<li><a class="dropdown-item" href="{% url 'users:logout' %}">Logout</a></li>
113113
</ul>
114114
</li>
115115
{% else %}
116116
<li class="nav-item">
117-
<a class="nav-link" href="{% url 'login' %}">Login</a>
117+
<a class="nav-link" href="{% url 'users:login' %}">Login</a>
118118
</li>
119119
{% endif %}
120120
</ul>

users/templates/users/social_signup.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ <h3>Sign Up</h3>
1616
<p>You are about to use your
1717
{{account.get_provider.name}} account to login. As a final step, please complete the
1818
following form:</p>
19-
<form class="signup" id="signup_form" method="post" action="{% url 'socialaccount_signup' %}"
19+
<form class="signup" id="signup_form" method="post" action="{% url 'users:socialaccount_signup' %}"
2020
enctype="multipart/form-data">
2121
{% csrf_token %}
2222
{% for field in form %}

users/templates/users/user_profile.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ <h5>Scene Permissions <button id="button_expand_add_scene" type="button" title="
137137
<form action="profile_update_scene" method="POST">
138138
{% csrf_token %}
139139
<tr>
140-
<td><a href="../../{{ scene.name }}"><b>{{ scene.name }}</b></a></td>
140+
<td><a href="{{ request.scheme }}://{{ request.META.HTTP_HOST }}/{{ scene.name }}"><b>{{ scene.name }}</b></a></td>
141141
<!--public subscribe ok-->
142142
<td>
143143
{% if scene.public_read %}

users/urls.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
title="ARENA Users API",
1313
default_version="v1",
1414
description="ARENA Users Django site endpoints.",
15-
terms_of_service="../terms.html",
15+
terms_of_service=f"https://{os.environ['HOSTNAME']}/terms.html",
1616
contact=openapi.Contact(email=os.environ["EMAIL"]),
1717
license=openapi.License(
1818
name="BSD 3-Clause License",
@@ -24,6 +24,7 @@
2424
permission_classes=(permissions.AllowAny,),
2525
)
2626

27+
app_name = "users"
2728
urlpatterns = [
2829
# pages
2930
path("", views.index, name="index"),

users/views.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def index(request):
4343
"""
4444
Root page load, index is treated as Login page.
4545
"""
46-
return redirect("login")
46+
return redirect("users:login")
4747

4848

4949
def login_request(request):
@@ -63,7 +63,7 @@ def login_request(request):
6363
login(request, user)
6464
messages.info(
6565
request, f"You are now logged in as {username}.")
66-
return redirect("login_callback")
66+
return redirect("users:login_callback")
6767
else:
6868
messages.error(request, "Invalid username or password.")
6969
else:
@@ -79,7 +79,7 @@ def logout_request(request):
7979
Removes ID and flushes session data, shows login page.
8080
"""
8181
logout(request) # revoke django auth
82-
response = redirect("login")
82+
response = redirect("users:login")
8383
response.delete_cookie("auth") # revoke fs auth
8484
return response
8585

@@ -98,7 +98,7 @@ def profile_update_scene(request):
9898
form = UpdateSceneForm(request.POST)
9999
if not form.is_valid():
100100
messages.error(request, "Invalid parameters")
101-
return redirect("user_profile")
101+
return redirect("users:user_profile")
102102
if "add" in request.POST:
103103
scenename = request.POST.get("scenename", None)
104104
s = Scene(
@@ -108,12 +108,12 @@ def profile_update_scene(request):
108108
s.save()
109109
messages.success(
110110
request, f"Created scene {request.user.username}/{scenename}")
111-
return redirect("user_profile")
111+
return redirect("users:user_profile")
112112
elif "edit" in request.POST:
113113
name = form.cleaned_data["edit"]
114114
return redirect(f"profile/scenes/{name}")
115115

116-
return redirect("user_profile")
116+
return redirect("users:user_profile")
117117

118118

119119
@ permission_classes([permissions.IsAuthenticated])
@@ -130,7 +130,7 @@ def profile_update_device(request):
130130
form = UpdateDeviceForm(request.POST)
131131
if not form.is_valid():
132132
messages.error(request, "Invalid parameters")
133-
return redirect("user_profile")
133+
return redirect("users:user_profile")
134134
if "add" in request.POST:
135135
devicename = request.POST.get("devicename", None)
136136
s = Device(
@@ -139,12 +139,12 @@ def profile_update_device(request):
139139
s.save()
140140
messages.success(
141141
request, f"Created device {request.user.username}/{devicename}")
142-
return redirect("user_profile")
142+
return redirect("users:user_profile")
143143
elif "edit" in request.POST:
144144
name = form.cleaned_data["edit"]
145145
return redirect(f"profile/devices/{name}")
146146

147-
return redirect("user_profile")
147+
return redirect("users:user_profile")
148148

149149

150150
def scene_perm_detail(request, pk):
@@ -154,19 +154,19 @@ def scene_perm_detail(request, pk):
154154
"""
155155
if not scene_permission(user=request.user, scene=pk):
156156
messages.error(request, f"User does not have permission for: {pk}.")
157-
return redirect("user_profile")
157+
return redirect("users:user_profile")
158158
# now, make sure scene exists before the other commands are tried
159159
try:
160160
scene = Scene.objects.get(name=pk)
161161
except Scene.DoesNotExist:
162162
messages.error(request, "The scene does not exist")
163-
return redirect("user_profile")
163+
return redirect("users:user_profile")
164164
if request.method == 'POST':
165165
if "save" in request.POST:
166166
form = SceneForm(instance=scene, data=request.POST)
167167
if form.is_valid():
168168
form.save()
169-
return redirect("user_profile")
169+
return redirect("users:user_profile")
170170
elif "delete" in request.POST:
171171
token = generate_arena_token_v1(
172172
user=request.user, username=request.user.username)
@@ -177,7 +177,7 @@ def scene_perm_detail(request, pk):
177177
messages.error(
178178
request, f"Unable to delete {pk} objects from persistance database.")
179179

180-
return redirect("user_profile")
180+
return redirect("users:user_profile")
181181
else:
182182
form = SceneForm(instance=scene)
183183

@@ -192,24 +192,24 @@ def device_perm_detail(request, pk):
192192
"""
193193
if not device_permission(user=request.user, device=pk):
194194
messages.error(request, f"User does not have permission for: {pk}.")
195-
return redirect("user_profile")
195+
return redirect("users:user_profile")
196196
# now, make sure device exists before the other commands are tried
197197
try:
198198
device = Device.objects.get(name=pk)
199199
except Device.DoesNotExist:
200200
messages.error(request, "The device does not exist")
201-
return redirect("user_profile")
201+
return redirect("users:user_profile")
202202
token = None
203203
if request.method == 'POST':
204204
if "save" in request.POST:
205205
form = DeviceForm(instance=device, data=request.POST)
206206
if form.is_valid():
207207
form.save()
208-
return redirect("user_profile")
208+
return redirect("users:user_profile")
209209
elif "delete" in request.POST:
210210
# delete account device data
211211
device.delete()
212-
return redirect("user_profile")
212+
return redirect("users:user_profile")
213213
elif "token" in request.POST:
214214
token = generate_arena_token_v1(
215215
user=request.user,
@@ -336,9 +336,9 @@ def profile_update_staff(request):
336336
if not set_filestore_scope(user):
337337
messages.error(
338338
request, "Unable to update user's filestore status.")
339-
return redirect("user_profile")
339+
return redirect("users:user_profile")
340340

341-
return redirect("user_profile")
341+
return redirect("users:user_profile")
342342

343343

344344
@ api_view(["GET"])
@@ -486,13 +486,13 @@ def user_profile(request):
486486
if not delete_scene_objects(scene.name, token):
487487
messages.error(
488488
request, f"Unable to delete {scene.name} objects from persistance database.")
489-
return redirect("user_profile")
489+
return redirect("users:user_profile")
490490

491491
# delete filestore files/account
492492
if not delete_filestore_user(request.user):
493493
messages.error(
494494
request, "Unable to delete account/files from the filestore.")
495-
return redirect("user_profile")
495+
return redirect("users:user_profile")
496496

497497
# Be careful of foreign keys, in that case this is suggested:
498498
# user.is_active = False

0 commit comments

Comments
 (0)