Added multi-option search along.

Added auto hiding of categories in search unless selected.
Added field allowing to choose whether category auto-hidden

Fixes #353
This commit is contained in:
Matthew Smith
2019-10-16 18:23:08 +01:00
parent 2d84a598f7
commit 3de58740c6
6 changed files with 72 additions and 44 deletions

1
.gitignore vendored
View File

@@ -108,3 +108,4 @@ atlassian-ide-plugin.xml
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
.vscode/launch.json

View File

@@ -10,6 +10,11 @@ class AssetForm(forms.ModelForm):
fields = '__all__'
class AssetSearchForm(forms.Form):
query = forms.CharField(required=False)
category = forms.ModelMultipleChoiceField(models.AssetCategory.objects.all(), required=False)
status = forms.ModelMultipleChoiceField(models.AssetStatus.objects.all(), required=False)
class SupplierForm(forms.Form):
class Meta:
model = models.Supplier

View File

@@ -0,0 +1,22 @@
# Generated by Django 2.0.13 on 2019-10-16 13:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('assets', '0012_auto_20191014_0012'),
]
operations = [
migrations.AlterModelOptions(
name='asset',
options={'ordering': ['asset_id'], 'permissions': (('asset_finance', 'Can see financial data for assets'),)},
),
migrations.AddField(
model_name='assetstatus',
name='should_show',
field=models.BooleanField(default=True, help_text='Should this be shown by default in the asset list.'),
),
]

View File

@@ -24,6 +24,7 @@ class AssetStatus(models.Model):
verbose_name_plural = 'Asset Statuses'
name = models.CharField(max_length=80)
should_show = models.BooleanField(default=True, help_text="Should this be shown by default in the asset list.")
def __str__(self):
return self.name

View File

@@ -1,6 +1,7 @@
{% extends 'base_assets.html' %}
{% block title %}List{% endblock %}
{% load paginator from filters %}
{% load widget_tweaks %}
{% block content %}
@@ -11,41 +12,19 @@
<form id="asset-search-form" method="get" class="form-inline pull-right">
{% csrf_token %}
<div class="input-group pull-right" style="width: auto;">
<input type="query" name="query" placeholder="Search by Asset ID/Description" class="form-control" value="{{search_name}}" style="width: 250px">
<label for="asset_id" class="sr-only">Asset ID/Description:</label>
{% render_field form.query|add_class:'form-control' placeholder='Search by Asset ID/Description' style="width: 250px"%}
<label for="query" class="sr-only">Asset ID/Description:</label>
<span class="input-group-btn"><button type="submit" class="btn btn-default">Search</button></span>
</div>
<br>
<div style="margin-top: 1em;" class="pull-right">
<div class="form-group">
<label for="cat" class="sr-only">Category</label>
<select name="cat" class="form-control">
<option value="" class="text-muted">(category)</option>
{% for name in categories %}
{% if name.name == category_select %}
<option selected>
{% else %}
<option>
{% endif %}
{{ name }}
</option>
{% endfor %}
</select>
<label for="category" class="sr-only">Category</label>
{% render_field form.category|attr:'multiple'|add_class:'form-control selectpicker' data-none-selected-text="Categories" data-header="Categories"%}
</div>
<div class="form-group">
<label for="status" class="sr-only">Status</label>
<select name="status" class="form-control">
<option value="">(status)</option>
{% for name in statuses %}
{% if name.name == status_select %}
<option selected>
{% else %}
<option>
{% endif %}
{{ name }}
</option>
{% endfor %}
</select>
{% render_field form.status|attr:'multiple'|add_class:'form-control selectpicker' data-none-selected-text="Statuses" data-header="Statuses"%}
</div>
<!---TODO: Auto filter whenever an option is selected, instead of using a button -->
<button type="submit" class="btn btn-default">Filter</button>
@@ -75,5 +54,13 @@
{% endblock %}
{% block js %}
{% load static %}
{% block css %}
<link rel="stylesheet" href="{% static "css/bootstrap-select.min.css" %}"/>
<link rel="stylesheet" href="{% static "css/ajax-bootstrap-select.css" %}"/>
{% endblock %}
{% block preload_js %}
<script src="{% static "js/bootstrap-select.js" %}"></script>
<script src="{% static "js/ajax-bootstrap-select.js" %}"></script>
{% endblock %}

View File

@@ -19,39 +19,51 @@ class AssetList(LoginRequiredMixin, generic.ListView):
template_name = 'asset_list.html'
paginate_by = 40
ordering = ['-pk']
hide_hidden_status = True
def get_queryset(self):
# TODO Feedback to user when search fails
query = self.request.GET.get('query', "")
if len(query) == 0:
queryset = self.model.objects.all()
elif len(query) >= 3:
queryset = self.model.objects.filter(Q(asset_id__exact=query) | Q(description__icontains=query))
if self.request.method == 'POST':
self.form = forms.AssetSearchForm(data=self.request.POST)
elif self.request.method == 'GET':
self.form = forms.AssetSearchForm(data=self.request.GET)
else:
queryset = self.model.objects.filter(Q(asset_id__exact=query))
self.form = forms.AssetSearchForm(data={})
form = self.form
if not form.is_valid():
return self.model.objects.none()
cat = self.request.GET.get('cat', "")
status = self.request.GET.get('status', "")
if cat != "":
queryset = queryset.filter(category__name__exact=cat)
if status != "":
queryset = queryset.filter(status__name__exact=status)
# TODO Feedback to user when search fails
query_string = form.cleaned_data['query'] or ""
if len(query_string) == 0:
queryset = self.model.objects.all()
elif len(query_string) >= 3:
queryset = self.model.objects.filter(Q(asset_id__exact=query_string) | Q(description__icontains=query_string))
else:
queryset = self.model.objects.filter(Q(asset_id__exact=query_string))
if form.cleaned_data['category']:
queryset = queryset.filter(category__in=form.cleaned_data['category'])
if len(form.cleaned_data['status']) > 0:
queryset = queryset.filter(status__in=form.cleaned_data['status'])
elif self.hide_hidden_status:
queryset = queryset.filter(status__in=models.AssetStatus.objects.filter(should_show=True))
return queryset
def get_context_data(self, **kwargs):
context = super(AssetList, self).get_context_data(**kwargs)
context["search_name"] = self.request.GET.get('query', "")
context["form"] = self.form
context["categories"] = models.AssetCategory.objects.all()
context["category_select"] = self.request.GET.get('cat', "")
context["statuses"] = models.AssetStatus.objects.all()
context["status_select"] = self.request.GET.get('status', "")
return context
class AssetSearch(AssetList):
hide_hidden_status = False
def render_to_response(self, context, **response_kwargs):
result = []