From 839a12c1b6a0cd137cf1dd61207adc8426fc1022 Mon Sep 17 00:00:00 2001 From: Becca Date: Mon, 2 May 2022 07:24:22 -0700 Subject: [PATCH 1/5] fix testing link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ad66849d2..e326c7b6d 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ At submission time, no matter where you are, submit the project via Learn. This project is designed to fulfill the features described in detail in each wave. The tests are meant to only guide your development. 1. [Setup](ada-project-docs/setup.md) -1. [Testing] (ada-project-docs/testing.md) +1. [Testing](ada-project-docs/testing.md) 1. [Wave 1: CRUD for one model](ada-project-docs/wave_01.md) 1. [Wave 2: Using query params](ada-project-docs/wave_02.md) 1. [Wave 3: Creating custom endpoints](ada-project-docs/wave_03.md) From edd619f8bd8532007d3af2e7ede23eba3d9cb8ba Mon Sep 17 00:00:00 2001 From: Bahareh Date: Sun, 8 May 2022 14:38:55 -0400 Subject: [PATCH 2/5] nade Procfile --- Procfile | 1 + app/__init__.py | 2 + app/models/task.py | 10 +++ app/routes.py | 116 ++++++++++++++++++++++++++- migrations/README | 1 + migrations/alembic.ini | 45 +++++++++++ migrations/env.py | 96 ++++++++++++++++++++++ migrations/script.py.mako | 24 ++++++ migrations/versions/23affeca843b_.py | 39 +++++++++ 9 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 Procfile create mode 100644 migrations/README create mode 100644 migrations/alembic.ini create mode 100644 migrations/env.py create mode 100644 migrations/script.py.mako create mode 100644 migrations/versions/23affeca843b_.py diff --git a/Procfile b/Procfile new file mode 100644 index 000000000..62e430aca --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn 'app:create_app()' \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py index 2764c4cc8..92aea0e31 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -30,5 +30,7 @@ def create_app(test_config=None): migrate.init_app(app, db) # Register Blueprints here + from .routes import task_list_bp + app.register_blueprint(task_list_bp) return app diff --git a/app/models/task.py b/app/models/task.py index c91ab281f..519065e83 100644 --- a/app/models/task.py +++ b/app/models/task.py @@ -1,5 +1,15 @@ from app import db +# name - The name of the task +# description - A text description of the task +# completed_at - The date, saved as text, in which the task was completed. class Task(db.Model): task_id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String) + description = db.Column(db.String) + completed_at = db.Column(db.DateTime,default=None) + # is_complete=db.Column(db.String,default=False) + + +# nullable=True \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index 3aae38d49..1c1b7cab6 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1 +1,115 @@ -from flask import Blueprint \ No newline at end of file + +from app.models.task import Task +from app import db +from flask import Blueprint, jsonify,abort,make_response,request + + +task_list_bp = Blueprint("task_list", __name__,url_prefix="/tasks") + + +@task_list_bp.route("", methods=["post"]) +def create_new_task(): + #************************ + request_body = request.get_json() + new_task = Task(title=request_body["title"], + description=request_body["description"], + completed_at =request_body["completed_at"]) + + db.session.add(new_task) + db.session.commit() + + return make_response(jsonify(f"Task {new_task.title} successfully created", 201)) + +@task_list_bp.route("", methods=["GET"]) +def get_all_tasks(): + title_query = request.args.get("title") + sort_query = request.args.get("sort") + + # sort_asc = request.args.get(Task.title.asc()) + # sort_dsc = request.args.get(Task.title.desc()) + + # posts = Post.query.order_by(Post.title.asc()).all() + if title_query: + task = Task.query.filter_by(title=title_query) + if sort_query and sort_query=="asc": + task= Task.query.order_by(Task.title.asc()).all() + if sort_query and sort_query=="desc": + task= Task.query.order_by(Task.title.desc()).all() + + # if sort_asc: + # task=Task.query.filter_by(title.asc()) + # if sort_dsc: + # task=Task.query.filter_by(title.desc()) + + + # query.order_by(SpreadsheetCells.y_index.desc()) # desc + else: + tasks = Task.query.all() + + task_response = [] + for task in tasks: + task_response.append({ + "task_id": task.task_id, + "name": task.title, + "description": task.description + }) + return jsonify(task_response) +#do we need 200 ok +# @task_list_bp.route("", methods=["GET"]) +# def return_orderd(): +# ordered_task=Task.query.filter_by(title.asc()) +# return jsonify(ordered_task) + + +def validate_task(task_id): + try: + task_id = int(task_id) + except: + #************************* *** + abort(make_response({"message":f"task {task_id} invalid"}, 400)) + + task = Task.query.get(task_id) + + if not task: + abort(make_response({"message":f"task {task_id} not found"}, 404)) + + return task + +@task_list_bp.route("/", methods=["GET"]) +def read_one_task(task_id): + task = validate_task(task_id) + + return { + "task_id": task.task_id, + "name": task.title, + "description": task.description} +@task_list_bp.route("/", methods=["PUT"]) +def update_task(task_id): + task = validate_task(task_id) + + request_body = request.get_json() + + task.title = request_body["title"] + task.description = request_body["description"] + + db.session.commit() + + return make_response(f"task #{task.task_id} successfully updated") + +@task_list_bp.route("/", methods=["DELETE"]) +def delete_task(task_id): + task = validate_task(task_id) + + db.session.delete(task) + db.session.commit() + + return make_response(f"Task #{task.task_id} successfully deleted") + +# @task_list_bp.route('//mark_complete', methods=['PATCH']) +# def mark_complet(task_id): +# request_body = request.get_json() +# task.is_complete = request_body["is_complete"] + +# db.session.commit() + +# return make_response(f"task #{task.task_id} successfully updated") \ No newline at end of file diff --git a/migrations/README b/migrations/README new file mode 100644 index 000000000..98e4f9c44 --- /dev/null +++ b/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/migrations/alembic.ini b/migrations/alembic.ini new file mode 100644 index 000000000..f8ed4801f --- /dev/null +++ b/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/migrations/env.py b/migrations/env.py new file mode 100644 index 000000000..8b3fb3353 --- /dev/null +++ b/migrations/env.py @@ -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() diff --git a/migrations/script.py.mako b/migrations/script.py.mako new file mode 100644 index 000000000..2c0156303 --- /dev/null +++ b/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/migrations/versions/23affeca843b_.py b/migrations/versions/23affeca843b_.py new file mode 100644 index 000000000..3f80d8aa8 --- /dev/null +++ b/migrations/versions/23affeca843b_.py @@ -0,0 +1,39 @@ +"""empty message + +Revision ID: 23affeca843b +Revises: +Create Date: 2022-05-06 18:43:26.756044 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '23affeca843b' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('goal', + sa.Column('goal_id', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('goal_id') + ) + op.create_table('task', + sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('title', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('completed_at', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('task_id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('task') + op.drop_table('goal') + # ### end Alembic commands ### From 4d7235d642734badcc8db52276720f83b3d03b39 Mon Sep 17 00:00:00 2001 From: Bahareh Date: Thu, 12 May 2022 19:21:48 -0400 Subject: [PATCH 3/5] All tests passed --- app/__init__.py | 2 + app/models/goal.py | 5 +- app/models/task.py | 48 ++- app/routes.py | 307 ++++++++++++++---- .../{23affeca843b_.py => 52925a78c2c4_.py} | 13 +- tests/test_wave_01.py | 38 ++- tests/test_wave_02.py | 4 +- tests/test_wave_03.py | 26 +- tests/test_wave_05.py | 83 ++--- tests/test_wave_06.py | 21 +- 10 files changed, 396 insertions(+), 151 deletions(-) rename migrations/versions/{23affeca843b_.py => 52925a78c2c4_.py} (65%) diff --git a/app/__init__.py b/app/__init__.py index 92aea0e31..3d666df64 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -31,6 +31,8 @@ def create_app(test_config=None): # Register Blueprints here from .routes import task_list_bp + from .routes import goal_list_bp app.register_blueprint(task_list_bp) + app.register_blueprint(goal_list_bp) return app diff --git a/app/models/goal.py b/app/models/goal.py index b0ed11dd8..5a874be60 100644 --- a/app/models/goal.py +++ b/app/models/goal.py @@ -2,4 +2,7 @@ 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", backref="goal", lazy=True) + diff --git a/app/models/task.py b/app/models/task.py index 519065e83..ccd8d4d6d 100644 --- a/app/models/task.py +++ b/app/models/task.py @@ -1,15 +1,57 @@ from app import db + + # name - The name of the task # description - A text description of the task # completed_at - The date, saved as text, in which the task was completed. class Task(db.Model): - task_id = db.Column(db.Integer, primary_key=True) + task_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False) title = db.Column(db.String) description = db.Column(db.String) - completed_at = db.Column(db.DateTime,default=None) + completed_at = db.Column(db.DateTime,default=None,nullable=True) + goals = db.relationship("Goal") + goal_id = db.Column(db.Integer, db.ForeignKey('goal.goal_id'), nullable=True) # is_complete=db.Column(db.String,default=False) + #why to json + def to_json(self): + if self.completed_at: + is_completed=True + else: + is_completed=False + task_dict= { + "id": self.task_id, + "title": self.title, + "description": self.description, + "is_complete": is_completed, + } + if self.goal_id: + task_dict["goal_id"] = self.goal_id + return task_dict + + def to_json_without_des(self): + if self.completed_at: + is_completed=True + else: + is_completed=False + return { + "id": self.task_id, + "title": self.title, + "description": "", + "is_complete": is_completed, + } -# nullable=True \ No newline at end of file + def to_jsonn(self): + if self.completed_at: + is_completed=True + else: + is_completed=False + return { + "goal_id":self.goal_id, + "id": self.task_id, + "title": self.title, + "description": self.description, + "is_complete": is_completed, + } \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index 1c1b7cab6..fcbecba64 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,69 +1,85 @@ from app.models.task import Task +from app.models.goal import Goal from app import db from flask import Blueprint, jsonify,abort,make_response,request +from sqlalchemy.sql.functions import now +import os +import requests task_list_bp = Blueprint("task_list", __name__,url_prefix="/tasks") +goal_list_bp = Blueprint("goal_list", __name__,url_prefix="/goals") +# @task_list_bp.route("", methods=["GET"]) +# def get_all_tasks(): + +# tasks = Task.query.all() + +# task_response = [] +# for task in tasks: +# task_response.append(task.to_json()) +# return jsonify(task_response),200 -@task_list_bp.route("", methods=["post"]) -def create_new_task(): - #************************ - request_body = request.get_json() - new_task = Task(title=request_body["title"], - description=request_body["description"], - completed_at =request_body["completed_at"]) - - db.session.add(new_task) - db.session.commit() - - return make_response(jsonify(f"Task {new_task.title} successfully created", 201)) @task_list_bp.route("", methods=["GET"]) -def get_all_tasks(): - title_query = request.args.get("title") +def get_tasks_sorted(): + sort_query = request.args.get("sort") - # sort_asc = request.args.get(Task.title.asc()) - # sort_dsc = request.args.get(Task.title.desc()) - - # posts = Post.query.order_by(Post.title.asc()).all() - if title_query: - task = Task.query.filter_by(title=title_query) + if sort_query and sort_query=="asc": - task= Task.query.order_by(Task.title.asc()).all() - if sort_query and sort_query=="desc": - task= Task.query.order_by(Task.title.desc()).all() - - # if sort_asc: - # task=Task.query.filter_by(title.asc()) - # if sort_dsc: - # task=Task.query.filter_by(title.desc()) - - - # query.order_by(SpreadsheetCells.y_index.desc()) # desc + tasks= Task.query.order_by(Task.title.asc()) + elif sort_query and sort_query=="desc": + tasks= Task.query.order_by(Task.title.desc()) else: tasks = Task.query.all() + + task_response = [] for task in tasks: - task_response.append({ - "task_id": task.task_id, - "name": task.title, - "description": task.description - }) - return jsonify(task_response) -#do we need 200 ok -# @task_list_bp.route("", methods=["GET"]) -# def return_orderd(): -# ordered_task=Task.query.filter_by(title.asc()) -# return jsonify(ordered_task) + task_response.append(task.to_json()) + return make_response( jsonify(task_response),200) + +@task_list_bp.route("/", methods=["GET"]) +def get_one_task(task_id): + # task = validate_task(task_id) + task = Task.query.get(task_id) + + if task: + return { + "task": task.to_json() + } + else: + return make_response(jsonify(None), 404) + +@task_list_bp.route("", methods=["POST"]) +def create_new_task(): + + request_body = request.get_json() + if "title" not in request_body or "description" not in request_body: + return make_response({"details":f"Invalid data"}, 400) + + new_task = Task(title=request_body["title"], + description=request_body["description"], + ) + if "completed_at" in request_body: + new_task.completed_at = request_body["completed_at"] + + + db.session.add(new_task) + db.session.commit() + + return jsonify({"task":new_task.to_json()}),201 + + + def validate_task(task_id): try: - task_id = int(task_id) + task_id = int(task_id) except: #************************* *** abort(make_response({"message":f"task {task_id} invalid"}, 400)) @@ -74,15 +90,9 @@ def validate_task(task_id): abort(make_response({"message":f"task {task_id} not found"}, 404)) return task +#?????????? -@task_list_bp.route("/", methods=["GET"]) -def read_one_task(task_id): - task = validate_task(task_id) - - return { - "task_id": task.task_id, - "name": task.title, - "description": task.description} + @task_list_bp.route("/", methods=["PUT"]) def update_task(task_id): task = validate_task(task_id) @@ -94,7 +104,9 @@ def update_task(task_id): db.session.commit() - return make_response(f"task #{task.task_id} successfully updated") + # return make_response(f"task #{task.task_id} successfully updated") + return jsonify({"task":task.to_json()}),200 + @task_list_bp.route("/", methods=["DELETE"]) def delete_task(task_id): @@ -103,13 +115,190 @@ def delete_task(task_id): db.session.delete(task) db.session.commit() - return make_response(f"Task #{task.task_id} successfully deleted") + return make_response({"details":f'Task {task.task_id} \"{task.title}\" successfully deleted'}),200 + + + +@task_list_bp.route('//mark_complete', methods=['PATCH']) +def mark_complete(task_id): + task=Task.query.get(task_id) + if not task: + #abort be dARD MIKHORE? + abort(make_response({"message":f"task {task_id} not found"}, 404)) + task.completed_at = now() + db.session.add(task) + db.session.commit() + + + # task_response={"task":{ + # "id": task.task_id, + # "title": task.title, + # "description": task.description, "is_complete": True + # }} + # #JAYE 200 VA SHEKLE J DOROSTE? + # return jsonify(task_response),200 -# @task_list_bp.route('//mark_complete', methods=['PATCH']) -# def mark_complet(task_id): -# request_body = request.get_json() -# task.is_complete = request_body["is_complete"] + slack_api_url = "https://slack.com/api/chat.postMessage" + params = { + "channel" : "test-channel", + "text" : f"Someone just completed the task {task.title}" + } + headers = { + "Authorization" : f"Bearer {os.environ.get('SLACK_API_HEADER')}" + } + requests.get(url=slack_api_url, params=params, headers=headers) + + return make_response(jsonify({"task" : task.to_json()})) + + + +@task_list_bp.route('//mark_incomplete', methods=['PATCH']) +def mark_incomplete(task_id): + task=Task.query.get(task_id) + if not task: + #abort be dARD MIKHORE? + abort(make_response({"message":f"task {task_id} not found"}, 404)) + task.completed_at = None + db.session.add(task) + db.session.commit() -# db.session.commit() -# return make_response(f"task #{task.task_id} successfully updated") \ No newline at end of file + + + task_response={"task":{ + "id": task.task_id, + "title": task.title, + "description": task.description, "is_complete": False + }} + #JAYE 200 VA SHEKLE J DOROSTE? + return jsonify(task_response),200 + + + +@goal_list_bp.route("", methods=["post"]) +def create_new_goal(): + #************************ + request_body = request.get_json() + if "title" not in request_body: + return { + "details": "Invalid data" + },400 + new_goal = Goal(title=request_body["title"], + ) + + + db.session.add(new_goal) + db.session.commit() + + return {"goal":{"id":new_goal.goal_id, "title":new_goal.title}},201 + + + + +def validate_goal(goal_id): + try: + goal_id = int(goal_id) + except: + #************************* *** + abort(make_response({"message":f"goal {goal_id} invalid"}, 400)) + + goal = Goal.query.get(goal_id) + + if not goal: + abort(make_response({"message":f"goal {goal_id} not found"}, 404)) + + return goal + +@goal_list_bp.route("/", methods=["GET"]) +def get_one_goal(goal_id): + goal = validate_goal(goal_id) + + return{"goal": { + "id": goal.goal_id, + "title": goal.title, + }} + +@goal_list_bp.route("", methods=["GET"]) +def get_all_goal(): + goals = Goal.query.all() + + goal_response = [] + for goal in goals: + goal_response.append({ + "id": goal.goal_id, + "title": goal.title, + + }) + #jsonify bardar bebi chi mishe va bebing mishe refactor kard + return jsonify(goal_response),200 + + +@goal_list_bp.route("/", methods=["PUT"]) +def update_goal(goal_id): + goal = validate_goal(goal_id) + + request_body = request.get_json() + + goal.title = request_body["title"] + goal.decription = request_body["description"] + + + db.session.commit() + + return make_response(jsonify(f"goal #{goal.goal_id} successfully updated")),200 + +@goal_list_bp.route("/", methods=["DELETE"]) +def delete_goal(goal_id): + goal = validate_goal(goal_id) + + db.session.delete(goal) + db.session.commit() + + return {"details":f"Goal {goal.goal_id} \"{goal.title}\" successfully deleted"} + + +@goal_list_bp.route("//tasks", methods=["GET"]) +def show_tasks_for_a_goal(goal_id): + goal = validate_goal(goal_id) + #**** + tasks = Task.query.filter_by(goal=goal) + task_list = [] + + for task in tasks: + task_list.append(task.to_json()) + return make_response(jsonify({ + "id": goal.goal_id, + "title": goal.title, + "tasks": task_list + }), 200) + + + + + # response = {"id" : goal.goal_id, "title": goal.title, "tasks":[] + # } + # #??????????????????/ + # for task in goal.tasks: + # response["tasks"].append(task.to_jsonn()) + + # return response,200 + +@goal_list_bp.route("//tasks", methods=["POST"]) +def posts_tasks_to_a_goal(goal_id): + goal = validate_goal(goal_id) + + + + request_body = request.get_json() + for task_id in request_body["task_ids"]: + task = Task.query.get(task_id) + #****** + task.goal_id=goal.goal_id + if not task: + abort(make_response({"message":f"task {task_id} invalid"}, 400)) + + + goal.tasks.append(task) + db.session.commit() + + return make_response(jsonify({"id":goal.goal_id,"task_ids":request_body["task_ids"]}),200) diff --git a/migrations/versions/23affeca843b_.py b/migrations/versions/52925a78c2c4_.py similarity index 65% rename from migrations/versions/23affeca843b_.py rename to migrations/versions/52925a78c2c4_.py index 3f80d8aa8..0a6bd9d42 100644 --- a/migrations/versions/23affeca843b_.py +++ b/migrations/versions/52925a78c2c4_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 23affeca843b +Revision ID: 52925a78c2c4 Revises: -Create Date: 2022-05-06 18:43:26.756044 +Create Date: 2022-05-12 14:04:05.858094 """ from alembic import op @@ -10,7 +10,7 @@ # revision identifiers, used by Alembic. -revision = '23affeca843b' +revision = '52925a78c2c4' down_revision = None branch_labels = None depends_on = None @@ -19,14 +19,17 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table('goal', - sa.Column('goal_id', sa.Integer(), nullable=False), + sa.Column('goal_id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('title', sa.String(), nullable=True), sa.PrimaryKeyConstraint('goal_id') ) op.create_table('task', - sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('task_id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('title', sa.String(), nullable=True), sa.Column('description', sa.String(), nullable=True), sa.Column('completed_at', sa.DateTime(), nullable=True), + sa.Column('goal_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['goal_id'], ['goal.goal_id'], ), sa.PrimaryKeyConstraint('task_id') ) # ### end Alembic commands ### diff --git a/tests/test_wave_01.py b/tests/test_wave_01.py index dca626d78..d711543dd 100644 --- a/tests/test_wave_01.py +++ b/tests/test_wave_01.py @@ -2,7 +2,7 @@ import pytest -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_tasks_no_saved_tasks(client): # Act response = client.get("/tasks") @@ -13,7 +13,7 @@ def test_get_tasks_no_saved_tasks(client): assert response_body == [] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_tasks_one_saved_tasks(client, one_task): # Act response = client.get("/tasks") @@ -32,7 +32,7 @@ def test_get_tasks_one_saved_tasks(client, one_task): ] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_task(client, one_task): # Act response = client.get("/tasks/1") @@ -51,7 +51,7 @@ def test_get_task(client, one_task): } -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_task_not_found(client): # Act response = client.get("/tasks/1") @@ -60,13 +60,14 @@ def test_get_task_not_found(client): # Assert assert response.status_code == 404 - raise Exception("Complete test with assertion about response body") + # raise Exception("Complete test with assertion about response body") # ***************************************************************** - # **Complete test with assertion about response body*************** + assert response_body == None + # body*************** # ***************************************************************** -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_create_task(client): # Act response = client.post("/tasks", json={ @@ -93,7 +94,7 @@ def test_create_task(client): assert new_task.completed_at == None -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_update_task(client, one_task): # Act response = client.put("/tasks/1", json={ @@ -119,9 +120,9 @@ def test_update_task(client, one_task): assert task.completed_at == None -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_update_task_not_found(client): - # Act + response = client.put("/tasks/1", json={ "title": "Updated Task Title", "description": "Updated Test Description", @@ -131,13 +132,16 @@ def test_update_task_not_found(client): # Assert assert response.status_code == 404 - raise Exception("Complete test with assertion about response body") + # raise Exception("Complete test with assertion about response body") + + + assert response_body == {"message": "task 1 not found"} # ***************************************************************** # **Complete test with assertion about response body*************** # ***************************************************************** -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_delete_task(client, one_task): # Act response = client.delete("/tasks/1") @@ -152,7 +156,7 @@ def test_delete_task(client, one_task): assert Task.query.get(1) == None -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_delete_task_not_found(client): # Act response = client.delete("/tasks/1") @@ -161,7 +165,9 @@ def test_delete_task_not_found(client): # Assert assert response.status_code == 404 - raise Exception("Complete test with assertion about response body") + # raise Exception("Complete test with assertion about response body") + assert "message" in response_body + assert response_body == {"message": "task 1 not found"} # ***************************************************************** # **Complete test with assertion about response body*************** # ***************************************************************** @@ -169,7 +175,7 @@ def test_delete_task_not_found(client): assert Task.query.all() == [] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_create_task_must_contain_title(client): # Act response = client.post("/tasks", json={ @@ -186,7 +192,7 @@ def test_create_task_must_contain_title(client): assert Task.query.all() == [] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_create_task_must_contain_description(client): # Act response = client.post("/tasks", json={ diff --git a/tests/test_wave_02.py b/tests/test_wave_02.py index a087e0909..651e3aebd 100644 --- a/tests/test_wave_02.py +++ b/tests/test_wave_02.py @@ -1,7 +1,7 @@ import pytest -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_tasks_sorted_asc(client, three_tasks): # Act response = client.get("/tasks?sort=asc") @@ -29,7 +29,7 @@ def test_get_tasks_sorted_asc(client, three_tasks): ] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_tasks_sorted_desc(client, three_tasks): # Act response = client.get("/tasks?sort=desc") diff --git a/tests/test_wave_03.py b/tests/test_wave_03.py index 959176ceb..34efb5a29 100644 --- a/tests/test_wave_03.py +++ b/tests/test_wave_03.py @@ -5,7 +5,7 @@ import pytest -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_mark_complete_on_incomplete_task(client, one_task): # Arrange """ @@ -42,7 +42,7 @@ def test_mark_complete_on_incomplete_task(client, one_task): assert Task.query.get(1).completed_at -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(÷reason="No way to test this feature yet") def test_mark_incomplete_on_complete_task(client, completed_task): # Act response = client.patch("/tasks/1/mark_incomplete") @@ -62,7 +62,7 @@ def test_mark_incomplete_on_complete_task(client, completed_task): assert Task.query.get(1).completed_at == None -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_mark_complete_on_completed_task(client, completed_task): # Arrange """ @@ -99,7 +99,7 @@ def test_mark_complete_on_completed_task(client, completed_task): assert Task.query.get(1).completed_at -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_mark_incomplete_on_incomplete_task(client, one_task): # Act response = client.patch("/tasks/1/mark_incomplete") @@ -119,7 +119,7 @@ def test_mark_incomplete_on_incomplete_task(client, one_task): assert Task.query.get(1).completed_at == None -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_mark_complete_missing_task(client): # Act response = client.patch("/tasks/1/mark_complete") @@ -128,13 +128,12 @@ def test_mark_complete_missing_task(client): # Assert assert response.status_code == 404 - raise Exception("Complete test with assertion about response body") - # ***************************************************************** - # **Complete test with assertion about response body*************** - # ***************************************************************** + + assert response_body == {"message": "task 1 not found"} + -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_mark_incomplete_missing_task(client): # Act response = client.patch("/tasks/1/mark_incomplete") @@ -143,7 +142,8 @@ def test_mark_incomplete_missing_task(client): # Assert assert response.status_code == 404 - raise Exception("Complete test with assertion about response body") + # raise Exception("Complete test with assertion about response body") + assert response_body == {"message": "task 1 not found"} # ***************************************************************** # **Complete test with assertion about response body*************** # ***************************************************************** @@ -151,7 +151,7 @@ def test_mark_incomplete_missing_task(client): # Let's add this test for creating tasks, now that # the completion functionality has been implemented -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_create_task_with_valid_completed_at(client): # Act response = client.post("/tasks", json={ @@ -181,7 +181,7 @@ def test_create_task_with_valid_completed_at(client): # Let's add this test for updating tasks, now that # the completion functionality has been implemented -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_update_task_with_completed_at_date(client, completed_task): # Act response = client.put("/tasks/1", json={ diff --git a/tests/test_wave_05.py b/tests/test_wave_05.py index aee7c52a1..8ce9ac04a 100644 --- a/tests/test_wave_05.py +++ b/tests/test_wave_05.py @@ -1,7 +1,7 @@ import pytest -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_goals_no_saved_goals(client): # Act response = client.get("/goals") @@ -12,7 +12,7 @@ def test_get_goals_no_saved_goals(client): assert response_body == [] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_goals_one_saved_goal(client, one_goal): # Act response = client.get("/goals") @@ -29,7 +29,7 @@ def test_get_goals_one_saved_goal(client, one_goal): ] -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_goal(client, one_goal): # Act response = client.get("/goals/1") @@ -46,22 +46,24 @@ def test_get_goal(client, one_goal): } -@pytest.mark.skip(reason="test to be completed by student") +# @pytest.mark.skip(reason="test to be completed by student") def test_get_goal_not_found(client): - pass + # Act response = client.get("/goals/1") response_body = response.get_json() - raise Exception("Complete test") + # raise Exception("Complete test") # Assert # ---- Complete Test ---- # assertion 1 goes here + assert response.status_code == 404 + assert response_body == {"message": "goal 1 not found"} # assertion 2 goes here # ---- Complete Test ---- -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_create_goal(client): # Act response = client.post("/goals", json={ @@ -80,34 +82,35 @@ def test_create_goal(client): } -@pytest.mark.skip(reason="test to be completed by student") +# @pytest.mark.skip(reason="test to be completed by student") def test_update_goal(client, one_goal): - raise Exception("Complete test") - # Act - # ---- Complete Act Here ---- + response = client.put("/goals/1", json={ + "title": "Updated Goal Title", + "description": "Updated Goal Description", + }) + response_body = response.get_json() # Assert - # ---- Complete Assertions Here ---- - # assertion 1 goes here - # assertion 2 goes here - # assertion 3 goes here - # ---- Complete Assertions Here ---- + assert response.status_code == 200 + assert response_body == "goal #1 successfully updated" -@pytest.mark.skip(reason="test to be completed by student") +# @pytest.mark.skip(reason="test to be completed by student") def test_update_goal_not_found(client): - raise Exception("Complete test") - # Act - # ---- Complete Act Here ---- + response = client.put("/goals/1", json={ + "title": "Updated Goal Title", + "description": "Updated Test Description" + }) + response_body = response.get_json() # Assert - # ---- Complete Assertions Here ---- - # assertion 1 goes here - # assertion 2 goes here - # ---- Complete Assertions Here ---- + assert response.status_code == 404 + assert "message" in response_body + assert response_body == {"message":"goal 1 not found"} + -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_delete_goal(client, one_goal): # Act response = client.delete("/goals/1") @@ -120,31 +123,29 @@ def test_delete_goal(client, one_goal): "details": 'Goal 1 "Build a habit of going outside daily" successfully deleted' } - # Check that the goal was deleted - response = client.get("/goals/1") - assert response.status_code == 404 + # # Check that the goal was deleted + # response = client.get("/goals/1") + # assert response.status_code == 404 - raise Exception("Complete test with assertion about response body") - # ***************************************************************** - # **Complete test with assertion about response body*************** - # ***************************************************************** -@pytest.mark.skip(reason="test to be completed by student") +# @pytest.mark.skip(reason="test to be completed by student") def test_delete_goal_not_found(client): - raise Exception("Complete test") - - # Act - # ---- Complete Act Here ---- + # Act + response = client.delete("/goals/1") + response_body = response.get_json() + # raise Exception("Complete test") # Assert - # ---- Complete Assertions Here ---- + # ---- Complete Test ---- # assertion 1 goes here - # assertion 2 goes here - # ---- Complete Assertions Here ---- + assert response.status_code == 404 + assert response_body == {"message": "goal 1 not found"} + + -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_create_goal_missing_title(client): # Act response = client.post("/goals", json={}) diff --git a/tests/test_wave_06.py b/tests/test_wave_06.py index 8afa4325e..85c22591f 100644 --- a/tests/test_wave_06.py +++ b/tests/test_wave_06.py @@ -2,7 +2,7 @@ import pytest -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_post_task_ids_to_goal(client, one_goal, three_tasks): # Act response = client.post("/goals/1/tasks", json={ @@ -23,7 +23,7 @@ def test_post_task_ids_to_goal(client, one_goal, three_tasks): assert len(Goal.query.get(1).tasks) == 3 -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_post_task_ids_to_goal_already_with_goals(client, one_task_belongs_to_one_goal, three_tasks): # Act response = client.post("/goals/1/tasks", json={ @@ -42,22 +42,21 @@ def test_post_task_ids_to_goal_already_with_goals(client, one_task_belongs_to_on assert len(Goal.query.get(1).tasks) == 2 -@pytest.mark.skip(reason="No way to test this feature yet") +# @pyt/est.mark.skip(reason="No way to test this feature yet") def test_get_tasks_for_specific_goal_no_goal(client): # Act response = client.get("/goals/1/tasks") response_body = response.get_json() - # Assert +# # Assert assert response.status_code == 404 + assert "message" in response_body + assert response_body == {"message": "goal 1 not found"} + - raise Exception("Complete test with assertion about response body") - # ***************************************************************** - # **Complete test with assertion about response body*************** - # ***************************************************************** -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_tasks_for_specific_goal_no_tasks(client, one_goal): # Act response = client.get("/goals/1/tasks") @@ -74,7 +73,7 @@ def test_get_tasks_for_specific_goal_no_tasks(client, one_goal): } -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_tasks_for_specific_goal(client, one_task_belongs_to_one_goal): # Act response = client.get("/goals/1/tasks") @@ -99,7 +98,7 @@ def test_get_tasks_for_specific_goal(client, one_task_belongs_to_one_goal): } -@pytest.mark.skip(reason="No way to test this feature yet") +# @pytest.mark.skip(reason="No way to test this feature yet") def test_get_task_includes_goal_id(client, one_task_belongs_to_one_goal): response = client.get("/tasks/1") response_body = response.get_json() From d5a4472c70d60cf23585154bcde2f1618d7762e5 Mon Sep 17 00:00:00 2001 From: Bahareh Date: Thu, 12 May 2022 22:39:31 -0400 Subject: [PATCH 4/5] Cleaner code --- app/routes.py | 130 ++++++++++++++++++++++---------------------------- 1 file changed, 56 insertions(+), 74 deletions(-) diff --git a/app/routes.py b/app/routes.py index fcbecba64..6627b8cbf 100644 --- a/app/routes.py +++ b/app/routes.py @@ -11,17 +11,24 @@ task_list_bp = Blueprint("task_list", __name__,url_prefix="/tasks") goal_list_bp = Blueprint("goal_list", __name__,url_prefix="/goals") -# @task_list_bp.route("", methods=["GET"]) -# def get_all_tasks(): - -# tasks = Task.query.all() - -# task_response = [] -# for task in tasks: -# task_response.append(task.to_json()) -# return jsonify(task_response),200 +def validate_task(task_id): + try: + task_id = int(task_id) + except: + abort(make_response({"message":f"task {task_id} invalid"}, 400)) + + task = Task.query.get(task_id) + if not task: + abort(make_response({"message":f"task {task_id} not found"}, 404)) + + return task + + + + +#Get tasks sorted or get all tasks @task_list_bp.route("", methods=["GET"]) def get_tasks_sorted(): @@ -42,9 +49,13 @@ def get_tasks_sorted(): task_response.append(task.to_json()) return make_response( jsonify(task_response),200) + + + +#Get one task @task_list_bp.route("/", methods=["GET"]) def get_one_task(task_id): - # task = validate_task(task_id) + task = Task.query.get(task_id) if task: @@ -54,6 +65,9 @@ def get_one_task(task_id): else: return make_response(jsonify(None), 404) + + +#Create one task @task_list_bp.route("", methods=["POST"]) def create_new_task(): @@ -75,24 +89,7 @@ def create_new_task(): - - -def validate_task(task_id): - try: - task_id = int(task_id) - except: - #************************* *** - abort(make_response({"message":f"task {task_id} invalid"}, 400)) - - task = Task.query.get(task_id) - - if not task: - abort(make_response({"message":f"task {task_id} not found"}, 404)) - - return task -#?????????? - - +#Update one task @task_list_bp.route("/", methods=["PUT"]) def update_task(task_id): task = validate_task(task_id) @@ -104,10 +101,10 @@ def update_task(task_id): db.session.commit() - # return make_response(f"task #{task.task_id} successfully updated") return jsonify({"task":task.to_json()}),200 +#Delete one task @task_list_bp.route("/", methods=["DELETE"]) def delete_task(task_id): task = validate_task(task_id) @@ -119,24 +116,17 @@ def delete_task(task_id): + +#Mark complete for one task and use Slack API @task_list_bp.route('//mark_complete', methods=['PATCH']) def mark_complete(task_id): task=Task.query.get(task_id) if not task: - #abort be dARD MIKHORE? abort(make_response({"message":f"task {task_id} not found"}, 404)) task.completed_at = now() db.session.add(task) db.session.commit() - - # task_response={"task":{ - # "id": task.task_id, - # "title": task.title, - # "description": task.description, "is_complete": True - # }} - # #JAYE 200 VA SHEKLE J DOROSTE? - # return jsonify(task_response),200 slack_api_url = "https://slack.com/api/chat.postMessage" params = { @@ -151,33 +141,42 @@ def mark_complete(task_id): return make_response(jsonify({"task" : task.to_json()})) - +#Mark incomplete for one task @task_list_bp.route('//mark_incomplete', methods=['PATCH']) def mark_incomplete(task_id): task=Task.query.get(task_id) if not task: - #abort be dARD MIKHORE? abort(make_response({"message":f"task {task_id} not found"}, 404)) task.completed_at = None db.session.add(task) db.session.commit() - - - - task_response={"task":{ "id": task.task_id, "title": task.title, "description": task.description, "is_complete": False }} - #JAYE 200 VA SHEKLE J DOROSTE? return jsonify(task_response),200 +#*******************************Goal_routes******************************************* +def validate_goal(goal_id): + try: + goal_id = int(goal_id) + except: + abort(make_response({"message":f"goal {goal_id} invalid"}, 400)) + goal = Goal.query.get(goal_id) + + if not goal: + abort(make_response({"message":f"goal {goal_id} not found"}, 404)) + + return goal + + +#Create one goal @goal_list_bp.route("", methods=["post"]) def create_new_goal(): - #************************ + request_body = request.get_json() if "title" not in request_body: return { @@ -194,21 +193,7 @@ def create_new_goal(): - -def validate_goal(goal_id): - try: - goal_id = int(goal_id) - except: - #************************* *** - abort(make_response({"message":f"goal {goal_id} invalid"}, 400)) - - goal = Goal.query.get(goal_id) - - if not goal: - abort(make_response({"message":f"goal {goal_id} not found"}, 404)) - - return goal - +#Get one goal @goal_list_bp.route("/", methods=["GET"]) def get_one_goal(goal_id): goal = validate_goal(goal_id) @@ -218,6 +203,8 @@ def get_one_goal(goal_id): "title": goal.title, }} + +#Get all goals @goal_list_bp.route("", methods=["GET"]) def get_all_goal(): goals = Goal.query.all() @@ -229,10 +216,10 @@ def get_all_goal(): "title": goal.title, }) - #jsonify bardar bebi chi mishe va bebing mishe refactor kard return jsonify(goal_response),200 +#Update one goal @goal_list_bp.route("/", methods=["PUT"]) def update_goal(goal_id): goal = validate_goal(goal_id) @@ -247,6 +234,8 @@ def update_goal(goal_id): return make_response(jsonify(f"goal #{goal.goal_id} successfully updated")),200 + +#Delete one goal @goal_list_bp.route("/", methods=["DELETE"]) def delete_goal(goal_id): goal = validate_goal(goal_id) @@ -257,10 +246,12 @@ def delete_goal(goal_id): return {"details":f"Goal {goal.goal_id} \"{goal.title}\" successfully deleted"} +#********************************Nested routes************************************ + +#Show tasks for a goal @goal_list_bp.route("//tasks", methods=["GET"]) def show_tasks_for_a_goal(goal_id): goal = validate_goal(goal_id) - #**** tasks = Task.query.filter_by(goal=goal) task_list = [] @@ -273,16 +264,7 @@ def show_tasks_for_a_goal(goal_id): }), 200) - - - # response = {"id" : goal.goal_id, "title": goal.title, "tasks":[] - # } - # #??????????????????/ - # for task in goal.tasks: - # response["tasks"].append(task.to_jsonn()) - - # return response,200 - +#Post tasks to a goal @goal_list_bp.route("//tasks", methods=["POST"]) def posts_tasks_to_a_goal(goal_id): goal = validate_goal(goal_id) @@ -292,7 +274,7 @@ def posts_tasks_to_a_goal(goal_id): request_body = request.get_json() for task_id in request_body["task_ids"]: task = Task.query.get(task_id) - #****** + task.goal_id=goal.goal_id if not task: abort(make_response({"message":f"task {task_id} invalid"}, 400)) From 372f406256e952c76db6816e3fdf967f6bae5afc Mon Sep 17 00:00:00 2001 From: Bahareh Date: Thu, 12 May 2022 22:44:23 -0400 Subject: [PATCH 5/5] cleaned task.py --- app/models/task.py | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/app/models/task.py b/app/models/task.py index ccd8d4d6d..eb2dae49d 100644 --- a/app/models/task.py +++ b/app/models/task.py @@ -1,10 +1,6 @@ from app import db -# name - The name of the task -# description - A text description of the task -# completed_at - The date, saved as text, in which the task was completed. - class Task(db.Model): task_id = db.Column(db.Integer, primary_key=True, autoincrement=True, nullable=False) @@ -13,9 +9,9 @@ class Task(db.Model): completed_at = db.Column(db.DateTime,default=None,nullable=True) goals = db.relationship("Goal") goal_id = db.Column(db.Integer, db.ForeignKey('goal.goal_id'), nullable=True) - # is_complete=db.Column(db.String,default=False) + + - #why to json def to_json(self): if self.completed_at: is_completed=True @@ -43,15 +39,4 @@ def to_json_without_des(self): "is_complete": is_completed, } - def to_jsonn(self): - if self.completed_at: - is_completed=True - else: - is_completed=False - return { - "goal_id":self.goal_id, - "id": self.task_id, - "title": self.title, - "description": self.description, - "is_complete": is_completed, - } \ No newline at end of file + \ No newline at end of file