diff --git a/astakosclient/astakosclient/__init__.py b/astakosclient/astakosclient/__init__.py index 50e297106dd711e88d26bd516f60e3ed30ad32dd..141b83df8f1a2a948647ac3b5dba96c1c2232def 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 a945b2f6c761ee91a2bdf93370bc06226a8d77b0..21a62b4e9181a81138fc15b9d33472abad1eaa22 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 479ffd3a5870bf868544638b6929db93549148b1..c1589f2182b20a061b82b5d2b77c2a3363c65b32 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 4a6249017f5c40fdfeebbdf72cab7ba40c77f151..47c922eebc13f45a810048afaac4dc2b617cd1eb 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: