diff --git a/app.py b/app.py index 2e02625..9c8c926 100644 --- a/app.py +++ b/app.py @@ -839,15 +839,27 @@ def delete_user(user_id): flash('Użytkownik usunięty', 'success') return redirect(url_for('list_users')) -@app.route('/admin/receipts') +@app.route('/admin/receipts/') @login_required @admin_required -def admin_receipts(): +def admin_receipts(id): all_files = os.listdir(app.config['UPLOAD_FOLDER']) image_files = [f for f in all_files if allowed_file(f)] + + if id == "all": + filtered_files = image_files + else: + try: + list_id = int(id) + receipt_prefix = f"list_{list_id}_" + filtered_files = [f for f in image_files if f.startswith(receipt_prefix)] + except ValueError: + flash("Nieprawidłowe ID listy.", "danger") + return redirect(url_for('admin_panel')) + return render_template( 'admin/receipts.html', - image_files=image_files, + image_files=filtered_files, upload_folder=app.config['UPLOAD_FOLDER'] ) @@ -861,6 +873,10 @@ def delete_receipt(filename): flash('Plik usunięty', 'success') else: flash('Plik nie istnieje', 'danger') + + next_url = request.args.get('next') + if next_url: + return redirect(next_url) return redirect(url_for('admin_receipts')) @app.route('/admin/delete_selected_lists', methods=['POST']) @@ -879,16 +895,6 @@ def delete_selected_lists(): flash('Usunięto wybrane listy', 'success') return redirect(url_for('admin_panel')) -@app.route('/admin/archive_list/') -@login_required -@admin_required -def archive_list(list_id): - l = ShoppingList.query.get_or_404(list_id) - l.is_archived = True - db.session.commit() - flash('Lista oznaczona jako archiwalna', 'success') - return redirect(url_for('admin_panel')) - @app.route('/admin/delete_all_items') @login_required @admin_required @@ -905,55 +911,115 @@ def edit_list(list_id): l = ShoppingList.query.get_or_404(list_id) expenses = Expense.query.filter_by(list_id=list_id).all() total_expense = sum(e.amount for e in expenses) - users = User.query.all() + items = Item.query.filter_by(list_id=list_id).order_by(Item.id.desc()).all() + + # Pobranie listy plików paragonów + receipt_pattern = f"list_{list_id}_" + all_files = os.listdir(app.config['UPLOAD_FOLDER']) + receipts = [f for f in all_files if f.startswith(receipt_pattern)] if request.method == 'POST': - new_title = request.form.get('title') - new_amount_str = request.form.get('amount') - is_archived = 'archived' in request.form - new_owner_id = request.form.get('owner_id') + action = request.form.get('action') - if new_title and new_title.strip(): - l.title = new_title.strip() + if action == 'save': + new_title = request.form.get('title', '').strip() + new_amount_str = request.form.get('amount') + is_archived = 'archived' in request.form + is_public = 'public' in request.form + new_owner_id = request.form.get('owner_id') - l.is_archived = is_archived + if new_title: + l.title = new_title - if new_owner_id: - try: - new_owner_id_int = int(new_owner_id) - if User.query.get(new_owner_id_int): - l.owner_id = new_owner_id_int - else: - flash('Wybrany użytkownik nie istnieje', 'danger') + l.is_archived = is_archived + l.is_public = is_public + + if new_owner_id: + try: + new_owner_id_int = int(new_owner_id) + if User.query.get(new_owner_id_int): + l.owner_id = new_owner_id_int + else: + flash('Wybrany użytkownik nie istnieje', 'danger') + return redirect(url_for('edit_list', list_id=list_id)) + except ValueError: + flash('Niepoprawny ID użytkownika', 'danger') return redirect(url_for('edit_list', list_id=list_id)) - except ValueError: - flash('Niepoprawny ID użytkownika', 'danger') - return redirect(url_for('edit_list', list_id=list_id)) - if new_amount_str: - try: - new_amount = float(new_amount_str) - - if expenses: + if new_amount_str: + try: + new_amount = float(new_amount_str) for expense in expenses: db.session.delete(expense) db.session.commit() + new_expense = Expense(list_id=list_id, amount=new_amount) + db.session.add(new_expense) + db.session.commit() + except ValueError: + flash('Niepoprawna kwota', 'danger') + return redirect(url_for('edit_list', list_id=list_id)) - new_expense = Expense(list_id=list_id, amount=new_amount) - db.session.add(new_expense) - db.session.commit() - flash('Zaktualizowano tytuł, właściciela, archiwizację i/lub kwotę wydatku', 'success') - except ValueError: - flash('Niepoprawna kwota', 'danger') - return redirect(url_for('edit_list', list_id=list_id)) - else: db.session.commit() - flash('Zaktualizowano tytuł, właściciela i/lub archiwizację', 'success') + flash('Zapisano zmiany listy', 'success') + return redirect(url_for('edit_list', list_id=list_id)) - return redirect(url_for('admin_panel')) + elif action == 'add_item': + item_name = request.form.get('item_name', '').strip() + quantity_str = request.form.get('quantity', '1') + if not item_name: + flash('Podaj nazwę produktu', 'danger') + return redirect(url_for('edit_list', list_id=list_id)) - return render_template('admin/edit_list.html', list=l, total_expense=total_expense, users=users) + try: + quantity = int(quantity_str) + if quantity < 1: + quantity = 1 + except ValueError: + quantity = 1 + + new_item = Item(list_id=list_id, name=item_name, quantity=quantity, added_by=current_user.id) + db.session.add(new_item) + + if not SuggestedProduct.query.filter(func.lower(SuggestedProduct.name) == item_name.lower()).first(): + db.session.add(SuggestedProduct(name=item_name)) + + db.session.commit() + flash('Dodano produkt', 'success') + return redirect(url_for('edit_list', list_id=list_id)) + + elif action == 'delete_item': + item_id = request.form.get('item_id') + item = Item.query.get(item_id) + if item and item.list_id == list_id: + db.session.delete(item) + db.session.commit() + flash('Usunięto produkt', 'success') + else: + flash('Nie znaleziono produktu', 'danger') + return redirect(url_for('edit_list', list_id=list_id)) + + elif action == 'toggle_purchased': + item_id = request.form.get('item_id') + item = Item.query.get(item_id) + if item and item.list_id == list_id: + item.purchased = not item.purchased + db.session.commit() + flash('Zmieniono status oznaczenia produktu', 'success') + else: + flash('Nie znaleziono produktu', 'danger') + return redirect(url_for('edit_list', list_id=list_id)) + + # Przekazanie receipts do szablonu + return render_template( + 'admin/edit_list.html', + list=l, + total_expense=total_expense, + users=users, + items=items, + receipts=receipts, + upload_folder=app.config['UPLOAD_FOLDER'] + ) @app.route('/admin/products') @login_required @@ -974,7 +1040,6 @@ def list_products(): suggestions_dict=suggestions_dict ) - @app.route('/admin/sync_suggestion/', methods=['POST']) @login_required def sync_suggestion_ajax(item_id): diff --git a/static/css/style.css b/static/css/style.css index 67f9cae..878f7e0 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -186,11 +186,12 @@ input.form-control { box-sizing: border-box; } -@media (max-width: 600px) { +@media (max-width: 768px) { .info-bar-fixed { + position: static; font-size: 0.85rem; padding: 8px 4px; - border-radius: 10px 10px 0 0; + border-radius: 0; } } diff --git a/templates/admin/admin_panel.html b/templates/admin/admin_panel.html index 474f604..44624a7 100644 --- a/templates/admin/admin_panel.html +++ b/templates/admin/admin_panel.html @@ -20,7 +20,7 @@ 👥 Zarządzanie użytkownikami