From c86b41c48a3d76e8ea49f2ec418c171a198defba Mon Sep 17 00:00:00 2001 From: Herbert Kruitbosch Date: Fri, 4 May 2018 15:09:27 +0200 Subject: [PATCH] gdpr added --- rugwebsite/__init__.py | 2 +- rugwebsite/__pycache__/models.cpython-35.pyc | Bin 133 -> 3152 bytes rugwebsite/__pycache__/urls.cpython-35.pyc | Bin 391 -> 533 bytes rugwebsite/__pycache__/views.cpython-35.pyc | Bin 324 -> 2980 bytes rugwebsite/forms.py | 6 + rugwebsite/migrations/0001_initial.py | 43 ++++ rugwebsite/models.py | 71 +++++++ rugwebsite/templates/rugwebsite/base.html | 13 +- .../rugwebsite/email/gdpr_consent.html | 38 ++++ .../rugwebsite/email/gdpr_consent.txt | 35 ++++ .../rugwebsite/email/gdpr_delete.html | 26 +++ .../rugwebsite/email/gdpr_delete.txt | 24 +++ rugwebsite/templates/rugwebsite/gdpr.html | 190 ++++++++++++++++++ .../rugwebsite/gdpr_agree_success.html | 24 +++ .../templates/rugwebsite/gdpr_delete.html | 14 ++ .../rugwebsite/gdpr_request_delete.html | 38 ++++ .../gdpr_request_delete_successful.html | 26 +++ rugwebsite/urls.py | 5 +- rugwebsite/views.py | 75 ++++++- 19 files changed, 622 insertions(+), 8 deletions(-) create mode 100755 rugwebsite/forms.py create mode 100644 rugwebsite/migrations/0001_initial.py create mode 100644 rugwebsite/templates/rugwebsite/email/gdpr_consent.html create mode 100644 rugwebsite/templates/rugwebsite/email/gdpr_consent.txt create mode 100644 rugwebsite/templates/rugwebsite/email/gdpr_delete.html create mode 100644 rugwebsite/templates/rugwebsite/email/gdpr_delete.txt create mode 100755 rugwebsite/templates/rugwebsite/gdpr.html create mode 100755 rugwebsite/templates/rugwebsite/gdpr_agree_success.html create mode 100755 rugwebsite/templates/rugwebsite/gdpr_delete.html create mode 100755 rugwebsite/templates/rugwebsite/gdpr_request_delete.html create mode 100755 rugwebsite/templates/rugwebsite/gdpr_request_delete_successful.html diff --git a/rugwebsite/__init__.py b/rugwebsite/__init__.py index 944ab81..0cc076c 100644 --- a/rugwebsite/__init__.py +++ b/rugwebsite/__init__.py @@ -1 +1 @@ -__version__ = '0.1.28' \ No newline at end of file +__version__ = '0.1.29' \ No newline at end of file diff --git a/rugwebsite/__pycache__/models.cpython-35.pyc b/rugwebsite/__pycache__/models.cpython-35.pyc index ec352094a3b0e8ee2e5baf577f6bd361ecf0cfbe..26f5036cc2d65bdb67e115b425aea7437c33022e 100644 GIT binary patch literal 3152 zcmd5;&2Jk;6o0$xuk}abq-~nEw4|X0EL0m+T#yh-lr#})8>%Mdu$R@wJ8{;X-A!l4 zNn_fRx$!S>;>N!;7Y;ok@fUF7y&1=GK8gSdiM4n3y_q*N@AEga&}dZOJ^nrLssQg` z>M0<-g0K7)n;8ENaDdc-zyXJN7q|4Jd9A2 zE3g^YA#Rv~#?-)79GHQ4)(p%}4P1k`3EQo?-_S^CIlAydGJ)UO0e(ZC_j)W2^MS&y z+FG6|mZ_cN1BPsQn@O4E8Iq+mj~SOpRaBC)VV;q|!lN`w_|pMb$tqV&WRXe^8A;W9 zOofW22Ru?FS&>YsBsyQ0`LX)Fd)C9+XEMv2mJ!Y14BS`5k`&^lnh;l5z15` z_Ry+=u5PYBd%oHejKxDg8mRp?*{A(H3sGaH*jCHel`zbrl!c+Lh9R0V;6&HM@YNvV zc0`m=2VLFB1xtF_V|J{|YpdI9tLu++fjp%f>uAaj8o!Y+9&0}`dxnwv1;jO+YnneE zcJ}j>b@rLqWkPkH4>mhu(0g#ic4eX%(I=$!X#3z;)Nu9;zLNY=cNQJfbGfIUpvb@Q zR9v9Ez`Tr$5SI*%=~YG#R&?_j%VLbp#F0~e6m{IM>tI6f1_Okp)7i4tEbjbz}Q>P#q z-#hiNSRl!w@&0urjnlwcc7_Y*?PwdJiT31O+Qw-A6B1VYku%nwRCOt>i0}YirV6Bd zf+jie)-m#wiGNSt1yv$nzri)jW=-@?8F~(k3h)+p!Mv`(8+2R+MlN~^dH>W?{?>4L zDq9#;TBjEuh_IVy5{tCGuTpNDr;93o$ujK?1Rvi0>q+Xh8ZLf&$i&j%Xz73nnd53b z)?jj1PUqUaJo6+o}p5J*Z0pbB75V!`s*+ z5M)7Dw!hhV6ux-=L{x|^8twIbq*T=152I78py+0Cs~~QXT%DFC`v`<|opzgWUMhR% zvOwI$NiR8Ug^(q-Ks9%2Vy{pbn)8~nRa&F)wc z`cCTMM`RFh`&bp&x|D~Q=(Z9r~JOdPs)ATQI4I35$VuaZ6`?nf4bcvD$p|~vAs{xbB#Hcl+OMAIUBPGZh zu}F;xUWIU*&|O#e5+Rj21GLYhF=+y+{X~XQmkus*gQj}ae1whm!?26OG7QB{i@7_7vHxcfPz5=+!abOtM$JCq+yP5MP_MZhH z?+gH4zZm&{fI#9C+SXvtL!#b`J)hzzW#%;YR0Z{JwHEZvxF2P`yiM3DlHInsDA^l` zARGv8T_zy$CKPdLNkukC&nx4(^;2l=c=m5uzJ}_Qyi;uDy8G$NWGg zxFHp?Zcf$_tWC$CJxmtH-6yxpHqRqEg3NhTo6O1f>`_#FN;g+~(;$2{E}4qs1if|T dE3^V{hF?=fnus>>05Lze>EajL8^s%oe*$7TzBB*; delta 88 zcmca0(aLBo#>>kkzmGGD0SF$02pC`lG8}-om<33rFfasbGWxA#C;|yXiOHEv=EAo) SY;yBcN^?@}Kr+QZ%m4s2X$_75 diff --git a/rugwebsite/__pycache__/urls.cpython-35.pyc b/rugwebsite/__pycache__/urls.cpython-35.pyc index c839a1adf5a14c18daca81cf6d7fe4dc3d931255..bb85c7c601d5796633b3733a65631860c50d8863 100644 GIT binary patch delta 333 zcmY+8zfQwI494x`nm8T++Y8z$mh(!gQ%R34)y>v)TTTTv)H$YEM~aoHAUV=L-OQlX{a)tO ztOTv2Zu*}nP`;7ZRhm)4>Qoe87{$Ti?e1c*kdF3IfqtS&n}%drzk-}@Ue6}F OT;K_w+jE@b8U6qcyHV5t delta 191 zcmbQr($1_b#>>m4^iMeI1_J}bV<3hDHXzFZh>MdaDx0S>rZO?4urQ=DGNiIHqyP~c zLo*{|GZOIPRz~u#i*jmIoXjhLF^VcP-#J8Nl9u^UhztXA|9Yg WMLd%aGP>|^0GVQp{EPxD5{v+|cq|kE diff --git a/rugwebsite/__pycache__/views.cpython-35.pyc b/rugwebsite/__pycache__/views.cpython-35.pyc index c8e1905f506e35c014f6754c6a8ad66e79e34462..51a57b74b2b3a45b4a2bb58f995dfc9da9aea313 100644 GIT binary patch literal 2980 zcmaJ@O>bL86utA_^Y^o3Cv8QVQmP_U463Wb0tr=BQPXr6qBf|)sIp%CCW)Q*ks0z={P6w(Q>uiB*ALz>0Hc9LGsRlf22y-1)e3&$(yjQnOiaJ^82qYlG-d zn)~rlzlTr%f+EJBpoAzD)E6YU?NQ=U>Qmo$ZJ&~W(h~Jct{qTPrnEx+ifflBsZv^_ zevQ&P_3M;2sNZn5G9@9UP3kw%u25X1ABg%bifa_tZGC~HptwPC$j#SqqfK#>;+C~` zC|;nrZR?8^qq%77OB65B(Ms~2Q8rNW*<_?-jGo{dEfxNkmCRyW>pX&0 zYV&Y)2q>){}Xm7wg%67Q(s~sg}QJ+=gqBCcmP7y_CN1B0(vN%r%+9*sO3U&iO z{J(_nK0bX3g&}%nLyV}#K8*yu_ThK1{_=vF>^zrSdSv9S-8_}OU6Uq7MepX%v*=*6 zD^!5_I6#FD1-E}96{6?g+jjV^U8%ODGPfR09^S%IH;>nvTlQcipX=WKiz46+zys1A z3KFV?@|4pRbXcdapmN6PIH0&hBhR^BKJEHWysw<=9d>;XaSR7r6JzphP1Uj5$x#%$ zU=QJnCYnXSD=eUP>{}c4nQt6}nQuR$foP8LCrDo;1DA-t7j*a?8K1@hjY~{t#QHUf zaha{FPw&!^AOr6Cgpy+*Whsxu)Qdmd{1VlV4ua#p8q&np}NSk!jT^6 z$-Y!}_QHl#=}7BQo;^@1SIXxxm3(U~hej9W?NMT|i6142s==hnc4r+O$f6|EXp}fQ z1r7t=K`}pz%D&_OSy&d?xk04&9HObr%o4_HMu)sm)V%9rL0lAd(Guzd^vxjSovZln zQY+kV3B`~qRtI-9PRzmw&AVkssq5TPVzTO!)2gdHfn{qhDYC(kJW6_-P>r=1hsV;0o_LYC$k_AW>02+JDB`}R~0e@^}LlyuW69-(e z%s@T%3Fs}c`q9{5qQ{ICKDKJg7!KF0c#4J4Sib!+QIgJUrm zxa8wpbLg#{MbF_rm4DZWH!bXI-KzSCC)(K0AabDGfB|`*E8Iq>a@#V`?ss1B8#efE zo7-4IGdLt}h(!dvBd!Q_6YW``nKrE2_wi{T^yA=K3Er!a`eK^Qh&2N0?g=gtLxdQy z^Js+VmSOEbn~Y$VEnTFi%gl7dpgaocRbk}S9vnS zik!!a*av%tR%CwWCem|xs^Zya|GT^TgZE{*sM4JbuDC{v?l_&o^Mj4fJ9r)7_HM5i zC40}kL(Lt6E>{?gek)3pjN%tgPh<57cfNIJrfY9F$1PR*3--zwWVspG^nZE%EO*>( zJCzJep>Ct_A3oT$j8J@Y&ZTx)9wOnj;}pyE36oS0&2Gu1@{B?Jc+!)^oSVjVcSG=f z|0O1C)&|br718upL|KG>-O{S#p~tIx>T}rFyBCV9@i@wM^4>7d@Os+nMH92zi{&s^ zk;$PR{6;A*pEoGYL0s+bzV>tgULDE|CpZ?1Lce_yq8>}2w#wJ<%ymy!u>r6V;`Az( zrt3}2DAB#4da(~@tn%?=N%6gB?>Q?(Hc9M(=ETj)oPE<&?_iHfBJVPm_8r(3`1RW2 Qir4nTAPg3pVJEEp2ZpeNe*gdg literal 324 zcmYk1zfQw25XL{pY55~n%7Br;~|Y2a)Vf!N?RcmSS*x5&!G zD=_tJ3DlFn&u97W=kw`ocKq>mR1E;WMgNgVb|tcBVn&ui3v>#Vf-(t=#ye0+lHx9( z{74mYHBOnfhIpmISt9JI=vrhmF$cUxS_8akX-yU{C+yb)Ep6kdtox3N+I4NNILsi- z1Exn$)_sBl>i0Yrl{N8_*p;{brWC;ZkFW=OYG|;y2;eGJGt;vSbHXP)0}q diff --git a/rugwebsite/forms.py b/rugwebsite/forms.py new file mode 100755 index 0000000..833bfe4 --- /dev/null +++ b/rugwebsite/forms.py @@ -0,0 +1,6 @@ +from django import forms + + +class RequestGDPRDelete(forms.Form): + email = forms.EmailField(widget=forms.EmailInput) + diff --git a/rugwebsite/migrations/0001_initial.py b/rugwebsite/migrations/0001_initial.py new file mode 100644 index 0000000..484e5af --- /dev/null +++ b/rugwebsite/migrations/0001_initial.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.7 on 2018-05-04 11:30 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='GDPRAgreed', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('agreed_at', models.DateTimeField()), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='PendingGDPRAgree', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('token', models.TextField()), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='PendingGDPRDelete', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('token', models.TextField()), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/rugwebsite/models.py b/rugwebsite/models.py index e69de29..85fc5be 100755 --- a/rugwebsite/models.py +++ b/rugwebsite/models.py @@ -0,0 +1,71 @@ +from django.contrib.auth.models import User +from django.contrib.auth.signals import user_logged_out +from django.contrib.contenttypes.models import ContentType +from django.contrib.sessions.models import Session +from django.db import models + +from django.utils import timezone + +from django.core.mail import EmailMultiAlternatives +from django.template.loader import get_template + +from django.conf import settings + +class GDPRAgreed(models.Model): + user = models.ForeignKey('auth.User', on_delete=models.CASCADE) + agreed_at = models.DateTimeField() + + +class PendingGDPRAgree(models.Model): + user = models.ForeignKey('auth.User', on_delete=models.CASCADE) + token = models.TextField() + + def agree(self): + GDPRAgreed(user=self.user, agreed_at=timezone.now()).save() + self.delete() + + def email(self): + html_content = get_template('rugwebsite/email/gdpr_consent.html').render( + {'user': self.user, 'token': self.token, 'url': settings.SITE_URL} + ) + text_content = get_template('rugwebsite/email/gdpr_consent.txt').render( + {'user': self.user, 'token': self.token, 'url': settings.SITE_URL} + ) + msg = EmailMultiAlternatives( + 'Over uw persoonsgegevens', + text_content, + 'no-reply@cosmo.service.rug.nl', + [self.user.email]) + msg.attach_alternative(html_content, "text/html") + msg.send() + + +class PendingGDPRDelete(models.Model): + user = models.ForeignKey('auth.User', on_delete=models.CASCADE) + token = models.TextField() + + def forget(self, request): + self.user.username = 'deleted_at_{}'.format(timezone.now()) + self.user.first_name = '' + self.user.last_name = '' + self.user.email = '' + self.user.is_active = False + self.user.save() + user_logged_out.send(sender=self.user.__class__, request=request, user=self.user) + self.delete() + + def email(self): + html_content = get_template('rugwebsite/email/gdpr_delete.html').render( + {'user': self.user, 'token': self.token, 'url': settings.SITE_URL} + ) + text_content = get_template('rugwebsite/email/gdpr_delete.txt').render( + {'user': self.user, 'token': self.token, 'url': settings.SITE_URL} + ) + + msg = EmailMultiAlternatives( + 'Verzoek verwijdering persoonsgegevens', + text_content, + 'cosmo@rug.nl', + [self.user.email]) + msg.attach_alternative(html_content, "text/html") + msg.send(fail_silently=False) diff --git a/rugwebsite/templates/rugwebsite/base.html b/rugwebsite/templates/rugwebsite/base.html index e8d120f..ee48ff5 100755 --- a/rugwebsite/templates/rugwebsite/base.html +++ b/rugwebsite/templates/rugwebsite/base.html @@ -1,4 +1,5 @@ {% load staticfiles %} + @@ -41,24 +42,30 @@ {% if user.is_authenticated %}
  • {% block accountlink %}Welcome {{ user.get_username }}{% endblock %} - {% comment %}
    +
    {% endcomment %} +
  • +
  • + About personal data +
  • {% else %}
  • Login via the University of Groningen Single Sign on.
  • +
  • + About personal data +
  • {% endif %} - {% if user.is_authenticated %} + {% if user.is_authenticated or shownav %}
    diff --git a/rugwebsite/templates/rugwebsite/email/gdpr_consent.html b/rugwebsite/templates/rugwebsite/email/gdpr_consent.html new file mode 100644 index 0000000..9b2ffaa --- /dev/null +++ b/rugwebsite/templates/rugwebsite/email/gdpr_consent.html @@ -0,0 +1,38 @@ +

    Beste {{ user.first_name }} {{ user.last_name }},

    + +

    + Omdat vanaf 25 mei aanstaande nieuwe privacy-wetgeving van de EU ingaat, willen wij u informeren over de + persoonsgegevens die wij van u hebben. U heeft in het verleden gebruik gemaakt van + {% block gdpr_title %}Super Awesome Website{% endblock %} door in te loggen met uw centrale RUG personeels- + of studentnummer en wachtwoord. Toen zijn uw RUG e-mailadres, voornaam, achternaam en student- of personeelsnummer + gekopieerd naar onze database. Op die manier kunt u inloggen en gebruik maken van onze website. +

    + +

    + Samengevat worden de gegevens gebruikt voor authenticatie op onze website en in sommige gevallen voor het + beoordelen van vakgebonden opdrachten die u via onze website maakt. Meer informatie vind u op de volgende pagina. +

    + +{{ url }}{% url 'gdpr-agree' user.email token %} + +

    + Wij willen u vragen voor 25 mei aanstaande toestemming te geven om deze gegevens te bewaren. Doet u dat niet, + dan verdwijnt uw + account op 25 mei. U kunt dan wel opnieuw inloggen, maar dan wordt er een nieuw account aangemaakt en heeft + geen toegang meer tot gegevens die voorheen aan uw account gebonden waren en niet uw persooonsgegevens zijn. + + Mogelijk betekent dat ook opdrachten die nog niet officieel beoordeeld zijn, dan niet meer beoordeeld kunnen worden, + omdat niet meer te achterhalen valt wie die heeft uitgevoerd. Mocht u nog wachten op zo'n beoordeling maar wel uw + persoonsgegevens willen verwijderen, dan adviseren wij u eerst akkoord te gaan, maar na de officiele beoordeling uw + persoonsgegevens alsnog te verwijderen. Dat kan eenvoudig via een link op de website. +

    + +

    + Geeft u wel toestemming dan kunt u later alsnog uw persoonsgegevens verwijderen. Met de volgende link kunt + u toestemming geven, door op "Toestemming geven" te klikken. +

    + +{{ url }}{% url 'gdpr-agree' user.email token %}?agree + +

    Met vriendelijke groet,

    +

    {% block gdpr_close %}Super Awesome Website{% endblock %}

    diff --git a/rugwebsite/templates/rugwebsite/email/gdpr_consent.txt b/rugwebsite/templates/rugwebsite/email/gdpr_consent.txt new file mode 100644 index 0000000..79a6469 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/email/gdpr_consent.txt @@ -0,0 +1,35 @@ +Beste {{ user.first_name }} {{ user.last_name }}, + +Omdat vanaf 25 mei aanstaande nieuwe privacy-wetgeving van de EU ingaat, willen wij u informeren over de +persoonsgegevens die wij van u hebben. U heeft in het verleden gebruik gemaakt van +{% block gdpr_title %}Super Awesome Website{% endblock %} door in te loggen met uw centrale RUG personeels- +of studentnummer en wachtwoord. Toen zijn uw RUG e-mailadres, voornaam, achternaam en student- of personeelsnummer +gekopieerd naar onze database. Op die manier kunt u inloggen en gebruik maken van onze website. + + +Samengevat worden de gegevens gebruikt voor authenticatie op onze website en in sommige gevallen voor het +beoordelen van vakgebonden opdrachten die u via onze website maakt. Meer informatie vind u op de volgende pagina. + + +{{ url }}{% url 'gdpr-agree' user.email token %} + + +Wij willen u vragen voor 25 mei aanstaande toestemming te geven om deze gegevens te bewaren. Doet u dat niet, +dan verdwijnt uw account op 25 mei. U kunt dan wel opnieuw inloggen, maar dan wordt er een nieuw account aangemaakt +en heeft geen toegang meer tot gegevens die voorheen aan uw account gebonden waren en niet uw persooonsgegevens zijn. + +Mogelijk betekent dat ook opdrachten die nog niet officieel beoordeeld zijn, dan niet meer beoordeeld kunnen worden, +omdat niet meer te achterhalen valt wie die heeft uitgevoerd. Mocht u nog wachten op zo'n beoordeling maar wel uw +persoonsgegevens willen verwijderen, dan adviseren wij u eerst akkoord te gaan, maar na de officiele beoordeling uw +persoonsgegevens alsnog te verwijderen. Dat kan eenvoudig via een link op de website. + + +Geeft u wel toestemming dan kunt u later alsnog uw persoonsgegevens verwijderen. Met de volgende link geeft +u toestemming. + + +{{ url }}{% url 'gdpr-agree' user.email token %}?agree + + +Met vriendelijke groet, +{% block gdpr_close %}Super Awesome Website{% endblock %} diff --git a/rugwebsite/templates/rugwebsite/email/gdpr_delete.html b/rugwebsite/templates/rugwebsite/email/gdpr_delete.html new file mode 100644 index 0000000..03728f7 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/email/gdpr_delete.html @@ -0,0 +1,26 @@ +

    Beste {{ user.first_name }} {{ user.last_name }},

    + +

    + Op uw verzoek sturen we u een link om uw persoonsgegevens van + {% block gdpr_title %}Super Awesome Website{% endblock %} + te verwijderen. Wanneer u uw persoonsgegevens verwijdert, wordt ook uw personeels- of studentnummer verwijderd. + Dat betekend dat wij geen manier meer hebben om u the authenticeren en u kunt daarna dus niet meer inloggen. +

    + +

    + Logt u wel opnieuw in, dan worden uw gegevens opnieuw uit de centrale database van de RUG gehaald, en + krijgt u een nieuw en leeg account. In dat geval staan uw persoonsgegevens, namelijk e-mailadres, voornaam, + achternaam en student- of personeelsnummer weer in onze database. +

    + +

    + Uw wachtwoord wordt door de centrale database van de RUG beheert, daar hebben wij geen toegang toe. + Wij gebruiken dezelfde authenticatie als bijvoorbeeld Nestor, progresswww en my university. +

    + +

    Gebruik deze link om al uw persoonsgegevens te verwijderen, u kunt niet meer inloggen.

    + +{{ url }}{% url 'gdpr-delete' user.email token %} + +

    Met vriendelijke groet,

    +

    {% block gdpr_close %}Super Awesome Website{% endblock %}

    \ No newline at end of file diff --git a/rugwebsite/templates/rugwebsite/email/gdpr_delete.txt b/rugwebsite/templates/rugwebsite/email/gdpr_delete.txt new file mode 100644 index 0000000..0ed9a9c --- /dev/null +++ b/rugwebsite/templates/rugwebsite/email/gdpr_delete.txt @@ -0,0 +1,24 @@ +Beste {{ user.first_name }} {{ user.last_name }}, + + +Op uw verzoek sturen we u een link om uw persoonsgegevens van {% block gdpr_title %}Super Awesome Website{% endblock %} +te verwijderen. Wanneer u uw persoonsgegevens verwijdert, wordt ook uw personeels- of studentnummer verwijderd. +Dat betekend dat wij geen manier meer hebben om u the authenticeren en u kunt daarna dus niet meer inloggen. + + +Logt u wel opnieuw in, dan worden uw gegevens opnieuw uit de centrale database van de RUG gehaald, en +krijgt u een nieuw en leeg account. In dat geval staan uw persoonsgegevens, namelijk e-mailadres, voornaam, +achternaam en student- of personeelsnummer weer in onze database. + + +Uw wachtwoord wordt door de centrale database van de RUG beheert, daar hebben wij geen toegang toe. +Wij gebruiken dezelfde authenticatie als bijvoorbeeld Nestor, progresswww en my university. + + +Gebruik deze link om al uw persoonsgegevens te verwijderen, u kunt niet meer inloggen. + + +{{ url }}{% url 'gdpr-delete' user.email token %} + +Met vriendelijke groet, +{% block gdpr_close %}Super Awesome Website{% endblock %} \ No newline at end of file diff --git a/rugwebsite/templates/rugwebsite/gdpr.html b/rugwebsite/templates/rugwebsite/gdpr.html new file mode 100755 index 0000000..8c843f0 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/gdpr.html @@ -0,0 +1,190 @@ +{% extends "rugwebsite/base.html" %} + +{% load static %} +{% load bootstrap4 %} + +{% block nav %} +
    + GDPR +
    +{% endblock %} + + +{% block content %} +
    +
    +
    +

    GDPR

    +

    Privacyverklaring

    +
    + Verzoek tot verwijderen persoonsgegevens + {% if show_agree_button %} +
    + Toestemming geven + {% endif %} + +
    +
    + {% block gdpr_content %} +

    Privacyverklaring {% block gdpr_title %}Super Awesome Website{% endblock %}

    + +

    Inleiding

    + +

    + De Rijksuniversiteit Groningen (RUG) wil zorgvuldig omgaan met uw persoonsgegevens. Op grond van de + privacywetgeving, die de RUG in acht neemt, is de RUG daar ook verantwoordelijk voor. In deze privacyverklaring + wordt u geïnformeerd over hoe de RUG gegevens van u verwerkt en over de rechten die u hebt. Deze privacyverklaring + is een aanvulling op de + + ‘Regeling Bescherming Persoonsgegevens Studenten en Personeel’ + + van de RUG. Bij tegenstrijdigheid prevaleert deze privacyverklaring. +

    + +

    Contactgegevens verantwoordelijke

    + +

    U kunt met uw vragen en verzoeken bij de RUG terecht. U kunt terecht bij:

    + +

    Rijksuniversiteit Groningen

    +

    Postadres: Postbus 72 9700 AB Groningen

    +

    E-mail: privacy@rug.nl

    +

    Contactpersoon {% block gdpr_c_title %}{% endblock %}: {% block gdpr_contact %}{% endblock %}

    +

    Functionaris voor de Gegevensbescherming: Arjen Deenen

    + + +

    Doel en grondslag verwerking

    + +

    + De RUG verwerkt uw persoonsgegevens in het kader van educatie. Het bijhouden van uw + {% block gdpr_content_summary %}voornaam, achternaam, e-mailadres en personeels- of studentnummer{% endblock %}, + dient daarbij verschillende doelen: +

    + + {% block gdpr_goals %} +
      +
    • educatie, de beoordeling van opdrachten voor vakken waarvoor u de workbench nodig heeft,
    • +
    • authenticatie, zodat u kunt inloggen op de workbench, uw annotaties kunt zien of aanpassen wanneer + dat gepast is.
    • +
    + {% endblock gdpr_goals %} + +

    + Verder worden de annotaties die u met de workbench maakt opgeslagen en gekoppeld aan deze persoonsgegevens. + Als vergeten wilt worden, kunt uw persoonsgegevens hier verwijderen. U ontvangt + een e-mail met een link waarop u moet klikken. Dan worden uw personeels- of studentnummer, ur voor- en achternaam + en uw e-mailadres verwijdert en kunt u geen gebruik meer maken van de dienst. +

    + +

    + Samengevat wil de RUG met deze website gegevens verzamelen voor wetenschappelijk onderzoek. Het realiseren van + deze doelen is te rechtvaardigen op basis van de volgende grondslagen +

    + + {% block gdpr_grondslagen %} +
      +
    • ondubbelzinnige toestemming,
    • +
    • noodzakelijk voor uitvoering overeenkomst, of
    • +
    • noodzakelijk voor invulling publiekrechtelijke taak (bij bestuursorgaan).
    • +
    + {% endblock gdpr_grondslagen %} + +

    Verwerkte persoonsgegevens

    + + +

    De RUG verwerkt in het kader van educatie de volgende persoonsgegevens van u:

    +
      +
    • Voor- en achternaam, om u eenvoudig te kunnen identificeren in andere administraties,
    • +
    • e-mailadres, om contact met u op te kunnen nemen,
    • +
    • personeels- of student-nummer, om u eenduidig te kunnen koppelen aan bijvoorbeeld een cijferlijst en om het + mogelijk te maken u in te laten loggen.
    • +
    + +

    + Uw wachtwoord wordt op geen enkele manier door ons opgeslagen of verwerkt, voor authenticatie gebruiken + wij de algemene aucount registratie van de RUG, die wordt beheerd door de afdeling Identity and Access Management + (IAM) van de RUG. +

    + +

    Ontvangers van uw persoonsgegevens

    + +

    + Binnen de organisatie van de RUG worden uw persoonsgegevens uitsluitend verwerkt door de personen voor wie dat + noodzakelijk is in het kader van het uitzetten en houden van educatie en onderzoek. +

    + +

    + Voor het opzetten en uitvoeren van de Pictures-And-Text workbench schakelt de RUG geen externe partner (verwerker) + in. Alle geautomatiseerde verwerking vindt plaats binnen de RUG bij het Centrum voor Informatietechnologie. +

    + +

    Bewaartermijnen

    + +

    + De RUG bewaart uw persoonsgegevens totdat u een verwijderdverzoek indient. Dan worden uw voornaam, + achternaam, student- of personeelsnummer en e-mailadres verwijderd, maar niet de annotaties die u heeft + toegevoegd, omdat dit geen persoonsgegevens betreft. +

    + +

    + U kunt hier een verwijderverzoek indienen. Dat gaat volledig + eletronisch, niemand wordt op de hoogte gesteld van het verzoek en uw verzoek hoeft niet handmatig + goedgekeurd te worden. +

    + Houdt u er rekening mee dat de gegevens nodig zijn voor het behalen van cijfers, mocht u verwijdering eisen + voordat uw werk beoordeeld is, dan kunt u mogelijk uw vakken niet met succes afsluiten. +

    + +

    Uw rechten

    + +

    + U hebt op grond van de privacywetgeving diverse rechten. U kunt voor de uitoefening van uw rechten contact opnemen + met de RUG. Uw verzoeken worden binnen een maand na ontvangst beoordeeld en afgehandeld. Voor behandeling wordt + vastgesteld dat het verzoek is ingediend door een bevoegd persoon en dat het legitiem is. Daarom kan om uw + legitimatie worden gevraagd voordat het verzoek in behandeling wordt genomen. +

    + +

    + U hebt het recht te verzoeken om een overzicht van de over u verwerkte persoonsgegevens en de verwerkingen daarvan. + Als u vindt dat uw persoonsgegevens onjuist zijn of als u niet langer wilt dat uw gegevens worden verwerkt, kunt u + vragen om deze gegevens aan te passen of om verwerking van uw persoonsgegevens te stoppen en deze te verwijderen. + U hebt in bepaalde gevallen ook recht op een afschrift van uw persoonsgegevens in een bruikbaar formaat. Om uw + verzoek te beoordelen en af te handelen, worden vanzelfsprekend uw persoonsgegevens verwerkt. +

    + +

    + Naast het feit dat u bij de RUG terecht kunt met uw vragen, verzoeken en klachten, hebt u het recht om een klacht + in te dienen bij de toezichthoudende autoriteit. Dit is in Nederland de Autoriteit Persoonsgegevens. +

    + +

    Veranderingen in deze privacyverklaring

    + +

    + De RUG kan deze privacyverklaring wijzigen. Aanleiding hiervoor kan zijn: (wijziging van)wet- en regelgeving, + wijziging in het overkoepelende privacybeleid van de RUG en voortschrijden van de techniek. Uiteraard wordt u + hiervan tijdig op de hoogte gesteld. +

    + {% endblock gdpr_content %} +
    +
    +
    + +{% if show_agree_button %} + +{% endif %} + +{% endblock content%} \ No newline at end of file diff --git a/rugwebsite/templates/rugwebsite/gdpr_agree_success.html b/rugwebsite/templates/rugwebsite/gdpr_agree_success.html new file mode 100755 index 0000000..561f721 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/gdpr_agree_success.html @@ -0,0 +1,24 @@ +{% extends "rugwebsite/base.html" %} + +{% load static %} + + +{% block content %} +

    Hartelijk dank!

    + +

    +{% if already_agreed %} + U was al eerder akoord gegaan.
    +
    + Eventueel kunt u hier een verwijder verzoek indienen. +{% elif token_not_found %} + Er ging iets mis, neem contact op met de Data Protection Officer van de RUG. Excuses voor het ongemak. +
    + Eventueel kunt u hier een verwijder verzoek indienen. +{% else %} + We zullen uw persoonsgegevens zorgvuldig bewaren. Mocht u in de toekomst van gedachte veranderen, dan kunt u ze + hier + verwijderen. +{% endif %} +

    +{% endblock content %} diff --git a/rugwebsite/templates/rugwebsite/gdpr_delete.html b/rugwebsite/templates/rugwebsite/gdpr_delete.html new file mode 100755 index 0000000..238a0f9 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/gdpr_delete.html @@ -0,0 +1,14 @@ +{% extends "rugwebsite/base.html" %} + +{% load static %} + + +{% block content %} +

    Uw persoonsgegevens zijn verwijderd

    + +

    + Uw versoonsgegevens zijn verwijdert. Als u opnieuw inlogt, worden uw gegevens opnieuw opgehaald uit de centrale + RUG administratie en krijgt u een nieuw account. +

    + +{% endblock content %} diff --git a/rugwebsite/templates/rugwebsite/gdpr_request_delete.html b/rugwebsite/templates/rugwebsite/gdpr_request_delete.html new file mode 100755 index 0000000..e1425f6 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/gdpr_request_delete.html @@ -0,0 +1,38 @@ +{% extends "rugwebsite/base.html" %} + +{% load static %} +{% load bootstrap4 %} + + +{% block content %} +
    +
    +
    +

    GDPR

    +

    Persoonsgegevens verwijderen

    +
    +
    +
    +

    Verzoek tot verwijderen persoonsgegevens

    +

    + Vul uw e-mail adres in, wij sturen u een e-mail met een link waarmee uw persoonsgegevens verwijderd kunnen worden. +

    +
    + {% csrf_token %} + {% bootstrap_form form %} + +
    +
    +
    +
    + +{% endblock content%} + +{% block nav %} +
    + GDPR +
    + +{% endblock %} diff --git a/rugwebsite/templates/rugwebsite/gdpr_request_delete_successful.html b/rugwebsite/templates/rugwebsite/gdpr_request_delete_successful.html new file mode 100755 index 0000000..3a0f1c2 --- /dev/null +++ b/rugwebsite/templates/rugwebsite/gdpr_request_delete_successful.html @@ -0,0 +1,26 @@ +{% extends "rugwebsite/base.html" %} + +{% load static %} + +{% block nav %} +
    + GDPR +
    + +{% endblock %} + +{% block content %} +

    Verzoek tot verwijderen persoonsgegevens

    + +

    +{% if found %} + We hebben een e-mail verstuurd waarmee u uw persoonsgegevens kunt verwijderen. +{% else %} + We hebben geen account met dat adres, probeer het nogmaals.
    + Nogmaals proberen. +{% endif %} +

    + +{% endblock content %} diff --git a/rugwebsite/urls.py b/rugwebsite/urls.py index 5b05bd2..751c549 100755 --- a/rugwebsite/urls.py +++ b/rugwebsite/urls.py @@ -1,9 +1,10 @@ from django.conf.urls import include, url import django_saml2_pro_auth.urls as saml_urls -from rugwebsite.views import home - +from rugwebsite.views import home, gdpr, request_gdpr_delete urlpatterns = [ + url(r'gdpr/$', gdpr, name='gdpr'), + url(r'gdpr-forget-me/$', request_gdpr_delete, name='gdpr-forget-me'), url(r'', include(saml_urls, namespace='saml')), url(r'$', home), ] diff --git a/rugwebsite/views.py b/rugwebsite/views.py index 157f402..59a8f9b 100644 --- a/rugwebsite/views.py +++ b/rugwebsite/views.py @@ -1,8 +1,79 @@ +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import User from django.shortcuts import render +from rugwebsite.forms import RequestGDPRDelete +from rugwebsite.models import PendingGDPRAgree, GDPRAgreed, PendingGDPRDelete + +from django.utils.crypto import get_random_string + + def home(request): + return render(request, 'rugwebsite/home.html', {'shownav': True}) - return render(request, 'rugwebsite/home.html', { +def gdpr(request): + return render(request, 'rugwebsite/gdpr.html', {'show_agree_button': False, 'shownav': True}) - }) + +@login_required +def gdpr_ask_agreement(request): + if not request.user.is_superuser: + raise PermissionError() + + for user in User.objects.filter(username='herbert').all(): + token = get_random_string(length=32) + pending = PendingGDPRAgree(user=user, token=token) + pending.save() + pending.email() + return render(request, 'rugwebsite/gdpr.html', {'show_agree_button': False, 'shownav': True}) + + +def gdpr_request_delete(request): + if request.method == 'POST': + form = RequestGDPRDelete(request.POST) + if form.is_valid(): + users = list(User.objects.filter(email=form.cleaned_data['email']).all()) + for user in users: + token = get_random_string(length=32) + pending = PendingGDPRDelete(user=user, token=token) + pending.save() + pending.email() + return render(request, 'rugwebsite/gdpr_request_delete_successful.html', {'shownav': True, 'found': len(users) > 0}) + else: + form = RequestGDPRDelete() + + return render(request, 'rugwebsite/gdpr_request_delete.html', {'form': form, 'shownav': True}) + + +def gdpr_delete(request, email, token): + pending = list(PendingGDPRDelete.objects.filter(user__email=email, token=token).all()) + if len(pending) > 0: + for pending in pending: + pending.forget(request) + return render(request, 'rugwebsite/gdpr_delete.html', {'deleted': True, 'shownav': True}) + return render(request, 'rugwebsite/gdpr_delete.html', {'deleted': False, 'shownav': True}) + + +def gdpr_agree(request, email, token): + if 'agree' not in request.GET: + return render(request, 'rugwebsite/gdpr.html', {'show_agree_button': True, 'shownav': True, 'email': email, + 'token': token}) + + result = { + 'already_agreed': GDPRAgreed.objects.filter(user__email=email).exists(), + 'show_agree_buttom': False, + 'shownav': True + } + + if not result['already_agreed']: + pending = list(PendingGDPRAgree.objects.filter(token=token, user__email=email).all()) + if len(pending) == 1: + pending[0].agree() + else: + if GDPRAgreed.objects.filter(user__email=email).exists(): + result['already_agreed'] = True + else: + result['token_not_found'] = True + + return render(request, 'rugwebsite/gdpr_agree_success.html', result, {'shownav': True})