Skip to content
Open
6 changes: 4 additions & 2 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = 'thisisasecret' #To "log in" a user, first make sure you have imported the session - you'll also need to set up an app secret key.

# Set up the SQLAlchemy Database to be a local file 'desserts.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///desserts.db'

# Set up the SQLAlchemy Database to be a local file 'users.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)


Expand Down
Binary file added desserts.db
Binary file not shown.
133 changes: 113 additions & 20 deletions models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from app import db
from users import get_user_by_username


class Dessert(db.Model):
Expand All @@ -12,17 +13,23 @@ class Dessert(db.Model):
name = db.Column(db.String(100))
price = db.Column(db.Float)
calories = db.Column(db.Integer)
origin = db.Column(db.String(100))
image_url = db.Column(db.String(100))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship("User", backref="desserts")

def __init__(self, name, price, calories):
def __init__(self, name, price, calories, origin,image_url,user_id):
self.name = name
self.price = price
self.calories = calories
self.origin = origin
self.image_url = image_url
self.user_id = user_id

def calories_per_dollar(self):
if self.calories:
return self.calories / self.price


class Menu(db.Model):

id = db.Column(db.Integer, primary_key=True)
Expand All @@ -32,7 +39,36 @@ def __init__(self, name):
self.name = name


def create_dessert(new_name, new_price, new_calories):
# class User(db.Model):
# id = db.Column(db.Integer, primary_key=True)
# username = db.Column(db.String(100))
# password = db.Column(db.String(100))
# email = db.Column(db.String(250))
# name = db.Column(db.String(100))
# avatar = db.Column(db.String(250))
#
# def __init__(self, username, password, email, name, avatar):
# self.username = username
# self.password = password
# self.email = email
# self.name = name
# self.avatar = avatar

def get_desserts(user_id):
desserts = Dessert.query.filter_by(user_id=user_id).all()
return desserts

def get_all_desserts():
desserts = Dessert.query.all()
return desserts


def get_user_id(username):
user = get_user_by_username(username)
user_id = user.id
return user_id

def create_dessert(new_name, new_price, new_calories, new_origin, new_image_url,new_user_id):
# Create a dessert with the provided input.

# We need every piece of input to be provided.
Expand All @@ -45,8 +81,22 @@ def create_dessert(new_name, new_price, new_calories):
if new_name == '' or new_price == '' or new_calories == '':
raise Exception("Need name, price and calories!")

# Check for price
if int(new_price) > 50:
raise Exception("A bit too pricey!")

# Check for calories
if int(new_calories) > 1000:
raise Exception("No one should eat that")

#Check duplicates
if Dessert.query.filter_by(name=new_name).first():
raise Exception("Already in the database")


# This line maps to line 16 above (the Dessert.__init__ method)
dessert = Dessert(new_name, new_price, new_calories)

dessert = Dessert(new_name, new_price, new_calories, new_origin, new_image_url,new_user_id)

# Actually add this dessert to the database
db.session.add(dessert)
Expand All @@ -61,25 +111,68 @@ def create_dessert(new_name, new_price, new_calories):
db.session.rollback()


def delete_dessert(id):
def edit_dessert(dessert, new_name, new_price, new_calories, new_origin, new_image_url):
# Edit a dessert with the provided input.

dessert = Dessert.query.get(id)

if dessert:
# We store the name before deleting it, because we can't access it
# afterwards.
dessert_name = dessert.name
db.session.delete(dessert)

try:
db.session.commit()
return "Dessert {} deleted".format(dessert_name)
except:
# If something went wrong, explicitly roll back the database
db.session.rollback()
return "Something went wrong"
# Can you think of other ways to write this following check?
if new_name is None or new_price is None or new_calories is None:
raise Exception("Need name, price and calories!")

# They can also be empty strings if submitted from a form
if new_name == '' or new_price == '' or new_calories == '':
raise Exception("Need name, price and calories!")

# Check for price
if int(new_price) > 50:
raise Exception("A bit too pricey!")

# Check for calories
if int(new_calories) > 1000:
raise Exception("No one should eat that")

# This line maps to line 16 above (the Dessert.__init__ method)
dessert.name = new_name
dessert.price = new_price
dessert.calories = new_calories
dessert.origin = new_origin
dessert.image_url = new_image_url

# Save all pending changes to the database

try:
db.session.commit()
return dessert
except:
# If something went wrong, explicitly roll back the database
db.session.rollback()

def delete_dessert(id,user_id):

dessert = Dessert.query.get(id)
print dessert.user_id
print user_id
if dessert.user_id == user_id:

if dessert:
# We store the name before deleting it, because we can't access it
# afterwards.
dessert_name = dessert.name
db.session.delete(dessert)

try:
db.session.commit()
return "Dessert {} deleted".format(dessert_name)
except:
# If something went wrong, explicitly roll back the database
db.session.rollback()
return "Something went wrong"
else:
return "Dessert not found"
else:
return "Dessert not found"
return "You can't delete this dessert"




if __name__ == "__main__":
Expand Down
10 changes: 10 additions & 0 deletions static/starter-template.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
body {
padding-top: 50px;
}
.starter-template {
padding: 40px 15px;
text-align: center;
}
.search {
align-items: baseline;
}
19 changes: 17 additions & 2 deletions templates/add.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{% include 'header.html' %}

<body>

<div class="container">

Expand Down Expand Up @@ -57,15 +56,31 @@ <h3>Add Dessert</h3>

</div>

<div class="form-group">

<label for="origin_id">Origin</label>
<input class="form-control" id="origin_id" name="origin_field" type="text" />

</div>

<div class="form-group">

<label for="image_url_id">Image URL</label>
<input class="form-control" id="image_url_id" name="image_url_field" type="text" />

</div>



<!-- We need a submit button to submit a form! -->
<input type="submit" value="Add" class="btn btn-success"/>

<a href="/" class="btn btn-success">Back</a>


</form>


</div>

</body>
</body>
33 changes: 26 additions & 7 deletions templates/details.html
Original file line number Diff line number Diff line change
@@ -1,23 +1,42 @@
{% include 'header.html' %}

<body>


<div class="container">

<h3>Dessert Details</h3>

<h4>{{ dessert.name }}</h4>
{% if dessert %}

<h4>{{ dessert.name }}</h4>

<p>Price: ${{ dessert.price }}</p>

<p>Calories: {{ dessert.calories }}</p>

<p>Calories per dollar: {{ dessert.calories_per_dollar() }}</p>

<p>Price: ${{ dessert.price }}</p>
<p>Origin: {{ dessert.origin }}</p>

<p>Calories: {{ dessert.calories }}</p>
<p>Image:<p>
<p><img src="{{ dessert.image_url }}" height="400"></p>

<p>Calories per dollar: {{ dessert.calories_per_dollar() }}</p>
<a href="/edit/{{ dessert.id }}" class="btn btn-default">Edit {{ dessert.name }}</a> <a href="/delete/{{ dessert.id }}" class="btn btn-danger">Delete {{ dessert.name }}</a>

{% endif %}

<a href="/delete/{{ dessert.id }}" class="btn btn-danger">Delete {{ dessert.name }}</a>
{% if error %}
<div class="alert alert-danger" role="alert">

An error occurred trying to find your dessert:

{{ error }}

</div>
{% endif %}

<a href="/" class="btn btn-success">Back</a>

</div>

</body>
</body>
87 changes: 87 additions & 0 deletions templates/edit.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
{% include 'header.html' %}


<div class="container">


<h3>Edit Dessert</h3>

{% if success %}

<!-- http://getbootstrap.com/components/#alerts -->

<div class="alert alert-success" role="alert">

<p><strong>{{dessert.name}}</strong> successfully edited!</p>
<p><a href="/">Back to Dessert List</a></p>

</div>

{% endif %}

{% if error %}
<div class="alert alert-danger" role="alert">

An error occurred trying to edit your dessert:

{{ error }}

</div>
{% endif %}

{% if dessert %}
<!-- Bootstrap: http://getbootstrap.com/css/#forms -->

<!-- The form action and method correspond to a Flask route -->
<form action="/edit/{{ dessert.id }}" method="POST" class="form-inline">

<div class="form-group">

<label for="name_id">Name</label>
<input class="form-control" id="name_id" name="name_field" type="text" value="{{ dessert.name }}" />

</div>

<div class="form-group">

<label for="price_id">Price</label>
<input class="form-control" id="price_id" name="price_field" type="text" size="4" value="{{ dessert.price }}" />

</div>

<div class="form-group">

<label for="cals_id">Calories</label>
<input class="form-control" id="cals_id" name="cals_field" type="text" size="4" value="{{ dessert.calories }}" />

</div>

<div class="form-group">

<label for="origin_id">Origin</label>
<input class="form-control" id="origin_id" name="origin_field" type="text" value="{{ dessert.origin }}" />

</div>

<div class="form-group">


<label for="image_url_id">Image URL</label>
<input class="form-control" id="image_url_id" name="image_url_field" type="text" value="{{ dessert.image_url }}" />


</div>

<!-- We need a submit button to submit a form! -->
<input type="submit" value="Save" class="btn btn-success"/>


</form>
<p><img src = "{{ dessert.image_url }}" height="400"></p>
{% endif %}

<a href="/" class="btn btn-success">Back</a>

</div>

</body>
Loading