From 7057e780b1fbece2466acb28e41d3d4d6173f24b Mon Sep 17 00:00:00 2001 From: Conrad S Date: Tue, 21 Feb 2017 11:48:39 -0500 Subject: [PATCH 1/7] Add default public schema in the base model --- app/models/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/models/base.py b/app/models/base.py index 835e50e..115fbb9 100644 --- a/app/models/base.py +++ b/app/models/base.py @@ -22,6 +22,9 @@ class Model(object): """ return cls.__name__.lower() + __table_args__ = {"schema": "public"} + + def __str__(self): """Provide a sane default for model string representation.""" return '<{} (id={})>'.format(self.__class__.__name__, self.id) -- GitLab From 82152cb930d164caaddbd71cd40332ae3fabca70 Mon Sep 17 00:00:00 2001 From: Conrad S Date: Tue, 21 Feb 2017 11:49:31 -0500 Subject: [PATCH 2/7] Remove whitespace --- app/models/base.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/base.py b/app/models/base.py index 115fbb9..1d39b5c 100644 --- a/app/models/base.py +++ b/app/models/base.py @@ -24,7 +24,6 @@ class Model(object): __table_args__ = {"schema": "public"} - def __str__(self): """Provide a sane default for model string representation.""" return '<{} (id={})>'.format(self.__class__.__name__, self.id) -- GitLab From f1c7d51f8267b21310d518d082deb2692be85565 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 21 Feb 2017 15:48:54 -0500 Subject: [PATCH 3/7] Add ProcTable, ProcColumn and run stored proc --- app/lib/database.py | 59 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/app/lib/database.py b/app/lib/database.py index 3de6fb0..d42d70e 100644 --- a/app/lib/database.py +++ b/app/lib/database.py @@ -21,7 +21,7 @@ def register(app): def commit(): """A wrapper for db.session.commit(). - + This rolls back the database session after a failed commit so that the app can continue to request future commits on the same thread. """ @@ -30,3 +30,60 @@ def commit(): except Exception as e: db.session.rollback() raise e + +class ProcTable: + """ProcTable represents a simplified class of SQLAlchemy db.model""" + + def __init__(self, name, *columns): + self.name = name + self.columns = [column for column in columns] + + def get_columns(self): + """List all columns""" + return [column.key for column in self.columns] + +class ProcColumn: + """ProcColumn represents a column similar to SQLAlchemy column""" + + def __init__(self, key): + self.key = key + +def proc(model, method, limit=None, offset=None, **kwargs): + """ + Run stored procedure + + Args: + model (class): The class of the db table + method (str): Method name for stored procedure + kwargs: Arguments for stored proc + Returns: + list: Results of the query + """ + + params = "" + cols = ','.join(str(i) for i in model.__table__.get_columns()) + for key, value in kwargs.items(): + params += "in_{} := '{}', ".format(key, value) + params = params[:-2] # remove last comma and space + + query = "select {} from {}.{}({})".format(cols, model.SCHEMA, method, params) + if limit: + query += ' limit {}'.format(limit) + if offset: + query += ' offset {}'.format(offset) + + try: + results = db.session.execute(query) + db.session.commit() + + data = [] + for row in results: + obj = {} + for column, value in row.items(): + obj[column] = value + data.append(model(**obj)) + + except Exception as err: + raise err + + return data -- GitLab From 6f7f0f20b4a550340124ea8a32e3ef8bf30b041b Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 21 Feb 2017 17:50:34 -0500 Subject: [PATCH 4/7] Update schema in proc --- app/lib/database.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/lib/database.py b/app/lib/database.py index d42d70e..da2e814 100644 --- a/app/lib/database.py +++ b/app/lib/database.py @@ -66,7 +66,12 @@ def proc(model, method, limit=None, offset=None, **kwargs): params += "in_{} := '{}', ".format(key, value) params = params[:-2] # remove last comma and space - query = "select {} from {}.{}({})".format(cols, model.SCHEMA, method, params) + query = "select {} from {}.{}({})".format( + cols, + model.__table_args__['schema'], + method, + params + ) if limit: query += ' limit {}'.format(limit) if offset: -- GitLab From 7468893b728a60f41f7a5e8dde04f43a0ef398ed Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 21 Feb 2017 18:05:04 -0500 Subject: [PATCH 5/7] Create BaseModel for database --- app/models/base.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/app/models/base.py b/app/models/base.py index 1d39b5c..e304c90 100644 --- a/app/models/base.py +++ b/app/models/base.py @@ -13,23 +13,8 @@ from ..lib import geography from . import columns -class Model(object): +class BaseModel: """A base mixin for all models.""" - @declared_attr - def __tablename__(cls): - """Automatically set the database table name to the class name - lower-cased. - """ - return cls.__name__.lower() - - __table_args__ = {"schema": "public"} - - def __str__(self): - """Provide a sane default for model string representation.""" - return '<{} (id={})>'.format(self.__class__.__name__, self.id) - - id = db.Column(db.Integer, primary_key=True) - def get_dictionary(self): """Return a dictionary representation of the model. @@ -56,6 +41,24 @@ class Model(object): return d +class Model(BaseModel): + """A base mixin for SQLAlchemy model.""" + @declared_attr + def __tablename__(cls): + """Automatically set the database table name to the class name + lower-cased. + """ + return cls.__name__.lower() + + __table_args__ = {"schema": "public"} + + def __str__(self): + """Provide a sane default for model string representation.""" + return '<{} (id={})>'.format(self.__class__.__name__, self.id) + + id = db.Column(db.Integer, primary_key=True) + + class Tracked(object): """A mixin to include tracking datetime fields.""" created = db.Column(columns.Arrow, default=func.now()) -- GitLab From 45ad5bae684c74f5123e95bad5a18c9b19c16b43 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Wed, 22 Feb 2017 09:49:03 -0500 Subject: [PATCH 6/7] Simplify result loop in proc --- app/lib/database.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/lib/database.py b/app/lib/database.py index da2e814..b2f8943 100644 --- a/app/lib/database.py +++ b/app/lib/database.py @@ -83,10 +83,7 @@ def proc(model, method, limit=None, offset=None, **kwargs): data = [] for row in results: - obj = {} - for column, value in row.items(): - obj[column] = value - data.append(model(**obj)) + data.append(model(**dict(zip(row.keys(), row)))) except Exception as err: raise err -- GitLab From d5acab84cb25ceb31d9c6260a68b121215eb0431 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 22 Feb 2017 12:50:35 -0500 Subject: [PATCH 7/7] Fix config to point to new dev application and user service. --- app/config/development.default.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/development.default.py b/app/config/development.default.py index 9a06abb..8d06722 100644 --- a/app/config/development.default.py +++ b/app/config/development.default.py @@ -16,8 +16,8 @@ SERVICE_CONFIG = { 'app_token': 'x-blocpower-app-token', 'app_secret': 'x-blocpower-app-secret'}, 'urls': { - 'app': 'http://staging.app.s.blocpower.us/', - 'user': 'http://staging.user.s.blocpower.us/'} + 'app': 'http://dev.appservice.blocpower.io/', + 'user': 'http://dev.userservice.blocpower.io/'} } # AppService -- GitLab