webp support
This commit is contained in:
@@ -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
29
app.py
@@ -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
|
||||
|
@@ -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 %}
|
||||
|
@@ -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>
|
||||
|
40
update_missing_image_data.py
Normal file
40
update_missing_image_data.py
Normal 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()
|
Reference in New Issue
Block a user