Skip to content

Commit 47c417f

Browse files
committed
Merges #505 Closes #505 Fixes #488
2 parents b9cc340 + f4b8342 commit 47c417f

File tree

15 files changed

+1157
-441
lines changed

15 files changed

+1157
-441
lines changed

sortinghat/core/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class Individual(EntityBase):
176176

177177
class Meta:
178178
db_table = 'individuals'
179+
ordering = ('last_modified',)
179180

180181
def __str__(self):
181182
return self.mk

sortinghat/core/schema.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from django_rq import enqueue
3636

3737
from graphene.types.generic import GenericScalar
38+
from graphene.utils.str_converters import to_snake_case
3839

3940
from graphene_django.converter import convert_django_field
4041
from graphene_django.types import DjangoObjectType
@@ -776,7 +777,8 @@ class SortingHatQuery:
776777
IdentityPaginatedType,
777778
page_size=graphene.Int(),
778779
page=graphene.Int(),
779-
filters=IdentityFilterType(required=False)
780+
filters=IdentityFilterType(required=False),
781+
order_by=graphene.String(required=False),
780782
)
781783
transactions = graphene.Field(
782784
TransactionPaginatedType,
@@ -839,8 +841,9 @@ def resolve_organizations(self, info, filters=None,
839841
def resolve_individuals(self, info, filters=None,
840842
page=1,
841843
page_size=settings.DEFAULT_GRAPHQL_PAGE_SIZE,
844+
order_by='mk',
842845
**kwargs):
843-
query = Individual.objects.order_by('mk')
846+
query = Individual.objects.order_by(to_snake_case(order_by))
844847

845848
if filters and 'uuid' in filters:
846849
indv_uuid = filters['uuid']

tests/test_schema.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,13 @@
450450
}
451451
}
452452
"""
453+
SH_INDIVIDUALS_ORDER_BY = """{
454+
individuals(orderBy: "%s") {
455+
entities {
456+
mk
457+
}
458+
}
459+
}"""
453460
SH_TRANSACTIONS_QUERY = """{
454461
transactions {
455462
entities {
@@ -2437,6 +2444,53 @@ def test_filter_country(self):
24372444
indv = individuals[0]
24382445
self.assertEqual(indv['profile']['country']['name'], 'United States of America')
24392446

2447+
def test_order_by_last_modified(self):
2448+
"""Check whether it returns the individuals ordered by last modified date"""
2449+
2450+
indv1 = Individual.objects.create(mk='a9b403e150dd4af8953a52a4bb841051e4b705d9')
2451+
indv2 = Individual.objects.create(mk='185c4b709e5446d250b4fde0e34b78a2b4fde0e3')
2452+
indv3 = Individual.objects.create(mk='c6d2504fde0e34b78a185c4b709e5442d045451c')
2453+
2454+
# Test default order by mk
2455+
client = graphene.test.Client(schema)
2456+
executed = client.execute(SH_INDIVIDUALS_ORDER_BY % 'mk',
2457+
context_value=self.context_value)
2458+
2459+
individuals = executed['data']['individuals']['entities']
2460+
2461+
indv = individuals[0]
2462+
self.assertEqual(indv['mk'], indv2.mk)
2463+
indv = individuals[1]
2464+
self.assertEqual(indv['mk'], indv1.mk)
2465+
indv = individuals[2]
2466+
self.assertEqual(indv['mk'], indv3.mk)
2467+
2468+
# Test ascending order
2469+
executed = client.execute(SH_INDIVIDUALS_ORDER_BY % 'lastModified',
2470+
context_value=self.context_value)
2471+
2472+
individuals = executed['data']['individuals']['entities']
2473+
2474+
indv = individuals[0]
2475+
self.assertEqual(indv['mk'], indv1.mk)
2476+
indv = individuals[1]
2477+
self.assertEqual(indv['mk'], indv2.mk)
2478+
indv = individuals[2]
2479+
self.assertEqual(indv['mk'], indv3.mk)
2480+
2481+
# Test descending order
2482+
executed = client.execute(SH_INDIVIDUALS_ORDER_BY % '-lastModified',
2483+
context_value=self.context_value)
2484+
2485+
individuals = executed['data']['individuals']['entities']
2486+
2487+
indv = individuals[0]
2488+
self.assertEqual(indv['mk'], indv3.mk)
2489+
indv = individuals[1]
2490+
self.assertEqual(indv['mk'], indv2.mk)
2491+
indv = individuals[2]
2492+
self.assertEqual(indv['mk'], indv1.mk)
2493+
24402494
def test_pagination(self):
24412495
"""Check whether it returns the individuals searched when using pagination"""
24422496

ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@vue/cli-plugin-vuex": "~4.3.0",
4242
"@vue/cli-service": "~4.3.0",
4343
"@vue/eslint-config-prettier": "^6.0.0",
44-
"@vue/test-utils": "1.0.0-beta.31",
44+
"@vue/test-utils": "1.1.2",
4545
"babel-eslint": "^10.1.0",
4646
"babel-preset-vue": "^2.0.2",
4747
"deepmerge": "^4.2.2",

ui/src/apollo/queries.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,14 @@ const GET_PAGINATED_INDIVIDUALS = gql`
9898
$page: Int!
9999
$pageSize: Int!
100100
$filters: IdentityFilterType
101+
$orderBy: String
101102
) {
102-
individuals(page: $page, pageSize: $pageSize, filters: $filters) {
103+
individuals(
104+
page: $page
105+
pageSize: $pageSize
106+
filters: $filters
107+
orderBy: $orderBy
108+
) {
103109
entities {
104110
mk
105111
isLocked
@@ -231,13 +237,20 @@ const getIndividuals = {
231237
}
232238
};
233239

234-
const getPaginatedIndividuals = (apollo, currentPage, pageSize, filters) => {
240+
const getPaginatedIndividuals = (
241+
apollo,
242+
currentPage,
243+
pageSize,
244+
filters,
245+
orderBy
246+
) => {
235247
let response = apollo.query({
236248
query: GET_PAGINATED_INDIVIDUALS,
237249
variables: {
238250
page: currentPage,
239251
pageSize: pageSize,
240-
filters: filters
252+
filters: filters,
253+
orderBy: orderBy
241254
},
242255
fetchPolicy: "no-cache"
243256
});

ui/src/components/IndividualsTable.vue

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
class="ml-auto pa-0 flex-grow-0"
3636
@search="filterSearch"
3737
filter-selector
38+
order-selector
3839
/>
3940
<v-tooltip bottom transition="expand-y-transition" open-delay="200">
4041
<template v-slot:activator="{ on }">
@@ -287,7 +288,8 @@ export default {
287288
},
288289
totalResults: 0,
289290
itemsPerPage: 10,
290-
allSelected: false
291+
allSelected: false,
292+
orderBy: null
291293
};
292294
},
293295
computed: {
@@ -317,9 +319,18 @@ export default {
317319
this.queryIndividuals(1);
318320
},
319321
methods: {
320-
async queryIndividuals(page = this.page, filters = this.filters) {
322+
async queryIndividuals(
323+
page = this.page,
324+
filters = this.filters,
325+
orderBy = this.orderBy
326+
) {
321327
if (this.disabledSearch) return;
322-
let response = await this.fetchPage(page, this.itemsPerPage, filters);
328+
let response = await this.fetchPage(
329+
page,
330+
this.itemsPerPage,
331+
filters,
332+
orderBy
333+
);
323334
if (response) {
324335
this.individuals = formatIndividuals(
325336
response.data.individuals.entities
@@ -503,8 +514,9 @@ export default {
503514
this.$logger.error(`Error updating enrollment: ${error}`, data);
504515
}
505516
},
506-
filterSearch(filters) {
517+
filterSearch(filters, orderBy) {
507518
this.filters = filters;
519+
this.orderBy = orderBy;
508520
this.queryIndividuals(1);
509521
},
510522
selectAll(value) {

ui/src/components/Search.stories.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ export default {
77

88
const searchTemplate = `
99
<div class="ma-5">
10-
<search :valid-filters="validFilters" :filter-selector="filterSelector" />
10+
<search
11+
:valid-filters="validFilters"
12+
:filter-selector="filterSelector"
13+
:order-selector="orderSelector"
14+
/>
1115
</div>
1216
`;
1317

@@ -16,7 +20,8 @@ export const Default = () => ({
1620
template: searchTemplate,
1721
data: () => ({
1822
validFilters: [],
19-
filterSelector: false
23+
filterSelector: false,
24+
orderSelector: false
2025
})
2126
});
2227

@@ -34,6 +39,17 @@ export const filterSelector = () => ({
3439
type: "boolean"
3540
}
3641
],
37-
filterSelector: true
42+
filterSelector: true,
43+
orderSelector: false
44+
})
45+
});
46+
47+
export const orderSelector = () => ({
48+
components: { Search },
49+
template: searchTemplate,
50+
data: () => ({
51+
orderSelector: true,
52+
validFilters: [],
53+
filterSelector: false
3854
})
3955
});

0 commit comments

Comments
 (0)