diff --git a/frontend/src/components/GDPRNotice.vue b/frontend/src/components/GDPRNotice.vue new file mode 100644 index 0000000000000000000000000000000000000000..d82c479f80bfc3901d92b489f338d4ae2ee2699a --- /dev/null +++ b/frontend/src/components/GDPRNotice.vue @@ -0,0 +1,107 @@ +<template> + <div> + <p><strong>Allgemeiner Hinweis und Pflichtinformationen</strong></p> + <p><strong>Benennung der verantwortlichen Stelle</strong></p> + <p>Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:</p> + <p><span id="s3-t-firma">Institut für Informatik - Georg-August-Universität Göttingen</span><br> + <span id="s3-t-ansprechpartner">Dr. Henrik Brosenne</span><br><span id="s3-t-strasse">Goldschmidtstraße 7</span><br> + <span id="s3-t-plz">37077</span> <span id="s3-t-ort">Göttingen</span></p><p></p> + <p>Die verantwortliche Stelle entscheidet allein oder gemeinsam mit anderen über die Zwecke und Mittel der + Verarbeitung von personenbezogenen Daten (z.B. Namen, Kontaktdaten o. Ä.).</p> + + <p><strong>Recht auf Beschwerde bei der zuständigen Aufsichtsbehörde</strong></p> + <p>Als Betroffener steht Ihnen im Falle eines datenschutzrechtlichen Verstoßes ein Beschwerderecht bei der zuständigen + Aufsichtsbehörde zu. Zuständige Aufsichtsbehörde bezüglich datenschutzrechtlicher Fragen ist:<br> + Die Landesbeauftragte für den Datenschutz Niedersachsen<br> + Prinzenstraße 5<br> + 30159 Hannover<br> + <p><strong>Recht auf Datenübertragbarkeit</strong></p> + <p>Ihnen steht das Recht zu, Daten, die wir auf Grundlage der Erfüllung eines Vertrags + automatisiert verarbeiten, an sich oder an Dritte aushändigen zu lassen. Die Bereitstellung erfolgt in einem + maschinenlesbaren Format. Sofern Sie die direkte Übertragung der Daten an einen anderen Verantwortlichen verlangen, erfolgt dies nur, soweit es technisch machbar ist.</p> + + <p><strong>Recht auf Auskunft, Berichtigung, Sperrung, Löschung</strong></p> + <p>Sie haben jederzeit im Rahmen der geltenden gesetzlichen Bestimmungen das Recht auf unentgeltliche Auskunft über + Ihre gespeicherten personenbezogenen Daten, Herkunft der Daten, deren Empfänger und den Zweck der + Datenverarbeitung und ggf. ein Recht auf Berichtigung, Sperrung oder Löschung dieser Daten. Diesbezüglich und + auch zu weiteren Fragen zum Thema personenbezogene Daten können Sie sich jederzeit über die im Impressum aufgeführten Kontaktmöglichkeiten an uns wenden.</p> + + <p><strong>SSL- bzw. TLS-Verschlüsselung</strong></p> + <p>Aus Sicherheitsgründen und zum Schutz der Übertragung vertraulicher Inhalte, die Sie an uns als Seitenbetreiber + senden, nutzt unsere Website eine SSL-bzw. TLS-Verschlüsselung. Damit sind Daten, die Sie über diese Website + übermitteln, für Dritte nicht mitlesbar. Sie erkennen eine verschlüsselte Verbindung an der „https://“ + Adresszeile Ihres Browsers und am Schloss-Symbol in der Browserzeile.</p> + + <p><strong>Datenschutzbeauftragter</strong></p> + <p>Wir haben einen Datenschutzbeauftragten bestellt.</p> + Datenschutzbeauftragter der Universität<br> + Prof. Dr. Andreas Wiebe<br> + Lehrstuhl für Bürgerliches Recht, Wettbewerbs- und Immaterialgüterrecht, Medien- und Informationsrecht<br> + Platz der Göttinger Sieben 6<br> + 37073 Göttingen<br> + Tel.: 0551 39 - 7381<br> + Fax: 0551 39 - 4437<br> + E-Mail: lehrstuhl.wiebe@jura.uni-goettingen.de<br> + + <p><strong>Server-Log-Dateien</strong></p> + <p>Der Provider der Website erhebt automatisch Informationen, die Ihr Browser automatisch an uns übermittelt. Dies sind:</p> + <ul> + <li>Besuchte Seite auf unserer Domain</li> + <li>Datum und Uhrzeit der Serveranfrage</li> + <li>Browsertyp und Browserversion</li> + <li>Verwendetes Betriebssystem</li> + <li>Referrer URL</li> + <li>Hostname des zugreifenden Rechners</li> + <li>IP-Adresse</li> + </ul> + <p>Es findet keine Zusammenführung dieser Daten mit anderen Datenquellen statt. Grundlage der Datenverarbeitung + bildet Art. 6 Abs. 1 lit. b DSGVO, der die Verarbeitung von Daten zur Erfüllung eines Vertrags oder + vorvertraglicher Maßnahmen gestattet.</p> + + <p><strong>Registrierung auf dieser Website</strong></p> + <p>Zur Nutzung bestimmter Funktionen müssen Sie sich auf unserer Website registrieren. Die übermittelten Daten + dienen ausschließlich zum Zwecke der Nutzung des jeweiligen Angebotes oder Dienstes. Bei der Registrierung + abgefragte Pflichtangaben sind vollständig anzugeben. Andernfalls werden wir die Registrierung ablehnen.</p> + <p>Im Falle wichtiger Änderungen, etwa aus technischen Gründen, informieren wir Sie</p> + <p>Wir speichern die bei der Registrierung erfassten Daten während des Zeitraums, den Sie auf unserer Website + registriert sind. + Gesetzliche Aufbewahrungsfristen bleiben unberührt.</p> + + <p><strong>Speicherdauer von Beiträgen und Kommentaren</strong></p> + <p>Beiträge und Kommentare sowie damit in Verbindung stehende Daten, wie beispielsweise der Benutzername, + werden gespeichert. Der Inhalt verbleibt auf unserer Website, bis er vollständig gelöscht wurde oder aus + rechtlichen Gründen gelöscht werden musste.</p> + <p>Die Speicherung der Beiträge und Kommentare erfolgt auf Grundlage Art. 6 Abs. 1 lit. b DSGVO zur Erfüllung des + Arbeitsvertrages.</p> + + <p><strong>Session storage</strong></p> + <p>Unsere Website verwendet den Session storage des Browsers. In diesem werden für die Dauer einer Sitzun (Session) + Daten auf Ihrem Endgerät gespeichert.</p> + + <p><strong>Google Web Fonts</strong></p> + <p>Unsere Website verwendet Web Fonts von Google. Anbieter ist die Google Inc., 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA.</p> + <p>Durch den Einsatz dieser Web Fonts wird es möglich Ihnen die von uns gewünschte Darstellung unserer Website + zu präsentieren, unabhängig davon welche Schriften Ihnen lokal zur Verfügung stehen. Dies erfolgt über + den Abruf der Google Web Fonts von einem Server von Google in den USA und der damit verbundenen Weitergabe + Ihrer Daten an Google. Dabei handelt es sich um Ihre IP-Adresse und welche Seite Sie bei uns besucht haben. + Der Einsatz von Google Web Fonts erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Als Betreiber dieser + Website haben wir ein berechtigtes Interesse an der optimalen Darstellung und Übertragung unseres Webauftritts.</p> + <p>Das Unternehmen Google ist für das us-europäische Datenschutzübereinkommen "Privacy Shield" zertifiziert. + Dieses Datenschutzübereinkommen soll die Einhaltung des in der EU geltenden Datenschutzniveaus gewährleisten.</p> + <p>Einzelheiten über Google Web Fonts finden Sie unter: + <a href="https://www.google.com/fonts#AboutPlace:about">https://www.google.com/fonts#AboutPlace:about</a> + und weitere Informationen in den Datenschutzbestimmungen von Google: + <a href="https://policies.google.com/privacy/partners?hl=de">https://policies.google.com/privacy/partners?hl=de</a></p> + <p><small>Quelle: Datenschutz-Konfigurator von <a href="http://www.mein-datenschutzbeauftragter.de" target="_blank">mein-datenschutzbeauftragter.de</a></small></p> + </div> +</template> + +<script> +export default { + name: 'GDPRNotice' +} +</script> + +<style scoped> + +</style> diff --git a/frontend/src/components/RegisterDialog.vue b/frontend/src/components/RegisterDialog.vue index e1330c07c797c328512c15e4ad72284bd8ad4e82..f8c747a8ae32cf7a6cb8833209a4a9146e3d7b9c 100644 --- a/frontend/src/components/RegisterDialog.vue +++ b/frontend/src/components/RegisterDialog.vue @@ -1,5 +1,16 @@ <template> - <v-card> + <v-card v-if="!acceptedGDPR"> + <v-card-title class="title"> + Datenschutzerklärung + </v-card-title> + <v-card-text> + <GDPRNotice/> + </v-card-text> + <v-card-actions> + <v-btn @click="acceptedGDPR = true">Einwilligen</v-btn> + </v-card-actions> + </v-card> + <v-card v-else> <v-card-title class="title"> Register </v-card-title> @@ -25,16 +36,19 @@ <script> import { registerTutor } from '@/api' +import GDPRNotice from '@/components/GDPRNotice' export default { name: 'register-dialog', + components: {GDPRNotice}, data () { return { credentials: { username: '', password: '' }, - loading: false + loading: false, + acceptedGDPR: false } }, methods: { diff --git a/frontend/src/components/SubmissionTypesOverview.vue b/frontend/src/components/SubmissionTypesOverview.vue new file mode 100644 index 0000000000000000000000000000000000000000..e96e9614a331d653f244bf27b961c4a939c6acc3 --- /dev/null +++ b/frontend/src/components/SubmissionTypesOverview.vue @@ -0,0 +1,60 @@ +<template> + <v-card> + <v-card-title class="title">Assignment types</v-card-title> + <v-layout row wrap> + <v-flex xs3> + <v-list> + <v-list-tile + v-for="submissionType in sortedSubmissionTypes" :key="submissionType.pk" + @click="selectedSubmissionType = submissionType" + > + <v-list-tile-content> + {{submissionType.name}} + </v-list-tile-content> + </v-list-tile> + </v-list> + </v-flex> + <v-flex xs9> + <v-layout v-if="!selectedSubmissionType" justify-center> + <strong>Select an assignment type on the left to see the description and solution.</strong> + </v-layout> + <submission-type class="mr-2 mb-2" v-else v-bind="selectedSubmissionType"/> + </v-flex> + </v-layout> + </v-card> +</template> + +<script> +import {mapState} from 'vuex' +import SubmissionType from '@/components/SubmissionType' +export default { + name: 'SubmissionTypesOverview', + components: {SubmissionType}, + data () { + return { + selectedSubmissionType: null + } + }, + computed: { + ...mapState([ + 'submissionTypes' + ]), + sortedSubmissionTypes () { + return Object.values(this.submissionTypes).sort((t1, t2) => { + let lowerName1 = t1.name.toLowerCase() + let lowerName2 = t2.name.toLowerCase() + if (lowerName1 < lowerName2) { + return -1 + } else if (lowerName1 > lowerName2) { + return 1 + } + return 0 + }) + } + } +} +</script> + +<style scoped> + +</style> diff --git a/frontend/src/components/tutor_list/TutorList.vue b/frontend/src/components/tutor_list/TutorList.vue index 9f7c0895a9dd89510dc1412c0f544aded873a9d6..9e0d2f67618afa6fd03e1171e4aa904cb81ba419 100644 --- a/frontend/src/components/tutor_list/TutorList.vue +++ b/frontend/src/components/tutor_list/TutorList.vue @@ -11,13 +11,26 @@ <td>{{props.item.username}}</td> <td class="text-xs-right">{{props.item.feedback_created}}</td> <td class="text-xs-right">{{props.item.feedback_validated}}</td> + <td class="text-xs-right"> + <v-btn icon @click="changeActiveStatus(props.item)"> + <v-tooltip top> + <template slot="activator"> + <v-icon small v-if="!props.item.is_active">lock</v-icon> + <v-icon small v-else>lock_open</v-icon> + </template> + <span v-if="!props.item.is_active">Grant access</span> + <span v-else>Revoke access</span> + </v-tooltip> + </v-btn> + </td> </template> </v-data-table> </v-flex> </template> <script> -import {mapState} from 'vuex' +import {mapState, mapActions} from 'vuex' +import {changeActiveForUser} from '@/api' export default { name: 'tutor-list', @@ -39,6 +52,11 @@ export default { text: '# validated', align: 'right', value: 'feedback_validated' + }, + { + text: 'Has Access', + align: 'right', + value: 'is_active' } ] } @@ -47,6 +65,22 @@ export default { ...mapState([ 'tutors' ]) + }, + methods: { + ...mapActions([ + 'getTutors' + ]), + changeActiveStatus (tutor) { + changeActiveForUser(tutor.pk, !tutor.is_active).then(() => { + this.getTutors() + }).catch(() => { + this.$notify({ + title: 'Error', + text: `Unable to change active status of ${tutor.username}`, + type: 'error' + }) + }) + } } } </script> diff --git a/frontend/src/pages/reviewer/ReviewerStartPage.vue b/frontend/src/pages/reviewer/ReviewerStartPage.vue index 19db7cea347c93972bf4cb9383b548c41f57d9a4..c049278d188010801c8c2c61aacc59df5f06dd00 100644 --- a/frontend/src/pages/reviewer/ReviewerStartPage.vue +++ b/frontend/src/pages/reviewer/ReviewerStartPage.vue @@ -11,6 +11,7 @@ <subscription-list class="ma-4"></subscription-list> </v-flex> </v-layout> + <SubmissionTypesOverview class="ma-4"/> </div> </template> @@ -18,9 +19,11 @@ import CorrectionStatistics from '@/components/CorrectionStatistics' import WelcomeJumbotron from '@/components/WelcomeJumbotron' import SubscriptionList from '@/components/subscriptions/SubscriptionList' +import SubmissionTypesOverview from '@/components/SubmissionTypesOverview' export default { components: { + SubmissionTypesOverview, SubscriptionList, WelcomeJumbotron, CorrectionStatistics}, diff --git a/frontend/src/pages/tutor/TutorStartPage.vue b/frontend/src/pages/tutor/TutorStartPage.vue index a352530ca9184334f4b4009737df59243cabf02c..3d57117ca63e51d044dbb41ff1e0bf859c6357ba 100644 --- a/frontend/src/pages/tutor/TutorStartPage.vue +++ b/frontend/src/pages/tutor/TutorStartPage.vue @@ -11,6 +11,7 @@ <subscription-list class="ma-4"></subscription-list> </v-flex> </v-layout> + <SubmissionTypesOverview class="ma-4"/> </div> </template> @@ -18,9 +19,11 @@ import SubscriptionList from '@/components/subscriptions/SubscriptionList' import CorrectionStatistics from '@/components/CorrectionStatistics' import WelcomeJumbotron from '@/components/WelcomeJumbotron' +import SubmissionTypesOverview from '@/components/SubmissionTypesOverview' export default { components: { + SubmissionTypesOverview, WelcomeJumbotron, CorrectionStatistics, SubscriptionList},