-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
126 lines (103 loc) · 4.26 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
from flask import Flask, jsonify, render_template, request
from flask_sqlalchemy import SQLAlchemy
from dotenv.main import load_dotenv
import random
import os
app = Flask(__name__)
# Connect to Database
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///cafes.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
load_dotenv()
API_KEY = os.environ["API_KEY"]
# Cafe TABLE Configuration
class Cafe(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(250), unique=True, nullable=False)
map_url = db.Column(db.String(500), nullable=False)
img_url = db.Column(db.String(500), nullable=False)
location = db.Column(db.String(250), nullable=False)
seats = db.Column(db.String(250), nullable=False)
has_toilet = db.Column(db.Boolean, nullable=False)
has_wifi = db.Column(db.Boolean, nullable=False)
has_sockets = db.Column(db.Boolean, nullable=False)
can_take_calls = db.Column(db.Boolean, nullable=False)
coffee_price = db.Column(db.String(250), nullable=True)
def to_dict(self):
# Method 1.
dictionary = {}
for column in self.__table__.columns:
# Create a new dictionary entry;
# where the key is the name of the column
# and the value is the value of the column
dictionary[column.name] = getattr(self, column.name)
return dictionary
# Method 2.
# Alternatively use Dict Comprehension to do the same thing
# return {column.name: getattr(self, column.name) for column in self.__table__.columns}
@app.route("/")
def home():
return render_template("index.html")
@app.route("/random", methods=["GET"])
def get_random_cafe():
all_cafes = db.session.query(Cafe).all()
if request.method == "GET":
random_cafe = random.choice(all_cafes)
return jsonify(cafe=random_cafe.to_dict())
@app.route("/all")
def get_all_cafes():
all_cafes = db.session.query(Cafe).all()
return jsonify(cafes=[cafe.to_dict() for cafe in all_cafes])
@app.route("/search")
def search_cafe():
query_location = request.args.get("loc")
cafe = db.session.query(Cafe).filter_by(location=query_location).first()
if cafe:
return jsonify(cafe=cafe.to_dict())
else:
return jsonify(error={
"Not Found": "Sorry, we don't have a cafe at that location."
})
@app.route("/add", methods=["POST"])
def post_new_cafe():
new_cafe = Cafe(
name=request.form.get("name"),
map_url=request.form.get("map_url"),
img_url=request.form.get("img_url"),
location=request.form.get("loc"),
has_sockets=bool(request.form.get("sockets")),
has_toilet=bool(request.form.get("toilet")),
has_wifi=bool(request.form.get("wifi")),
can_take_calls=bool(request.form.get("calls")),
seats=request.form.get("seats"),
coffee_price=request.form.get("coffee_price"),
)
db.session.add(new_cafe)
db.session.commit()
return jsonify(response={"success": "Successfully added the new cafe."})
@app.route("/update-price/<int:cafe_id>", methods=["PATCH"])
def patch_price(cafe_id):
new_price = request.args.get("new_price")
cafe = db.session.query(Cafe).get(cafe_id)
if cafe:
cafe.coffee_price = f"£{float(new_price)}"
db.session.commit()
return jsonify(response={"success": "Successfully updated the price."}), 200 # the status code that should be returned
else:
# resource not found
return jsonify(error={"Not Found": "Sorry, a cafe with that id was not found in the database."}), 404
@app.route("/report-closed/<int:cafe_id>", methods=["DELETE"])
def delete_cafe(cafe_id):
api_key = request.args.get("api-key")
if api_key == API_KEY:
cafe = db.session.query(Cafe).get(cafe_id)
if cafe:
db.session.delete(cafe)
db.session.commit()
return jsonify(response={"success": "Cafe deleted successfully from database."}), 200
else:
return jsonify(error={"Not Found": "Sorry, a cafe with that id was not found in the database."})
else:
return jsonify(error={"Forbidden": "Sorry, that's not allowed. Make sure you have the correct api_key."}), 403
if __name__ == '__main__':
app.run(debug=True)