Skip to content
Snippets Groups Projects
Commit a03dae1a authored by robinwilliam.hundt's avatar robinwilliam.hundt
Browse files

Started work on StudentPage serializer and views

parent 1bb9074c
No related branches found
No related tags found
1 merge request!15Refactor
Pipeline #
......@@ -4,27 +4,24 @@ from rest_framework import serializers
from core.models import Student, Submission, Feedback
class StudentSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
class FeedbackSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ('name', 'user', 'exam', 'submissions')
model = Feedback
fields = ('text', 'score')
class SubmissionSerializer(serializers.ModelSerializer):
feedback = FeedbackSerializer()
class Meta:
model = Submission
fields = ('seen_by_student', 'text', 'type', 'student', 'feedback')
class FeedbackSerializer(serializers.ModelSerializer):
class Meta:
model = Feedback
fields = ('text', 'score')
class StudentSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
submissions = SubmissionSerializer(many=True)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ()
model = Student
fields = ('name', 'user', 'exam', 'submissions')
......@@ -26,9 +26,9 @@ urlpatterns = [
url(r'^csv/$', views.export_csv, name='export'),
url(r'^api/student/(?P<pk>[0-9]+)$', views.StudentApiView.as_view()),
url(r'^api/submission/(?P<pk>[0-9]+)$', views.SubmissionApiView.as_view()),
url(r'^api/feedback/(?P<pk>[0-9]+)$', views.FeedbackApiView.as_view()),
url(r'^api/student/$', views.StudentApiView.as_view()),
url(r'^api/submission/$', views.SubmissionApiView.as_view()),
url(r'^api/feedback/$', views.FeedbackApiView.as_view()),
]
urlpatterns += staticfiles_urlpatterns()
from core.models import Student, Submission, Feedback
from core.serializers import SubmissionSerializer, StudentSerializer, FeedbackSerializer
from core.permissions import StudentRequestOwnData
from rest_framework.generics import RetrieveAPIView
class StudentApiView(RetrieveAPIView):
permission_classes = (StudentRequestOwnData, )
queryset = Student.objects.all()
def get_object(self):
return self.request.user.student
serializer_class = StudentSerializer
class SubmissionApiView(RetrieveAPIView):
permission_classes = (StudentRequestOwnData, )
queryset = Submission.objects.all()
def get_object(self):
return self.request.user.student.submissions
serializer_class = SubmissionSerializer
class FeedbackApiView(RetrieveAPIView):
permission_classes = (StudentRequestOwnData, )
queryset = Feedback.objects.all()
def get_queryset(self):
return [submission.feedback for submission in self.request.user.submissions]
serializer_class = FeedbackSerializer
class StudentPageView(RetrieveAPIView):
queryset = Student.objects.all()
......@@ -41,9 +41,12 @@ INSTALLED_APPS = [
'django_extensions',
'core',
'rest_framework',
'corsheaders',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
......@@ -71,11 +74,6 @@ TEMPLATES = [
},
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
WSGI_APPLICATION = 'grady.wsgi.application'
......@@ -142,3 +140,6 @@ STATICFILES_FINDERS = (
AUTH_USER_MODEL = 'core.UserAccount'
AUTH_PASSWORD_VALIDATORS = []
CORS_ORIGIN_WHITELIST = (
'localhost:8080'
)
......@@ -6,8 +6,8 @@
</template>
<script>
export default {
name: 'app'
export default {
name: 'app'
}
</script>
......
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<h2>Essential Links</h2>
<ul>
<li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
<br>
<li><a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a></li>
</ul>
<h2>Ecosystem</h2>
<ul>
<li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
<li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
<li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
</ul>
</div>
<span>{{msg}}</span>
</template>
<script>
......@@ -30,24 +12,3 @@ export default {
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
<template>
</template>
<script>
</script>
<style>
</style>
<template>
</template>
<script>
export default {
computed: {
}
}
</script>
<template>
<ul>
<li v-for="sub in submissions">
<span>{{sub.type}}</span>
<span>{{sub.text}}</span>
<span>{{sub.feedback}}</span>
</li>
</ul>
</template>
<script>
export default {
data: function () {
return {
submissions: []
}
},
created: function () {
this.getSubmissions()
},
methods: {
getSubmissions () {
this.$http.get('http://localhost:8000/api/student/1').then(student => {
return Promise.all(student.body.submissions.map(id => {
return this.$http.get(`http://localhost:8000/api/submission/${id}`)
}))
}).then(response => {
console.log(response)
this.submissions = response.map(item => { return item.body })
}).catch(console.log.bind(console))
}
}
}
</script>
......@@ -3,6 +3,9 @@
import Vue from 'vue'
import App from './App'
import router from './router'
import VueResource from 'vue-resource'
Vue.use(VueResource)
Vue.config.productionTip = false
......
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import SubmissionList from '@/components/student/SubmissionList'
Vue.use(Router)
......@@ -8,8 +8,8 @@ export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: HelloWorld
name: 'Submissions',
component: SubmissionList
}
]
})
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
export default {
get (url, request) {
return Vue.http.get(url, request)
.then((response) => Promise.resolve(response))
.catch((error) => Promise.reject(error))
},
post (url, request) {
return Vue.http.post(url, request)
.then((response) => Promise.resolve(response))
.catch((error) => Promise.reject(error))
},
patch (url, request) {
return Vue.http.patch(url, request)
.then((response) => Promise.resolve(response))
.catch((error) => Promise.reject(error))
},
delete (url, request) {
return Vue.http.delete(url, request)
.then((response) => Promise.resolve(response))
.catch((error) => Promise.reject(error))
}
}
......@@ -950,6 +950,16 @@ boom@5.x.x:
dependencies:
hoek "4.x.x"
bootstrap-vue@^1.0.0-beta.9:
version "1.0.0-beta.9"
resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-1.0.0-beta.9.tgz#4e0bc5bcb95a90dc3bec7124ea3ddf5cc4c6ffa6"
dependencies:
bootstrap "^4.0.0-beta"
bootstrap@^4.0.0-beta:
version "4.0.0-beta.2"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.0.0-beta.2.tgz#4d67d2aa2219f062cd90bc1247e6747b9e8fd051"
brace-expansion@^1.1.7:
version "1.1.8"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
......@@ -1673,6 +1683,12 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
decompress-response@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
dependencies:
mimic-response "^1.0.0"
deep-eql@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
......@@ -1836,6 +1852,10 @@ domutils@^1.5.1:
dom-serializer "0"
domelementtype "1"
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
duplexer@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
......@@ -2665,6 +2685,25 @@ globby@^5.0.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
got@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
dependencies:
decompress-response "^3.2.0"
duplexer3 "^0.1.4"
get-stream "^3.0.0"
is-plain-obj "^1.1.0"
is-retry-allowed "^1.0.0"
is-stream "^1.0.0"
isurl "^1.0.0-alpha5"
lowercase-keys "^1.0.0"
p-cancelable "^0.3.0"
p-timeout "^1.1.1"
safe-buffer "^5.0.1"
timed-out "^4.0.0"
url-parse-lax "^1.0.0"
url-to-options "^1.0.1"
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
......@@ -2739,6 +2778,16 @@ has-flag@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
has-symbol-support-x@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz#66ec2e377e0c7d7ccedb07a3a84d77510ff1bc4c"
has-to-string-tag-x@^1.2.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
dependencies:
has-symbol-support-x "^1.4.1"
has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
......@@ -3136,6 +3185,10 @@ is-number@^3.0.0:
dependencies:
kind-of "^3.0.2"
is-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
is-path-cwd@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
......@@ -3152,7 +3205,7 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
is-plain-obj@^1.0.0:
is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
......@@ -3174,7 +3227,11 @@ is-resolvable@^1.0.0:
dependencies:
tryit "^1.0.1"
is-stream@^1.0.1, is-stream@^1.1.0:
is-retry-allowed@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
......@@ -3261,6 +3318,13 @@ istanbul@^0.4.0:
which "^1.1.1"
wordwrap "^1.0.0"
isurl@^1.0.0-alpha5:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
dependencies:
has-to-string-tag-x "^1.2.0"
is-object "^1.0.1"
js-base64@^2.1.9:
version "2.3.2"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf"
......@@ -3662,6 +3726,10 @@ lower-case@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
lowercase-keys@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
lru-cache@2.2.x:
version "2.2.4"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
......@@ -3785,6 +3853,10 @@ mimic-fn@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
mimic-response@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
minimalistic-assert@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
......@@ -4134,6 +4206,10 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
p-cancelable@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
......@@ -4148,6 +4224,12 @@ p-locate@^2.0.0:
dependencies:
p-limit "^1.1.0"
p-timeout@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.0.tgz#9820f99434c5817868b4f34809ee5291660d5b6c"
dependencies:
p-finally "^1.0.0"
pako@~0.2.0:
version "0.2.9"
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
......@@ -4614,7 +4696,7 @@ prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
prepend-http@^1.0.0:
prepend-http@^1.0.0, prepend-http@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
......@@ -5542,6 +5624,10 @@ time-stamp@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
timers-browserify@^2.0.2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
......@@ -5702,6 +5788,16 @@ url-loader@^0.5.8:
loader-utils "^1.0.2"
mime "1.3.x"
url-parse-lax@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
dependencies:
prepend-http "^1.0.1"
url-to-options@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
url@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
......@@ -5803,6 +5899,12 @@ vue-loader@^13.3.0:
vue-style-loader "^3.0.0"
vue-template-es2015-compiler "^1.6.0"
vue-resource@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/vue-resource/-/vue-resource-1.3.4.tgz#9fc0bdf6a2f5cab430129fc99d347b3deae7b099"
dependencies:
got "^7.0.0"
vue-router@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9"
......@@ -5829,6 +5931,10 @@ vue@^2.5.2:
version "2.5.2"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.2.tgz#fd367a87bae7535e47f9dc5c9ec3b496e5feb5a4"
vuex@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.0.1.tgz#e761352ebe0af537d4bb755a9b9dc4be3df7efd2"
watchpack@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment