webp support

This commit is contained in:
Mateusz Gruszczyński
2025-07-20 17:34:21 +02:00
parent 470cd32745
commit 3ebb364322
6 changed files with 73 additions and 20 deletions

View File

@@ -46,3 +46,6 @@ CREATE TABLE receipt (
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (list_id) REFERENCES shopping_list(id)
);
ALTER TABLE receipt ADD COLUMN filesize INTEGER;

29
app.py
View File

@@ -147,9 +147,8 @@ class Receipt(db.Model):
list_id = db.Column(db.Integer, db.ForeignKey("shopping_list.id"), nullable=False)
filename = db.Column(db.String(255), nullable=False)
uploaded_at = db.Column(db.DateTime, default=datetime.utcnow)
shopping_list = db.relationship("ShoppingList", backref="receipts", lazy=True)
filesize = db.Column(db.Integer, nullable=True)
with app.app_context():
db.create_all()
@@ -298,6 +297,7 @@ def delete_receipts_for_list(list_id):
print(f"Nie udało się usunąć pliku {filename}: {e}")
# zabezpieczenie logowani do systemu - błędne hasła
def is_ip_blocked(ip):
now = time.time()
@@ -935,6 +935,7 @@ def upload_receipt(list_id):
return redirect(request.referrer) """
from datetime import datetime
@app.route("/upload_receipt/<int:list_id>", methods=["POST"])
def upload_receipt(list_id):
@@ -953,7 +954,15 @@ def upload_receipt(list_id):
save_resized_image(file, file_path)
new_receipt = Receipt(list_id=list_id, filename=webp_filename)
filesize = os.path.getsize(file_path) if os.path.exists(file_path) else None
uploaded_at = datetime.utcnow()
new_receipt = Receipt(
list_id=list_id,
filename=webp_filename,
filesize=filesize,
uploaded_at=uploaded_at
)
db.session.add(new_receipt)
db.session.commit()
@@ -967,12 +976,6 @@ def upload_receipt(list_id):
return _receipt_error("Niedozwolony format pliku")
def _receipt_error(message):
if request.is_json or request.headers.get("X-Requested-With") == "XMLHttpRequest":
return jsonify({"success": False, "message": message}), 400
flash(message, "danger")
return redirect(request.referrer)
@app.route("/uploads/<filename>")
@@ -1195,9 +1198,6 @@ def delete_user(user_id):
flash("Użytkownik usunięty", "success")
return redirect(url_for("list_users"))
import os
@app.route("/admin/receipts/<id>")
@login_required
@admin_required
@@ -1216,14 +1216,9 @@ def admin_receipts(id):
flash("Nieprawidłowe ID listy.", "danger")
return redirect(url_for("admin_panel"))
for r in receipts:
path = os.path.join(app.config["UPLOAD_FOLDER"], r.filename)
r.filesize = os.path.getsize(path) if os.path.exists(path) else 0
return render_template("admin/receipts.html", receipts=receipts)
@app.route("/admin/delete_receipt/<filename>")
@login_required
@admin_required

View File

@@ -202,13 +202,24 @@
</a>
<div class="card-body text-center">
<p class="small text-truncate mb-1">{{ r.filename }}</p>
{% if r.filesize and r.filesize >= 1024 * 1024 %}
<p class="small mb-1">Rozmiar: {{ (r.filesize / 1024 / 1024) | round(2) }} MB</p>
{% elif r.filesize %}
<p class="small mb-1">Rozmiar: {{ (r.filesize / 1024) | round(1) }} kB</p>
{% else %}
<p class="small mb-1 text-muted">Rozmiar nieznany</p>
{% endif %}
<p class="small mb-1">Wgrano: {{ r.uploaded_at.strftime('%Y-%m-%d %H:%M') }}</p>
<a href="{{ url_for('delete_receipt', filename=r.filename) }}?next={{ url_for('edit_list', list_id=list.id) }}"
class="btn btn-sm btn-outline-danger w-100">🗑️ Usuń</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% if not receipts %}

View File

@@ -21,15 +21,19 @@
<div class="card-body text-center">
<p class="small text-truncate mb-1">{{ r.filename }}</p>
<p class="small mb-1">Wgrano: {{ r.uploaded_at.strftime('%Y-%m-%d %H:%M') }}</p>
{% if r.filesize >= 1024 * 1024 %}
{% if r.filesize and r.filesize >= 1024 * 1024 %}
<p class="small mb-1">Rozmiar: {{ (r.filesize / 1024 / 1024) | round(2) }} MB</p>
{% else %}
{% elif r.filesize %}
<p class="small mb-1">Rozmiar: {{ (r.filesize / 1024) | round(1) }} kB</p>
{% else %}
<p class="small mb-1 text-muted">Brak danych o rozmiarze</p>
{% endif %}
<a href="{{ url_for('edit_list', list_id=r.list_id) }}" class="btn btn-sm btn-outline-light w-100 mb-2">✏️
Edytuj listę #{{ r.list_id }}</a>
<a href="{{ url_for('delete_receipt', filename=r.filename) }}?next={{ request.path }}"
<a href="{{ url_for('delete_receipt', filename=r.filename|urlencode) }}?next={{ request.path }}"
class="btn btn-sm btn-outline-danger w-100">🗑️ Usuń</a>
</div>
</div>
</div>

View File

@@ -0,0 +1,40 @@
import os
from datetime import datetime
from app import app, db, Receipt
def update_missing_receipt_fields():
with app.app_context():
folder = app.config["UPLOAD_FOLDER"]
updated = 0
receipts = Receipt.query.filter(
(Receipt.filesize == None) | (Receipt.filesize == 0) | (Receipt.uploaded_at == None)
).all()
for r in receipts:
path = os.path.join(folder, r.filename)
if not os.path.exists(path):
print(f"Brak pliku: {r.filename}")
continue
changed = False
if not r.filesize:
r.filesize = os.path.getsize(path)
changed = True
print(f"{r.filename} → filesize: {r.filesize} B")
if not r.uploaded_at:
timestamp = os.path.getmtime(path)
r.uploaded_at = datetime.fromtimestamp(timestamp)
changed = True
print(f"{r.filename} → uploaded_at: {r.uploaded_at}")
if changed:
updated += 1
db.session.commit()
print(f"\nZaktualizowano {updated} rekordów.")
if __name__ == "__main__":
update_missing_receipt_fields()