Skip to content

Snow Leopards - Aretta B. #136

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

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: gunicorn 'app:create_app()'
6 changes: 6 additions & 0 deletions app/__init__.py
Original file line number Diff line number Diff line change
@@ -30,5 +30,11 @@ def create_app(test_config=None):
migrate.init_app(app, db)

# Register Blueprints here
from .routes import task
app.register_blueprint(task.bp)

from .routes import goal
app.register_blueprint(goal.bp)


return app
6 changes: 5 additions & 1 deletion app/models/goal.py
Original file line number Diff line number Diff line change
@@ -2,4 +2,8 @@


class Goal(db.Model):
goal_id = db.Column(db.Integer, primary_key=True)
goal_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String)
tasks = db.relationship("Task", back_populates="goal", lazy=True)


27 changes: 26 additions & 1 deletion app/models/task.py
Original file line number Diff line number Diff line change
@@ -2,4 +2,29 @@


class Task(db.Model):
task_id = db.Column(db.Integer, primary_key=True)
task_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String, nullable=False)
description = db.Column(db.String, nullable=False)
completed_at = db.Column(db.DateTime, nullable=True)
goal_id = db.Column(db.Integer, db.ForeignKey('goal.goal_id'), nullable=True)
goal = db.relationship("Goal", back_populates="tasks")


def to_dict(self):
task_as_dict = {}
task_as_dict["task_id"] = self.task_id
if self.goal_id:
task_as_dict["goal_id"] = self.goal_id
task_as_dict["title"] = self.title
task_as_dict["description"] = self.description
task_as_dict["is_complete"] = bool(self.completed_at)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job handling this one!



return task_as_dict


@classmethod
def from_dict(cls, task_data):
new_task = Task(title=task_data["title"],
description=task_data["description"])
return new_task
1 change: 0 additions & 1 deletion app/routes.py

This file was deleted.

168 changes: 168 additions & 0 deletions app/routes/goal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
import datetime
import os

import requests
from dotenv import load_dotenv
from flask import Blueprint, abort, jsonify, make_response, request

from app import db
from app.models.goal import Goal
from app.models.task import Task

bp = Blueprint("goal", __name__, url_prefix="/goals")

def validate_model(cls, model_id):
try:
model_id = int(model_id)
except:
abort(make_response(
{"message": f"{cls.__name__} {model_id} invalid"}, 400))

model = cls.query.get(model_id)
if not model:
abort(make_response(
{'message': f'{cls.__name__} {model_id} not found'}, 404))

return model

def validate_title(cls, data):
try:
new_cls = cls(title = data["title"])
except:
abort(make_response(
{"details": "Invalid data"}, 400))
return new_cls



@bp.route("", methods=["POST"])
def create_goal():
request_body = request.get_json()
new_goal = validate_title(Goal,request_body)

db.session.add(new_goal)
db.session.commit()

return make_response(jsonify({
"goal": {
"id":new_goal.goal_id,
"title": new_goal.title,
}})
, 201)

@bp.route("", methods=["GET"])
def read_all_goals():
goals = Goal.query.all()

get_response = []

for goal in goals:
get_response.append(dict(
id=goal.goal_id,
title=goal.title
))

return make_response(jsonify(get_response), 200)

@bp.route("/<goal_id>", methods=["GET"])
def handle_task(goal_id):

goal = validate_model(Goal,goal_id)


get_response ={
f"goal": {
"id": goal.goal_id,
"title": goal.title
}}

return get_response, 200

@bp.route("/<goal_id>", methods=["PUT"])
def update_goal(goal_id):
goal = validate_model(Goal, goal_id)

request_body = request.get_json()

goal.title = request_body["title"]

db.session.commit()

update_response = {
"goal": {
"id": goal.goal_id,
"title": goal.title
}
}

return make_response(update_response), 200

@bp.route("/<goal_id>", methods=["DELETE"])
def delete_goal(goal_id):
goal = validate_model(Goal, goal_id)

db.session.delete(goal)
db.session.commit()

return make_response(jsonify({
"details": f'Goal {goal.goal_id} "{goal.title}" successfully deleted'
})), 200


@bp.route("/<goal_id>/tasks", methods=["POST"])
def post_task_ids_to_goal(goal_id):
request_body = request.get_json()
goal = validate_model(Goal,goal_id)

for task_id in request_body["task_ids"]:
task = validate_model(Task, task_id)
goal.tasks.append(task)

db.session.add(goal)
db.session.commit()

return make_response({
"id": goal.goal_id,
"task_ids": request_body["task_ids"]
}), 200

@bp.route("/<goal_id>/tasks", methods=["GET"])
def get_tasks_for_specific_goal(goal_id):
request_body = request.get_json
goal = validate_model(Goal, goal_id)
tasks = goal.tasks

task_response = []

for task in tasks:
task = {
"id": task.task_id,
"goal_id": goal.goal_id,
"title": f"{task.title}",
"description": f"{task.description}",
"is_complete": bool(task.completed_at)
}
task_response.append(task)


return make_response({
"id": goal.goal_id,
"title": f"{goal.title}",
"tasks": task_response
}), 200

@bp.route("/tasks/<task_id>", methods=["GET"])
def get_task(task_id):

task = validate_model(Task, task_id)

return make_response({
"task": {
"id": task_id,
"goal_id": task.goal_id,
"title": f"{task.title}",
"description": f"{task.description}",
"is_complete": bool(task.completed_at)
}
}), 200

Loading