├── .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 += "{{i.name}}
13 | 14 |{{i.description}}
15 | 16 |{{i.price}}
17 | 18 |{{i.name}}
14 | 15 |{{i.description}}
16 | 17 |{{i.price}}
18 | 19 |{{i.name}}
14 | 15 |{{i.description}}
16 | 17 |{{i.price}}
18 | 19 | 20 |{{i.name}}
14 | 15 |{{i.description}}
16 | 17 |{{i.price}}
18 | 19 | Edit 20 | 21 | 22 | Delete 23 | 24 |{{i.name}}
25 | 26 |{{i.description}}
27 | 28 |{{i.price}}
29 | 30 |{{i.name}}
34 | 35 | 36 | 37 | 38 |{{i.price}}
39 | 40 |{{i.description}}
46 |{{i.name}}
34 | 35 | 36 | 37 | 38 |{{i.price}}
39 | 40 |{{i.description}}
46 |{{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 |{{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 |{{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 |{{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 |
{{restaurant.name}}
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | {% endfor %} 28 | 29 |