Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
148 changes: 111 additions & 37 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,20 +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 @@ -35,23 +39,36 @@ def __init__(self, name):
self.name = name


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 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 @@ -64,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 @@ -80,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>
Loading