[rentals] Use django-autocomplete-light for locker renter selection
This primarily to make the list of members not block/slow down loading excessively, as it was currently doing
This commit is contained in:
parent
8eba17af13
commit
e14e57c39e
@ -21,6 +21,8 @@ ALLOWED_HOSTS = []
|
|||||||
# Application definition
|
# Application definition
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
|
"dal",
|
||||||
|
"dal_select2",
|
||||||
"django.contrib.admin",
|
"django.contrib.admin",
|
||||||
"django.contrib.auth",
|
"django.contrib.auth",
|
||||||
"django.contrib.contenttypes",
|
"django.contrib.contenttypes",
|
||||||
|
@ -24,6 +24,7 @@ urlpatterns = [
|
|||||||
path("", lambda request: redirect("/tasks/"), name="root"),
|
path("", lambda request: redirect("/tasks/"), name="root"),
|
||||||
path("tasks/", include("tasks.urls")),
|
path("tasks/", include("tasks.urls")),
|
||||||
path("rentals/", include("rentals.urls")),
|
path("rentals/", include("rentals.urls")),
|
||||||
|
path("membershipworks/", include("membershipworks.urls")),
|
||||||
path("paperwork/", include("paperwork.urls")),
|
path("paperwork/", include("paperwork.urls")),
|
||||||
path("admin/", admin.site.urls),
|
path("admin/", admin.site.urls),
|
||||||
path(
|
path(
|
||||||
|
13
membershipworks/urls.py
Normal file
13
membershipworks/urls.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from django.urls import path
|
||||||
|
|
||||||
|
from .views import MemberAutocomplete
|
||||||
|
|
||||||
|
app_name = "membershipworks"
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path(
|
||||||
|
"member-autocomplete/",
|
||||||
|
MemberAutocomplete.as_view(),
|
||||||
|
name="member-autocomplete",
|
||||||
|
),
|
||||||
|
]
|
@ -1,3 +1,14 @@
|
|||||||
from django.shortcuts import render
|
from dal import autocomplete
|
||||||
|
|
||||||
# Create your views here.
|
from .models import Member
|
||||||
|
|
||||||
|
|
||||||
|
class MemberAutocomplete(autocomplete.Select2QuerySetView):
|
||||||
|
model = Member
|
||||||
|
search_fields = ["account_name"]
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
if not self.request.user.has_perm("membershipworks.view_member"):
|
||||||
|
return Member.objects.none()
|
||||||
|
else:
|
||||||
|
return super().get_queryset()
|
||||||
|
13
pdm.lock
13
pdm.lock
@ -82,6 +82,14 @@ dependencies = [
|
|||||||
"python-ldap>=3.1",
|
"python-ldap>=3.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "django-autocomplete-light"
|
||||||
|
version = "3.9.4"
|
||||||
|
summary = "Fresh autocompletes for Django"
|
||||||
|
dependencies = [
|
||||||
|
"six",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "django-debug-toolbar"
|
name = "django-debug-toolbar"
|
||||||
version = "3.4.0"
|
version = "3.4.0"
|
||||||
@ -349,7 +357,7 @@ summary = "Backport of pathlib-compatible object wrapper for zip files"
|
|||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock_version = "3.1"
|
lock_version = "3.1"
|
||||||
content_hash = "sha256:1512b8ed7599dc6338be0d66ce81da103c5fe1a100460e3702221a7badc089a6"
|
content_hash = "sha256:fe264d6d6f3391ec02da7c52702e18abd7a4a86c9349b758ac930d4b89ac4091"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
"asgiref 3.5.1" = [
|
"asgiref 3.5.1" = [
|
||||||
@ -409,6 +417,9 @@ content_hash = "sha256:1512b8ed7599dc6338be0d66ce81da103c5fe1a100460e3702221a7ba
|
|||||||
{file = "django_auth_ldap-4.0.0-py3-none-any.whl", hash = "sha256:94119c94981809124d3dc4bed974f71c7a980666896df626f556a88a5fe0b59c"},
|
{file = "django_auth_ldap-4.0.0-py3-none-any.whl", hash = "sha256:94119c94981809124d3dc4bed974f71c7a980666896df626f556a88a5fe0b59c"},
|
||||||
{file = "django-auth-ldap-4.0.0.tar.gz", hash = "sha256:276f79e624ce083ce13f161387f65ff1c0efe83ef8a42f2b9830d43317b15239"},
|
{file = "django-auth-ldap-4.0.0.tar.gz", hash = "sha256:276f79e624ce083ce13f161387f65ff1c0efe83ef8a42f2b9830d43317b15239"},
|
||||||
]
|
]
|
||||||
|
"django-autocomplete-light 3.9.4" = [
|
||||||
|
{file = "django-autocomplete-light-3.9.4.tar.gz", hash = "sha256:0f6da75c1c7186698b867a467a8cdb359f0513fdd8e09288a0c2fb018ae3d94e"},
|
||||||
|
]
|
||||||
"django-debug-toolbar 3.4.0" = [
|
"django-debug-toolbar 3.4.0" = [
|
||||||
{file = "django_debug_toolbar-3.4.0-py3-none-any.whl", hash = "sha256:42c1c2e9dc05bb57b53d641e3a6d131fc031b92377b34ae32e604a1fe439bb83"},
|
{file = "django_debug_toolbar-3.4.0-py3-none-any.whl", hash = "sha256:42c1c2e9dc05bb57b53d641e3a6d131fc031b92377b34ae32e604a1fe439bb83"},
|
||||||
{file = "django-debug-toolbar-3.4.0.tar.gz", hash = "sha256:ae6bec2c1ce0e6900b0ab0443e1427eb233d8e6f57a84a0b2705eeecb8874e22"},
|
{file = "django-debug-toolbar-3.4.0.tar.gz", hash = "sha256:ae6bec2c1ce0e6900b0ab0443e1427eb233d8e6f57a84a0b2705eeecb8874e22"},
|
||||||
|
@ -17,6 +17,7 @@ dependencies = [
|
|||||||
"mdformat-tables~=0.4",
|
"mdformat-tables~=0.4",
|
||||||
"mysqlclient~=2.1",
|
"mysqlclient~=2.1",
|
||||||
"bleach~=5.0",
|
"bleach~=5.0",
|
||||||
|
"django-autocomplete-light~=3.9",
|
||||||
]
|
]
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
|
from dal import autocomplete
|
||||||
|
|
||||||
from rentals.models import LockerInfo
|
from rentals.models import LockerInfo
|
||||||
|
|
||||||
|
|
||||||
@ -12,3 +14,11 @@ class LockerInfoForm(forms.ModelForm):
|
|||||||
"renter",
|
"renter",
|
||||||
"reserved",
|
"reserved",
|
||||||
]
|
]
|
||||||
|
widgets = {
|
||||||
|
"renter": autocomplete.ModelSelect2(
|
||||||
|
url="membershipworks:member-autocomplete",
|
||||||
|
attrs={
|
||||||
|
"data-placeholder": "-- No Renter --",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{% extends "base.dj.html" %}
|
{% extends "base.dj.html" %}
|
||||||
|
|
||||||
|
{% load static %}
|
||||||
{% load widget_tweaks %}
|
{% load widget_tweaks %}
|
||||||
|
|
||||||
{% block title %}Lockers Index{% endblock %}
|
{% block title %}Lockers Index{% endblock %}
|
||||||
@ -41,6 +42,14 @@
|
|||||||
.locker .door[data-available="False"] {
|
.locker .door[data-available="False"] {
|
||||||
background-color: hsl(24, 15%, 25%);;
|
background-color: hsl(24, 15%, 25%);;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form-floating .select2-container .select2-selection {
|
||||||
|
height: 3.5em;
|
||||||
|
padding: 1.625rem .25rem;
|
||||||
|
}
|
||||||
|
.form-floating .select2-container .select2-selection .select2-selection__rendered {
|
||||||
|
padding-right: 0.25rem;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
{% for bank, units in locker_banks.items %}
|
{% for bank, units in locker_banks.items %}
|
||||||
<div class="locker-bank" data-bank="{{ bank.slug }}">
|
<div class="locker-bank" data-bank="{{ bank.slug }}">
|
||||||
@ -124,5 +133,18 @@
|
|||||||
document.addEventListener('hide.bs.dropdown', (e) => {
|
document.addEventListener('hide.bs.dropdown', (e) => {
|
||||||
e.target.parentElement.querySelector('.dropdown-menu form').reset();
|
e.target.parentElement.querySelector('.dropdown-menu form').reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Set select2 parent element to the dropdown menu, to prevent bootstrap from
|
||||||
|
// hiding the menu when the select2 box is selected
|
||||||
|
document.addEventListener('show.bs.dropdown', (e) => {
|
||||||
|
let menu = $(e.target.parentElement).find('.dropdown-menu');
|
||||||
|
let select = menu.find('[data-autocomplete-light-function="select2"]');
|
||||||
|
|
||||||
|
let options = select.data('select2').options.options;
|
||||||
|
options.dropdownParent = menu;
|
||||||
|
|
||||||
|
select.select2(options);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
{{ form_media }}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -22,6 +22,7 @@ def lockerIndex(request):
|
|||||||
|
|
||||||
context = {
|
context = {
|
||||||
"locker_banks": locker_banks,
|
"locker_banks": locker_banks,
|
||||||
|
"form_media": list(list(locker_banks.values())[0].values())[0][0].media,
|
||||||
}
|
}
|
||||||
return render(request, "rentals/lockers.dj.html", context)
|
return render(request, "rentals/lockers.dj.html", context)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user