From 8238e72e6dd558e1ab6c6d46bf775e859959805d Mon Sep 17 00:00:00 2001
From: Ethan-clay03 <ethanclay2017@gmail.com>
Date: Mon, 27 Jan 2025 19:54:12 +0000
Subject: [PATCH] Create delete booking and fix manage_bookings page for
 standard admins

---
 app/admin/routes.py                      | 19 ++++++++++++++++---
 app/api/routes.py                        |  5 +----
 app/models/listings.py                   | 19 +++++++++++++++++++
 app/templates/admin/manage_bookings.html |  2 +-
 app/templates/base.html                  | 10 ++++++++++
 5 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/app/admin/routes.py b/app/admin/routes.py
index bfb17ee..a82d898 100644
--- a/app/admin/routes.py
+++ b/app/admin/routes.py
@@ -1,5 +1,7 @@
-from flask import render_template, redirect, url_for
+from flask import render_template, redirect, url_for, request, jsonify
+from app import db
 from app import admin_permission, permission_required, super_admin_permission
+from app.models import Listings
 from app.admin import bp
 
 
@@ -28,9 +30,8 @@ def manage_users():
 def manage_user_bookings():
     return render_template('admin/index.html')
 
-
 @bp.route('get_bookings', methods=['GET'])
-@permission_required(super_admin_permission)
+@permission_required(admin_permission)
 def get_bookings():
     query = db.session.query(Listings)
 
@@ -73,3 +74,15 @@ def get_bookings():
     ]
 
     return jsonify(result)
+
+@bp.route('delete_booking', methods=['DELETE'])
+@permission_required(admin_permission)
+def delete_booking():
+    http_code = 400
+    booking_id = request.form.get('id')
+    success = Listings.delete_listing(booking_id)
+
+    if success:
+        http_code = 200
+
+    return jsonify(success), http_code
\ No newline at end of file
diff --git a/app/api/routes.py b/app/api/routes.py
index 8a37a83..18ed516 100644
--- a/app/api/routes.py
+++ b/app/api/routes.py
@@ -1,9 +1,6 @@
-from flask import jsonify, request
+from flask import jsonify
 from app.api import bp
 from app.models import User, Listings
-from app import db
-from app import admin_permission, permission_required, super_admin_permission
-import json
 
 @bp.route('/user_id/<int:id>', methods=['GET'])
 def get_user_by_id(id):
diff --git a/app/models/listings.py b/app/models/listings.py
index 7295ec4..08970b1 100644
--- a/app/models/listings.py
+++ b/app/models/listings.py
@@ -34,3 +34,22 @@ class Listings(db.Model):
     @classmethod
     def get_top_listings(cls, amount_of_listings=5):
         return cls.query.limit(amount_of_listings).all()
+    
+    @classmethod
+    def delete_listing(cls, booking_id = None):
+
+        listing =  cls.search_listing(booking_id)
+
+        if listing:
+            db.session.delete(listing)
+            db.session.commit()
+            return True
+        
+        return False
+    
+    @classmethod
+    def search_listing(cls, listing_id = None):
+        if listing_id == None:
+            return False
+    
+        return cls.query.get(listing_id)
diff --git a/app/templates/admin/manage_bookings.html b/app/templates/admin/manage_bookings.html
index c25e690..e3873d6 100644
--- a/app/templates/admin/manage_bookings.html
+++ b/app/templates/admin/manage_bookings.html
@@ -230,7 +230,7 @@
             const confirmation_input = $('#conifrmation_input').val().trim();
             if (confirmation_input === 'CONFIRM') {
                 $.ajax({
-                    url: "{{ url_for('admin.get_bookings') }}", // TO CHANGE
+                    url: "{{ url_for('admin.delete_booking') }}",
                     method: "DELETE",
                     data: { id: delete_booking.data().id },
                     success: function() {
diff --git a/app/templates/base.html b/app/templates/base.html
index c628d89..76cdacc 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -94,4 +94,14 @@
         {% endblock %}
     </div> 
 </body>
+<script>
+    //Ensure CSRF token added to any internal requests including forms
+    $.ajaxSetup({
+    beforeSend: function(xhr, settings) {
+        if (!/^http(s)?:/.test(settings.url)) {
+            xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token() }}");
+        }
+    }
+});
+</script>
 </html>
-- 
GitLab