From 42a2ffbf24d2df0f29b423f14a2acd7195959d89 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Fri, 27 Apr 2018 22:23:25 +0200
Subject: [PATCH] Fix #109: List pending requests by default, added a status
 filter for requests

---
 api/funkwhale_api/requests/filters.py         |  8 +++++
 api/funkwhale_api/requests/models.py          |  1 +
 changes/changelog.d/109.enhancement           |  1 +
 front/src/components/library/Library.vue      |  6 +++-
 .../src/components/requests/RequestsList.vue  | 33 ++++++++++++++++---
 front/src/router/index.js                     |  2 +-
 6 files changed, 44 insertions(+), 7 deletions(-)
 create mode 100644 changes/changelog.d/109.enhancement

diff --git a/api/funkwhale_api/requests/filters.py b/api/funkwhale_api/requests/filters.py
index bf353e8a..7d060336 100644
--- a/api/funkwhale_api/requests/filters.py
+++ b/api/funkwhale_api/requests/filters.py
@@ -1,10 +1,18 @@
 import django_filters
 
+from funkwhale_api.common import fields
 from . import models
 
 
 class ImportRequestFilter(django_filters.FilterSet):
 
+    q = fields.SearchFilter(search_fields=[
+        'artist_name',
+        'user__username',
+        'albums',
+        'comment',
+    ])
+
     class Meta:
         model = models.ImportRequest
         fields = {
diff --git a/api/funkwhale_api/requests/models.py b/api/funkwhale_api/requests/models.py
index c2985243..d08dd400 100644
--- a/api/funkwhale_api/requests/models.py
+++ b/api/funkwhale_api/requests/models.py
@@ -15,6 +15,7 @@ STATUS_CHOICES = [
     ('closed', 'closed'),
 ]
 
+
 class ImportRequest(models.Model):
     creation_date = models.DateTimeField(default=timezone.now)
     imported_date = models.DateTimeField(null=True, blank=True)
diff --git a/changes/changelog.d/109.enhancement b/changes/changelog.d/109.enhancement
new file mode 100644
index 00000000..60e740d7
--- /dev/null
+++ b/changes/changelog.d/109.enhancement
@@ -0,0 +1 @@
+List pending requests by default, added a status filter for requests (#109)
diff --git a/front/src/components/library/Library.vue b/front/src/components/library/Library.vue
index 507ecd26..fb5cc87c 100644
--- a/front/src/components/library/Library.vue
+++ b/front/src/components/library/Library.vue
@@ -6,7 +6,11 @@
       <router-link class="ui item" to="/library/radios" exact><i18next path="Radios"/></router-link>
       <router-link class="ui item" to="/library/playlists" exact><i18next path="Playlists"/></router-link>
       <div class="ui secondary right menu">
-        <router-link v-if="$store.state.auth.authenticated" class="ui item" to="/library/requests/" exact>
+        <router-link
+          v-if="$store.state.auth.authenticated"
+          class="ui item"
+          :to="{name: 'library.requests', query: {status: 'pending' }}"
+          exact>
           <i18next path="Requests"/>
           <div class="ui teal label">{{ requestsCount }}</div>
         </router-link>
diff --git a/front/src/components/requests/RequestsList.vue b/front/src/components/requests/RequestsList.vue
index 4464031c..130214c3 100644
--- a/front/src/components/requests/RequestsList.vue
+++ b/front/src/components/requests/RequestsList.vue
@@ -8,6 +8,16 @@
             <label>{{ $t('Search') }}</label>
             <input type="text" v-model="query" placeholder="Enter an artist name, a username..."/>
           </div>
+          <div class="field">
+            <label>{{ $t('Status') }}</label>
+            <select class="ui dropdown" v-model="status">
+              <option :value="'any'">{{ $t('Any') }}</option>
+              <option :value="'pending'">{{ $t('Pending') }}</option>
+              <option :value="'accepted'">{{ $t('Accepted') }}</option>
+              <option :value="'imported'">{{ $t('Imported') }}</option>
+              <option :value="'closed'">{{ $t('Closed') }}</option>
+            </select>
+          </div>
           <div class="field">
             <label>{{ $t('Ordering') }}</label>
             <select class="ui dropdown" v-model="ordering">
@@ -81,7 +91,8 @@ const FETCH_URL = 'requests/import-requests/'
 export default {
   mixins: [OrderingMixin, PaginationMixin],
   props: {
-    defaultQuery: {type: String, required: false, default: ''}
+    defaultQuery: {type: String, required: false, default: ''},
+    defaultStatus: {required: false, default: 'any'}
   },
   components: {
     RequestCard,
@@ -96,7 +107,8 @@ export default {
       query: this.defaultQuery,
       paginateBy: parseInt(this.defaultPaginateBy || 12),
       orderingDirection: defaultOrdering.direction,
-      ordering: defaultOrdering.field
+      ordering: defaultOrdering.field,
+      status: this.defaultStatus || 'any'
     }
   },
   created () {
@@ -107,14 +119,18 @@ export default {
   },
   methods: {
     updateQueryString: _.debounce(function () {
-      this.$router.replace({
+      let query = {
         query: {
           query: this.query,
           page: this.page,
           paginateBy: this.paginateBy,
           ordering: this.getOrderingAsString()
         }
-      })
+      }
+      if (this.status !== 'any') {
+        query.query.status = this.status
+      }
+      this.$router.replace(query)
     }, 500),
     fetchData: _.debounce(function () {
       var self = this
@@ -123,9 +139,12 @@ export default {
       let params = {
         page: this.page,
         page_size: this.paginateBy,
-        search: this.query,
+        q: this.query,
         ordering: this.getOrderingAsString()
       }
+      if (this.status !== 'any') {
+        params.status = this.status
+      }
       logger.default.debug('Fetching request...')
       axios.get(url, {params: params}).then((response) => {
         self.result = response.data
@@ -165,6 +184,10 @@ export default {
     query () {
       this.updateQueryString()
       this.fetchData()
+    },
+    status () {
+      this.updateQueryString()
+      this.fetchData()
     }
   }
 }
diff --git a/front/src/router/index.js b/front/src/router/index.js
index a2bf7819..2e06bda9 100644
--- a/front/src/router/index.js
+++ b/front/src/router/index.js
@@ -212,7 +212,7 @@ export default new Router({
             defaultQuery: route.query.query,
             defaultPaginateBy: route.query.paginateBy,
             defaultPage: route.query.page,
-            defaultStatus: route.query.status || 'pending'
+            defaultStatus: route.query.status || 'any'
           }),
           children: [
           ]
-- 
GitLab