diff --git a/pagure/api/project.py b/pagure/api/project.py index 57322b4..5590a1a 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -287,6 +287,10 @@ def api_projects(): | | | | returned depending if | | | | | they are forks or not | +---------------+----------+---------------+--------------------------+ + | ``short`` | boolean | Optional | | Whether to return the | + | | | | entrie project JSON | + | | | | or just a sub-set | + +---------------+----------+---------------+--------------------------+ Sample response ^^^^^^^^^^^^^^^ @@ -381,11 +385,16 @@ def api_projects(): namespace = flask.request.values.get('namespace', None) owner = flask.request.values.get('owner', None) pattern = flask.request.values.get('pattern', None) + short = flask.request.values.get('short', None) if str(fork).lower() in ['1', 'true']: fork = True elif str(fork).lower() in ['0', 'false']: fork = False + if str(short).lower() in ['1', 'true']: + short = True + else: + short = False private = False if authenticated() and username == flask.g.fas_user.username: @@ -399,16 +408,31 @@ def api_projects(): raise pagure.exceptions.APIError( 404, error_code=APIERROR.ENOPROJECTS) + if not short: + projects = [p.to_json(api=True, public=True) for p in projects] + else: + projects = [ + { + 'name': p.name, + 'namespace': p.namespace, + 'fullname': p.fullname.replace('forks/', 'fork/', 1) + if p.fullname.startswith('forks/') else p.fullname, + 'description': p.description, + } + for p in projects + ] + jsonout = flask.jsonify({ 'total_projects': len(projects), - 'projects': [p.to_json(api=True, public=True) for p in projects], + 'projects': projects, 'args': { 'tags': tags, 'username': username, 'fork': fork, 'pattern': pattern, 'namespace': namespace, - 'owner': owner + 'owner': owner, + 'short': short, } }) return jsonout diff --git a/pagure/templates/_browseheader.html b/pagure/templates/_browseheader.html index b28bd70..c9c2271 100644 --- a/pagure/templates/_browseheader.html +++ b/pagure/templates/_browseheader.html @@ -9,6 +9,9 @@ + {% if select == 'projects' %} + + {% endif %}
- {{browse_header(select=select)}} + {{ browse_header(select=select) }}
@@ -33,18 +33,23 @@ -{% if username %} - -{% endif %} - {% endblock %} diff --git a/pagure/ui/app.py b/pagure/ui/app.py index fc48bd2..0e0a332 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -158,6 +158,12 @@ def search(): stype = flask.request.args.get('type', 'projects') term = flask.request.args.get('term') page = flask.request.args.get('page', 1) + direct = flask.request.values.get('direct', None) + if str(direct).lower() in ['1', 'true']: + direct = True + else: + direct = False + try: page = int(page) if page < 1: @@ -165,6 +171,11 @@ def search(): except ValueError: page = 1 + if direct: + return flask.redirect( + flask.url_for('view_repo', repo='') + term + ) + if stype == 'projects': return flask.redirect(flask.url_for('view_projects', pattern=term)) elif stype == 'projects_forks': diff --git a/tests/test_pagure_flask_api_project.py b/tests/test_pagure_flask_api_project.py index a1e1eca..636d028 100644 --- a/tests/test_pagure_flask_api_project.py +++ b/tests/test_pagure_flask_api_project.py @@ -235,6 +235,107 @@ class PagureFlaskApiProjecttests(tests.Modeltests): data = json.loads(output.data) self.assertDictEqual(data, expected_rv) + def test_api_projects_pattern(self): + """ Test the api_projects method of the flask api. """ + tests.create_projects(self.session) + + output = self.app.get('/api/0/projects?pattern=test') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + data['projects'][0]['date_created'] = "1436527638" + expected_data = { + "args": { + "fork": None, + "namespace": None, + "owner": None, + "pattern": "test", + "short": False, + "tags": [], + "username": None + }, + "projects": [ + { + "access_groups": { + "admin": [], + "commit": [], + "ticket": [] + }, + "access_users": { + "admin": [], + "commit": [], + "owner": [ + "pingou" + ], + "ticket": [] + }, + "close_status": [ + "Invalid", + "Insufficient data", + "Fixed", + "Duplicate" + ], + "custom_keys": [], + "date_created": "1436527638", + "description": "test project #1", + "fullname": "test", + "id": 1, + "milestones": {}, + "name": "test", + "namespace": None, + "parent": None, + "priorities": {}, + "tags": [], + "user": { + "fullname": "PY C", + "name": "pingou" + } + } + ], + "total_projects": 1 + } + self.assertDictEqual(data, expected_data) + + def test_api_projects_pattern_short(self): + """ Test the api_projects method of the flask api. """ + tests.create_projects(self.session) + + output = self.app.get('/api/0/projects?pattern=te*&short=1') + self.assertEqual(output.status_code, 200) + data = json.loads(output.data) + expected_data = { + "args": { + "fork": None, + "namespace": None, + "owner": None, + "pattern": "te*", + "short": True, + "tags": [], + "username": None + }, + "projects": [ + { + "description": "test project #1", + "fullname": "test", + "name": "test", + "namespace": None + }, + { + "description": "test project #2", + "fullname": "test2", + "name": "test2", + "namespace": None + }, + { + "description": "namespaced test project", + "fullname": "somenamespace/test3", + "name": "test3", + "namespace": "somenamespace" + } + ], + "total_projects": 3 + } + self.assertDictEqual(data, expected_data) + def test_api_projects(self): """ Test the api_projects method of the flask api. """ tests.create_projects(self.session) @@ -272,6 +373,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "namespace": None, "owner": None, "pattern": None, + "short": False, "tags": ["infra"], "username": None }, @@ -323,6 +425,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "namespace": None, "owner": "pingou", "pattern": None, + "short": False, "tags": [], "username": None }, @@ -446,6 +549,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "namespace": None, "owner": None, "pattern": None, + "short": False, "tags": [], "username": "pingou" }, @@ -564,6 +668,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "namespace": None, "owner": None, "pattern": None, + "short": False, "tags": ["infra"], "username": "pingou", }, @@ -613,6 +718,7 @@ class PagureFlaskApiProjecttests(tests.Modeltests): "owner": None, "namespace": "somenamespace", "pattern": None, + "short": False, "tags": [], "username": None },