Re: Freeze break request: FAS API change: search users by email

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jun 10, 2016 at 06:19:04PM +0200, Pierre-Yves Chibon wrote:
> On Fri, Jun 10, 2016 at 09:56:04AM -0600, Kevin Fenzi wrote:
> > On Fri, 10 Jun 2016 11:41:41 +0200
> > Pierre-Yves Chibon <pingou@xxxxxxxxxxxx> wrote:
> > 
> > > Good Morning Everyone,
> > > 
> > > I would like to propose for consideration the following patch to FAS2:
> > > https://github.com/fedora-infra/fas/pull/165
> > > 
> > > The idea is to allow searching users via their email address instead
> > > of always relying on their nickname.
> > > 
> > > I have already adjusted stg to show the new behavior:
> > > https://admin.stg.fedoraproject.org/accounts/user/list/*redhat*?by_email=1&limit=10000
> > > vs
> > > https://admin.stg.fedoraproject.org/accounts/user/list/*redhat*?limit=10000
> > > 
> > > My only issue is: why aren't the user returned ordered by their nicks
> > > as it's asked for in the code.
> > > 
> > > This feature is/will be required for FMN :)
> > 
> > Is the idea to apply this on top of the hotfixes we have, or cut a new
> > fas release upstream to include this and the previous one?

Here is the diff of the new hotfix on the top of the existing one:

diff --git a/ roles/fas_server/files/user.py b/ roles/fas_server/files/user.py
index 0f246da..39ee443 100644
--- a/ roles/fas_server/files/user.py	
+++ b/ roles/fas_server/files/user.py	
@@ -603,13 +603,19 @@ If this is not expected, please contact admin@xxxxxxxxxxxxxxxxx and let them kno
     #@validate(validators=UserList())
     @identity.require(identity.not_anonymous())
     @expose(template="fas.templates.user.list", allow_json=True)
-    def list(self, search=u'a*', fields=None, limit=None):
+    def list(self, search=u'a*', fields=None, limit=None, status=None,
+            by_email=None, by_ircnick=None):
         '''List users
 
         :kwarg search: Limit the users returned by the search string.  * is a
             wildcard character.
         :kwarg fields: Fields to return in the json request.  Default is
             to return everything.
+        :kwargs status: if specified, only returns accounts with this status.
+        :kwargs by_email: if true or 1, the search is done by email instead of
+            nickname.
+        :kwargs by_ircnick: if true or 1, the search is done by ircnick instead
+            of nickname.
 
         This should be fixed up at some point.  Json data needs at least the
         following for fasClient to work::
@@ -668,8 +674,31 @@ If this is not expected, please contact admin@xxxxxxxxxxxxxxxxx and let them kno
                 onclause=PersonRolesTable.c.person_id==PeopleTable.c.id)\
                     .outerjoin(GroupsTable,
                     onclause=PersonRolesTable.c.group_id==GroupsTable.c.id)
-        stmt = select([joined_roles]).where(People.username.ilike(re_search))\
-                .order_by(People.username).limit(limit)
+
+        if str(by_email).lower() in ['1', 'true']:
+            if ur'%' in re_search:
+                stmt = select([joined_roles]).where(People.email.ilike(
+                    re_search)).order_by(People.username).limit(limit)
+            else:
+                stmt = select([joined_roles]).where(People.email==re_search)\
+                    .order_by(People.username).limit(limit)
+        elif str(by_ircnick).lower() in ['1', 'true']:
+            if ur'%' in re_search:
+                stmt = select([joined_roles]).where(People.ircnick.ilike(
+                    re_search)).order_by(People.username).limit(limit)
+            else:
+                stmt = select([joined_roles]).where(People.ircnick==re_search)\
+                    .order_by(People.username).limit(limit)
+        else:
+            if ur'%' in re_search:
+                stmt = select([joined_roles]).where(People.username.ilike(
+                    re_search)).order_by(People.username).limit(limit)
+            else:
+                stmt = select([joined_roles]).where(People.username==re_search)\
+                    .order_by(People.username).limit(limit)
+
+        if status is not None:
+            stmt = stmt.where(People.status==status)
         stmt.use_labels = True
         people = stmt.execute()
 
Pierre

Attachment: signature.asc
Description: PGP signature

_______________________________________________
infrastructure mailing list
infrastructure@xxxxxxxxxxxxxxxxxxxxxxx
https://lists.fedoraproject.org/admin/lists/infrastructure@xxxxxxxxxxxxxxxxxxxxxxx

[Index of Archives]     [Fedora Development]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]

  Powered by Linux