From 40afcaf0cb2f282465992cb06eb024687eb83234 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 19 Oct 2017 14:39:49 -0400 Subject: [PATCH 01/12] Add BuildingBGroup model --- app/models/bgroup.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/bgroup.py b/app/models/bgroup.py index d1bf0b9..2e5cb22 100644 --- a/app/models/bgroup.py +++ b/app/models/bgroup.py @@ -10,3 +10,11 @@ class BGroup(User, Model, db.Model): priority = db.Column(db.Integer) # FIXME: Foregin key to group_priority time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) time_modified = db.Column(db.DateTime) + + +class BuildingBGroup(Model, db.Model): + __tablename__ = 'building_bgroup' + + building_id = db.Column(db.Integer) # FIXME: Foregin key to building + bgroup_id = db.Column(db.Integer) # FIXME: Foregin key to bgroup + time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) -- GitLab From 720edb3ba273b060ad5598270773f8c4d334f352 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 19 Oct 2017 14:40:59 -0400 Subject: [PATCH 02/12] Add BuildingBGroup view, controller and form --- app/controllers/bgroup.py | 33 +++++++++++++++++++++++++++++++-- app/forms/bgroup.py | 4 ++++ app/views/__init__.py | 1 + app/views/bgroup.py | 18 +++++++++++++++++- 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/app/controllers/bgroup.py b/app/controllers/bgroup.py index 8bcfd81..86df02a 100644 --- a/app/controllers/bgroup.py +++ b/app/controllers/bgroup.py @@ -1,7 +1,9 @@ """Building groups controller""" +from flask import g +from werkzeug.exceptions import BadRequest from .base import RestController -from ..forms.bgroup import BGroupForm -from ..models.bgroup import BGroup +from ..forms.bgroup import BGroupForm, BuildingBGroupForm +from ..models.bgroup import BGroup, BuildingBGroup class BGroupController(RestController): @@ -13,3 +15,30 @@ class BGroupController(RestController): Get the WTForms form for the model. """ return BGroupForm + + +class BuildingBGroupController(RestController): + """BuildingBGroup Controller""" + Model = BuildingBGroup + + def get_form(self, filter_data): + return BuildingBGroupForm + + def create(self, bgroup_id, data, filter_data): + """Creates all BuildingBGroup models to be added to db""" + if 'building_ids' not in data: + raise BadRequest(['Incorrect body']) + + return [self.Model(building_id=i, bgroup_id=bgroup_id) for i in data['building_ids']] + + def post(self, bgroup_id, data, filter_data): + """Post a list of building_ids to add to a group""" + models = self.create(bgroup_id, data, filter_data) + self.db.session.add_all(models) + + # update user_modified field in bgroup + bgroup = self.db.session.query(BGroup).get(bgroup_id) + bgroup.user_modified = g.get('sub', None) + self.commit() + + return [model.get_dictionary() for model in models] diff --git a/app/forms/bgroup.py b/app/forms/bgroup.py index 44e04f7..92d2469 100644 --- a/app/forms/bgroup.py +++ b/app/forms/bgroup.py @@ -8,3 +8,7 @@ class BGroupForm(UserForm, Form): validators=[wtf.validators.Required(), wtf.validators.Length(max=64)]) priority = wtf.IntegerField(validators=[wtf.validators.NumberRange(1, 3)]) + + +class BuildingBGroupForm(Form): # pylint: disable=too-few-public-methods + pass diff --git a/app/views/__init__.py b/app/views/__init__.py index 6d0df26..db62517 100644 --- a/app/views/__init__.py +++ b/app/views/__init__.py @@ -15,6 +15,7 @@ def register(app): """ building.BuildingView.register(app) bgroup.BGroupView.register(app) + bgroup.BuildingBGroupView.register(app) turk_hit.TurkHitView.register(app) unapproved_point.UnapprovedPointView.register(app) unapproved_window_door.UnapprovedWindowDoorView.register(app) diff --git a/app/views/bgroup.py b/app/views/bgroup.py index a9174a8..3b6991d 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -1,9 +1,25 @@ """Building group view""" +from flask import jsonify, request +from flask.ext.classy import route, FlaskView from ..views.base import RestView -from ..controllers.bgroup import BGroupController +from ..controllers.bgroup import BGroupController, BuildingBGroupController class BGroupView(RestView): def get_controller(self): return BGroupController() + + +class BuildingBGroupView(RestView): + route_prefix = '/bgroup//' + route_base = '/buildings/' + + def get_controller(self): + return BuildingBGroupController() + + @route('/', methods=['POST']) + def add_buildings(self, bgroup_id): + """Add buildings to a group""" + return self.json(self.get_controller().post( + bgroup_id, self.request_json(), request.args), 201) -- GitLab From 2802ab70dffecabbb1b2faca5e35a79f7f4bb139 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 19 Oct 2017 16:54:58 -0400 Subject: [PATCH 03/12] Add delete and get methods to BuildingBGroupView --- app/controllers/bgroup.py | 5 +++++ app/views/bgroup.py | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/app/controllers/bgroup.py b/app/controllers/bgroup.py index 86df02a..0e918cd 100644 --- a/app/controllers/bgroup.py +++ b/app/controllers/bgroup.py @@ -42,3 +42,8 @@ class BuildingBGroupController(RestController): self.commit() return [model.get_dictionary() for model in models] + + def get(self, bgroup_id, filter_data): + """Get all buildings in a group""" + q = self.query(filter_data).filter(self.Model.bgroup_id == bgroup_id).all() + return [model.get_dictionary() for model in q] diff --git a/app/views/bgroup.py b/app/views/bgroup.py index 3b6991d..b457b59 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -23,3 +23,12 @@ class BuildingBGroupView(RestView): """Add buildings to a group""" return self.json(self.get_controller().post( bgroup_id, self.request_json(), request.args), 201) + + @route('/', methods=['GET']) + def get(self, bgroup_id): + """Get buildings within a bgroup""" + return self.json(self.get_controller().get(bgroup_id, request.args)) + + @route('/', methods=['DELETE']) + def delete(self, bgroup_id, id_): + return self.json(self.get_controller().delete(id_, request.args), 204) -- GitLab From 651244d413548790325a63ac94a1c2a4bfbad0f0 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 19 Oct 2017 17:13:12 -0400 Subject: [PATCH 04/12] Update bvalve version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 56b3e1c..94affa1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ beautifulsoup4==4.4.1 blessed==1.9.5 boto3==1.4.4 botocore==1.5.48 -git+ssh://git@github.com/Blocp/bpvalve.git@v1.1.0 +git+ssh://git@github.com/Blocp/bpvalve.git@v1.1.1 cement==2.4.0 colorama==0.3.3 docker-py==1.1.0 -- GitLab From 606114a032a8590f315acff3c0b8be1c5fbd541a Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 19 Oct 2017 17:16:13 -0400 Subject: [PATCH 05/12] Remove unused imports and add comment for delete --- app/views/bgroup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/bgroup.py b/app/views/bgroup.py index b457b59..269db5d 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -1,6 +1,6 @@ """Building group view""" -from flask import jsonify, request -from flask.ext.classy import route, FlaskView +from flask import request +from flask.ext.classy import route from ..views.base import RestView from ..controllers.bgroup import BGroupController, BuildingBGroupController @@ -31,4 +31,5 @@ class BuildingBGroupView(RestView): @route('/', methods=['DELETE']) def delete(self, bgroup_id, id_): + """Delete a building in a group""" return self.json(self.get_controller().delete(id_, request.args), 204) -- GitLab From ba7582de3cfc35cc2f44f050ef07c22b658f6984 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Oct 2017 17:07:00 -0400 Subject: [PATCH 06/12] Update UnprotectedRestView import in building route --- app/views/building.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/building.py b/app/views/building.py index 7091c4a..a5a95be 100644 --- a/app/views/building.py +++ b/app/views/building.py @@ -1,8 +1,8 @@ """Views for working with buildings.""" from flask import request from werkzeug.exceptions import MethodNotAllowed +from bpvalve.flask.views import UnprotectedRestView from ..controllers.building import BuildingController -from .base import UnprotectedRestView from app.permissions.application import app_need -- GitLab From 5a5df811db9e042b449e88ecf4fa53e1493a5e72 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Oct 2017 17:10:59 -0400 Subject: [PATCH 07/12] Block methods from base rest class for bgroup --- app/views/bgroup.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/views/bgroup.py b/app/views/bgroup.py index 269db5d..875243b 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -1,6 +1,7 @@ """Building group view""" from flask import request from flask.ext.classy import route +from werkzeug.exceptions import MethodNotAllowed from ..views.base import RestView from ..controllers.bgroup import BGroupController, BuildingBGroupController @@ -30,6 +31,18 @@ class BuildingBGroupView(RestView): return self.json(self.get_controller().get(bgroup_id, request.args)) @route('/', methods=['DELETE']) - def delete(self, bgroup_id, id_): + def delete_building(self, bgroup_id, id_): """Delete a building in a group""" return self.json(self.get_controller().delete(id_, request.args), 204) + + def index(self): + raise MethodNotAllowed() + + def post(self): + raise MethodNotAllowed() + + def put(self, id_): + raise MethodNotAllowed() + + def delete(self, id_): + raise MethodNotAllowed() -- GitLab From 4173e4e044ab7953075affeb47e83c0be31d3da0 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Oct 2017 17:18:11 -0400 Subject: [PATCH 08/12] Update add_buildings func return statement style --- app/views/bgroup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/bgroup.py b/app/views/bgroup.py index 875243b..73d0f2b 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -22,8 +22,10 @@ class BuildingBGroupView(RestView): @route('/', methods=['POST']) def add_buildings(self, bgroup_id): """Add buildings to a group""" - return self.json(self.get_controller().post( - bgroup_id, self.request_json(), request.args), 201) + return self.json( + self.get_controller().post(bgroup_id, self.request_json(), request.args), + 201, + ) @route('/', methods=['GET']) def get(self, bgroup_id): -- GitLab From db7e39e04af10f671430416f11d740e6fd6a3205 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Wed, 25 Oct 2017 11:32:23 -0400 Subject: [PATCH 09/12] Update bvalve to 1.1.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 94affa1..32a09dd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ beautifulsoup4==4.4.1 blessed==1.9.5 boto3==1.4.4 botocore==1.5.48 -git+ssh://git@github.com/Blocp/bpvalve.git@v1.1.1 +git+ssh://git@github.com/Blocp/bpvalve.git@v1.1.2 cement==2.4.0 colorama==0.3.3 docker-py==1.1.0 -- GitLab From 2faa5c2949093688fa11b35ff3d378dc95ac2b9b Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Wed, 25 Oct 2017 11:36:32 -0400 Subject: [PATCH 10/12] Update delete in bgroup to return 200 --- app/views/bgroup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/bgroup.py b/app/views/bgroup.py index 73d0f2b..559b2f4 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -35,7 +35,7 @@ class BuildingBGroupView(RestView): @route('/', methods=['DELETE']) def delete_building(self, bgroup_id, id_): """Delete a building in a group""" - return self.json(self.get_controller().delete(id_, request.args), 204) + return self.json(self.get_controller().delete(id_, request.args), 200) def index(self): raise MethodNotAllowed() -- GitLab From d7c3788f4dc57d9951927912e033e0faabc65a0f Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 30 Oct 2017 13:10:02 -0400 Subject: [PATCH 11/12] Move bgroup model to groups schema --- app/models/bgroup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/bgroup.py b/app/models/bgroup.py index 2e5cb22..aa2b8f3 100644 --- a/app/models/bgroup.py +++ b/app/models/bgroup.py @@ -4,6 +4,7 @@ from ..lib.database import db class BGroup(User, Model, db.Model): __tablename__ = 'bgroup' + __table_args__ = {'schema': 'groups'} id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('bgroup_id_seq'::regclass)")) name = db.Column(db.String(64)) @@ -14,6 +15,7 @@ class BGroup(User, Model, db.Model): class BuildingBGroup(Model, db.Model): __tablename__ = 'building_bgroup' + __table_args__ = {'schema': 'groups'} building_id = db.Column(db.Integer) # FIXME: Foregin key to building bgroup_id = db.Column(db.Integer) # FIXME: Foregin key to bgroup -- GitLab From 1d08106d75669040cbf8cacae5d3e46888603539 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 30 Oct 2017 13:56:26 -0400 Subject: [PATCH 12/12] Add comment for building bgroup model --- app/models/bgroup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/bgroup.py b/app/models/bgroup.py index aa2b8f3..2807748 100644 --- a/app/models/bgroup.py +++ b/app/models/bgroup.py @@ -14,6 +14,7 @@ class BGroup(User, Model, db.Model): class BuildingBGroup(Model, db.Model): + """M:M BGroup and buildings""" __tablename__ = 'building_bgroup' __table_args__ = {'schema': 'groups'} -- GitLab