Add a draft tag to unpublished items and minor improvements (#46)

* Add a draft tag to unpublished items

* Add X-Cache-Hit header

* Expose decoder interface in roster cards

* Manage decoder interface set to None
This commit is contained in:
2025-01-20 18:24:20 +01:00
committed by GitHub
parent f914c79786
commit 0413c1c5ab
11 changed files with 93 additions and 33 deletions

View File

@@ -59,11 +59,15 @@
<table class="table table-striped">
<thead>
<tr>
{% if type == "catalog" %}
<th colspan="2" scope="row">Catalog</th>
{% elif type == "book" %}
<th colspan="2" scope="row">Book</th>
<th colspan="2" scope="row">
{% if type == "catalog" %}Catalog
{% elif type == "book" %}Book{% endif %}
<div class="float-end">
{% if not book.published %}
<span class="badge text-bg-warning">Draft</span>
{% endif %}
</div>
</th>
</tr>
</thead>
<tbody class="table-group-divider">

View File

@@ -23,11 +23,15 @@
<table class="table table-striped">
<thead>
<tr>
{% if d.type == "catalog" %}
<th colspan="2" scope="row">Catalog</th>
{% elif d.type == "book" %}
<th colspan="2" scope="row">Book</th>
<th colspan="2" scope="row">
{% if d.type == "catalog" %}Catalog
{% elif d.type == "book" %}Book{% endif %}
<div class="float-end">
{% if not d.item.published %}
<span class="badge text-bg-warning">Draft</span>
{% endif %}
</div>
</th>
</tr>
</thead>
<tbody class="table-group-divider">

View File

@@ -9,9 +9,11 @@
<tr>
<th colspan="2" scope="row">
Company
<div class="float-end">
{% if d.item.freelance %}
<span class="mt-1 float-end badge text-bg-secondary">Freelance</span>
<span class="badge text-bg-secondary">Freelance</span>
{% endif %}
</div>
</th>
</tr>
</thead>

View File

@@ -26,9 +26,14 @@
<tr>
<th colspan="2" scope="row">
Consist
<div class="float-end">
{% if d.item.company.freelance %}
<span class="mt-1 float-end badge text-bg-secondary">Freelance</span>
<span class="badge text-bg-secondary">Freelance</span>
{% endif %}
{% if not d.item.published %}
<span class="badge text-bg-warning">Draft</span>
{% endif %}
</div>
</th>
</tr>
</thead>

View File

@@ -24,9 +24,14 @@
<tr>
<th colspan="2" scope="row">
Rolling stock
{% if d.item.rolling_class.company.freelance %}
<span class="mt-1 float-end badge text-bg-secondary">Freelance</span>
<div class="float-end">
{% if d.item.company.freelance %}
<span class="badge text-bg-secondary">Freelance</span>
{% endif %}
{% if not d.item.published %}
<span class="badge text-bg-warning">Draft</span>
{% endif %}
</div>
</th>
</tr>
</thead>
@@ -38,7 +43,7 @@
<tr>
<th scope="row">Company</th>
<td>
<a href="{% url 'filtered' _filter="company" search=d.item.rolling_class.company.slug %}"><abbr title="{{ d.item.rolling_class.company.extended_name }}">{{ d.item.rolling_class.company }}</abbr></a>
<a href="{% url 'filtered' _filter="company" search=d.item.company.slug %}"><abbr title="{{ d.item.company.extended_name }}">{{ d.item.company }}</abbr></a>
</td>
</tr>
<tr>
@@ -69,7 +74,7 @@
</tr>
</tbody>
</table>
{% if d.item.decoder %}
{% if d.item.decoder or d.item.decoder_interface %}
<table class="table table-striped">
<thead>
<tr>
@@ -78,13 +83,19 @@
</thead>
<tbody class="table-group-divider">
<tr>
<th class="w-33" scope="row">Decoder</th>
<th class="w-33" scope="row">Interface</th>
<td>{{ d.item.get_decoder_interface }}</td>
</tr>
{% if d.item.decoder %}
<tr>
<th scope="row">Decoder</th>
<td>{{ d.item.decoder }}</td>
</tr>
<tr>
<th scope="row">Address</th>
<td>{{ d.item.address }}</td>
</tr>
{% endif %}
</tbody>
</table>
{% endif %}

View File

@@ -81,9 +81,14 @@
<tr>
<th colspan="2" scope="row">
Consist
<div class="float-end">
{% if consist.company.freelance %}
<span class="mt-1 float-end badge text-bg-secondary">Freelance</span>
<span class="badge text-bg-secondary">Freelance</span>
{% endif %}
{% if not consist.published %}
<span class="badge text-bg-warning">Draft</span>
{% endif %}
</div>
</th>
</tr>
</thead>

View File

@@ -3,10 +3,17 @@
{% block header %}
<small class="text-muted">Updated {{ flatpage.updated_time | date:"M d, Y H:i" }}</small>
{% endblock %}
{% block carousel %}
{% endblock %}
{% block extra_content %}
<section class="py-4 text-start container">
<div class="row">
<div class="mx-auto">
{% if not flatpage.published %}
<div class="alert alert-warning" role="alert">
⚠️ This page is a <strong>draft</strong> and is not published.
</div>
{% endif %}
<div>{{ flatpage.content | safe }} </div>
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
{% if request.user.is_staff %}<a class="btn btn-sm btn-outline-danger" href="{% url 'admin:portal_flatpage_change' flatpage.pk %}">Edit</a>{% endif %}

View File

@@ -75,9 +75,14 @@
<tr>
<th colspan="2" scope="row">
Rolling stock
<div class="mt-1 float-end">
{% if company.freelance %}
<span class="mt-1 float-end badge text-bg-secondary">Freelance</span>
<span class="badge text-bg-secondary">Freelance</span>
{% endif %}
{% if not rolling_stock.published %}
<span class="badge text-bg-warning">Draft</span>
{% endif %}
</div>
</th>
</tr>
</thead>
@@ -145,7 +150,7 @@
<tbody class="table-group-divider">
<tr>
<th class="w-33" scope="row">Interface</th>
<td>{{ rolling_stock.get_decoder_interface_display }}</td>
<td>{{ rolling_stock.get_decoder_interface }}</td>
</tr>
{% if rolling_stock.decoder %}
<tr>
@@ -332,7 +337,7 @@
<tbody class="table-group-divider">
<tr>
<th scope="row">Interface</th>
<td>{{ rolling_stock.get_decoder_interface_display }}</td>
<td>{{ rolling_stock.get_decoder_interface }}</td>
</tr>
<tr>
<th class="w-33" scope="row">Address</th>

View File

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

View File

@@ -1,4 +1,5 @@
from django.utils.cache import add_never_cache_headers
from django.core.cache import cache
from django.utils.cache import add_never_cache_headers, get_cache_key
class DisableClientSideCachingMiddleware:
@@ -7,5 +8,13 @@ class DisableClientSideCachingMiddleware:
def __call__(self, request):
response = self.get_response(request)
# Check if the cache key exists for this request
cache_key = get_cache_key(request)
cache_hit = "MISS"
if cache_key and cache.get(cache_key):
cache_hit = "HIT"
response['X-Cache-Hit'] = cache_hit
add_never_cache_headers(response)
return response

View File

@@ -129,13 +129,21 @@ class RollingStock(BaseModel):
def preview(self):
return self.image.first().image_thumbnail(350)
# similar to get_decoder_interface_display in template render,
# but returns "-" if no decoder interface is set
def get_decoder_interface(self):
return str(
dict(settings.DECODER_INTERFACES).get(self.decoder_interface)
or "-"
)
@property
def country(self):
return self.rolling_class.company.country
@property
def company(self):
return str(self.rolling_class.company)
return self.rolling_class.company
def delete(self, *args, **kwargs):
shutil.rmtree(