-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
266 lines (230 loc) · 11 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
from flask import Flask, request, jsonify, render_template
from flask_cors import CORS
from datetime import datetime
app = Flask(__name__, template_folder="templates")
CORS(app)
app.config['encoding'] = 'UTF-8'
from werkzeug.utils import secure_filename
import mysql.connector, os, time
class centroNovedades:
#Constructor de la clase centroNovedades
def __init__(self, host, user, password, database):
#Establece una conexión sin especificar la base de datos
self.conn = mysql.connector.connect(
host=host,
user=user,
password=password
)
self.cursor = self.conn.cursor()
#Intenta seleccionar la base de datos
try:
self.cursor.execute(f"USE {database}")
except mysql.connector.Error as err:
#Si la base de datos no existe, la crea
if err.errno == mysql.connector.errorcode.ER_BAD_DB_ERROR:
self.cursor.execute(f"CREATE DATABASE {database}")
self.conn.database = database
else:
raise err
# Si la tabla 'novedades' no existe, la crea
self.cursor.execute('''CREATE TABLE IF NOT EXISTS novedades (
codigo INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(255) NOT NULL,
descripcion TEXT NOT NULL,
imagen_url VARCHAR(255) NOT NULL,
fechaCreacion DATETIME NOT NULL)''')
self.conn.commit()
#Cierra el cursor inicial y abrir uno nuevo con parámetro dictorionary=True
self.cursor.close()
self.cursor = self.conn.cursor(dictionary=True)
#----------------------------------------------------------------
def agregar_novedad(self, titulo, descripcion, imagen, fechaCreacion):
#En caso de no subirse una imagen, se utiliza una predetemrinada.
if not imagen:
imagen = 'imagen-predeterminada-novedad.png'
sql = "INSERT INTO novedades (titulo, descripcion, imagen_url, fechaCreacion) VALUES (%s, %s, %s, %s)"
valores = (titulo, descripcion, imagen, fechaCreacion)
self.cursor.execute(sql, valores)
self.conn.commit()
return True
#----------------------------------------------------------------
# def consultar_novedad(self, codigo):
# # Consulta una novedad a partir de su código
# self.cursor.execute(f"SELECT * FROM novedades WHERE codigo = {codigo}")
# return self.cursor.fetchone()
def consultar_novedad(self, codigo):
if codigo is not None:
self.cursor.execute(f"SELECT * FROM novedades WHERE codigo = {codigo}")
return self.cursor.fetchone()
else:
return None
#----------------------------------------------------------------
def modificar_novedad(self, codigo, nuevo_titulo, nueva_descripcion):
sql = "UPDATE novedades SET titulo = %s, descripcion = %s WHERE codigo = %s"
valores = (nuevo_titulo, nueva_descripcion, codigo)
self.cursor.execute(sql, valores)
self.conn.commit()
return self.cursor.rowcount > 0
#----------------------------------------------------------------
def listar_novedades(self):
self.cursor.execute("SELECT * FROM novedades")
novedades = self.cursor.fetchall()
return novedades
#----------------------------------------------------------------
def eliminar_novedad(self, codigo):
# Elimina una novedad de la tabla a partir de su código
self.cursor.execute(f"DELETE FROM novedades WHERE codigo = {codigo}")
self.conn.commit()
return self.cursor.rowcount > 0
#----------------------------------------------------------------
def mostrar_novedad(self, codigo):
# Muestra los datos de un novedad a partir de su código
novedad = self.consultar_novedad(codigo)
if novedad:
print("-" * 40)
print(f"Código...........: {novedad['codigo']}")
print(f"Título...........: {novedad['titulo']}")
print(f"Descripción......: {novedad['descripcion']}")
print(f"Imagen...........: {novedad['imagen_url']}")
print(f"Fecha de creación: {novedad['fechaCreacion']}")
print("-" * 40)
else:
print("Novedad no encontrada.")
#--------------------------------------------------------------------
#--------------------------------------------------------------------
# Crea una instancia de la clase centroNovedades
catalogoNovedades = centroNovedades(host='localhost', user='root', password='', database='itsc')
@app.route("/")
def index():
return render_template("index.html")
# Carpeta para guardar las imagenes
RUTA_DESTINO = './static/imagenes-novedades/'
@app.route("/novedades", methods=["GET"])
def listar_novedades():
novedades = catalogoNovedades.listar_novedades()
return jsonify(novedades)
@app.route("/novedades/<int:codigo>", methods=["GET"])
def mostrar_novedad(codigo):
novedad = catalogoNovedades.consultar_novedad(codigo)
print("Novedad object:", novedad)
if novedad:
return render_template("mostrar-novedad.html", novedad=novedad)
else:
return "Novedad no encontrada", 404
@app.route('/novedades', methods=['POST'])
def agregar_novedad():
codigo = request.form.get('codigo')
titulo = request.form['titulo']
descripcion = request.form['descripcion']
# Usamos get en caso de que 'imagen' no este presente
imagen = request.files.get('imagen')
# Verifica la existencia de la novedad
novedad = catalogoNovedades.consultar_novedad(codigo)
if not novedad: # Si la novedad no existe
# Genera el nombre de la imagen o usa el predeterminado
if imagen:
nombre_imagen = secure_filename(imagen.filename)
nombre_base, extension = os.path.splitext(nombre_imagen)
nombre_imagen = f"{nombre_base}_{int(time.time())}{extension}"
else:
nombre_imagen = 'imagen-predeterminada-novedad.png'
# Obtiene la fecha y hora actual
fecha_creacion = datetime.now()
if catalogoNovedades.agregar_novedad(titulo, descripcion, nombre_imagen, fecha_creacion):
if imagen:
imagen.save(os.path.join(RUTA_DESTINO, nombre_imagen))
return jsonify({"mensaje": "Novedad agregada"}), 201
else:
return jsonify({"mensaje": "Novedad ya existe"}), 400
#--------------------------------------------------------------------
@app.route("/novedades/<int:codigo>/editar", methods=["GET", "PUT"])
def editar_novedad(codigo):
print(f'Solicitud PUT recibida para la novedad con código {codigo}')
if request.method == "GET":
# Muestra la plantilla de edición de novedad con los datos actuales
novedad = catalogoNovedades.consultar_novedad(codigo)
if novedad:
return render_template("editar-novedad.html", novedad=novedad)
else:
return jsonify({"mensaje": "Novedad no encontrada"}), 403
elif request.method == "PUT":
# Agarra los datos del formulario
nuevo_titulo = request.json.get("titulo")
nueva_descripcion = request.json.get("descripcion")
# imagen = request.files.get('imagen') # Usa get en lugar de ['imagen']
# nombre_imagen = ""
# # Procesamiento de la imagen
# if imagen:
# nombre_imagen = secure_filename(imagen.filename)
# nombre_base, extension = os.path.splitext(nombre_imagen)
# nombre_imagen = f"{nombre_base}_{int(time.time())}{extension}"
# imagen.save(os.path.join(RUTA_DESTINO, nombre_imagen))
# # Busca la novedad guardada
# novedad = catalogoNovedades.consultar_novedad(codigo)
# if novedad: # Si existe la novedad
# imagen_vieja = novedad["imagen_url"]
# # Arma la ruta a la imagen
# ruta_imagen = os.path.join(RUTA_DESTINO, imagen_vieja)
# # Y si existe, la borra
# if os.path.exists(ruta_imagen):
# os.remove(ruta_imagen)
if catalogoNovedades.modificar_novedad(codigo, nuevo_titulo, nueva_descripcion):
return jsonify({"mensaje": "Novedad modificada"}), 200
else:
return jsonify({"mensaje": "Novedad no encontrada"}), 403
if request.method == "GET":
# Muestra la plantilla de edición de novedad con los datos actuales
novedad = catalogoNovedades.consultar_novedad(codigo)
if novedad:
return render_template("editar-novedad.html", novedad=novedad)
else:
return jsonify({"mensaje": "Novedad no encontrada"}), 403
elif request.method == "PUT":
# Agarra los datos del formulario
nuevo_titulo = request.form.get("titulo")
nueva_descripcion = request.form.get("descripcion")
imagen = request.files.get('imagen') # Usa get en lugar de ['imagen']
nombre_imagen = ""
# Procesamiento de la imagen
if imagen:
nombre_imagen = secure_filename(imagen.filename)
nombre_base, extension = os.path.splitext(nombre_imagen)
nombre_imagen = f"{nombre_base}_{int(time.time())}{extension}"
imagen.save(os.path.join(RUTA_DESTINO, nombre_imagen))
# Busca la novedad guardada
novedad = catalogoNovedades.consultar_novedad(codigo)
if novedad: # Si existe la novedad
imagen_vieja = novedad["imagen_url"]
# Arma la ruta a la imagen
ruta_imagen = os.path.join(RUTA_DESTINO, imagen_vieja)
# Y si existe, la borra
if os.path.exists(ruta_imagen):
os.remove(ruta_imagen)
if catalogoNovedades.modificar_novedad(codigo, nuevo_titulo, nueva_descripcion, nombre_imagen):
return jsonify({"mensaje": "Novedad modificada"}), 200
else:
return jsonify({"mensaje": "Novedad no encontrada"}), 403
#--------------------------------------------------------------------
@app.route("/novedades/<int:codigo>", methods=["DELETE"])
def eliminar_novedad(codigo):
# Busca la novedad guardada
novedad = catalogoNovedades.consultar_novedad(codigo)
if novedad: # Si existe la novedad
imagen_vieja = novedad["imagen_url"]
imagen_predeterminada = 'imagen-predeterminada-novedad.png'
if imagen_vieja != imagen_predeterminada:
# Arma la ruta a la imagen
ruta_imagen = os.path.join(RUTA_DESTINO, imagen_vieja)
# Y si existe la borra
if os.path.exists(ruta_imagen):
os.remove(ruta_imagen)
# Luego, elimina la novedad del catálogo
if catalogoNovedades.eliminar_novedad(codigo):
return jsonify({"mensaje": "Novedad eliminada"}), 200
else:
return jsonify({"mensaje": "Error al eliminar la novedad"}), 500
else:
return jsonify({"mensaje": "Novedad no encontrada"}), 404
#--------------------------------------------------------------------
if __name__ == "__main__":
app.run(debug=True)