From 394a13d59070dd80a248f8429d7565496ef2df40 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: May 21 2015 14:10:44 +0000 Subject: Support groups when searching an user's projects --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 5dcf58e..b63a71f 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1023,17 +1023,54 @@ def search_projects( '''List existing projects ''' projects = session.query( - model.Project - ).order_by( - model.Project.date_created + sqlalchemy.distinct(model.Project.id) ) if username is not None: projects = projects.filter( - model.User.user == username + # User created the project + sqlalchemy.and_( + model.User.user == username, + model.User.id == model.Project.user_id, + ) + ) + q2 = session.query( + model.Project.id ).filter( - model.User.id == model.Project.user_id + # User got commit right + sqlalchemy.and_( + model.User.user == username, + model.User.id == model.ProjectUser.user_id, + model.ProjectUser.project_id == model.Project.id + ) + ) + q3 = session.query( + model.Project.id + ).filter( + # User created a group that has commit right + sqlalchemy.and_( + model.User.user == username, + model.PagureGroup.user_id == model.User.id, + model.PagureGroup.group_type == 'user', + model.PagureGroup.id == model.ProjectGroup.group_id, + model.Project.id == model.ProjectGroup.project_id, + ) ) + q4 = session.query( + model.Project.id + ).filter( + # User is part of a group that has commit right + sqlalchemy.and_( + model.User.user == username, + model.PagureUserGroup.user_id == model.User.id, + model.PagureUserGroup.group_id == model.PagureGroup.id, + model.PagureGroup.group_type == 'user', + model.PagureGroup.id == model.ProjectGroup.group_id, + model.Project.id == model.ProjectGroup.project_id, + ) + ) + + projects = projects.union(q2).union(q3).union(q4) if fork is not None: if fork is True: @@ -1045,16 +1082,24 @@ def search_projects( model.Project.parent_id == None ) + query = session.query( + model.Project + ).filter( + model.Project.id.in_(projects.subquery()) + ).order_by( + model.Project.date_created + ) + if start is not None: - projects = projects.offset(start) + query = query.offset(start) if limit is not None: - projects = projects.limit(limit) + query = query.limit(limit) if count: - return projects.count() + return query.count() else: - return projects.all() + return query.all() def get_project(session, name, user=None):