diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/funds/api_views.py index 61c74580bf75f5d12a36bbea1902cd1fd54d652a..ece53fb38815dfe6cac8a8578e7adc86c99cba00 100644 --- a/opentech/apply/funds/api_views.py +++ b/opentech/apply/funds/api_views.py @@ -13,6 +13,7 @@ from .models import ApplicationSubmission, RoundsAndLabs from .serializers import ( CommentSerializer, CommentCreateSerializer, + RoundLabDetailSerializer, RoundLabSerializer, SubmissionActionSerializer, SubmissionListSerializer, @@ -89,7 +90,7 @@ class SubmissionAction(generics.RetrieveAPIView): class RoundLabDetail(generics.RetrieveAPIView): queryset = RoundsAndLabs.objects.all() - serializer_class = RoundLabSerializer + serializer_class = RoundLabDetailSerializer permission_classes = ( permissions.IsAuthenticated, IsApplyStaffUser, ) @@ -97,12 +98,6 @@ class RoundLabDetail(generics.RetrieveAPIView): def get_object(self): return super().get_object().specific - def get_serializer(self, *args, **kwargs): - serializer_class = self.get_serializer_class() - kwargs['context'] = self.get_serializer_context() - kwargs['show_workflow'] = True - return serializer_class(*args, **kwargs) - class RoundLabList(generics.ListAPIView): queryset = RoundsAndLabs.objects.specific() diff --git a/opentech/apply/funds/serializers.py b/opentech/apply/funds/serializers.py index 5d577e4bcf87962c4ff97c313c99345d3321659f..e323fc5b0431b25ed128d752c0b4e6dada5b8fab 100644 --- a/opentech/apply/funds/serializers.py +++ b/opentech/apply/funds/serializers.py @@ -1,8 +1,7 @@ from rest_framework import serializers -from wagtail.core.models import Page from opentech.apply.activity.models import Activity -from .models import ApplicationSubmission +from .models import ApplicationSubmission, RoundsAndLabs class ActionSerializer(serializers.Field): @@ -84,19 +83,13 @@ class SubmissionActionSerializer(serializers.ModelSerializer): fields = ('id', 'actions',) -class RoundLabSerializer(serializers.ModelSerializer): +class RoundLabDetailSerializer(serializers.ModelSerializer): workflow = serializers.SerializerMethodField() class Meta: - model = Page + model = RoundsAndLabs fields = ('id', 'title', 'workflow') - def __init__(self, *args, **kwargs): - show_workflow = kwargs.pop('show_workflow', False) - if not show_workflow: - del self.fields['workflow'] - super().__init__(*args, **kwargs) - def get_workflow(self, obj): return [ { @@ -107,6 +100,12 @@ class RoundLabSerializer(serializers.ModelSerializer): ] +class RoundLabSerializer(serializers.ModelSerializer): + class Meta: + model = RoundsAndLabs + fields = ('id', 'title') + + class CommentSerializer(serializers.ModelSerializer): user = serializers.StringRelatedField() diff --git a/opentech/static_src/src/app/src/containers/ByRoundListing.js b/opentech/static_src/src/app/src/containers/ByRoundListing.js index 0e3977a60d6be5615423a9f82c366a4096e17b25..8cb617de8b8d1785d9066d9d0bbe1ef907f03d3f 100644 --- a/opentech/static_src/src/app/src/containers/ByRoundListing.js +++ b/opentech/static_src/src/app/src/containers/ByRoundListing.js @@ -48,7 +48,6 @@ class ByRoundListing extends React.Component { componentDidUpdate(prevProps) { const { submissionStatuses } = this.props; - // Update entries if round ID is changed or is not null. if (!submissionStatuses.every(v => prevProps.submissionStatuses.includes(v))) { loadData(this.props) } @@ -58,13 +57,13 @@ class ByRoundListing extends React.Component { const { isLoading, rounds, submissions } = this.props; if (isLoading) return [] - return submissions.map(v => v.round) - .filter((value, index, arr) => arr.indexOf(value) === index) - .map((v, i) => ({ - display: rounds[parseInt(v)].title, - key: `round-${v}`, + return submissions.map(submission => submission.round) + .filter((round, index, arr) => arr.indexOf(round) === index) + .map((round, i) => ({ + display: rounds[parseInt(round)].title, + key: `round-${round}`, position: i, - values: [v], + values: [round], })); } diff --git a/opentech/static_src/src/app/src/redux/reducers/submissions.js b/opentech/static_src/src/app/src/redux/reducers/submissions.js index 95595562efd9887841ca3133ed69d5f9bc381774..946039d231a22cffcd039e6b96c4c212fd94df09 100644 --- a/opentech/static_src/src/app/src/redux/reducers/submissions.js +++ b/opentech/static_src/src/app/src/redux/reducers/submissions.js @@ -100,46 +100,51 @@ function currentSubmission(state = null, action) { function submissionsByStatuses(state = {}, action) { - const key = () => action.statuses.join(','); switch (action.type) { case UPDATE_SUBMISSIONS_BY_STATUSES: return { - ...state || null, - [key()]: { - ...state[key()], - ids: action.data.results.map(v => v.id), - isFetching: false, - isErrored: false, - } + ...state, + ...action.data.results.reduce((accumulator, submission) => { + const submissions = accumulator[submission.status] || [] + if ( !submissions.includes(submission.id) ) { + accumulator[submission.status] = [...submissions, submission.id] + } + return state + }, state) + }; + default: + return state + } +} + + +function submissionsFetchingState(state = {isFetching: true, isError: false}, action) { + switch (action.type) { + case FAIL_LOADING_SUBMISSIONS_BY_STATUSES: + return { + isFetching: false, + isErrored: true, }; case START_LOADING_SUBMISSIONS_BY_STATUSES: return { - ...state || null, - [key()]: { - ...state[key()], - isFetching: true, - isErrored: false, - } + isFetching: true, + isErrored: false, }; - case FAIL_LOADING_SUBMISSIONS_BY_STATUSES: + case UPDATE_SUBMISSIONS_BY_STATUSES: return { - ...state || null, - [key()]: { - ...state[key()], - isFetching: false, - isErrored: true, - } + isFetching: true, + isErrored: false, }; default: return state } } - const submissions = combineReducers({ byID: submissionsByID, current: currentSubmission, byStatuses: submissionsByStatuses, + fetchingState: submissionsFetchingState, }); export default submissions; diff --git a/opentech/static_src/src/app/src/redux/selectors/submissions.js b/opentech/static_src/src/app/src/redux/selectors/submissions.js index f97708fa95899a1000c7fb4276c4d7142b2aeda4..643684d2e8d4648477eb560e69e25be39dde5f11 100644 --- a/opentech/static_src/src/app/src/redux/selectors/submissions.js +++ b/opentech/static_src/src/app/src/redux/selectors/submissions.js @@ -11,32 +11,29 @@ const getSubmissions = state => state.submissions.byID; const getSubmissionsByStatuses = state => state.submissions.byStatuses; +const getSubmissionsFetchingState = state => state.submissions.fetchingState; + const getCurrentSubmissionID = state => state.submissions.current; const getByGivenStatusesObject = statuses => createSelector( [getSubmissionsByStatuses], (byStatuses) => { - for (const [key, value] of Object.entries(byStatuses)) { - if (key.split(',').every(v => statuses.includes(v))) { - return value; - } - } - return {}; + return statuses.reduce((acc, status) => acc.concat(byStatuses[status] || []), []) } ); const getSubmissionsByGivenStatuses = statuses => createSelector( [getSubmissions, getByGivenStatusesObject(statuses)], - (submissions, byStatus) => (byStatus.ids || []).map(id => submissions[id]) + (submissions, byStatus) => byStatus.map(id => submissions[id]) ); const getByGivenStatusesError = statuses => createSelector( - [getByGivenStatusesObject(statuses)], - byStatus => byStatus.isErrored === true + [getSubmissionsFetchingState], + state => state.isErrored === true ); const getByGivenStatusesLoading = statuses => createSelector( - [getByGivenStatusesObject(statuses)], - byStatus => byStatus.isFetching === true + [getByGivenStatusesObject], + state => state.isFetching === true ); const getCurrentRoundSubmissions = createSelector(