#760 adds a sorting option to the browse projects page, allowing the user to sort by the date created
Merged 8 years ago by pingou. Opened 8 years ago by ryanlerch.
ryanlerch/pagure browseprojects  into  master

file modified
+14 -4
@@ -1353,7 +1353,7 @@ 

  

  def search_projects(

          session, username=None, fork=None, tags=None, pattern=None,

-         start=None, limit=None, count=False):

+         start=None, limit=None, count=False, sort=None):

      '''List existing projects

      '''

      projects = session.query(
@@ -1436,15 +1436,25 @@ 

              projects = projects.filter(

                  model.Project.name == pattern

              )

- 

      query = session.query(

          model.Project

      ).filter(

          model.Project.id.in_(projects.subquery())

-     ).order_by(

-         asc(func.lower(model.Project.name))

      )

  

+     if sort == 'latest':

+         query = query.order_by(

+             model.Project.date_created.desc()

+         )

+     elif sort == 'oldest':

+         query = query.order_by(

+             model.Project.date_created.asc()

+         )

+     else:

+         query = query.order_by(

+             asc(func.lower(model.Project.name))

+         )

+ 

      if start is not None:

          query = query.offset(start)

  

file modified
+1 -1
@@ -245,7 +245,7 @@ 

     bottom:0;

     background:#eee;

     width:100%;

-   margin-top:2px;

+   margin-top:10px;

  }

  

  /*@media (min-width:768px) {

@@ -19,7 +19,8 @@ 

          <small>{% if repo.description %}{{ repo.description }}{%else%}<span class="text-muted">no description<span>{% endif %}</small>

        </div>

        <div class="project_metadata">

-         <div style="text-align:right;" class="p-r-1 text-muted"><span title="Forks" data-toggle="tooltip"><span class="oi" data-glyph="fork"></span>{{repo.forks|count}}</span></div>

+         <span class="p-l-1"><small>created {{repo.date_created|humanize}}</small></span>

+         <div style="text-align:right;" class="p-r-1 text-muted pull-xs-right"><span title="Forks" data-toggle="tooltip"><span class="oi" data-glyph="fork"></span>{{repo.forks|count}}</span></div>

        </div>

      </div>

    </div>
@@ -54,10 +55,10 @@ 

  

  {% macro render_repos(

          list, total, pagetitle, page, title, count, id,

-         username=None, hide=True) %}

+         username=None, hide=True, sorting=None) %}

  

      <section class="project_list container p-t-2" id="{{ id }}">

-         <h2 class=" m-b-1">{{

+         <h2 class="m-b-1">{{

              title

              }} <span class="label label-default">{{ count }}</span>

              {%- if username -%}
@@ -68,9 +69,43 @@ 

              </a>

              {%- endif -%}

          </h2>

-         {% if total and total > 1 %}

-         {{ pagination_link(pagetitle, page, total) }}

-         {% endif %}

+         <div class="row">

+           <div class="col-sm-6">

+             {% if total and total > 1 %}

+             {{ pagination_link(pagetitle, page, total) }}

+             {% endif %}

+           </div>

+           <div class="col-sm-6 text-xs-right">

+             <span class="btn-group">

+               <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">

+                 Sort

+               </button>

+               <div class="dropdown-menu">

+                 <a class="dropdown-item" href="{{

+                     url_for('browse_projects') }}">

+                   {% if not sorting or sorting == 'name'%}

+                   <span class="oi" data-glyph="check"></span>

+                   {%endif%}

+                   Name

+                 </a>

+                 <a class="dropdown-item" href="{{

+                     url_for('browse_projects', sorting='latest') }}">

+                   {% if sorting == 'latest'%}

+                   <span class="oi" data-glyph="check"></span>

+                   {%endif%}

+                   Date Created (most recent first)

+                 </a>

+                 <a class="dropdown-item" href="{{

+                     url_for('browse_projects', sorting='oldest') }}">

+                   {% if sorting == 'oldest'%}

+                   <span class="oi" data-glyph="check"></span>

+                   {%endif%}

+                   Date Created (oldest first)

+                 </a>

+               </div>

+             </span>

+           </div>

+         </div>

          <div class="row">

              {{ render_row(list) }}

          </div>

file modified
+1 -1
@@ -21,7 +21,7 @@ 

    <div class="container">

      {{ render_repos(

          repos, total_page, 'page', page,

-         'All Projects', repos_length, 'repos', username) }}

+         'All Projects', repos_length, 'repos', username, sorting=sorting) }}

    </div>

  

  {% endblock %}

file modified
+5 -2
@@ -33,6 +33,7 @@ 

  def index():

      """ Front page of the application.

      """

+     sorting = flask.request.args.get('sorting') or None

      page = flask.request.args.get('page', 1)

      try:

          page = int(page)
@@ -48,12 +49,13 @@ 

          SESSION,

          fork=False,

          start=start,

-         limit=limit)

+         limit=limit,

+         sort=sorting)

+ 

      num_repos = pagure.lib.search_projects(

          SESSION,

          fork=False,

          count=True)

- 

      total_page = int(ceil(num_repos / float(limit)))

  

      if authenticated() and flask.request.path == '/':
@@ -66,6 +68,7 @@ 

          repos_length=num_repos,

          total_page=total_page,

          page=page,

+         sorting=sorting,

      )

  

  

@@ -57,7 +57,7 @@ 

          output = self.app.get('/')

          self.assertEqual(output.status_code, 200)

          self.assertIn(

-             '<h2 class=" m-b-1">All Projects '

+             '<h2 class="m-b-1">All Projects '

              '<span class="label label-default">0</span></h2>', output.data)

  

          tests.create_projects(self.session)
@@ -65,7 +65,7 @@ 

          output = self.app.get('/?page=abc')

          self.assertEqual(output.status_code, 200)

          self.assertIn(

-             '<h2 class=" m-b-1">All Projects '

+             '<h2 class="m-b-1">All Projects '

              '<span class="label label-default">2</span></h2>', output.data)

  

          # Add a 3rd project with a long description