From 3ff8d6e3f28a91b244282164e1f276077921936d Mon Sep 17 00:00:00 2001
From: Jafsari
Date: Mon, 11 Dec 2017 16:42:21 -0800
Subject: [PATCH] adding blueprints
---
Unit-02/01-blueprints/Blueprints | 9 ++
Unit-02/01-blueprints/app.py | 6 +
Unit-02/01-blueprints/manage.py | 11 ++
Unit-02/01-blueprints/migrations/README | 1 +
Unit-02/01-blueprints/migrations/alembic.ini | 45 +++++++
Unit-02/01-blueprints/migrations/env.py | 87 +++++++++++++
.../01-blueprints/migrations/script.py.mako | 24 ++++
.../cd8c47228091_adding_messages_table.py | 34 +++++
.../fd9887ad4857_adding_users_table.py | 33 +++++
Unit-02/01-blueprints/project/__init__.py | 27 ++++
.../01-blueprints/project/messages/forms.py | 8 ++
.../messages/templates/messages/edit.html | 24 ++++
.../messages/templates/messages/index.html | 17 +++
.../messages/templates/messages/new.html | 23 ++++
.../messages/templates/messages/show.html | 0
.../01-blueprints/project/messages/views.py | 56 ++++++++
Unit-02/01-blueprints/project/models.py | 25 ++++
.../01-blueprints/project/templates/base.html | 19 +++
Unit-02/01-blueprints/project/users/forms.py | 9 ++
.../project/users/templates/users/edit.html | 24 ++++
.../project/users/templates/users/index.html | 20 +++
.../project/users/templates/users/new.html | 24 ++++
.../project/users/templates/users/show.html | 0
Unit-02/01-blueprints/project/users/views.py | 60 +++++++++
Unit-02/01-blueprints/readme.md | 22 ----
Unit-02/01-blueprints/test.py | 122 ------------------
26 files changed, 586 insertions(+), 144 deletions(-)
create mode 100644 Unit-02/01-blueprints/Blueprints
create mode 100644 Unit-02/01-blueprints/app.py
create mode 100644 Unit-02/01-blueprints/manage.py
create mode 100755 Unit-02/01-blueprints/migrations/README
create mode 100644 Unit-02/01-blueprints/migrations/alembic.ini
create mode 100755 Unit-02/01-blueprints/migrations/env.py
create mode 100755 Unit-02/01-blueprints/migrations/script.py.mako
create mode 100644 Unit-02/01-blueprints/migrations/versions/cd8c47228091_adding_messages_table.py
create mode 100644 Unit-02/01-blueprints/migrations/versions/fd9887ad4857_adding_users_table.py
create mode 100644 Unit-02/01-blueprints/project/__init__.py
create mode 100644 Unit-02/01-blueprints/project/messages/forms.py
create mode 100644 Unit-02/01-blueprints/project/messages/templates/messages/edit.html
create mode 100644 Unit-02/01-blueprints/project/messages/templates/messages/index.html
create mode 100644 Unit-02/01-blueprints/project/messages/templates/messages/new.html
create mode 100644 Unit-02/01-blueprints/project/messages/templates/messages/show.html
create mode 100644 Unit-02/01-blueprints/project/messages/views.py
create mode 100644 Unit-02/01-blueprints/project/models.py
create mode 100644 Unit-02/01-blueprints/project/templates/base.html
create mode 100644 Unit-02/01-blueprints/project/users/forms.py
create mode 100644 Unit-02/01-blueprints/project/users/templates/users/edit.html
create mode 100644 Unit-02/01-blueprints/project/users/templates/users/index.html
create mode 100644 Unit-02/01-blueprints/project/users/templates/users/new.html
create mode 100644 Unit-02/01-blueprints/project/users/templates/users/show.html
create mode 100644 Unit-02/01-blueprints/project/users/views.py
delete mode 100644 Unit-02/01-blueprints/readme.md
delete mode 100644 Unit-02/01-blueprints/test.py
diff --git a/Unit-02/01-blueprints/Blueprints b/Unit-02/01-blueprints/Blueprints
new file mode 100644
index 0000000..6c79070
--- /dev/null
+++ b/Unit-02/01-blueprints/Blueprints
@@ -0,0 +1,9 @@
+Blueprints
+
+1. The MVC pattern is a design pattern that is used normally for building web applications. Essentially the 'Model' is responsible for managing the data storage, retrieval and validation within the application. To be more specific, models in SQLAlchemy help a lot with that. The views are what the user sees when they are on the website. It includes the different routes the user could be redirected to. The controller is responsible for talking to the model and the view. It serves as a middleman where actions are processed and what data to receive from the model.
+
+2. The model does not communite directly with the view, that is the controller's purpose.
+
+3.The purpose of blueprints is to organize the MVC in a way where it can scale to larger applications
+
+4. It helps us organize bigger applications because it seperates the Models,forms, and views to different areas. As well as sepereates the different CRUD parts so there is much less confusion compared to having everything within the app.py file.
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/app.py b/Unit-02/01-blueprints/app.py
new file mode 100644
index 0000000..8447e37
--- /dev/null
+++ b/Unit-02/01-blueprints/app.py
@@ -0,0 +1,6 @@
+from project import app
+
+if __name__ == '__main__':
+ app.run(debug=True,port=3000)
+
+
diff --git a/Unit-02/01-blueprints/manage.py b/Unit-02/01-blueprints/manage.py
new file mode 100644
index 0000000..9eb1773
--- /dev/null
+++ b/Unit-02/01-blueprints/manage.py
@@ -0,0 +1,11 @@
+from project import app,db
+from flask_script import Manager
+from flask_migrate import Migrate,MigrateCommand
+
+migrate = Migrate(app,db)
+
+manager = Manager(app)
+manager.add_command('db',MigrateCommand)
+
+if __name__ == '__main__':
+ manager.run()
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/migrations/README b/Unit-02/01-blueprints/migrations/README
new file mode 100755
index 0000000..98e4f9c
--- /dev/null
+++ b/Unit-02/01-blueprints/migrations/README
@@ -0,0 +1 @@
+Generic single-database configuration.
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/migrations/alembic.ini b/Unit-02/01-blueprints/migrations/alembic.ini
new file mode 100644
index 0000000..f8ed480
--- /dev/null
+++ b/Unit-02/01-blueprints/migrations/alembic.ini
@@ -0,0 +1,45 @@
+# A generic, single database configuration.
+
+[alembic]
+# template used to generate migration files
+# file_template = %%(rev)s_%%(slug)s
+
+# set to 'true' to run the environment during
+# the 'revision' command, regardless of autogenerate
+# revision_environment = false
+
+
+# Logging configuration
+[loggers]
+keys = root,sqlalchemy,alembic
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARN
+handlers = console
+qualname =
+
+[logger_sqlalchemy]
+level = WARN
+handlers =
+qualname = sqlalchemy.engine
+
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
diff --git a/Unit-02/01-blueprints/migrations/env.py b/Unit-02/01-blueprints/migrations/env.py
new file mode 100755
index 0000000..23663ff
--- /dev/null
+++ b/Unit-02/01-blueprints/migrations/env.py
@@ -0,0 +1,87 @@
+from __future__ import with_statement
+from alembic import context
+from sqlalchemy import engine_from_config, pool
+from logging.config import fileConfig
+import logging
+
+# this is the Alembic Config object, which provides
+# access to the values within the .ini file in use.
+config = context.config
+
+# Interpret the config file for Python logging.
+# This line sets up loggers basically.
+fileConfig(config.config_file_name)
+logger = logging.getLogger('alembic.env')
+
+# add your model's MetaData object here
+# for 'autogenerate' support
+# from myapp import mymodel
+# target_metadata = mymodel.Base.metadata
+from flask import current_app
+config.set_main_option('sqlalchemy.url',
+ current_app.config.get('SQLALCHEMY_DATABASE_URI'))
+target_metadata = current_app.extensions['migrate'].db.metadata
+
+# other values from the config, defined by the needs of env.py,
+# can be acquired:
+# my_important_option = config.get_main_option("my_important_option")
+# ... etc.
+
+
+def run_migrations_offline():
+ """Run migrations in 'offline' mode.
+
+ This configures the context with just a URL
+ and not an Engine, though an Engine is acceptable
+ here as well. By skipping the Engine creation
+ we don't even need a DBAPI to be available.
+
+ Calls to context.execute() here emit the given string to the
+ script output.
+
+ """
+ url = config.get_main_option("sqlalchemy.url")
+ context.configure(url=url)
+
+ with context.begin_transaction():
+ context.run_migrations()
+
+
+def run_migrations_online():
+ """Run migrations in 'online' mode.
+
+ In this scenario we need to create an Engine
+ and associate a connection with the context.
+
+ """
+
+ # this callback is used to prevent an auto-migration from being generated
+ # when there are no changes to the schema
+ # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html
+ def process_revision_directives(context, revision, directives):
+ if getattr(config.cmd_opts, 'autogenerate', False):
+ script = directives[0]
+ if script.upgrade_ops.is_empty():
+ directives[:] = []
+ logger.info('No changes in schema detected.')
+
+ engine = engine_from_config(config.get_section(config.config_ini_section),
+ prefix='sqlalchemy.',
+ poolclass=pool.NullPool)
+
+ connection = engine.connect()
+ context.configure(connection=connection,
+ target_metadata=target_metadata,
+ process_revision_directives=process_revision_directives,
+ **current_app.extensions['migrate'].configure_args)
+
+ try:
+ with context.begin_transaction():
+ context.run_migrations()
+ finally:
+ connection.close()
+
+if context.is_offline_mode():
+ run_migrations_offline()
+else:
+ run_migrations_online()
diff --git a/Unit-02/01-blueprints/migrations/script.py.mako b/Unit-02/01-blueprints/migrations/script.py.mako
new file mode 100755
index 0000000..2c01563
--- /dev/null
+++ b/Unit-02/01-blueprints/migrations/script.py.mako
@@ -0,0 +1,24 @@
+"""${message}
+
+Revision ID: ${up_revision}
+Revises: ${down_revision | comma,n}
+Create Date: ${create_date}
+
+"""
+from alembic import op
+import sqlalchemy as sa
+${imports if imports else ""}
+
+# revision identifiers, used by Alembic.
+revision = ${repr(up_revision)}
+down_revision = ${repr(down_revision)}
+branch_labels = ${repr(branch_labels)}
+depends_on = ${repr(depends_on)}
+
+
+def upgrade():
+ ${upgrades if upgrades else "pass"}
+
+
+def downgrade():
+ ${downgrades if downgrades else "pass"}
diff --git a/Unit-02/01-blueprints/migrations/versions/cd8c47228091_adding_messages_table.py b/Unit-02/01-blueprints/migrations/versions/cd8c47228091_adding_messages_table.py
new file mode 100644
index 0000000..034edea
--- /dev/null
+++ b/Unit-02/01-blueprints/migrations/versions/cd8c47228091_adding_messages_table.py
@@ -0,0 +1,34 @@
+"""adding messages table
+
+Revision ID: cd8c47228091
+Revises: fd9887ad4857
+Create Date: 2017-12-02 20:33:15.697734
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'cd8c47228091'
+down_revision = 'fd9887ad4857'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('messages',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('content', sa.Text(), nullable=True),
+ sa.Column('user_id', sa.Integer(), nullable=True),
+ sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
+ sa.PrimaryKeyConstraint('id')
+ )
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_table('messages')
+ # ### end Alembic commands ###
diff --git a/Unit-02/01-blueprints/migrations/versions/fd9887ad4857_adding_users_table.py b/Unit-02/01-blueprints/migrations/versions/fd9887ad4857_adding_users_table.py
new file mode 100644
index 0000000..5e0cc08
--- /dev/null
+++ b/Unit-02/01-blueprints/migrations/versions/fd9887ad4857_adding_users_table.py
@@ -0,0 +1,33 @@
+"""adding users table
+
+Revision ID: fd9887ad4857
+Revises:
+Create Date: 2017-12-02 19:01:34.274330
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'fd9887ad4857'
+down_revision = None
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('users',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('first_name', sa.Text(), nullable=True),
+ sa.Column('last_name', sa.Text(), nullable=True),
+ sa.PrimaryKeyConstraint('id')
+ )
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_table('users')
+ # ### end Alembic commands ###
diff --git a/Unit-02/01-blueprints/project/__init__.py b/Unit-02/01-blueprints/project/__init__.py
new file mode 100644
index 0000000..90f503c
--- /dev/null
+++ b/Unit-02/01-blueprints/project/__init__.py
@@ -0,0 +1,27 @@
+from flask import Flask, redirect, url_for
+from flask_sqlalchemy import SQLAlchemy
+from flask_modus import Modus
+import os
+
+app = Flask(__name__)
+app.config['SQLALCHEMY_DATABASE_URI'] = "postgres://localhost/users-messages"
+app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
+app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')
+modus = Modus(app)
+db = SQLAlchemy(app)
+
+
+from project.users.views import users_blueprint
+from project.messages.views import messages_blueprint
+
+app.register_blueprint(users_blueprint,url_prefix ='/users')
+app.register_blueprint(messages_blueprint,url_prefix ='/users//messages')
+
+@app.route('/')
+def root():
+ return redirect(url_for('users.index'))
+
+
+
+
+ ## WOOOOOOO LETS NEST THESE MESSAGES
diff --git a/Unit-02/01-blueprints/project/messages/forms.py b/Unit-02/01-blueprints/project/messages/forms.py
new file mode 100644
index 0000000..9ed4daa
--- /dev/null
+++ b/Unit-02/01-blueprints/project/messages/forms.py
@@ -0,0 +1,8 @@
+from flask_wtf import FlaskForm
+from wtforms import StringField, validators
+
+class MessageForm(FlaskForm):
+ content = StringField('Content',[validators.DataRequired()])
+
+class DeleteForm(FlaskForm):
+ pass
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/messages/templates/messages/edit.html b/Unit-02/01-blueprints/project/messages/templates/messages/edit.html
new file mode 100644
index 0000000..700778d
--- /dev/null
+++ b/Unit-02/01-blueprints/project/messages/templates/messages/edit.html
@@ -0,0 +1,24 @@
+{% extends 'base.html' %}
+
+{% block content %}
+ Edit a new message!
+
+{% endblock %}
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/messages/templates/messages/index.html b/Unit-02/01-blueprints/project/messages/templates/messages/index.html
new file mode 100644
index 0000000..29222fd
--- /dev/null
+++ b/Unit-02/01-blueprints/project/messages/templates/messages/index.html
@@ -0,0 +1,17 @@
+{% extends 'base.html' %}
+
+{% block content %}
+ Add a new message!
+ See messages for {{user.first_name}}
+ {% for message in user.messages %}
+
+ {{message.content}}
+
+ Edit a message!
+
+
+ {% endfor %}
+{% endblock %}
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/messages/templates/messages/new.html b/Unit-02/01-blueprints/project/messages/templates/messages/new.html
new file mode 100644
index 0000000..8580fa6
--- /dev/null
+++ b/Unit-02/01-blueprints/project/messages/templates/messages/new.html
@@ -0,0 +1,23 @@
+{% extends 'base.html' %}
+
+{% block content %}
+ Add a new message!
+
+{% endblock %}
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/messages/templates/messages/show.html b/Unit-02/01-blueprints/project/messages/templates/messages/show.html
new file mode 100644
index 0000000..e69de29
diff --git a/Unit-02/01-blueprints/project/messages/views.py b/Unit-02/01-blueprints/project/messages/views.py
new file mode 100644
index 0000000..bc03fa3
--- /dev/null
+++ b/Unit-02/01-blueprints/project/messages/views.py
@@ -0,0 +1,56 @@
+from flask import redirect, render_template, request, url_for, flash,Blueprint
+from project.messages.forms import MessageForm, DeleteForm
+from project.models import Message,User
+from project import db
+messages_blueprint = Blueprint(
+ 'messages',
+ __name__,
+ template_folder='templates'
+ )
+
+@messages_blueprint.route('/', methods=["GET", "POST"])
+def index(user_id):
+ delete_form = DeleteForm()
+ if request.method == "POST":
+ form = MessageForm(request.form)
+ if form.validate():
+ new_message = Message(request.form['content'], user_id)
+ db.session.add(new_message)
+ db.session.commit()
+ flash('Message Created!')
+ return redirect(url_for('messages.index', user_id=user_id))
+ return render_template('messages/new.html', user=User.query.get(user_id), form=form)
+ return render_template('messages/index.html', user=User.query.get(user_id), delete_form=delete_form)
+
+@messages_blueprint.route('/new', methods=["GET", "POST"])
+def new(user_id):
+ form = MessageForm()
+ return render_template('messages/new.html', user=User.query.get(user_id), form=form)
+
+@messages_blueprint.route('//edit')
+def edit(user_id, id):
+ found_message = Message.query.get(id)
+ form = MessageForm(obj=found_message)
+ return render_template('messages/edit.html', message=found_message, form=form)
+
+
+@messages_blueprint.route('/', methods=["GET", "PATCH", "DELETE"])
+def show(user_id, id):
+ found_message = Message.query.get(id)
+ if request.method == b"PATCH":
+ form = MessageForm(request.form)
+ if form.validate():
+ found_message.content = request.form['content']
+ db.session.add(found_message)
+ db.session.commit()
+ flash('Message Updated!')
+ return redirect(url_for('messages.index', user_id=user_id))
+ return render_template('messages/edit.html', message=found_message, form=form)
+ if request.method == b"DELETE":
+ delete_form = DeleteForm(request.form)
+ if delete_form.validate():
+ db.session.delete(found_message)
+ db.session.commit()
+ flash('Message Deleted!')
+ return redirect(url_for('messages.index', user_id=user_id))
+ return render_template('messages/show.html', message=found_message)
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/models.py b/Unit-02/01-blueprints/project/models.py
new file mode 100644
index 0000000..bdb191f
--- /dev/null
+++ b/Unit-02/01-blueprints/project/models.py
@@ -0,0 +1,25 @@
+from project import db
+
+class User(db.Model):
+ __tablename__ = 'users'
+
+ id = db.Column(db.Integer,primary_key = True)
+ first_name = db.Column(db.Text)
+ last_name = db.Column(db.Text)
+ messages = db.relationship('Message',backref ='user', lazy = 'dynamic',cascade="all,delete")
+
+ def __init__(self,first_name,last_name):
+ self.first_name = first_name
+ self.last_name = last_name
+
+class Message(db.Model):
+
+ __tablename__ = "messages"
+
+ id = db.Column(db.Integer, primary_key=True)
+ content = db.Column(db.Text)
+ user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
+
+ def __init__(self, content, user_id):
+ self.content = content
+ self.user_id = user_id
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/templates/base.html b/Unit-02/01-blueprints/project/templates/base.html
new file mode 100644
index 0000000..cee11ef
--- /dev/null
+++ b/Unit-02/01-blueprints/project/templates/base.html
@@ -0,0 +1,19 @@
+
+
+
+
+ Document
+
+
+ {% with messages = get_flashed_messages() %}
+ {% if messages %}
+ {% for message in messages %}
+ {{ message }}
+ {% endfor %}
+ {% endif %}
+ {% endwith %}
+
+ {% block content %}
+ {% endblock %}
+
+
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/users/forms.py b/Unit-02/01-blueprints/project/users/forms.py
new file mode 100644
index 0000000..758d46f
--- /dev/null
+++ b/Unit-02/01-blueprints/project/users/forms.py
@@ -0,0 +1,9 @@
+from flask_wtf import FlaskForm
+from wtforms import StringField, validators
+
+class UserForm(FlaskForm):
+ first_name = StringField('First Name', [validators.DataRequired()])
+ last_name = StringField('Last Name',[validators.DataRequired()])
+
+class DeleteForm(FlaskForm):
+ pass
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/users/templates/users/edit.html b/Unit-02/01-blueprints/project/users/templates/users/edit.html
new file mode 100644
index 0000000..bad2070
--- /dev/null
+++ b/Unit-02/01-blueprints/project/users/templates/users/edit.html
@@ -0,0 +1,24 @@
+{% extends 'base.html' %}
+
+{%block content%}
+Edit the current User!
+
+{% endblock %}
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/users/templates/users/index.html b/Unit-02/01-blueprints/project/users/templates/users/index.html
new file mode 100644
index 0000000..7745d79
--- /dev/null
+++ b/Unit-02/01-blueprints/project/users/templates/users/index.html
@@ -0,0 +1,20 @@
+_{%extends 'base.html'%}
+
+{% block content %}
+ Add a new user
+see all the users
+{% for user in users %}
+
+ {{user.first_name}} {{user.last_name}}
+ See all messages for {{user.first_name}}!
+ Edit a user
+
+
+
+{% endfor %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/users/templates/users/new.html b/Unit-02/01-blueprints/project/users/templates/users/new.html
new file mode 100644
index 0000000..9e84f21
--- /dev/null
+++ b/Unit-02/01-blueprints/project/users/templates/users/new.html
@@ -0,0 +1,24 @@
+{% extends 'base.html' %}
+
+{%block content%}
+Add a new User
+
+{% endblock %}
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/project/users/templates/users/show.html b/Unit-02/01-blueprints/project/users/templates/users/show.html
new file mode 100644
index 0000000..e69de29
diff --git a/Unit-02/01-blueprints/project/users/views.py b/Unit-02/01-blueprints/project/users/views.py
new file mode 100644
index 0000000..5670b8e
--- /dev/null
+++ b/Unit-02/01-blueprints/project/users/views.py
@@ -0,0 +1,60 @@
+from flask import redirect, render_template, request, url_for, flash,Blueprint
+from project.users.forms import UserForm, DeleteForm
+from project.models import User
+from project import db
+
+users_blueprint = Blueprint(
+ 'users',
+ __name__,
+ template_folder='templates'
+ )
+
+@users_blueprint.route('/', methods = ['GET','POST'])
+def index():
+ delete_form = DeleteForm()
+ if request.method == "POST":
+ form = UserForm(request.form)
+ if form.validate():
+ new_user = User(request.form['first_name'], request.form['last_name'])
+ db.session.add(new_user)
+ db.session.commit()
+ flash('User Created!')
+ return redirect(url_for('users.index'))
+ else:
+ return render_template('users/new.html', form=form)
+ return render_template('users/index.html', users=User.query.all(), delete_form=delete_form)
+
+@users_blueprint.route('/new')
+def new():
+ user_form = UserForm()
+ return render_template('users/new.html',form = user_form)
+
+
+@users_blueprint.route('//edit')
+def edit(id):
+ found_user = User.query.get(id)
+ user_form = UserForm(obj=found_user)
+
+ return render_template('users/edit.html', user = found_user, form=user_form)
+
+@users_blueprint.route('/',methods = ['GET','PATCH','DELETE'])
+def show(id):
+ found_user = User.query.get(id)
+ if request.method == b"PATCH":
+ form = UserForm(request.form)
+ if form.validate():
+ found_user.first_name = form.first_name.data
+ found_user.last_name = form.last_name.data
+ db.session.add(found_user)
+ db.session.commit()
+ flash('User Updated!')
+ return redirect(url_for('users.index'))
+ return render_template('users/edit.html', user=found_user, form=form)
+ if request.method == b"DELETE":
+ delete_form = DeleteForm(request.form)
+ if delete_form.validate():
+ db.session.delete(found_user)
+ db.session.commit()
+ flash('User Deleted!')
+ return redirect(url_for('users.index'))
+ return render_template('users/show.html', user=found_user)
\ No newline at end of file
diff --git a/Unit-02/01-blueprints/readme.md b/Unit-02/01-blueprints/readme.md
deleted file mode 100644
index afe8a3c..0000000
--- a/Unit-02/01-blueprints/readme.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Blueprints
-
-### Part I - Questions
-
-1. Describe the MVC pattern.
-2. In the MVC pattern, does the model communicate directly with the view?
-2. What is the purpose of blueprints?
-3. How does using blueprints help us organize bigger applications?
-
-### Part II - Exercise
-
-1. Refactor your users and messages app to use blueprints. Make sure to have a separate file for `models.py`, `views.py`, and `forms.py`. You should have a working 1 to Many application with blueprints when this exercise is complete!
-
-2. Include the following flash messages (it's important you make sure these are exact so the tests will pass)
- - when a user is created, send a flash message of "User Created!"
- - when a user is updated, send a flash message of "User Updated!"
- - when a user is deleted, send a flash message of "User Deleted!"
- - when a message is created, send a flash message of "Message Created!"
- - when a message is updated, send a flash message of "Message Updated!"
- - when a message is deleted, send a flash message of "Message Deleted!"
-
-3. If you have not added any styling or testing to your users and messages app, be sure to do so!
diff --git a/Unit-02/01-blueprints/test.py b/Unit-02/01-blueprints/test.py
deleted file mode 100644
index 124d16f..0000000
--- a/Unit-02/01-blueprints/test.py
+++ /dev/null
@@ -1,122 +0,0 @@
-from project import app,db
-from project.users.models import User
-from project.messages.models import Message
-from flask_testing import TestCase
-import unittest
-
-class BaseTestCase(TestCase):
- def create_app(self):
- app.config['WTF_CSRF_ENABLED'] = False
- app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite:///testing.db'
- return app
-
- def setUp(self):
- db.create_all()
- user1 = User("Elie", "Schoppik")
- user2 = User("Tim", "Garcia")
- user3 = User("Matt", "Lane")
- db.session.add_all([user1, user2, user3])
- message1 = Message("Hello Elie!!", 1)
- message2 = Message("Goodbye Elie!!", 1)
- message3 = Message("Hello Tim!!", 2)
- message4 = Message("Goodbye Tim!!", 2)
- db.session.add_all([message1, message2, message3,message4])
- db.session.commit()
-
- def tearDown(self):
- db.drop_all()
-
- def test_users_index(self):
- response = self.client.get('/users', content_type='html/text', follow_redirects=True)
- self.assertLess(response.status_code, 400)
- self.assertIn(b'Elie Schoppik', response.data)
- self.assertIn(b'Tim Garcia', response.data)
- self.assertIn(b'Matt Lane', response.data)
-
- def test_users_show(self):
- response = self.client.get('/users/1')
- self.assertEqual(response.status_code, 200)
-
- def test_users_create(self):
- response = self.client.post(
- '/users/',
- data=dict(first_name="Awesome", last_name="Student"),
- follow_redirects=True
- )
- self.assertEqual(response.status_code, 200)
- self.assertIn(b'Awesome', response.data)
- self.assertIn(b'User Created!', response.data)
-
- def test_users_edit(self):
- response = self.client.get(
- '/users/1/edit'
- )
- self.assertIn(b'Elie', response.data)
- self.assertIn(b'Schoppik', response.data)
-
- def test_users_update(self):
- response = self.client.patch(
- '/users/1?_method=PATCH',
- data=dict(first_name="updated", last_name="information"),
- follow_redirects=True
- )
- self.assertIn(b'updated information', response.data)
- self.assertNotIn(b'Elie Schoppik', response.data)
-
- def test_users_delete(self):
- response = self.client.delete(
- '/users/1?_method=DELETE',
- follow_redirects=True
- )
- self.assertNotIn(b'Elie Schoppik', response.data)
-
- #### TESTS FOR MESSAGES ####
-
- def test_messages_index(self):
- response = self.client.get('/users/1/messages', content_type='html/text', follow_redirects=True)
- self.assertLess(response.status_code, 400)
- self.assertIn(b'Hello Elie!!', response.data)
- self.assertIn(b'Goodbye Elie!!', response.data)
-
- def test_messages_show(self):
- response = self.client.get('/users/1/messages/1')
- self.assertEqual(response.status_code, 200)
-
- def test_messages_create(self):
- response = self.client.post(
- '/users/1/messages/',
- data=dict(text="Hi Matt!!", user_id=3),
- follow_redirects=True
- )
- self.assertEqual(response.status_code, 200)
- self.assertIn(b'Hi Matt!!', response.data)
-
- def test_messages_edit(self):
- response = self.client.get(
- '/users/1/messages/1/edit'
- )
- self.assertIn(b'Hello Elie!!', response.data)
-
- response = self.client.get(
- '/users/2/messages/4/edit'
- )
- self.assertIn(b'Goodbye Tim!!', response.data)
-
- def test_messages_update(self):
- response = self.client.patch(
- '/users/1/messages/1?_method=PATCH',
- data=dict(text="Welcome Back Elie!"),
- follow_redirects=True
- )
- self.assertIn(b'Welcome Back Elie!', response.data)
-
- def test_messages_delete(self):
- response = self.client.delete(
- '/users/1/messages/1?_method=DELETE',
- follow_redirects=True
- )
- self.assertNotIn(b'Hello Elie!!', response.data)
-
-
-if __name__ == '__main__':
- unittest.main()