Add basic quotes functionality
This commit is contained in:
parent
f8533fc819
commit
b9775ca672
|
@ -35,6 +35,7 @@ ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS', "").split()
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
'main',
|
'main',
|
||||||
'daily_menu',
|
'daily_menu',
|
||||||
|
'lazaro_quotes',
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
'django.contrib.auth',
|
'django.contrib.auth',
|
||||||
'django.contrib.contenttypes',
|
'django.contrib.contenttypes',
|
||||||
|
|
|
@ -21,5 +21,6 @@ from main import views as main_views
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('menu/', include("daily_menu.urls")),
|
path('menu/', include("daily_menu.urls")),
|
||||||
|
path('quotes/', include("lazaro_quotes.urls")),
|
||||||
path('', main_views.index, name="index"),
|
path('', main_views.index, name="index"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from .models import Suggester, Author, Quote, Suggestion
|
||||||
|
|
||||||
# Register your models here.
|
admin.site.register(Suggester)
|
||||||
|
admin.site.register(Author)
|
||||||
|
admin.site.register(Quote)
|
||||||
|
admin.site.register(Suggestion)
|
||||||
|
|
14
web/lazaro_quotes/forms.py
Normal file
14
web/lazaro_quotes/forms.py
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
from django.forms import ModelForm, CharField, EmailField
|
||||||
|
from .models import Suggestion
|
||||||
|
|
||||||
|
|
||||||
|
class SuggestionForm(ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Suggestion
|
||||||
|
fields = ["text", "context", "author_name"]
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
self.fields['suggester_name'] = CharField(label='Tu nombre')
|
||||||
|
self.fields['suggester_email'] = EmailField(label='Tu email')
|
50
web/lazaro_quotes/migrations/0001_initial.py
Normal file
50
web/lazaro_quotes/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# Generated by Django 5.1.3 on 2024-12-02 22:49
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Author',
|
||||||
|
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)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Suggester',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=254)),
|
||||||
|
('email', models.EmailField(max_length=254, unique=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Quote',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('text', models.TextField()),
|
||||||
|
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lazaro_quotes.author')),
|
||||||
|
('suggester', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lazaro_quotes.suggester')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Suggestion',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('text', models.TextField()),
|
||||||
|
('context', models.TextField(blank=True, null=True)),
|
||||||
|
('author_name', models.CharField(max_length=254)),
|
||||||
|
('suggester', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lazaro_quotes.suggester')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,13 +1,39 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Suggester(models.Model):
|
||||||
|
name = models.CharField(max_length=254)
|
||||||
|
email = models.EmailField(max_length=254, unique=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.email
|
||||||
|
|
||||||
|
|
||||||
|
class Author(models.Model):
|
||||||
|
name = models.CharField(max_length=254)
|
||||||
|
slug = models.CharField(max_length=24)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class Quote(models.Model):
|
class Quote(models.Model):
|
||||||
text = models.TextField()
|
text = models.TextField()
|
||||||
quoted_name = models.CharField(null=True, blank=True, max_length=254)
|
author = models.ForeignKey(
|
||||||
|
Author, on_delete=models.CASCADE)
|
||||||
suggester = models.ForeignKey(
|
suggester = models.ForeignKey(
|
||||||
Suggester, on_delete=models.SET_NULL, null=True, blank=True)
|
Suggester, on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.text
|
||||||
|
|
||||||
class Suggester(models.model):
|
|
||||||
name = models.CharField(null=True, blank=True, max_length=254)
|
class Suggestion(models.Model):
|
||||||
email = models.CharField(null=True, blank=True, max_length=254)
|
text = models.TextField()
|
||||||
|
context = models.TextField(null=True, blank=True)
|
||||||
|
author_name = models.CharField(max_length=254)
|
||||||
|
suggester = models.ForeignKey(
|
||||||
|
Suggester, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.text
|
||||||
|
|
17
web/lazaro_quotes/templates/lazaro_quotes/show_quote.html
Normal file
17
web/lazaro_quotes/templates/lazaro_quotes/show_quote.html
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{% extends 'main/base.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="mt-5 container justify-content-center d-flex">
|
||||||
|
<div class="card text-center" style="width: 80rem;">
|
||||||
|
<div class="card-body">
|
||||||
|
<blockquote class="blockquote mb-0">
|
||||||
|
<h1>"{{ quote.text }}"</h1>
|
||||||
|
<footer class="blockquote-footer">
|
||||||
|
<h2>{{ quote.author.name }}</h2>
|
||||||
|
</footer>
|
||||||
|
</blockquote>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
10
web/lazaro_quotes/urls.py
Normal file
10
web/lazaro_quotes/urls.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
from django.urls import path
|
||||||
|
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
app_name = "lazaro_quotes"
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path("", views.show_quote, name="show_quote"),
|
||||||
|
path("suggest", views.suggest_quote_form, name="suggest_quote_form")
|
||||||
|
]
|
|
@ -1,3 +1,32 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render, redirect
|
||||||
|
from django.contrib import messages
|
||||||
|
|
||||||
# Create your views here.
|
from .models import Quote, Suggester
|
||||||
|
from .forms import SuggestionForm
|
||||||
|
|
||||||
|
|
||||||
|
def show_quote(request):
|
||||||
|
quote = Quote.objects.order_by('?').first() or None
|
||||||
|
|
||||||
|
return render(request, 'lazaro_quotes/show_quote.html', {"quote": quote})
|
||||||
|
|
||||||
|
|
||||||
|
def suggest_quote_form(request):
|
||||||
|
if request.method == 'POST':
|
||||||
|
form = SuggestionForm(request.POST)
|
||||||
|
|
||||||
|
if form.is_valid():
|
||||||
|
suggester, created = Suggester.objects.get_or_create(defaults={"name": form.cleaned_data['suggester_name']},
|
||||||
|
email=form.cleaned_data['suggester_email'])
|
||||||
|
|
||||||
|
suggestion = form.save(commit=False)
|
||||||
|
suggestion.suggester = suggester
|
||||||
|
suggestion.save()
|
||||||
|
|
||||||
|
messages.success(
|
||||||
|
request, "Tu sugestión se ha enviado correctamente")
|
||||||
|
return redirect('lazaro_quotes:show_quote')
|
||||||
|
else:
|
||||||
|
form = SuggestionForm()
|
||||||
|
|
||||||
|
return render(request, 'main/show_form.html', {'form_header': '¡Mándanos alguna frase celebre/graciosa que hayas escuchado en la FIC!', 'form': form})
|
||||||
|
|
|
@ -59,8 +59,11 @@
|
||||||
aria-haspopup="true">Lázaro-aaS
|
aria-haspopup="true">Lázaro-aaS
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a class="dropdown-item nav-link" href="">Ver frases</a></li>
|
<li><a class="dropdown-item nav-link" href="{% url 'lazaro_quotes:show_quote' %}">Frase
|
||||||
<li><a class="dropdown-item nav-link" href="">Sugerir frases</a></li>
|
aleatoria</a></li>
|
||||||
|
<li><a class="dropdown-item nav-link"
|
||||||
|
href="{% url 'lazaro_quotes:suggest_quote_form' %}">Sugerir
|
||||||
|
frases</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container col-md-6 mt-5">
|
<div class="container col-md-6 my-5">
|
||||||
<h1 class="text-center">{{ form_header }}</h1>
|
<h1 class="text-center">{{ form_header }}</h1>
|
||||||
<form action="" method="post">
|
<form action="" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
|
|
|
@ -12,7 +12,7 @@ stdout_logfile_maxbytes=0
|
||||||
redirect_stderr=true
|
redirect_stderr=true
|
||||||
|
|
||||||
[program:gunicorn]
|
[program:gunicorn]
|
||||||
command=gunicorn --preload --bind 0.0.0.0:8000 caFICteria_aaS.wsgi
|
command=/bin/sh -c "python3 manage.py migrate --run-syncdb && gunicorn --preload --bind 0.0.0.0:8000 caFICteria_aaS.wsgi"
|
||||||
directory=/app
|
directory=/app
|
||||||
autostart=true
|
autostart=true
|
||||||
autorestart=true
|
autorestart=true
|
||||||
|
|
Loading…
Reference in a new issue