diff --git a/dailystone/templates/dailystone/search.html b/dailystone/templates/dailystone/search.html
new file mode 100644
index 0000000..4cba2ac
--- /dev/null
+++ b/dailystone/templates/dailystone/search.html
@@ -0,0 +1,220 @@
+
+
+
+
{% if mineral.image_urls %}
@@ -431,6 +528,9 @@
Read more on Wikipedia →
{% endif %}
+ {% if total_minerals %}
+
{{ total_minerals }} minerals in collection
+ {% endif %}
k-boris.tech
diff --git a/dailystone/urls.py b/dailystone/urls.py
index cdd5e88..91654bd 100644
--- a/dailystone/urls.py
+++ b/dailystone/urls.py
@@ -7,4 +7,6 @@ app_name = 'dailystone'
urlpatterns = [
path('', views.daily_stone, name='daily_stone'),
path('random/', views.random_stone, name='random_stone'),
+ path('search/', views.search_minerals, name='search'),
+ path('mineral/
/', views.mineral_detail, name='mineral_detail'),
]
diff --git a/dailystone/views.py b/dailystone/views.py
index b4810a5..1945ac0 100644
--- a/dailystone/views.py
+++ b/dailystone/views.py
@@ -1,11 +1,14 @@
from datetime import date
-from django.shortcuts import render, redirect
-from django.urls import reverse
+from django.shortcuts import render, redirect, get_object_or_404
from .models import Mineral
+def _base_context():
+ return {'total_minerals': Mineral.objects.count()}
+
+
def daily_stone(request):
today = date.today()
day = today.timetuple().tm_yday
@@ -14,11 +17,9 @@ def daily_stone(request):
if total == 0:
return render(request, 'dailystone/stone.html', {'mineral': None})
- # Wrap around if we have fewer minerals than days in the year
index = (day - 1) % total + 1
mineral = Mineral.objects.filter(day_of_year=index).first()
- # Fallback: pick by modulo of pk list
if not mineral:
minerals = list(Mineral.objects.all())
mineral = minerals[(day - 1) % len(minerals)]
@@ -26,6 +27,7 @@ def daily_stone(request):
return render(request, 'dailystone/stone.html', {
'mineral': mineral,
'today': today,
+ **_base_context(),
})
@@ -37,4 +39,31 @@ def random_stone(request):
'mineral': mineral,
'today': date.today(),
'is_random': True,
+ **_base_context(),
+ })
+
+
+def mineral_detail(request, pk):
+ mineral = get_object_or_404(Mineral, pk=pk)
+ return render(request, 'dailystone/stone.html', {
+ 'mineral': mineral,
+ 'today': date.today(),
+ **_base_context(),
+ })
+
+
+def search_minerals(request):
+ query = request.GET.get('q', '').strip()
+ if not query:
+ return redirect('dailystone:daily_stone')
+
+ results = Mineral.objects.filter(name__icontains=query)
+
+ if results.count() == 1:
+ return redirect('dailystone:mineral_detail', pk=results.first().pk)
+
+ return render(request, 'dailystone/search.html', {
+ 'query': query,
+ 'results': results,
+ **_base_context(),
})