mirror of
https://github.com/sartography/star-drive-dist.git
synced 2025-02-22 13:08:06 +00:00
Release 1.13
This commit is contained in:
parent
b84a977e2c
commit
c58e504cfe
@ -16,7 +16,16 @@ sudo apt-get install python3 python3-dev
|
|||||||
sudo apt-get install -y libssl-dev libffi-dev
|
sudo apt-get install -y libssl-dev libffi-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
#### PostgreSQL
|
#### Using Docker
|
||||||
|
You can use Docker to run the two primary dependencies for this project: Postgres, and ElasticSearch
|
||||||
|
|
||||||
|
1. create a directory at ~/docker/volumes/stardrive
|
||||||
|
2. chmod 777 ~/docker/volumes/stardrive/elasticsearch
|
||||||
|
3. spin it all up, with docker-compose up
|
||||||
|
* Optionally set up a run configuration in PyCharm
|
||||||
|
|
||||||
|
#### Not Using Docker
|
||||||
|
###### PostgreSQL
|
||||||
* MacOS:
|
* MacOS:
|
||||||
[Download and install Postgres.app](https://postgresapp.com). This will install `postgres`, along with the command-line tools, including `psql`, `pg_ctl`, and others. Then update your `PATH` variable to look in the Postgres.app `bin` directory for the relevant Postgres CLI tools.
|
[Download and install Postgres.app](https://postgresapp.com). This will install `postgres`, along with the command-line tools, including `psql`, `pg_ctl`, and others. Then update your `PATH` variable to look in the Postgres.app `bin` directory for the relevant Postgres CLI tools.
|
||||||
```BASH
|
```BASH
|
||||||
@ -27,28 +36,8 @@ export PATH="/Applications/Postgres.app/Contents/Versions/latest/bin:$PATH"
|
|||||||
```BASH
|
```BASH
|
||||||
apt-get install postgresql postgresql-client libpq-dev
|
apt-get install postgresql postgresql-client libpq-dev
|
||||||
```
|
```
|
||||||
|
###### Database Setup
|
||||||
#### ElasticSearch
|
*NOTE:* Docker will do this automatically, only necissary if you are doing it locally.
|
||||||
We are currently using version 6, and should look at upgrading this in the future when my hair isn't on fire.
|
|
||||||
|
|
||||||
* Debian/Ubuntu: https://medium.com/@pierangelo1982/how-to-install-elasticsearch-6-on-ubuntu-64316dc2de1c
|
|
||||||
|
|
||||||
#### Angular
|
|
||||||
```BASH
|
|
||||||
npm install -g @angular/cli
|
|
||||||
```
|
|
||||||
|
|
||||||
### Project Setup
|
|
||||||
* Please use Python 3's virtual environment setup, and install the dependencies in requirements.txt
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python3 -m venv python-env
|
|
||||||
source python-env/bin/activate
|
|
||||||
pip3 install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
## Database Setup
|
|
||||||
### Create a Database
|
|
||||||
*NOTE:* The configuration is currently set up to use "ed_pass" as a password. You will be promoted to enter a password when you connect.
|
*NOTE:* The configuration is currently set up to use "ed_pass" as a password. You will be promoted to enter a password when you connect.
|
||||||
* MacOS:
|
* MacOS:
|
||||||
```BASH
|
```BASH
|
||||||
@ -68,6 +57,34 @@ exit
|
|||||||
```
|
```
|
||||||
If you are using Ubuntu you will likely need to [enable PSQL](https://help.ubuntu.com/community/PostgreSQL#Managing_users_and_rights) to manage its own users.
|
If you are using Ubuntu you will likely need to [enable PSQL](https://help.ubuntu.com/community/PostgreSQL#Managing_users_and_rights) to manage its own users.
|
||||||
|
|
||||||
|
|
||||||
|
###### ElasticSearch
|
||||||
|
We are currently using version 6, and should look at upgrading this in the future when my hair isn't on fire.
|
||||||
|
|
||||||
|
* Debian/Ubuntu: https://medium.com/@pierangelo1982/how-to-install-elasticsearch-6-on-ubuntu-64316dc2de1c
|
||||||
|
|
||||||
|
|
||||||
|
#### Angular
|
||||||
|
You will need the angular command line utilities to run the front end.
|
||||||
|
```BASH
|
||||||
|
npm install -g @angular/cli
|
||||||
|
```
|
||||||
|
|
||||||
|
### Project Setup
|
||||||
|
* Please use Python 3's virtual environment setup, and install the dependencies in requirements.txt
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
python3 -m venv python-env
|
||||||
|
source python-env/bin/activate
|
||||||
|
pip3 install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Add a config file
|
||||||
|
In the `backend` directory, execute the following command:
|
||||||
|
```BASH
|
||||||
|
mkdir instance && cp -r config instance/config && cp instance/config/default.py instance/config.py
|
||||||
|
```
|
||||||
|
|
||||||
### Update the Database
|
### Update the Database
|
||||||
You will need to update your database each time you return to do a pull to make sure all the migrations are run. In the `backend` directory, execute the following command:
|
You will need to update your database each time you return to do a pull to make sure all the migrations are run. In the `backend` directory, execute the following command:
|
||||||
```BASH
|
```BASH
|
||||||
@ -95,41 +112,9 @@ This will pull in initial values into the database.
|
|||||||
flask initdb
|
flask initdb
|
||||||
```
|
```
|
||||||
|
|
||||||
## Add a config file
|
|
||||||
In the `backend` directory, execute the following command:
|
|
||||||
```BASH
|
|
||||||
mkdir instance && cp -r config instance/config && cp instance/config/default.py instance/config.py
|
|
||||||
```
|
|
||||||
|
|
||||||
## Run the app
|
## Run the app
|
||||||
Execute the following at the top level of the repository to start PostgreSQL, flask, and Angular all in one command:
|
* Strongly suggest you set up run configurations for this in PyCharm and WebStorm
|
||||||
```BASH
|
|
||||||
./start.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Or you can run these 3 commands separately:
|
|
||||||
|
|
||||||
Database:
|
|
||||||
```BASH
|
|
||||||
./start-db.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Backend:
|
|
||||||
```BASH
|
|
||||||
./start-backend.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Frontend:
|
|
||||||
```BASH
|
|
||||||
./start-frontend.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, you could start each of the services individually, using the commands below.
|
|
||||||
|
|
||||||
### Start PostgreSQL
|
|
||||||
```BASH
|
|
||||||
pg_ctl -D /usr/local/var/postgres start
|
|
||||||
```
|
|
||||||
|
|
||||||
### Start the backend app
|
### Start the backend app
|
||||||
In the `backend` directory, execute the following command:
|
In the `backend` directory, execute the following command:
|
||||||
@ -144,12 +129,6 @@ npm install
|
|||||||
ng serve
|
ng serve
|
||||||
```
|
```
|
||||||
|
|
||||||
### Stopping the app
|
|
||||||
Execute the following at the top level of the repository to stop all running services:
|
|
||||||
```BASH
|
|
||||||
./stop.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### Setting up Mailtrap
|
### Setting up Mailtrap
|
||||||
To test email integration set up an account with [Mailtrap](https://mailtrap.io/)
|
To test email integration set up an account with [Mailtrap](https://mailtrap.io/)
|
||||||
In your instance config, set your sname and password.
|
In your instance config, set your sname and password.
|
||||||
|
@ -40,6 +40,10 @@ if "MIRRORING" in os.environ and os.environ["MIRRORING"] == "true":
|
|||||||
# Database Configuration
|
# Database Configuration
|
||||||
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
||||||
db = SQLAlchemy(app)
|
db = SQLAlchemy(app)
|
||||||
|
""":type: sqlalchemy.orm.SQLAlchemy"""
|
||||||
|
|
||||||
|
session = db.session
|
||||||
|
""":type: sqlalchemy.orm.Session"""
|
||||||
|
|
||||||
# Enable CORS
|
# Enable CORS
|
||||||
if app.config["CORS_ENABLED"]:
|
if app.config["CORS_ENABLED"]:
|
||||||
@ -49,6 +53,7 @@ if app.config["CORS_ENABLED"]:
|
|||||||
|
|
||||||
# Flask-Marshmallow provides HATEOAS links
|
# Flask-Marshmallow provides HATEOAS links
|
||||||
ma = Marshmallow(app)
|
ma = Marshmallow(app)
|
||||||
|
""":type: flask_marshmallow.Marshmallow"""
|
||||||
|
|
||||||
# Database Migrations
|
# Database Migrations
|
||||||
migrate = Migrate(app, db, compare_type=True)
|
migrate = Migrate(app, db, compare_type=True)
|
||||||
@ -210,6 +215,24 @@ def loadstudies():
|
|||||||
data_loader.load_studies()
|
data_loader.load_studies()
|
||||||
|
|
||||||
|
|
||||||
|
@app.cli.command()
|
||||||
|
def loadusers():
|
||||||
|
"""Used for loading new users into the database"""
|
||||||
|
click.echo('Loading users, not clearing out existing ones')
|
||||||
|
from app import data_loader
|
||||||
|
data_loader = data_loader.DataLoader()
|
||||||
|
data_loader.load_users()
|
||||||
|
|
||||||
|
|
||||||
|
@app.cli.command()
|
||||||
|
def loadparticipants():
|
||||||
|
"""Used for loading new participants into the database"""
|
||||||
|
click.echo('Loading participants, not clearing out existing ones')
|
||||||
|
from app import data_loader
|
||||||
|
data_loader = data_loader.DataLoader()
|
||||||
|
data_loader.load_participants()
|
||||||
|
|
||||||
|
|
||||||
@app.cli.command()
|
@app.cli.command()
|
||||||
def run_full_export():
|
def run_full_export():
|
||||||
"""Remove all data and recreate it from the example data files"""
|
"""Remove all data and recreate it from the example data files"""
|
||||||
|
@ -3,9 +3,9 @@ from sqlalchemy import func
|
|||||||
from sqlalchemy.ext.declarative import declared_attr
|
from sqlalchemy.ext.declarative import declared_attr
|
||||||
|
|
||||||
from app import db, ma
|
from app import db, ma
|
||||||
|
from app.export_service import ExportService
|
||||||
from app.model.questionnaires.chain_session import ChainSessionSchema, ChainSession
|
from app.model.questionnaires.chain_session import ChainSessionSchema, ChainSession
|
||||||
from app.schema.model_schema import ModelSchema
|
from app.schema.model_schema import ModelSchema
|
||||||
from app.export_service import ExportService
|
|
||||||
|
|
||||||
|
|
||||||
class ChainQuestionnaire(db.Model):
|
class ChainQuestionnaire(db.Model):
|
||||||
@ -68,4 +68,5 @@ class ChainQuestionnaireSchema(ModelSchema):
|
|||||||
"time_on_task_ms",
|
"time_on_task_ms",
|
||||||
"sessions",
|
"sessions",
|
||||||
)
|
)
|
||||||
|
|
||||||
sessions = ma.Nested(ChainSessionSchema, many=True)
|
sessions = ma.Nested(ChainSessionSchema, many=True)
|
||||||
|
@ -28,9 +28,7 @@ class ChainSession(db.Model):
|
|||||||
db.ForeignKey('chain_questionnaire.id')
|
db.ForeignKey('chain_questionnaire.id')
|
||||||
)
|
)
|
||||||
|
|
||||||
@declared_attr
|
date = db.Column(
|
||||||
def date(cls):
|
|
||||||
return db.Column(
|
|
||||||
db.DateTime(timezone=True),
|
db.DateTime(timezone=True),
|
||||||
info={
|
info={
|
||||||
"display_order": 1,
|
"display_order": 1,
|
||||||
@ -42,9 +40,7 @@ class ChainSession(db.Model):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@declared_attr
|
completed = db.Column(
|
||||||
def completed(cls):
|
|
||||||
return db.Column(
|
|
||||||
db.Boolean,
|
db.Boolean,
|
||||||
info={
|
info={
|
||||||
"display_order": 2,
|
"display_order": 2,
|
||||||
@ -60,9 +56,7 @@ class ChainSession(db.Model):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@declared_attr
|
session_type = db.Column(
|
||||||
def session_type(cls):
|
|
||||||
return db.Column(
|
|
||||||
db.String,
|
db.String,
|
||||||
info={
|
info={
|
||||||
"display_order": 2,
|
"display_order": 2,
|
||||||
@ -79,11 +73,9 @@ class ChainSession(db.Model):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@declared_attr
|
step_attempts = db.relationship(
|
||||||
def step_attempts(cls):
|
|
||||||
return db.relationship(
|
|
||||||
"ChainSessionStep",
|
"ChainSessionStep",
|
||||||
backref=db.backref(cls.__tablename__, lazy=True),
|
backref='chain_session',
|
||||||
cascade="all, delete-orphan",
|
cascade="all, delete-orphan",
|
||||||
passive_deletes=True
|
passive_deletes=True
|
||||||
)
|
)
|
||||||
@ -104,6 +96,7 @@ class ChainSession(db.Model):
|
|||||||
}
|
}
|
||||||
return field_groups
|
return field_groups
|
||||||
|
|
||||||
|
|
||||||
class ChainSessionSchema(ModelSchema):
|
class ChainSessionSchema(ModelSchema):
|
||||||
@pre_load
|
@pre_load
|
||||||
def set_field_session(self, data, **kwargs):
|
def set_field_session(self, data, **kwargs):
|
||||||
@ -115,12 +108,28 @@ class ChainSessionSchema(ModelSchema):
|
|||||||
fields = (
|
fields = (
|
||||||
"id",
|
"id",
|
||||||
"last_updated",
|
"last_updated",
|
||||||
|
"participant_id",
|
||||||
|
"user_id",
|
||||||
"time_on_task_ms",
|
"time_on_task_ms",
|
||||||
"date",
|
"date",
|
||||||
"completed",
|
"completed",
|
||||||
"session_type",
|
"session_type",
|
||||||
|
"chain_questionnaire_id",
|
||||||
"step_attempts",
|
"step_attempts",
|
||||||
"chain_questionnaire_id"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
step_attempts = ma.Nested(ChainSessionStepSchema, many=True)
|
step_attempts = fields.Nested(ChainSessionStepSchema, many=True)
|
||||||
|
participant_id = fields.Method('get_participant_id', dump_only=True)
|
||||||
|
user_id = fields.Method('get_user_id', dump_only=True)
|
||||||
|
|
||||||
|
def get_participant_id(self, obj):
|
||||||
|
if obj is None:
|
||||||
|
return missing
|
||||||
|
|
||||||
|
return obj.chain_questionnaire.participant_id
|
||||||
|
|
||||||
|
def get_user_id(self, obj):
|
||||||
|
if obj is None:
|
||||||
|
return missing
|
||||||
|
|
||||||
|
return obj.chain_questionnaire.user_id
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
from marshmallow import missing, pre_load
|
from marshmallow import fields, missing
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from sqlalchemy.ext.declarative import declared_attr
|
from sqlalchemy.ext.declarative import declared_attr
|
||||||
|
|
||||||
from app import db, ma
|
from app import db
|
||||||
from app.schema.model_schema import ModelSchema
|
|
||||||
from app.export_service import ExportService
|
from app.export_service import ExportService
|
||||||
from app.model.chain_step import ChainStep
|
from app.model.chain_step import ChainStep
|
||||||
from app.model.questionnaires.challenging_behavior import ChallengingBehavior, ChallengingBehaviorSchema
|
from app.model.questionnaires.challenging_behavior import ChallengingBehavior, ChallengingBehaviorSchema
|
||||||
from app.schema.chain_step_schema import ChainStepSchema
|
from app.schema.chain_step_schema import ChainStepSchema
|
||||||
|
from app.schema.model_schema import ModelSchema
|
||||||
|
|
||||||
|
|
||||||
class ChainSessionStep(db.Model):
|
class ChainSessionStep(db.Model):
|
||||||
@ -37,7 +37,10 @@ class ChainSessionStep(db.Model):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return db.Column("chain_step_id", db.Integer, db.ForeignKey('chain_step.id'), info={
|
return db.Column(
|
||||||
|
"chain_step_id",
|
||||||
|
db.Integer,
|
||||||
|
db.ForeignKey('chain_step.id'), info={
|
||||||
"display_order": 1,
|
"display_order": 1,
|
||||||
"type": "select",
|
"type": "select",
|
||||||
"template_options": {
|
"template_options": {
|
||||||
@ -290,8 +293,10 @@ class ChainSessionStepSchema(ModelSchema):
|
|||||||
fields = (
|
fields = (
|
||||||
"id",
|
"id",
|
||||||
"last_updated",
|
"last_updated",
|
||||||
|
"participant_id",
|
||||||
|
"user_id",
|
||||||
|
"chain_session_id",
|
||||||
"chain_step_id",
|
"chain_step_id",
|
||||||
"chain_step",
|
|
||||||
"date",
|
"date",
|
||||||
"session_type",
|
"session_type",
|
||||||
"was_focus_step",
|
"was_focus_step",
|
||||||
@ -303,11 +308,14 @@ class ChainSessionStepSchema(ModelSchema):
|
|||||||
"had_challenging_behavior",
|
"had_challenging_behavior",
|
||||||
"reason_step_incomplete",
|
"reason_step_incomplete",
|
||||||
"challenging_behaviors",
|
"challenging_behaviors",
|
||||||
"chain_session_id"
|
"chain_step",
|
||||||
)
|
)
|
||||||
challenging_behaviors = ma.Nested(ChallengingBehaviorSchema, many=True)
|
|
||||||
chain_step = ma.Method('get_chain_step', dump_only=True)
|
participant_id = fields.Method('get_participant_id', dump_only=True)
|
||||||
session_type = ma.Method('get_session_type', dump_only=True)
|
user_id = fields.Method('get_user_id', dump_only=True)
|
||||||
|
challenging_behaviors = fields.Nested(ChallengingBehaviorSchema, many=True)
|
||||||
|
chain_step = fields.Method('get_chain_step', dump_only=True)
|
||||||
|
session_type = fields.Method('get_session_type', dump_only=True)
|
||||||
|
|
||||||
def get_chain_step(self, obj):
|
def get_chain_step(self, obj):
|
||||||
if obj is None:
|
if obj is None:
|
||||||
@ -320,5 +328,16 @@ class ChainSessionStepSchema(ModelSchema):
|
|||||||
if obj is None:
|
if obj is None:
|
||||||
return missing
|
return missing
|
||||||
|
|
||||||
if hasattr(obj, 'chain_session'):
|
|
||||||
return obj.chain_session.session_type
|
return obj.chain_session.session_type
|
||||||
|
|
||||||
|
def get_participant_id(self, obj):
|
||||||
|
if obj is None:
|
||||||
|
return missing
|
||||||
|
|
||||||
|
return obj.chain_session.chain_questionnaire.participant_id
|
||||||
|
|
||||||
|
def get_user_id(self, obj):
|
||||||
|
if obj is None:
|
||||||
|
return missing
|
||||||
|
|
||||||
|
return obj.chain_session.chain_questionnaire.user_id
|
||||||
|
@ -5,7 +5,7 @@ import datetime
|
|||||||
|
|
||||||
from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired
|
from itsdangerous import URLSafeTimedSerializer, BadSignature, SignatureExpired
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from app import app, RestException, db, auth, email_service
|
from app import app, RestException, db, auth, email_service, session
|
||||||
from app.model.email_log import EmailLog
|
from app.model.email_log import EmailLog
|
||||||
from app.model.user import User
|
from app.model.user import User
|
||||||
from flask import g, request, Blueprint, jsonify
|
from flask import g, request, Blueprint, jsonify
|
||||||
@ -24,7 +24,7 @@ def confirm_email(email_token):
|
|||||||
except:
|
except:
|
||||||
raise RestException(RestException.EMAIL_TOKEN_INVALID)
|
raise RestException(RestException.EMAIL_TOKEN_INVALID)
|
||||||
|
|
||||||
user = User.query.filter_by(email=email).first_or_404()
|
user = session.query(User).filter_by(email=email).first_or_404()
|
||||||
user.email_verified = True
|
user.email_verified = True
|
||||||
db.session.add(user)
|
db.session.add(user)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
@ -42,7 +42,7 @@ def login_password():
|
|||||||
raise RestException(RestException.INVALID_INPUT)
|
raise RestException(RestException.INVALID_INPUT)
|
||||||
|
|
||||||
email = request_data['email']
|
email = request_data['email']
|
||||||
user = User.query.filter(func.lower(User.email) == email.lower()).first()
|
user = session.query(User).filter(func.lower(User.email) == email.lower()).first()
|
||||||
schema = UserSchema(many=False)
|
schema = UserSchema(many=False)
|
||||||
|
|
||||||
if user is None:
|
if user is None:
|
||||||
@ -71,7 +71,7 @@ def login_password():
|
|||||||
def forgot_password():
|
def forgot_password():
|
||||||
request_data = request.get_json()
|
request_data = request.get_json()
|
||||||
email = request_data['email']
|
email = request_data['email']
|
||||||
user = User.query.filter(func.lower(User.email) == email.lower()).first()
|
user = session.query(User).filter(func.lower(User.email) == func.lower(email)).first()
|
||||||
|
|
||||||
if user:
|
if user:
|
||||||
tracking_code = email_service.reset_email(user)
|
tracking_code = email_service.reset_email(user)
|
||||||
@ -101,7 +101,7 @@ def reset_password():
|
|||||||
except BadSignature:
|
except BadSignature:
|
||||||
raise RestException(RestException.TOKEN_INVALID)
|
raise RestException(RestException.TOKEN_INVALID)
|
||||||
|
|
||||||
user = User.query.filter(func.lower(User.email) == email.lower()).first_or_404()
|
user = session.query(User).filter(func.lower(User.email) == email.lower()).first_or_404()
|
||||||
user.token_url = ''
|
user.token_url = ''
|
||||||
user.email_verified = True
|
user.email_verified = True
|
||||||
user.password = password
|
user.password = password
|
||||||
@ -118,7 +118,7 @@ def verify_token(token):
|
|||||||
try:
|
try:
|
||||||
resp = User.decode_auth_token(token)
|
resp = User.decode_auth_token(token)
|
||||||
if resp:
|
if resp:
|
||||||
g.user = User.query.filter_by(id=resp).first()
|
g.user = session.query(User).filter_by(id=resp).first()
|
||||||
except:
|
except:
|
||||||
g.user = None
|
g.user = None
|
||||||
|
|
||||||
|
@ -4,3 +4,4 @@ id,email,password,role
|
|||||||
3,ajlouie@gmail.com,Total Perspective Vortex 56,admin
|
3,ajlouie@gmail.com,Total Perspective Vortex 56,admin
|
||||||
4,aaron@sartography.com,Zarquon Disaster Area 78,user
|
4,aaron@sartography.com,Zarquon Disaster Area 78,user
|
||||||
5,kenna@sartography.com,Example Password Runner 2019,admin
|
5,kenna@sartography.com,Example Password Runner 2019,admin
|
||||||
|
6,alicia@sartography.com,Example Password billybob 55,admin
|
||||||
|
|
@ -16,6 +16,7 @@ googlemaps==3.0.2
|
|||||||
marshmallow-enum==1.5.1
|
marshmallow-enum==1.5.1
|
||||||
marshmallow==3.8.0
|
marshmallow==3.8.0
|
||||||
marshmallow_sqlalchemy==0.23.1
|
marshmallow_sqlalchemy==0.23.1
|
||||||
|
sqlalchemy==1.3.18
|
||||||
mod-wsgi==4.7.1
|
mod-wsgi==4.7.1
|
||||||
nose2==0.6.0
|
nose2==0.6.0
|
||||||
nose==1.3.7
|
nose==1.3.7
|
||||||
|
@ -80,7 +80,7 @@ MIT
|
|||||||
MIT
|
MIT
|
||||||
The MIT License
|
The MIT License
|
||||||
|
|
||||||
Copyright (c) 2020 Google LLC.
|
Copyright (c) 2021 Google LLC.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -139,7 +139,7 @@ MIT
|
|||||||
MIT
|
MIT
|
||||||
The MIT License
|
The MIT License
|
||||||
|
|
||||||
Copyright (c) 2020 Google LLC.
|
Copyright (c) 2021 Google LLC.
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -202,7 +202,7 @@ MIT
|
|||||||
|
|
||||||
core-js
|
core-js
|
||||||
MIT
|
MIT
|
||||||
Copyright (c) 2014-2020 Denis Pushkarev
|
Copyright (c) 2014-2021 Denis Pushkarev
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@ -223,30 +223,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
css-loader
|
|
||||||
MIT
|
|
||||||
Copyright JS Foundation and other contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
|
|
||||||
geolib
|
geolib
|
||||||
MIT
|
MIT
|
||||||
MIT License
|
MIT License
|
||||||
@ -489,6 +465,7 @@ all code is your original work. `</legalese>`
|
|||||||
|
|
||||||
## Marked
|
## Marked
|
||||||
|
|
||||||
|
Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/)
|
||||||
Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
|
Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -555,6 +532,7 @@ SOFTWARE.
|
|||||||
|
|
||||||
|
|
||||||
ngx-progressbar
|
ngx-progressbar
|
||||||
|
MIT
|
||||||
|
|
||||||
regenerator-runtime
|
regenerator-runtime
|
||||||
MIT
|
MIT
|
||||||
@ -825,7 +803,7 @@ zone.js
|
|||||||
MIT
|
MIT
|
||||||
The MIT License
|
The MIT License
|
||||||
|
|
||||||
Copyright (c) 2010-2020 Google LLC. http://angular.io/license
|
Copyright (c) 2010-2020 Google LLC. https://angular.io/license
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -6,29 +6,16 @@
|
|||||||
<title>Autism DRIVE</title>
|
<title>Autism DRIVE</title>
|
||||||
<base href="/">
|
<base href="/">
|
||||||
|
|
||||||
<meta
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
name="viewport"
|
|
||||||
content="width=device-width, initial-scale=1"
|
|
||||||
>
|
|
||||||
<meta property="og:site_name" content="Autism DRIVE"/>
|
<meta property="og:site_name" content="Autism DRIVE"/>
|
||||||
<meta property="og:type" content="website"/>
|
<meta property="og:type" content="website"/>
|
||||||
<meta property="og:title" content="Transform Outcomes. Together."/>
|
<meta property="og:title" content="Transform Outcomes. Together."/>
|
||||||
<meta property="og:description" content="Transform Outcomes. Together. A centralized system for autism research & resources for individuals, families & professionals. " />
|
<meta property="og:description" content="Transform Outcomes. Together. A centralized system for autism research & resources for individuals, families & professionals. "/>
|
||||||
<meta name="twitter:text:title" content="Transform Outcomes. Together."/>
|
<meta name="twitter:text:title" content="Transform Outcomes. Together."/>
|
||||||
<link
|
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico">
|
||||||
rel="icon"
|
<style type="text/css">@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v83/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.woff) format('woff');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;font-feature-settings:'liga';}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v83/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
|
||||||
type="image/x-icon"
|
<link rel="stylesheet" href="https://use.typekit.net/ato2zta.css">
|
||||||
href="/assets/favicon.ico"
|
<link rel="stylesheet" href="styles.418eadfe1eb1ee0b2bd8.css"></head>
|
||||||
>
|
|
||||||
<link
|
|
||||||
href="https://fonts.googleapis.com/icon?family=Material+Icons"
|
|
||||||
rel="stylesheet"
|
|
||||||
>
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
href="https://use.typekit.net/ato2zta.css"
|
|
||||||
>
|
|
||||||
<link rel="stylesheet" href="styles.253f70d6ea3ee022e42d.css"></head>
|
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<app-root></app-root>
|
<app-root></app-root>
|
||||||
@ -39,6 +26,6 @@
|
|||||||
var firstScriptTag = document.getElementsByTagName('script')[0];
|
var firstScriptTag = document.getElementsByTagName('script')[0];
|
||||||
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
||||||
</script>
|
</script>
|
||||||
<script src="runtime-es2015.66c79b9d36e7169e27b0.js" type="module"></script><script src="runtime-es5.66c79b9d36e7169e27b0.js" nomodule defer></script><script src="polyfills-es5.5f25760a6e7790d968b4.js" nomodule defer></script><script src="polyfills-es2015.f4693cff282ac90e4596.js" type="module"></script><script src="main-es2015.bf887d12e63744995793.js" type="module"></script><script src="main-es5.bf887d12e63744995793.js" nomodule defer></script></body>
|
<script src="runtime-es2015.a4dadbc03350107420a4.js" type="module"></script><script src="runtime-es5.a4dadbc03350107420a4.js" nomodule="" defer=""></script><script src="polyfills-es5.e6fc9488c015b7e85901.js" nomodule="" defer=""></script><script src="polyfills-es2015.2f61e63415c6de3ac93d.js" type="module"></script><script src="main-es2015.68cedc8815d9c8207bb5.js" type="module"></script><script src="main-es5.68cedc8815d9c8207bb5.js" nomodule="" defer=""></script></body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
1
frontend/main-es2015.68cedc8815d9c8207bb5.js
Normal file
1
frontend/main-es2015.68cedc8815d9c8207bb5.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend/main-es5.68cedc8815d9c8207bb5.js
Normal file
1
frontend/main-es5.68cedc8815d9c8207bb5.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend/polyfills-es2015.2f61e63415c6de3ac93d.js
Normal file
1
frontend/polyfills-es2015.2f61e63415c6de3ac93d.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend/polyfills-es5.e6fc9488c015b7e85901.js
Normal file
1
frontend/polyfills-es5.e6fc9488c015b7e85901.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user