django-spire 0.16.4__py3-none-any.whl → 0.16.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,7 +18,7 @@ def mfa_form_view(request):
18
18
  if form.is_valid():
19
19
  mfa_code.set_expired()
20
20
  profile.set_mfa_grace_period()
21
- return HttpResponseRedirect(reverse('home:home'))
21
+ return HttpResponseRedirect(reverse('home:page:home'))
22
22
 
23
23
  if 'mfa_code' in form.errors:
24
24
  messages.error(request, form.errors['mfa_code'][0])
@@ -33,4 +33,3 @@ def mfa_form_view(request):
33
33
  context=context_data,
34
34
  template='django_spire/auth/mfa/mfa_form.html'
35
35
  )
36
-
@@ -7,5 +7,5 @@
7
7
  {% block authentication_page_content %}
8
8
  <h3>Password Reset</h3>
9
9
  <div class="py-2">You have successfully changed your password!</div>
10
- <a class="w-100 btn btn-app-primary bg-app-primary mt-2" href="{% url 'home:home' %}">Home</a>
11
- {% endblock %}
10
+ <a class="w-100 btn btn-app-primary bg-app-primary mt-2" href="{% url 'home:page:home' %}">Home</a>
11
+ {% endblock %}
@@ -4,9 +4,16 @@
4
4
  <h5 class="mb-2">Change Password</h5>
5
5
  <div>
6
6
  <form x-data="{
7
+ passwords_match: false,
7
8
  old_password: new GlueCharField('old_password', {required: true}),
8
- new_password1: new GlueCharField('new_password1', {required: true}),
9
- new_password2: new GlueCharField('new_password2', {required: true})
9
+ new_password1: new GlueCharField('new_password1', {required: true, label: 'New Password'}),
10
+ new_password2: new GlueCharField('new_password2', {required: true, label: 'Confirm New Password'}),
11
+
12
+ init() {
13
+ $watch(() => [this.new_password1, this.new_password2], () => {
14
+ this.passwords_match = this.new_password1.value === this.new_password2.value
15
+ })
16
+ }
10
17
  }" method="post" class="text-app-secondary">
11
18
  {% csrf_token %}
12
19
  <div class="row">
@@ -26,7 +33,16 @@
26
33
  </div>
27
34
  <div class="row mt-2">
28
35
  <div class="col">
29
- <button type="submit" class="w-100 btn btn-app-primary bg-app-primary mt-2">Submit</button>
36
+ <span x-show="!passwords_match" class="text-app-danger">
37
+ Password confirmation does not match new password.
38
+ </span>
39
+ <button
40
+ type="submit"
41
+ class="w-100 btn btn-app-primary bg-app-primary mt-2"
42
+ :disabled="!passwords_match"
43
+ >
44
+ Submit
45
+ </button>
30
46
  </div>
31
47
  </div>
32
48
  </form>
@@ -18,6 +18,10 @@ class PasswordChangeView(auth_views.PasswordChangeView):
18
18
  template_name = 'django_spire/auth/page/password_change_page.html'
19
19
  success_url = reverse_lazy('django_spire:auth:admin:password_change_done')
20
20
 
21
+ def form_invalid(self, form):
22
+ show_form_errors(self.request, form)
23
+ return super().form_invalid(form)
24
+
21
25
 
22
26
  class PasswordChangeDone(auth_views.PasswordChangeDoneView):
23
27
  template_name = 'django_spire/auth/page/password_change_done_page.html'
@@ -28,6 +32,10 @@ class PasswordResetView(auth_views.PasswordResetView):
28
32
  success_url = reverse_lazy('django_spire:auth:admin:password_reset_done')
29
33
  template_name = 'django_spire/auth/page/password_reset_page.html'
30
34
 
35
+ def form_invalid(self, form):
36
+ show_form_errors(self.request, form)
37
+ return super().form_invalid(form)
38
+
31
39
 
32
40
  class PasswordResetComplete(auth_views.PasswordResetCompleteView):
33
41
  template_name = 'django_spire/auth/page/password_reset_complete_page.html'
@@ -45,6 +53,10 @@ class PasswordResetDone(auth_views.PasswordResetDoneView):
45
53
  class PasswordResetKeyForm(auth_views.PasswordResetView):
46
54
  template_name = 'django_spire/auth/page/password_reset_key_form_page.html'
47
55
 
56
+ def form_invalid(self, form):
57
+ show_form_errors(self.request, form)
58
+ return super().form_invalid(form)
59
+
48
60
 
49
61
  class PasswordResetKeyFormDone(auth_views.PasswordResetView):
50
62
  template_name = 'django_spire/auth/page/password_reset_key_done_page.html'
@@ -52,3 +64,7 @@ class PasswordResetKeyFormDone(auth_views.PasswordResetView):
52
64
 
53
65
  class PasswordSetForm(auth_views.PasswordResetView):
54
66
  template_name = 'django_spire/auth/page/password_set_form_page.html'
67
+
68
+ def form_invalid(self, form):
69
+ show_form_errors(self.request, form)
70
+ return super().form_invalid(form)
django_spire/consts.py CHANGED
@@ -1,4 +1,4 @@
1
- __VERSION__ = '0.16.4'
1
+ __VERSION__ = '0.16.5'
2
2
 
3
3
 
4
4
  AI_CHAT_WORKFLOW_SENDER_SETTINGS_NAME = 'AI_CHAT_WORKFLOW_NAME'
@@ -35,4 +35,4 @@ def reverse_generic_relation(content_object: Any, **kwargs) -> HttpResponse | No
35
35
  if url_path is not None:
36
36
  return reverse(url_path, kwargs=kwargs)
37
37
 
38
- return HttpResponse('home:home')
38
+ return HttpResponse('home:page:home')
@@ -14,7 +14,7 @@ document.addEventListener('alpine:init', () => {
14
14
  try {
15
15
  let response = await ajax_request(
16
16
  'GET',
17
- '/theme/ajax/get_config/'
17
+ '/django_spire/theme/json/get_config/'
18
18
  );
19
19
 
20
20
  if (response && response.data) {
@@ -142,7 +142,7 @@ document.addEventListener('alpine:init', () => {
142
142
  async persist_to_server(value) {
143
143
  await ajax_request(
144
144
  'POST',
145
- '/theme/ajax/set_theme/',
145
+ '/django_spire/theme/json/set_theme/',
146
146
  { theme: value }
147
147
  );
148
148
  },
@@ -23,45 +23,49 @@
23
23
  </div>
24
24
 
25
25
  <div class="col-auto d-flex">
26
- <div>
27
- {% include 'django_spire/theme/element/theme_selector.html' with icon_size='fs-2' %}
28
- </div>
26
+ {% block top_navigation_icons %}
27
+ {% block theme_selector %}
28
+ <div>
29
+ {% include 'django_spire/theme/element/theme_selector.html' with icon_size='fs-2' %}
30
+ </div>
31
+ {% endblock %}
29
32
 
30
- <div class="dropdown">
31
- <i
32
- class="bi bi-person-circle fs-2 mx-2 cursor-pointer"
33
- id="dropdownMenuButton1"
34
- data-bs-toggle="dropdown"
35
- aria-expanded="false"
36
- >
37
- </i>
38
- <ul class="dropdown-menu py-0 bg-app-layer-one" aria-labelledby="dropdownMenuButton1">
39
- {% if request.user.is_superuser %}
40
- <li class="py-0 ">
41
- <a class="dropdown-item fs--1 bg-app-layer-three-hover"
42
- href="{% url 'admin:index' %}" target="_blank">
43
- Admin Panel
33
+ <div class="dropdown">
34
+ <i
35
+ class="bi bi-person-circle fs-2 mx-2 cursor-pointer"
36
+ id="dropdownMenuButton1"
37
+ data-bs-toggle="dropdown"
38
+ aria-expanded="false"
39
+ >
40
+ </i>
41
+ <ul class="dropdown-menu py-0 bg-app-layer-one" aria-labelledby="dropdownMenuButton1">
42
+ {% if request.user.is_superuser %}
43
+ <li class="py-0 ">
44
+ <a class="dropdown-item fs--1 bg-app-layer-three-hover"
45
+ href="{% url 'admin:index' %}" target="_blank">
46
+ Admin Panel
47
+ </a>
48
+ </li>
49
+ {% endif %}
50
+ <li class="py-0">
51
+ <a href="{% url 'django_spire:auth:admin:password_change' %}"
52
+ class="dropdown-item fs--1 bg-app-layer-three-hover">
53
+ Change Password
44
54
  </a>
45
55
  </li>
46
- {% endif %}
47
- <li class="py-0">
48
- <a href="{% url 'django_spire:auth:admin:password_change' %}"
49
- class="dropdown-item fs--1 bg-app-layer-three-hover">
50
- Change Password
51
- </a>
52
- </li>
53
- <li class="py-0">
54
- <a href="{% url 'django_spire:auth:redirect:logout' %}"
55
- class="dropdown-item fs--1 bg-app-layer-three-hover">
56
- Logout
57
- </a>
58
- </li>
59
- </ul>
60
- </div>
56
+ <li class="py-0">
57
+ <a href="{% url 'django_spire:auth:redirect:logout' %}"
58
+ class="dropdown-item fs--1 bg-app-layer-three-hover">
59
+ Logout
60
+ </a>
61
+ </li>
62
+ </ul>
63
+ </div>
61
64
 
62
- <div class="col-auto d-lg-none">
63
- {% include 'django_spire/navigation/mobile_navigation.html' %}
64
- </div>
65
+ <div class="col-auto d-lg-none">
66
+ {% include 'django_spire/navigation/mobile_navigation.html' %}
67
+ </div>
68
+ {% endblock %}
65
69
  </div>
66
70
  {% endblock %}
67
71
  </div>
@@ -8,7 +8,7 @@
8
8
  {% endblock %}
9
9
  </div>
10
10
 
11
- <div class="full-page-content container-fluid">
11
+ <div class="d-flex flex-column container-fluid">
12
12
  <div class="row sticky-top">
13
13
  <div class="col-12 sticky-top">
14
14
  {% block full_page_top_navigation %}
@@ -17,7 +17,7 @@
17
17
  </div>
18
18
  </div>
19
19
 
20
- <div class="row">
20
+ <div class="row flex-grow-1">
21
21
  <div class="col-12">
22
22
  {% block full_page_content %}
23
23
  {% endblock %}
@@ -1,11 +1,14 @@
1
+ from typing import Sequence
2
+
1
3
  from django import template
2
4
  import json
3
5
 
4
6
  register = template.Library()
5
7
 
6
- @register.filter(name='json_loads')
7
- def json_loads(value):
8
+
9
+ @register.filter(name='to_json')
10
+ def to_json(value: dict | Sequence) -> str:
8
11
  try:
9
- return json.loads(value)
12
+ return json.dumps(value)
10
13
  except (TypeError, ValueError) as e:
11
- return {}
14
+ return ''
File without changes
@@ -11,7 +11,7 @@ from django.http import JsonResponse
11
11
  from django_spire.core.tests.test_cases import BaseTestCase
12
12
  from django_spire.theme.enums import ThemeFamily
13
13
  from django_spire.theme.utils import get_theme_cookie_name
14
- from django_spire.theme.views import ajax_views
14
+ from django_spire.theme.views import json_views
15
15
 
16
16
 
17
17
  class ThemeViewTests(TestCase):
@@ -19,8 +19,8 @@ class ThemeViewTests(TestCase):
19
19
  self.factory = RequestFactory()
20
20
 
21
21
  def test_get_config_success(self) -> None:
22
- request = self.factory.get('/theme/ajax/get_config/')
23
- response = ajax_views.get_config(request)
22
+ request = self.factory.get('/django_spire/theme/json/get_config/')
23
+ response = json_views.get_config(request)
24
24
 
25
25
  self.assertIsInstance(response, JsonResponse)
26
26
  self.assertEqual(response.status_code, HTTPStatus.OK)
@@ -42,18 +42,18 @@ class ThemeViewTests(TestCase):
42
42
  self.assertEqual(set(family_config['modes']), {'dark', 'light'})
43
43
 
44
44
  def test_get_config_cache_header(self) -> None:
45
- _ = self.factory.get('/theme/ajax/get_config/')
45
+ _ = self.factory.get('/django_spire/theme/json/get_config/')
46
46
 
47
- with patch('django_spire.theme.views.ajax_views.cache_page') as _:
48
- self.assertTrue(hasattr(ajax_views.get_config, '__wrapped__'))
47
+ with patch('django_spire.theme.views.json_views.cache_page') as _:
48
+ self.assertTrue(hasattr(json_views.get_config, '__wrapped__'))
49
49
 
50
50
  def test_set_theme_success(self) -> None:
51
51
  request = self.factory.post(
52
- '/theme/ajax/set_theme/',
52
+ '/django_spire/theme/json/set_theme/',
53
53
  data=json.dumps({'theme': 'dracula-dark'}),
54
54
  content_type='application/json'
55
55
  )
56
- response = ajax_views.set_theme(request)
56
+ response = json_views.set_theme(request)
57
57
 
58
58
  self.assertIsInstance(response, JsonResponse)
59
59
  self.assertEqual(response.status_code, HTTPStatus.OK)
@@ -72,11 +72,11 @@ class ThemeViewTests(TestCase):
72
72
 
73
73
  def test_set_theme_missing_theme(self) -> None:
74
74
  request = self.factory.post(
75
- '/theme/ajax/set_theme/',
75
+ '/django_spire/theme/json/set_theme/',
76
76
  data=json.dumps({}),
77
77
  content_type='application/json'
78
78
  )
79
- response = ajax_views.set_theme(request)
79
+ response = json_views.set_theme(request)
80
80
 
81
81
  self.assertEqual(response.status_code, HTTPStatus.BAD_REQUEST)
82
82
  data = json.loads(response.content)
@@ -86,11 +86,11 @@ class ThemeViewTests(TestCase):
86
86
 
87
87
  def test_set_theme_invalid_theme(self) -> None:
88
88
  request = self.factory.post(
89
- '/theme/ajax/set_theme/',
89
+ '/django_spire/theme/json/set_theme/',
90
90
  data=json.dumps({'theme': 'invalid-theme'}),
91
91
  content_type='application/json'
92
92
  )
93
- response = ajax_views.set_theme(request)
93
+ response = json_views.set_theme(request)
94
94
 
95
95
  self.assertEqual(response.status_code, HTTPStatus.BAD_REQUEST)
96
96
  data = json.loads(response.content)
@@ -102,7 +102,7 @@ class ThemeViewTests(TestCase):
102
102
  class ThemeViewIntegrationTests(BaseTestCase):
103
103
  def test_set_theme_with_authenticated_client(self) -> None:
104
104
  response = self.client.post(
105
- '/theme/ajax/set_theme/',
105
+ '/django_spire/theme/json/set_theme/',
106
106
  data=json.dumps({'theme': 'dracula-dark'}),
107
107
  content_type='application/json'
108
108
  )
@@ -112,7 +112,7 @@ class ThemeViewIntegrationTests(BaseTestCase):
112
112
  self.assertTrue(data['success'])
113
113
 
114
114
  def test_get_config_with_authenticated_client(self) -> None:
115
- response = self.client.get('/theme/ajax/get_config/')
115
+ response = self.client.get('/django_spire/theme/json/get_config/')
116
116
  self.assertEqual(response.status_code, HTTPStatus.OK)
117
117
 
118
118
  data = json.loads(response.content)
@@ -4,6 +4,6 @@ from django.urls.conf import path, include
4
4
  app_name = 'theme'
5
5
 
6
6
  urlpatterns = [
7
- path('ajax/', include('django_spire.theme.urls.ajax_urls', namespace='ajax')),
7
+ path('json/', include('django_spire.theme.urls.json_urls', namespace='json')),
8
8
  path('page/', include('django_spire.theme.urls.page_urls', namespace='page')),
9
9
  ]
@@ -0,0 +1,10 @@
1
+ from django.urls import path
2
+
3
+ from django_spire.theme.views import json_views
4
+
5
+ app_name = 'json'
6
+
7
+ urlpatterns = [
8
+ path('get_config/', json_views.get_config, name='get_config'),
9
+ path('set_theme/', json_views.set_theme, name='set_theme'),
10
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-spire
3
- Version: 0.16.4
3
+ Version: 0.16.5
4
4
  Summary: A project for Django Spire
5
5
  Author-email: Brayden Carlson <braydenc@stratusadv.com>, Nathan Johnson <nathanj@stratusadv.com>
6
6
  License: Copyright (c) 2024 Stratus Advanced Technologies and Contributors.
@@ -1,6 +1,6 @@
1
1
  django_spire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  django_spire/conf.py,sha256=EYC1hXqYqheYrb_b6Q93LrSgNl91JV633E4N5j-KGTo,1012
3
- django_spire/consts.py,sha256=N0w3XDOpv-vBCNTVf7odC2Y-9QYg4bk2E5J5VvWXuuI,390
3
+ django_spire/consts.py,sha256=MWoKzsjUKe3fISnGCP3AUF30O-pQqwVf496yUBNaewM,390
4
4
  django_spire/exceptions.py,sha256=L5ndRO5ftMmh0pHkO2z_NG3LSGZviJ-dDHNT73SzTNw,48
5
5
  django_spire/settings.py,sha256=NBDa_kZozESTz2UfHgy2PzhBqj54eIrjZsUsWqDgI0g,735
6
6
  django_spire/urls.py,sha256=mKeZszb5U4iIGqddMb5Tt5fRC72U2wABEOi6mvOfEBU,656
@@ -173,7 +173,7 @@ django_spire/auth/mfa/urls/__init__.py,sha256=2o1bgfG1DH8Er4tK1Bwyb4GiNdxWkK982a
173
173
  django_spire/auth/mfa/urls/page_urls.py,sha256=1lQ_PEztg7d2Qx5-jjQQhDEOKUeODLyC8rKE40g5keA,196
174
174
  django_spire/auth/mfa/urls/redirect_urls.py,sha256=S6XgKg7cuybn9V2nWGukSaoV_L6qZzLdvoabkMZT6WM,241
175
175
  django_spire/auth/mfa/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
- django_spire/auth/mfa/views/page_views.py,sha256=aliRN5VKa8nmhwMyx-exjS0sToTN5PU1gOI-k9AaBUw,1144
176
+ django_spire/auth/mfa/views/page_views.py,sha256=EF9s6tqVqG2OTr9PZq5GJkHWGSkgmGPktPtnMFqpi8E,1148
177
177
  django_spire/auth/mfa/views/redirect_views.py,sha256=Wl3m7dyboB5nMk8LmFT_IbxqjxrXCIvPkKWSLK7I77Y,641
178
178
  django_spire/auth/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
179
  django_spire/auth/permissions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -189,8 +189,8 @@ django_spire/auth/templates/django_spire/auth/mfa/mfa_form.html,sha256=iFsNsQAiT
189
189
  django_spire/auth/templates/django_spire/auth/page/auth_page.html,sha256=e6XgU1LUAasVWdB7srFM2zitjtnf8FpfwHhfB6rqDoU,907
190
190
  django_spire/auth/templates/django_spire/auth/page/login_page.html,sha256=EXCoVyvc8YPhFPomPL_ff8y7LNsv1dpgxqJex3U_d_Q,1167
191
191
  django_spire/auth/templates/django_spire/auth/page/logout_page.html,sha256=WelMT2xcuNHXjbj4XkpAUUXzJirXW2zvO7ejOJD3vO4,788
192
- django_spire/auth/templates/django_spire/auth/page/password_change_done_page.html,sha256=YMLTYvXQJiWk4Gg9YYUm7MXBsLnEXvBrPbQ1il8OGy0,395
193
- django_spire/auth/templates/django_spire/auth/page/password_change_page.html,sha256=IIvxsulNlryt_2Lc7jgEX3oU38yFzWHDWnKUlJghIp0,1418
192
+ django_spire/auth/templates/django_spire/auth/page/password_change_done_page.html,sha256=COGQ59FcB3SC5KkmiBXP1zaivAHximi7nTZS888EM4o,401
193
+ django_spire/auth/templates/django_spire/auth/page/password_change_page.html,sha256=5FFMGD-n61nmRN8XkeFccNuCdWM2kKtMJJQWkGvAcso,2088
194
194
  django_spire/auth/templates/django_spire/auth/page/password_reset_complete_page.html,sha256=yaEUxQSO_IGtEIofY2g-jaEhJ6LCfBlW_zWSyh6DHh4,378
195
195
  django_spire/auth/templates/django_spire/auth/page/password_reset_confirmation_page.html,sha256=G8Jc8qp7FCmAvKTaq1PQW3SKt4OhMLH6D2hOHw8dmrk,1076
196
196
  django_spire/auth/templates/django_spire/auth/page/password_reset_done_page.html,sha256=B5F5E-auOls7OKio6WfW55KXa0am-MBrtcwvX1bZtTM,325
@@ -245,7 +245,7 @@ django_spire/auth/user/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
245
245
  django_spire/auth/user/views/form_views.py,sha256=pq6DusBfi5ODwfEzoVMs2fSWMK1SUIjf9rAdOr_dxC0,4250
246
246
  django_spire/auth/user/views/page_views.py,sha256=Ve_i5gpYnGDzoUqeCmaMMZbPDgNqJX3pRVxWvjwyJ08,1779
247
247
  django_spire/auth/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
248
- django_spire/auth/views/admin_views.py,sha256=L6meVzVO3RSytbSfeSN0DC7Asij4o0niq49aCOQnpZs,1967
248
+ django_spire/auth/views/admin_views.py,sha256=CI-am-SMGsQo0hpNTWFG-4XcSBzdBATqVEsZL3NnIpg,2455
249
249
  django_spire/auth/views/redirect_views.py,sha256=xaCUeUNzN6eSqOjaxPBV6IumdbVus2Mwl22b_C078UQ,906
250
250
  django_spire/comment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
251
251
  django_spire/comment/admin.py,sha256=U8ZapPJ6aniL0ENZ1VwpSfmzaC-9KW0ccU5z3VnjhAs,1446
@@ -469,7 +469,7 @@ django_spire/core/middleware/__init__.py,sha256=peocpyT_vXsjK3MXzpWIbsNVnHBbuyyb
469
469
  django_spire/core/middleware/maintenance.py,sha256=jJtmz69UXJBBgPkq5SNspWuER1bGfAjSnsVipYS4TF0,921
470
470
  django_spire/core/middleware/profiling.py,sha256=oW8S5oZQYq96a28cmVPLwyhz3xBAZHkTK7NMxLUDXCw,4807
471
471
  django_spire/core/redirect/__init__.py,sha256=ubAsz_h3ufwgNNkdtqiJQDgXc6DodE2LTUyBwi9dgkE,71
472
- django_spire/core/redirect/generic_redirect.py,sha256=LROeZDF1oAT6JiTRfZAvRjmtTBAjUYwg194ggImTefc,1240
472
+ django_spire/core/redirect/generic_redirect.py,sha256=bfpA2GSRbkf5Y_zqTiTGzakQauLumm3JbaYMzmsDhjA,1245
473
473
  django_spire/core/redirect/safe_redirect.py,sha256=deGLqiR1wWwqlJ8BYp76qDUDHnfRrxL-1Vns3nozSG0,2901
474
474
  django_spire/core/static/django_spire/css/app-background.css,sha256=xxy0pvHJrGqrBHu_ERg2wfEFOlnRm-IeCsGzxFXO354,5664
475
475
  django_spire/core/static/django_spire/css/app-border.css,sha256=z_DT3sB5tNQFu4Y7gSqYFn_bpOmEgEgJCrNmAnmSGDI,3439
@@ -531,7 +531,7 @@ django_spire/core/static/django_spire/js/cookie.js,sha256=N9ifDzqmJHRDwYI2Lqia1y
531
531
  django_spire/core/static/django_spire/js/dropdown.js,sha256=cSvzdsct8-45gIWZlO5MzmbW2vDuxJVttLZjOBl14GE,934
532
532
  django_spire/core/static/django_spire/js/modal.js,sha256=ay0Sovi0HhedEz3dRhB_INhkh1PEJ7zPc5POYo_Wwg0,370
533
533
  django_spire/core/static/django_spire/js/session_controller.js,sha256=aMom087y00MUhdxrZlrg89f88mBC7cWEhGWopeb5hlQ,232
534
- django_spire/core/static/django_spire/js/theme.js,sha256=W-7FxCOMcOMDj8USfXIfq541DahGIUM27pP0NZmJa2w,5804
534
+ django_spire/core/static/django_spire/js/theme.js,sha256=JyKPDkblDSay0DNzpPJfvlSptVORFhu3FWF_s84qYaI,5830
535
535
  django_spire/core/static/django_spire/js/ui.js,sha256=qxb32pBZz7e5iLuOCbNs80VsqQJKa6cj5aBrGTvIrsY,389
536
536
  django_spire/core/templates/django_spire/403.html,sha256=35OX-3z-Yi6Igx9DTAcxNwWiZ17wXdm4wYGML4U2pns,37
537
537
  django_spire/core/templates/django_spire/404.html,sha256=91sTr518M2YxQ8X3GlzDsNP6IVo3MW07tbHdcLBL8Iw,235
@@ -613,7 +613,7 @@ django_spire/core/templates/django_spire/modal/element/model_close_element.html,
613
613
  django_spire/core/templates/django_spire/navigation/mobile_navigation.html,sha256=btXoeLihu3jd_7XzKrZiwaBgffDiLoDorMSxhYrnhc4,997
614
614
  django_spire/core/templates/django_spire/navigation/navigation_links.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
615
615
  django_spire/core/templates/django_spire/navigation/side_navigation.html,sha256=bGAs_RbYc-fC77UKtleeMtQM0feYEi4r9j9gDFD_hhc,762
616
- django_spire/core/templates/django_spire/navigation/top_navigation.html,sha256=tqVS0IdifPzAvLD6e1Ui693oRdCX15j97rKFoXMwFO0,2639
616
+ django_spire/core/templates/django_spire/navigation/top_navigation.html,sha256=3oNCt2do6ZkTcn_Qty85G6IsWtHu2G0GnAolNLsf7M4,2945
617
617
  django_spire/core/templates/django_spire/navigation/accordion/nav_accordion.html,sha256=dOwp7Gu-VwC8BleBwvCpHtSbI1HsESpn7w-femjFkXY,1326
618
618
  django_spire/core/templates/django_spire/navigation/accordion/settings_nav_accordion.html,sha256=5jy4VBU199bG_-WPmWVhe5bZYWsm03bzZC6XqGK2XFM,794
619
619
  django_spire/core/templates/django_spire/navigation/elements/nav_link.html,sha256=5GK0KI3h72VAV0nyIWqfP55nlMJ8Xx5cgTKKWGkhUAk,153
@@ -625,7 +625,7 @@ django_spire/core/templates/django_spire/page/center_card_page.html,sha256=DHU9d
625
625
  django_spire/core/templates/django_spire/page/delete_confirmation_form_page.html,sha256=kmAA2eeD-5s3oAdS-HdFwbqHnzPlqihqh5JwxMJIP_o,168
626
626
  django_spire/core/templates/django_spire/page/delete_form_page.html,sha256=0ZYlWgl3eVq2OTbu_C0UiHVfSIbj2gg_iJ7xeafHVu4,240
627
627
  django_spire/core/templates/django_spire/page/form_full_page.html,sha256=5yp3EfOC2LlcTc0PYQ5MLuQvuw1QFPsMtnPvRdP0A2g,299
628
- django_spire/core/templates/django_spire/page/full_page.html,sha256=52BE1q69Il8wrtkYQS5-VjtSo0wZR0S2YB3f5bbqGLc,1226
628
+ django_spire/core/templates/django_spire/page/full_page.html,sha256=AtAuEYqi7f5eo7ZFLweSifD5LgjAm8b-HRQh6T44GNA,1239
629
629
  django_spire/core/templates/django_spire/page/page.html,sha256=D6qoyoo3E0_Qu8qov6c2YaYbJQ-LnZnCLKHb5bN0sOs,397
630
630
  django_spire/core/templates/django_spire/speech/speech_recognition.html,sha256=0SiRq9L4wFPFl_c8WnwflsYFfQ2wVUPi7aklEPdZPjQ,805
631
631
  django_spire/core/templates/django_spire/speech/speech_synthesis.html,sha256=25HetXDLzVWxC8hBnIuVbNXfvGxfaYvtZUPPtN0fkQY,805
@@ -635,7 +635,7 @@ django_spire/core/templates/django_spire/tab/element/tab_trigger_element.html,sh
635
635
  django_spire/core/templates/django_spire/wizard/wizard.html,sha256=t8sscyIyVfyxnji2gFa6bW0cqkdGE-x_W7nzuBTrjxo,2239
636
636
  django_spire/core/templates/django_spire/wizard/wizard_page.html,sha256=emW5W2z_mkGERsbw3A9tFJoUOwhxa4Efr8thtZ_gHkI,75
637
637
  django_spire/core/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
638
- django_spire/core/templatetags/json.py,sha256=65Am81T997Pt1EK744f83MgvYmfU_QCvXTxlGH8BWVs,231
638
+ django_spire/core/templatetags/json.py,sha256=2XY8hQZrJOSmGMblL8bLRYD9hvUSQvhYaSJvwGaKzwU,280
639
639
  django_spire/core/templatetags/message.py,sha256=y70pMv1ddttJ41c11O1S7h7v8h_gTtJVdXe67J4Ld3g,491
640
640
  django_spire/core/templatetags/spire_core_tags.py,sha256=YLVqYEnvuJt93CpKoOO7uQ83zsnVnrfstcZthCNNGgA,4020
641
641
  django_spire/core/templatetags/string_formating.py,sha256=pE5ID0-cvOKfmbAIixVXEW3LN8_XLEF_OlpztHkiILk,444
@@ -1071,15 +1071,16 @@ django_spire/theme/tests/test_enums.py,sha256=38KaKRdJwpUPialpSHU_BFeX98kTsS93sI
1071
1071
  django_spire/theme/tests/test_filesystem.py,sha256=o-kr76wOEvJoCVAGCmvQKEWMbBIYW_-gWoo_i7hTVa8,6611
1072
1072
  django_spire/theme/tests/test_integration.py,sha256=yzA4PIUhw6n79fcKr-7SmKPNJT7IIqy6RH_zfWbhZjc,1869
1073
1073
  django_spire/theme/tests/test_model.py,sha256=l-_e0z0f6SXKGmLGLI2JzA3GpDAgwV6876C5Efy6K6M,7023
1074
- django_spire/theme/tests/test_views.py,sha256=cQRyOtkqXyRwefKClf0WrwRSAfbiprSYccO_O_febIo,4337
1075
- django_spire/theme/urls/__init__.py,sha256=xvOEkez8qj--DaUvReX5chAudmpp60Q2St87ht5jqgk,249
1076
- django_spire/theme/urls/ajax_urls.py,sha256=LF36I9dT0NNl84yjgAunQKUMbQwcJpTaQVR1b8koCvE,247
1074
+ django_spire/theme/tests/test_views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1075
+ django_spire/theme/tests/test_views/test_json_views.py,sha256=CNcVyz-Q4zUsarKpvSKNZ31gxhWd9seVnFsHX2K77ww,4428
1076
+ django_spire/theme/urls/__init__.py,sha256=0AGqZ-kWrE50HwlFRH_t19qO7CH1OqGLtPrf6PDhjF8,249
1077
+ django_spire/theme/urls/json_urls.py,sha256=CHqKcicKQpKI3OrlxTOQKgdYvzHWZDgScqpCDu9r7oU,247
1077
1078
  django_spire/theme/urls/page_urls.py,sha256=S8nkKkgbhG3XHI3uMUL-piOjXIrRkuY2UlM_JNX4L3Q,641
1078
1079
  django_spire/theme/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1079
- django_spire/theme/views/ajax_views.py,sha256=W1khC2K_EMbEzAFmMxC_P76_MFnkRH4-eVdodrRfAhw,1904
1080
+ django_spire/theme/views/json_views.py,sha256=W1khC2K_EMbEzAFmMxC_P76_MFnkRH4-eVdodrRfAhw,1904
1080
1081
  django_spire/theme/views/page_views.py,sha256=pHr8iekjtR99xs7w1taj35HEo133Svq1dvDD0y0VL1c,3933
1081
- django_spire-0.16.4.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1082
- django_spire-0.16.4.dist-info/METADATA,sha256=L57SaM1z3wO54zyNqBJMhRIvhjrxsnzJ8l8isNCUSBo,4762
1083
- django_spire-0.16.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1084
- django_spire-0.16.4.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1085
- django_spire-0.16.4.dist-info/RECORD,,
1082
+ django_spire-0.16.5.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1083
+ django_spire-0.16.5.dist-info/METADATA,sha256=PXy20uNpaGz328ajflrVW0MvcxLd-7GNOccW5UBR284,4762
1084
+ django_spire-0.16.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1085
+ django_spire-0.16.5.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1086
+ django_spire-0.16.5.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- from django.urls import path
2
-
3
- from django_spire.theme.views import ajax_views
4
-
5
- app_name = 'ajax'
6
-
7
- urlpatterns = [
8
- path('get_config/', ajax_views.get_config, name='get_config'),
9
- path('set_theme/', ajax_views.set_theme, name='set_theme'),
10
- ]