From da6af9c42f01ec4955f156225c4b0339e6ebfbd5 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 6 Dec 2017 09:40:23 -0500 Subject: [PATCH 01/30] Add space related models. --- app/models/space.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 app/models/space.py diff --git a/app/models/space.py b/app/models/space.py new file mode 100644 index 0000000..16d60df --- /dev/null +++ b/app/models/space.py @@ -0,0 +1,49 @@ +"""Models associated to spaces""" +from .base import Model, User +from ..lib.database import db + +class SpacesSchema(): + """Class to point to spaces schema""" + __table_args__ = {'schema': 'spaces'} + +class Space(SpacesSchema, User, Model, db.Model): + """Model for a Space""" + + id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('space_id_seq'::regclass)")) + building_id = db.Column(db.Integer) # FIXME: Foregin key to building + conditioned = db.Column(db.Boolean) + orientation = db.Column(db.String(64)) + description = db.Column(db.String(64)) + floor = db.Column(db.String(64)) + time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) + time_modified = db.Column(db.DateTime) + +class Apartment(SpacesSchema, User, Model, db.Model): + """Model for an Apartment""" + + id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('apartment_id_seq'::regclass)")) + building_id = db.Column(db.Integer) # FIXME: Foregin key to building + number = db.Column(db.String(64)) + number_of_bedrooms = db.Column(db.Integer) + tenant_name = db.Column(db.String(64)) + tenant_heating_issue = db.Column(db.Text) + + +class ServiceArea(SpacesSchema, User, Model, db.Model): + """Model for a Service Area""" + + id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('service_area_id_seq'::regclass)")) + building_id = db.Column(db.Integer) # FIXME: Foregin key to building + +class CommonArea(SpacesSchema, User, Model, db.Model): + """Model for a Common Area""" + + id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('common_area_id_seq'::regclass)")) + building_id = db.Column(db.Integer) # FIXME: Foregin key to building + +class SpaceFunction(SpacesSchema, db.Model): + """ Model for associating spaces to space metadata """ + + space_id = db.Columb(db.Integer) # FIXME: Foregin key to spaces + space_child_id = db.Column(db.Integer) # FIXME: Foregin key to space child + space_child_type = db.Column(db.String(64)) -- GitLab From 52356f25e545f403a693c4c79c6cce6c1085b266 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 6 Dec 2017 14:25:16 -0500 Subject: [PATCH 02/30] Adjust space related models. --- app/models/space.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/models/space.py b/app/models/space.py index 16d60df..46cf347 100644 --- a/app/models/space.py +++ b/app/models/space.py @@ -27,6 +27,8 @@ class Apartment(SpacesSchema, User, Model, db.Model): number_of_bedrooms = db.Column(db.Integer) tenant_name = db.Column(db.String(64)) tenant_heating_issue = db.Column(db.Text) + time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) + time_modified = db.Column(db.DateTime) class ServiceArea(SpacesSchema, User, Model, db.Model): @@ -34,15 +36,19 @@ class ServiceArea(SpacesSchema, User, Model, db.Model): id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('service_area_id_seq'::regclass)")) building_id = db.Column(db.Integer) # FIXME: Foregin key to building + time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) + time_modified = db.Column(db.DateTime) class CommonArea(SpacesSchema, User, Model, db.Model): """Model for a Common Area""" id = db.Column(db.Integer, primary_key=True, server_default=db.text("nextval('common_area_id_seq'::regclass)")) building_id = db.Column(db.Integer) # FIXME: Foregin key to building + time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) + time_modified = db.Column(db.DateTime) class SpaceFunction(SpacesSchema, db.Model): - """ Model for associating spaces to space metadata """ + """Model for associating spaces to space metadata""" space_id = db.Columb(db.Integer) # FIXME: Foregin key to spaces space_child_id = db.Column(db.Integer) # FIXME: Foregin key to space child -- GitLab From 603b3ad108512a881b1b0c79cd6d73782f2df6a0 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 6 Dec 2017 14:25:50 -0500 Subject: [PATCH 03/30] Add space related forms. --- app/forms/space.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 app/forms/space.py diff --git a/app/forms/space.py b/app/forms/space.py new file mode 100644 index 0000000..60178d2 --- /dev/null +++ b/app/forms/space.py @@ -0,0 +1,34 @@ +"""Forms for space related models""" +import wtforms as wtf +from .base import Form, UserForm + + +class SpaceForm(UserForm, Form): + """Space Form""" + building_id = wtf.IntegerField() + conditioned = wtf.BooleanField() + orientation = wtf.StringField() + description = wtf.StringField() + floor = wtf.StringField() + +class ApartmentForm(Form): # pylint: disable=too-few-public-methods + """Apartment Form """ + building_id = wtf.IntegerField() + number = wtf.StringField() + number_of_bedrooms = wtf.IntegerField() + tenant_name = wtf.StringField() + tenant_heating_issue = wtf.StringField() + +class ServiceAreaForm(Form): + """Service Area Form""" + building_id = wtf.IntegerField() + +class CommonAreaForm(Form): + """Common Area Form""" + building_id = wtf.IntegerField() + +class SpaceFunctionForm(Form): + """Space Function Form""" + space_id = wtf.IntegerField() + space_child_id = wtf.IntegerField() + space_child_type = wtf.StringField() -- GitLab From 93b89134d5c3b067817bb9177072e7c0c0dca1c3 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 6 Dec 2017 14:26:13 -0500 Subject: [PATCH 04/30] Add space related controllers. --- app/controllers/space.py | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 app/controllers/space.py diff --git a/app/controllers/space.py b/app/controllers/space.py new file mode 100644 index 0000000..b586b0b --- /dev/null +++ b/app/controllers/space.py @@ -0,0 +1,46 @@ +"""Space controllers""" +from flask import g +from werkzeug.exceptions import BadRequest +from .base import RestController +from ..forms.space import SpaceForm, ApartmentForm, CommonAreaForm, ServiceAreaForm, SpaceFunctionForm +from ..models.space import Space, Apartment, CommonArea, ServiceArea, SpaceFunction + + +class SpaceController(RestController): + """The space controller.""" + Model = Space + + def get_form(self, filter_data): + """ + Get the WTForms form for the model. + """ + return SpaceForm + + +class ApartmentController(RestController): + """Apartment Controller""" + Model = Apartment + + def get_form(self, filter_data): + return ApartmentForm + +class CommonAreaController(RestController): + """Common Area Controller""" + Model = CommonArea + + def get_form(self, filter_data): + return CommonAreaForm + +class ServiceAreaController(RestController): + """Service Area Controller""" + Model = ServiceArea + + def get_form(self, filter_data): + return ServiceAreaForm + +class SpaceFunctionController(RestController): + """Space Function Controller""" + Model = SpaceFunction + + def get_form(self, filter_data): + return SpaceFunctionForm -- GitLab From 29e50d78171b05fa0109e69e889fa8baa91b417f Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 6 Dec 2017 14:26:36 -0500 Subject: [PATCH 05/30] Add space related views. --- app/views/space.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 app/views/space.py diff --git a/app/views/space.py b/app/views/space.py new file mode 100644 index 0000000..f70a14e --- /dev/null +++ b/app/views/space.py @@ -0,0 +1,32 @@ +"""Space related views""" +from flask import request +from flask.ext.classy import route +from werkzeug.exceptions import MethodNotAllowed +from ..views.base import RestView +from ..controllers.space import SpaceController, ApartmentController, CommonAreaController, ServiceAreaController, SpaceFunctionController + + +class SpaceView(RestView): + """View for space""" + def get_controller(self): + return SpaceController() + +class ApartmentView(RestView): + """View for Apartment""" + def get_controller(self): + return ApartmentController() + +class CommonAreaView(RestView): + """View for Common Area""" + def get_controller(self): + return CommonAreaController() + +class ServiceAreaView(RestView): + """View for Service Area""" + def get_controller(self): + return ServiceAreaController() + +class SpaceFunctionView(RestView): + """View for Space Function""" + def get_controller(self): + return SpaceFunctionController() -- GitLab From 969981c4b8686350b5bd9afd8ca683bd3ee2ff29 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 13:32:47 -0500 Subject: [PATCH 06/30] Create space area when area id and area type are specified. --- app/controllers/space.py | 47 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index b586b0b..be333f1 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -7,7 +7,7 @@ from ..models.space import Space, Apartment, CommonArea, ServiceArea, SpaceFunct class SpaceController(RestController): - """The space controller.""" + """Space controller.""" Model = Space def get_form(self, filter_data): @@ -16,6 +16,51 @@ class SpaceController(RestController): """ return SpaceForm + def post(self, data, filter_data): + """ + Create space in an area if area_id and area_type are specified + """ + dictionary = super(SpaceController, self).post(data, filter_data) + if ('area_id' in filter_data and 'area_type' in filter_data): + spacearea = { + 'space_id': dictionary['id'], + 'space_child_id':filter_data['area_id'], + 'space_child_type':filter_data['area_type']} + space_area = SpaceFunctionController().post(spacearea) + return dictionary + + def index(self, filter_data): + pass + +class AreaController(RestController): + """Parent controllers for areas""" + + AreaType = None + def index(self, filter_data): + """List all areas of this type and filter by building_id""" + pass + + def post(self, data, filter_data): + """Create new area""" + pass + + def put(self, id_, data, filter_data): + """Update Area""" + pass + + def get(self, id_, filter_data): + """Get area if verbosity on get spaces for area""" + if(filter_data['verbosity']): + query = ''' + SELECT * from spaces.spacefunction + JOIN spaces.space on spaces.spacefunction.space_id = spaces.space.id + WHERE spaces.spacefunction.space_child_id={} AND spaces.spacefunction.space_child_type={} + '''.format(id_, 'apartment') + results = self.db.session.execute(query) + return [dict(row) for row in results] + model = self.query_by_id(id_, filter_data) + return model.get_dictionary() + class ApartmentController(RestController): """Apartment Controller""" -- GitLab From 85386f401a0188913fa3704f61f5c4bcd69df589 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 16:28:28 -0500 Subject: [PATCH 07/30] Change space function to space area and update space controller. --- app/controllers/space.py | 86 +++++++++++++++++++++------------------- app/forms/space.py | 10 ++--- app/models/space.py | 6 +-- 3 files changed, 53 insertions(+), 49 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index be333f1..d977d1f 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -1,9 +1,10 @@ """Space controllers""" from flask import g from werkzeug.exceptions import BadRequest +from app.lib.database import db from .base import RestController -from ..forms.space import SpaceForm, ApartmentForm, CommonAreaForm, ServiceAreaForm, SpaceFunctionForm -from ..models.space import Space, Apartment, CommonArea, ServiceArea, SpaceFunction +from ..forms.space import SpaceForm, ApartmentForm, CommonAreaForm, ServiceAreaForm, SpaceAreaForm +from ..models.space import Space, Apartment, CommonArea, ServiceArea, SpaceArea class SpaceController(RestController): @@ -21,50 +22,47 @@ class SpaceController(RestController): Create space in an area if area_id and area_type are specified """ dictionary = super(SpaceController, self).post(data, filter_data) - if ('area_id' in filter_data and 'area_type' in filter_data): - spacearea = { + if 'area' in data: + space_area_data = { 'space_id': dictionary['id'], - 'space_child_id':filter_data['area_id'], - 'space_child_type':filter_data['area_type']} - space_area = SpaceFunctionController().post(spacearea) + 'space_child_id': data['area']['area_id'], + 'space_child_type':data['area']['area_type']} + SpaceAreaController().post(space_area_data) return dictionary - def index(self, filter_data): - pass - -class AreaController(RestController): - """Parent controllers for areas""" - - AreaType = None - def index(self, filter_data): - """List all areas of this type and filter by building_id""" - pass - - def post(self, data, filter_data): - """Create new area""" - pass - - def put(self, id_, data, filter_data): - """Update Area""" - pass - def get(self, id_, filter_data): - """Get area if verbosity on get spaces for area""" - if(filter_data['verbosity']): - query = ''' - SELECT * from spaces.spacefunction - JOIN spaces.space on spaces.spacefunction.space_id = spaces.space.id - WHERE spaces.spacefunction.space_child_id={} AND spaces.spacefunction.space_child_type={} - '''.format(id_, 'apartment') - results = self.db.session.execute(query) - return [dict(row) for row in results] - model = self.query_by_id(id_, filter_data) - return model.get_dictionary() - + dictionary = super(SpaceController, self).get(id_, filter_data) + if 'verbose' in filter_data: + # Load the area information for space + space_area_data = db.session.query(SpaceArea)\ + .filter( + SpaceArea.space_id == id_)\ + .first() + dictionary['area'] = { + 'area_id':space_area_data['area_id'], + 'area_type': space_area_data['area_type']} + return dictionary class ApartmentController(RestController): """Apartment Controller""" Model = Apartment + filters = { + 'building_id': lambda d: Apartment.building_id == d['building_id'], + } + + def get(self, id_, filter_data): + """Get area and if verbosity on get spaces for area""" + dictionary = super(ApartmentController, self).get(id_, filter_data) + if 'verbosity' in filter_data: + # Load space_areas for area + space_areas = db.session.query(SpaceArea)\ + .filter( + SpaceArea.area_id == id_, + SpaceArea.area_type == 'apartment')\ + .all() + + # Load spaces + return dictionary def get_form(self, filter_data): return ApartmentForm @@ -72,6 +70,9 @@ class ApartmentController(RestController): class CommonAreaController(RestController): """Common Area Controller""" Model = CommonArea + filters = { + 'building_id': lambda d: CommonArea.building_id == d['building_id'], + } def get_form(self, filter_data): return CommonAreaForm @@ -79,13 +80,16 @@ class CommonAreaController(RestController): class ServiceAreaController(RestController): """Service Area Controller""" Model = ServiceArea + filters = { + 'building_id': lambda d: ServiceArea.building_id == d['building_id'], + } def get_form(self, filter_data): return ServiceAreaForm -class SpaceFunctionController(RestController): +class SpaceAreaController(RestController): """Space Function Controller""" - Model = SpaceFunction + Model = SpaceArea def get_form(self, filter_data): - return SpaceFunctionForm + return SpaceAreaForm diff --git a/app/forms/space.py b/app/forms/space.py index 60178d2..de8d465 100644 --- a/app/forms/space.py +++ b/app/forms/space.py @@ -12,7 +12,7 @@ class SpaceForm(UserForm, Form): floor = wtf.StringField() class ApartmentForm(Form): # pylint: disable=too-few-public-methods - """Apartment Form """ + """Apartment Form""" building_id = wtf.IntegerField() number = wtf.StringField() number_of_bedrooms = wtf.IntegerField() @@ -27,8 +27,8 @@ class CommonAreaForm(Form): """Common Area Form""" building_id = wtf.IntegerField() -class SpaceFunctionForm(Form): - """Space Function Form""" +class SpaceAreaForm(Form): + """Space Area Form""" space_id = wtf.IntegerField() - space_child_id = wtf.IntegerField() - space_child_type = wtf.StringField() + area_id = wtf.IntegerField() + area_type = wtf.StringField() diff --git a/app/models/space.py b/app/models/space.py index 46cf347..88b85d0 100644 --- a/app/models/space.py +++ b/app/models/space.py @@ -47,9 +47,9 @@ class CommonArea(SpacesSchema, User, Model, db.Model): time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) time_modified = db.Column(db.DateTime) -class SpaceFunction(SpacesSchema, db.Model): +class SpaceArea(SpacesSchema, db.Model): """Model for associating spaces to space metadata""" space_id = db.Columb(db.Integer) # FIXME: Foregin key to spaces - space_child_id = db.Column(db.Integer) # FIXME: Foregin key to space child - space_child_type = db.Column(db.String(64)) + area_id = db.Column(db.Integer) # FIXME: Foregin key to space child + area_type = db.Column(db.String(64)) -- GitLab From 42947d6e3d1beaa0e674935327040b143ff87168 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 16:49:13 -0500 Subject: [PATCH 08/30] Add verbosity flag to apartment get. --- app/controllers/space.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index d977d1f..f37abc1 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -54,14 +54,18 @@ class ApartmentController(RestController): """Get area and if verbosity on get spaces for area""" dictionary = super(ApartmentController, self).get(id_, filter_data) if 'verbosity' in filter_data: - # Load space_areas for area + # Load space_areas for area to get space ids space_areas = db.session.query(SpaceArea)\ .filter( SpaceArea.area_id == id_, SpaceArea.area_type == 'apartment')\ .all() - - # Load spaces + space_ids = (space_area.space_id for space_area in space_areas) + # Load spaces for area + spaces = db.session.query(Space)\ + .filter(Space.id.in_(space_ids))\ + .all() + dictionary['spaces'] = [space.get_dictionary() for space in spaces] return dictionary def get_form(self, filter_data): -- GitLab From c55115b66219ed7dd60201e6bc1cbea42be6c543 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 16:52:39 -0500 Subject: [PATCH 09/30] Add verbosity to service area controller and common area controller. --- app/controllers/space.py | 42 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index f37abc1..2940ced 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -50,6 +50,9 @@ class ApartmentController(RestController): 'building_id': lambda d: Apartment.building_id == d['building_id'], } + def get_form(self, filter_data): + return ApartmentForm + def get(self, id_, filter_data): """Get area and if verbosity on get spaces for area""" dictionary = super(ApartmentController, self).get(id_, filter_data) @@ -68,9 +71,6 @@ class ApartmentController(RestController): dictionary['spaces'] = [space.get_dictionary() for space in spaces] return dictionary - def get_form(self, filter_data): - return ApartmentForm - class CommonAreaController(RestController): """Common Area Controller""" Model = CommonArea @@ -81,6 +81,24 @@ class CommonAreaController(RestController): def get_form(self, filter_data): return CommonAreaForm + def get(self, id_, filter_data): + """Get area and if verbosity on get spaces for area""" + dictionary = super(CommonAreaController, self).get(id_, filter_data) + if 'verbosity' in filter_data: + # Load space_areas for area to get space ids + space_areas = db.session.query(SpaceArea)\ + .filter( + SpaceArea.area_id == id_, + SpaceArea.area_type == 'common_area')\ + .all() + space_ids = (space_area.space_id for space_area in space_areas) + # Load spaces for area + spaces = db.session.query(Space)\ + .filter(Space.id.in_(space_ids))\ + .all() + dictionary['spaces'] = [space.get_dictionary() for space in spaces] + return dictionary + class ServiceAreaController(RestController): """Service Area Controller""" Model = ServiceArea @@ -91,6 +109,24 @@ class ServiceAreaController(RestController): def get_form(self, filter_data): return ServiceAreaForm + def get(self, id_, filter_data): + """Get area and if verbosity on get spaces for area""" + dictionary = super(ServiceAreaController, self).get(id_, filter_data) + if 'verbosity' in filter_data: + # Load space_areas for area to get space ids + space_areas = db.session.query(SpaceArea)\ + .filter( + SpaceArea.area_id == id_, + SpaceArea.area_type == 'service_area')\ + .all() + space_ids = (space_area.space_id for space_area in space_areas) + # Load spaces for area + spaces = db.session.query(Space)\ + .filter(Space.id.in_(space_ids))\ + .all() + dictionary['spaces'] = [space.get_dictionary() for space in spaces] + return dictionary + class SpaceAreaController(RestController): """Space Function Controller""" Model = SpaceArea -- GitLab From 097f1ecee152bd7a2c392d37f7378832fd98c872 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 16:55:31 -0500 Subject: [PATCH 10/30] Use verbose instead of verbosity as filter parameter. --- app/controllers/space.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index 2940ced..cfe6120 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -54,9 +54,9 @@ class ApartmentController(RestController): return ApartmentForm def get(self, id_, filter_data): - """Get area and if verbosity on get spaces for area""" + """Get area and if verbose on get spaces for area""" dictionary = super(ApartmentController, self).get(id_, filter_data) - if 'verbosity' in filter_data: + if 'verbose' in filter_data: # Load space_areas for area to get space ids space_areas = db.session.query(SpaceArea)\ .filter( @@ -82,9 +82,9 @@ class CommonAreaController(RestController): return CommonAreaForm def get(self, id_, filter_data): - """Get area and if verbosity on get spaces for area""" + """Get area and if verbose on get spaces for area""" dictionary = super(CommonAreaController, self).get(id_, filter_data) - if 'verbosity' in filter_data: + if 'verbose' in filter_data: # Load space_areas for area to get space ids space_areas = db.session.query(SpaceArea)\ .filter( @@ -110,9 +110,9 @@ class ServiceAreaController(RestController): return ServiceAreaForm def get(self, id_, filter_data): - """Get area and if verbosity on get spaces for area""" + """Get area and if verbose on get spaces for area""" dictionary = super(ServiceAreaController, self).get(id_, filter_data) - if 'verbosity' in filter_data: + if 'verbose' in filter_data: # Load space_areas for area to get space ids space_areas = db.session.query(SpaceArea)\ .filter( -- GitLab From 5a0b24d5978115a77c8579f03d1fea3290f0657c Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 17:16:31 -0500 Subject: [PATCH 11/30] Remove space area from view. --- app/controllers/space.py | 2 +- app/views/space.py | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index cfe6120..ecc3155 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -33,7 +33,7 @@ class SpaceController(RestController): def get(self, id_, filter_data): dictionary = super(SpaceController, self).get(id_, filter_data) if 'verbose' in filter_data: - # Load the area information for space + # Load the space area information for space space_area_data = db.session.query(SpaceArea)\ .filter( SpaceArea.space_id == id_)\ diff --git a/app/views/space.py b/app/views/space.py index f70a14e..107679f 100644 --- a/app/views/space.py +++ b/app/views/space.py @@ -3,7 +3,7 @@ from flask import request from flask.ext.classy import route from werkzeug.exceptions import MethodNotAllowed from ..views.base import RestView -from ..controllers.space import SpaceController, ApartmentController, CommonAreaController, ServiceAreaController, SpaceFunctionController +from ..controllers.space import SpaceController, ApartmentController, CommonAreaController, ServiceAreaController class SpaceView(RestView): @@ -25,8 +25,3 @@ class ServiceAreaView(RestView): """View for Service Area""" def get_controller(self): return ServiceAreaController() - -class SpaceFunctionView(RestView): - """View for Space Function""" - def get_controller(self): - return SpaceFunctionController() -- GitLab From 9df32c92819f37b287c7ced9e69a743be235be61 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 17:19:02 -0500 Subject: [PATCH 12/30] Do not allow update to Service Area and Common Area. --- app/views/space.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/views/space.py b/app/views/space.py index 107679f..ea5d710 100644 --- a/app/views/space.py +++ b/app/views/space.py @@ -21,7 +21,13 @@ class CommonAreaView(RestView): def get_controller(self): return CommonAreaController() + def put(self, id_): + return MethodNotAllowed() + class ServiceAreaView(RestView): """View for Service Area""" def get_controller(self): return ServiceAreaController() + + def put(self, id_): + return MethodNotAllowed() -- GitLab From 8db45bc41795bb58f4361bec29d35e5b15d686b5 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 17:22:03 -0500 Subject: [PATCH 13/30] Register space related views. --- app/views/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/views/__init__.py b/app/views/__init__.py index d4b4060..f9b8bc1 100644 --- a/app/views/__init__.py +++ b/app/views/__init__.py @@ -5,7 +5,8 @@ from . import (bgroup, turk_hit, unapproved_point, unapproved_window_door, - unapproved_building_dimensions) + unapproved_building_dimensions, + space) def register(app): @@ -18,6 +19,10 @@ def register(app): bgroup.BGroupView.register(app) bgroup.BuildingBGroupView.register(app) bgroup_user_group.BGroupUserGroupView.register(app) + space.SpaceView.register(app) + space.ApartmentView.register(app) + space.CommonAreaView.register(app) + space.ServiceAreaView.register(app) turk_hit.TurkHitView.register(app) unapproved_point.UnapprovedPointView.register(app) unapproved_window_door.UnapprovedWindowDoorView.register(app) -- GitLab From 8794a6e0b266e99057aae719327fbb8945786601 Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 17:37:11 -0500 Subject: [PATCH 14/30] Add constraints to area forms. --- app/forms/space.py | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/app/forms/space.py b/app/forms/space.py index de8d465..6eddc0c 100644 --- a/app/forms/space.py +++ b/app/forms/space.py @@ -11,24 +11,44 @@ class SpaceForm(UserForm, Form): description = wtf.StringField() floor = wtf.StringField() -class ApartmentForm(Form): # pylint: disable=too-few-public-methods +class ApartmentForm(Form): """Apartment Form""" - building_id = wtf.IntegerField() - number = wtf.StringField() - number_of_bedrooms = wtf.IntegerField() - tenant_name = wtf.StringField() - tenant_heating_issue = wtf.StringField() + building_id = wtf.IntegerField( + validators=[wtf.validators.Required()] + ) + number = wtf.StringField( + validators=[wtf.validators.Optional()] + ) + number_of_bedrooms = wtf.IntegerField( + validators=[wtf.validators.Optional()] + ) + tenant_name = wtf.StringField( + validators=[wtf.validators.Optional()] + ) + tenant_heating_issue = wtf.StringField( + validators=[wtf.validators.Optional()] + ) class ServiceAreaForm(Form): """Service Area Form""" - building_id = wtf.IntegerField() + building_id = wtf.IntegerField( + validators=[wtf.validators.Required()] + ) class CommonAreaForm(Form): """Common Area Form""" - building_id = wtf.IntegerField() + building_id = wtf.IntegerField( + validators=[wtf.validators.Required()] + ) class SpaceAreaForm(Form): """Space Area Form""" - space_id = wtf.IntegerField() - area_id = wtf.IntegerField() - area_type = wtf.StringField() + space_id = wtf.IntegerField( + validators=[wtf.validators.Required()] + ) + area_id = wtf.IntegerField( + validators=[wtf.validators.Required()] + ) + area_type = wtf.StringField( + validators=[wtf.validators.Required()] + ) -- GitLab From 38e6ec0875d2697cf52fb13a5d2b8b613b994a5b Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Mon, 11 Dec 2017 17:39:40 -0500 Subject: [PATCH 15/30] Add velidators to space form. --- app/forms/space.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/app/forms/space.py b/app/forms/space.py index 6eddc0c..f31c954 100644 --- a/app/forms/space.py +++ b/app/forms/space.py @@ -5,11 +5,21 @@ from .base import Form, UserForm class SpaceForm(UserForm, Form): """Space Form""" - building_id = wtf.IntegerField() - conditioned = wtf.BooleanField() - orientation = wtf.StringField() - description = wtf.StringField() - floor = wtf.StringField() + building_id = wtf.IntegerField( + validators=[wtf.validators.Optional()] + ) + conditioned = wtf.BooleanField( + validators=[wtf.validators.Optional()] + ) + orientation = wtf.StringField( + validators=[wtf.validators.Optional()] + ) + description = wtf.StringField( + validators=[wtf.validators.Optional()] + ) + floor = wtf.StringField( + validators=[wtf.validators.Optional()] + ) class ApartmentForm(Form): """Apartment Form""" -- GitLab From b3a5f6e64d8d2a292411608879d93a68d8da51b9 Mon Sep 17 00:00:00 2001 From: Conrad Date: Wed, 13 Dec 2017 12:31:20 -0500 Subject: [PATCH 16/30] Fix formatting issues --- app/controllers/space.py | 20 +++++++++++++------- app/models/space.py | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index ecc3155..7cbcbb0 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -26,7 +26,8 @@ class SpaceController(RestController): space_area_data = { 'space_id': dictionary['id'], 'space_child_id': data['area']['area_id'], - 'space_child_type':data['area']['area_type']} + 'space_child_type': data['area']['area_type'], + } SpaceAreaController().post(space_area_data) return dictionary @@ -36,11 +37,13 @@ class SpaceController(RestController): # Load the space area information for space space_area_data = db.session.query(SpaceArea)\ .filter( - SpaceArea.space_id == id_)\ + SpaceArea.space_id == id_, + )\ .first() dictionary['area'] = { - 'area_id':space_area_data['area_id'], - 'area_type': space_area_data['area_type']} + 'area_id': space_area_data['area_id'], + 'area_type': space_area_data['area_type'], + } return dictionary class ApartmentController(RestController): @@ -61,7 +64,8 @@ class ApartmentController(RestController): space_areas = db.session.query(SpaceArea)\ .filter( SpaceArea.area_id == id_, - SpaceArea.area_type == 'apartment')\ + SpaceArea.area_type == 'apartment', + )\ .all() space_ids = (space_area.space_id for space_area in space_areas) # Load spaces for area @@ -89,7 +93,8 @@ class CommonAreaController(RestController): space_areas = db.session.query(SpaceArea)\ .filter( SpaceArea.area_id == id_, - SpaceArea.area_type == 'common_area')\ + SpaceArea.area_type == 'common_area', + )\ .all() space_ids = (space_area.space_id for space_area in space_areas) # Load spaces for area @@ -117,7 +122,8 @@ class ServiceAreaController(RestController): space_areas = db.session.query(SpaceArea)\ .filter( SpaceArea.area_id == id_, - SpaceArea.area_type == 'service_area')\ + SpaceArea.area_type == 'service_area', + )\ .all() space_ids = (space_area.space_id for space_area in space_areas) # Load spaces for area diff --git a/app/models/space.py b/app/models/space.py index 88b85d0..b9d761e 100644 --- a/app/models/space.py +++ b/app/models/space.py @@ -50,6 +50,6 @@ class CommonArea(SpacesSchema, User, Model, db.Model): class SpaceArea(SpacesSchema, db.Model): """Model for associating spaces to space metadata""" - space_id = db.Columb(db.Integer) # FIXME: Foregin key to spaces + space_id = db.Column(db.Integer) # FIXME: Foregin key to spaces area_id = db.Column(db.Integer) # FIXME: Foregin key to space child area_type = db.Column(db.String(64)) -- GitLab From 74b3371713eb2f02902a3588d82609d183701ebe Mon Sep 17 00:00:00 2001 From: Jose Contreras Date: Wed, 13 Dec 2017 12:43:02 -0500 Subject: [PATCH 17/30] Add primary key columns for spacearea table. --- app/models/space.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/space.py b/app/models/space.py index b9d761e..1ae5bfe 100644 --- a/app/models/space.py +++ b/app/models/space.py @@ -50,6 +50,6 @@ class CommonArea(SpacesSchema, User, Model, db.Model): class SpaceArea(SpacesSchema, db.Model): """Model for associating spaces to space metadata""" - space_id = db.Column(db.Integer) # FIXME: Foregin key to spaces - area_id = db.Column(db.Integer) # FIXME: Foregin key to space child - area_type = db.Column(db.String(64)) + space_id = db.Column(db.Integer, primary_key=True) # FIXME: Foregin key to spaces + area_id = db.Column(db.Integer, primary_key=True) # FIXME: Foregin key to space child + area_type = db.Column(db.String(64), primary_key=True) -- GitLab From 5b99fd145b3fd38ef3a5ccc0b34265f95b28cf98 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Wed, 13 Dec 2017 14:05:55 -0500 Subject: [PATCH 18/30] Change column names for space area --- app/controllers/space.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index 7cbcbb0..ae104e5 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -25,10 +25,10 @@ class SpaceController(RestController): if 'area' in data: space_area_data = { 'space_id': dictionary['id'], - 'space_child_id': data['area']['area_id'], - 'space_child_type': data['area']['area_type'], + 'area_id': data['area']['area_id'], + 'area_type': data['area']['area_type'], } - SpaceAreaController().post(space_area_data) + SpaceAreaController().post(space_area_data, []) return dictionary def get(self, id_, filter_data): -- GitLab From 24f407ecdf1dc6f40074242f2d05aa78afd91825 Mon Sep 17 00:00:00 2001 From: Conrad Date: Wed, 13 Dec 2017 14:06:27 -0500 Subject: [PATCH 19/30] Add index filter --- app/controllers/space.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/controllers/space.py b/app/controllers/space.py index 7cbcbb0..cd5a94f 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -75,6 +75,26 @@ class ApartmentController(RestController): dictionary['spaces'] = [space.get_dictionary() for space in spaces] return dictionary + def index(self, filter_data): + """Get area and if verbose on get spaces for area""" + dictionary = super(ApartmentController, self).index(filter_data) + if 'verbose' in filter_data: + for value in dictionary: + # Load space_areas for area to get space ids + space_areas = db.session.query(SpaceArea)\ + .filter( + SpaceArea.area_id == value['id'], + SpaceArea.area_type == 'apartment', + )\ + .all() + space_ids = (space_area.space_id for space_area in space_areas) + # Load spaces for area + spaces = db.session.query(Space)\ + .filter(Space.id.in_(space_ids))\ + .all() + value['spaces'] = [space.get_dictionary() for space in spaces] + return dictionary + class CommonAreaController(RestController): """Common Area Controller""" Model = CommonArea -- GitLab From ef958cb8b1edb1a86054131970003ac9a358e5cd Mon Sep 17 00:00:00 2001 From: Conrad Date: Wed, 13 Dec 2017 15:59:51 -0500 Subject: [PATCH 20/30] Add base model to spacearea --- app/models/space.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/space.py b/app/models/space.py index 1ae5bfe..d91f0b1 100644 --- a/app/models/space.py +++ b/app/models/space.py @@ -1,5 +1,5 @@ """Models associated to spaces""" -from .base import Model, User +from .base import Model, BaseModel, User from ..lib.database import db class SpacesSchema(): @@ -47,7 +47,7 @@ class CommonArea(SpacesSchema, User, Model, db.Model): time_created = db.Column(db.DateTime, server_default=db.text("timezone('utc'::text, now())")) time_modified = db.Column(db.DateTime) -class SpaceArea(SpacesSchema, db.Model): +class SpaceArea(SpacesSchema, BaseModel, db.Model): """Model for associating spaces to space metadata""" space_id = db.Column(db.Integer, primary_key=True) # FIXME: Foregin key to spaces -- GitLab From 056edfc5bd54acf84a18e9ffce0de993f9df4b24 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 14 Dec 2017 14:01:56 -0500 Subject: [PATCH 21/30] Filter in index --- app/controllers/space.py | 91 +++++++++++++++++----------------------- app/views/space.py | 10 ++--- 2 files changed, 43 insertions(+), 58 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index 958e6a6..9b48415 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -46,6 +46,22 @@ class SpaceController(RestController): } return dictionary +def add_verbose(area, area_type): + space_areas = db.session.query(SpaceArea)\ + .filter( + SpaceArea.area_id == area['id'], + SpaceArea.area_type == area_type, + )\ + .all() + space_ids = (space_area.space_id for space_area in space_areas) + # Load spaces for area + spaces = db.session.query(Space)\ + .filter(Space.id.in_(space_ids))\ + .all() + area['spaces'] = [space.get_dictionary() for space in spaces] + return area + + class ApartmentController(RestController): """Apartment Controller""" Model = Apartment @@ -60,39 +76,15 @@ class ApartmentController(RestController): """Get area and if verbose on get spaces for area""" dictionary = super(ApartmentController, self).get(id_, filter_data) if 'verbose' in filter_data: - # Load space_areas for area to get space ids - space_areas = db.session.query(SpaceArea)\ - .filter( - SpaceArea.area_id == id_, - SpaceArea.area_type == 'apartment', - )\ - .all() - space_ids = (space_area.space_id for space_area in space_areas) - # Load spaces for area - spaces = db.session.query(Space)\ - .filter(Space.id.in_(space_ids))\ - .all() - dictionary['spaces'] = [space.get_dictionary() for space in spaces] + add_verbose(dictionary, 'apartment') return dictionary def index(self, filter_data): """Get area and if verbose on get spaces for area""" dictionary = super(ApartmentController, self).index(filter_data) if 'verbose' in filter_data: - for value in dictionary: - # Load space_areas for area to get space ids - space_areas = db.session.query(SpaceArea)\ - .filter( - SpaceArea.area_id == value['id'], - SpaceArea.area_type == 'apartment', - )\ - .all() - space_ids = (space_area.space_id for space_area in space_areas) - # Load spaces for area - spaces = db.session.query(Space)\ - .filter(Space.id.in_(space_ids))\ - .all() - value['spaces'] = [space.get_dictionary() for space in spaces] + for area in dictionary: + add_verbose(area, 'apartment') return dictionary class CommonAreaController(RestController): @@ -109,21 +101,18 @@ class CommonAreaController(RestController): """Get area and if verbose on get spaces for area""" dictionary = super(CommonAreaController, self).get(id_, filter_data) if 'verbose' in filter_data: - # Load space_areas for area to get space ids - space_areas = db.session.query(SpaceArea)\ - .filter( - SpaceArea.area_id == id_, - SpaceArea.area_type == 'common_area', - )\ - .all() - space_ids = (space_area.space_id for space_area in space_areas) - # Load spaces for area - spaces = db.session.query(Space)\ - .filter(Space.id.in_(space_ids))\ - .all() - dictionary['spaces'] = [space.get_dictionary() for space in spaces] + add_verbose(dictionary, 'common_area') return dictionary + def index(self, filter_data): + """Get area and if verbose on get spaces for area""" + dictionary = super(CommonAreaController, self).index(filter_data) + if 'verbose' in filter_data: + for area in dictionary: + add_verbose(area, 'common_area') + return dictionary + + class ServiceAreaController(RestController): """Service Area Controller""" Model = ServiceArea @@ -138,19 +127,15 @@ class ServiceAreaController(RestController): """Get area and if verbose on get spaces for area""" dictionary = super(ServiceAreaController, self).get(id_, filter_data) if 'verbose' in filter_data: - # Load space_areas for area to get space ids - space_areas = db.session.query(SpaceArea)\ - .filter( - SpaceArea.area_id == id_, - SpaceArea.area_type == 'service_area', - )\ - .all() - space_ids = (space_area.space_id for space_area in space_areas) - # Load spaces for area - spaces = db.session.query(Space)\ - .filter(Space.id.in_(space_ids))\ - .all() - dictionary['spaces'] = [space.get_dictionary() for space in spaces] + add_verbose(dictionary, 'service_area') + return dictionary + + def index(self, filter_data): + """Get area and if verbose on get spaces for area""" + dictionary = super(ServiceAreaController, self).index(filter_data) + if 'verbose' in filter_data: + for area in dictionary: + add_verbose(area, 'service_area') return dictionary class SpaceAreaController(RestController): diff --git a/app/views/space.py b/app/views/space.py index ea5d710..c655926 100644 --- a/app/views/space.py +++ b/app/views/space.py @@ -2,21 +2,21 @@ from flask import request from flask.ext.classy import route from werkzeug.exceptions import MethodNotAllowed -from ..views.base import RestView +from ..views.base import UnprotectedRestView from ..controllers.space import SpaceController, ApartmentController, CommonAreaController, ServiceAreaController -class SpaceView(RestView): +class SpaceView(UnprotectedRestView): """View for space""" def get_controller(self): return SpaceController() -class ApartmentView(RestView): +class ApartmentView(UnprotectedRestView): """View for Apartment""" def get_controller(self): return ApartmentController() -class CommonAreaView(RestView): +class CommonAreaView(UnprotectedRestView): """View for Common Area""" def get_controller(self): return CommonAreaController() @@ -24,7 +24,7 @@ class CommonAreaView(RestView): def put(self, id_): return MethodNotAllowed() -class ServiceAreaView(RestView): +class ServiceAreaView(UnprotectedRestView): """View for Service Area""" def get_controller(self): return ServiceAreaController() -- GitLab From 71e623bb4eb4205ad27f7fb65e19f3acd1c2c3ce Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 14 Dec 2017 15:42:30 -0500 Subject: [PATCH 22/30] Fix join space table --- app/controllers/space.py | 56 +++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index 9b48415..d4eccb0 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -46,20 +46,27 @@ class SpaceController(RestController): } return dictionary -def add_verbose(area, area_type): - space_areas = db.session.query(SpaceArea)\ - .filter( - SpaceArea.area_id == area['id'], - SpaceArea.area_type == area_type, - )\ - .all() - space_ids = (space_area.space_id for space_area in space_areas) - # Load spaces for area - spaces = db.session.query(Space)\ - .filter(Space.id.in_(space_ids))\ - .all() - area['spaces'] = [space.get_dictionary() for space in spaces] - return area + +def add_verbose(model, building_id): + q = db.session.query(model, SpaceArea, Space) \ + .join(SpaceArea, SpaceArea.area_id == model.id) \ + .join(Space, Space.id == SpaceArea.space_id) \ + .filter(model.building_id == building_id) \ + .order_by(model.id.asc()) + query = q.all() + + results = {} + for m in query: + model_result = m[0] + space_area_result = m[1] + + if model_result.id not in results: + results[model_result.id] = model_result.get_dictionary() + results[model_result.id]['spaces'] = [] + + results[model_result.id]['spaces'].append(space_area_result.get_dictionary()) + + return [v for k, v in results.items()] class ApartmentController(RestController): @@ -81,11 +88,10 @@ class ApartmentController(RestController): def index(self, filter_data): """Get area and if verbose on get spaces for area""" - dictionary = super(ApartmentController, self).index(filter_data) if 'verbose' in filter_data: - for area in dictionary: - add_verbose(area, 'apartment') - return dictionary + return add_verbose(self.Model, filter_data['building_id']) + return super(ApartmentController, self).index(filter_data) + class CommonAreaController(RestController): """Common Area Controller""" @@ -105,12 +111,9 @@ class CommonAreaController(RestController): return dictionary def index(self, filter_data): - """Get area and if verbose on get spaces for area""" - dictionary = super(CommonAreaController, self).index(filter_data) if 'verbose' in filter_data: - for area in dictionary: - add_verbose(area, 'common_area') - return dictionary + return add_verbose(self.Model, filter_data['building_id']) + return super(CommonAreaController, self).index(filter_data) class ServiceAreaController(RestController): @@ -132,11 +135,10 @@ class ServiceAreaController(RestController): def index(self, filter_data): """Get area and if verbose on get spaces for area""" - dictionary = super(ServiceAreaController, self).index(filter_data) if 'verbose' in filter_data: - for area in dictionary: - add_verbose(area, 'service_area') - return dictionary + return add_verbose(self.Model, filter_data['building_id']) + return super(ServiceAreaController, self).index(filter_data) + class SpaceAreaController(RestController): """Space Function Controller""" -- GitLab From 17a00777860f62d9174e760142b2d0c544704c27 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 14 Dec 2017 15:45:33 -0500 Subject: [PATCH 23/30] Remove loop for space results --- app/controllers/space.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index d4eccb0..3fc51a0 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -66,7 +66,7 @@ def add_verbose(model, building_id): results[model_result.id]['spaces'].append(space_area_result.get_dictionary()) - return [v for k, v in results.items()] + return list(results.values()) class ApartmentController(RestController): -- GitLab From 6b0c27488b6bef1823edf654981307c27341eaf9 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 14 Dec 2017 15:46:13 -0500 Subject: [PATCH 24/30] Remove order by in add_verbose --- app/controllers/space.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index 3fc51a0..f283254 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -51,8 +51,7 @@ def add_verbose(model, building_id): q = db.session.query(model, SpaceArea, Space) \ .join(SpaceArea, SpaceArea.area_id == model.id) \ .join(Space, Space.id == SpaceArea.space_id) \ - .filter(model.building_id == building_id) \ - .order_by(model.id.asc()) + .filter(model.building_id == building_id) query = q.all() results = {} -- GitLab From ee106df358627b2a271bbaa26056f471b69c49f6 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 14 Dec 2017 15:47:50 -0500 Subject: [PATCH 25/30] Get space results instead of space area table --- app/controllers/space.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index f283254..5259bda 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -57,7 +57,7 @@ def add_verbose(model, building_id): results = {} for m in query: model_result = m[0] - space_area_result = m[1] + space_result = m[2] if model_result.id not in results: results[model_result.id] = model_result.get_dictionary() -- GitLab From a925b220220bac3d70095f1a026bddb54b851163 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Thu, 14 Dec 2017 15:48:27 -0500 Subject: [PATCH 26/30] Fix variable name --- app/controllers/space.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index 5259bda..bdceb8d 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -63,7 +63,7 @@ def add_verbose(model, building_id): results[model_result.id] = model_result.get_dictionary() results[model_result.id]['spaces'] = [] - results[model_result.id]['spaces'].append(space_area_result.get_dictionary()) + results[model_result.id]['spaces'].append(space_result.get_dictionary()) return list(results.values()) -- GitLab From ed1ca53ab0a9070e08427aa59d842278575f5ab7 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Fri, 15 Dec 2017 10:59:54 -0500 Subject: [PATCH 27/30] Filter by space area type --- app/controllers/space.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index bdceb8d..ef3ec73 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -51,7 +51,10 @@ def add_verbose(model, building_id): q = db.session.query(model, SpaceArea, Space) \ .join(SpaceArea, SpaceArea.area_id == model.id) \ .join(Space, Space.id == SpaceArea.space_id) \ - .filter(model.building_id == building_id) + .filter( + model.building_id == building_id and model, + SpaceArea.area_type == model.__table__.name + ) query = q.all() results = {} -- GitLab From ce0e1c5a99ff9d7a8e4bf947e4445601b2d23c1b Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Fri, 15 Dec 2017 11:00:51 -0500 Subject: [PATCH 28/30] Remove unused code --- app/controllers/space.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index ef3ec73..b2ce679 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -52,7 +52,7 @@ def add_verbose(model, building_id): .join(SpaceArea, SpaceArea.area_id == model.id) \ .join(Space, Space.id == SpaceArea.space_id) \ .filter( - model.building_id == building_id and model, + model.building_id == building_id, SpaceArea.area_type == model.__table__.name ) query = q.all() -- GitLab From 10acd250573d64c09d306ed088dabf1c7fd05928 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Fri, 15 Dec 2017 11:10:43 -0500 Subject: [PATCH 29/30] Add previous method add_verbose back for get routes --- app/controllers/space.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/app/controllers/space.py b/app/controllers/space.py index b2ce679..a8e42cb 100644 --- a/app/controllers/space.py +++ b/app/controllers/space.py @@ -47,7 +47,23 @@ class SpaceController(RestController): return dictionary -def add_verbose(model, building_id): +def add_verbose(area, area_type): + space_areas = db.session.query(SpaceArea)\ + .filter( + SpaceArea.area_id == area['id'], + SpaceArea.area_type == area_type, + )\ + .all() + space_ids = (space_area.space_id for space_area in space_areas) + # Load spaces for area + spaces = db.session.query(Space)\ + .filter(Space.id.in_(space_ids))\ + .all() + area['spaces'] = [space.get_dictionary() for space in spaces] + return area + + +def model_with_spaces(model, building_id): q = db.session.query(model, SpaceArea, Space) \ .join(SpaceArea, SpaceArea.area_id == model.id) \ .join(Space, Space.id == SpaceArea.space_id) \ @@ -91,7 +107,7 @@ class ApartmentController(RestController): def index(self, filter_data): """Get area and if verbose on get spaces for area""" if 'verbose' in filter_data: - return add_verbose(self.Model, filter_data['building_id']) + return model_with_spaces(self.Model, filter_data['building_id']) return super(ApartmentController, self).index(filter_data) @@ -114,7 +130,7 @@ class CommonAreaController(RestController): def index(self, filter_data): if 'verbose' in filter_data: - return add_verbose(self.Model, filter_data['building_id']) + return model_with_spaces(self.Model, filter_data['building_id']) return super(CommonAreaController, self).index(filter_data) @@ -138,7 +154,7 @@ class ServiceAreaController(RestController): def index(self, filter_data): """Get area and if verbose on get spaces for area""" if 'verbose' in filter_data: - return add_verbose(self.Model, filter_data['building_id']) + return model_with_spaces(self.Model, filter_data['building_id']) return super(ServiceAreaController, self).index(filter_data) -- GitLab From 3f62abd2a90ca46de80b38e4fcbbb3386f0c9e5d Mon Sep 17 00:00:00 2001 From: Conrad Date: Fri, 15 Dec 2017 16:43:22 -0500 Subject: [PATCH 30/30] Make number_of_bedrooms nullable --- app/forms/space.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/forms/space.py b/app/forms/space.py index f31c954..fb5cceb 100644 --- a/app/forms/space.py +++ b/app/forms/space.py @@ -2,6 +2,23 @@ import wtforms as wtf from .base import Form, UserForm +class NullableIntegerField(wtf.IntegerField): + """ + An IntegerField where the field can be null if the input data is an empty + string. + """ + + def process_formdata(self, valuelist): + if valuelist: + if valuelist[0] == '' or valuelist[0] is None: + self.data = None + else: + try: + self.data = int(valuelist[0]) + except ValueError: + self.data = None + raise ValueError(self.gettext('Not a valid integer value')) + class SpaceForm(UserForm, Form): """Space Form""" @@ -29,7 +46,7 @@ class ApartmentForm(Form): number = wtf.StringField( validators=[wtf.validators.Optional()] ) - number_of_bedrooms = wtf.IntegerField( + number_of_bedrooms = NullableIntegerField( validators=[wtf.validators.Optional()] ) tenant_name = wtf.StringField( -- GitLab