Skip to content
Snippets Groups Projects
Commit 737fc1dc authored by Piotr Gawron's avatar Piotr Gawron
Browse files

privacy notice file is removed when privacy notice object is removed from database

parent 37269218
No related branches found
No related tags found
1 merge request!305Resolve "Allow for adding modifying types of subjects"
Pipeline #37952 passed
smasch (1.1.0~alpha.0-1) unstable; urgency=low
* bug fix: privace noticy files were not removed when policy was removed
-- Piotr Gawron <piotr.gawron@uni.lu> Thu, 25 Feb 2021 17:00:00 +0200
smasch (1.0.0~beta.6-1) unstable; urgency=low
* bug fix: when two visits with the same start date are created compute visit
......
# coding=utf-8
import datetime
import os
from django.db import models
from django.dispatch import receiver
from web.templatetags.filters import basename
class PrivacyNotice(models.Model):
name = models.CharField(max_length=255, verbose_name='Name')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='Created at')
updated_at = models.DateTimeField(auto_now=True, verbose_name='Updated at')
summary = models.CharField(max_length=255, verbose_name='Summary', blank=False, null=False)
document = models.FileField(upload_to='privacy_notices/',
document = models.FileField(upload_to='privacy_notices/',
verbose_name='Study Privacy Notice file',
null=False, editable=True)
......@@ -19,3 +22,36 @@ class PrivacyNotice(models.Model):
@property
def all_studies(self):
return self.studies.all()
# These two auto-delete files from filesystem when they are unneeded:
@receiver(models.signals.post_delete, sender=PrivacyNotice)
def auto_delete_file_on_delete(sender, instance: PrivacyNotice, **kwargs):
"""
Deletes file from filesystem
when corresponding `MediaFile` object is deleted.
"""
if instance.document:
if os.path.isfile(instance.document.path):
os.remove(instance.document.path)
@receiver(models.signals.pre_save, sender=PrivacyNotice)
def auto_delete_file_on_change(sender, instance: PrivacyNotice, **kwargs):
"""
Deletes old file from filesystem
when corresponding `PrivacyNotice` object is updated
with new file.
"""
if not instance.pk:
return False
try:
old_file = PrivacyNotice.objects.get(pk=instance.pk).document
except PrivacyNotice.DoesNotExist:
return False
new_file = instance.document
if not old_file == new_file:
if os.path.isfile(old_file.path):
os.remove(old_file.path)
......@@ -256,7 +256,7 @@ desired effect
{% block footer %}
<!-- To the right -->
<div class="pull-right hidden-xs">
Version: <strong>1.0.0~beta.6</strong>
Version: <strong>1.1.0~alpha.0</strong>
</div>
<!-- Default to the left -->
......
from web.tests.functions import get_resource_path, get_test_study
from web.models import PrivacyNotice, Study, Worker
from web.forms import PrivacyNoticeForm, WorkerAcceptPrivacyNoticeForm
from web.tests import LoggedInTestCase
from django.urls import reverse
from django.core.files.uploadedfile import SimpleUploadedFile
import os
from django.contrib.messages import get_messages
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from web.forms import PrivacyNoticeForm, WorkerAcceptPrivacyNoticeForm
from web.models import PrivacyNotice, Study, Worker
from web.models.constants import GLOBAL_STUDY_ID
from web.tests import LoggedInTestCase
class PrivacyNoticeTests(LoggedInTestCase):
def test_add_privacy_notice(self):
def setUp(self):
super().setUp()
self.assertEqual(0, PrivacyNotice.objects.count())
self.login_as_admin()
form_data = dict(
name='example',
name='example',
summary='example summary'
)
......@@ -29,8 +33,13 @@ class PrivacyNoticeTests(LoggedInTestCase):
self.assertEqual(response.status_code, 302)
self.assertEqual(1, PrivacyNotice.objects.count())
def tearDown(self):
for privacy_notice in PrivacyNotice.objects.all():
path = privacy_notice.document.path
privacy_notice.delete()
self.assertFalse(os.path.isfile(path))
def test_edit_privacy_notice(self):
self.test_add_privacy_notice()
self.assertEqual(1, PrivacyNotice.objects.count())
pn = PrivacyNotice.objects.all()[0]
form_data = dict(
......@@ -52,19 +61,16 @@ class PrivacyNoticeTests(LoggedInTestCase):
self.assertEqual(pn.name, 'example2')
def test_delete_privacy_notice(self):
self.test_add_privacy_notice()
self.assertEqual(1, PrivacyNotice.objects.count())
pn = PrivacyNotice.objects.all()[0]
page = reverse('web.views.privacy_notice_delete', kwargs={'pk': pn.id})
response = self.client.post(page)
self.assertEqual(response.status_code, 302)
self.assertEqual(0, PrivacyNotice.objects.count())
def test_privacy_notice_middleware_superuser(self):
self.test_add_privacy_notice()
self.login_as_admin()
#assign privacy notice
# assign privacy notice
pn = PrivacyNotice.objects.all()[0]
study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0]
study.acceptance_of_study_privacy_notice_required = True
......@@ -82,12 +88,10 @@ class PrivacyNoticeTests(LoggedInTestCase):
self.assertEqual(response.status_code, 200)
messages = list(get_messages(response.wsgi_request))
self.assertEqual(len(messages), 0)
def test_privacy_notice_middleware(self):
self.test_add_privacy_notice()
self.login_as_admin()
#assign privacy notice
# assign privacy notice
pn = PrivacyNotice.objects.all()[0]
study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0]
study.acceptance_of_study_privacy_notice_required = True
......@@ -106,7 +110,7 @@ class PrivacyNoticeTests(LoggedInTestCase):
messages = list(get_messages(response.wsgi_request))
self.assertEqual(len(messages), 1)
self.assertEqual(str(messages[0]), "You can't use the system until you accept the privacy notice.")
#accept privacy notice
# accept privacy notice
form_data = dict(privacy_notice_accepted=True)
form = WorkerAcceptPrivacyNoticeForm(form_data)
self.assertTrue(form.is_valid())
......@@ -115,7 +119,7 @@ class PrivacyNoticeTests(LoggedInTestCase):
self.assertEqual(response.status_code, 302)
messages = [m.message for m in get_messages(response.wsgi_request)]
self.assertIn("Privacy notice accepted", messages)
#check acceptance
# check acceptance
worker = Worker.objects.filter(id=self.staff_worker.id).first()
self.assertEqual(worker.privacy_notice_accepted, True)
page = reverse('web.views.appointments')
......
# coding=utf-8
import io
import logging
from wsgiref.util import FileWrapper
from django.contrib import messages
......@@ -16,6 +17,7 @@ from ..forms.privacy_notice import PrivacyNoticeForm
from ..forms.worker_form import WorkerAcceptPrivacyNoticeForm
from ..models import PrivacyNotice, Worker
logger = logging.getLogger(__name__)
class PrivacyNoticeListView(ListView, WrappedView):
model = PrivacyNotice
......@@ -34,7 +36,8 @@ def privacy_notice_add(request):
if form.is_valid():
try:
form.save()
except:
except Exception as e:
logger.error('Error at %s', 'division', exc_info=e)
messages.add_message(request, messages.ERROR, 'There was a problem when saving privacy notice. '
'Contact system administrator.')
return redirect('web.views.privacy_notices')
......@@ -53,8 +56,9 @@ def privacy_notice_edit(request, pk):
try:
form.save()
return redirect('web.views.privacy_notices')
except:
messages.add_message(request, messages.ERROR, 'There was a problem when updating the privacy notice.'
except Exception as e:
logger.error('Error at %s', 'division', exc_info=e)
messages.add_message(request, messages.ERROR, 'There was a problem when updating the privacy notice. '
'Contact system administrator.')
return wrap_response(request, 'privacy_notice/edit.html',
{'form': form, 'privacy_notice': privacy_notice})
......@@ -96,7 +100,8 @@ def privacy_notice_accept(request, pk):
return redirect('web.views.appointments')
else:
return redirect('logout')
except BaseException:
except BaseException as e:
logger.error('Error at %s', 'division', exc_info=e)
messages.add_message(request, messages.ERROR, 'There was a problem when updating the privacy notice.'
'Contact system administrator.')
return wrap_response(request, 'privacy_notice/acceptance_study_privacy_notice.html',
......
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