diff --git a/frontend/src/components/subscriptions/SubscriptionList.vue b/frontend/src/components/subscriptions/SubscriptionList.vue index fcdf863c553b5d4d94c0be5bbc12be420a8ac58a..74f4383beee2dac8bd6479f8b40b49eb75a8e3d0 100644 --- a/frontend/src/components/subscriptions/SubscriptionList.vue +++ b/frontend/src/components/subscriptions/SubscriptionList.vue @@ -6,7 +6,7 @@ Tasks </v-toolbar-title> <v-spacer/> - <v-btn icon @click="getSubscriptions"> + <v-btn icon @click="getSubscriptions(false)"> <v-icon v-if="!updating">refresh</v-icon> <v-progress-circular v-else @@ -27,54 +27,65 @@ </v-card> </template> -<script> +<script lang="ts"> +import Vue from 'vue' +import Component from 'vue-class-component' +import { Prop } from 'vue-property-decorator' import { mapGetters, mapActions, mapState } from 'vuex' import { UI } from '@/store/modules/ui' import { actions } from '@/store/actions' -import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation' -import SubscriptionForList from '@/components/subscriptions/SubscriptionForList' -import SubscriptionsForStage from '@/components/subscriptions/SubscriptionsForStage' +import SubscriptionCreation from '@/components/subscriptions/SubscriptionCreation.vue' +import SubscriptionForList from '@/components/subscriptions/SubscriptionForList.vue' +import SubscriptionsForStage from '@/components/subscriptions/SubscriptionsForStage.vue' import { Subscriptions } from '@/store/modules/subscriptions' -export default { +@Component({ + name: 'subscription-list', components: { SubscriptionsForStage, SubscriptionForList, - SubscriptionCreation }, - name: 'subscription-list', - props: { - sidebar: { - type: Boolean, - default: false - } - }, - data () { - return { - selectedStage: null, - updating: false - } + SubscriptionCreation }, - computed: { - subscriptions () { return Subscriptions.state.subscriptions }, - stages () { return Subscriptions.availableStages }, - stagesReadable () { return Subscriptions.availableStagesReadable }, - showDetail () { - return !this.sidebar || (this.sidebar && !UI.state.sideBarCollapsed) - } - }, - methods: { - async getSubscriptions () { +}) +export default class SubscriptionList extends Vue { + @Prop({type: Boolean, required: true, default: false}) sidebar!: boolean + + selectedStage = null + updating = false + timer = 0 + + get subscriptions () { return Subscriptions.state.subscriptions } + get stages () { return Subscriptions.availableStages } + get stagesReadable () { return Subscriptions.availableStagesReadable } + get showDetail () { + return !this.sidebar || (this.sidebar && !UI.state.sideBarCollapsed) + } + + async getSubscriptions (silent: boolean) { + if (silent === false) { this.updating = true - const subscriptions = await Subscriptions.getSubscriptions() - this.updating = false - return subscriptions } - }, - created () { - const typesAndSubscriptions = [actions.updateSubmissionTypes(), Subscriptions.getSubscriptions()] - Promise.all(typesAndSubscriptions).then(() => { + const subscriptions = await Subscriptions.getSubscriptions() + this.updating = false + return subscriptions + } + + mounted() { + this.timer = setInterval(() => { + this.getSubscriptions(true) + }, 30 * 1e3) + } + + beforeDestroy() { + clearInterval(this.timer) + } + + created() { + const submissionTypes = actions.updateSubmissionTypes() + const subscriptions = Subscriptions.getSubscriptions() + Promise.all([submissionTypes, subscriptions]).then(() => { Subscriptions.subscribeToAll() - Subscriptions.cleanAssignmentsFromSubscriptions() + Subscriptions.cleanAssignmentsFromSubscriptions(undefined) }) } } diff --git a/functional_tests/test_feedback_creation.py b/functional_tests/test_feedback_creation.py index f34e2e5f565b16d488cb8ee75df810b74ff45ee8..bc40155d6e7bdb9e759af8528bea0c7d1fc6ff50 100644 --- a/functional_tests/test_feedback_creation.py +++ b/functional_tests/test_feedback_creation.py @@ -227,7 +227,8 @@ class UntestedParent: self.write_comments_on_lines([(0, 'I disagree'), (1, 'Full points!')]) self.browser.find_element_by_id('score-full').click() self.browser.find_element_by_id('submit-feedback').click() - WebDriverWait(self.browser, 10).until(ec.url_contains('subscription/ended')) + sub_url = 'subscription/' + str(self.sub_type.pk) + '/ended' + WebDriverWait(self.browser, 10).until(ec.url_contains(sub_url)) submission_for_code = Submission.objects.get(text=code) self.assertEqual(self.sub_type.full_score, submission_for_code.feedback.score) self.assertEqual(3, submission_for_code.feedback.feedback_lines.count())