Browse Source

Crea y carga libros

politica
Celestino Rey 1 year ago
parent
commit
275a53e41c
14 changed files with 143 additions and 150 deletions
  1. BIN
      LibrosPy/servicios/instance/uploads/Sunset_Park_-_Paul_Auster_12.epub
  2. BIN
      LibrosPy/servicios/instance/uploads/sunsetpark.jpeg
  3. +2
    -1
      LibrosPy/servicios/libros/models.py
  4. +29
    -9
      LibrosPy/servicios/libros/paginas.py
  5. +14
    -4
      LibrosPy/servicios/libros/templates/add_libro.html
  6. +2
    -2
      LibrosPy/servicios/libros/templates/autor.html
  7. +11
    -3
      LibrosPy/servicios/libros/templates/edit_libro.html
  8. +3
    -55
      LibrosPy/servicios/libros/templates/index.html
  9. +2
    -2
      LibrosPy/servicios/libros/templates/libros.html
  10. +14
    -0
      LibrosPy/servicios/libros/templates/nohayautores.html
  11. +0
    -37
      LibrosPy/servicios/libros/templates/song.html
  12. +32
    -0
      LibrosPy/servicios/migrations/versions/e576e4755d2b_añado_campo_para_albergar_el_epub.py
  13. +34
    -0
      LibrosPy/servicios/migrations/versions/eb0fff06a76e_cambio_fecha_por_año.py
  14. +0
    -37
      RepostajesPy/servicios/repostajes/templates/song.html

BIN
LibrosPy/servicios/instance/uploads/Sunset_Park_-_Paul_Auster_12.epub View File


BIN
LibrosPy/servicios/instance/uploads/sunsetpark.jpeg View File

Before After
Width: 533  |  Height: 800  |  Size: 242 KiB

+ 2
- 1
LibrosPy/servicios/libros/models.py View File

@ -22,9 +22,10 @@ class Autores(db.Model):
class Libros(db.Model):
id = db.Column(db.Integer, primary_key=True)
fecha = db.Column(db.Date, nullable=False)
anno = db.Column(db.String(4), nullable=False)
titulo = db.Column(db.String(100), nullable=False)
portada = db.Column(db.String(100), nullable=True)
epub = db.Column(db.String(100), nullable=True)
autor_id = db.Column(db.Integer, db.ForeignKey('autores.id'), nullable=False)


+ 29
- 9
LibrosPy/servicios/libros/paginas.py View File

@ -54,12 +54,9 @@ def libro(libro_id):
@login_required
def add_libro():
if request.method == 'POST':
fecha> n class="o">= datetime.date.fromisoformat(request.form['fecha'])
anno = request.form['anno']
autor_id = request.form['autor_id']
titulo = request.form['titulo']
if 'portada' not in request.files:
return "Falta el fichero de imagen", 400
portada = request.files['portada']
@ -73,8 +70,21 @@ def add_libro():
portada.save(os.path.join(current_app.config['UPLOAD_FOLDER'], image_filename))
else:
image_filename = None
epub = request.files['epub']
# Verificar que se ha seleccionado un archivo
if epub.filename == '':
return "No selected file", 400
if epub:
epub_filename = secure_filename(epub.filename)
epub.save(os.path.join(current_app.config['UPLOAD_FOLDER'], epub_filename))
else:
epub_filename = None
new_libro = Libros(fecha=fecha, autor_id=autor_id, titulo=titulo, portada=image_filename)
new_libro = Libros(anno=anno, autor_id=autor_id, titulo=titulo, portada=image_filename, epub=epub_filename)
db.session.add(new_libro)
db.session.commit()
@ -82,8 +92,11 @@ def add_libro():
autores = Autores.query.all()
if autores:
return render_template('add_libro.html', autores=autores)
else:
return render_template('nohayautores.html')
return render_template('add_libro.html', autores=autores)
@bp.route('/edit_libro/<int:libro_id>', methods=['GET', 'POST'])
@login_required
@ -91,9 +104,8 @@ def edit_libro(libro_id):
libro = Libros.query.get_or_404(libro_id)
autores = Autores.query.all()
if request.method == 'POST':
libro.fecha = request.form['fecha']
libro.anno = request.form['anno']
libro.autor_id = request.form['autor_id']
libro.titulo = request.form['titulo']
if 'portada' in request.files:
@ -103,7 +115,15 @@ def edit_libro(libro_id):
portada.save(os.path.join(current_app.config['UPLOAD_FOLDER'], image_filename))
libro.portada = image_filename
if 'epub' in request.files:
epub = request.files['epub']
if epub.filename != '':
epub_filename = secure_filename(epub.filename)
epub.save(os.path.join(current_app.config['UPLOAD_FOLDER'], epub_filename))
libro.portada = epub_filename
db.session.commit()
return redirect(url_for('paginas.libro', libro_id=libro.id))


+ 14
- 4
LibrosPy/servicios/libros/templates/add_libro.html View File

@ -4,10 +4,10 @@
<div class="column is-4 is-offset-4">
<h3>Añadir nuevo libro</h3>
<div class="box">
<form method="POST" action="/add_libro">
<form method="POST" enctype="multipart/form-data" action="/add_libro">
<div class="text mb-3">
<label for="fecha">Fecha:</label>
<input class="form-control" type="date" id="fecha" name="fecha" required>
<label for="anno">Año:</label>
<input class="form-control" type="number" id="anno" name="anno" required>
</div>
<div class="text mb-3">
@ -20,10 +20,20 @@
</div>
<div class="text mb-3">
<label for="kms">Título:</label>
<label for="titulo">Título:</label>
<input class="form-control" type="text" id="titulo" name="titulo" required>
</div>
<div class="text mb-3">
<label for="portada">Portada</label>
<input class="form-control" type="file" id="portada" name="portada" required>
</div>
<div class="text mb-3">
<label for="epub">Fichero epub</label>
<input class="form-control" type="file" id="epub" name="epub" required>
</div>
<div class="text mb-3">
<button type="submit" class="btn app-btn-primary w-100 theme-btn mx-auto">Añadir libro</button>
</div>


+ 2
- 2
LibrosPy/servicios/libros/templates/autor.html View File

@ -30,7 +30,7 @@
<thead>
<tr>
<th class="cell">#</th>
<th class="cell">Fecha</th>
<th class="cell">anno</th>
<th class="cell">Título</th>
<th class="cell">Portada</th>
</tr>
@ -39,7 +39,7 @@
{% for libro in libros %}
<tr>
<td class="cell">{{ libro.id }}</td>
<td class="cell">{{ libro.fecha }}</td>
<td class="cell">{{ libro.anno }}</td>
<td class="cell">{{ libro.titulo }}</td>
{% if libro.portada %}
<td class="cell"><img src="{{ url_for('paginas.uploaded_file', filename=libro.portada) }}" alt="{{ autor.apellido }}, {{ autor.nombre}}" style="width:200px;height:200px;"></td>


+ 11
- 3
LibrosPy/servicios/libros/templates/edit_libro.html View File

@ -6,15 +6,15 @@
<div class="box">
<form method="POST" action="{{ url_for('paginas.edit_libro', libro_id=libro.id) }}">
<div class="text mb-3">
<label for="fecha">Fecha:</label>
<input class="form-control" type="date" id="fecha" name="fecha" value="{{ libro.fecha }}" required>
<label for="anno">anno:</label>
<input class="form-control" type="date" id="anno" name="feannocha" value="{{ libro.anno }}" required>
</div>
<div class="text mb-3">
<label for="autor_id">Autor</label>
<select class="form-control" id="autor_id" name="autor_id" required>
{% for autor in autores %}
<option value="{{ autor.id }}" {% if libro.autor_id == autor.id %}selected{% endif %}>{{ libro.fecha }}</option>
<option value="{{ autor.id }}" {% if libro.autor_id == autor.id %}selected{% endif %}>{{ libro.anno }}</option>
{% endfor %}
</select>
</div>
@ -31,6 +31,14 @@
<img src="{{ url_for('paginas.uploaded_file', filename=libro.portada) }}" alt="{{ libro.titulo }}" style="width:100px;height:100px;"><br>
{% endif %}
</div>
<div class="text mb-3">
<label for="epub">Portada</label>
<input class="form-control" type="file" id="epub" name="epub">
{% if libro.portada %}
<img src="{{ url_for('paginas.uploaded_file', filename=libro.epub) }}" alt="{{ libro.titulo }}" style="width:100px;height:100px;"><br>
{% endif %}
</div>
<div class="text mb-3">
<button type="submit" class="btn app-btn-primary w-100 theme-btn mx-auto">Guardar cambios</button>


+ 3
- 55
LibrosPy/servicios/libros/templates/index.html View File

@ -8,13 +8,7 @@
<nav id="orders-table-tab" class="orders-table-tab app-nav-tabs nav shadow-sm flex-column flex-sm-row mb-4">
<a class="flex-sm-fill text-sm-center nav-link active" id="orders-all-tab" data-bs-toggle="tab" href="#orders-all" role="tab" aria-controls="orders-all" aria-selected="true">Todos</a>
{% for cadacoche in autores %}
<a class="flex-sm-fill text-sm-center nav-link" id="orders-paid-tab" data-bs-toggle="tab" href="#{{ cadacoche.matricula }}" role="tab" aria-controls="orders-paid" aria-selected="false">{{ cadacoche.marca }}</a>
{% endfor %}
<a class="flex-sm-fill text-sm-center nav-link" id="orders-pending-tab" data-bs-toggle="tab" href="#autores" role="tab" aria-controls="orders-pending" aria-selected="false">Autores</a>
</nav>
@ -28,7 +22,7 @@
<thead>
<tr>
<th class="cell">#</th>
<th class="cell">Fecha</th>
<th class="cell">anno</th>
<th class="cell">Título</th>
<th class="cell">Autor</th>
<th class="cell">Portada</th>
@ -37,7 +31,7 @@
{% for libro in libros %}
<tr>
<td class="cell">{{ libro.id }}</td>
<td class="cell">{{ libro.fecha }}</td>
<td class="cell">{{ libro.anno }}</td>
<td class="cell">{{ libro.titulo }}</td>
<td class="cell">{{ libro.autores.apellido }}, {{ libro.autores.nombre }}</td>
{% if libro.portada %}
@ -53,53 +47,7 @@
</div><!--//app-card-body-->
</div><!--//app-card-->
</div><!--//tab-pane-->
{% for autor in autores %}
<div class="tab-pane fade" id="{{ autor.apellido }}" role="tabpanel" aria-labelledby="orders-paid-tab">
<div class="app-card app-card-orders-table mb-5">
<div class="app-card-body">
<div class="table-responsive">
<table class="table mb-0 text-left">
<thead>
<tr>
<th class="cell">#</th>
<th class="cell">Fecha</th>
<th class="cell">Título</th>
<th class="cell">Autor</th>
<th class="cell">Portada</th>
</tr>
</thead>
<tbody>
{% for libro in libros %}
{% if libro.autor_id == autor.id %}
<tr>
<td class="cell">{{ libro.id }}</td>
<td class="cell">{{ libro.fecha }}</td>
<td class="cell">{{ libro.titulo }}</td>
<td class="cell">{{ libro.autores.apellido }}, {{ libro.autores.nombre }}</td>
{% if libro.portada %}
<td class="cell"><img src="{{ url_for('paginas.uploaded_file', filename=libro.portada) }}" alt="{{ autor.apellido }}, {{ autor.nombre}}" style="width:200px;height:200px;"></td>
{% else %}
<p>Sin imagen</p>
{% endif %}
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
</div><!--//table-responsive-->
</div><!--//app-card-body-->
</div><!--//app-card-->
</div><!--//tab-pane-->
{% endfor %}
<div class="tab-pane fade" id="autores" role="tabpanel" aria-labelledby="orders-pending-tab">
<div class="app-card app-card-orders-table mb-5">
<div class="app-card-body">


+ 2
- 2
LibrosPy/servicios/libros/templates/libros.html View File

@ -24,7 +24,7 @@
<thead>
<tr>
<th class="cell">#</th>
<th class="cell">Fecha</th>
<th class="cell">anno</th>
<th class="cell">Título</th>
<th class="cell">Autor</th>
<th class="cell">Portada</th>
@ -34,7 +34,7 @@
{% for libro in libros %}
<tr>
<td class="cell">{{ libro.id }}</td>
<td class="cell">{{ libro.fecha }}</td>
<td class="cell">{{ libro.anno }}</td>
<td class="cell">{{ libro.titulo }}</td>
<td class="cell">{{ libro.autores.apellido }}, {{ libro.autores.nombre }}</td>
{% if libro.portada %}


+ 14
- 0
LibrosPy/servicios/libros/templates/nohayautores.html View File

@ -0,0 +1,14 @@
{% extends 'base.html' %}
{% block content %}
<div class="app-card p-5 text-center shadow-sm">
<h1 class="page-title mb-4">Error<br><span class="font-weight-light">No hay autores</span></h1>
<div class="mb-4">
Lo siento, no hay autores por lo que no se puede crear un libro.
</div>
<a class="btn app-btn-primary" href="{{ url_for('paginas.index') }}">Ir a la página de inicio</a>
</div>
{% endblock %}

+ 0
- 37
LibrosPy/servicios/libros/templates/song.html View File

@ -1,37 +0,0 @@
{% extends 'base.html' %}
{% block content %}
<div class="container-xl">
<div class="app-card app-card-notification shadow-sm mb-4">
<div class="app-card-header px-4 py-3">
<div class="row g-3 align-items-center">
<div class="col-12 col-lg-auto text-center text-lg-start">
{% if album.cover_image %}
<p><img src="{{ url_for('paginas.uploaded_file', filename=album.cover_image) }}" alt="{{ album.name }}" style="width:200px;height:200px;"></p>
{% else %}
<p>No hay imágen disponible</p>
{% endif %}
</div><!--//col-->
<div class="col-12 col-lg-auto text-center text-lg-start">
<h4 class="notification-title mb-1">{{ song.title }}</h4>
<ul class="notification-meta list-inline mb-0">
<li class="list-inline-item">{{ song.author }}</li>
<li class="list-inline-item">|</li>
<li class="list-inline-item">{{ song.album.year }}</li>
<li class="list-inline-item">|</li>
<li class="list-inline-item"><a href="{{ url_for('paginas.album', album_id=song.album.id) }}">{{ song.album.name }}</a></li>
</ul>
</div><!--//col-->
<div class="col-12 col-lg-auto text-center text-lg-start">
<p><a href="{{ url_for('paginas.edit_song', song_id=song.id) }}">Editar</a></p>
</div>
</tr>
</div><!--//row-->
</div><!--//app-card-header-->
<div class="app-card-body p-4">
<pre>{{ song.lyrics }}</pre>
</div><!--//app-card-body-->
</div><!--//app-card-->
{% endblock %}

+ 32
- 0
LibrosPy/servicios/migrations/versions/e576e4755d2b_añado_campo_para_albergar_el_epub.py View File

@ -0,0 +1,32 @@
"""Añado campo para albergar el epub
Revision ID: e576e4755d2b
Revises: eb0fff06a76e
Create Date: 2024-07-31 16:56:33.920059
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'e576e4755d2b'
down_revision = 'eb0fff06a76e'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('libros', schema=None) as batch_op:
batch_op.add_column(sa.Column('epub', sa.String(length=100), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('libros', schema=None) as batch_op:
batch_op.drop_column('epub')
# ### end Alembic commands ###

+ 34
- 0
LibrosPy/servicios/migrations/versions/eb0fff06a76e_cambio_fecha_por_año.py View File

@ -0,0 +1,34 @@
"""Cambio fecha por año
Revision ID: eb0fff06a76e
Revises:
Create Date: 2024-07-31 16:48:14.509488
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'eb0fff06a76e'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('libros', schema=None) as batch_op:
batch_op.add_column(sa.Column('anno', sa.String(length=4), nullable=False))
batch_op.drop_column('fecha')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('libros', schema=None) as batch_op:
batch_op.add_column(sa.Column('fecha', sa.DATE(), nullable=False))
batch_op.drop_column('anno')
# ### end Alembic commands ###

+ 0
- 37
RepostajesPy/servicios/repostajes/templates/song.html View File

@ -1,37 +0,0 @@
{% extends 'base.html' %}
{% block content %}
<div class="container-xl">
<div class="app-card app-card-notification shadow-sm mb-4">
<div class="app-card-header px-4 py-3">
<div class="row g-3 align-items-center">
<div class="col-12 col-lg-auto text-center text-lg-start">
{% if album.cover_image %}
<p><img src="{{ url_for('paginas.uploaded_file', filename=album.cover_image) }}" alt="{{ album.name }}" style="width:200px;height:200px;"></p>
{% else %}
<p>No hay imágen disponible</p>
{% endif %}
</div><!--//col-->
<div class="col-12 col-lg-auto text-center text-lg-start">
<h4 class="notification-title mb-1">{{ song.title }}</h4>
<ul class="notification-meta list-inline mb-0">
<li class="list-inline-item">{{ song.author }}</li>
<li class="list-inline-item">|</li>
<li class="list-inline-item">{{ song.album.year }}</li>
<li class="list-inline-item">|</li>
<li class="list-inline-item"><a href="{{ url_for('paginas.album', album_id=song.album.id) }}">{{ song.album.name }}</a></li>
</ul>
</div><!--//col-->
<div class="col-12 col-lg-auto text-center text-lg-start">
<p><a href="{{ url_for('paginas.edit_song', song_id=song.id) }}">Editar</a></p>
</div>
</tr>
</div><!--//row-->
</div><!--//app-card-header-->
<div class="app-card-body p-4">
<pre>{{ song.lyrics }}</pre>
</div><!--//app-card-body-->
</div><!--//app-card-->
{% endblock %}

Loading…
Cancel
Save