├── .gitignore ├── CODEOWNERS ├── Lesson-2 ├── Objective-1-Solution │ └── webserver.py ├── Objective-2-Solution │ └── webserver.py ├── Objective-3-Solution │ └── webserver.py ├── Objective-4-Solution │ └── webserver.py ├── Objective-5-Solution │ └── webserver.py ├── first-web-server │ └── webserver.py ├── hola-server │ └── webserver.py └── post-web-server │ └── webserver.py ├── Lesson-3 ├── 01_First-Flask-App │ └── project.py ├── 02_Adding-Database-to-Flask-Application │ └── project.py ├── 03_-Listing-Menu-Items-with-Flask │ └── project.py ├── 04_Routing │ └── project.py ├── 05_Routing-Create-Quiz-Template-Code │ └── project.py ├── 06_Routing-Quiz-Solution │ └── project.py ├── 07_Menu-Template-Quiz │ └── menu.html ├── 08_Menu-Template-Solution │ ├── menu.html │ └── project.py ├── 09_url_for-quiz │ └── menu.html ├── 10_url_for-Solution │ └── menu.html ├── 11_form-requests-and-redirects │ ├── newmenuitem.html │ └── project.py ├── 12_Edit-Menu-Form │ ├── editmenuitem.html │ └── project.py ├── 13_Edit-Menu-Form-Solution │ └── editmenuitem.html ├── 14_Delete-Menu-Item │ └── deletemenuitem.html ├── 15_Delete-Menu-Item-Solution │ └── project.py ├── 16_Flash-Messaging │ ├── menu.html │ └── project.py ├── 17_Flash-Messaging-Solution │ └── project.py ├── 18_Styling │ ├── static │ │ └── styles.css │ └── templates │ │ ├── deletemenuitem.html │ │ ├── editmenuitem.html │ │ ├── menu.html │ │ └── newmenuitem.html ├── 19_Responding-with-JSON │ ├── database_setup.py │ └── project.py ├── 20_JSON-Solution │ ├── database_setup.py │ └── project.py └── Final-Flask-Application │ ├── database_setup.py │ ├── project.py │ ├── static │ └── styles.css │ └── templates │ ├── deletemenuitem.html │ ├── editmenuitem.html │ ├── menu.html │ └── newmenuitem.html ├── Lesson-4 ├── FakeMenuItems.py └── Final-Project │ ├── README.txt │ ├── database_setup.py │ ├── finalproject.py │ ├── lotsofmenus.py │ ├── static │ └── styles.css │ └── templates │ ├── deleteRestaurant.html │ ├── deletemenuitem.html │ ├── editRestaurant.html │ ├── editmenuitem.html │ ├── menu.html │ ├── newRestaurant.html │ ├── newmenuitem.html │ └── restaurants.html ├── Lesson_1 ├── database_setup.py └── lotsofmenus.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .gitignore support plugin (hsz.mobi) 2 | ### JetBrains template 3 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm 4 | 5 | *.iml 6 | 7 | ## Directory-based project format: 8 | .idea/ 9 | # if you remove the above rule, at least ignore the following: 10 | 11 | # User-specific stuff: 12 | # .idea/workspace.xml 13 | # .idea/tasks.xml 14 | # .idea/dictionaries 15 | 16 | # Sensitive or high-churn files: 17 | # .idea/dataSources.ids 18 | # .idea/dataSources.xml 19 | # .idea/sqlDataSources.xml 20 | # .idea/dynamic.xml 21 | # .idea/uiDesigner.xml 22 | 23 | # Gradle: 24 | # .idea/gradle.xml 25 | # .idea/libraries 26 | 27 | # Mongo Explorer plugin: 28 | # .idea/mongoSettings.xml 29 | 30 | ## File-based project format: 31 | *.ipr 32 | *.iws 33 | 34 | ## Plugin-specific files: 35 | 36 | # IntelliJ 37 | out/ 38 | 39 | # mpeltonen/sbt-idea plugin 40 | .idea_modules/ 41 | 42 | # JIRA plugin 43 | atlassian-ide-plugin.xml 44 | 45 | # Crashlytics plugin (for Android Studio and IntelliJ) 46 | com_crashlytics_export_strings.xml 47 | crashlytics.properties 48 | crashlytics-build.properties 49 | 50 | 51 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @udacity/active-public-content -------------------------------------------------------------------------------- /Lesson-2/Objective-1-Solution/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | import cgi 3 | 4 | # import CRUD Operations from Lesson 1 5 | from database_setup import Base, Restaurant, MenuItem 6 | from sqlalchemy import create_engine 7 | from sqlalchemy.orm import sessionmaker 8 | 9 | # Create session and connect to DB 10 | engine = create_engine('sqlite:///restaurantmenu.db') 11 | Base.metadata.bind = engine 12 | DBSession = sessionmaker(bind=engine) 13 | session = DBSession() 14 | 15 | 16 | class webServerHandler(BaseHTTPRequestHandler): 17 | 18 | def do_GET(self): 19 | try: 20 | if self.path.endswith("/restaurants"): 21 | restaurants = session.query(Restaurant).all() 22 | output = "" 23 | self.send_response(200) 24 | self.send_header('Content-type', 'text/html') 25 | self.end_headers() 26 | output += "" 27 | for restaurant in restaurants: 28 | output += restaurant.name 29 | output += "


" 30 | 31 | output += "" 32 | self.wfile.write(output) 33 | return 34 | except IOError: 35 | self.send_error(404, 'File Not Found: %s' % self.path) 36 | 37 | 38 | def main(): 39 | try: 40 | server = HTTPServer(('', 8080), webServerHandler) 41 | print 'Web server running...open localhost:8080/restaurants in your browser' 42 | server.serve_forever() 43 | except KeyboardInterrupt: 44 | print '^C received, shutting down server' 45 | server.socket.close() 46 | 47 | if __name__ == '__main__': 48 | main() 49 | -------------------------------------------------------------------------------- /Lesson-2/Objective-2-Solution/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | import cgi 3 | 4 | # import CRUD Operations from Lesson 1 5 | from database_setup import Base, Restaurant, MenuItem 6 | from sqlalchemy import create_engine 7 | from sqlalchemy.orm import sessionmaker 8 | 9 | # Create session and connect to DB 10 | engine = create_engine('sqlite:///restaurantmenu.db') 11 | Base.metadata.bind = engine 12 | DBSession = sessionmaker(bind=engine) 13 | session = DBSession() 14 | 15 | 16 | class webServerHandler(BaseHTTPRequestHandler): 17 | 18 | def do_GET(self): 19 | try: 20 | if self.path.endswith("/restaurants"): 21 | restaurants = session.query(Restaurant).all() 22 | output = "" 23 | self.send_response(200) 24 | self.send_header('Content-type', 'text/html') 25 | self.end_headers() 26 | output += "" 27 | for restaurant in restaurants: 28 | output += restaurant.name 29 | output += "
" 30 | # Objective 2 -- Add Edit and Delete Links 31 | output += "Edit " 32 | output += "
" 33 | output += " Delete " 34 | output += "


" 35 | 36 | output += "" 37 | self.wfile.write(output) 38 | return 39 | except IOError: 40 | self.send_error(404, 'File Not Found: %s' % self.path) 41 | 42 | 43 | def main(): 44 | try: 45 | server = HTTPServer(('', 8080), webServerHandler) 46 | print 'Web server running...open localhost:8080/restaurants in your browser' 47 | server.serve_forever() 48 | except KeyboardInterrupt: 49 | print '^C received, shutting down server' 50 | server.socket.close() 51 | 52 | if __name__ == '__main__': 53 | main() 54 | -------------------------------------------------------------------------------- /Lesson-2/Objective-3-Solution/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | import cgi 3 | 4 | # import CRUD Operations from Lesson 1 5 | from database_setup import Base, Restaurant, MenuItem 6 | from sqlalchemy import create_engine 7 | from sqlalchemy.orm import sessionmaker 8 | 9 | # Create session and connect to DB 10 | engine = create_engine('sqlite:///restaurantmenu.db') 11 | Base.metadata.bind = engine 12 | DBSession = sessionmaker(bind=engine) 13 | session = DBSession() 14 | 15 | 16 | class webServerHandler(BaseHTTPRequestHandler): 17 | 18 | def do_GET(self): 19 | try: 20 | # Objective 3 Step 2 - Create /restarants/new page 21 | if self.path.endswith("/restaurants/new"): 22 | self.send_response(200) 23 | self.send_header('Content-type', 'text/html') 24 | self.end_headers() 25 | output = "" 26 | output += "" 27 | output += "

Make a New Restaurant

" 28 | output += "
" 29 | output += " " 30 | output += "" 31 | output += "
" 32 | self.wfile.write(output) 33 | return 34 | 35 | if self.path.endswith("/restaurants"): 36 | restaurants = session.query(Restaurant).all() 37 | output = "" 38 | # Objective 3 Step 1 - Create a Link to create a new menu item 39 | output += " Make a New Restaurant Here

" 40 | 41 | self.send_response(200) 42 | self.send_header('Content-type', 'text/html') 43 | self.end_headers() 44 | output += "" 45 | for restaurant in restaurants: 46 | output += restaurant.name 47 | output += "
" 48 | # Objective 2 -- Add Edit and Delete Links 49 | output += "Edit " 50 | output += "
" 51 | output += " Delete " 52 | output += "


" 53 | 54 | output += "" 55 | self.wfile.write(output) 56 | return 57 | 58 | except IOError: 59 | self.send_error(404, 'File Not Found: %s' % self.path) 60 | 61 | # Objective 3 Step 3- Make POST method 62 | def do_POST(self): 63 | try: 64 | if self.path.endswith("/restaurants/new"): 65 | ctype, pdict = cgi.parse_header( 66 | self.headers.getheader('content-type')) 67 | if ctype == 'multipart/form-data': 68 | fields = cgi.parse_multipart(self.rfile, pdict) 69 | messagecontent = fields.get('newRestaurantName') 70 | 71 | # Create new Restaurant Object 72 | newRestaurant = Restaurant(name=messagecontent[0]) 73 | session.add(newRestaurant) 74 | session.commit() 75 | 76 | self.send_response(301) 77 | self.send_header('Content-type', 'text/html') 78 | self.send_header('Location', '/restaurants') 79 | self.end_headers() 80 | 81 | except: 82 | pass 83 | 84 | 85 | def main(): 86 | try: 87 | server = HTTPServer(('', 8080), webServerHandler) 88 | print 'Web server running... Open localhost:8080/restaurants in your browser' 89 | server.serve_forever() 90 | except KeyboardInterrupt: 91 | print '^C received, shutting down server' 92 | server.socket.close() 93 | 94 | if __name__ == '__main__': 95 | main() 96 | -------------------------------------------------------------------------------- /Lesson-2/Objective-4-Solution/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | import cgi 3 | 4 | # import CRUD Operations from Lesson 1 5 | from database_setup import Base, Restaurant, MenuItem 6 | from sqlalchemy import create_engine 7 | from sqlalchemy.orm import sessionmaker 8 | 9 | # Create session and connect to DB 10 | engine = create_engine('sqlite:///restaurantmenu.db') 11 | Base.metadata.bind = engine 12 | DBSession = sessionmaker(bind=engine) 13 | session = DBSession() 14 | 15 | 16 | class webServerHandler(BaseHTTPRequestHandler): 17 | 18 | def do_GET(self): 19 | try: 20 | # Objective 3 Step 2 - Create /restarants/new page 21 | if self.path.endswith("/restaurants/new"): 22 | self.send_response(200) 23 | self.send_header('Content-type', 'text/html') 24 | self.end_headers() 25 | output = "" 26 | output += "" 27 | output += "

Make a New Restaurant

" 28 | output += "
" 29 | output += " " 30 | output += "" 31 | output += "
" 32 | self.wfile.write(output) 33 | return 34 | if self.path.endswith("/edit"): 35 | restaurantIDPath = self.path.split("/")[2] 36 | myRestaurantQuery = session.query(Restaurant).filter_by( 37 | id=restaurantIDPath).one() 38 | if myRestaurantQuery: 39 | self.send_response(200) 40 | self.send_header('Content-type', 'text/html') 41 | self.end_headers() 42 | output = "" 43 | output += "

" 44 | output += myRestaurantQuery.name 45 | output += "

" 46 | output += "
" % restaurantIDPath 47 | output += "" % myRestaurantQuery.name 48 | output += "" 49 | output += "
" 50 | output += "" 51 | 52 | self.wfile.write(output) 53 | 54 | if self.path.endswith("/restaurants"): 55 | restaurants = session.query(Restaurant).all() 56 | output = "" 57 | # Objective 3 Step 1 - Create a Link to create a new menu item 58 | output += " Make a New Restaurant Here

" 59 | 60 | self.send_response(200) 61 | self.send_header('Content-type', 'text/html') 62 | self.end_headers() 63 | output += "" 64 | for restaurant in restaurants: 65 | output += restaurant.name 66 | output += "
" 67 | # Objective 2 -- Add Edit and Delete Links 68 | # Objective 4 -- Replace Edit href 69 | output += "Edit " % restaurant.id 70 | output += "
" 71 | output += " Delete " 72 | output += "


" 73 | 74 | output += "" 75 | self.wfile.write(output) 76 | return 77 | except IOError: 78 | self.send_error(404, 'File Not Found: %s' % self.path) 79 | 80 | # Objective 3 Step 3- Make POST method 81 | def do_POST(self): 82 | try: 83 | if self.path.endswith("/edit"): 84 | ctype, pdict = cgi.parse_header( 85 | self.headers.getheader('content-type')) 86 | if ctype == 'multipart/form-data': 87 | fields = cgi.parse_multipart(self.rfile, pdict) 88 | messagecontent = fields.get('newRestaurantName') 89 | restaurantIDPath = self.path.split("/")[2] 90 | 91 | myRestaurantQuery = session.query(Restaurant).filter_by( 92 | id=restaurantIDPath).one() 93 | if myRestaurantQuery != []: 94 | myRestaurantQuery.name = messagecontent[0] 95 | session.add(myRestaurantQuery) 96 | session.commit() 97 | self.send_response(301) 98 | self.send_header('Content-type', 'text/html') 99 | self.send_header('Location', '/restaurants') 100 | self.end_headers() 101 | 102 | if self.path.endswith("/restaurants/new"): 103 | ctype, pdict = cgi.parse_header( 104 | self.headers.getheader('content-type')) 105 | if ctype == 'multipart/form-data': 106 | fields = cgi.parse_multipart(self.rfile, pdict) 107 | messagecontent = fields.get('newRestaurantName') 108 | 109 | # Create new Restaurant Object 110 | newRestaurant = Restaurant(name=messagecontent[0]) 111 | session.add(newRestaurant) 112 | session.commit() 113 | 114 | self.send_response(301) 115 | self.send_header('Content-type', 'text/html') 116 | self.send_header('Location', '/restaurants') 117 | self.end_headers() 118 | 119 | except: 120 | pass 121 | 122 | 123 | def main(): 124 | try: 125 | server = HTTPServer(('', 8080), webServerHandler) 126 | print 'Web server running...open localhost:8080/restaurants in your browser' 127 | server.serve_forever() 128 | except KeyboardInterrupt: 129 | print '^C received, shutting down server' 130 | server.socket.close() 131 | 132 | 133 | if __name__ == '__main__': 134 | main() 135 | -------------------------------------------------------------------------------- /Lesson-2/Objective-5-Solution/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | import cgi 3 | 4 | # import CRUD Operations from Lesson 1 ## 5 | from database_setup import Base, Restaurant, MenuItem 6 | from sqlalchemy import create_engine 7 | from sqlalchemy.orm import sessionmaker 8 | 9 | # Create session and connect to DB ## 10 | engine = create_engine('sqlite:///restaurantmenu.db') 11 | Base.metadata.bind = engine 12 | DBSession = sessionmaker(bind=engine) 13 | session = DBSession() 14 | 15 | 16 | class webServerHandler(BaseHTTPRequestHandler): 17 | 18 | def do_GET(self): 19 | try: 20 | # Objective 3 Step 2 - Create /restaurants/new page 21 | if self.path.endswith("/restaurants/new"): 22 | self.send_response(200) 23 | self.send_header('Content-type', 'text/html') 24 | self.end_headers() 25 | output = "" 26 | output += "" 27 | output += "

Make a New Restaurant

" 28 | output += "
" 29 | output += " " 30 | output += "" 31 | output += "
" 32 | self.wfile.write(output) 33 | return 34 | if self.path.endswith("/edit"): 35 | restaurantIDPath = self.path.split("/")[2] 36 | myRestaurantQuery = session.query(Restaurant).filter_by( 37 | id=restaurantIDPath).one() 38 | if myRestaurantQuery: 39 | self.send_response(200) 40 | self.send_header('Content-type', 'text/html') 41 | self.end_headers() 42 | output = "" 43 | output += "

" 44 | output += myRestaurantQuery.name 45 | output += "

" 46 | output += "
" % restaurantIDPath 47 | output += "" % myRestaurantQuery.name 48 | output += "" 49 | output += "
" 50 | output += "" 51 | 52 | self.wfile.write(output) 53 | if self.path.endswith("/delete"): 54 | restaurantIDPath = self.path.split("/")[2] 55 | 56 | myRestaurantQuery = session.query(Restaurant).filter_by( 57 | id=restaurantIDPath).one() 58 | if myRestaurantQuery: 59 | self.send_response(200) 60 | self.send_header('Content-type', 'text/html') 61 | self.end_headers() 62 | output = "" 63 | output += "" 64 | output += "

Are you sure you want to delete %s?" % myRestaurantQuery.name 65 | output += "
" % restaurantIDPath 66 | output += "" 67 | output += "
" 68 | output += "" 69 | self.wfile.write(output) 70 | 71 | if self.path.endswith("/restaurants"): 72 | restaurants = session.query(Restaurant).all() 73 | output = "" 74 | # Objective 3 Step 1 - Create a Link to create a new menu item 75 | output += " Make a New Restaurant Here

" 76 | 77 | self.send_response(200) 78 | self.send_header('Content-type', 'text/html') 79 | self.end_headers() 80 | output += "" 81 | for restaurant in restaurants: 82 | output += restaurant.name 83 | output += "
" 84 | # Objective 2 -- Add Edit and Delete Links 85 | # Objective 4 -- Replace Edit href 86 | 87 | output += "Edit " % restaurant.id 88 | output += "
" 89 | # Objective 5 -- Replace Delete href 90 | output += " Delete " % restaurant.id 91 | output += "


" 92 | 93 | output += "" 94 | self.wfile.write(output) 95 | return 96 | except IOError: 97 | self.send_error(404, 'File Not Found: %s' % self.path) 98 | 99 | # Objective 3 Step 3- Make POST method 100 | def do_POST(self): 101 | try: 102 | if self.path.endswith("/delete"): 103 | restaurantIDPath = self.path.split("/")[2] 104 | myRestaurantQuery = session.query(Restaurant).filter_by( 105 | id=restaurantIDPath).one() 106 | if myRestaurantQuery: 107 | session.delete(myRestaurantQuery) 108 | session.commit() 109 | self.send_response(301) 110 | self.send_header('Content-type', 'text/html') 111 | self.send_header('Location', '/restaurants') 112 | self.end_headers() 113 | 114 | if self.path.endswith("/edit"): 115 | ctype, pdict = cgi.parse_header( 116 | self.headers.getheader('content-type')) 117 | if ctype == 'multipart/form-data': 118 | fields = cgi.parse_multipart(self.rfile, pdict) 119 | messagecontent = fields.get('newRestaurantName') 120 | restaurantIDPath = self.path.split("/")[2] 121 | 122 | myRestaurantQuery = session.query(Restaurant).filter_by( 123 | id=restaurantIDPath).one() 124 | if myRestaurantQuery != []: 125 | myRestaurantQuery.name = messagecontent[0] 126 | session.add(myRestaurantQuery) 127 | session.commit() 128 | self.send_response(301) 129 | self.send_header('Content-type', 'text/html') 130 | self.send_header('Location', '/restaurants') 131 | self.end_headers() 132 | 133 | if self.path.endswith("/restaurants/new"): 134 | ctype, pdict = cgi.parse_header( 135 | self.headers.getheader('content-type')) 136 | if ctype == 'multipart/form-data': 137 | fields = cgi.parse_multipart(self.rfile, pdict) 138 | messagecontent = fields.get('newRestaurantName') 139 | 140 | # Create new Restaurant Object 141 | newRestaurant = Restaurant(name=messagecontent[0]) 142 | session.add(newRestaurant) 143 | session.commit() 144 | 145 | self.send_response(301) 146 | self.send_header('Content-type', 'text/html') 147 | self.send_header('Location', '/restaurants') 148 | self.end_headers() 149 | 150 | except: 151 | pass 152 | 153 | 154 | def main(): 155 | try: 156 | server = HTTPServer(('', 8080), webServerHandler) 157 | print 'Web server running...open localhost:8080/restaurants in your browser' 158 | server.serve_forever() 159 | except KeyboardInterrupt: 160 | print '^C received, shutting down server' 161 | server.socket.close() 162 | 163 | 164 | if __name__ == '__main__': 165 | main() 166 | -------------------------------------------------------------------------------- /Lesson-2/first-web-server/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | 3 | 4 | class WebServerHandler(BaseHTTPRequestHandler): 5 | 6 | def do_GET(self): 7 | if self.path.endswith("/hello"): 8 | self.send_response(200) 9 | self.send_header('Content-type', 'text/html') 10 | self.end_headers() 11 | message = "" 12 | message += "Hello!" 13 | self.wfile.write(message) 14 | print message 15 | return 16 | else: 17 | self.send_error(404, 'File Not Found: %s' % self.path) 18 | 19 | 20 | def main(): 21 | try: 22 | port = 8080 23 | server = HTTPServer(('', port), WebServerHandler) 24 | print "Web Server running on port %s" % port 25 | server.serve_forever() 26 | except KeyboardInterrupt: 27 | print " ^C entered, stopping web server...." 28 | server.socket.close() 29 | 30 | if __name__ == '__main__': 31 | main() 32 | -------------------------------------------------------------------------------- /Lesson-2/hola-server/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | 3 | 4 | class webServerHandler(BaseHTTPRequestHandler): 5 | 6 | def do_GET(self): 7 | if self.path.endswith("/hello"): 8 | self.send_response(200) 9 | self.send_header('Content-type', 'text/html') 10 | self.end_headers() 11 | message = "" 12 | message += "Hello!" 13 | self.wfile.write(message) 14 | print message 15 | return 16 | 17 | if self.path.endswith("/hola"): 18 | self.send_response(200) 19 | self.send_header('Content-type', 'text/html') 20 | self.end_headers() 21 | message = "" 22 | message += " ¡ Hola ! " 23 | self.wfile.write(message) 24 | print message 25 | return 26 | 27 | else: 28 | self.send_error(404, 'File Not Found: %s' % self.path) 29 | 30 | 31 | def main(): 32 | try: 33 | port = 8080 34 | server = HTTPServer(('', port), webServerHandler) 35 | print "Web Server running on port %s" % port 36 | server.serve_forever() 37 | except KeyboardInterrupt: 38 | print " ^C entered, stopping web server...." 39 | server.socket.close() 40 | 41 | if __name__ == '__main__': 42 | main() 43 | -------------------------------------------------------------------------------- /Lesson-2/post-web-server/webserver.py: -------------------------------------------------------------------------------- 1 | from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 2 | import cgi 3 | 4 | 5 | class webServerHandler(BaseHTTPRequestHandler): 6 | 7 | def do_GET(self): 8 | try: 9 | if self.path.endswith("/hello"): 10 | self.send_response(200) 11 | self.send_header('Content-type', 'text/html') 12 | self.end_headers() 13 | output = "" 14 | output += "" 15 | output += "

Hello!

" 16 | output += '''

What would you like me to say?

''' 17 | output += "" 18 | self.wfile.write(output) 19 | print output 20 | return 21 | 22 | if self.path.endswith("/hola"): 23 | self.send_response(200) 24 | self.send_header('Content-type', 'text/html') 25 | self.end_headers() 26 | output = "" 27 | output += "" 28 | output += "

¡ Hola !

" 29 | output += '''

What would you like me to say?

''' 30 | output += "" 31 | self.wfile.write(output) 32 | print output 33 | return 34 | 35 | except IOError: 36 | self.send_error(404, 'File Not Found: %s' % self.path) 37 | 38 | def do_POST(self): 39 | try: 40 | self.send_response(301) 41 | self.send_header('Content-type', 'text/html') 42 | self.end_headers() 43 | ctype, pdict = cgi.parse_header( 44 | self.headers.getheader('content-type')) 45 | if ctype == 'multipart/form-data': 46 | fields = cgi.parse_multipart(self.rfile, pdict) 47 | messagecontent = fields.get('message') 48 | output = "" 49 | output += "" 50 | output += "

Okay, how about this:

" 51 | output += "

%s

" % messagecontent[0] 52 | output += '''

What would you like me to say?

''' 53 | output += "" 54 | self.wfile.write(output) 55 | print output 56 | except: 57 | pass 58 | 59 | 60 | def main(): 61 | try: 62 | port = 8080 63 | server = HTTPServer(('', port), webServerHandler) 64 | print "Web Server running on port %s" % port 65 | server.serve_forever() 66 | except KeyboardInterrupt: 67 | print " ^C entered, stopping web server...." 68 | server.socket.close() 69 | 70 | if __name__ == '__main__': 71 | main() 72 | -------------------------------------------------------------------------------- /Lesson-3/01_First-Flask-App/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | app = Flask(__name__) 3 | 4 | 5 | @app.route('/') 6 | @app.route('/hello') 7 | def HelloWorld(): 8 | return "Hello World" 9 | 10 | if __name__ == '__main__': 11 | app.debug = True 12 | app.run(host='0.0.0.0', port=5000) 13 | -------------------------------------------------------------------------------- /Lesson-3/02_Adding-Database-to-Flask-Application/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | app = Flask(__name__) 6 | 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/hello') 17 | def HelloWorld(): 18 | restaurant = session.query(Restaurant).first() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 20 | output = '' 21 | for i in items: 22 | output += i.name 23 | output += '
' 24 | return output 25 | 26 | if __name__ == '__main__': 27 | app.debug = True 28 | app.run(host='0.0.0.0', port=5000) 29 | -------------------------------------------------------------------------------- /Lesson-3/03_-Listing-Menu-Items-with-Flask/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/hello') 17 | def HelloWorld(): 18 | restaurant = session.query(Restaurant).first() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 20 | output = '' 21 | for i in items: 22 | output += i.name 23 | output += '
' 24 | output += i.price 25 | output += '
' 26 | output += i.description 27 | output += '
' 28 | output += '
' 29 | return output 30 | 31 | if __name__ == '__main__': 32 | app.debug = True 33 | app.run(host='0.0.0.0', port=5000) 34 | -------------------------------------------------------------------------------- /Lesson-3/04_Routing/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | @app.route('/restaurants//') 15 | def restaurantMenu(restaurant_id): 16 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 17 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 18 | output = '' 19 | for i in items: 20 | output += i.name 21 | output += '
' 22 | output += i.price 23 | output += '
' 24 | output += i.description 25 | output += '
' 26 | output += '
' 27 | return output 28 | 29 | if __name__ == '__main__': 30 | app.debug = True 31 | app.run(host='0.0.0.0', port=5000) 32 | -------------------------------------------------------------------------------- /Lesson-3/05_Routing-Create-Quiz-Template-Code/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/restaurants//') 17 | def restaurantMenu(restaurant_id): 18 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 20 | output = '' 21 | for i in items: 22 | output += i.name 23 | output += '
' 24 | output += i.price 25 | output += '
' 26 | output += i.description 27 | output += '
' 28 | output += '
' 29 | return output 30 | 31 | # Task 1: Create route for newMenuItem function here 32 | 33 | 34 | def newMenuItem(restaurant_id): 35 | return "page to create a new menu item. Task 1 complete!" 36 | 37 | # Task 2: Create route for editMenuItem function here 38 | 39 | 40 | def editMenuItem(restaurant_id, menu_id): 41 | return "page to edit a menu item. Task 2 complete!" 42 | 43 | # Task 3: Create a route for deleteMenuItem function here 44 | 45 | 46 | def deleteMenuItem(restaurant_id, menu_id): 47 | return "page to delete a menu item. Task 3 complete!" 48 | 49 | if __name__ == '__main__': 50 | app.debug = True 51 | app.run(host='0.0.0.0', port=5000) 52 | -------------------------------------------------------------------------------- /Lesson-3/06_Routing-Quiz-Solution/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/restaurants//') 17 | def restaurantMenu(restaurant_id): 18 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 20 | output = '' 21 | for i in items: 22 | output += i.name 23 | output += '
' 24 | output += i.price 25 | output += '
' 26 | output += i.description 27 | output += '
' 28 | output += '
' 29 | return output 30 | 31 | # Task 1: Create route for newMenuItem function here 32 | 33 | 34 | @app.route('/restaurant//new/') 35 | def newMenuItem(restaurant_id): 36 | return "page to create a new menu item. Task 1 complete!" 37 | 38 | # Task 2: Create route for editMenuItem function here 39 | 40 | 41 | @app.route('/restaurant///edit/') 42 | def editMenuItem(restaurant_id, menu_id): 43 | return "page to edit a menu item. Task 2 complete!" 44 | 45 | # Task 3: Create a route for deleteMenuItem function here 46 | 47 | 48 | @app.route('/restaurant///delete/') 49 | def deleteMenuItem(restaurant_id, menu_id): 50 | return "page to delete a menu item. Task 3 complete!" 51 | 52 | 53 | if __name__ == '__main__': 54 | app.debug = True 55 | app.run(host='0.0.0.0', port=5000) 56 | -------------------------------------------------------------------------------- /Lesson-3/07_Menu-Template-Quiz/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

{{restaurant.name}}

6 | 7 | 8 | {% for i in items %} 9 | 10 |
11 | 12 |

{{i.name}}

13 | 14 |

{{i.description}}

15 | 16 |

{{i.price}}

17 | 18 |
19 | 20 | 21 | {% endfor %} 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Lesson-3/08_Menu-Template-Solution/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

{{restaurant.name}}

7 | 8 | 9 | {% for i in items %} 10 | 11 |
12 | 13 |

{{i.name}}

14 | 15 |

{{i.description}}

16 | 17 |

{{i.price}}

18 | 19 |
20 | 21 | 22 | {% endfor %} 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Lesson-3/08_Menu-Template-Solution/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | 9 | engine = create_engine('sqlite:///restaurantmenu.db') 10 | Base.metadata.bind = engine 11 | 12 | DBSession = sessionmaker(bind=engine) 13 | session = DBSession() 14 | 15 | 16 | @app.route('/') 17 | @app.route('/restaurants//') 18 | def restaurantMenu(restaurant_id): 19 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 20 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 21 | return render_template('menu.html', restaurant=restaurant, items=items) 22 | 23 | # Task 1: Create route for newMenuItem function here 24 | 25 | 26 | @app.route('/restaurant//new/') 27 | def newMenuItem(restaurant_id): 28 | return "page to create a new menu item. Task 1 complete!" 29 | 30 | # Task 2: Create route for editMenuItem function here 31 | 32 | 33 | @app.route('/restaurant///edit/') 34 | def editMenuItem(restaurant_id, menu_id): 35 | return "page to edit a menu item. Task 2 complete!" 36 | 37 | # Task 3: Create a route for deleteMenuItem function here 38 | 39 | 40 | @app.route('/restaurant///delete/') 41 | def deleteMenuItem(restaurant_id, menu_id): 42 | return "page to delete a menu item. Task 3 complete!" 43 | 44 | 45 | if __name__ == '__main__': 46 | app.debug = True 47 | app.run(host='0.0.0.0', port=5000) 48 | -------------------------------------------------------------------------------- /Lesson-3/09_url_for-quiz/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

{{restaurant.name}}

7 | 8 | 9 | {% for i in items %} 10 | 11 |
12 | 13 |

{{i.name}}

14 | 15 |

{{i.description}}

16 | 17 |

{{i.price}}

18 | 19 | 20 |
21 | 22 | 23 | {% endfor %} 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Lesson-3/10_url_for-Solution/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

{{restaurant.name}}

7 | 8 | 9 | {% for i in items %} 10 | 11 |
12 | 13 |

{{i.name}}

14 | 15 |

{{i.description}}

16 | 17 |

{{i.price}}

18 | 19 | Edit 20 | 21 |
22 | Delete 23 | 24 |
25 | 26 | 27 | {% endfor %} 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Lesson-3/11_form-requests-and-redirects/newmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

New Menu Item

4 | 5 |
6 | 7 |

Name:

8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Lesson-3/11_form-requests-and-redirects/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/restaurants//') 17 | def restaurantMenu(restaurant_id): 18 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 20 | return render_template('menu.html', restaurant=restaurant, items=items) 21 | 22 | # Task 1: Create route for newMenuItem function here 23 | 24 | 25 | @app.route('/restaurant//new/', methods=['GET', 'POST']) 26 | def newMenuItem(restaurant_id): 27 | if request.method == 'POST': 28 | newItem = MenuItem( 29 | name=request.form['name'], restaurant_id=restaurant_id) 30 | session.add(newItem) 31 | session.commit() 32 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 33 | else: 34 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 35 | 36 | # Task 2: Create route for editMenuItem function here 37 | 38 | 39 | @app.route('/restaurant///edit/') 40 | def editMenuItem(restaurant_id, menu_id): 41 | return "page to edit a menu item. Task 2 complete!" 42 | 43 | # Task 3: Create a route for deleteMenuItem function here 44 | 45 | 46 | @app.route('/restaurant///delete/') 47 | def deleteMenuItem(restaurant_id, menu_id): 48 | return "page to delete a menu item. Task 3 complete!" 49 | 50 | 51 | if __name__ == '__main__': 52 | app.debug = True 53 | app.run(host='0.0.0.0', port=5000) 54 | -------------------------------------------------------------------------------- /Lesson-3/12_Edit-Menu-Form/editmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Lesson-3/12_Edit-Menu-Form/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | def restaurantMenu(restaurant_id): 17 | restaurant = session.query(Restaurant).first() 18 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant.id) 19 | output = '' 20 | for i in items: 21 | output += i.name 22 | output += '
' 23 | output += i.price 24 | output += '
' 25 | output += i.description 26 | output += '
' 27 | output += '
' 28 | 29 | return output 30 | 31 | 32 | @app.route('/restaurants//') 33 | def restaurantMenu(restaurant_id): 34 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 35 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 36 | output = '' 37 | for i in items: 38 | output += i.name 39 | output += '
' 40 | output += i.price 41 | output += '
' 42 | output += i.description 43 | output += '
' 44 | output += '
' 45 | 46 | return output 47 | 48 | 49 | @app.route('/restaurants//new', methods=['GET', 'POST']) 50 | def newMenuItem(restaurant_id): 51 | 52 | if request.method == 'POST': 53 | newItem = MenuItem(name=request.form['name'], description=request.form[ 54 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 55 | session.add(newItem) 56 | session.commit() 57 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 58 | else: 59 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 60 | 61 | 62 | @app.route('/restaurants///edit', 63 | methods=['GET', 'POST']) 64 | def editMenuItem(restaurant_id, menu_id): 65 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 66 | if request.method == 'POST': 67 | if request.form['name']: 68 | editedItem.name = request.form['name'] 69 | session.add(editedItem) 70 | session.commit() 71 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 72 | else: 73 | # USE THE RENDER_TEMPLATE FUNCTION BELOW TO SEE THE VARIABLES YOU 74 | # SHOULD USE IN YOUR EDITMENUITEM TEMPLATE 75 | return render_template( 76 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 77 | 78 | 79 | @app.route('/restaurant///delete/') 80 | def deleteMenuItem(restaurant_id, menu_id): 81 | return "page to delete a new menu item." 82 | 83 | if __name__ == '__main__': 84 | app.debug = True 85 | app.run(host='0.0.0.0', port=5000) 86 | -------------------------------------------------------------------------------- /Lesson-3/13_Edit-Menu-Form-Solution/editmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |

Name:

6 | 7 | 8 | 9 |
10 | Cancel 11 | 12 | 13 | -------------------------------------------------------------------------------- /Lesson-3/14_Delete-Menu-Item/deletemenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

Are you sure you want to delete {{item.name}}?

5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | Cancel 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Lesson-3/15_Delete-Menu-Item-Solution/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/restaurants//menu') 17 | def restaurantMenu(restaurant_id): 18 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 20 | return render_template( 21 | 'menu.html', restaurant=restaurant, items=items, restaurant_id=restaurant_id) 22 | 23 | 24 | @app.route('/restaurants//new', methods=['GET', 'POST']) 25 | def newMenuItem(restaurant_id): 26 | 27 | if request.method == 'POST': 28 | newItem = MenuItem(name=request.form['name'], description=request.form[ 29 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 30 | session.add(newItem) 31 | session.commit() 32 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 33 | else: 34 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 35 | 36 | 37 | @app.route('/restaurants///edit', 38 | methods=['GET', 'POST']) 39 | def editMenuItem(restaurant_id, menu_id): 40 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 41 | if request.method == 'POST': 42 | if request.form['name']: 43 | editedItem.name = request.form['name'] 44 | session.add(editedItem) 45 | session.commit() 46 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 47 | else: 48 | return render_template( 49 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 50 | 51 | 52 | # DELETE MENU ITEM SOLUTION 53 | @app.route('/restaurants///delete', 54 | methods=['GET', 'POST']) 55 | def deleteMenuItem(restaurant_id, menu_id): 56 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 57 | if request.method == 'POST': 58 | session.delete(itemToDelete) 59 | session.commit() 60 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 61 | else: 62 | return render_template('deletemenuitem.html', item=itemToDelete) 63 | 64 | 65 | if __name__ == '__main__': 66 | app.debug = True 67 | app.run(host='0.0.0.0', port=5000) 68 | -------------------------------------------------------------------------------- /Lesson-3/16_Flash-Messaging/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |

{{restaurant.name}}

6 | 7 | 8 | {% with messages = get_flashed_messages() %} 9 | {% if messages %} 10 | 11 |
    12 | {% for message in messages %} 13 |
  • {{message}}
  • 14 | {% endfor %} 15 |
16 | {% endif %} 17 | {% endwith %} 18 | 19 | 20 | {% for i in items %} 21 | 22 |
23 | 24 |

{{i.name}}

25 | 26 |

{{i.description}}

27 | 28 |

{{i.price}}

29 | 30 |
31 | 32 | 33 | {% endfor %} 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Lesson-3/16_Flash-Messaging/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for, flash 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/restaurants//menu') 17 | def restaurantMenu(restaurant_id): 18 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 20 | return render_template( 21 | 'menu.html', restaurant=restaurant, items=items, restaurant_id=restaurant_id) 22 | 23 | 24 | @app.route('/restaurants//new', methods=['GET', 'POST']) 25 | def newMenuItem(restaurant_id): 26 | 27 | if request.method == 'POST': 28 | newItem = MenuItem(name=request.form['name'], description=request.form[ 29 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 30 | session.add(newItem) 31 | session.commit() 32 | flash("new menu item created!") 33 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 34 | else: 35 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 36 | 37 | 38 | @app.route('/restaurants///edit', 39 | methods=['GET', 'POST']) 40 | def editMenuItem(restaurant_id, menu_id): 41 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 42 | if request.method == 'POST': 43 | if request.form['name']: 44 | editedItem.name = request.form['name'] 45 | session.add(editedItem) 46 | session.commit() 47 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 48 | else: 49 | return render_template( 50 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 51 | 52 | 53 | # DELETE MENU ITEM SOLUTION 54 | @app.route('/restaurants///delete', 55 | methods=['GET', 'POST']) 56 | def deleteMenuItem(restaurant_id, menu_id): 57 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 58 | if request.method == 'POST': 59 | session.delete(itemToDelete) 60 | session.commit() 61 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 62 | else: 63 | return render_template('deleteconfirmation.html', item=itemToDelete) 64 | 65 | 66 | if __name__ == '__main__': 67 | app.secret_key = 'super_secret_key' 68 | app.debug = True 69 | app.run(host='0.0.0.0', port=5000) 70 | -------------------------------------------------------------------------------- /Lesson-3/17_Flash-Messaging-Solution/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for, flash 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/') 16 | @app.route('/restaurants//menu') 17 | def restaurantMenu(restaurant_id): 18 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 19 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 20 | return render_template( 21 | 'menu.html', restaurant=restaurant, items=items, restaurant_id=restaurant_id) 22 | 23 | 24 | @app.route('/restaurants//new', methods=['GET', 'POST']) 25 | def newMenuItem(restaurant_id): 26 | 27 | if request.method == 'POST': 28 | newItem = MenuItem(name=request.form['name'], description=request.form[ 29 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 30 | session.add(newItem) 31 | session.commit() 32 | flash("new menu item created!") 33 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 34 | else: 35 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 36 | 37 | 38 | @app.route('/restaurants///edit', 39 | methods=['GET', 'POST']) 40 | def editMenuItem(restaurant_id, menu_id): 41 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 42 | if request.method == 'POST': 43 | if request.form['name']: 44 | editedItem.name = request.form['name'] 45 | session.add(editedItem) 46 | session.commit() 47 | flash("Menu Item has been edited") 48 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 49 | else: 50 | return render_template( 51 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 52 | 53 | 54 | # DELETE MENU ITEM SOLUTION 55 | @app.route('/restaurants///delete', 56 | methods=['GET', 'POST']) 57 | def deleteMenuItem(restaurant_id, menu_id): 58 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 59 | if request.method == 'POST': 60 | session.delete(itemToDelete) 61 | session.commit() 62 | flash("Menu Item has been deleted") 63 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 64 | else: 65 | return render_template('deleteconfirmation.html', item=itemToDelete) 66 | 67 | 68 | if __name__ == '__main__': 69 | app.secret_key = 'super_secret_key' 70 | app.debug = True 71 | app.run(host='0.0.0.0', port=5000) 72 | -------------------------------------------------------------------------------- /Lesson-3/18_Styling/static/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | background-color: #333333 4 | } 5 | 6 | h1, 7 | h2, 8 | h3, 9 | h4 { 10 | color: #ffffff; 11 | } 12 | 13 | h1, 14 | h2 { 15 | font-family: 'georgia', serif; 16 | margin: 0; 17 | } 18 | 19 | h1 { 20 | border-bottom: 2px solid #eee; 21 | } 22 | 23 | h2 { 24 | font-size: 1.2em; 25 | } 26 | 27 | p, 28 | dd, 29 | dt { 30 | color: #cccccc; 31 | } 32 | 33 | a { 34 | text-decoration: none; 35 | color: #ffffcc; 36 | font-size: .75em; 37 | } 38 | 39 | .pane { 40 | position: absolute; 41 | left: 25%; 42 | border: 2px solid; 43 | border-radius: 25px; 44 | padding: 5px; 45 | margin: 5px; 46 | border-color: #999999; 47 | background-color: #333333 48 | } 49 | 50 | .header { 51 | left: 50%; 52 | text-align: center; 53 | } 54 | 55 | .name { 56 | width: 50%; 57 | display: inline-block; 58 | float: left; 59 | } 60 | 61 | .description {} 62 | 63 | .price { 64 | text-align: right; 65 | width: 50%; 66 | float: right; 67 | } 68 | 69 | .editdeletepane {} 70 | 71 | .flash { 72 | background: #cee5f5; 73 | } 74 | -------------------------------------------------------------------------------- /Lesson-3/18_Styling/templates/deletemenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Are you sure you want to delete {{item.name}}?

7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | Cancel 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Lesson-3/18_Styling/templates/editmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Edit Menu Item

8 | 9 |
10 | 11 |
12 |
Name:
13 |
14 |
Description:
15 |
16 |
Price:
17 |
18 |
Course:
19 | 20 | {% if item.course == 'Appetizier' %} 21 |
Appetizer
22 | {%else%} 23 |
Appetizer
24 | {% endif %} 25 | 26 | {% if item.course == 'Entree' %} 27 |
Entree
28 | 29 | {%else%} 30 |
Entree
31 | {% endif %} 32 | 33 | {% if item.course == 'Dessert'%} 34 |
Dessert
35 | 36 | {% else %} 37 |
Dessert
38 | 39 | {% endif %} 40 | 41 | 42 | {%if item.course =='Beverage'%} 43 |
Beverage
44 | {% else %} 45 |
Beverage
46 | {% endif %} 47 | 48 | 49 | 50 | 51 | 52 |
53 | 54 | 55 | 56 | 57 | Cancel 58 |
59 | 60 | 61 | -------------------------------------------------------------------------------- /Lesson-3/18_Styling/templates/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

{{ restaurant.name }}

11 |
12 | 13 | Create New Item 14 | 15 | 16 |
17 | {% with messages = get_flashed_messages() %} 18 | {% if messages %} 19 | 20 |
    21 | {% for message in messages %} 22 |
  • {{ message }}
  • 23 | {% endfor %} 24 |
25 | {% endif %} 26 | {% endwith %} 27 | 28 |
29 | 30 | 31 | {% for i in items %} 32 |
33 |

{{i.name}}

34 | 35 | 36 | 37 | 38 |

{{i.price}}

39 |
40 |
41 | 42 | 43 | 44 |
45 |

{{i.description}}

46 |
47 | 48 | 49 | 50 |
51 | 52 | Edit 53 | 54 | Delete 55 |
56 | 57 | 58 | 59 | 60 | {% endfor %} 61 | 62 | 63 | 64 | 65 | 66 |
67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /Lesson-3/18_Styling/templates/newmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

New Menu Item

8 | 9 |
10 |
11 | 12 |
13 |
Name:
14 |
15 |
16 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Lesson-3/19_Responding-with-JSON/database_setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from sqlalchemy import Column, ForeignKey, Integer, String 4 | from sqlalchemy.ext.declarative import declarative_base 5 | from sqlalchemy.orm import relationship 6 | from sqlalchemy import create_engine 7 | 8 | Base = declarative_base() 9 | 10 | 11 | class Restaurant(Base): 12 | __tablename__ = 'restaurant' 13 | 14 | id = Column(Integer, primary_key=True) 15 | name = Column(String(250), nullable=False) 16 | 17 | 18 | class MenuItem(Base): 19 | __tablename__ = 'menu_item' 20 | 21 | name = Column(String(80), nullable=False) 22 | id = Column(Integer, primary_key=True) 23 | description = Column(String(250)) 24 | price = Column(String(8)) 25 | course = Column(String(250)) 26 | restaurant_id = Column(Integer, ForeignKey('restaurant.id')) 27 | restaurant = relationship(Restaurant) 28 | 29 | # We added this serialize function to be able to send JSON objects in a 30 | # serializable format 31 | @property 32 | def serialize(self): 33 | 34 | return { 35 | 'name': self.name, 36 | 'description': self.description, 37 | 'id': self.id, 38 | 'price': self.price, 39 | 'course': self.course, 40 | } 41 | 42 | 43 | engine = create_engine('sqlite:///restaurantmenu.db') 44 | 45 | 46 | Base.metadata.create_all(engine) 47 | -------------------------------------------------------------------------------- /Lesson-3/19_Responding-with-JSON/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for, jsonify 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/restaurants//menu/JSON') 16 | def restaurantMenuJSON(restaurant_id): 17 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 18 | items = session.query(MenuItem).filter_by( 19 | restaurant_id=restaurant_id).all() 20 | return jsonify(MenuItems=[i.serialize for i in items]) 21 | 22 | 23 | # ADD JSON API ENDPOINT HERE 24 | 25 | 26 | @app.route('/') 27 | @app.route('/restaurants//menu') 28 | def restaurantMenu(restaurant_id): 29 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 30 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 31 | return render_template( 32 | 'menu.html', restaurant=restaurant, items=items, restaurant_id=restaurant_id) 33 | 34 | 35 | @app.route('/restaurants//new', methods=['GET', 'POST']) 36 | def newMenuItem(restaurant_id): 37 | 38 | if request.method == 'POST': 39 | newItem = MenuItem(name=request.form['name'], description=request.form[ 40 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 41 | session.add(newItem) 42 | session.commit() 43 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 44 | else: 45 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 46 | 47 | 48 | @app.route('/restaurants///edit', 49 | methods=['GET', 'POST']) 50 | def editMenuItem(restaurant_id, menu_id): 51 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 52 | if request.method == 'POST': 53 | if request.form['name']: 54 | editedItem.name = request.form['name'] 55 | if request.form['description']: 56 | editedItem.description = request.form['name'] 57 | if request.form['price']: 58 | editedItem.price = request.form['price'] 59 | if request.form['course']: 60 | editedItem.course = request.form['course'] 61 | session.add(editedItem) 62 | session.commit() 63 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 64 | else: 65 | 66 | return render_template( 67 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 68 | 69 | 70 | @app.route('/restaurants///delete', 71 | methods=['GET', 'POST']) 72 | def deleteMenuItem(restaurant_id, menu_id): 73 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 74 | if request.method == 'POST': 75 | session.delete(itemToDelete) 76 | session.commit() 77 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 78 | else: 79 | return render_template('deleteconfirmation.html', item=itemToDelete) 80 | 81 | 82 | if __name__ == '__main__': 83 | app.debug = True 84 | app.run(host='0.0.0.0', port=5000) 85 | -------------------------------------------------------------------------------- /Lesson-3/20_JSON-Solution/database_setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from sqlalchemy import Column, ForeignKey, Integer, String 4 | from sqlalchemy.ext.declarative import declarative_base 5 | from sqlalchemy.orm import relationship 6 | from sqlalchemy import create_engine 7 | 8 | Base = declarative_base() 9 | 10 | 11 | class Restaurant(Base): 12 | __tablename__ = 'restaurant' 13 | 14 | id = Column(Integer, primary_key=True) 15 | name = Column(String(250), nullable=False) 16 | 17 | @property 18 | def serialize(self): 19 | """Return object data in easily serializeable format""" 20 | return { 21 | 'name': self.name, 22 | 'id': self.id, 23 | } 24 | 25 | 26 | class MenuItem(Base): 27 | __tablename__ = 'menu_item' 28 | 29 | name = Column(String(80), nullable=False) 30 | id = Column(Integer, primary_key=True) 31 | description = Column(String(250)) 32 | price = Column(String(8)) 33 | course = Column(String(250)) 34 | restaurant_id = Column(Integer, ForeignKey('restaurant.id')) 35 | restaurant = relationship(Restaurant) 36 | 37 | @property 38 | def serialize(self): 39 | """Return object data in easily serializeable format""" 40 | return { 41 | 'name': self.name, 42 | 'description': self.description, 43 | 'id': self.id, 44 | 'price': self.price, 45 | 'course': self.course, 46 | } 47 | 48 | 49 | engine = create_engine('sqlite:///restaurantmenu.db') 50 | 51 | 52 | Base.metadata.create_all(engine) 53 | -------------------------------------------------------------------------------- /Lesson-3/20_JSON-Solution/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for, jsonify 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/restaurants//menu/JSON') 16 | def restaurantMenuJSON(restaurant_id): 17 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 18 | items = session.query(MenuItem).filter_by( 19 | restaurant_id=restaurant_id).all() 20 | return jsonify(MenuItems=[i.serialize for i in items]) 21 | 22 | 23 | # ADD JSON ENDPOINT HERE 24 | @app.route('/restaurants//menu//JSON') 25 | def menuItemJSON(restaurant_id, menu_id): 26 | menuItem = session.query(MenuItem).filter_by(id=menu_id).one() 27 | return jsonify(MenuItem=menuItem.serialize) 28 | 29 | 30 | @app.route('/') 31 | @app.route('/restaurants//menu') 32 | def restaurantMenu(restaurant_id): 33 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 34 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 35 | return render_template( 36 | 'menu.html', restaurant=restaurant, items=items, restaurant_id=restaurant_id) 37 | 38 | 39 | @app.route('/restaurants//new', methods=['GET', 'POST']) 40 | def newMenuItem(restaurant_id): 41 | 42 | if request.method == 'POST': 43 | newItem = MenuItem(name=request.form['name'], description=request.form[ 44 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 45 | session.add(newItem) 46 | session.commit() 47 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 48 | else: 49 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 50 | 51 | 52 | @app.route('/restaurants///edit', 53 | methods=['GET', 'POST']) 54 | def editMenuItem(restaurant_id, menu_id): 55 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 56 | if request.method == 'POST': 57 | if request.form['name']: 58 | editedItem.name = request.form['name'] 59 | if request.form['description']: 60 | editedItem.description = request.form['name'] 61 | if request.form['price']: 62 | editedItem.price = request.form['price'] 63 | if request.form['course']: 64 | editedItem.course = request.form['course'] 65 | session.add(editedItem) 66 | session.commit() 67 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 68 | else: 69 | 70 | return render_template( 71 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 72 | 73 | 74 | @app.route('/restaurants///delete', 75 | methods=['GET', 'POST']) 76 | def deleteMenuItem(restaurant_id, menu_id): 77 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 78 | if request.method == 'POST': 79 | session.delete(itemToDelete) 80 | session.commit() 81 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 82 | else: 83 | return render_template('deleteconfirmation.html', item=itemToDelete) 84 | 85 | 86 | if __name__ == '__main__': 87 | app.debug = True 88 | app.run(host='0.0.0.0', port=5000) 89 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/database_setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from sqlalchemy import Column, ForeignKey, Integer, String 4 | from sqlalchemy.ext.declarative import declarative_base 5 | from sqlalchemy.orm import relationship 6 | from sqlalchemy import create_engine 7 | 8 | Base = declarative_base() 9 | 10 | 11 | class Restaurant(Base): 12 | __tablename__ = 'restaurant' 13 | 14 | id = Column(Integer, primary_key=True) 15 | name = Column(String(250), nullable=False) 16 | 17 | @property 18 | def serialize(self): 19 | """Return object data in easily serializeable format""" 20 | return { 21 | 'name': self.name, 22 | 'id': self.id, 23 | } 24 | 25 | 26 | class MenuItem(Base): 27 | __tablename__ = 'menu_item' 28 | 29 | name = Column(String(80), nullable=False) 30 | id = Column(Integer, primary_key=True) 31 | description = Column(String(250)) 32 | price = Column(String(8)) 33 | course = Column(String(250)) 34 | restaurant_id = Column(Integer, ForeignKey('restaurant.id')) 35 | restaurant = relationship(Restaurant) 36 | 37 | @property 38 | def serialize(self): 39 | """Return object data in easily serializeable format""" 40 | return { 41 | 'name': self.name, 42 | 'description': self.description, 43 | 'id': self.id, 44 | 'price': self.price, 45 | 'course': self.course, 46 | } 47 | 48 | 49 | engine = create_engine('sqlite:///restaurantmenu.db') 50 | 51 | 52 | Base.metadata.create_all(engine) 53 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/project.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, url_for, jsonify 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | @app.route('/restaurants//menu/JSON') 16 | def restaurantMenuJSON(restaurant_id): 17 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 18 | items = session.query(MenuItem).filter_by( 19 | restaurant_id=restaurant_id).all() 20 | return jsonify(MenuItems=[i.serialize for i in items]) 21 | 22 | 23 | # ADD JSON ENDPOINT HERE 24 | @app.route('/restaurants//menu/JSON') 25 | def menuItemJSON(restaurant_id, menu_id): 26 | menuItem = session.query(MenuItem).filter_by(id=menu_id).one() 27 | return jsonify(MenuItem=menuItem.serialize) 28 | 29 | 30 | @app.route('/') 31 | @app.route('/restaurants//menu') 32 | def restaurantMenu(restaurant_id): 33 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 34 | items = session.query(MenuItem).filter_by(restaurant_id=restaurant_id) 35 | return render_template( 36 | 'menu.html', restaurant=restaurant, items=items, restaurant_id=restaurant_id) 37 | 38 | 39 | @app.route('/restaurants//new', methods=['GET', 'POST']) 40 | def newMenuItem(restaurant_id): 41 | 42 | if request.method == 'POST': 43 | newItem = MenuItem(name=request.form['name'], description=request.form[ 44 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 45 | session.add(newItem) 46 | session.commit() 47 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 48 | else: 49 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 50 | 51 | 52 | @app.route('/restaurants///edit', 53 | methods=['GET', 'POST']) 54 | def editMenuItem(restaurant_id, menu_id): 55 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 56 | if request.method == 'POST': 57 | if request.form['name']: 58 | editedItem.name = request.form['name'] 59 | if request.form['description']: 60 | editedItem.description = request.form['description'] 61 | if request.form['price']: 62 | editedItem.price = request.form['price'] 63 | if request.form['course']: 64 | editedItem.course = request.form['course'] 65 | session.add(editedItem) 66 | session.commit() 67 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 68 | else: 69 | 70 | return render_template( 71 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 72 | 73 | 74 | @app.route('/restaurants///delete', 75 | methods=['GET', 'POST']) 76 | def deleteMenuItem(restaurant_id, menu_id): 77 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 78 | if request.method == 'POST': 79 | session.delete(itemToDelete) 80 | session.commit() 81 | return redirect(url_for('restaurantMenu', restaurant_id=restaurant_id)) 82 | else: 83 | return render_template('deletemenuitem.html', item=itemToDelete) 84 | 85 | 86 | if __name__ == '__main__': 87 | app.debug = True 88 | app.run(host='0.0.0.0', port=5000) 89 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/static/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: sans-serif; 3 | background-color: #333333 4 | } 5 | 6 | h1, 7 | h2, 8 | h3, 9 | h4 { 10 | color: #ffffff; 11 | } 12 | 13 | h1, 14 | h2 { 15 | font-family: 'georgia', serif; 16 | margin: 0; 17 | } 18 | 19 | h1 { 20 | border-bottom: 2px solid #eee; 21 | } 22 | 23 | h2 { 24 | font-size: 1.2em; 25 | } 26 | 27 | p, 28 | dd, 29 | dt { 30 | color: #cccccc; 31 | } 32 | 33 | a { 34 | text-decoration: none; 35 | color: #ffffcc; 36 | font-size: .75em; 37 | } 38 | 39 | .pane { 40 | position: absolute; 41 | left: 25%; 42 | border: 2px solid; 43 | border-radius: 25px; 44 | padding: 5px; 45 | margin: 5px; 46 | border-color: #999999; 47 | background-color: #333333 48 | } 49 | 50 | .header { 51 | left: 50%; 52 | text-align: center; 53 | } 54 | 55 | .name { 56 | width: 50%; 57 | display: inline-block; 58 | float: left; 59 | } 60 | 61 | .description {} 62 | 63 | .price { 64 | text-align: right; 65 | width: 50%; 66 | float: right; 67 | } 68 | 69 | .editdeletepane {} 70 | 71 | .flash { 72 | background: #cee5f5; 73 | } 74 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/templates/deletemenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |

Are you sure you want to delete {{item.name}}?

7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | Cancel 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/templates/editmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Edit Menu Item

8 | 9 |
10 | 11 |
12 |
Name:
13 |
14 |
Description:
15 |
16 |
Price:
17 |
18 |
Course:
19 | 20 | {% if item.course == 'Appetizer' %} 21 |
Appetizer
22 | {%else%} 23 |
Appetizer
24 | {% endif %} 25 | 26 | {% if item.course == 'Entree' %} 27 |
Entree
28 | 29 | {%else%} 30 |
Entree
31 | {% endif %} 32 | 33 | {% if item.course == 'Dessert'%} 34 |
Dessert
35 | 36 | {% else %} 37 |
Dessert
38 | 39 | {% endif %} 40 | 41 | 42 | {%if item.course =='Beverage'%} 43 |
Beverage
44 | {% else %} 45 |
Beverage
46 | {% endif %} 47 | 48 | 49 | 50 | 51 | 52 |
53 | 54 | 55 | 56 | 57 | Cancel 58 |
59 | 60 | 61 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/templates/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

{{ restaurant.name }}

11 |
12 | 13 | Create New Item 14 | 15 | 16 |
17 | {% with messages = get_flashed_messages() %} 18 | {% if messages %} 19 | 20 |
    21 | {% for message in messages %} 22 |
  • {{ message }}
  • 23 | {% endfor %} 24 |
25 | {% endif %} 26 | {% endwith %} 27 | 28 |
29 | 30 | 31 | {% for i in items %} 32 |
33 |

{{i.name}}

34 | 35 | 36 | 37 | 38 |

{{i.price}}

39 |
40 |
41 | 42 | 43 | 44 |
45 |

{{i.description}}

46 |
47 | 48 | 49 | 50 |
51 | 52 | Edit 53 | 54 | Delete 55 |
56 | 57 | 58 | 59 | 60 | {% endfor %} 61 | 62 | 63 | 64 | 65 | 66 |
67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /Lesson-3/Final-Flask-Application/templates/newmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

New Menu Item

8 | 9 |
10 |
11 | 12 |
13 |
Name:
14 |
15 |
Description:
16 |
17 |
Price:
18 |
19 |
Course:
20 |
Appetizer
21 |
Entree
22 |
Dessert
23 |
Beverage
24 |
25 | 26 | 27 | 28 | 29 |
30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Lesson-4/FakeMenuItems.py: -------------------------------------------------------------------------------- 1 | # Fake Restaurants 2 | restaurant = {'name': 'The CRUDdy Crab', 'id': '1'} 3 | 4 | restaurants = [{'name': 'The CRUDdy Crab', 'id': '1'}, { 5 | 'name': 'Blue Burgers', 'id': '2'}, {'name': 'Taco Hut', 'id': '3'}] 6 | 7 | 8 | # Fake Menu Items 9 | items = [{'name': 'Cheese Pizza', 'description': 'made with fresh cheese', 'price': '$5.99', 'course': 'Entree', 'id': '1'}, {'name': 'Chocolate Cake', 'description': 'made with Dutch Chocolate', 'price': '$3.99', 'course': 'Dessert', 'id': '2'}, {'name': 'Caesar Salad', 'description': 10 | 'with fresh organic vegetables', 'price': '$5.99', 'course': 'Entree', 'id': '3'}, {'name': 'Iced Tea', 'description': 'with lemon', 'price': '$.99', 'course': 'Beverage', 'id': '4'}, {'name': 'Spinach Dip', 'description': 'creamy dip with fresh spinach', 'price': '$1.99', 'course': 'Appetizer', 'id': '5'}] 11 | item = {'name': 'Cheese Pizza', 'description': 'made with fresh cheese', 12 | 'price': '$5.99', 'course': 'Entree'} 13 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/README.txt: -------------------------------------------------------------------------------- 1 | To run this final project 2 | 3 | 1. Navigate to the Full-Stack-Foundations/Lesson-4/Final-Project directory inside the vagrant environment 4 | 5 | 2. run database_setup.py to create the database 6 | 7 | 3. run lotsofmenus.py to populate the database 8 | 9 | 4. run finalproject.py and navigate to localhost:5000 in your browser 10 | 11 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/database_setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from sqlalchemy import Column, ForeignKey, Integer, String 4 | from sqlalchemy.ext.declarative import declarative_base 5 | from sqlalchemy.orm import relationship 6 | from sqlalchemy import create_engine 7 | 8 | Base = declarative_base() 9 | 10 | 11 | class Restaurant(Base): 12 | __tablename__ = 'restaurant' 13 | 14 | id = Column(Integer, primary_key=True) 15 | name = Column(String(250), nullable=False) 16 | 17 | @property 18 | def serialize(self): 19 | """Return object data in easily serializeable format""" 20 | return { 21 | 'name': self.name, 22 | 'id': self.id, 23 | } 24 | 25 | 26 | class MenuItem(Base): 27 | __tablename__ = 'menu_item' 28 | 29 | name = Column(String(80), nullable=False) 30 | id = Column(Integer, primary_key=True) 31 | description = Column(String(250)) 32 | price = Column(String(8)) 33 | course = Column(String(250)) 34 | restaurant_id = Column(Integer, ForeignKey('restaurant.id')) 35 | restaurant = relationship(Restaurant) 36 | 37 | @property 38 | def serialize(self): 39 | """Return object data in easily serializeable format""" 40 | return { 41 | 'name': self.name, 42 | 'description': self.description, 43 | 'id': self.id, 44 | 'price': self.price, 45 | 'course': self.course, 46 | } 47 | 48 | 49 | engine = create_engine('sqlite:///restaurantmenu.db') 50 | 51 | 52 | Base.metadata.create_all(engine) 53 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/finalproject.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, request, redirect, jsonify, url_for 2 | from sqlalchemy import create_engine 3 | from sqlalchemy.orm import sessionmaker 4 | from database_setup import Base, Restaurant, MenuItem 5 | 6 | app = Flask(__name__) 7 | 8 | engine = create_engine('sqlite:///restaurantmenu.db') 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | session = DBSession() 13 | 14 | 15 | # Fake Restaurants 16 | # restaurant = {'name': 'The CRUDdy Crab', 'id': '1'} 17 | 18 | # restaurants = [{'name': 'The CRUDdy Crab', 'id': '1'}, {'name':'Blue Burgers', 'id':'2'},{'name':'Taco Hut', 'id':'3'}] 19 | 20 | 21 | # Fake Menu Items 22 | # items = [ {'name':'Cheese Pizza', 'description':'made with fresh cheese', 'price':'$5.99','course' :'Entree', 'id':'1'}, {'name':'Chocolate Cake','description':'made with Dutch Chocolate', 'price':'$3.99', 'course':'Dessert','id':'2'},{'name':'Caesar Salad', 'description':'with fresh organic vegetables','price':'$5.99', 'course':'Entree','id':'3'},{'name':'Iced Tea', 'description':'with lemon','price':'$.99', 'course':'Beverage','id':'4'},{'name':'Spinach Dip', 'description':'creamy dip with fresh spinach','price':'$1.99', 'course':'Appetizer','id':'5'} ] 23 | # item = {'name':'Cheese Pizza','description':'made with fresh cheese','price':'$5.99','course' :'Entree'} 24 | # items = [] 25 | 26 | 27 | @app.route('/restaurant//menu/JSON') 28 | def restaurantMenuJSON(restaurant_id): 29 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 30 | items = session.query(MenuItem).filter_by( 31 | restaurant_id=restaurant_id).all() 32 | return jsonify(MenuItems=[i.serialize for i in items]) 33 | 34 | 35 | @app.route('/restaurant//menu//JSON') 36 | def menuItemJSON(restaurant_id, menu_id): 37 | Menu_Item = session.query(MenuItem).filter_by(id=menu_id).one() 38 | return jsonify(Menu_Item=Menu_Item.serialize) 39 | 40 | 41 | @app.route('/restaurant/JSON') 42 | def restaurantsJSON(): 43 | restaurants = session.query(Restaurant).all() 44 | return jsonify(restaurants=[r.serialize for r in restaurants]) 45 | 46 | 47 | # Show all restaurants 48 | @app.route('/') 49 | @app.route('/restaurant/') 50 | def showRestaurants(): 51 | restaurants = session.query(Restaurant).all() 52 | # return "This page will show all my restaurants" 53 | return render_template('restaurants.html', restaurants=restaurants) 54 | 55 | 56 | # Create a new restaurant 57 | @app.route('/restaurant/new/', methods=['GET', 'POST']) 58 | def newRestaurant(): 59 | if request.method == 'POST': 60 | newRestaurant = Restaurant(name=request.form['name']) 61 | session.add(newRestaurant) 62 | session.commit() 63 | return redirect(url_for('showRestaurants')) 64 | else: 65 | return render_template('newRestaurant.html') 66 | # return "This page will be for making a new restaurant" 67 | 68 | # Edit a restaurant 69 | 70 | 71 | @app.route('/restaurant//edit/', methods=['GET', 'POST']) 72 | def editRestaurant(restaurant_id): 73 | editedRestaurant = session.query( 74 | Restaurant).filter_by(id=restaurant_id).one() 75 | if request.method == 'POST': 76 | if request.form['name']: 77 | editedRestaurant.name = request.form['name'] 78 | return redirect(url_for('showRestaurants')) 79 | else: 80 | return render_template( 81 | 'editRestaurant.html', restaurant=editedRestaurant) 82 | 83 | # return 'This page will be for editing restaurant %s' % restaurant_id 84 | 85 | # Delete a restaurant 86 | 87 | 88 | @app.route('/restaurant//delete/', methods=['GET', 'POST']) 89 | def deleteRestaurant(restaurant_id): 90 | restaurantToDelete = session.query( 91 | Restaurant).filter_by(id=restaurant_id).one() 92 | if request.method == 'POST': 93 | session.delete(restaurantToDelete) 94 | session.commit() 95 | return redirect( 96 | url_for('showRestaurants', restaurant_id=restaurant_id)) 97 | else: 98 | return render_template( 99 | 'deleteRestaurant.html', restaurant=restaurantToDelete) 100 | # return 'This page will be for deleting restaurant %s' % restaurant_id 101 | 102 | 103 | # Show a restaurant menu 104 | @app.route('/restaurant//') 105 | @app.route('/restaurant//menu/') 106 | def showMenu(restaurant_id): 107 | restaurant = session.query(Restaurant).filter_by(id=restaurant_id).one() 108 | items = session.query(MenuItem).filter_by( 109 | restaurant_id=restaurant_id).all() 110 | return render_template('menu.html', items=items, restaurant=restaurant) 111 | # return 'This page is the menu for restaurant %s' % restaurant_id 112 | 113 | # Create a new menu item 114 | 115 | 116 | @app.route( 117 | '/restaurant//menu/new/', methods=['GET', 'POST']) 118 | def newMenuItem(restaurant_id): 119 | if request.method == 'POST': 120 | newItem = MenuItem(name=request.form['name'], description=request.form[ 121 | 'description'], price=request.form['price'], course=request.form['course'], restaurant_id=restaurant_id) 122 | session.add(newItem) 123 | session.commit() 124 | 125 | return redirect(url_for('showMenu', restaurant_id=restaurant_id)) 126 | else: 127 | return render_template('newmenuitem.html', restaurant_id=restaurant_id) 128 | 129 | # Edit a menu item 130 | 131 | 132 | @app.route('/restaurant//menu//edit', 133 | methods=['GET', 'POST']) 134 | def editMenuItem(restaurant_id, menu_id): 135 | editedItem = session.query(MenuItem).filter_by(id=menu_id).one() 136 | if request.method == 'POST': 137 | if request.form['name']: 138 | editedItem.name = request.form['name'] 139 | if request.form['description']: 140 | editedItem.description = request.form['name'] 141 | if request.form['price']: 142 | editedItem.price = request.form['price'] 143 | if request.form['course']: 144 | editedItem.course = request.form['course'] 145 | session.add(editedItem) 146 | session.commit() 147 | return redirect(url_for('showMenu', restaurant_id=restaurant_id)) 148 | else: 149 | 150 | return render_template( 151 | 'editmenuitem.html', restaurant_id=restaurant_id, menu_id=menu_id, item=editedItem) 152 | 153 | # return 'This page is for editing menu item %s' % menu_id 154 | 155 | # Delete a menu item 156 | 157 | 158 | @app.route('/restaurant//menu//delete', 159 | methods=['GET', 'POST']) 160 | def deleteMenuItem(restaurant_id, menu_id): 161 | itemToDelete = session.query(MenuItem).filter_by(id=menu_id).one() 162 | if request.method == 'POST': 163 | session.delete(itemToDelete) 164 | session.commit() 165 | return redirect(url_for('showMenu', restaurant_id=restaurant_id)) 166 | else: 167 | return render_template('deleteMenuItem.html', item=itemToDelete) 168 | # return "This page is for deleting menu item %s" % menu_id 169 | 170 | 171 | if __name__ == '__main__': 172 | app.debug = True 173 | app.run(host='0.0.0.0', port=5000) 174 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/lotsofmenus.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine 2 | from sqlalchemy.orm import sessionmaker 3 | 4 | from database_setup import Restaurant, Base, MenuItem 5 | 6 | engine = create_engine('sqlite:///restaurantmenu.db') 7 | # Bind the engine to the metadata of the Base class so that the 8 | # declaratives can be accessed through a DBSession instance 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | # A DBSession() instance establishes all conversations with the database 13 | # and represents a "staging zone" for all the objects loaded into the 14 | # database session object. Any change made against the objects in the 15 | # session won't be persisted into the database until you call 16 | # session.commit(). If you're not happy about the changes, you can 17 | # revert all of them back to the last commit by calling 18 | # session.rollback() 19 | session = DBSession() 20 | 21 | 22 | # Menu for UrbanBurger 23 | restaurant1 = Restaurant(name="Urban Burger") 24 | 25 | session.add(restaurant1) 26 | session.commit() 27 | 28 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 29 | price="$7.50", course="Entree", restaurant=restaurant1) 30 | 31 | session.add(menuItem2) 32 | session.commit() 33 | 34 | 35 | menuItem1 = MenuItem(name="French Fries", description="with garlic and parmesan", 36 | price="$2.99", course="Appetizer", restaurant=restaurant1) 37 | 38 | session.add(menuItem1) 39 | session.commit() 40 | 41 | menuItem2 = MenuItem(name="Chicken Burger", description="Juicy grilled chicken patty with tomato mayo and lettuce", 42 | price="$5.50", course="Entree", restaurant=restaurant1) 43 | 44 | session.add(menuItem2) 45 | session.commit() 46 | 47 | menuItem3 = MenuItem(name="Chocolate Cake", description="fresh baked and served with ice cream", 48 | price="$3.99", course="Dessert", restaurant=restaurant1) 49 | 50 | session.add(menuItem3) 51 | session.commit() 52 | 53 | menuItem4 = MenuItem(name="Sirloin Burger", description="Made with grade A beef", 54 | price="$7.99", course="Entree", restaurant=restaurant1) 55 | 56 | session.add(menuItem4) 57 | session.commit() 58 | 59 | menuItem5 = MenuItem(name="Root Beer", description="16oz of refreshing goodness", 60 | price="$1.99", course="Beverage", restaurant=restaurant1) 61 | 62 | session.add(menuItem5) 63 | session.commit() 64 | 65 | menuItem6 = MenuItem(name="Iced Tea", description="with Lemon", 66 | price="$.99", course="Beverage", restaurant=restaurant1) 67 | 68 | session.add(menuItem6) 69 | session.commit() 70 | 71 | menuItem7 = MenuItem(name="Grilled Cheese Sandwich", description="On texas toast with American Cheese", 72 | price="$3.49", course="Entree", restaurant=restaurant1) 73 | 74 | session.add(menuItem7) 75 | session.commit() 76 | 77 | menuItem8 = MenuItem(name="Veggie Burger", description="Made with freshest of ingredients and home grown spices", 78 | price="$5.99", course="Entree", restaurant=restaurant1) 79 | 80 | session.add(menuItem8) 81 | session.commit() 82 | 83 | 84 | # Menu for Super Stir Fry 85 | restaurant2 = Restaurant(name="Super Stir Fry") 86 | 87 | session.add(restaurant2) 88 | session.commit() 89 | 90 | 91 | menuItem1 = MenuItem(name="Chicken Stir Fry", description="With your choice of noodles vegetables and sauces", 92 | price="$7.99", course="Entree", restaurant=restaurant2) 93 | 94 | session.add(menuItem1) 95 | session.commit() 96 | 97 | menuItem2 = MenuItem( 98 | name="Peking Duck", description=" A famous duck dish from Beijing[1] that has been prepared since the imperial era. The meat is prized for its thin, crisp skin, with authentic versions of the dish serving mostly the skin and little meat, sliced in front of the diners by the cook", price="$25", course="Entree", restaurant=restaurant2) 99 | 100 | session.add(menuItem2) 101 | session.commit() 102 | 103 | menuItem3 = MenuItem(name="Spicy Tuna Roll", description="Seared rare ahi, avocado, edamame, cucumber with wasabi soy sauce ", 104 | price="15", course="Entree", restaurant=restaurant2) 105 | 106 | session.add(menuItem3) 107 | session.commit() 108 | 109 | menuItem4 = MenuItem(name="Nepali Momo ", description="Steamed dumplings made with vegetables, spices and meat. ", 110 | price="12", course="Entree", restaurant=restaurant2) 111 | 112 | session.add(menuItem4) 113 | session.commit() 114 | 115 | menuItem5 = MenuItem(name="Beef Noodle Soup", description="A Chinese noodle soup made of stewed or red braised beef, beef broth, vegetables and Chinese noodles.", 116 | price="14", course="Entree", restaurant=restaurant2) 117 | 118 | session.add(menuItem5) 119 | session.commit() 120 | 121 | menuItem6 = MenuItem(name="Ramen", description="a Japanese noodle soup dish. It consists of Chinese-style wheat noodles served in a meat- or (occasionally) fish-based broth, often flavored with soy sauce or miso, and uses toppings such as sliced pork, dried seaweed, kamaboko, and green onions.", 122 | price="12", course="Entree", restaurant=restaurant2) 123 | 124 | session.add(menuItem6) 125 | session.commit() 126 | 127 | 128 | # Menu for Panda Garden 129 | restaurant1 = Restaurant(name="Panda Garden") 130 | 131 | session.add(restaurant1) 132 | session.commit() 133 | 134 | 135 | menuItem1 = MenuItem(name="Pho", description="a Vietnamese noodle soup consisting of broth, linguine-shaped rice noodles called banh pho, a few herbs, and meat.", 136 | price="$8.99", course="Entree", restaurant=restaurant1) 137 | 138 | session.add(menuItem1) 139 | session.commit() 140 | 141 | menuItem2 = MenuItem(name="Chinese Dumplings", description="a common Chinese dumpling which generally consists of minced meat and finely chopped vegetables wrapped into a piece of dough skin. The skin can be either thin and elastic or thicker.", 142 | price="$6.99", course="Appetizer", restaurant=restaurant1) 143 | 144 | session.add(menuItem2) 145 | session.commit() 146 | 147 | menuItem3 = MenuItem(name="Gyoza", description="The most prominent differences between Japanese-style gyoza and Chinese-style jiaozi are the rich garlic flavor, which is less noticeable in the Chinese version, the light seasoning of Japanese gyoza with salt and soy sauce, and the fact that gyoza wrappers are much thinner", 148 | price="$9.95", course="Entree", restaurant=restaurant1) 149 | 150 | session.add(menuItem3) 151 | session.commit() 152 | 153 | menuItem4 = MenuItem(name="Stinky Tofu", description="Taiwanese dish, deep fried fermented tofu served with pickled cabbage.", 154 | price="$6.99", course="Entree", restaurant=restaurant1) 155 | 156 | session.add(menuItem4) 157 | session.commit() 158 | 159 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 160 | price="$9.50", course="Entree", restaurant=restaurant1) 161 | 162 | session.add(menuItem2) 163 | session.commit() 164 | 165 | 166 | # Menu for Thyme for that 167 | restaurant1 = Restaurant(name="Thyme for That Vegetarian Cuisine ") 168 | 169 | session.add(restaurant1) 170 | session.commit() 171 | 172 | 173 | menuItem1 = MenuItem(name="Tres Leches Cake", description="Rich, luscious sponge cake soaked in sweet milk and topped with vanilla bean whipped cream and strawberries.", 174 | price="$2.99", course="Dessert", restaurant=restaurant1) 175 | 176 | session.add(menuItem1) 177 | session.commit() 178 | 179 | menuItem2 = MenuItem(name="Mushroom risotto", description="Portabello mushrooms in a creamy risotto", 180 | price="$5.99", course="Entree", restaurant=restaurant1) 181 | 182 | session.add(menuItem2) 183 | session.commit() 184 | 185 | menuItem3 = MenuItem(name="Honey Boba Shaved Snow", description="Milk snow layered with honey boba, jasmine tea jelly, grass jelly, caramel, cream, and freshly made mochi", 186 | price="$4.50", course="Dessert", restaurant=restaurant1) 187 | 188 | session.add(menuItem3) 189 | session.commit() 190 | 191 | menuItem4 = MenuItem(name="Cauliflower Manchurian", description="Golden fried cauliflower florets in a midly spiced soya,garlic sauce cooked with fresh cilantro, celery, chilies,ginger & green onions", 192 | price="$6.95", course="Appetizer", restaurant=restaurant1) 193 | 194 | session.add(menuItem4) 195 | session.commit() 196 | 197 | menuItem5 = MenuItem(name="Aloo Gobi Burrito", description="Vegan goodness. Burrito filled with rice, garbanzo beans, curry sauce, potatoes (aloo), fried cauliflower (gobi) and chutney. Nom Nom", 198 | price="$7.95", course="Entree", restaurant=restaurant1) 199 | 200 | session.add(menuItem5) 201 | session.commit() 202 | 203 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 204 | price="$6.80", course="Entree", restaurant=restaurant1) 205 | 206 | session.add(menuItem2) 207 | session.commit() 208 | 209 | 210 | # Menu for Tony's Bistro 211 | restaurant1 = Restaurant(name="Tony\'s Bistro ") 212 | 213 | session.add(restaurant1) 214 | session.commit() 215 | 216 | 217 | menuItem1 = MenuItem(name="Shellfish Tower", description="Lobster, shrimp, sea snails, crawfish, stacked into a delicious tower", 218 | price="$13.95", course="Entree", restaurant=restaurant1) 219 | 220 | session.add(menuItem1) 221 | session.commit() 222 | 223 | menuItem2 = MenuItem(name="Chicken and Rice", description="Chicken... and rice", 224 | price="$4.95", course="Entree", restaurant=restaurant1) 225 | 226 | session.add(menuItem2) 227 | session.commit() 228 | 229 | menuItem3 = MenuItem(name="Mom's Spaghetti", description="Spaghetti with some incredible tomato sauce made by mom", 230 | price="$6.95", course="Entree", restaurant=restaurant1) 231 | 232 | session.add(menuItem3) 233 | session.commit() 234 | 235 | menuItem4 = MenuItem(name="Choc Full O\' Mint (Smitten\'s Fresh Mint Chip ice cream)", 236 | description="Milk, cream, salt, ..., Liquid nitrogen magic", price="$3.95", course="Dessert", restaurant=restaurant1) 237 | 238 | session.add(menuItem4) 239 | session.commit() 240 | 241 | menuItem5 = MenuItem(name="Tonkatsu Ramen", description="Noodles in a delicious pork-based broth with a soft-boiled egg", 242 | price="$7.95", course="Entree", restaurant=restaurant1) 243 | 244 | session.add(menuItem5) 245 | session.commit() 246 | 247 | 248 | # Menu for Andala's 249 | restaurant1 = Restaurant(name="Andala\'s") 250 | 251 | session.add(restaurant1) 252 | session.commit() 253 | 254 | 255 | menuItem1 = MenuItem(name="Lamb Curry", description="Slow cook that thang in a pool of tomatoes, onions and alllll those tasty Indian spices. Mmmm.", 256 | price="$9.95", course="Entree", restaurant=restaurant1) 257 | 258 | session.add(menuItem1) 259 | session.commit() 260 | 261 | menuItem2 = MenuItem(name="Chicken Marsala", description="Chicken cooked in Marsala wine sauce with mushrooms", 262 | price="$7.95", course="Entree", restaurant=restaurant1) 263 | 264 | session.add(menuItem2) 265 | session.commit() 266 | 267 | menuItem3 = MenuItem(name="Potstickers", description="Delicious chicken and veggies encapsulated in fried dough.", 268 | price="$6.50", course="Appetizer", restaurant=restaurant1) 269 | 270 | session.add(menuItem3) 271 | session.commit() 272 | 273 | menuItem4 = MenuItem(name="Nigiri Sampler", description="Maguro, Sake, Hamachi, Unagi, Uni, TORO!", 274 | price="$6.75", course="Appetizer", restaurant=restaurant1) 275 | 276 | session.add(menuItem4) 277 | session.commit() 278 | 279 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 280 | price="$7.00", course="Entree", restaurant=restaurant1) 281 | 282 | session.add(menuItem2) 283 | session.commit() 284 | 285 | 286 | # Menu for Auntie Ann's 287 | restaurant1 = Restaurant(name="Auntie Ann\'s Diner' ") 288 | 289 | session.add(restaurant1) 290 | session.commit() 291 | 292 | menuItem9 = MenuItem(name="Chicken Fried Steak", description="Fresh battered sirloin steak fried and smothered with cream gravy", 293 | price="$8.99", course="Entree", restaurant=restaurant1) 294 | 295 | session.add(menuItem9) 296 | session.commit() 297 | 298 | 299 | menuItem1 = MenuItem(name="Boysenberry Sorbet", description="An unsettlingly huge amount of ripe berries turned into frozen (and seedless) awesomeness", 300 | price="$2.99", course="Dessert", restaurant=restaurant1) 301 | 302 | session.add(menuItem1) 303 | session.commit() 304 | 305 | menuItem2 = MenuItem(name="Broiled salmon", description="Salmon fillet marinated with fresh herbs and broiled hot & fast", 306 | price="$10.95", course="Entree", restaurant=restaurant1) 307 | 308 | session.add(menuItem2) 309 | session.commit() 310 | 311 | menuItem3 = MenuItem(name="Morels on toast (seasonal)", description="Wild morel mushrooms fried in butter, served on herbed toast slices", 312 | price="$7.50", course="Appetizer", restaurant=restaurant1) 313 | 314 | session.add(menuItem3) 315 | session.commit() 316 | 317 | menuItem4 = MenuItem(name="Tandoori Chicken", description="Chicken marinated in yoghurt and seasoned with a spicy mix(chilli, tamarind among others) and slow cooked in a cylindrical clay or metal oven which gets its heat from burning charcoal.", 318 | price="$8.95", course="Entree", restaurant=restaurant1) 319 | 320 | session.add(menuItem4) 321 | session.commit() 322 | 323 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 324 | price="$9.50", course="Entree", restaurant=restaurant1) 325 | 326 | session.add(menuItem2) 327 | session.commit() 328 | 329 | menuItem10 = MenuItem(name="Spinach Ice Cream", description="vanilla ice cream made with organic spinach leaves", 330 | price="$1.99", course="Dessert", restaurant=restaurant1) 331 | 332 | session.add(menuItem10) 333 | session.commit() 334 | 335 | 336 | # Menu for Cocina Y Amor 337 | restaurant1 = Restaurant(name="Cocina Y Amor ") 338 | 339 | session.add(restaurant1) 340 | session.commit() 341 | 342 | 343 | menuItem1 = MenuItem(name="Super Burrito Al Pastor", description="Marinated Pork, Rice, Beans, Avocado, Cilantro, Salsa, Tortilla", 344 | price="$5.95", course="Entree", restaurant=restaurant1) 345 | 346 | session.add(menuItem1) 347 | session.commit() 348 | 349 | menuItem2 = MenuItem(name="Cachapa", description="Golden brown, corn-based Venezuelan pancake; usually stuffed with queso telita or queso de mano, and possibly lechon. ", 350 | price="$7.99", course="Entree", restaurant=restaurant1) 351 | 352 | session.add(menuItem2) 353 | session.commit() 354 | 355 | 356 | restaurant1 = Restaurant(name="State Bird Provisions") 357 | session.add(restaurant1) 358 | session.commit() 359 | 360 | menuItem1 = MenuItem(name="Chantrelle Toast", description="Crispy Toast with Sesame Seeds slathered with buttery chantrelle mushrooms", 361 | price="$5.95", course="Appetizer", restaurant=restaurant1) 362 | 363 | session.add(menuItem1) 364 | session.commit 365 | 366 | menuItem1 = MenuItem(name="Guanciale Chawanmushi", description="Japanese egg custard served hot with spicey Italian Pork Jowl (guanciale)", 367 | price="$6.95", course="Dessert", restaurant=restaurant1) 368 | 369 | session.add(menuItem1) 370 | session.commit() 371 | 372 | 373 | menuItem1 = MenuItem(name="Lemon Curd Ice Cream Sandwich", description="Lemon Curd Ice Cream Sandwich on a chocolate macaron with cardamom meringue and cashews", 374 | price="$4.25", course="Dessert", restaurant=restaurant1) 375 | 376 | session.add(menuItem1) 377 | session.commit() 378 | 379 | 380 | print "added menu items!" 381 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/static/styles.css: -------------------------------------------------------------------------------- 1 | body { font-family: sans-serif; background-color: #333333; background-image: url('https://cloud.githubusercontent.com/assets/9041401/6119508/7cbced14-b07e-11e4-9dbd-f01488203879.jpg')} 2 | h1, h2, h3, h4 { color: #CCCCCC; } 3 | h1, h2 { font-family: 'Georgia', serif; margin: 0; } 4 | h1 { border-bottom: 2px solid #eee; } 5 | h2 { font-size: 1.2em; } 6 | 7 | p { color: #CCCCCC;} 8 | 9 | a {text-decoration: none; color:#FFFFCC; font-size: .75em;} 10 | 11 | .pane {position:absolute; left: 25%; border: 2px solid; 12 | border-radius: 25px; padding: 5px; margin: 5px; border-color: #999999; background-color: #333333; } 13 | .header {left:50%; text-align: center;} 14 | .name {width:50%;display: inline-block; float: left;} 15 | .description {} 16 | .price {text-align: right; width:50%; float: right; } 17 | .editdeletepane{} 18 | 19 | .flash { background: #cee5F5; } 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/deleteRestaurant.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Are you sure you want to delete {{restaurant.name}}?

9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | Cancel 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/deletemenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Are you sure you want to delete {{item.name}}?

8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | Cancel 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/editRestaurant.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |

Edit Restaurant

11 | 12 | 13 |
14 | 15 | 16 |

Name:

17 | 18 | 19 | 20 | 21 | 22 | 23 | Cancel 24 | 25 |
26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/editmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Edit Menu Item

8 | 9 |
10 | 11 | 12 |

Name:

13 | 14 |

Description:

15 | 16 |

Price:

17 | 18 |

Course:

19 | 20 | {% if item.course == 'Appetizer' %} 21 |

Appetizer
22 | {%else%} 23 |
Appetizer
24 | {% endif %} 25 | 26 | {% if item.course == 'Entree' %} 27 |
Entree
28 | 29 | {%else%} 30 |
Entree
31 | {% endif %} 32 | 33 | {% if item.course == 'Dessert'%} 34 |
Dessert
35 | 36 | {% else %} 37 |
Dessert
38 | 39 | {% endif %} 40 | 41 | 42 | {%if item.course =='Beverage'%} 43 |
Beverage
44 | {% else %} 45 |
Beverage
46 | {% endif %} 47 | 48 | 49 | 50 | 51 | 52 | 53 | Cancel 54 | 55 | 56 |
57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/menu.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 |

{{ restaurant.name }}

9 | 10 | {% with messages = get_flashed_messages() %} 11 | {% if messages %} 12 | 13 |
    14 | {% for message in messages %} 15 |
  • {{ message }}
  • 16 | {% endfor %} 17 |
18 | {% endif %} 19 | {% endwith %} 20 | 21 | {% if items !=[] %} 22 | 23 | Create New Item 24 |

25 | 26 |

Appetizers

27 | 28 | {% for i in items %} 29 | {% if i.course == 'Appetizer' %} 30 | 31 |

{{i.name}}

32 | 33 | 34 |

{{i.description}}

35 | 36 | 37 |

{{i.price}}

38 | 39 | Edit 40 |
41 | Delete 42 |
43 |
44 | {% endif %} 45 | 46 | {% endfor %} 47 | 48 | 49 | 50 |

51 | 52 |

Entrees

53 | 54 | {% for i in items %} 55 | {% if i.course == 'Entree' %} 56 | 57 |

{{i.name}}

58 | 59 | 60 |

{{i.description}}

61 | 62 | 63 |

{{i.price}}

64 | 65 | Edit 66 |
67 | Delete 68 |
69 |
70 | {% endif %} 71 | 72 | {% endfor %} 73 | 74 | 75 | 76 |

77 | 78 |

Desserts

79 | 80 | {% for i in items %} 81 | {% if i.course == 'Dessert' %} 82 | 83 |

{{i.name}}

84 | 85 | 86 |

{{i.description}}

87 | 88 | 89 |

{{i.price}}

90 | 91 | Edit 92 | 93 | Delete 94 |
95 |
96 | {% endif %} 97 | 98 | {% endfor %} 99 | 100 | 101 | 102 |

103 | 104 |

Beverages

105 | 106 | {% for i in items %} 107 | {% if i.course == 'Beverage' %} 108 | 109 |

{{i.name}}

110 | 111 | 112 |

{{i.description}}

113 | 114 | 115 |

{{i.price}}

116 | 117 | Edit 118 |
119 | Delete 120 |
121 |
122 | {% endif %} 123 | 124 | {% endfor %} 125 | 126 | 127 | 128 | {% else %} 129 |

You currently have no menu items.

130 | Create New Item 131 | {% endif %} 132 |

133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/newRestaurant.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

New Restaurant

9 | 10 |
11 | 12 | 13 |

Name:

14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/newmenuitem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

New Menu Item

9 | 10 |
11 | 12 | 13 |

Name:

14 | 15 |

Description:

16 | 17 |

Price:

18 | 19 |

Course:

20 | Appetizer
21 | Entree
22 | Dessert
23 | Beverage
24 |
25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Lesson-4/Final-Project/templates/restaurants.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |

Restaurants

11 | 12 |

Create a New Restaurant

13 | 14 | {% for restaurant in restaurants %} 15 | 16 | 17 | 18 |

{{restaurant.name}}

19 | 20 |

Edit Restaurant

21 | 22 |

Delete Restaurant

23 | 24 | 25 | 26 | 27 | {% endfor %} 28 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Lesson_1/database_setup.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from sqlalchemy import Column, ForeignKey, Integer, String 4 | from sqlalchemy.ext.declarative import declarative_base 5 | from sqlalchemy.orm import relationship 6 | from sqlalchemy import create_engine 7 | 8 | Base = declarative_base() 9 | 10 | 11 | class Restaurant(Base): 12 | __tablename__ = 'restaurant' 13 | 14 | id = Column(Integer, primary_key=True) 15 | name = Column(String(250), nullable=False) 16 | 17 | 18 | class MenuItem(Base): 19 | __tablename__ = 'menu_item' 20 | 21 | name = Column(String(80), nullable=False) 22 | id = Column(Integer, primary_key=True) 23 | description = Column(String(250)) 24 | price = Column(String(8)) 25 | course = Column(String(250)) 26 | restaurant_id = Column(Integer, ForeignKey('restaurant.id')) 27 | restaurant = relationship(Restaurant) 28 | 29 | 30 | engine = create_engine('sqlite:///restaurantmenu.db') 31 | 32 | 33 | Base.metadata.create_all(engine) 34 | -------------------------------------------------------------------------------- /Lesson_1/lotsofmenus.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine 2 | from sqlalchemy.orm import sessionmaker 3 | 4 | from database_setup import Restaurant, Base, MenuItem 5 | 6 | engine = create_engine('sqlite:///restaurantmenu.db') 7 | # Bind the engine to the metadata of the Base class so that the 8 | # declaratives can be accessed through a DBSession instance 9 | Base.metadata.bind = engine 10 | 11 | DBSession = sessionmaker(bind=engine) 12 | # A DBSession() instance establishes all conversations with the database 13 | # and represents a "staging zone" for all the objects loaded into the 14 | # database session object. Any change made against the objects in the 15 | # session won't be persisted into the database until you call 16 | # session.commit(). If you're not happy about the changes, you can 17 | # revert all of them back to the last commit by calling 18 | # session.rollback() 19 | session = DBSession() 20 | 21 | 22 | # Menu for UrbanBurger 23 | restaurant1 = Restaurant(name="Urban Burger") 24 | 25 | session.add(restaurant1) 26 | session.commit() 27 | 28 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 29 | price="$7.50", course="Entree", restaurant=restaurant1) 30 | 31 | session.add(menuItem2) 32 | session.commit() 33 | 34 | 35 | menuItem1 = MenuItem(name="French Fries", description="with garlic and parmesan", 36 | price="$2.99", course="Appetizer", restaurant=restaurant1) 37 | 38 | session.add(menuItem1) 39 | session.commit() 40 | 41 | menuItem2 = MenuItem(name="Chicken Burger", description="Juicy grilled chicken patty with tomato mayo and lettuce", 42 | price="$5.50", course="Entree", restaurant=restaurant1) 43 | 44 | session.add(menuItem2) 45 | session.commit() 46 | 47 | menuItem3 = MenuItem(name="Chocolate Cake", description="fresh baked and served with ice cream", 48 | price="$3.99", course="Dessert", restaurant=restaurant1) 49 | 50 | session.add(menuItem3) 51 | session.commit() 52 | 53 | menuItem4 = MenuItem(name="Sirloin Burger", description="Made with grade A beef", 54 | price="$7.99", course="Entree", restaurant=restaurant1) 55 | 56 | session.add(menuItem4) 57 | session.commit() 58 | 59 | menuItem5 = MenuItem(name="Root Beer", description="16oz of refreshing goodness", 60 | price="$1.99", course="Beverage", restaurant=restaurant1) 61 | 62 | session.add(menuItem5) 63 | session.commit() 64 | 65 | menuItem6 = MenuItem(name="Iced Tea", description="with Lemon", 66 | price="$.99", course="Beverage", restaurant=restaurant1) 67 | 68 | session.add(menuItem6) 69 | session.commit() 70 | 71 | menuItem7 = MenuItem(name="Grilled Cheese Sandwich", description="On texas toast with American Cheese", 72 | price="$3.49", course="Entree", restaurant=restaurant1) 73 | 74 | session.add(menuItem7) 75 | session.commit() 76 | 77 | menuItem8 = MenuItem(name="Veggie Burger", description="Made with freshest of ingredients and home grown spices", 78 | price="$5.99", course="Entree", restaurant=restaurant1) 79 | 80 | session.add(menuItem8) 81 | session.commit() 82 | 83 | 84 | # Menu for Super Stir Fry 85 | restaurant2 = Restaurant(name="Super Stir Fry") 86 | 87 | session.add(restaurant2) 88 | session.commit() 89 | 90 | 91 | menuItem1 = MenuItem(name="Chicken Stir Fry", description="With your choice of noodles vegetables and sauces", 92 | price="$7.99", course="Entree", restaurant=restaurant2) 93 | 94 | session.add(menuItem1) 95 | session.commit() 96 | 97 | menuItem2 = MenuItem( 98 | name="Peking Duck", description=" A famous duck dish from Beijing[1] that has been prepared since the imperial era. The meat is prized for its thin, crisp skin, with authentic versions of the dish serving mostly the skin and little meat, sliced in front of the diners by the cook", price="$25", course="Entree", restaurant=restaurant2) 99 | 100 | session.add(menuItem2) 101 | session.commit() 102 | 103 | menuItem3 = MenuItem(name="Spicy Tuna Roll", description="Seared rare ahi, avocado, edamame, cucumber with wasabi soy sauce ", 104 | price="15", course="Entree", restaurant=restaurant2) 105 | 106 | session.add(menuItem3) 107 | session.commit() 108 | 109 | menuItem4 = MenuItem(name="Nepali Momo ", description="Steamed dumplings made with vegetables, spices and meat. ", 110 | price="12", course="Entree", restaurant=restaurant2) 111 | 112 | session.add(menuItem4) 113 | session.commit() 114 | 115 | menuItem5 = MenuItem(name="Beef Noodle Soup", description="A Chinese noodle soup made of stewed or red braised beef, beef broth, vegetables and Chinese noodles.", 116 | price="14", course="Entree", restaurant=restaurant2) 117 | 118 | session.add(menuItem5) 119 | session.commit() 120 | 121 | menuItem6 = MenuItem(name="Ramen", description="a Japanese noodle soup dish. It consists of Chinese-style wheat noodles served in a meat- or (occasionally) fish-based broth, often flavored with soy sauce or miso, and uses toppings such as sliced pork, dried seaweed, kamaboko, and green onions.", 122 | price="12", course="Entree", restaurant=restaurant2) 123 | 124 | session.add(menuItem6) 125 | session.commit() 126 | 127 | 128 | # Menu for Panda Garden 129 | restaurant1 = Restaurant(name="Panda Garden") 130 | 131 | session.add(restaurant1) 132 | session.commit() 133 | 134 | 135 | menuItem1 = MenuItem(name="Pho", description="a Vietnamese noodle soup consisting of broth, linguine-shaped rice noodles called banh pho, a few herbs, and meat.", 136 | price="$8.99", course="Entree", restaurant=restaurant1) 137 | 138 | session.add(menuItem1) 139 | session.commit() 140 | 141 | menuItem2 = MenuItem(name="Chinese Dumplings", description="a common Chinese dumpling which generally consists of minced meat and finely chopped vegetables wrapped into a piece of dough skin. The skin can be either thin and elastic or thicker.", 142 | price="$6.99", course="Appetizer", restaurant=restaurant1) 143 | 144 | session.add(menuItem2) 145 | session.commit() 146 | 147 | menuItem3 = MenuItem(name="Gyoza", description="The most prominent differences between Japanese-style gyoza and Chinese-style jiaozi are the rich garlic flavor, which is less noticeable in the Chinese version, the light seasoning of Japanese gyoza with salt and soy sauce, and the fact that gyoza wrappers are much thinner", 148 | price="$9.95", course="Entree", restaurant=restaurant1) 149 | 150 | session.add(menuItem3) 151 | session.commit() 152 | 153 | menuItem4 = MenuItem(name="Stinky Tofu", description="Taiwanese dish, deep fried fermented tofu served with pickled cabbage.", 154 | price="$6.99", course="Entree", restaurant=restaurant1) 155 | 156 | session.add(menuItem4) 157 | session.commit() 158 | 159 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 160 | price="$9.50", course="Entree", restaurant=restaurant1) 161 | 162 | session.add(menuItem2) 163 | session.commit() 164 | 165 | 166 | # Menu for Thyme for that 167 | restaurant1 = Restaurant(name="Thyme for That Vegetarian Cuisine ") 168 | 169 | session.add(restaurant1) 170 | session.commit() 171 | 172 | 173 | menuItem1 = MenuItem(name="Tres Leches Cake", description="Rich, luscious sponge cake soaked in sweet milk and topped with vanilla bean whipped cream and strawberries.", 174 | price="$2.99", course="Dessert", restaurant=restaurant1) 175 | 176 | session.add(menuItem1) 177 | session.commit() 178 | 179 | menuItem2 = MenuItem(name="Mushroom risotto", description="Portabello mushrooms in a creamy risotto", 180 | price="$5.99", course="Entree", restaurant=restaurant1) 181 | 182 | session.add(menuItem2) 183 | session.commit() 184 | 185 | menuItem3 = MenuItem(name="Honey Boba Shaved Snow", description="Milk snow layered with honey boba, jasmine tea jelly, grass jelly, caramel, cream, and freshly made mochi", 186 | price="$4.50", course="Dessert", restaurant=restaurant1) 187 | 188 | session.add(menuItem3) 189 | session.commit() 190 | 191 | menuItem4 = MenuItem(name="Cauliflower Manchurian", description="Golden fried cauliflower florets in a midly spiced soya,garlic sauce cooked with fresh cilantro, celery, chilies,ginger & green onions", 192 | price="$6.95", course="Appetizer", restaurant=restaurant1) 193 | 194 | session.add(menuItem4) 195 | session.commit() 196 | 197 | menuItem5 = MenuItem(name="Aloo Gobi Burrito", description="Vegan goodness. Burrito filled with rice, garbanzo beans, curry sauce, potatoes (aloo), fried cauliflower (gobi) and chutney. Nom Nom", 198 | price="$7.95", course="Entree", restaurant=restaurant1) 199 | 200 | session.add(menuItem5) 201 | session.commit() 202 | 203 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 204 | price="$6.80", course="Entree", restaurant=restaurant1) 205 | 206 | session.add(menuItem2) 207 | session.commit() 208 | 209 | 210 | # Menu for Tony's Bistro 211 | restaurant1 = Restaurant(name="Tony\'s Bistro ") 212 | 213 | session.add(restaurant1) 214 | session.commit() 215 | 216 | 217 | menuItem1 = MenuItem(name="Shellfish Tower", description="Lobster, shrimp, sea snails, crawfish, stacked into a delicious tower", 218 | price="$13.95", course="Entree", restaurant=restaurant1) 219 | 220 | session.add(menuItem1) 221 | session.commit() 222 | 223 | menuItem2 = MenuItem(name="Chicken and Rice", description="Chicken... and rice", 224 | price="$4.95", course="Entree", restaurant=restaurant1) 225 | 226 | session.add(menuItem2) 227 | session.commit() 228 | 229 | menuItem3 = MenuItem(name="Mom's Spaghetti", description="Spaghetti with some incredible tomato sauce made by mom", 230 | price="$6.95", course="Entree", restaurant=restaurant1) 231 | 232 | session.add(menuItem3) 233 | session.commit() 234 | 235 | menuItem4 = MenuItem(name="Choc Full O\' Mint (Smitten\'s Fresh Mint Chip ice cream)", 236 | description="Milk, cream, salt, ..., Liquid nitrogen magic", price="$3.95", course="Dessert", restaurant=restaurant1) 237 | 238 | session.add(menuItem4) 239 | session.commit() 240 | 241 | menuItem5 = MenuItem(name="Tonkatsu Ramen", description="Noodles in a delicious pork-based broth with a soft-boiled egg", 242 | price="$7.95", course="Entree", restaurant=restaurant1) 243 | 244 | session.add(menuItem5) 245 | session.commit() 246 | 247 | 248 | # Menu for Andala's 249 | restaurant1 = Restaurant(name="Andala\'s") 250 | 251 | session.add(restaurant1) 252 | session.commit() 253 | 254 | 255 | menuItem1 = MenuItem(name="Lamb Curry", description="Slow cook that thang in a pool of tomatoes, onions and alllll those tasty Indian spices. Mmmm.", 256 | price="$9.95", course="Entree", restaurant=restaurant1) 257 | 258 | session.add(menuItem1) 259 | session.commit() 260 | 261 | menuItem2 = MenuItem(name="Chicken Marsala", description="Chicken cooked in Marsala wine sauce with mushrooms", 262 | price="$7.95", course="Entree", restaurant=restaurant1) 263 | 264 | session.add(menuItem2) 265 | session.commit() 266 | 267 | menuItem3 = MenuItem(name="Potstickers", description="Delicious chicken and veggies encapsulated in fried dough.", 268 | price="$6.50", course="Appetizer", restaurant=restaurant1) 269 | 270 | session.add(menuItem3) 271 | session.commit() 272 | 273 | menuItem4 = MenuItem(name="Nigiri Sampler", description="Maguro, Sake, Hamachi, Unagi, Uni, TORO!", 274 | price="$6.75", course="Appetizer", restaurant=restaurant1) 275 | 276 | session.add(menuItem4) 277 | session.commit() 278 | 279 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 280 | price="$7.00", course="Entree", restaurant=restaurant1) 281 | 282 | session.add(menuItem2) 283 | session.commit() 284 | 285 | 286 | # Menu for Auntie Ann's 287 | restaurant1 = Restaurant(name="Auntie Ann\'s Diner ") 288 | 289 | session.add(restaurant1) 290 | session.commit() 291 | 292 | menuItem9 = MenuItem(name="Chicken Fried Steak", description="Fresh battered sirloin steak fried and smothered with cream gravy", 293 | price="$8.99", course="Entree", restaurant=restaurant1) 294 | 295 | session.add(menuItem9) 296 | session.commit() 297 | 298 | 299 | menuItem1 = MenuItem(name="Boysenberry Sorbet", description="An unsettlingly huge amount of ripe berries turned into frozen (and seedless) awesomeness", 300 | price="$2.99", course="Dessert", restaurant=restaurant1) 301 | 302 | session.add(menuItem1) 303 | session.commit() 304 | 305 | menuItem2 = MenuItem(name="Broiled salmon", description="Salmon fillet marinated with fresh herbs and broiled hot & fast", 306 | price="$10.95", course="Entree", restaurant=restaurant1) 307 | 308 | session.add(menuItem2) 309 | session.commit() 310 | 311 | menuItem3 = MenuItem(name="Morels on toast (seasonal)", description="Wild morel mushrooms fried in butter, served on herbed toast slices", 312 | price="$7.50", course="Appetizer", restaurant=restaurant1) 313 | 314 | session.add(menuItem3) 315 | session.commit() 316 | 317 | menuItem4 = MenuItem(name="Tandoori Chicken", description="Chicken marinated in yoghurt and seasoned with a spicy mix(chilli, tamarind among others) and slow cooked in a cylindrical clay or metal oven which gets its heat from burning charcoal.", 318 | price="$8.95", course="Entree", restaurant=restaurant1) 319 | 320 | session.add(menuItem4) 321 | session.commit() 322 | 323 | menuItem2 = MenuItem(name="Veggie Burger", description="Juicy grilled veggie patty with tomato mayo and lettuce", 324 | price="$9.50", course="Entree", restaurant=restaurant1) 325 | 326 | session.add(menuItem2) 327 | session.commit() 328 | 329 | menuItem10 = MenuItem(name="Spinach Ice Cream", description="vanilla ice cream made with organic spinach leaves", 330 | price="$1.99", course="Dessert", restaurant=restaurant1) 331 | 332 | session.add(menuItem10) 333 | session.commit() 334 | 335 | 336 | # Menu for Cocina Y Amor 337 | restaurant1 = Restaurant(name="Cocina Y Amor ") 338 | 339 | session.add(restaurant1) 340 | session.commit() 341 | 342 | 343 | menuItem1 = MenuItem(name="Super Burrito Al Pastor", description="Marinated Pork, Rice, Beans, Avocado, Cilantro, Salsa, Tortilla", 344 | price="$5.95", course="Entree", restaurant=restaurant1) 345 | 346 | session.add(menuItem1) 347 | session.commit() 348 | 349 | menuItem2 = MenuItem(name="Cachapa", description="Golden brown, corn-based Venezuelan pancake; usually stuffed with queso telita or queso de mano, and possibly lechon. ", 350 | price="$7.99", course="Entree", restaurant=restaurant1) 351 | 352 | session.add(menuItem2) 353 | session.commit() 354 | 355 | 356 | restaurant1 = Restaurant(name="State Bird Provisions") 357 | session.add(restaurant1) 358 | session.commit() 359 | 360 | menuItem1 = MenuItem(name="Chantrelle Toast", description="Crispy Toast with Sesame Seeds slathered with buttery chantrelle mushrooms", 361 | price="$5.95", course="Appetizer", restaurant=restaurant1) 362 | 363 | session.add(menuItem1) 364 | session.commit() 365 | 366 | menuItem1 = MenuItem(name="Guanciale Chawanmushi", description="Japanese egg custard served hot with spicey Italian Pork Jowl (guanciale)", 367 | price="$6.95", course="Dessert", restaurant=restaurant1) 368 | 369 | session.add(menuItem1) 370 | session.commit() 371 | 372 | 373 | menuItem1 = MenuItem(name="Lemon Curd Ice Cream Sandwich", description="Lemon Curd Ice Cream Sandwich on a chocolate macaron with cardamom meringue and cashews", 374 | price="$4.25", course="Dessert", restaurant=restaurant1) 375 | 376 | session.add(menuItem1) 377 | session.commit() 378 | 379 | 380 | print "added menu items!" 381 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **This repository is now DEPRECATED. We are no more maintaining the code here.** You can checkout our [Full stack Nanodegree](https://www.udacity.com/course/full-stack-web-developer-nanodegree--nd0044) for an updated experience. 2 | 3 | # Full-Stack-Foundations 4 | Solution Code to Full Stack Foundations (ud088) 5 | --------------------------------------------------------------------------------