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

Big changes man #15

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
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: 0 additions & 1 deletion .flaskenv

This file was deleted.

12 changes: 6 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
FROM node:12 AS build-stage

WORKDIR /react-app
COPY react-app/. .
WORKDIR /frontend
COPY frontend/. .

# You have to set this because it should be set during build time.
ENV REACT_APP_BASE_URL=https://persistamp.herokuapp.com
Expand All @@ -13,19 +13,19 @@ RUN npm run build
FROM python:3.8

# Setup Flask environment
ENV FLASK_APP=app
ENV FLASK_APP=__init__
ENV FLASK_ENV=production
ENV SQLALCHEMY_ECHO=True

EXPOSE 8000

WORKDIR /var/www
COPY . .
COPY --from=build-stage /react-app/build/* app/static/
COPY --from=build-stage /frontend/build/* backend/static/

# Install Python Dependencies
RUN pip install -r requirements.txt
RUN pip install -r backend/requirements.txt
RUN pip install psycopg2

# Run flask environment
CMD gunicorn app:app
CMD gunicorn backend:app
18 changes: 18 additions & 0 deletions MIRA-NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@


# TODO
* Complete drag-n-drop for activities and rewards
* 'All receipts' history

* Make edit/add habit buttons faintly visible
* Make activities wide enough to fill space
* Move Activity details into body on stats page
* Fix navigation issues

* Clean up Splash

* Push to Heroku



root directory, `python3 -m backend.seeder.py`
28 changes: 0 additions & 28 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,8 @@ verify_ssl = true
name = "pypi"

[packages]
click = "==7.1.2"
gunicorn = "==20.0.4"
itsdangerous = "==1.1.0"
python-dotenv = "==0.14.0"
six = "==1.15.0"
Flask = "==1.1.2"
Flask-Cors = "==3.0.8"
Flask-SQLAlchemy = "==2.4.4"
Flask-WTF = "==0.14.3"
Jinja2 = "==2.11.2"
MarkupSafe = "==1.1.1"
SQLAlchemy = "==1.3.19"
Werkzeug = "==1.0.1"
WTForms = "==2.3.3"
Flask-JWT-Extended = "==3.24.1"
email-validator = "*"
Flask-Migrate = "==2.5.3"
Flask-Login = "*"
alembic = "==1.4.3"
python-dateutil = "==2.8.1"
python-editor = "==1.0.4"
Mako = "==1.1.3"
PyJWT = "==1.7.1"
marshmallow-sqlalchemy = "*"
psycopg2-binary = "*"

[dev-packages]
psycopg2-binary = "==2.8.6"
autopep8 = "*"
pylint = "*"

[requires]
python_version = "3.8"
File renamed without changes.
39 changes: 39 additions & 0 deletions backend/Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
click = "==7.1.2"
gunicorn = "==20.0.4"
itsdangerous = "==1.1.0"
python-dotenv = "==0.14.0"
six = "==1.15.0"
Flask = "==1.1.2"
Flask-Cors = "==3.0.8"
Flask-SQLAlchemy = "==2.4.4"
Flask-WTF = "==0.14.3"
Jinja2 = "==2.11.2"
MarkupSafe = "==1.1.1"
SQLAlchemy = "==1.3.19"
Werkzeug = "==1.0.1"
WTForms = "==2.3.3"
Flask-JWT-Extended = "==3.24.1"
email-validator = "*"
Flask-Migrate = "==2.5.3"
Flask-Login = "*"
alembic = "==1.4.3"
python-dateutil = "==2.8.1"
python-editor = "==1.0.4"
Mako = "==1.1.3"
PyJWT = "==1.7.1"
marshmallow-sqlalchemy = "*"
psycopg2-binary = "*"

[dev-packages]
psycopg2-binary = "==2.8.6"
autopep8 = "*"
pylint = "*"

[requires]
python_version = "3.8"
File renamed without changes.
2 changes: 0 additions & 2 deletions app/__init__.py → backend/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ def load_user(id):

@app.before_request
def redirect_https():
# print("REQUEST", request.url)
if os.environ.get("FLASK_ENV") == "production":
if request.headers.get('X-Forwarded-Proto') == 'http':
url = request.url.replace('http://', 'https://', 1)
Expand All @@ -90,7 +89,6 @@ def inject_csrf_token(response):
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def react_root(path):
print("path:", path)
if path == 'favicon.ico':
return app.send_static_file('favicon.ico')
return app.send_static_file('index.html')
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

from flask import Blueprint, jsonify, request
from sqlalchemy.orm import joinedload
from app.models import db, Activity, Stamp
from app.schemas import activity_schema, stamp_schema
from app.utils import validation_errors_to_error_messages
from backend.models import db, Activity, Stamp
from backend.schemas import activity_schema, stamp_schema
from backend.utils import validation_errors_to_error_messages
from flask_login import current_user
from datetime import date, timedelta, datetime
import calendar
Expand All @@ -13,11 +13,9 @@

@activity_detail_routes.route("<int:aid>/memberships/<int:mid>/graph/<string:interval>")
def getWeeklyGraph(aid, interval, mid):
# uid = current_user.id
activityObj = Activity.query.filter(Activity.id == aid).one()
activity = activity_schema.dump(activityObj)
current_date = date.today()
# print("CURRENT_DATE =-----------------------------------------------", current_date)

if interval == "Monthly":
currentStrDate = current_date.strftime("%Y-%m-%d")
Expand All @@ -44,7 +42,6 @@ def getWeeklyGraph(aid, interval, mid):
if stampMonthNum == monthNum:
monthAxisLabels[month] += 1
continue
# print("MONTH AXIS LABELS", monthAxisLabels)
data = []
for month, stampCount in monthAxisLabels.items():
data.append({ "dates": month, "stamps": stampCount })
Expand All @@ -57,7 +54,6 @@ def getWeeklyGraph(aid, interval, mid):
data.append(lastMonth)
break

# print("MONTH DATA ------------", data)
ticks = [0,5,10,15,20,25,30,35]
yDomain = [0,35]
jsonData = jsonify(data=data, activity=activity, ticks=ticks, yDomain=yDomain)
Expand Down Expand Up @@ -95,7 +91,6 @@ def getWeeklyGraph(aid, interval, mid):
count = 0
for day in range(7):
checkDay = isStamped.pop(0)
# print("CHECK DAY: ---------------------------", checkDay)
if checkDay == True:
count += 1
obj = {"dates": newAxisLabels.pop(-1), "stamps": count }
Expand All @@ -114,7 +109,6 @@ def getCalendarData(aid, mid):
endDate = current_date.strftime("%Y-%m-%d")

splitDate = endDate.split("-")
# firstDayStr = f'{splitDate[0]}-{splitDate[1]}-01'
firstDayOfMonth = date(int(splitDate[0]), int(splitDate[1]), 1)

startDate = None
Expand All @@ -125,7 +119,6 @@ def getCalendarData(aid, mid):
startDate = start.strftime("%Y-%m-%d")
startObj = start
break
# print("GETTING SUNDAY============================", startDate)
stampDates = []
values = []
stamps = Stamp.query.filter(Stamp.activity_id == aid, \
Expand All @@ -146,13 +139,10 @@ def getCalendarData(aid, mid):
yArrIndex = 0

while startObj <= current_date:
print("\nday", startObj.strftime("%d"))
if startObj.strftime("%Y-%m-%d") in stampDates:
yArr[yArrIndex].append({"val": 100, "day": startObj.strftime("%d")})
# dateVals[yArrIndex].append(startObj.strftime("%d").lstrip("0").replace(" 0", " "))
else:
yArr[yArrIndex].append({"val": 99, "day": startObj.strftime("%d")})
# dateVals[yArrIndex].append(startObj.strftime("%d").lstrip("0").replace(" 0", " "))

if len(yArr[yArrIndex]) == 7:
yArr.append([])
Expand All @@ -171,12 +161,7 @@ def getCalendarData(aid, mid):
yLabels.pop(-1)
if int(date.today().strftime("%d").lstrip("0").replace(" 0", " ")) < 8:
yLabels.append(date.today().strftime("%b"))
# else:
# yLabels.append(date.today().strftime("%d").lstrip("0").replace(" 0", " "))

# print("XLABELS SWITCH", xLabels)
# print("YLABELS SWITCH", yLabels)
# print("Data--------------------------", yArr)
jsonData = jsonify(values=values, startDate=startDate, endDate=endDate,
xLabels=xLabels,
yLabels=yLabels,
Expand Down Expand Up @@ -222,7 +207,6 @@ def dumpStamps(stamp):
checkDate += timedelta(days=1)
longestStreak = max(streakArr)
currentStreak = streakArr[-1]
# print("LONGEST STREAK _____________", longestStreak)
total = len(stampObjs)

scoreFraction = f'{total} / {attempts}'
Expand All @@ -245,7 +229,6 @@ def dumpStamps(stamp):
lastTwo = len(twoMonthObjs)
monthPercentage = '{:.1%}'.format((lastMonth - lastTwo) / 31)

# print("MONTH PERCENTAGE", monthPercentage, monthTrend)
jsonData = jsonify(total=total,
score=score,
scoreFraction=scoreFraction,
Expand Down
11 changes: 3 additions & 8 deletions app/api/activity_routes.py → backend/api/activity_routes.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
from flask import Blueprint, redirect, jsonify, request
from sqlalchemy.orm import joinedload
from app.models import db, User, Program, Activity, Membership
from app.schemas import user_schema, program_schema, activity_schema, membership_schema, stamp_schema, color_schema, stamp_schema
from app.utils import dump_data_list, validation_errors_to_error_messages
from app.forms import ActivityForm
from backend.models import db, User, Program, Activity, Membership
from backend.utils import dump_data_list, validation_errors_to_error_messages
from backend.forms import ActivityForm
from flask_login import current_user


Expand All @@ -25,10 +24,6 @@ def activity_details(aid, mid):
"""Get a activity's details for a user, including recent history."""
activity = Activity.query.get(aid)
member = Membership.query.get(mid).member
# program = program_schema.dump(Program.query.get(activity.to_dict()["pid"]))
# activityWProgram = activity.to_dict()
# activityWProgram["program"] = program
# return activityWProgram
if activity:
return activity.to_dict_for_user_details(member)
return {'errors': ['User not found'] }, 404
Expand Down
9 changes: 4 additions & 5 deletions app/api/auth_routes.py → backend/api/auth_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@
from sqlalchemy.orm import joinedload
from flask_login import current_user, login_user, logout_user, login_required
from http import cookies
from app.models import db, User, Program, Activity, Membership
from app.forms import LoginForm, SignUpForm
from app.schemas import user_schema, membership_schema
from app.utils import dump_data_list, queryUserFullData, validation_errors_to_error_messages
from backend.models import db, User, Program, Activity, Membership
from backend.forms import LoginForm, SignUpForm
from backend.utils import dump_data_list, queryUserFullData, validation_errors_to_error_messages
from pprint import pprint

auth_routes = Blueprint('auth', __name__)
Expand Down Expand Up @@ -88,7 +87,7 @@ def sign_up():
login_user(user)

# Set cookie
# res = make_response(jsonify(user_schema.dump(user)))
# res = make_response(jsonify({key: "value"}))
# res.set_cookie("uid_cookie", str(user.id))

return user.to_dict()
Expand Down
30 changes: 3 additions & 27 deletions app/api/membership_routes.py → backend/api/membership_routes.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from flask import Blueprint, redirect, jsonify, request
from sqlalchemy.orm import joinedload
from app.models import db, Membership, Program, User, Activity, Color
from app.schemas import membership_schema, program_schema, user_schema, activity_schema, stamp_schema, color_schema
from app.utils import dump_data_list
from backend.models import db, Membership, Program, User, Activity, Color
from backend.schemas import membership_schema
from backend.utils import dump_data_list

membership_routes = Blueprint("memberships", __name__, url_prefix="/memberships")

Expand Down Expand Up @@ -47,27 +47,3 @@ def membership_activity(mid, aid):
"""Get the full details and history of a activity for a member."""
activity = Activity.query.get(aid)
return activity.to_dict()


# @membership_routes.route("/<int:mid>/stamper")
# def membership_stamper(mid):
# """Get the stamper for a member in a program."""
# # stamper = User.query.filter().one()
# return stamper.


# @membership_routes.route("/<int:mid>/stamper/<int:uid>", methods=["PATCH"])
# def change_stamper(mid, uid):
# """Change a member's stamper."""
# membership = Membership.query.filter(Membership.id == mid).one()
# membership.stamper_id = uid
# db.session.commit()
# return jsonify(membership_schema.dump(membership))


# @membership_routes.route("/<int:mid>/stamper")
# def remove_stamper():
# """Unassign a stamper from a member."""
# membership = Membership.query.filter(Membership.id == mid).one()
# membership.stamper_id = membership.member_id
# return jsonify(membership_schema.dump(membership))
15 changes: 6 additions & 9 deletions app/api/program_routes.py → backend/api/program_routes.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from flask import Blueprint, render_template, redirect, jsonify, request
from sqlalchemy.orm import joinedload
from flask_login import current_user
from app.models import db, Program, User, Membership
from app.schemas import program_schema, user_schema, color_schema, icon_schema
from app.forms import ProgramForm
from app.utils import queryUserFullData, validation_errors_to_error_messages
from backend.models import db, Program, User, Membership
from backend.schemas import program_schema, user_schema, color_schema, icon_schema
from backend.forms import ProgramForm
from backend.utils import queryUserFullData, validation_errors_to_error_messages
from pprint import pprint

program_routes = Blueprint("programs", __name__, url_prefix="/programs")
Expand All @@ -30,8 +30,9 @@ def create_program():
title=form.data["title"],
description=form.data['description'],
color_id=form.data['cid'],
icon_id=form.data["iid"],
icon_id=form.data['iid'],
creator_id=request.json['userId'],
has_shop=form.data['hasShop'],
)
db.session.add(program)
db.session.commit()
Expand All @@ -42,9 +43,6 @@ def create_program():
db.session.add(membership)
db.session.commit()

# programs_data, activities_data, stamps_data, user_data, past_week = queryUserFullData(current_user.id)
print("\nprogram...")
pprint(program)
return program.to_dict_for_user(current_user.id)
return {'errors': validation_errors_to_error_messages(form.errors)}, 400

Expand All @@ -55,7 +53,6 @@ def edit_program(pid):
"""Edit a program's details."""
form = ProgramForm()
form['csrf_token'].data = request.cookies['csrf_token']
print("\n\nEDIT PROGRAM ROUTE", form.data)

if form.validate():
program = Program.query.options(joinedload(Program.color), joinedload(Program.icon), joinedload(Program.creator)).get(pid)
Expand Down
Loading