diff --git a/back-end/application.py b/back-end/application.py index 95d23e2..61928a4 100644 --- a/back-end/application.py +++ b/back-end/application.py @@ -3,9 +3,10 @@ from flask import flash from sqlalchemy import create_engine, asc, desc from sqlalchemy.orm import sessionmaker -from database_setup import Base, engine, Trip +from database_setup import Base, Hiker, engine, Trip from flask import session as login_session import random +import datetime import string import json from flask import make_response @@ -20,11 +21,13 @@ # SQLALCHEMY_DATABASE_URI = os.environ['DB_URL'] # engine = create_engine('sqlite:///SQLALCHEMY_DATABASE_URI.db') -engine = create_engine('sqlite:///database.db') +engine = create_engine('sqlite:///database.db?check_same_thread=false') DBSession = sessionmaker(bind=engine) + session = DBSession() + @app.route('/') def show_hostpage(): return "Hostpage" @@ -32,32 +35,21 @@ def show_hostpage(): @app.route('/trips', methods=['GET']) def show_trips(): - session = DBSession() trip_list = [] all_trips = session.query(Trip).all() for trip in all_trips: - trip_info = {"trip_name": trip.trip_name, - "id": trip.id, - "trip_description": trip.trip_description - } - trip_list.append(trip_info) + trip_list.append(trip.serialize) return flask.jsonify(trip_list), 200 -@app.route('/trips//detail', methods=['GET']) + +@app.route('/trips/', methods=['GET']) def show_trip(trip_id): - session = DBSession() trip = session.query(Trip).filter_by(id=trip_id).one() - trip_info = {"trip_name": trip.trip_name, - "id": trip.id, - "trip_description": trip.trip_description - } - - return flask.jsonify(trip_info), 200 + return flask.jsonify(trip.serialize), 200 @app.route('/trips/new', methods=['POST']) -def addTrip(): - session = DBSession() +def add_trip(): post = request.get_json() if request.method == 'POST': new_trip = Trip(trip_name=post["trip_name"], @@ -68,8 +60,7 @@ def addTrip(): @app.route('/trips//update', methods=['PUT']) -def updateTrip(id): - session = DBSession() +def update_trip(id): post = request.get_json() if "id" not in post: return "ERROR: Not a valid Customer ID \n", 404 @@ -83,8 +74,7 @@ def updateTrip(id): @app.route('/trips//delete', methods=['DELETE']) -def deleteTrip(trip_id): - session = DBSession() +def delete_trip(trip_id): post = request.get_json() trip_to_delete = session.query(Trip).filter_by(id=trip_id).one() session.delete(trip_to_delete) @@ -92,6 +82,78 @@ def deleteTrip(trip_id): return flask.jsonify("Trip successfully deleted!"), 200 +@app.route('/hikers//', methods=['GET']) +def show_hiker(ID): + hiker = session.query(Hiker).filter_by(id=ID).one() + return flask.jsonify(hiker.serialize), 200 + + +@app.route('/hikers/new', methods=['POST']) +def new_hiker(): + post = request.get_json() + if request.method == 'POST': + new_hiker = Hiker(first_name=post["first_name"], + last_name=post["last_name"], + address=post["address"], + phone_number=post["phone_number"], + email=post["email"], + emergency_contact1=post["emergency_contact1"], + emergency_contact2=post["emergency_contact2"], + expected_return=post["expected_return"] + ) + session.add(new_hiker) + session.commit() + return flask.jsonify("Hiker successfully added! \n"), 200 + + +@app.route('/hikers//edit', methods=['PUT']) +def edit_hiker(id): + post = request.get_json() + if "id" not in post: + return "ERROR: Not a valid Customer ID \n", 404 + hiker_id = post["id"] + edited_hiker = session.query(Hiker).filter_by(id=hiker_id).one() + if 'first_name' in post: + edited_hiker.first_name = post['first_name'] + elif 'last_name' in post: + edited_hiker.last_name = post['last_name'] + elif 'address' in post: + edited_hiker.address = post['address'] + elif 'phone_number' in post: + edited_hiker.phone_number = post['address'] + elif 'email' in post: + edited_hiker.email = post['email'] + elif 'emergency_contact1' in post: + edited_hiker.emergency_contact1 = post['emergency_contact1'] + elif 'emergency_contact2' in post: + edited_hiker.emergency_contact2 = post['emergency_contact2'] + elif 'expected_return' in post: + edited_hiker.expected_return = post['expected_return'] + session.add(edited_hiker) + session.commit() + return flask.jsonify("Hiker successfully updated! \n"), 200 + + +@app.route('/hikers//delete', methods=['PUT']) +def delete_hiker(id): + post = request.get_json() + if "id" not in post: + return "ERROR: Not a valid Customer ID \n", 404 + hiker_id = post["id"] + hiker_to_delete = session.query(Hiker).filter_by(id=id).one() + session.delete(hiker_to_delete) + session.commit() + return flask.jsonify("Hiker successfully deleted! \n"), 200 + +# IF THIS RETURNS TRUE THEN COLOR THE HIKER +def is_overdue(id): + hiker_to_check = session.query(Hiker).filter_by(id=id).one() + current_date = datetime.datetime.today() + if hiker_to_check.expected_return < current_date: + return True + else: + return False + if __name__ == "__main__": app.debug = True diff --git a/back-end/database_populator.py b/back-end/database_populator.py index f860961..219918f 100644 --- a/back-end/database_populator.py +++ b/back-end/database_populator.py @@ -10,36 +10,88 @@ DBSession = sessionmaker(bind=engine) session = DBSession() -# hiker1 = Hiker(first_name="Sam", last_name="Jamjar", address="123 Sesame Street", phone_number="12223334444", email="sjamjar@gmail.com", emergency_contact1="mommy", emergency_contact2="daddy", expected_return=datetime(2019, 2, 22, 16, 30)) -# hiker2 = Hiker(first_name="Anna", last_name="McIntosh", address="456 Applebee Avenue", phone_number="15556778899", email="anna.mc@gmail.com", emergency_contact1="mama", emergency_contact2="papa", expected_return=datetime(2019, 2, 22, 16, 30)) -# hiker3 = Hiker(first_name="Buster", last_name="Bluth", address="Mom's appartment", phone_number="12345675432", email="lucille.bluth@gmail.com", emergency_contact1="Lucille Bluth", emergency_contact2="Mother", expected_return=datetime(2019, 2, 22, 16, 30)) -# hiker4 = Hiker(first_name="Tobias", last_name="Funke", address="The Model Home", phone_number="19873276543", email="ibluemyselfforthis@gmail.com", emergency_contact1="Lindsay Bluth", emergency_contact2="Michael Bluth", expected_return=datetime(2019, 2, 22, 16, 30)) -# session.add(hiker1) -# session.add(hiker2) -# session.add(hiker3) -# session.add(hiker4) -# session.commit() - -trip1 = Trip(trip_name="Big Loop around the Small Pond", trip_description="A big loop around a small pond") -trip2 = Trip(trip_name="Waterfall Hike", trip_description="A hike to the waterfall off in yonder distance") -trip3 = Trip(trip_name="Devil's Postpile", trip_description="A hike to Devil's Postpile") -trip4 = Trip(trip_name="Rainbow Lake", trip_description="A hike to rainbow lake") -trip5 = Trip(trip_name="Convict Lake Loop", trip_description="A hike around the loop around Convict Lake") -trip6 = Trip(trip_name="Running trail", trip_description="A run around the trail") -trip7 = Trip(trip_name="A trip", trip_description="A trip") -trip8 = Trip(trip_name="Joshua Tree loop", trip_description="A big loop around Joshua Tree") +hiker1 = Hiker(first_name="Michael", last_name="Bluth", + address="The model home", phone_number="12223334444", + emergency_contact1="Lucille Bluth", emergency_contact2=None, + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker2 = Hiker(first_name="GOB", last_name="Bluth", + address="The model home", phone_number="13334445555", + emergency_contact1="Lucille Bluth", + emergency_contact2="Michael Bluth", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker3 = Hiker(first_name="Lindsay", last_name="Bluth-Funke", + address="The model home", phone_number="14445556767", + emergency_contact1="Lucille Bluth", + emergency_contact2="Michael Bluth", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker4 = Hiker(first_name="Buster", last_name="Bluth", + address="The model home", phone_number="55567678999", + emergency_contact1="Lucille Bluth", + emergency_contact2="Mother", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker5 = Hiker(first_name="Tobias", last_name="Funke", + address="The model home", phone_number="14209696969", + emergency_contact1="Lindsay Bluth-Funke", + emergency_contact2="Michael Bluth", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker6 = Hiker(first_name="Lucille", last_name="Bluth", + address="123 Ocean View Appartments Unit 42", + phone_number="19998887777", + emergency_contact1="George Bluth Sr.", + emergency_contact2="Oscar Bluth", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker7 = Hiker(first_name="George", last_name="Bluth", + address="Orange County Prison", + phone_number="18887776565", + emergency_contact1="Lucille Bluth", + emergency_contact2="GOB Bluth", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker8 = Hiker(first_name="Oscar", last_name="Bluth", + address="123 Ocean View Appartments Unit 42", + phone_number="17776565555", + emergency_contact1="Lucille Bluth", + emergency_contact2=None, + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker9 = Hiker(first_name="George-Michael", last_name="Bluth", + address="The model home", + phone_number="12223334444", + emergency_contact1="Michael Bluth", + emergency_contact2="Lindsay Bluth", + expected_return=datetime(2019, 1, 22, 16, 30)) +hiker10 = Hiker(first_name="Maeby", last_name="Funke", + address="The model home", + phone_number="13334445555", + emergency_contact1="Lindsay Bluth-Funke", + emergency_contact2="Tobias Funke", + expected_return=datetime(2019, 1, 22, 16, 30)) + +session.add(hiker1) +session.add(hiker2) +session.add(hiker3) +session.add(hiker4) +session.add(hiker5) +session.add(hiker6) +session.add(hiker7) +session.add(hiker8) +session.add(hiker9) +session.add(hiker10) +session.commit() + +trip1 = Trip(trip_name="There's always money in the banana stand") +trip1.hikers.append(hiker1) +trip1.hikers.append(hiker2) +trip1.hikers.append(hiker3) +trip1.hikers.append(hiker4) +trip1.hikers.append(hiker5) + +trip2 = Trip(trip_name="I just blew myself") +trip2.hikers.append(hiker1) +trip2.hikers.append(hiker2) +trip2.hikers.append(hiker3) +trip2.hikers.append(hiker4) +trip2.hikers.append(hiker5) + session.add(trip1) session.add(trip2) -session.add(trip3) -session.add(trip4) -session.add(trip5) -session.add(trip6) -session.add(trip7) -session.add(trip8) + session.commit() -# trip1.hikers.append(hiker1) -# trip1.hikers.append(hiker2) -# trip1.hikers.append(hiker3) -# trip1.hikers.append(hiker4) -# session.add(trip1) -# session.commit() diff --git a/back-end/database_setup.py b/back-end/database_setup.py index 76b6555..904a33c 100644 --- a/back-end/database_setup.py +++ b/back-end/database_setup.py @@ -8,59 +8,58 @@ from sqlalchemy.orm import sessionmaker, relationship, backref from sqlalchemy.sql import func - Base = declarative_base() -# association_table = Table('association', Base.metadata, -# Column('hiker_id', Integer, -# ForeignKey('hiker.id')), -# Column('trip_id', Integer, -# ForeignKey('trip.id')) -# ) +association_table = Table('association', Base.metadata, + Column('hiker_id', Integer, + ForeignKey('hiker.id')), + Column('trip_id', Integer, + ForeignKey('trip.id')) + ) + -# class Hiker(Base): -# __tablename__ = 'hiker' -# id = Column(Integer, primary_key=True, autoincrement=True) -# first_name = Column(String(32)) -# last_name = Column(String(32)) -# address = Column(String(32)) -# phone_number = Column(String(32)) -# email = Column(String(32)) -# emergency_contact1 = Column(String(32)) -# emergency_contact2 = Column(String(32)) -# expected_return = Column(DateTime()) # WHENEVER WE WANT TO ESTABLISH A DATE, YOU HAVE TO PASS IT IN -# trip = relationship('Trip', secondary=association_table, back_populates="hikers") -# -# @property -# def serialize(self): -# return { -# 'first_name': self.first_name, -# 'last_name': self.last_name, -# 'address': self.address, -# 'phone_number': self.phone_number, -# 'emergency_contact1': self.emergency_contact1, -# 'emergency_contact2': self.emergency_contact2, -# 'expected_return': self.expected_return -# } +class Hiker(Base): + __tablename__ = 'hiker' + id = Column(Integer, primary_key=True, autoincrement=True) + first_name = Column(String(32)) + last_name = Column(String(32)) + address = Column(String(32)) + phone_number = Column(String(32)) + email = Column(String(32)) + emergency_contact1 = Column(String(32)) + emergency_contact2 = Column(String(32)) + expected_return = Column(DateTime()) + trip = relationship('Trip', secondary=association_table, + back_populates="hikers") + + @property + def serialize(self): + return { + '1) first_name': self.first_name, + '2) last_name': self.last_name, + '3) address': self.address, + '4) phone_number': self.phone_number, + '5) email': self.email, + '6) emergency_contact1': self.emergency_contact1, + '7) emergency_contact2': self.emergency_contact2, + '8) expected_return': self.expected_return + } class Trip(Base): __tablename__ = 'trip' id = Column(Integer, primary_key=True, autoincrement=True) trip_name = Column(String(32)) trip_description = Column(String(800)) - # hikers = relationship('Hiker', secondary=association_table, back_populates="trip") + hikers = relationship('Hiker', secondary=association_table, + back_populates="trip") -# parser = argparse.ArgumentParser() -# parser.add_argument("-t", "--test", action="store_true") -# args = parser.parse_args() -# if args.test: -# print "Created test database" -# engine = create_engine('sqlite:///test.db') -# else: -# print "Created regular database" -# engine = create_engine('sqlite:///database.db') + @property + def serialize(self): + return { + '1. trip_name': self.trip_name, + '2. trip_description': self.trip_description, + '3. hikers': [hiker.serialize for hiker in self.hikers] + } engine = create_engine('sqlite:///database.db') Base.metadata.create_all(engine) - -# information (name, contact info, expected checkout date) and trips (groups of hikers) diff --git a/back-end/test.py b/back-end/test.py new file mode 100644 index 0000000..874b6aa --- /dev/null +++ b/back-end/test.py @@ -0,0 +1,45 @@ +# project/test_basic.py +from flask import Flask, render_template, request, redirect, url_for, jsonify +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.automap import automap_base +from database_setup import Base, Hiker, Trip, engine +# from test_database_setup import Trip +import os +import unittest +import datetime +from application import * +from application import session, app +from flask import json + +app = Flask(__name__) +engine = create_engine('sqlite:///database.db') +Base.metadata.bind = engine +DBSession = sessionmaker(bind=engine) +session = DBSession() + + +class BasicTests(unittest.TestCase): + + def test_is_overdue(self): + # with app.app_context(): + results = is_overdue(1) + expected_results = True + self.assertEqual(results, expected_results) + + def test_new_hiker(self): + with app.app_context(): + expected_results = {'1) first_name': "Michael", + '2) last_name': "Bluth", + '3) address': "The model home", + '4) phone_number': "12223334444", + '5) emergency_contact1': "Lucille Bluth", + '6) emergency_contact2': None, + '7) expected_return': "some date" + } + results = show_hiker(1) + response_json = json.loads(results[0].data.decode('utf-8')) + self.assertEqual(response_json, expected_results) + +if __name__ == "__main__": + unittest.main() diff --git a/scripts/api.sh b/scripts/api.sh index a8f2b8f..debfc1f 100644 --- a/scripts/api.sh +++ b/scripts/api.sh @@ -1,14 +1,5 @@ #!/bin/bash -# Documentation -read -r -d '' DOCUMENTATION <