From a8bce1a48f967faeae26f66a53af5b452ef765cb Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Mon, 19 Apr 2021 16:44:01 +0200 Subject: [PATCH 01/17] fix subject_filter fixture --- tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 7a25665f4..8aac23632 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -204,6 +204,6 @@ def subject_filter(subject_filter_group, attribute_description): return SubjectFilter.objects.create( description=attribute_description, operator='exact', - value='left', + value=1, group=subject_filter_group, ) -- GitLab From 466a77761f76a7bcd12a8fbf737f0e067cad8b75 Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Tue, 20 Apr 2021 12:11:08 +0200 Subject: [PATCH 02/17] do not include study in tag str --- castellum/studies/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/castellum/studies/models.py b/castellum/studies/models.py index f98fe4a1a..d2d8a07f8 100644 --- a/castellum/studies/models.py +++ b/castellum/studies/models.py @@ -383,4 +383,4 @@ class StudyTag(models.Model): name = models.CharField(_('Name'), max_length=128) def __str__(self): - return '{} - {}'.format(self.study, self.name) + return self.name -- GitLab From 7e4f3d5845e2ebb38fee3beea3589246c6453e8c Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Tue, 20 Apr 2021 15:41:50 +0200 Subject: [PATCH 03/17] allow to pass plain values to display filter --- castellum/utils/templatetags/utils.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/castellum/utils/templatetags/utils.py b/castellum/utils/templatetags/utils.py index f556d6524..175122fff 100644 --- a/castellum/utils/templatetags/utils.py +++ b/castellum/utils/templatetags/utils.py @@ -49,9 +49,11 @@ def verbose_name(instance, field_name): @register.filter -def display(instance, field_name): - getter = getattr(instance, 'get_{}_display'.format(field_name), None) - value = getter() if getter else getattr(instance, field_name) +def display(value, field_name=None): + if field_name: + getter = getattr(value, 'get_{}_display'.format(field_name), None) + value = getter() if getter else getattr(value, field_name) + if value is True: return _('Yes') elif value is False: -- GitLab From 58160545ea43403c22359db27a485aca043e70ef Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Mon, 19 Apr 2021 14:48:32 +0200 Subject: [PATCH 04/17] add study.snapshot model field --- .../studies/migrations/0031_study_snapshot.py | 18 ++++++++++++++++++ castellum/studies/models.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 castellum/studies/migrations/0031_study_snapshot.py diff --git a/castellum/studies/migrations/0031_study_snapshot.py b/castellum/studies/migrations/0031_study_snapshot.py new file mode 100644 index 000000000..4fbf493b4 --- /dev/null +++ b/castellum/studies/migrations/0031_study_snapshot.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2 on 2021-04-19 13:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('studies', '0030_domain_context'), + ] + + operations = [ + migrations.AddField( + model_name='study', + name='snapshot', + field=models.TextField(blank=True, editable=False, verbose_name='Snapshot'), + ), + ] diff --git a/castellum/studies/models.py b/castellum/studies/models.py index d2d8a07f8..cbda835f8 100644 --- a/castellum/studies/models.py +++ b/castellum/studies/models.py @@ -126,6 +126,7 @@ class Study(models.Model): blank=True, ) announce_status_changes = models.BooleanField(_('Announce status changes'), default=False) + snapshot = models.TextField(_('Snapshot'), blank=True, editable=False) members = models.ManyToManyField(User, through='StudyMembership') domains = GenericRelation(Domain) -- GitLab From 4071c320f234ba33afb073d0acea9353e813c67c Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Mon, 19 Apr 2021 15:14:11 +0200 Subject: [PATCH 05/17] store study snapshot on start --- castellum/studies/views/studies.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/castellum/studies/views/studies.py b/castellum/studies/views/studies.py index a59cc84a4..1f9d23d2f 100644 --- a/castellum/studies/views/studies.py +++ b/castellum/studies/views/studies.py @@ -24,6 +24,7 @@ import logging from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin +from django.core import serializers from django.core.exceptions import PermissionDenied from django.db import models from django.forms import modelform_factory @@ -49,6 +50,7 @@ from castellum.castellum_auth.mixins import PermissionRequiredMixin from castellum.pseudonyms.models import Domain from castellum.recruitment import filter_queries from castellum.recruitment.models import Participation +from castellum.recruitment.models import SubjectFilter from castellum.subjects.models import Subject from castellum.utils.mail import MailContext from castellum.utils.views import get_next_url @@ -319,6 +321,18 @@ class StudyStartRecruitmentView(StudyMixin, PermissionRequiredMixin, View): ) else: self.study.set_status(self.study.EXECUTION) + + self.study.snapshot = serializers.serialize('json', [ + self.study, + *self.study.studymembership_set.all(), + *self.study.domains.all(), + *self.study.studytag_set.all(), + *self.study.studysession_set.all(), + *self.study.subjectfiltergroup_set.all(), + *SubjectFilter.objects.filter(group__study=self.study), + ]) + self.study.save() + monitoring_logger.info( 'Study {} started by {}'.format(self.study.name, self.request.user.pk) ) -- GitLab From ad27b3f904edaca6941a34f6488a66246f41a9e2 Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Tue, 20 Apr 2021 11:00:59 +0200 Subject: [PATCH 06/17] exclude snapshot itself in snapshot --- castellum/studies/views/studies.py | 3 ++- castellum/utils/__init__.py | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/castellum/studies/views/studies.py b/castellum/studies/views/studies.py index 1f9d23d2f..6913707d1 100644 --- a/castellum/studies/views/studies.py +++ b/castellum/studies/views/studies.py @@ -52,6 +52,7 @@ from castellum.recruitment import filter_queries from castellum.recruitment.models import Participation from castellum.recruitment.models import SubjectFilter from castellum.subjects.models import Subject +from castellum.utils import Exclusion from castellum.utils.mail import MailContext from castellum.utils.views import get_next_url @@ -330,7 +331,7 @@ class StudyStartRecruitmentView(StudyMixin, PermissionRequiredMixin, View): *self.study.studysession_set.all(), *self.study.subjectfiltergroup_set.all(), *SubjectFilter.objects.filter(group__study=self.study), - ]) + ], fields=Exclusion(['snapshot'])) self.study.save() monitoring_logger.info( diff --git a/castellum/utils/__init__.py b/castellum/utils/__init__.py index efca33b16..8f828e1d9 100644 --- a/castellum/utils/__init__.py +++ b/castellum/utils/__init__.py @@ -70,3 +70,11 @@ def get_parler_languages(site_id=None): names = dict(settings.LANGUAGES) codes = [lang['code'] for lang in settings.PARLER_LANGUAGES.get(site_id, [])] return [(code, names[code]) for code in codes] + + +class Exclusion: + def __init__(self, values): + self.values = values + + def __contains__(self, value): + return not (value in self.values) -- GitLab From 0bc72eb1a55cd57ad562dd33d029d667fcd74a5b Mon Sep 17 00:00:00 2001 From: Tobias Bengfort Date: Mon, 19 Apr 2021 15:28:46 +0200 Subject: [PATCH 07/17] add basic study diff view --- castellum/studies/templates/studies/study_base.html | 6 ++++++ castellum/studies/templates/studies/study_diff.html | 7 +++++++ castellum/studies/urls/__init__.py | 2 ++ castellum/studies/views/studies.py | 7 +++++++ 4 files changed, 22 insertions(+) create mode 100644 castellum/studies/templates/studies/study_diff.html diff --git a/castellum/studies/templates/studies/study_base.html b/castellum/studies/templates/studies/study_base.html index be2af5b1d..bb783520a 100644 --- a/castellum/studies/templates/studies/study_base.html +++ b/castellum/studies/templates/studies/study_base.html @@ -110,6 +110,12 @@ {% translate 'Overview' %} + {% if can_access_study and can_approve_study %} + + {% endif %} + {% if can_access_study and can_change_study %}