Switch back from pk filtering to safe name

This commit is contained in:
2023-01-09 00:10:57 +01:00
parent 6fbea294da
commit 78f9faee5e
8 changed files with 44 additions and 24 deletions

View File

@@ -1,4 +1,4 @@
from urllib.parse import quote_plus
from urllib.parse import quote
from django.db import models
from django.conf import settings
@@ -37,7 +37,7 @@ class Manufacturer(models.Model):
return self.name
def safe_name(self):
return quote_plus(self.name, safe="&")
return quote(self.__str__().lower(), safe="& ")
def logo_thumbnail(self):
return get_image_preview(self.logo.url)
@@ -62,7 +62,7 @@ class Company(models.Model):
return self.name
def safe_name(self):
return quote_plus(self.name, safe="&")
return quote(self.__str__().lower(), safe="& ")
def logo_thumbnail(self):
return get_image_preview(self.logo.url)
@@ -104,6 +104,9 @@ class Scale(models.Model):
def __str__(self):
return str(self.scale)
def safe_name(self):
return quote(self.__str__(), safe="& ")
class Tag(models.Model):
name = models.CharField(max_length=128, unique=True)
@@ -112,6 +115,9 @@ class Tag(models.Model):
def __str__(self):
return self.name
def safe_name(self):
return self.slug
@receiver(models.signals.pre_save, sender=Tag)
def slug_pre_save(sender, instance, **kwargs):
@@ -131,3 +137,6 @@ class RollingStockType(models.Model):
def __str__(self):
return "{0} {1}".format(self.type, self.category)
def safe_name(self):
return quote(self.__str__().lower(), safe="& ")

View File

@@ -38,7 +38,7 @@
<tr>
<th scope="row">Company</th>
<td>
<a href="{% url 'filtered' _filter="company" search=d.rolling_class.company.pk %}"><abbr title="{{ d.rolling_class.company.extended_name }}">{{ d.rolling_class.company }}</abbr></a>
<a href="{% url 'filtered' _filter="company" search=d.rolling_class.company.safe_name %}"><abbr title="{{ d.rolling_class.company.extended_name }}">{{ d.rolling_class.company }}</abbr></a>
</td>
</tr>
<tr>
@@ -56,12 +56,12 @@
<tr>
<th width="35%" scope="row">Manufacturer</th>
<td>{%if d.manufacturer %}
<a href="{% url 'filtered' _filter="manufacturer" search=d.manufacturer.pk %}">{{ d.manufacturer }}{% if d.manufacturer.website %}</a> <a href="{{ d.manufacturer.website }}" target="_blank"><i class="bi bi-box-arrow-up-right"></i></a>{% endif %}
<a href="{% url 'filtered' _filter="manufacturer" search=d.manufacturer.safe_name %}">{{ d.manufacturer }}{% if d.manufacturer.website %}</a> <a href="{{ d.manufacturer.website }}" target="_blank"><i class="bi bi-box-arrow-up-right"></i></a>{% endif %}
{% endif %}</td>
</tr>
<tr>
<th scope="row">Scale</th>
<td><a href="{% url 'filtered' _filter="scale" search=d.scale.pk %}"><abbr title="{{ d.scale.ratio }} - {{ d.scale.tracks }}">{{ d.scale }}</abbr></a></td>
<td><a href="{% url 'filtered' _filter="scale" search=d.scale.safe_name %}"><abbr title="{{ d.scale.ratio }} - {{ d.scale.tracks }}">{{ d.scale }}</abbr></a></td>
</tr>
<tr>
<th scope="row">SKU</th>

View File

@@ -42,7 +42,7 @@
</tbody>
</table>
<div class="d-grid gap-2 mb-1 d-md-block">
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="company" search=d.pk %}">Show all rolling stock</a>
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="company" search=d.safe_name %}">Show all rolling stock</a>
{% if request.user.is_staff %}<a class="btn btn-sm btn-outline-danger" href="{% url 'admin:metadata_company_change' d.pk %}">Edit</a>{% endif %}
</div>
</div>

View File

@@ -34,7 +34,7 @@
</tbody>
</table>
<div class="d-grid gap-2 mb-1 d-md-block">
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="manufacturer" search=d.pk %}">Show all rolling stock</a>
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="manufacturer" search=d.safe_name %}">Show all rolling stock</a>
{% if request.user.is_staff %}<a class="btn btn-sm btn-outline-danger" href="{% url 'admin:metadata_manufacturer_change' d.pk %}">Edit</a>{% endif %}
</div>
</div>

View File

@@ -32,7 +32,7 @@
</tbody>
</table>
<div class="d-grid gap-2 mb-1 d-md-block">
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="scale" search=d.pk %}">Show all rolling stock</a>
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="scale" search=d.safe_name %}">Show all rolling stock</a>
{% if request.user.is_staff %}<a class="btn btn-sm btn-outline-danger" href="{% url 'admin:metadata_scale_change' d.pk %}">Edit</a>{% endif %}
</div>
</div>

View File

@@ -24,7 +24,7 @@
</tbody>
</table>
<div class="d-grid gap-2 mb-1 d-md-block">
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="type" search=d.pk %}">Show all rolling stock</a>
<a class="btn btn-sm btn-outline-primary" href="{% url 'filtered' _filter="type" search=d.safe_name %}">Show all rolling stock</a>
{% if request.user.is_staff %}<a class="btn btn-sm btn-outline-danger" href="{% url 'admin:metadata_scale_change' d.pk %}">Edit</a>{% endif %}
</div>
</div>

View File

@@ -1,7 +1,7 @@
import base64
import operator
from functools import reduce
from urllib.parse import unquote_plus
from urllib.parse import unquote
from django.views import View
from django.http import Http404, HttpResponseBadRequest
@@ -174,20 +174,31 @@ class GetRosterFiltered(View):
def run_filter(self, request, search, _filter, page=1):
site_conf = get_site_conf()
if _filter == "type":
title = get_object_or_404(RollingStockType, pk=search)
query = Q(rolling_class__type__pk=search)
elif _filter == "company":
title = get_object_or_404(Company, pk=search)
query = Q(rolling_class__company__pk=search)
elif _filter == "manufacturer":
title = Manufacturer.objects.get(pk=search)
type_ = " ".join(search.split()[:-1])
category = search.split()[-1]
try:
title = (
RollingStockType.objects.filter(type__iexact=type_)
.get(category__iexact=category)
)
except ObjectDoesNotExist:
raise Http404
query = Q(
Q(rolling_class__manufacturer__pk=search)
| Q(manufacturer__pk=search)
Q(rolling_class__type__type__iexact=type_)
& Q(rolling_class__type__category__iexact=category)
)
elif _filter == "company":
title = get_object_or_404(Company, name__iexact=search)
query = Q(rolling_class__company__name__iexact=search)
elif _filter == "manufacturer":
title = get_object_or_404(Manufacturer, name__iexact=search)
query = Q(
Q(rolling_class__manufacturer__name__iexact=search)
| Q(manufacturer__name__iexact=search)
)
elif _filter == "scale":
title = get_object_or_404(Scale, pk=search)
query = Q(scale__pk=search)
title = get_object_or_404(Scale, scale__iexact=search)
query = Q(scale__scale__iexact=search)
elif _filter == "tag":
title = get_object_or_404(Tag, slug=search)
query = Q(tags__slug__iexact=search)
@@ -211,7 +222,7 @@ class GetRosterFiltered(View):
def get(self, request, search, _filter, page=1):
data, title, matches, page_range = self.run_filter(
request, search, _filter, page
request, unquote(search), _filter, page
)
return render(

View File

@@ -1,4 +1,4 @@
from ram.utils import git_suffix
__version__ = "0.1.1"
__version__ = "0.1.2"
__version__ += git_suffix(__file__)