diff --git a/app/config.py b/app/config.py index 49eac82..8fead3d 100644 --- a/app/config.py +++ b/app/config.py @@ -5,6 +5,7 @@ basedir = os.path.abspath(os.path.dirname(__file__)) UPLOAD_FOLDER = "app/tmp/data/" +UPLOAD_IMAGE_FOLDER = "app/uploads/images" MAX_TOKENS = 200000 if not os.path.isdir(UPLOAD_FOLDER): @@ -46,7 +47,7 @@ class DevelopmentConfig(Config): cert_bytes = open(fname, 'rb').read() PKEY = load_pem_private_key(cert_bytes, None) - PROJECT_IMAGE_FOLDER = "app/uploads/images" + PROJECT_IMAGE_FOLDER = UPLOAD_IMAGE_FOLDER UPLOAD_IMAGE_EXTENSIONS = ['.jpg', '.png', '.gif', '.jpeg'] @@ -64,7 +65,7 @@ class TestingConfig(Config): basedir = os.path.dirname(os.path.abspath(__file__)) SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'arborator_test.sqlite') - PROJECT_IMAGE_FOLDER = "app/uploads/images" + PROJECT_IMAGE_FOLDER = UPLOAD_IMAGE_FOLDER UPLOAD_IMAGE_EXTENSIONS = ['.jpg', '.png', '.gif', '.jpeg'] @@ -86,12 +87,10 @@ class ProductionConfig(Config): ENV = 'prod' fname = 'keys/arborator-grew.pem' APP_ID = open('keys/arborator-grew-appid.txt').read() - # INSTALATION_ID = int(open('keys/arborator-grew-installationid.txt').read()) cert_bytes = open(fname, 'rb').read() PKEY = load_pem_private_key(cert_bytes, None) - ## WARNING : specify the DIST folder, not the quasar source code in prod - PROJECT_IMAGE_FOLDER = "app/uploads/images" + PROJECT_IMAGE_FOLDER = UPLOAD_IMAGE_FOLDER UPLOAD_IMAGE_EXTENSIONS = ['.jpg', '.png', '.gif', '.jpeg'] diff --git a/app/public/favicon.ico b/app/public/favicon.ico deleted file mode 100644 index 7ace6d1..0000000 Binary files a/app/public/favicon.ico and /dev/null differ diff --git a/app/public/tmp.xlsx b/app/public/tmp.xlsx deleted file mode 100644 index 57a076f..0000000 Binary files a/app/public/tmp.xlsx and /dev/null differ diff --git a/app/shared/decorator.py b/app/shared/decorator.py deleted file mode 100644 index d1f9029..0000000 --- a/app/shared/decorator.py +++ /dev/null @@ -1,44 +0,0 @@ -# from flask import redirect, url_for, abort, -# from flask_login import current_user -# from functools import wraps -# # from flask_cors import cross_origin - -# from app.projects.service import ProjectAccessService, ProjectService - -# from ...services import project_service, user_service, robot_service, github_service, samples_service # type: ignore - - -# def requires_access_level(access_level): -# """ decorator for access control. except for superadmins """ -# def decorator(f): -# @wraps(f) -# def decorated_function(*args, **kwargs): -# # not authenticated -> login -# if not current_user.id: -# return redirect(url_for('auth.login')) - -# if kwargs.get("project_name"): -# project_id = project_service.get_by_name( -# kwargs["project_name"]).id -# elif kwargs.get("id"): -# project_id = kwargs["id"] -# else: -# abort(400) - -# project_access = project_service.get_project_access( -# project_id, current_user.id) - -# print("project_access for current user: {}".format(project_access)) - -# if not current_user.super_admin: # super_admin are always admin even if it's not in the table -# if project_access < access_level: -# abort(403, "User doesn't have the right privileges") -# # if isinstance(project_access, int): -# # abort(403, "ERROR isinstance(project_access, int)") -# # if project_access is None or project_access.access_level.code < access_level: -# # abort(403, "project_access is None or project_access.access_level.code < access_level") -# # # return redirect(url_for('home.home_page')) - -# return f(*args, **kwargs) -# return decorated_function -# return decorator \ No newline at end of file diff --git a/app/shared/model.py b/app/shared/model.py index 3bb41de..011a5f1 100644 --- a/app/shared/model.py +++ b/app/shared/model.py @@ -1,48 +1,17 @@ import base64 -import json - -from sqlalchemy.ext.declarative import DeclarativeMeta - class BaseM(object): def as_json(self, exclude=[], include={}): json_rep = dict() for k in vars(self): - # print(getattr(self, k)) if k in exclude: - # print(k) continue elif k[0] == "_": continue elif type(getattr(self, k)) is bytes: - # print('yay') - # print(getattr(self, k)) json_rep[k] = str(base64.b64encode(getattr(self, k))) - # json_rep[k] = str(getattr(self, k)) else: json_rep[k] = getattr(self, k) for k in include: json_rep[k] = include[k] return json_rep - - -# TODO : can remove this class -class AlchemyEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj.__class__, DeclarativeMeta): - # an SQLAlchemy class - fields = {} - for field in [ - x for x in dir(obj) if not x.startswith("_") and x != "metadata" - ]: - data = obj.__getattribute__(field) - try: - # this will fail on non-encodable values, like other classes - json.dumps(data) - fields[field] = data - except TypeError: - fields[field] = None - # a json-encodable dict - return fields - - return json.JSONEncoder.default(self, obj) \ No newline at end of file diff --git a/app/tags/controller.py b/app/tags/controller.py index 5e18ccc..f53841a 100644 --- a/app/tags/controller.py +++ b/app/tags/controller.py @@ -38,9 +38,8 @@ def get(self, project_name, username): project = ProjectService.get_by_name(project_name) ProjectService.check_if_project_exist(project) user = UserService.get_by_username(username) - if(user is not None): - if UserTagsService.get_by_user_id(user.id): - return UserTagsService.get_by_user_id(user.id).tags + if user is not None and UserTagsService.get_by_user_id(user.id): + return UserTagsService.get_by_user_id(user.id).tags def post(self, project_name, username): diff --git a/app/trees/controller.py b/app/trees/controller.py index 9e56086..4c2e5c4 100644 --- a/app/trees/controller.py +++ b/app/trees/controller.py @@ -79,16 +79,14 @@ def get(self, project_name: str, sample_name: str): return data def post(self, project_name: str, sample_name: str): - parser = reqparse.RequestParser() - parser.add_argument(name="sent_id", type=str) - parser.add_argument(name="user_id", type=str) - parser.add_argument(name="conll", type=str) - args = parser.parse_args() - + + args = request.get_json() + user_id = args.get("user_id") + conll = args.get("conll") + project = ProjectService.get_by_name(project_name) ProjectService.check_if_freezed(project) - user_id = args.user_id - conll = args.conll + if not conll: abort(400) diff --git a/app/user/controller_test.py b/app/user/controller_test.py index f43397b..0a75e71 100644 --- a/app/user/controller_test.py +++ b/app/user/controller_test.py @@ -66,19 +66,3 @@ def test_get(self, client: FlaskClient): # noqa for r in results: assert r in expected - # @patch.object( - # UserService, "create", lambda create_request: User(**create_request) - # ) - # def test_post(self, client: FlaskClient): # noqa - # with client: - - # payload = dict(username="Test user", first_name="test first name") - # result = client.post(f"/api/{BASE_ROUTE}/", json=payload).get_json() - # expected = ( - # UserSchema() - # .dump(User(username=payload["username"], first_name=payload["first_name"])) - - # ) - # print("result", result) - # print("expected", expected) - # assert result == expected diff --git a/app/user/schema.py b/app/user/schema.py index 6391aed..2c8f64e 100644 --- a/app/user/schema.py +++ b/app/user/schema.py @@ -5,15 +5,15 @@ class UserSchema(Schema): """User schema""" id = fields.String(attribute="id") - auth_provider = fields.String(attribute="auth_provider") - github_access_token = fields.String(attribute="github_access_token") + authProvider = fields.String(attribute="auth_provider") + githubAccessToken = fields.String(attribute="github_access_token") username = fields.String(attribute="username") - first_name = fields.String(attribute="first_name") - family_name = fields.String(attribute="family_name") + firstName = fields.String(attribute="first_name") + familyName = fields.String(attribute="family_name") email = fields.String(attribute="email") - not_share_email = fields.Boolean(attribute="not_share_email") - receive_newsletter = fields.Boolean(attribute="receive_newsletter") - picture_url = fields.String(attribute="picture_url") - super_admin = fields.Boolean(attribute="super_admin") - created_date = fields.DateTime(attribute="created_date") - last_seen = fields.DateTime(attribute="last_seen") \ No newline at end of file + notShareEmail = fields.Boolean(attribute="not_share_email") + receiveNewsletter = fields.Boolean(attribute="receive_newsletter") + pictureUrl = fields.String(attribute="picture_url") + superAdmin = fields.Boolean(attribute="super_admin") + createdDate = fields.DateTime(attribute="created_date") + lastSeen = fields.DateTime(attribute="last_seen") \ No newline at end of file diff --git a/app/user/service.py b/app/user/service.py index 43b3f5f..d5197e4 100644 --- a/app/user/service.py +++ b/app/user/service.py @@ -30,8 +30,8 @@ def login_by_id(id: str) -> User: return User.query.get(id) @staticmethod - def update(user: User, User_change_updates: UserInterface) -> User: - user.update(User_change_updates) + def update(user: User, user_change_updates: UserInterface) -> User: + user.update(user_change_updates) db.session.commit() return user diff --git a/commands/seed_command.py b/commands/seed_command.py index 81be85f..2ae9bb3 100644 --- a/commands/seed_command.py +++ b/commands/seed_command.py @@ -1,27 +1,6 @@ -from datetime import datetime -import pandas as pd -import numpy as np from flask_script import Command from app import db -# from app.widget import Widget -from app.projects.model import Project - - -# def seed_things(): -# classes = [Widget] -# for klass in classes: -# seed_thing(klass) - - -# def seed_thing(cls): -# things =[ -# {"name": "Pizza Slicer", "purpose": "Cut delicious pizza"}, -# {"name": "Rolling Pin", "purpose": "Roll delicious pizza"}, -# {"name": "Pizza Oven", "purpose": "Bake delicious pizza"}, -# ] -# db.session.bulk_insert_mappings(cls, things) - class SeedCommand(Command): """ Seed the DB.""" diff --git a/docs/site.png b/docs/site.png deleted file mode 100644 index 4c79605..0000000 Binary files a/docs/site.png and /dev/null differ diff --git a/manage_imgblob2path.py b/manage_imgblob2path.py deleted file mode 100644 index edd31aa..0000000 --- a/manage_imgblob2path.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -from flask_script import Manager - -from app import create_app, db -from commands.seed_command import SeedCommand - - -from dotenv import load_dotenv -load_dotenv(dotenv_path=".flaskenv", verbose=True) -from sqlalchemy import MetaData, Table, Column, Integer, String - -env = os.getenv("FLASK_ENV") or "test" -print(f"Active environment: * {env} *") -app = create_app(env) - -manager = Manager(app) -app.app_context().push() -manager.add_command("blob2img", SeedCommand) - -#### to run as follows -# ######################## python3 manage_imgblob2path.py blob_to_path #################### - - - -@manager.command -def run(): - app.run() - - -@manager.command -def blob_to_path(): - '''exports all the blob images to png files and replace the content by their path''' - - import subprocess - - subprocess.run(['bash', 'migrate_img.sh', 'app/arborator_dev.sqlite', '../arborator-frontend/public/images/projectimages']) #, 'y']) - # subprocess.run(['bash', 'migrate_img.sh', 'app/20220206.arborator_prod.sqlite', 'images_prod_temp'])#'../arborator-frontend/public/images/projectimages']) #, 'y']) - # prod - subprocess.run(['bash', 'migrate_img.sh', 'app/arborator_dev.sqlite', '/home/arborator/arborator-frontend/dist/spa/images/projectimages']) #, 'y']) - # print('Retrieved all Blob based images from database to app/public/projectimages as png files named according to the project name') - - from app.projects.service import ProjectService - from app.projects.model import Project - projects = ProjectService.get_all() - print('Will now process the %s projects with a custom image' % (len([ (p.project_name, p.image) for p in projects if p.image is not None]))) - for p in projects: - if p.image is not None: ProjectService.change_image(p.project_name, 'images/projectimages/%s.png' % (p.project_name) ) - print('Images changed with the relative png file path') - - -if __name__ == "__main__": - manager.run() diff --git a/migrate_img.sh b/migrate_img.sh deleted file mode 100644 index b43bbda..0000000 --- a/migrate_img.sh +++ /dev/null @@ -1,18 +0,0 @@ -# ARGS: - # Argument 1: path to SQLlite database - # example: app/arborator_dev.sqlite - # Argument 2: path to dir for png files - # example: ../arborator-frontend/public/images/projectimages - # Argument 3: database rm mode - # either empty or "y" - # Just useful during tests to quickly reset the database with an old BLOB based one - -if [ ! -z "$3" ] - then - rm $1 cp app/arborator_dev\ \(4e\ copie\).sqlite $1 -fi -# echo mkdir -p $2 -# echo sqlite3 $1 "SELECT writefile('$2/' || project_name || '.png', image) FROM projects WHERE image notnull;" -mkdir -p $2 -sqlite3 $1 "SELECT writefile('$2/' || project_name || '.png', image) FROM projects WHERE image notnull;" -# sqlite3 app/arborator_dev.sqlite "SELECT writefile('../arborator-frontend/public/images/projectimages/' || project_name || '.png', image) FROM projects WHERE image notnull;" \ No newline at end of file diff --git a/tmp.xlsx b/tmp.xlsx deleted file mode 100644 index 8119856..0000000 Binary files a/tmp.xlsx and /dev/null differ