diff --git a/app/controllers/bgroup.py b/app/controllers/bgroup.py index 8bcfd815c207755cc8ba62625d1964e2c36011d9..0e918cdfac29ae3667a94d839f9c46aa0d483c5d 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,35 @@ 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] + + 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/forms/bgroup.py b/app/forms/bgroup.py index 44e04f7c569f46b396f6c9856469b033d8e2da22..92d2469ad9a858ed04503eec455dbca6d005b626 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/models/bgroup.py b/app/models/bgroup.py index d1bf0b967985039804042c7a68b51e4ea4304472..2807748cb8d0f52771fdd3153a410480341d406d 100644 --- a/app/models/bgroup.py +++ b/app/models/bgroup.py @@ -4,9 +4,20 @@ 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)) 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): + """M:M BGroup and buildings""" + __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 + time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) diff --git a/app/views/__init__.py b/app/views/__init__.py index 6d0df26a202567f8e985bb1359200b9b683c0912..db625172709f74cbb562b95fd235a1a5d57bc0e9 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 a9174a8e2830563dfe787347a41fab3626cd29dd..559b2f4b4a7e932812050a22fa858af90928a090 100644 --- a/app/views/bgroup.py +++ b/app/views/bgroup.py @@ -1,9 +1,50 @@ """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 +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, + ) + + @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_building(self, bgroup_id, id_): + """Delete a building in a group""" + return self.json(self.get_controller().delete(id_, request.args), 200) + + def index(self): + raise MethodNotAllowed() + + def post(self): + raise MethodNotAllowed() + + def put(self, id_): + raise MethodNotAllowed() + + def delete(self, id_): + raise MethodNotAllowed() diff --git a/app/views/building.py b/app/views/building.py index 7091c4ab0c24fd45399681df62faa8b2122ff8b6..a5a95be8db213a359344694c3790bbd39b4cfcd5 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 diff --git a/requirements.txt b/requirements.txt index 56b3e1c977f812659b0bd388adf4e36067ec6426..32a09ddbbf9ad6a42d4020625181d31195b709ac 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.2 cement==2.4.0 colorama==0.3.3 docker-py==1.1.0