From 9ecd001f06b91c5aed9617dcc090f20144af478b Mon Sep 17 00:00:00 2001 From: astex <0astex@gmail.com> Date: Wed, 20 Apr 2016 11:23:19 -0400 Subject: [PATCH 1/2] Add a project_id filter to the address index. --- app/controllers/place.py | 22 ++++++++++++++-------- app/controllers/project.py | 3 +-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/app/controllers/place.py b/app/controllers/place.py index 12a6b6c..b870f7c 100644 --- a/app/controllers/place.py +++ b/app/controllers/place.py @@ -2,6 +2,7 @@ from werkzeug.exceptions import BadRequest from app.controllers.base import RestController from app.forms.place import AddressForm, PlaceForm +from app.models.project import Project from app.models.place import Address, Place @@ -11,20 +12,25 @@ class PlaceController(RestController): constant_fields = ['sales_force_id', 'address_id'] def get_form(self, filter_data): - """Return the Place form. - Args: - filter_data (dict) - """ + """Return the Place form.""" return PlaceForm class AddressController(RestController): """The Address controller.""" Model = Address + filters = { + 'project_id': lambda d: Project.id == d['project_id']} + + def query(self, filter_data): + """Construct a query with additional joins based on filter_data.""" + q = super(AddressController, self).query(filter_data) + if 'project_id' in filter_data: + q = q\ + .join(Place, Place.address_id == Address.id)\ + .join(Project, Project.place_id == Place.id) + return q def get_form(self, filter_data): - """Return the Address form. - Args: - filter_data (dict) - """ + """Return the Address form.""" return AddressForm diff --git a/app/controllers/project.py b/app/controllers/project.py index 878753e..cd2b798 100644 --- a/app/controllers/project.py +++ b/app/controllers/project.py @@ -27,8 +27,7 @@ class ProjectController(RestController): 'q': lambda d: and_(*[ Project.name.like('%{}%'.format(term)) for term in d['q'].split(' ') - ]) - } + ])} def get_form(self, filter_data): """Return the project form.""" -- GitLab From f8267ba34a77c70f65994407ba28d26fde9b7c72 Mon Sep 17 00:00:00 2001 From: astex <0astex@gmail.com> Date: Wed, 20 Apr 2016 11:23:34 -0400 Subject: [PATCH 2/2] Add a test for the project_id filter of the address index. --- app/tests/test_place.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/tests/test_place.py b/app/tests/test_place.py index 5aba1bc..a2c12d4 100644 --- a/app/tests/test_place.py +++ b/app/tests/test_place.py @@ -2,6 +2,7 @@ from sqlalchemy import and_ from app.lib.database import db from app.tests.base import RestTestCase +from app.models.project import Project from app.models.place import Place, Address @@ -103,6 +104,22 @@ class TestAddress(RestTestCase): model = self.env.address self._test_index() + def test_index_project_id(self): + """Tests /address/?project_id=... GET.""" + # Build a model that should be in the response. + project = self.env.project + model = db.session.query(Address)\ + .join(Place, Place.address_id == Address.id)\ + .join(Project, Project.place_id == Place.id)\ + .filter(Project.id == project.id)\ + .first() + # Build a model that should not be in the response. + _ = self.env.address + + response_data = self._test_index({'project_id': project.id}) + self.assertEquals(len(response_data), 1) + self.assertEquals(response_data[0]['id'], model.id) + def test_get(self): """Tests /address/ GET.""" model = self.env.address -- GitLab