From beec22f40a4a911ef83c6072a2b9ccf92034695c Mon Sep 17 00:00:00 2001 From: Pedro Rey Anca Date: Tue, 3 Dec 2024 13:16:35 +0100 Subject: [PATCH 1/3] Author slug should be unique --- web/lazaro_quotes/migrations/0001_initial.py | 4 ++-- web/lazaro_quotes/models.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/lazaro_quotes/migrations/0001_initial.py b/web/lazaro_quotes/migrations/0001_initial.py index 0bc555d..978e1f0 100644 --- a/web/lazaro_quotes/migrations/0001_initial.py +++ b/web/lazaro_quotes/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.3 on 2024-12-02 22:49 +# Generated by Django 5.1.3 on 2024-12-03 12:13 import django.db.models.deletion from django.db import migrations, models @@ -17,7 +17,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=254)), - ('slug', models.CharField(max_length=24)), + ('slug', models.CharField(max_length=24, unique=True)), ], ), migrations.CreateModel( diff --git a/web/lazaro_quotes/models.py b/web/lazaro_quotes/models.py index 37089b9..5b90ef7 100644 --- a/web/lazaro_quotes/models.py +++ b/web/lazaro_quotes/models.py @@ -11,7 +11,7 @@ class Suggester(models.Model): class Author(models.Model): name = models.CharField(max_length=254) - slug = models.CharField(max_length=24) + slug = models.CharField(max_length=24, unique=True) def __str__(self): return self.name From 9a66ba03144260b5e4e9d7382a105fcd08f0f27d Mon Sep 17 00:00:00 2001 From: Pedro Rey Anca Date: Tue, 3 Dec 2024 13:26:53 +0100 Subject: [PATCH 2/3] Allow to filter quotes by author slug --- web/lazaro_quotes/urls.py | 1 + web/lazaro_quotes/views.py | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/web/lazaro_quotes/urls.py b/web/lazaro_quotes/urls.py index ab3b90f..a94e1e0 100644 --- a/web/lazaro_quotes/urls.py +++ b/web/lazaro_quotes/urls.py @@ -6,5 +6,6 @@ app_name = "lazaro_quotes" urlpatterns = [ path("", views.show_quote, name="show_quote"), + path("", views.show_quote, name="show_quote"), path("suggest", views.suggest_quote_form, name="suggest_quote_form") ] diff --git a/web/lazaro_quotes/views.py b/web/lazaro_quotes/views.py index b04edbd..8ffb091 100644 --- a/web/lazaro_quotes/views.py +++ b/web/lazaro_quotes/views.py @@ -5,8 +5,12 @@ from .models import Quote, Suggester from .forms import SuggestionForm -def show_quote(request): - quote = Quote.objects.order_by('?').first() or None +def show_quote(request, author_slug=None): + if author_slug is None: + quote = Quote.objects.order_by('?').first() + else: + quote = Quote.objects.filter( + author__slug=author_slug).order_by('?').first() return render(request, 'lazaro_quotes/show_quote.html', {"quote": quote}) From aabd1c301a4dfb0b780ce93cb91013b6f0588254 Mon Sep 17 00:00:00 2001 From: Pedro Rey Anca Date: Wed, 4 Dec 2024 12:59:28 +0100 Subject: [PATCH 3/3] Add JSON endpoints --- web/lazaro_quotes/models.py | 9 +++++++++ web/lazaro_quotes/urls.py | 3 +++ web/lazaro_quotes/views.py | 22 ++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/web/lazaro_quotes/models.py b/web/lazaro_quotes/models.py index 5b90ef7..c7bb352 100644 --- a/web/lazaro_quotes/models.py +++ b/web/lazaro_quotes/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.forms.models import model_to_dict class Suggester(models.Model): @@ -27,6 +28,14 @@ class Quote(models.Model): def __str__(self): return self.text + def as_dict(self): + result = model_to_dict(self, fields=["text"]) + result["author"] = model_to_dict(self.author, exclude=["id"]) + result["suggester"] = model_to_dict( + self.suggester, exclude=["id"]) if self.suggester else None + + return result + class Suggestion(models.Model): text = models.TextField() diff --git a/web/lazaro_quotes/urls.py b/web/lazaro_quotes/urls.py index a94e1e0..85467e5 100644 --- a/web/lazaro_quotes/urls.py +++ b/web/lazaro_quotes/urls.py @@ -6,6 +6,9 @@ app_name = "lazaro_quotes" urlpatterns = [ path("", views.show_quote, name="show_quote"), + path("json", views.get_quote_json, name="get_quote_json"), + path("all/json", views.get_all_quotes_json, name="get_all_quotes_json"), path("", views.show_quote, name="show_quote"), + path("/json", views.get_quote_json, name="get_quote_json"), path("suggest", views.suggest_quote_form, name="suggest_quote_form") ] diff --git a/web/lazaro_quotes/views.py b/web/lazaro_quotes/views.py index 8ffb091..41a7aec 100644 --- a/web/lazaro_quotes/views.py +++ b/web/lazaro_quotes/views.py @@ -1,5 +1,7 @@ from django.shortcuts import render, redirect from django.contrib import messages +from django.forms.models import model_to_dict +from django.http import JsonResponse from .models import Quote, Suggester from .forms import SuggestionForm @@ -15,6 +17,26 @@ def show_quote(request, author_slug=None): return render(request, 'lazaro_quotes/show_quote.html', {"quote": quote}) +def get_quote_json(request, author_slug=None): + if author_slug is None: + quote = Quote.objects.order_by('?').first() + else: + quote = Quote.objects.filter( + author__slug=author_slug).order_by('?').first() + + return JsonResponse(quote.as_dict()) + + +def get_all_quotes_json(request): + quotes = Quote.objects.all() + + result = {} + for i, quote in enumerate(quotes): + result[i] = quote.as_dict() + + return JsonResponse(result) + + def suggest_quote_form(request): if request.method == 'POST': form = SuggestionForm(request.POST)