diff --git a/api/funkwhale_api/requests/filters.py b/api/funkwhale_api/requests/filters.py index bf353e8ad075abb76f3a4fdc846d9d25b0a105f4..7d06033629280bfd212608573b1dcea7ad04697c 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 c298524306caa9bc7f4cd6e9eb1f4abbb2d4bde0..d08dd4004f9ea34e943ac7e61a5783f4a7e7fcd3 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 0000000000000000000000000000000000000000..60e740d738670724a9a3722107a3b30a47b4f89a --- /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 507ecd269cadb7897299ee7ab015bf9f90d0a2b4..fb5cc87cebdb9c7c69b2b6557c476070f4aac62e 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 4464031c5e6918d0b9222922687fdc8e2fc59abc..130214c3a530d2f19b274576e2e58a65ec70ee07 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 a2bf781956a3350d514d108f5a8812be2e5f6156..2e06bda99b7869d1af9a823451875fd14a81dcf1 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: [ ]