Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rock -Hacky Sack #19

Open
wants to merge 40 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
f2a7906
initial commit w models
alisonmcginley Jun 28, 2021
284fd19
Setup relationship between card and board
micksumm Jun 29, 2021
9179ef8
Merge pull request #1 from alisonmcginley/SummerBranch
alisonmcginley Jun 29, 2021
8b13f2d
adds board_routes & card_routes
alisonmcginley Jun 29, 2021
e45b24f
adds card_to_json to card model & first two routes to card_routes.py
alisonmcginley Jun 29, 2021
391b530
updates card.py to lose board_id
alisonmcginley Jun 29, 2021
75f483a
Create route to post a board
micksumm Jun 29, 2021
e4632ed
Merge pull request #2 from alisonmcginley/alisonbranch
alisonmcginley Jun 29, 2021
77f3b52
Create route to get a board
micksumm Jun 29, 2021
8b853a6
Merge branch 'main' into SummerBranch
alisonmcginley Jun 29, 2021
2b9e969
Merge pull request #3 from alisonmcginley/SummerBranch
alisonmcginley Jun 29, 2021
4126d16
Create route to get the cards by board id
micksumm Jun 29, 2021
adc15b7
adds post_card_to_board to board_routes
alisonmcginley Jun 29, 2021
0f58da1
Merge pull request #4 from alisonmcginley/alison
alisonmcginley Jun 29, 2021
38b13d4
Merge branch 'main' into SummerBranch2
micksumm Jun 29, 2021
f056cb1
Merge pull request #5 from alisonmcginley/SummerBranch2
micksumm Jun 29, 2021
aa7b80f
updates post_car_to_board
alisonmcginley Jun 29, 2021
97678c9
Merge pull request #6 from alisonmcginley/card_to_baord
alisonmcginley Jun 29, 2021
f773e7d
Fix typo
micksumm Jun 29, 2021
1dc7024
Fix
micksumm Jun 29, 2021
abaf8f0
dear god
alisonmcginley Jun 29, 2021
174980d
Merge branch 'main' into card_to_baord
alisonmcginley Jun 29, 2021
4a42b88
Merge pull request #7 from alisonmcginley/card_to_baord
micksumm Jun 29, 2021
c8b95d9
debugs post_card_to_board
alisonmcginley Jun 29, 2021
0260adb
Merge pull request #8 from alisonmcginley/workingbranch
alisonmcginley Jun 29, 2021
b99654f
corrects some typo in board.py
alisonmcginley Jun 29, 2021
5d3d514
Merge pull request #9 from alisonmcginley/workingbranch
alisonmcginley Jun 29, 2021
0c77225
adds make_response to all response
alisonmcginley Jun 29, 2021
5ecc4fe
adds board_id to card_to_json
alisonmcginley Jun 29, 2021
60780e0
Merge pull request #10 from alisonmcginley/workingbranch
alisonmcginley Jun 29, 2021
531df76
idk
alisonmcginley Jun 29, 2021
aeec69f
Merge pull request #11 from alisonmcginley/workingbranch
alisonmcginley Jun 29, 2021
832fe48
makes response
alisonmcginley Jun 29, 2021
b08edf5
not sure
alisonmcginley Jun 29, 2021
7fec2c1
Summer deploy branch (#12)
micksumm Jun 29, 2021
c2e2e6b
Temporarily comment out CORS
micksumm Jun 29, 2021
a6d1d5f
Add space
micksumm Jun 30, 2021
5ddfdcb
Move Procfile
micksumm Jun 30, 2021
3f4fba6
Add CORS and temporarily allow all requested websites
micksumm Jul 1, 2021
5c19955
Fixed CORS
micksumm Jul 1, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,20 @@ def create_app():

app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get(
"SQLALCHEMY_DATABASE_URI")

# Import models here for Alembic setup
# from app.models.ExampleModel import ExampleModel


from app.models.board import Board
from app.models.card import Card

db.init_app(app)
migrate.init_app(app, db)

# Register Blueprints here
# from .routes import example_bp
# app.register_blueprint(example_bp)
from .card_routes import cards_bp
app.register_blueprint(cards_bp)

from .board_routes import boards_bp
app.register_blueprint(boards_bp)

CORS(app)
return app
CORS(app, resources={r"/*": {"origins": ["*", "localhost:3000"]} });
return app
62 changes: 62 additions & 0 deletions app/board_routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from flask import Blueprint, request, jsonify, make_response
from app import db
from app.models.board import Board
from app.models.card import Card
from flask_cors import cross_origin

boards_bp = Blueprint("boards", __name__, url_prefix="/boards")

@boards_bp.route("", methods=["POST"], strict_slashes=False)
@cross_origin()
def create_board():
request_body = request.get_json()

if "title" not in request_body.keys() or "owner" not in request_body.keys():
return make_response({"details": "Invalid data"},400)

new_board = Board(title = request_body["title"], owner = request_body["owner"])
db.session.add(new_board)
db.session.commit()

return make_response(new_board.to_json(), 201)

@boards_bp.route("", methods=["GET"], strict_slashes=False)
def get_board():
title_from_url = request.args.get("title")

if title_from_url:
boards = Board.query.filter_by(title = title_from_url)

boards = Board.query.all()

boards_response = []
for board in boards:
boards_response.append(board.to_json())


return make_response(jsonify(boards_response), 200)


@boards_bp.route("<board_id>/cards", methods=["GET"], strict_slashes=False)
def get_cards(board_id):

board =Board.query.get_or_404(board_id)

cards = []
for card in board.cards:
cards.append(card.card_to_json())

return make_response(board.to_json_with_cards(cards), 200)

@boards_bp.route("/<board_id>/cards", methods=["POST"], strict_slashes=False)
def post_card_to_board(board_id):
request_body = request.get_json()

new_card = Card(message=request_body["message"], board_id=board_id)
if "message" not in request_body.keys() or not board_id:
return {"details": "Invalid data"},400

db.session.add(new_card)
db.session.commit()

return make_response(new_card.card_to_json(), 200)
22 changes: 22 additions & 0 deletions app/card_routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from flask import Blueprint, request, jsonify, make_response
from app import db
from app.models.card import Card

cards_bp = Blueprint("cards", __name__, url_prefix="/cards")

@cards_bp.route("/<card_id>", methods=["DELETE"])
def delete_card(card_id):
card = Card.query.get_or_404(card_id)
db.session.delete(card)
db.session.commit()

return make_response(f"Card #{card.card_id} successfully deleted", 200)

@cards_bp.route("/<card_id>/like", methods=["PUT"])
def update_card(card_id):
card = Card.query.get_or_404(card_id)
form_data = request.get_json()
card.likes_count = form_data["likes_count"]
db.session.commit()

return make_response(f"Card #{card.card_id} successfully updated", 200)
20 changes: 20 additions & 0 deletions app/models/board.py
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
from app import db

class Board(db.Model):
board_id = db.Column(db.Integer, primary_key= True)
title = db.Column(db.String)
owner = db.Column(db.String)
cards =db.relationship('Card', backref='board', lazy=True)

def to_json(self):
return {
"title": self.title,
"owner": self.owner,
"board_id" : self.board_id
}

def to_json_with_cards(self, cards):
return {
"title": self.title,
"owner": self.owner,
"cards": cards
}
14 changes: 14 additions & 0 deletions app/models/card.py
Original file line number Diff line number Diff line change
@@ -1 +1,15 @@
from app import db

class Card(db.Model):
card_id = db.Column(db.Integer, primary_key= True)
message = db.Column(db.String(40))
likes_count = db.Column(db.Integer, default= 0)
board_id = db.Column(db.Integer, db.ForeignKey('board.board_id'), nullable=True)

def card_to_json(self):
return {
"card_id": self.card_id,
"message": self.message,
"likes_count": self.likes_count,
"board_id": self.board_id
}
4 changes: 0 additions & 4 deletions app/routes.py

This file was deleted.

1 change: 1 addition & 0 deletions migrations/README
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Generic single-database configuration.
45 changes: 45 additions & 0 deletions migrations/alembic.ini
Original file line number Diff line number Diff line change
@@ -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
96 changes: 96 additions & 0 deletions migrations/env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
from __future__ import with_statement

import logging
from logging.config import fileConfig

from sqlalchemy import engine_from_config
from sqlalchemy import pool
from flask import current_app

from alembic import context

# 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
config.set_main_option(
'sqlalchemy.url',
str(current_app.extensions['migrate'].db.engine.url).replace('%', '%%'))
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, target_metadata=target_metadata, literal_binds=True
)

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.')

connectable = engine_from_config(
config.get_section(config.config_ini_section),
prefix='sqlalchemy.',
poolclass=pool.NullPool,
)

with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
process_revision_directives=process_revision_directives,
**current_app.extensions['migrate'].configure_args
)

with context.begin_transaction():
context.run_migrations()


if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()
24 changes: 24 additions & 0 deletions migrations/script.py.mako
Original file line number Diff line number Diff line change
@@ -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"}
42 changes: 42 additions & 0 deletions migrations/versions/bc49bcbc372e_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""empty message

Revision ID: bc49bcbc372e
Revises:
Create Date: 2021-06-29 12:42:57.498194

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = 'bc49bcbc372e'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('board',
sa.Column('board_id', sa.Integer(), nullable=False),
sa.Column('title', sa.String(), nullable=True),
sa.Column('owner', sa.String(), nullable=True),
sa.PrimaryKeyConstraint('board_id')
)
op.create_table('card',
sa.Column('card_id', sa.Integer(), nullable=False),
sa.Column('message', sa.String(), nullable=True),
sa.Column('likes_count', sa.Integer(), nullable=True),
sa.Column('board_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['board_id'], ['board.board_id'], ),
sa.PrimaryKeyConstraint('card_id')
)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('card')
op.drop_table('board')
# ### end Alembic commands ###
Loading