Skip to content

[Fixed #872] Filter Builds according to commit #3544

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Oct 31, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions readthedocs/restapi/views/model_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,13 @@ class BuildViewSetBase(UserSelectViewSet):
admin_serializer_class = BuildAdminSerializer
model = Build

def get_queryset(self):
Copy link
Member

@safwanrahman safwanrahman Feb 13, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you call super instead of making the queryset?
Something like

queryset = super(BuildViewSetBase, self).get_queryset()
commit = self.request.query_params.get('commit', None)
if commit is not None:
    query = query.filter(commit=commit)
    return query

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand and I have looked into it as to why you asked me to do so as well. Your assistance was very well appreciated and I have made the requested changes. You can review it if you wish @safwanrahman.

query = super(BuildViewSetBase, self).get_queryset()
commit = self.request.query_params.get('commit', None)
if commit is not None:
query = query.filter(commit=commit)
return query


class BuildViewSet(SettingsOverrideObject):

Expand Down
16 changes: 16 additions & 0 deletions readthedocs/rtd_tests/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,22 @@ def test_make_build_commands(self):
self.assertEqual(build['commands'][0]['run_time'], 5)
self.assertEqual(build['commands'][0]['description'], 'foo')

def test_build_filter_by_commit(self):
"""
Create a build with commit
Should return the list of builds according to the
commit query params
"""
get(Build, project_id=1, version_id=1, builder='foo', commit='test')
get(Build, project_id=2, version_id=1, builder='foo', commit='other')
client = APIClient()
api_user = get(User, staff=False, password='test')
client.force_authenticate(user=api_user)
resp = client.get('/api/v2/build/', {'commit': 'test'}, format='json')
self.assertEqual(resp.status_code, 200)
build = resp.data
self.assertEqual(len(build['results']), 1)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't realize this the other day but, is it OK to return a list of one element when we already know that it's going to be always one element?

I suppose it shouldn't be possible to have two different commits with the same hash, right? Although, what would happen for projects that are not git-based? SVN for example which are just plain numbers?

In that case, this endpoint will break (not because the code itself but in meaning, I think)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@humitos As per (build model)[https://github.com/rtfd/readthedocs.org/blob/master/readthedocs/builds/models.py#L430], the commit field is not unique. So theoritically there can be more than one build for same commit. Also, there can be multiple build for same commit like commit get deleted and forced pushed. So I think returning list of builds will be a better idea.

Regarding SVN, I actually do not know whats save in the commit field. Can you please elaborate?



class APITests(TestCase):
fixtures = ['eric.json', 'test_data.json']
Expand Down