Gitlab Community Edition Instance

Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • j.michal/grady
1 result
Select Git revision
Show changes
Commits on Source (6)
......@@ -93,10 +93,10 @@ class StudentPageTests(APITestCase):
self.assertEqual(3, len(self.rev_response.data))
@override_config(EXERCISE_MODE=True)
def test_tutor_can_only_see_group_members_when_in_exercise_mode(self):
def test_tutor_can_only_see_students_when_in_exercise_mode(self):
force_authenticate(self.request, user=self.tutor)
response = self.view(self.request)
self.assertEqual(2, len(response.data))
self.assertEqual(3, len(response.data))
def test_submissions_score_is_included(self):
res_with_sub = None
......
......@@ -81,9 +81,7 @@ class StudentReviewerApiViewSet(viewsets.ReadOnlyModelViewSet):
return queryset
elif self.request.user.is_tutor() and config.EXERCISE_MODE:
return queryset.filter(
user__exercise_groups__in=self.request.user.exercise_groups.all()
)
return queryset
else:
return []
......
......@@ -213,6 +213,10 @@ export async function changeActiveForUser (userPk: string, active: boolean): Pro
return (await ax.patch(`/api/user/${userPk}/change_active/`, { 'is_active': active })).data
}
export async function fetchUsers (): Promise<UserAccount[]> {
return (await ax.get('api/user/')).data
}
export async function getLabels (): Promise<FeedbackLabel[]> {
return (await ax.get('/api/label/')).data
}
......
......@@ -6,6 +6,18 @@
</v-toolbar-title>
<v-spacer />
<v-toolbar-items />
<v-select
v-model="selectedGroup"
:items="groups"
item-text="name"
label="Group"
single-line
return-object
hide-details
clearable
flat
class="mr-6"
/>
<v-text-field
v-model="search"
append-icon="search"
......@@ -129,9 +141,11 @@
import { mapActions, mapState } from 'vuex'
import StudentListMenu from '@/components/student_list/StudentListMenu'
import StudentListReverseMapper from '@/components/student_list/StudentListReverseMapper'
import { changeActiveForUser } from '@/api'
import { changeActiveForUser, fetchUser } from '@/api'
import { getters } from '@/store/getters'
import { Authentication } from '@/store/modules/authentication'
import { Assignments } from '@/store/modules/assignments'
import * as api from '@/api'
export default {
name: 'StudentList',
......@@ -142,6 +156,9 @@ export default {
return {
loading: true,
search: '',
selectedGroup: null,
userData: [],
userMap: null
}
},
computed: {
......@@ -186,7 +203,14 @@ export default {
},
studentListItems () {
if (!this.loading) {
return Object.values(this.students).map(student => {
let filteredStudents = this.students
if (this.selectedGroup !== null) {
filteredStudents = Object.values(filteredStudents).filter(student => {
let userGroups = this.userMap.get(student.userPk)
return userGroups.some(group => group.pk === this.selectedGroup.pk)
})
}
return Object.values(filteredStudents).map(student => {
return {
pk: student.pk,
user: student.user,
......@@ -202,10 +226,23 @@ export default {
}
return []
}
},
groups () {
return Assignments.state.groups.slice().sort((a, b) => {
const matches_a = a.name.match(/(\d+)/)
const number_a = Number(matches_a === null ? 0 : matches_a[1])
const matches_b = b.name.match(/(\d+)/)
const number_b = Number(matches_b === null ? 0 : matches_b[1])
return (number_a<number_b?-1:(number_a>number_b?1:0))
})
},
},
created () {
this.getUserData()
this.getStudents().then(() => { this.loading = false })
const groups = Assignments.getGroups()
},
methods: {
...mapActions([
......@@ -245,6 +282,14 @@ export default {
},
showSubmissionDetails () {
this.$emit('detail-click')
},
async getUserData() {
this.userMap = new Map()
this.userData = await api.fetchUsers()
var that = this // javascript this is not the same in forEach
this.userData.forEach(user => {
that.userMap.set(user.pk, user.exerciseGroups)
})
}
},
}
......
......@@ -13,7 +13,6 @@
hide-details
@keyup.enter.ctrl.exact="submitFeedback"
@keyup.esc="collapseTextField"
@focus="selectInput($event)"
/>
</v-col>
</v-row>
......
......@@ -5,6 +5,7 @@
ref="scoreForm"
v-model="scoreIsValid"
lazy-validation
@submit.prevent="submit"
>
<v-text-field
id="score-input"
......