From c7da489991eb7c065b16bbbc98e3b6bc62d8488b Mon Sep 17 00:00:00 2001 From: Giorgos Korfiatis Date: Mon, 10 Feb 2014 18:44:48 +0200 Subject: [PATCH] astakos: Add member mode in GET projects Get only active projects where request user is an active member if mode is set to `member'. --- astakosclient/astakosclient/__init__.py | 6 +++++- astakosclient/docs/index.rst | 2 +- snf-astakos-app/astakos/api/projects.py | 26 +++++++++++++++++-------- snf-astakos-app/astakos/im/models.py | 5 +++++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/astakosclient/astakosclient/__init__.py b/astakosclient/astakosclient/__init__.py index 50e297106..141b83df8 100644 --- a/astakosclient/astakosclient/__init__.py +++ b/astakosclient/astakosclient/__init__.py @@ -804,13 +804,15 @@ class AstakosClient(object): # ---------------------------- # do a GET to ``API_PROJECTS`` - def get_projects(self, name=None, state=None, owner=None): + def get_projects(self, name=None, state=None, owner=None, mode=None): """Retrieve all accessible projects Arguments: name -- filter by name (optional) state -- filter by state (optional) owner -- filter by owner (optional) + mode -- if value is 'member', return only active projects in which + the request user is an active member In case of success, return a list of project descriptions. """ @@ -821,6 +823,8 @@ class AstakosClient(object): filters["state"] = state if owner is not None: filters["owner"] = owner + if mode is not None: + filters["mode"] = mode req_headers = {'content-type': 'application/json'} req_body = (parse_request({"filter": filters}, self.logger) if filters else None) diff --git a/astakosclient/docs/index.rst b/astakosclient/docs/index.rst index a945b2f6c..21a62b4e9 100644 --- a/astakosclient/docs/index.rst +++ b/astakosclient/docs/index.rst @@ -189,7 +189,7 @@ retry=0, use_pool=False, pool_size=8, logger=None\ **)** rejected and which failed to resolved. Otherwise raise an AstakosClientException exception. - **get_projects(**\ name=None, state=None, owner=None\ **)** + **get_projects(**\ name=None, state=None, owner=None, mode=None\ **)** Retrieve all accessible projects **get_project(**\ project_id\ **)** diff --git a/snf-astakos-app/astakos/api/projects.py b/snf-astakos-app/astakos/api/projects.py index 479ffd3a5..c1589f218 100644 --- a/snf-astakos-app/astakos/api/projects.py +++ b/snf-astakos-app/astakos/api/projects.py @@ -281,23 +281,33 @@ def get_projects(request): user = request.user input_data = read_json_body(request, default={}) filters = input_data.get("filter", {}) + mode = input_data.get("mode", "default") query = make_project_query(filters) - projects = _get_projects(query, request_user=user) + projects = _get_projects(query, mode=mode, request_user=user) data = get_projects_details(projects, request_user=user) return json_response(data) -def _get_projects(query, request_user=None): +def _get_projects(query, mode="default", request_user=None): projects = Project.objects.filter(query) - if not request_user.is_project_admin(): - membs = request_user.projectmembership_set.any_accepted() + if mode == "member": + membs = request_user.projectmembership_set.\ + actually_accepted_and_active() memb_projects = membs.values_list("project", flat=True) is_memb = Q(id__in=memb_projects) - owned = Q(owner=request_user) - active = (Q(state=Project.NORMAL) & - Q(private=False)) - projects = projects.filter(is_memb | owned | active) + projects = projects.filter(is_memb) + elif mode == "default": + if not request_user.is_project_admin(): + membs = request_user.projectmembership_set.any_accepted() + memb_projects = membs.values_list("project", flat=True) + is_memb = Q(id__in=memb_projects) + owned = Q(owner=request_user) + active = (Q(state=Project.NORMAL) & + Q(private=False)) + projects = projects.filter(is_memb | owned | active) + else: + raise faults.BadRequest("Unrecognized mode '%s'." % mode) return projects.select_related("last_application") diff --git a/snf-astakos-app/astakos/im/models.py b/snf-astakos-app/astakos/im/models.py index 4a6249017..47c922eeb 100644 --- a/snf-astakos-app/astakos/im/models.py +++ b/snf-astakos-app/astakos/im/models.py @@ -1892,6 +1892,11 @@ class ProjectMembershipManager(models.Manager): q &= Q(project__in=projects) return self.filter(q) + def actually_accepted_and_active(self): + q = self.model.Q_ACTUALLY_ACCEPTED + q &= Q(project__state=Project.NORMAL) + return self.filter(q) + def initialized(self, projects=None): q = Q(initialized=True) if projects is not None: -- GitLab