From c0e30c30241080d61f89fe723a235f9f930313d8 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 24 Aug 2023 14:32:50 +0200 Subject: [PATCH 001/148] First structure for creating a dict --- proposals/utils/proposal_utils.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 2a8e51a19..fadc76d19 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -302,7 +302,34 @@ def _get_next_proposal_number(current_year) -> int: except Proposal.DoesNotExist: return 1 - +def generate_relevant_data_pdf(proposal): + empty_dict = {} + + empty_dict[_('Algemene informatie over de aanvraag')] = {} + empty_dict[_('Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?')] = {} + + if proposal.wmo.status != proposal.wmo.NO_WMO: + empty_dict[_("Aanmelding bij de METC")] = {} + + empty_dict[_('Eén of meerdere trajecten?')] = {} + + '''Note to self: this will be a huge pain of nesting ... only scratch surface for now ...''' + if proposal.wmo.status == proposal.wmo.NO_WMO: + for study in proposal.study_set.all(): + if proposal.studies_number > 1: + empty_dict['studies'] = {} + if study.name: + empty_dict['studies'][_(f'traject { study.order } { study.name }')] = {} + else: + empty_dict['studies'][_(f'traject { study.order }')] = {} + else: + empty_dict['study'] = {} + + empty_dict['extra documents'] = [] + + empty_dict['Aanmelding versturen'] = {} + + return empty_dict def generate_pdf(proposal, template=False): """Grandfathered function for pdf saving. The template arg currently From b1d1ee34f02baa4bb934f61d045f63127168b5d5 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 28 Aug 2023 15:44:51 +0200 Subject: [PATCH 002/148] Some groundwork and a bit of RowValueClass --- proposals/utils/proposal_utils.py | 108 +++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index fadc76d19..b36d3410e 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -1,6 +1,6 @@ # -*- encoding: utf-8 -*- -from collections import defaultdict +from collections import defaultdict, OrderedDict from datetime import datetime from io import BytesIO import os @@ -306,6 +306,20 @@ def generate_relevant_data_pdf(proposal): empty_dict = {} empty_dict[_('Algemene informatie over de aanvraag')] = {} + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('relation').verbose_name] = proposal.relation + if proposal.relation.needs_supervisor: + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('supervisor').verbose_name] = proposal.supervisor.get_full_name + if proposal.relation.check_in_course: + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_program').verbose_name] = proposal.student_program + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_context').verbose_name] = proposal.student_context + if proposal.student_context.needs_detail: + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_context_detail').verbose_name] = proposal.student_context_details + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_justification').verbose_name] = proposal.student_justification + #I am not quite sure how to add translation to the boolean value resulting here ... + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('other_applicants').verbose_name] = proposal.other_applicants + if proposal.other_applicants: + empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('applicants').verbose_name] = [applicant.get_full_name for applicant in proposal.applicants] + empty_dict[_('Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?')] = {} if proposal.wmo.status != proposal.wmo.NO_WMO: @@ -331,6 +345,97 @@ def generate_relevant_data_pdf(proposal): return empty_dict +class PDFSection: + + section_title = None + row_fields = None + + def __init__(self, object): + self.object = object + # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value + self._row_fields = self.row_fields + + def get_rows(self): + rows = OrderedDict() + for row_field in self._row_fields: + rows[row_field] = { + 'label': self.object._meta.get_field(row_field).verbose_name, + 'value': RowValueClass(self.object, row_field) + } + return rows + + def render(self, context): + template = get_template("proposals/pdf/table_with_header.html") + context.update( + { + "section_title": self.section_title, + "rows": self.get_rows(), + } + ) + return template.render(context) + +class GeneralSection(PDFSection): + # This class inherits from the above + + section_title = _("Algemene informatie over de aanvraag") + row_fields = ['metc', 'metc_details', 'metc_institution'] + + def get_rows(self): + # Remove the metc_details if no METC review is needed + if not self.object.metc: + del self._row_fields['metc_details'] + del self._row_fields['metc_institution'] + # Use the get_rows from PDFSection to get the actual rows, the code above should have filtered out everything we don't need + return super().get_rows() + +class RowValueClass: + + def __init__(self, object, field): + + self.object = object + self.field = field + + def render(self, context): + + value = getattr(self.object, self.field) + + if type(value) in (str, int, datetime.date): + return value + elif type(value) == bool: + return _('Ja') if value else _('Nee') + elif type(value) == User: + return self.handle_user(value) + elif value.__class__.__name__ == 'ManyRelatedManager': + if value.all().model == User: + return self.get_applicants_names(value) + elif value.all().model == Funding: + return self.get_funding_list() + elif callable(value): + return value() + + def handle_user(self, user): + return user.get_full_name() + + def get_applicants_names(self, applicants): + applicant_names = [applicant.get_full_name() for applicant in applicants.all()] + return self.create_unordered_html_list(applicant_names) + + def get_funding_list(self, funding): + list_of_funds = [fund for fund in funding.all()] + return self.create_unordered_html_list(list_of_funds) + + def create_unordered_html_list(list): + html_output = '' + + return html_output + + + def generate_pdf(proposal, template=False): """Grandfathered function for pdf saving. The template arg currently only exists for backwards compatibility.""" @@ -355,6 +460,7 @@ def generate_pdf(proposal, template=False): return proposal.pdf + def pdf_link_callback(uri, rel): """ Convert HTML URIs to absolute system paths so xhtml2pdf can access those From 158c62bbe35c506e2128376be8caa74edfebd44b Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 29 Aug 2023 10:39:38 +0200 Subject: [PATCH 003/148] Furthering test build --- .../proposals/pdf/table_with_header.html | 8 +++ proposals/utils/proposal_utils.py | 50 ++++++++++++++++--- 2 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 proposals/templates/proposals/pdf/table_with_header.html diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html new file mode 100644 index 000000000..68c62ac5d --- /dev/null +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -0,0 +1,8 @@ +

{{ section_title }}

+ +{% for key, value rows.items() %} + + + +{% endfor %} +
{{value.label}}{{ value.value }}
\ No newline at end of file diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index b36d3410e..7aad0c73a 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -19,6 +19,8 @@ from main.utils import AvailableURL, get_secretary from studies.utils import study_urls +from proposals.templatetags.proposal_filters import needs_details + __all__ = ['available_urls', 'generate_ref_number', 'generate_revision_ref_number', 'generate_pdf', @@ -360,7 +362,7 @@ def get_rows(self): for row_field in self._row_fields: rows[row_field] = { 'label': self.object._meta.get_field(row_field).verbose_name, - 'value': RowValueClass(self.object, row_field) + 'value': RowValueClass(self.object, row_field).render() } return rows @@ -375,16 +377,48 @@ def render(self, context): return template.render(context) class GeneralSection(PDFSection): - # This class inherits from the above + '''This class generates the data for the general section of + the PDF page.''' section_title = _("Algemene informatie over de aanvraag") - row_fields = ['metc', 'metc_details', 'metc_institution'] + row_fields = [ + 'relation', + 'supervisor', + 'student program', + 'student_context', + 'student_context_details', + 'student_justification', + 'other_applicants', + 'applicants', + 'other_stakeholders', + 'stakeholders', + 'date_start', + 'title', + 'funding' + 'funding_details', + 'funding_name', + 'self_assessment' + ] def get_rows(self): - # Remove the metc_details if no METC review is needed - if not self.object.metc: - del self._row_fields['metc_details'] - del self._row_fields['metc_institution'] + obj = self.object + rows = self._row_fields + if not obj.needs_supervisor: + del rows['supervisor'] + if not obj.check_in_course: + del rows['student_program'] + del rows['student_context'] + if not obj.student_context.needs_details: + del rows['student_context_details'] + del rows['student_justification'] + if not obj.other_applicants: + del rows['applicants'] + if not obj.other_stakeholders: + del rows['stakeholders'] + if not needs_details(obj.funding.all()): + del rows['funding_details'] + if not needs_details(obj.funding.all(), 'needs_name'): + del rows['funding_name'] # Use the get_rows from PDFSection to get the actual rows, the code above should have filtered out everything we don't need return super().get_rows() @@ -395,7 +429,7 @@ def __init__(self, object, field): self.object = object self.field = field - def render(self, context): + def render(self): value = getattr(self.object, self.field) From 41b9c34dcdc36b5b2024df968298f722bc45bc06 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 29 Aug 2023 16:50:40 +0200 Subject: [PATCH 004/148] First working test, plus extra stuff --- .../templates/proposals/pdf/new_pdf_test.html | 18 ++ .../proposals/pdf/table_with_header.html | 4 +- proposals/utils/proposal_utils.py | 178 ++++++++++++------ proposals/views/proposal_views.py | 15 +- 4 files changed, 154 insertions(+), 61 deletions(-) create mode 100644 proposals/templates/proposals/pdf/new_pdf_test.html diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html new file mode 100644 index 000000000..c03c57358 --- /dev/null +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -0,0 +1,18 @@ +{% extends "base/base.html" %} + +{% load static %} +{% load proposal_filters %} +{% load fetc_filters %} +{% load i18n %} +{% load compare_tags %} +{% load uil_filters %} + +{% block header_title %} + New PDF test +{% endblock %} + +{% block content %} + + {% include test %} + +{% endblock %} \ No newline at end of file diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html index 68c62ac5d..0f0e00c65 100644 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -1,8 +1,8 @@

{{ section_title }}

-{% for key, value rows.items() %} +{% for label, value in rows.items %} - + {% endfor %}
{{value.label}}{{ value.value }}{{ value.label }}{{ value.value }}
\ No newline at end of file diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 7aad0c73a..13e70911d 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- from collections import defaultdict, OrderedDict -from datetime import datetime +from datetime import datetime, date from io import BytesIO import os @@ -347,23 +347,36 @@ def generate_relevant_data_pdf(proposal): return empty_dict +from django.contrib.auth import get_user_model +from django.utils.safestring import mark_safe +from django.utils.html import format_html +from copy import copy class PDFSection: section_title = None row_fields = None + verbose_name_diff_field_dict = { + 'get_metc_display': ('wmo', 'metc') + 'get_is_medical_display': ('wmo','is_medical') + + } def __init__(self, object): self.object = object # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value - self._row_fields = self.row_fields + self._row_fields = copy(self.row_fields) def get_rows(self): rows = OrderedDict() for row_field in self._row_fields: - rows[row_field] = { - 'label': self.object._meta.get_field(row_field).verbose_name, - 'value': RowValueClass(self.object, row_field).render() - } + if type(row_field) == str: + rows[row_field] = { + 'label': self.object._meta.get_field(row_field).verbose_name, + 'value': RowValueClass(self.object, row_field).render() + } + #TODO: finish this + if type(row_field) == tuple: + return rows def render(self, context): @@ -374,7 +387,7 @@ def render(self, context): "rows": self.get_rows(), } ) - return template.render(context) + return template.render(context.flatten()) class GeneralSection(PDFSection): '''This class generates the data for the general section of @@ -384,7 +397,7 @@ class GeneralSection(PDFSection): row_fields = [ 'relation', 'supervisor', - 'student program', + 'student_program', 'student_context', 'student_context_details', 'student_justification', @@ -394,79 +407,128 @@ class GeneralSection(PDFSection): 'stakeholders', 'date_start', 'title', - 'funding' + 'funding', 'funding_details', 'funding_name', - 'self_assessment' + 'self_assessment', ] def get_rows(self): obj = self.object rows = self._row_fields - if not obj.needs_supervisor: - del rows['supervisor'] - if not obj.check_in_course: - del rows['student_program'] - del rows['student_context'] - if not obj.student_context.needs_details: - del rows['student_context_details'] - del rows['student_justification'] + if not obj.relation.needs_supervisor: + rows.remove('supervisor') + if not obj.relation.check_in_course: + rows.remove('student_program') + rows.remove('student_context') + if obj.student_context is not None: + if not obj.student_context.needs_details: + rows.remove('student_context_details') + else: + rows.remove('student_context_details') + rows.remove('student_justification') if not obj.other_applicants: - del rows['applicants'] + rows.remove('applicants') if not obj.other_stakeholders: - del rows['stakeholders'] + rows.remove('stakeholders') if not needs_details(obj.funding.all()): - del rows['funding_details'] + rows.remove('funding_details') if not needs_details(obj.funding.all(), 'needs_name'): - del rows['funding_name'] + rows.remove('funding_name') # Use the get_rows from PDFSection to get the actual rows, the code above should have filtered out everything we don't need return super().get_rows() +class WMOSection(PDFSection): + + section_title = _("Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?") + row_fields = [ + 'get_metc_display', + 'metc_details', + 'metc_institution', + 'get_is_medical_display' + ] + + def __init__(self, object): + super().__init__(self, object) + self.object = self.object.wmo + + def get_rows(self): + obj = self.object + rows = self._row_fields + if not obj.metc == 'Y': + rows.remove('metc_details') + rows.remove('metc_institution') + else: + rows.remove('get_is_medical') + + + class RowValueClass: - def __init__(self, object, field): + def __init__(self, object, field): - self.object = object - self.field = field + self.object = object + self.field = field - def render(self): + def render(self): + from ..models import Funding, Relation + if type(self.field) == str: value = getattr(self.object, self.field) - - if type(value) in (str, int, datetime.date): - return value - elif type(value) == bool: - return _('Ja') if value else _('Nee') - elif type(value) == User: - return self.handle_user(value) - elif value.__class__.__name__ == 'ManyRelatedManager': - if value.all().model == User: - return self.get_applicants_names(value) - elif value.all().model == Funding: - return self.get_funding_list() - elif callable(value): - return value() - - def handle_user(self, user): - return user.get_full_name() + '''A workaround for accessing subclasses: + For a subclass provide a tuple like so: + ('wmo', 'metc')''' + if type(self.field) == tuple: + #TODO: create a separate method for this! + obj = self.object + for item in self.field: + value = getattr(obj, item) + obj = value + + User = get_user_model() + + if type(value) in (str, int, date): + return value + if value is None: + return _('Onbekend') + elif type(value) == bool: + return _('Ja') if value else _('Nee') + elif type(value) == User: + return self.handle_user(value) + elif type(value) == Relation: + return value.description + elif value.__class__.__name__ == 'ManyRelatedManager': + if value.all().model == User: + return self.get_applicants_names(value) + elif value.all().model == Funding: + return self.get_funding_list(value) + elif callable(value): + return value() - def get_applicants_names(self, applicants): - applicant_names = [applicant.get_full_name() for applicant in applicants.all()] - return self.create_unordered_html_list(applicant_names) - - def get_funding_list(self, funding): - list_of_funds = [fund for fund in funding.all()] - return self.create_unordered_html_list(list_of_funds) + def handle_user(self, user): + return user.get_full_name() + + def get_applicants_names(self, applicants): + applicant_names = [applicant.get_full_name() for applicant in applicants.all()] + return self.create_unordered_html_list(applicant_names) + + def get_funding_list(self, funding): + list_of_funds = [fund for fund in funding.all()] + return self.create_unordered_html_list(list_of_funds) + + def create_unordered_html_list(self, list): + html_output = mark_safe('
    ') + + for item in list: + html_output += format_html('{}{}{}', + mark_safe('
  • '), + item, + mark_safe('
  • ') + ) - def create_unordered_html_list(list): - html_output = '
      ' - - for item in list: - html_output += f'
    • {item}
    • ' - - html_output += '
    ' + html_output += mark_safe('
') - return html_output + return html_output diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 96f96379b..ef1e70df2 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -445,7 +445,7 @@ def get_next_url(self): def get_back_url(self): """Return to the data management view""" - return reverse('proposals:data_management', args=(self.object.pk,)) + return reverse('proposals:data_management', aPdfrgs=(self.object.pk,)) def _get_page_number(self): if self.object.is_pre_assessment: @@ -578,6 +578,19 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): model = Proposal template_name = 'proposals/proposal_diff.html' +from proposals.utils.proposal_utils import GeneralSection +class NewPDFViewTest(generic.TemplateView): + + template_name = 'proposals/pdf/new_pdf_test.html' + + def get_context_data(self, **kwargs): + model = Proposal.objects.last() + test = GeneralSection(model) + context = super().get_context_data(**kwargs) + context['test'] = test + return context + + ######################## # Preliminary assessment From ba1ab48bfde0bdb47122f37f146b4645dbe4c857 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 30 Aug 2023 11:36:54 +0200 Subject: [PATCH 005/148] workaround for nested field values --- proposals/utils/proposal_utils.py | 35 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 13e70911d..5b1f5726a 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -351,12 +351,19 @@ def generate_relevant_data_pdf(proposal): from django.utils.safestring import mark_safe from django.utils.html import format_html from copy import copy + +'''('created_by', 'email')''' + +# def access_foreignkey_getattr(object, field_tuple): + + +# return value, verbose_name class PDFSection: section_title = None row_fields = None verbose_name_diff_field_dict = { - 'get_metc_display': ('wmo', 'metc') + 'get_metc_display': ('wmo', 'metc'), 'get_is_medical_display': ('wmo','is_medical') } @@ -374,9 +381,11 @@ def get_rows(self): 'label': self.object._meta.get_field(row_field).verbose_name, 'value': RowValueClass(self.object, row_field).render() } - #TODO: finish this - if type(row_field) == tuple: - + elif type(row_field) == tuple: + rows[row_field[-1]] = { + 'label': self.get_nested_verbose_name(self.object, row_field), + 'value': RowValueClass(self.object, row_field).render() + } return rows def render(self, context): @@ -388,6 +397,15 @@ def render(self, context): } ) return template.render(context.flatten()) + + def get_nested_verbose_name(object, tuple_field): + for item in tuple_field: + if item == tuple_field[-1]: + verbose_name = object._meta_get_field(item).verbose_name + break + new_object = getattr(object, item) + object = new_object + return verbose_name class GeneralSection(PDFSection): '''This class generates the data for the general section of @@ -445,7 +463,7 @@ class WMOSection(PDFSection): 'get_metc_display', 'metc_details', 'metc_institution', - 'get_is_medical_display' + 'get_is_medical_display', ] def __init__(self, object): @@ -479,11 +497,10 @@ def render(self): For a subclass provide a tuple like so: ('wmo', 'metc')''' if type(self.field) == tuple: - #TODO: create a separate method for this! - obj = self.object + object = self.object for item in self.field: - value = getattr(obj, item) - obj = value + value = getattr(object, item) + object = value User = get_user_model() From 027fa7cf21f547538496a0825654712aaea96ada Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 30 Aug 2023 12:14:54 +0200 Subject: [PATCH 006/148] workaround for different label & value + metc sect --- .../templates/proposals/pdf/new_pdf_test.html | 1 + proposals/urls.py | 4 +- proposals/utils/proposal_utils.py | 82 ++++++++++++------- proposals/views/proposal_views.py | 4 +- 4 files changed, 59 insertions(+), 32 deletions(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index c03c57358..581889e8d 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -14,5 +14,6 @@ {% block content %} {% include test %} + {% include wmo_test %} {% endblock %} \ No newline at end of file diff --git a/proposals/urls.py b/proposals/urls.py index d7dcd56e5..7a4e5e3d5 100644 --- a/proposals/urls.py +++ b/proposals/urls.py @@ -15,7 +15,8 @@ ProposalSubmitPreApproved, ProposalUpdatePreApproved, \ ProposalUsersOnlyArchiveView, \ ProposalCopyAmendment, ProposalsPublicArchiveView, \ - ProposalUpdateDataManagement, TranslatedConsentFormsView + ProposalUpdateDataManagement, TranslatedConsentFormsView, \ + NewPDFViewTest from .views.study_views import StudyStart, StudyConsent from .views.wmo_views import WmoCreate, WmoUpdate, \ @@ -121,6 +122,7 @@ path('diff//', ProposalDifference.as_view(), name='diff'), path('pdf//', ProposalAsPdf.as_view(), name='pdf'), + path('new_pdf/', NewPDFViewTest.as_view(), name='new_pdf'), # WMO path('wmo/create//', include([ diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 5b1f5726a..0d970c7dc 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -354,18 +354,13 @@ def generate_relevant_data_pdf(proposal): '''('created_by', 'email')''' -# def access_foreignkey_getattr(object, field_tuple): - - -# return value, verbose_name class PDFSection: section_title = None row_fields = None verbose_name_diff_field_dict = { - 'get_metc_display': ('wmo', 'metc'), - 'get_is_medical_display': ('wmo','is_medical') - + ('wmo', 'get_metc_display'): ('wmo', 'metc'), + ('wmo', 'get_is_medical_display'): ('wmo','is_medical') } def __init__(self, object): @@ -376,16 +371,42 @@ def __init__(self, object): def get_rows(self): rows = OrderedDict() for row_field in self._row_fields: - if type(row_field) == str: - rows[row_field] = { - 'label': self.object._meta.get_field(row_field).verbose_name, - 'value': RowValueClass(self.object, row_field).render() - } - elif type(row_field) == tuple: - rows[row_field[-1]] = { - 'label': self.get_nested_verbose_name(self.object, row_field), - 'value': RowValueClass(self.object, row_field).render() - } + if row_field in self.verbose_name_diff_field_dict: + verbose_name = self.verbose_name_diff_field_dict[row_field] + '''This sequence checks for all combinations of tuples and strings + in the dict. Might not be neccessary, but is nice to account + for all possibilities''' + if type(row_field) == str and type(verbose_name) == str: + rows[row_field] = { + 'label': self.object._meta.get_field(verbose_name).verbose_name, + 'value': RowValueClass(self.object, row_field).render() + } + elif type(row_field) == tuple and type(verbose_name) == str: + rows[row_field[-1]] = { + 'label': self.object._meta.get_field(verbose_name).verbose_name, + 'value': RowValueClass(self.object, row_field).render() + } + elif type(row_field) == str and type(verbose_name) == tuple: + rows[row_field] = { + 'label': self.get_nested_verbose_name(self.object, verbose_name), + 'value': RowValueClass(self.object, row_field).render() + } + else: + rows[row_field[-1]] = { + 'label': self.get_nested_verbose_name(self.object, verbose_name), + 'value': RowValueClass(self.object, row_field).render() + } + else: + if type(row_field) == str: + rows[row_field] = { + 'label': self.object._meta.get_field(row_field).verbose_name, + 'value': RowValueClass(self.object, row_field).render() + } + elif type(row_field) == tuple: + rows[row_field[-1]] = { + 'label': self.get_nested_verbose_name(self.object, row_field), + 'value': RowValueClass(self.object, row_field).render() + } return rows def render(self, context): @@ -398,10 +419,10 @@ def render(self, context): ) return template.render(context.flatten()) - def get_nested_verbose_name(object, tuple_field): + def get_nested_verbose_name(self, object, tuple_field): for item in tuple_field: if item == tuple_field[-1]: - verbose_name = object._meta_get_field(item).verbose_name + verbose_name = object._meta.get_field(item).verbose_name break new_object = getattr(object, item) object = new_object @@ -460,24 +481,25 @@ class WMOSection(PDFSection): section_title = _("Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?") row_fields = [ - 'get_metc_display', - 'metc_details', - 'metc_institution', - 'get_is_medical_display', + ('wmo', 'get_metc_display'), + ('wmo', 'metc_details'), + ('wmo', 'metc_institution'), + ('wmo', 'get_is_medical_display'), ] - def __init__(self, object): - super().__init__(self, object) - self.object = self.object.wmo + # def __init__(self, object): + # super().__init__(self, object) + # self.object = self.object.wmo def get_rows(self): obj = self.object rows = self._row_fields - if not obj.metc == 'Y': - rows.remove('metc_details') - rows.remove('metc_institution') + if not obj.wmo.metc == 'Y': + rows.remove(('wmo', 'metc_details')) + rows.remove(('wmo', 'metc_institution')) else: - rows.remove('get_is_medical') + rows.remove(('wmo', 'get_is_medical_display')) + return super().get_rows() diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index ef1e70df2..fd5dd3450 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -578,7 +578,7 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): model = Proposal template_name = 'proposals/proposal_diff.html' -from proposals.utils.proposal_utils import GeneralSection +from proposals.utils.proposal_utils import GeneralSection, WMOSection class NewPDFViewTest(generic.TemplateView): template_name = 'proposals/pdf/new_pdf_test.html' @@ -586,8 +586,10 @@ class NewPDFViewTest(generic.TemplateView): def get_context_data(self, **kwargs): model = Proposal.objects.last() test = GeneralSection(model) + wmo_test = WMOSection(model) context = super().get_context_data(**kwargs) context['test'] = test + context['wmo_test'] = wmo_test return context From b5b9b059507d7602ec65c1ba6a13b0334ee415ac Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 30 Aug 2023 14:48:40 +0200 Subject: [PATCH 007/148] metc section --- proposals/utils/proposal_utils.py | 32 ++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 0d970c7dc..e67dd68e6 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -351,6 +351,7 @@ def generate_relevant_data_pdf(proposal): from django.utils.safestring import mark_safe from django.utils.html import format_html from copy import copy +from django.conf import settings '''('created_by', 'email')''' @@ -484,12 +485,8 @@ class WMOSection(PDFSection): ('wmo', 'get_metc_display'), ('wmo', 'metc_details'), ('wmo', 'metc_institution'), - ('wmo', 'get_is_medical_display'), + ('wmo', 'get_is_medical_display'), ] - - # def __init__(self, object): - # super().__init__(self, object) - # self.object = self.object.wmo def get_rows(self): obj = self.object @@ -501,8 +498,16 @@ def get_rows(self): rows.remove(('wmo', 'get_is_medical_display')) return super().get_rows() +class METCSection(PDFSection): + section_title = _("Aanmelding bij de METC") + row_fields = [ + ('wmo', 'metc_application'), + ('wmo', 'metc_decision'), + ('wmo', 'metc_decision_pdf') + ] + class RowValueClass: def __init__(self, object, field): @@ -541,6 +546,8 @@ def render(self): return self.get_applicants_names(value) elif value.all().model == Funding: return self.get_funding_list(value) + elif value.__class__.__name__ == 'FieldFile': + return self.handle_field_file(value, self.object) elif callable(value): return value() @@ -568,8 +575,19 @@ def create_unordered_html_list(self, list): html_output += mark_safe('') return html_output - - + + def handle_field_file(self, field_file, object): + if object.wmo.metc_decision_pdf and not object.is_practice(): + output = format_html('{}{}{}{}{}', + mark_safe(''), + _('Download'), + mark_safe('') + ) + else: + output = _('Niet aangeleverd') + return output def generate_pdf(proposal, template=False): """Grandfathered function for pdf saving. The template arg currently From 2d907d9b04c9c4e3c13f9884953fdc04c8ae93ad Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 30 Aug 2023 14:52:52 +0200 Subject: [PATCH 008/148] include metc in template and view --- proposals/templates/proposals/pdf/new_pdf_test.html | 1 + proposals/views/proposal_views.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 581889e8d..7db055344 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -15,5 +15,6 @@ {% include test %} {% include wmo_test %} + {% include metc_test %} {% endblock %} \ No newline at end of file diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index fd5dd3450..9a2ba873d 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -578,7 +578,7 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): model = Proposal template_name = 'proposals/proposal_diff.html' -from proposals.utils.proposal_utils import GeneralSection, WMOSection +from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection class NewPDFViewTest(generic.TemplateView): template_name = 'proposals/pdf/new_pdf_test.html' @@ -590,6 +590,9 @@ def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['test'] = test context['wmo_test'] = wmo_test + if model.wmo.status != model.wmo.NO_WMO: + metc_test = METCSection(model) + context['metc_test'] = metc_test return context From 18f29fe5759d2e8b5d8e5da1c0410d9bfce31f5b Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 31 Aug 2023 14:40:32 +0200 Subject: [PATCH 009/148] first groundwork for studies --- .../templates/proposals/pdf/new_pdf_test.html | 7 +- .../proposals/pdf/table_with_header.html | 3 + proposals/utils/proposal_utils.py | 201 ++++++++++++------ proposals/views/proposal_views.py | 12 +- 4 files changed, 152 insertions(+), 71 deletions(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 7db055344..51a390651 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -14,7 +14,10 @@ {% block content %} {% include test %} - {% include wmo_test %} - {% include metc_test %} + {% include wmo_test %}studies_similar + {% if metc_test %} + {% include metc_test %} + {% endif %} + {% include trajectories_test %} {% endblock %} \ No newline at end of file diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html index 0f0e00c65..5a1475941 100644 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -1,3 +1,6 @@ +{% if study_title %} +

{{ study_title }}

+{% endif %}

{{ section_title }}

{% for label, value in rows.items %} diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index e67dd68e6..f2ccabbde 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -19,8 +19,6 @@ from main.utils import AvailableURL, get_secretary from studies.utils import study_urls -from proposals.templatetags.proposal_filters import needs_details - __all__ = ['available_urls', 'generate_ref_number', 'generate_revision_ref_number', 'generate_pdf', @@ -304,64 +302,26 @@ def _get_next_proposal_number(current_year) -> int: except Proposal.DoesNotExist: return 1 -def generate_relevant_data_pdf(proposal): - empty_dict = {} - - empty_dict[_('Algemene informatie over de aanvraag')] = {} - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('relation').verbose_name] = proposal.relation - if proposal.relation.needs_supervisor: - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('supervisor').verbose_name] = proposal.supervisor.get_full_name - if proposal.relation.check_in_course: - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_program').verbose_name] = proposal.student_program - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_context').verbose_name] = proposal.student_context - if proposal.student_context.needs_detail: - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_context_detail').verbose_name] = proposal.student_context_details - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('student_justification').verbose_name] = proposal.student_justification - #I am not quite sure how to add translation to the boolean value resulting here ... - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('other_applicants').verbose_name] = proposal.other_applicants - if proposal.other_applicants: - empty_dict[_('Algemene informatie over de aanvraag')][proposal._meta.get_field('applicants').verbose_name] = [applicant.get_full_name for applicant in proposal.applicants] - - empty_dict[_('Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?')] = {} - - if proposal.wmo.status != proposal.wmo.NO_WMO: - empty_dict[_("Aanmelding bij de METC")] = {} - - empty_dict[_('Eén of meerdere trajecten?')] = {} - - '''Note to self: this will be a huge pain of nesting ... only scratch surface for now ...''' - if proposal.wmo.status == proposal.wmo.NO_WMO: - for study in proposal.study_set.all(): - if proposal.studies_number > 1: - empty_dict['studies'] = {} - if study.name: - empty_dict['studies'][_(f'traject { study.order } { study.name }')] = {} - else: - empty_dict['studies'][_(f'traject { study.order }')] = {} - else: - empty_dict['study'] = {} - - empty_dict['extra documents'] = [] - - empty_dict['Aanmelding versturen'] = {} - - return empty_dict - from django.contrib.auth import get_user_model from django.utils.safestring import mark_safe from django.utils.html import format_html from copy import copy from django.conf import settings +from proposals.templatetags.proposal_filters import needs_details, medical_traits, \ +necessity_required, has_adults -'''('created_by', 'email')''' +'''NOTE TO SELF: +Might not have to have the whole tuple system ... +Would streamline code a lot.''' class PDFSection: section_title = None + study_title = None row_fields = None verbose_name_diff_field_dict = { - ('wmo', 'get_metc_display'): ('wmo', 'metc'), - ('wmo', 'get_is_medical_display'): ('wmo','is_medical') + 'get_metc_display': 'metc', + 'get_is_medical_display': 'is_medical' } def __init__(self, object): @@ -479,35 +439,144 @@ def get_rows(self): return super().get_rows() class WMOSection(PDFSection): - + '''Object for this section is proposal.wmo''' section_title = _("Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?") row_fields = [ - ('wmo', 'get_metc_display'), - ('wmo', 'metc_details'), - ('wmo', 'metc_institution'), - ('wmo', 'get_is_medical_display'), + 'get_metc_display', + 'metc_details', + 'metc_institution', + 'get_is_medical_display', ] def get_rows(self): obj = self.object rows = self._row_fields if not obj.wmo.metc == 'Y': - rows.remove(('wmo', 'metc_details')) - rows.remove(('wmo', 'metc_institution')) + rows.remove('metc_details') + rows.remove('metc_institution') else: - rows.remove(('wmo', 'get_is_medical_display')) + rows.remove('get_is_medical_display') return super().get_rows() class METCSection(PDFSection): - + '''Object for this section is proposal.wmo''' section_title = _("Aanmelding bij de METC") row_fields = [ - ('wmo', 'metc_application'), - ('wmo', 'metc_decision'), - ('wmo', 'metc_decision_pdf') + 'metc_application', + 'metc_decision', + 'metc_decision_pdf' + ] + +class TrajectoriesSection(PDFSection): + + section_title = _("Eén of meerdere trajecten?") + + row_fields = [ + 'studies_similar', + 'studies_number' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + if obj.studies_similar: + rows.remove('studies_number') + return super().get_rows() + +class StudySection(PDFSection): + '''object for this study is proposal.study''' + section_title = _('De Deelnemers') + row_fields = [ + 'age_groups', + 'legally_incapable', + 'legally_incapable_details', + 'has_special_details', + 'special_details', + 'traits', + 'traits_details', + 'necessity', + 'necessity_reason', + 'recruitment', + 'recruitment_details', + 'compensation', + 'compensation_details', + 'hierarchy', + 'hierarchy_details', + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + if not has_adults(obj): + rows.remove('legally_incapable') + rows.remove('legally_incapable_details') + elif not obj.legally_incapable: + rows.remove('legally_incapable_details') + if not obj.has_special_details: + rows.remove('special_details') + rows.remove('traits') + rows.remove('traits_details') + elif not medical_traits(obj.special_details.all()): + rows.remove('traits') + rows.remove('traits_details') + elif not needs_details(obj.traits.all()): + rows.remove('traits_details') + if not necessity_required(obj): + rows.remove('necessity') + rows.remove('necessity_reason') + if not needs_details(obj.recruitment.all()): + rows.remove('recruitment_details') + if not obj.compensation.needs_details: + rows.remove('compensation_details') + if not obj.hierarchy: + rows.remove('hierarchy_details') + return super().get_rows() + + def get_study_title(study): + if study.name: + study_title = format_html('{}{}{}{}{}', + _('Traject'), + study.order, + mark_safe(''), + study.name, + mark_safe('') + ) + else: + study_title = format_html('{}{}', + _('Traject'), + {study.order} + ) + return study_title + + def render(self, context): + template = get_template("proposals/pdf/table_with_header.html") + context.update( + { + "section_title": self.section_title, + '''Will this work? I dont know ...''' + "rows": self.get_rows(), + } + ) + if self.object.proposal.studies_number > 1: + context.update( + { + 'study_title': self.get_study_title(self.object) + } + ) + return template.render(context.flatten()) + +class TasksSection(PDFSection): + + row_fields = [ + 'setting', + 'setting_details', + 'supervision', + 'leader_has_coc', + 'tasks_number', ] + class RowValueClass: def __init__(self, object, field): @@ -544,8 +613,8 @@ def render(self): elif value.__class__.__name__ == 'ManyRelatedManager': if value.all().model == User: return self.get_applicants_names(value) - elif value.all().model == Funding: - return self.get_funding_list(value) + else: + return self.get_object_list(value) elif value.__class__.__name__ == 'FieldFile': return self.handle_field_file(value, self.object) elif callable(value): @@ -558,9 +627,9 @@ def get_applicants_names(self, applicants): applicant_names = [applicant.get_full_name() for applicant in applicants.all()] return self.create_unordered_html_list(applicant_names) - def get_funding_list(self, funding): - list_of_funds = [fund for fund in funding.all()] - return self.create_unordered_html_list(list_of_funds) + def get_object_list(self, object): + list_of_objects = [obj for obj in object.all()] + return self.create_unordered_html_list(list_of_objects) def create_unordered_html_list(self, list): html_output = mark_safe('
    ') @@ -580,7 +649,7 @@ def handle_field_file(self, field_file, object): if object.wmo.metc_decision_pdf and not object.is_practice(): output = format_html('{}{}{}{}{}', mark_safe(''), _('Download'), mark_safe('') diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 9a2ba873d..868bf4344 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -578,7 +578,8 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): model = Proposal template_name = 'proposals/proposal_diff.html' -from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection +from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection, \ +TrajectoriesSection, StudySection class NewPDFViewTest(generic.TemplateView): template_name = 'proposals/pdf/new_pdf_test.html' @@ -586,13 +587,18 @@ class NewPDFViewTest(generic.TemplateView): def get_context_data(self, **kwargs): model = Proposal.objects.last() test = GeneralSection(model) - wmo_test = WMOSection(model) + wmo_test = WMOSection(model.wmo) + trajectories_test = TrajectoriesSection(model) context = super().get_context_data(**kwargs) context['test'] = test context['wmo_test'] = wmo_test if model.wmo.status != model.wmo.NO_WMO: - metc_test = METCSection(model) + metc_test = METCSection(model.wmo) context['metc_test'] = metc_test + if model.wmo.status == model.wmo.NO_WMO: + for study in model.study_set.all(): + study_test = StudySection(study) + context['trajectories_test'] = trajectories_test return context From d68b8750e7034666cf21198d5407bd12ef45c867 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 4 Sep 2023 16:04:03 +0200 Subject: [PATCH 010/148] A lot of changes ... Started implementing studies --- .../templates/proposals/pdf/new_pdf_test.html | 12 +- .../proposals/pdf/table_with_header.html | 3 + proposals/utils/proposal_utils.py | 196 ++++++++++++++++-- proposals/views/proposal_views.py | 13 +- 4 files changed, 199 insertions(+), 25 deletions(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 51a390651..156dd3703 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -14,10 +14,20 @@ {% block content %} {% include test %} - {% include wmo_test %}studies_similar + {% include wmo_test %} + {% if metc_test %} {% include metc_test %} {% endif %} + {% include trajectories_test %} + {% if studies %} + {% for study in studies %} + {% for study_section in study %} + {% include study_section %} + {% endfor %} + {% endfor %} + {% endif %} + {% endblock %} \ No newline at end of file diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html index 5a1475941..838900091 100644 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -2,6 +2,9 @@

    {{ study_title }}

    {% endif %}

    {{ section_title }}

    +{% if sub_study_title %} +

    {{ sub_study_title }}

    +{% endif %}
{% for label, value in rows.items %} diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index f2ccabbde..177d4c1d3 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -314,6 +314,8 @@ def _get_next_proposal_number(current_year) -> int: Might not have to have the whole tuple system ... Would streamline code a lot.''' +'''TODO: Test multiple studies proposal''' + class PDFSection: section_title = None @@ -378,6 +380,7 @@ def render(self, context): "rows": self.get_rows(), } ) + return template.render(context.flatten()) def get_nested_verbose_name(self, object, tuple_field): @@ -451,7 +454,7 @@ class WMOSection(PDFSection): def get_rows(self): obj = self.object rows = self._row_fields - if not obj.wmo.metc == 'Y': + if not obj.metc == 'Y': rows.remove('metc_details') rows.remove('metc_institution') else: @@ -533,7 +536,7 @@ def get_rows(self): rows.remove('hierarchy_details') return super().get_rows() - def get_study_title(study): + def get_study_title(self, study): if study.name: study_title = format_html('{}{}{}{}{}', _('Traject'), @@ -550,23 +553,162 @@ def get_study_title(study): return study_title def render(self, context): - template = get_template("proposals/pdf/table_with_header.html") - context.update( - { - "section_title": self.section_title, - '''Will this work? I dont know ...''' - "rows": self.get_rows(), - } - ) if self.object.proposal.studies_number > 1: context.update( { 'study_title': self.get_study_title(self.object) } ) - return template.render(context.flatten()) + return super().render(context) + +class InterventionSection(StudySection): + '''This class will receive a study object''' + section_title = _('Het interventieonderzoek') + row_fields = [ + 'setting', + 'setting_details', + 'supervision', + 'leader_has_coc', + 'period', + 'multiple_sessions', + 'session_frequency', + 'amount_per_week', + 'duration', + 'measurement', + 'experimenter', + 'description', + 'has_controls', + 'controls_description', + 'extra_task' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if obj.version == 1: + fields_to_remove = ['multiple_sessions', + 'session_frequency', + 'extra_task'] + rows = [field for field in rows if field not in fields_to_remove] + else: + rows.remove('amount_per_week') + if not obj.multiple_sessions: + rows.remove('session_frequency') + if obj.settings_contains_schools: + rows.remove('extra_task') + + if not needs_details(obj.setting.all()): + rows.remove('setting_details') + if not obj.study.has_children() or \ + not needs_details(obj.setting.all(), 'needs_supervision'): + rows.remove('supervision') + rows.remove('leader_has_coc') + elif obj.supervision: + rows.remove('leader_has_coc') + if not obj.has_controls: + rows.remove('controls_description') + + return super(StudySection, self).get_rows() -class TasksSection(PDFSection): + def render(self, context): + if self.object.study.proposal.studies_number > 1: + context.update( + { + 'sub_study_title': super().get_study_title(self.object.study) + } + ) + return super(StudySection, self).render(context) + +class ObservationSection(StudySection): + '''Gets passed an observation object''' + section_title = _('Het observatieonderzoek') + row_fields = [ + 'setting', + 'setting_details', + 'supervision', + 'leader_has_coc', + 'days', + 'mean_hours', + 'details_who', + 'details_why', + 'details_frequency', + 'is_anonymous', + 'is_anonymous_details', + 'is_in_target_group', + 'is_in_target_group_details', + 'is_nonpublic_space', + 'is_nonpublic_space_details', + 'has_advanced_consent', + 'has_advanced_consent_details', + 'needs_approval', + 'approval_institution', + 'approval_document', + 'registrations', + 'registrations_details' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if obj.version == 1: + to_remove_if_v1 = ['details_who', + 'details_why', + 'is_anonymous_details', + 'is_in_target_group_details', + 'is_nonpublic_space_details', + 'has_advanced_consent_details' + ] + rows = [field for field in rows if field not in to_remove_if_v1] + if not obj.is_nonpublic_space: + rows.remove('has_advanced_consent') + if not obj.needs_approval: + rows.remove('approval_institution') + rows.remove('approval_document') + elif obj.study.proposal.is_practice(): + rows.remove('approval_document') + else: + to_remove_if_v2 = ['days', 'mean_hours', 'approval_document'] + rows = [field for field in rows if field not in to_remove_if_v2] + + if not obj.is_anonymous: + rows.remove('is_anonymous_details') + if not obj.is_in_target_group: + rows.remove('is_in_target_group_details') + if not obj.is_nonpublic_space: + rows.remove('is_nonpublic_space_details') + rows.remove('has_advanced_consent') + rows.remove('has_advanced_consent_details') + elif obj.has_advanced_consent: + rows.remove('has_advanced_consent_details') + if not needs_details(obj.setting.all(), 'is_school'): + rows.remove('needs_approval') + if not obj.needs_approval: + rows.remove('approval_institution') + + if not needs_details(obj.setting.all()): + rows.remove('setting_details') + if not obj.study.has_children() or \ + not needs_details(obj.setting.all(), 'needs_supervision'): + rows.remove('supervision') + rows.remove('leader_has_coc') + elif obj.supervision: + rows.remove('leader_has_coc') + if not needs_details(obj.registrations.all()): + rows.remove('registrations_details') + return super(StudySection, self).get_rows() + + def render(self, context): + if self.object.study.proposal.studies_number > 1: + context.update( + { + 'sub_study_title': super().get_study_title(self.object.study) + } + ) + return super(StudySection, self).render(context) + +class SessionSection(PDFSection): row_fields = [ 'setting', @@ -577,6 +719,7 @@ class TasksSection(PDFSection): ] + class RowValueClass: def __init__(self, object, field): @@ -646,16 +789,27 @@ def create_unordered_html_list(self, list): return html_output def handle_field_file(self, field_file, object): - if object.wmo.metc_decision_pdf and not object.is_practice(): - output = format_html('{}{}{}{}{}', - mark_safe(''), - _('Download'), - mark_safe('') - ) + from ..models import Proposal + if type(object) == Proposal: + if object.wmo.metc_decision_pdf and not object.is_practice(): + output = format_html('{}{}{}{}{}', + mark_safe(''), + _('Download'), + mark_safe('') + ) + else: + output = _('Niet aangeleverd') else: - output = _('Niet aangeleverd') + #if obj == Observation + output = format_html('{}{}{}{}{}', + mark_safe(''), + _('Download'), + mark_safe('') + ) return output def generate_pdf(proposal, template=False): diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 868bf4344..e90a038a7 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -579,7 +579,7 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): template_name = 'proposals/proposal_diff.html' from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection, \ -TrajectoriesSection, StudySection +TrajectoriesSection, StudySection, InterventionSection, ObservationSection class NewPDFViewTest(generic.TemplateView): template_name = 'proposals/pdf/new_pdf_test.html' @@ -595,10 +595,17 @@ def get_context_data(self, **kwargs): if model.wmo.status != model.wmo.NO_WMO: metc_test = METCSection(model.wmo) context['metc_test'] = metc_test + context['trajectories_test'] = trajectories_test if model.wmo.status == model.wmo.NO_WMO: + context['studies'] = [] for study in model.study_set.all(): - study_test = StudySection(study) - context['trajectories_test'] = trajectories_test + study_sections = [] + study_sections.append(StudySection(study)) + if study.has_intervention: + study_sections.append(InterventionSection(study.intervention)) + if study.has_observation: + study_sections.append(ObservationSection(study.observation)) + context['studies'].append(study_sections) return context From 7dda34d2a535cf0bab7d4fe6bbe96d52f975a7f8 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 11 Sep 2023 14:08:26 +0200 Subject: [PATCH 011/148] Bugfixes and implementing sessions and tasks --- .../templates/proposals/pdf/new_pdf_test.html | 14 +- .../proposals/pdf/table_with_header.html | 7 +- proposals/templatetags/proposal_filters.py | 3 + proposals/utils/proposal_utils.py | 184 ++++++++++++++---- proposals/views/proposal_views.py | 14 +- 5 files changed, 178 insertions(+), 44 deletions(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 156dd3703..2bb8844d0 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -20,12 +20,22 @@ {% include metc_test %} {% endif %} - {% include trajectories_test %} + {% include trajectories_test %} {% if studies %} {% for study in studies %} {% for study_section in study %} - {% include study_section %} + {% if study_section | get_type == 'list' %} + {% for session in study_section %} + {% if session | get_type == 'list' %} + {% for task in session %} + {% include task %} + {% else %} + {% include session %} + {% endfor %} + {% else %} + {% include study_section %} + {% endif %} {% endfor %} {% endfor %} {% endif %} diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html index 838900091..7511d8fe6 100644 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -1,10 +1,9 @@ +{% if section_title is not None %} +

{{ section_title }}

+{% endif %} {% if study_title %}

{{ study_title }}

{% endif %} -

{{ section_title }}

-{% if sub_study_title %} -

{{ sub_study_title }}

-{% endif %}
{% for label, value in rows.items %} diff --git a/proposals/templatetags/proposal_filters.py b/proposals/templatetags/proposal_filters.py index a323e32e5..12ff09a67 100644 --- a/proposals/templatetags/proposal_filters.py +++ b/proposals/templatetags/proposal_filters.py @@ -33,6 +33,9 @@ def necessity_required(study): age_groups = study.age_groups.values_list('id', flat=True) return check_necessity_required(study.proposal, age_groups, study.legally_incapable) +@register.filter +def get_type(value): + return type(value) @register.simple_tag def show_yesno(doubt=False): diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 177d4c1d3..e33addf92 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -369,7 +369,7 @@ def get_rows(self): rows[row_field[-1]] = { 'label': self.get_nested_verbose_name(self.object, row_field), 'value': RowValueClass(self.object, row_field).render() - } + } return rows def render(self, context): @@ -390,7 +390,83 @@ def get_nested_verbose_name(self, object, tuple_field): break new_object = getattr(object, item) object = new_object - return verbose_name + return verbose_name + + def get_study_title(self, study): + if study.name: + study_title = format_html('{}{}{}{}{}', + _('Traject '), + study.order, + mark_safe(' '), + study.name, + mark_safe(' ') + ) + else: + study_title = format_html('{}{}', + _('Traject'), + {study.order} + ) + return study_title + + def get_session_title(self, session): + + order = session.order + study_order = session.study.order + study_name = session.study.name + studies_number = session.study.proposal.studies_number + sessions_number = session.study.sessions_number + + if studies_number > 1 and sessions_number > 1: + session_title = format_html('{}{}{}{}{}{}{}', + _('Traject '), + study_order, + mark_safe(' '), + study_name, + mark_safe(' , '), + _('sessie '), + order + ) + elif studies_number > 1: + session_title = format_html('{}{}{}{}{}', + _('Traject '), + study_order, + mark_safe(' '), + study_name, + mark_safe(' ') + ) + elif sessions_number >= 1: + session_title = format_html('{}{}', + _('Sessie '), + order + ) + return session_title + + def get_task_title(task): + order=task.order + session_order=task.session.order + study_order=task.session.study.order + study_name=task.session.study.name + studies_number=task.session.study.proposal.studies_number + if studies_number > 1: + task_title = format_html('{}{}{}{}{}{}{}{}{}', + _('Traject '), + study_order, + mark_safe(' '), + study_name, + mark_safe(' , '), + _('sessie '), + session_order, + _(', taak '), + order + ) + else: + task_title = format_html('{}{}{}{}', + _('Sessie '), + session_order, + _(', taak '), + order + ) + return task_title class GeneralSection(PDFSection): '''This class generates the data for the general section of @@ -535,34 +611,18 @@ def get_rows(self): if not obj.hierarchy: rows.remove('hierarchy_details') return super().get_rows() - - def get_study_title(self, study): - if study.name: - study_title = format_html('{}{}{}{}{}', - _('Traject'), - study.order, - mark_safe(''), - study.name, - mark_safe('') - ) - else: - study_title = format_html('{}{}', - _('Traject'), - {study.order} - ) - return study_title def render(self, context): if self.object.proposal.studies_number > 1: context.update( { - 'study_title': self.get_study_title(self.object) + 'study_title': super().get_study_title(self.object) } ) return super().render(context) -class InterventionSection(StudySection): - '''This class will receive a study object''' +class InterventionSection(PDFSection): + '''This class will receive a intervention object''' section_title = _('Het interventieonderzoek') row_fields = [ 'setting', @@ -590,7 +650,8 @@ def get_rows(self): fields_to_remove = ['multiple_sessions', 'session_frequency', 'extra_task'] - rows = [field for field in rows if field not in fields_to_remove] + for field in fields_to_remove: + rows.remove(field) else: rows.remove('amount_per_week') if not obj.multiple_sessions: @@ -609,18 +670,18 @@ def get_rows(self): if not obj.has_controls: rows.remove('controls_description') - return super(StudySection, self).get_rows() + return super().get_rows() def render(self, context): if self.object.study.proposal.studies_number > 1: context.update( { - 'sub_study_title': super().get_study_title(self.object.study) + 'study_title': super().get_study_title(self.object.study) } ) - return super(StudySection, self).render(context) + return super().render(context) -class ObservationSection(StudySection): +class ObservationSection(InterventionSection): '''Gets passed an observation object''' section_title = _('Het observatieonderzoek') row_fields = [ @@ -660,7 +721,9 @@ def get_rows(self): 'is_nonpublic_space_details', 'has_advanced_consent_details' ] - rows = [field for field in rows if field not in to_remove_if_v1] + for field in to_remove_if_v1: + rows.remove(field) + if not obj.is_nonpublic_space: rows.remove('has_advanced_consent') if not obj.needs_approval: @@ -670,7 +733,8 @@ def get_rows(self): rows.remove('approval_document') else: to_remove_if_v2 = ['days', 'mean_hours', 'approval_document'] - rows = [field for field in rows if field not in to_remove_if_v2] + for field in to_remove_if_v2: + rows.remove(field) if not obj.is_anonymous: rows.remove('is_anonymous_details') @@ -697,18 +761,19 @@ def get_rows(self): rows.remove('leader_has_coc') if not needs_details(obj.registrations.all()): rows.remove('registrations_details') + + return super(InterventionSection, self).get_rows() + +class SessionsSection(StudySection): + '''Gets passed a study object''' + section_title = _("Het takenonderzoek en interviews") + row_fields = ['sessions_number'] + + def get_rows(self): return super(StudySection, self).get_rows() - - def render(self, context): - if self.object.study.proposal.studies_number > 1: - context.update( - { - 'sub_study_title': super().get_study_title(self.object.study) - } - ) - return super(StudySection, self).render(context) class SessionSection(PDFSection): + '''Gets passed a session object''' row_fields = [ 'setting', @@ -718,6 +783,51 @@ class SessionSection(PDFSection): 'tasks_number', ] + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not needs_details(obj.setting.all()): + rows.remove('setting_details') + if not obj.study.has_children() or \ + not needs_details(obj.setting.all(), 'needs_supervision'): + rows.remove('supervision') + rows.remove('leader_has_coc') + elif obj.supervision: + rows.remove('leader_has_coc') + + return super().get_rows() + + def render(self, context): + context.update( + { + 'study_title': super().get_session_title(self.object) + } + ) + return super().render(context) + +class TaskSection(PDFSection): + '''Gets passed a task object''' + + row_fields = [ + + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + return super().get_rows() + + def render(self, context): + context.update( + { + 'study_title': super().get_task_title(self.object) + } + ) + return super().render(context) + + class RowValueClass: diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index e90a038a7..2a0f69541 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -579,7 +579,9 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): template_name = 'proposals/proposal_diff.html' from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection, \ -TrajectoriesSection, StudySection, InterventionSection, ObservationSection +TrajectoriesSection, StudySection, InterventionSection, ObservationSection, SessionsSection, \ +SessionSection, TaskSection + class NewPDFViewTest(generic.TemplateView): template_name = 'proposals/pdf/new_pdf_test.html' @@ -605,6 +607,16 @@ def get_context_data(self, **kwargs): study_sections.append(InterventionSection(study.intervention)) if study.has_observation: study_sections.append(ObservationSection(study.observation)) + if study.has_sessions: + study_sections.append(SessionsSection(study)) + sessions = [] + for session in study.session_set.all(): + sessions.append(SessionSection(session)) + tasks = [] + for task in session.task_set.all(): + tasks.append(TaskSection(task)) + sessions.append(tasks) + study_sections.append(sessions) context['studies'].append(study_sections) return context From f95bc493ebf1c5c2954d107510a2f371b71c7db8 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 11 Sep 2023 15:52:00 +0200 Subject: [PATCH 012/148] Implemented session, tasks still produces bug --- .../templates/proposals/pdf/new_pdf_test.html | 14 +------ proposals/templatetags/proposal_filters.py | 4 -- proposals/utils/proposal_utils.py | 41 +++++++++++++++++-- proposals/views/proposal_views.py | 12 +++--- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 2bb8844d0..6134cbbf3 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -25,19 +25,9 @@ {% if studies %} {% for study in studies %} {% for study_section in study %} - {% if study_section | get_type == 'list' %} - {% for session in study_section %} - {% if session | get_type == 'list' %} - {% for task in session %} - {% include task %} - {% else %} - {% include session %} - {% endfor %} - {% else %} - {% include study_section %} - {% endif %} + {% include study_section %} {% endfor %} - {% endfor %} + {% endfor %} {% endif %} {% endblock %} \ No newline at end of file diff --git a/proposals/templatetags/proposal_filters.py b/proposals/templatetags/proposal_filters.py index 12ff09a67..c243b42a4 100644 --- a/proposals/templatetags/proposal_filters.py +++ b/proposals/templatetags/proposal_filters.py @@ -33,10 +33,6 @@ def necessity_required(study): age_groups = study.age_groups.values_list('id', flat=True) return check_necessity_required(study.proposal, age_groups, study.legally_incapable) -@register.filter -def get_type(value): - return type(value) - @register.simple_tag def show_yesno(doubt=False): result = '
    ' diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index e33addf92..1b9657cf2 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -314,7 +314,6 @@ def _get_next_proposal_number(current_year) -> int: Might not have to have the whole tuple system ... Would streamline code a lot.''' -'''TODO: Test multiple studies proposal''' class PDFSection: @@ -441,7 +440,7 @@ def get_session_title(self, session): ) return session_title - def get_task_title(task): + def get_task_title(self, task): order=task.order session_order=task.session.order study_order=task.session.study.order @@ -810,13 +809,32 @@ class TaskSection(PDFSection): '''Gets passed a task object''' row_fields = [ - + 'name', + 'durations', + 'registrations', + 'registrations_details', + 'registration_kinds', + 'registration_kinds_details', + 'feedback', + 'feedback_details', + 'desctiption' ] def get_rows(self): obj = self.object rows = self._row_fields + if not needs_details(obj.registrations.all()): + rows.remove['registrations_details'] + if not needs_details(obj.registrations.all(), 'needs_kind') or \ + not needs_details(obj.registration_kinds.all()): + rows.remove('registration_kinds') + rows.remove('registration_kinds_details') + elif not needs_details(obj.registration_kinds.all()): + rows.remove('registration_kinds_details') + if not obj.feedback: + rows.remove['feedback_details'] + return super().get_rows() def render(self, context): @@ -826,9 +844,24 @@ def render(self, context): } ) return super().render(context) + +class TasksOverviewSection(PDFSection): + '''Gets passed a session object''' + '''TODO: how to pass the net_duration to the verbose name?''' + row_fields = [ + 'tasks_duration' + ] - + def render(self, context): + '''Here I am just overriding the render function, to get the correct formatting + The naming is a bit confusing, might fix later''' + context.update( + { + 'study_title': _('Overzicht van het takenonderzoek') + } + ) + return super().render(context) class RowValueClass: diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 2a0f69541..e9251778d 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -609,15 +609,13 @@ def get_context_data(self, **kwargs): study_sections.append(ObservationSection(study.observation)) if study.has_sessions: study_sections.append(SessionsSection(study)) - sessions = [] + # sessions = [] for session in study.session_set.all(): - sessions.append(SessionSection(session)) - tasks = [] - for task in session.task_set.all(): - tasks.append(TaskSection(task)) - sessions.append(tasks) - study_sections.append(sessions) + study_sections.append(SessionSection(session)) + # for task in session.task_set.all(): + # study_sections.append(TaskSection(task)) context['studies'].append(study_sections) + return context From 29889434d9453f3bd832b74c40912ed8d1c88bc5 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 11 Sep 2023 16:17:41 +0200 Subject: [PATCH 013/148] minor thing --- proposals/views/proposal_views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index e9251778d..58b19ad95 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -609,7 +609,6 @@ def get_context_data(self, **kwargs): study_sections.append(ObservationSection(study.observation)) if study.has_sessions: study_sections.append(SessionsSection(study)) - # sessions = [] for session in study.session_set.all(): study_sections.append(SessionSection(session)) # for task in session.task_set.all(): From 7dab89535cd640e14805536e47524aca346e228d Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 12 Sep 2023 10:43:24 +0200 Subject: [PATCH 014/148] Fixed tasks and renamed to make rows --- proposals/utils/proposal_utils.py | 43 ++++++++++++++++++------------- proposals/views/proposal_views.py | 4 +-- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 1b9657cf2..d2d18bb19 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -330,9 +330,9 @@ def __init__(self, object): # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value self._row_fields = copy(self.row_fields) - def get_rows(self): + def make_rows(self): rows = OrderedDict() - for row_field in self._row_fields: + for row_field in self.get_rows(): if row_field in self.verbose_name_diff_field_dict: verbose_name = self.verbose_name_diff_field_dict[row_field] '''This sequence checks for all combinations of tuples and strings @@ -376,12 +376,15 @@ def render(self, context): context.update( { "section_title": self.section_title, - "rows": self.get_rows(), + "rows": self.make_rows(), } ) return template.render(context.flatten()) + def get_rows(self): + raise Exception('You forgot to define the get_rows function for your subclass!') + def get_nested_verbose_name(self, object, tuple_field): for item in tuple_field: if item == tuple_field[-1]: @@ -513,8 +516,7 @@ def get_rows(self): rows.remove('funding_details') if not needs_details(obj.funding.all(), 'needs_name'): rows.remove('funding_name') - # Use the get_rows from PDFSection to get the actual rows, the code above should have filtered out everything we don't need - return super().get_rows() + return rows class WMOSection(PDFSection): '''Object for this section is proposal.wmo''' @@ -534,10 +536,12 @@ def get_rows(self): rows.remove('metc_institution') else: rows.remove('get_is_medical_display') - return super().get_rows() + return rows class METCSection(PDFSection): - '''Object for this section is proposal.wmo''' + '''Object for this section is proposal.wmo + This class exists because the RowValueClass does some + funky things for working with the metc_decision_pdf field''' section_title = _("Aanmelding bij de METC") row_fields = [ @@ -545,6 +549,9 @@ class METCSection(PDFSection): 'metc_decision', 'metc_decision_pdf' ] + + def get_rows(self): + return self._row_fields class TrajectoriesSection(PDFSection): @@ -560,7 +567,7 @@ def get_rows(self): rows = self._row_fields if obj.studies_similar: rows.remove('studies_number') - return super().get_rows() + return rows class StudySection(PDFSection): '''object for this study is proposal.study''' @@ -609,7 +616,7 @@ def get_rows(self): rows.remove('compensation_details') if not obj.hierarchy: rows.remove('hierarchy_details') - return super().get_rows() + return rows def render(self, context): if self.object.proposal.studies_number > 1: @@ -669,7 +676,7 @@ def get_rows(self): if not obj.has_controls: rows.remove('controls_description') - return super().get_rows() + return rows def render(self, context): if self.object.study.proposal.studies_number > 1: @@ -761,7 +768,7 @@ def get_rows(self): if not needs_details(obj.registrations.all()): rows.remove('registrations_details') - return super(InterventionSection, self).get_rows() + return rows class SessionsSection(StudySection): '''Gets passed a study object''' @@ -769,7 +776,7 @@ class SessionsSection(StudySection): row_fields = ['sessions_number'] def get_rows(self): - return super(StudySection, self).get_rows() + return self._row_fields class SessionSection(PDFSection): '''Gets passed a session object''' @@ -795,7 +802,7 @@ def get_rows(self): elif obj.supervision: rows.remove('leader_has_coc') - return super().get_rows() + return rows def render(self, context): context.update( @@ -810,14 +817,14 @@ class TaskSection(PDFSection): row_fields = [ 'name', - 'durations', + 'duration', 'registrations', 'registrations_details', 'registration_kinds', 'registration_kinds_details', 'feedback', 'feedback_details', - 'desctiption' + 'description' ] def get_rows(self): @@ -825,7 +832,7 @@ def get_rows(self): rows = self._row_fields if not needs_details(obj.registrations.all()): - rows.remove['registrations_details'] + rows.remove('registrations_details') if not needs_details(obj.registrations.all(), 'needs_kind') or \ not needs_details(obj.registration_kinds.all()): rows.remove('registration_kinds') @@ -833,9 +840,9 @@ def get_rows(self): elif not needs_details(obj.registration_kinds.all()): rows.remove('registration_kinds_details') if not obj.feedback: - rows.remove['feedback_details'] + rows.remove('feedback_details') - return super().get_rows() + return rows def render(self, context): context.update( diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 58b19ad95..8fcaf634a 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -611,8 +611,8 @@ def get_context_data(self, **kwargs): study_sections.append(SessionsSection(study)) for session in study.session_set.all(): study_sections.append(SessionSection(session)) - # for task in session.task_set.all(): - # study_sections.append(TaskSection(task)) + for task in session.task_set.all(): + study_sections.append(TaskSection(task)) context['studies'].append(study_sections) return context From 995449f9edb2662f7db31a55344c1c0ba40b9986 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 12 Sep 2023 10:46:18 +0200 Subject: [PATCH 015/148] Simplified the make_rows function --- proposals/utils/proposal_utils.py | 41 ++++++------------------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index d2d18bb19..22213a206 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -335,40 +335,15 @@ def make_rows(self): for row_field in self.get_rows(): if row_field in self.verbose_name_diff_field_dict: verbose_name = self.verbose_name_diff_field_dict[row_field] - '''This sequence checks for all combinations of tuples and strings - in the dict. Might not be neccessary, but is nice to account - for all possibilities''' - if type(row_field) == str and type(verbose_name) == str: - rows[row_field] = { - 'label': self.object._meta.get_field(verbose_name).verbose_name, - 'value': RowValueClass(self.object, row_field).render() - } - elif type(row_field) == tuple and type(verbose_name) == str: - rows[row_field[-1]] = { - 'label': self.object._meta.get_field(verbose_name).verbose_name, - 'value': RowValueClass(self.object, row_field).render() - } - elif type(row_field) == str and type(verbose_name) == tuple: - rows[row_field] = { - 'label': self.get_nested_verbose_name(self.object, verbose_name), - 'value': RowValueClass(self.object, row_field).render() - } - else: - rows[row_field[-1]] = { - 'label': self.get_nested_verbose_name(self.object, verbose_name), - 'value': RowValueClass(self.object, row_field).render() - } + rows[row_field] = { + 'label': mark_safe(self.object._meta.get_field(verbose_name).verbose_name), + 'value': RowValueClass(self.object, row_field).render() + } else: - if type(row_field) == str: - rows[row_field] = { - 'label': self.object._meta.get_field(row_field).verbose_name, - 'value': RowValueClass(self.object, row_field).render() - } - elif type(row_field) == tuple: - rows[row_field[-1]] = { - 'label': self.get_nested_verbose_name(self.object, row_field), - 'value': RowValueClass(self.object, row_field).render() - } + rows[row_field] = { + 'label': mark_safe(self.object._meta.get_field(row_field).verbose_name), + 'value': RowValueClass(self.object, row_field).render() + } return rows def render(self, context): From f63799187ef68a96dd5b72a14e11938ef77173a1 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 12 Sep 2023 10:48:16 +0200 Subject: [PATCH 016/148] Removed all implementation of the tuple nesting --- proposals/utils/proposal_utils.py | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 22213a206..cd35d6a9b 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -360,15 +360,6 @@ def render(self, context): def get_rows(self): raise Exception('You forgot to define the get_rows function for your subclass!') - def get_nested_verbose_name(self, object, tuple_field): - for item in tuple_field: - if item == tuple_field[-1]: - verbose_name = object._meta.get_field(item).verbose_name - break - new_object = getattr(object, item) - object = new_object - return verbose_name - def get_study_title(self, study): if study.name: study_title = format_html('{}{}{}{}{}', @@ -855,16 +846,8 @@ def __init__(self, object, field): def render(self): from ..models import Funding, Relation - if type(self.field) == str: - value = getattr(self.object, self.field) - '''A workaround for accessing subclasses: - For a subclass provide a tuple like so: - ('wmo', 'metc')''' - if type(self.field) == tuple: - object = self.object - for item in self.field: - value = getattr(object, item) - object = value + + value = getattr(self.object, self.field) User = get_user_model() From d880b1c9078fb36a32905effc57c2521e3729398 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 12 Sep 2023 16:28:24 +0200 Subject: [PATCH 017/148] Implemented a RowClass. Much better --- .../proposals/pdf/table_with_header.html | 4 +- proposals/utils/proposal_utils.py | 152 +++++++++++++++--- proposals/views/proposal_views.py | 4 +- 3 files changed, 131 insertions(+), 29 deletions(-) diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html index 7511d8fe6..d7560b7eb 100644 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -5,9 +5,9 @@

    {{ section_title }}

    {{ study_title }}

    {% endif %}
-{% for label, value in rows.items %} +{% for row in rows %} - + {% endfor %}
{{ value.label }}{{ value.value }}{{ row.verbose_name }}{{ row.value }}
\ No newline at end of file diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index cd35d6a9b..5a5ca617d 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -329,29 +329,13 @@ def __init__(self, object): self.object = object # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value self._row_fields = copy(self.row_fields) - - def make_rows(self): - rows = OrderedDict() - for row_field in self.get_rows(): - if row_field in self.verbose_name_diff_field_dict: - verbose_name = self.verbose_name_diff_field_dict[row_field] - rows[row_field] = { - 'label': mark_safe(self.object._meta.get_field(verbose_name).verbose_name), - 'value': RowValueClass(self.object, row_field).render() - } - else: - rows[row_field] = { - 'label': mark_safe(self.object._meta.get_field(row_field).verbose_name), - 'value': RowValueClass(self.object, row_field).render() - } - return rows def render(self, context): template = get_template("proposals/pdf/table_with_header.html") context.update( { "section_title": self.section_title, - "rows": self.make_rows(), + "rows": self.get_rows(), } ) @@ -463,6 +447,7 @@ class GeneralSection(PDFSection): def get_rows(self): obj = self.object rows = self._row_fields + if not obj.relation.needs_supervisor: rows.remove('supervisor') if not obj.relation.check_in_course: @@ -482,6 +467,9 @@ def get_rows(self): rows.remove('funding_details') if not needs_details(obj.funding.all(), 'needs_name'): rows.remove('funding_name') + + rows = [RowClass(obj, field) for field in rows] + return rows class WMOSection(PDFSection): @@ -497,11 +485,15 @@ class WMOSection(PDFSection): def get_rows(self): obj = self.object rows = self._row_fields + if not obj.metc == 'Y': rows.remove('metc_details') rows.remove('metc_institution') else: rows.remove('get_is_medical_display') + + rows = [RowClass(obj, field) for field in rows] + return rows class METCSection(PDFSection): @@ -517,7 +509,10 @@ class METCSection(PDFSection): ] def get_rows(self): - return self._row_fields + + rows = [RowClass(self.object, field) for field in self._row_fields] + + return rows class TrajectoriesSection(PDFSection): @@ -531,8 +526,12 @@ class TrajectoriesSection(PDFSection): def get_rows(self): obj = self.object rows = self._row_fields + if obj.studies_similar: rows.remove('studies_number') + + rows = [RowClass(obj, field) for field in rows] + return rows class StudySection(PDFSection): @@ -559,6 +558,7 @@ class StudySection(PDFSection): def get_rows(self): obj = self.object rows = self._row_fields + if not has_adults(obj): rows.remove('legally_incapable') rows.remove('legally_incapable_details') @@ -582,6 +582,9 @@ def get_rows(self): rows.remove('compensation_details') if not obj.hierarchy: rows.remove('hierarchy_details') + + rows = [RowClass(obj, field) for field in rows] + return rows def render(self, context): @@ -640,7 +643,9 @@ def get_rows(self): elif obj.supervision: rows.remove('leader_has_coc') if not obj.has_controls: - rows.remove('controls_description') + rows.remove('controls_description') + + rows = [RowClass(obj, field) for field in rows] return rows @@ -733,17 +738,22 @@ def get_rows(self): rows.remove('leader_has_coc') if not needs_details(obj.registrations.all()): rows.remove('registrations_details') + + rows = [RowClass(obj, field) for field in rows] return rows class SessionsSection(StudySection): - '''Gets passed a study object''' + '''Gets passed a study object + This Section looks maybe a bit unnecessary, but it does remove some logic, plus + the study_title.html from the template.''' section_title = _("Het takenonderzoek en interviews") - row_fields = ['sessions_number'] def get_rows(self): - return self._row_fields + rows = [RowValueClass(self.object, 'sessions_number')] + + return rows class SessionSection(PDFSection): '''Gets passed a session object''' @@ -767,6 +777,8 @@ def get_rows(self): rows.remove('leader_has_coc') elif obj.supervision: rows.remove('leader_has_coc') + + rows = [RowClass(obj, field) for field in rows] return rows @@ -807,6 +819,8 @@ def get_rows(self): rows.remove('registration_kinds_details') if not obj.feedback: rows.remove('feedback_details') + + rows = [RowClass(obj, field) for field in rows] return rows @@ -819,13 +833,21 @@ def render(self, context): return super().render(context) class TasksOverviewSection(PDFSection): - '''Gets passed a session object''' - '''TODO: how to pass the net_duration to the verbose name?''' + '''Gets passed a session object + This might be unecessary ... Maybe just use the existing template language ... + Because the verbose name of this field is formatted, the method for retrieving + the verbose name in the RowClass is quite convoluded.''' row_fields = [ 'tasks_duration' ] + def get_rows(self): + + rows = [RowClass(self.object, field) for field in self._row_fields] + + return rows + def render(self, context): '''Here I am just overriding the render function, to get the correct formatting The naming is a bit confusing, might fix later''' @@ -835,6 +857,78 @@ def render(self, context): } ) return super().render(context) + +class StudyOverviewSection(StudySection): + '''Receives a Study object''' + + section_title = _('Overzicht en eigen beoordeling van het gehele onderzoek') + row_fields = [ + 'deception', + 'deception_details', + 'negativity', + 'negativity_details', + 'stressful', + 'stressful_details', + 'risk', + 'risk_details' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + rows_to_remove = [] + for x in range(0, 7, 2): + if getattr(obj, rows[x]) == 'N': + rows_to_remove.append(rows[x+1]) + rows = [row for row in rows if row not in rows_to_remove] + + if not obj.has_sessions and not obj.deception == 'N': + rows.remove('deception') + rows.remove('deception_details') + elif not obj.has_sessions: + rows.remove('deception') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class InformedConsentFormsSection(StudySection): + '''Receives a Documents object''' + + section_title = _('Informed consent formulieren') + + def get_rows(self): + rows = [] + rows.append(RowClass(obj, field)) + +class RowClass: + + verbose_name_diff_field_dict = { + 'get_metc_display': 'metc', + 'get_is_medical_display': 'is_medical' + } + + def __init__(self, object, field): + self.object = object + self.field = field + + def verbose_name(self): + if self.field in self.verbose_name_diff_field_dict: + verbose_name_field = self.verbose_name_diff_field_dict[self.field] + verbose_name = self.get_verbose_name(verbose_name_field), + else: + verbose_name= self.get_verbose_name(self.field) + return verbose_name + + def value(self): + return RowValueClass(self.object, self.field).render() + + def get_verbose_name(self, field): + if field != 'tasks_duration': + return mark_safe(self.object._meta.get_field(field).verbose_name) + else: + return mark_safe(self.object._meta.get_field(field).verbose_name % self.object.net_duration()) class RowValueClass: @@ -851,9 +945,11 @@ def render(self): User = get_user_model() + if value in ('Y', 'N', '?'): + return self.yes_no_doubt(value) if type(value) in (str, int, date): return value - if value is None: + elif value is None: return _('Onbekend') elif type(value) == bool: return _('Ja') if value else _('Nee') @@ -910,7 +1006,6 @@ def handle_field_file(self, field_file, object): else: output = _('Niet aangeleverd') else: - #if obj == Observation output = format_html('{}{}{}{}{}', mark_safe(' Date: Tue, 12 Sep 2023 17:00:47 +0200 Subject: [PATCH 018/148] informedConsent section --- proposals/utils/proposal_utils.py | 24 +++++++++++++++++++++--- proposals/views/proposal_views.py | 4 +++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 5a5ca617d..e1c00b329 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -893,15 +893,33 @@ def get_rows(self): return rows -class InformedConsentFormsSection(StudySection): +class InformedConsentFormsSection(InterventionSection): '''Receives a Documents object''' section_title = _('Informed consent formulieren') + '''TODO: Debug''' def get_rows(self): + obj = self.object rows = [] - rows.append(RowClass(obj, field)) - + rows.append(RowClass(obj.proposal, 'translated_forms')) + if obj.proposal.translated_forms: + rows.append(RowClass(obj.proposal, 'translated_forms_languages')) + if not obj.proposal.is_practice and obj.informed_consent: + rows.append(RowClass(obj, 'informed_consent')) + rows.append(RowClass(obj, 'briefing')) + if obj.study.passive_consent is not None: + rows.append(RowClass(obj.study, 'passive_consent')) + if obj.study.passive_consent: + rows.append(RowClass(obj.study, 'passive_consent_details')) + if obj.director_consent_declaration: + rows.append(RowClass(obj, 'director_consent_declaration')) + if obj.director_consent_information: + rows.append(RowClass(obj, 'director_consent_information')) + if obj.parents_information: + rows.append(RowClass(obj, 'parents_information')) + breakpoint() + return rows class RowClass: verbose_name_diff_field_dict = { diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 825907de8..41b877610 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -580,7 +580,8 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection, \ TrajectoriesSection, StudySection, InterventionSection, ObservationSection, SessionsSection, \ -SessionSection, TaskSection, TasksOverviewSection, StudyOverviewSection +SessionSection, TaskSection, TasksOverviewSection, StudyOverviewSection, \ +InformedConsentFormsSection class NewPDFViewTest(generic.TemplateView): @@ -615,6 +616,7 @@ def get_context_data(self, **kwargs): study_sections.append(TaskSection(task)) study_sections.append(TasksOverviewSection(session)) study_sections.append(StudyOverviewSection(study)) + study_sections.append(InformedConsentFormsSection(study.documents)) context['studies'].append(study_sections) return context From f3cce5685a761126e0fa5446d50f1c1d698f914f Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Sep 2023 11:16:51 +0200 Subject: [PATCH 019/148] Finishing touches and reorganizing --- main/models.py | 6 +- .../templates/proposals/pdf/new_pdf_test.html | 12 + .../proposals/pdf/table_with_header.html | 2 +- proposals/utils/__init__.py | 3 +- proposals/utils/pdf_diff_logic.py | 779 ++++++++++++++++++ proposals/utils/proposal_utils.py | 744 +---------------- proposals/views/proposal_views.py | 15 +- 7 files changed, 813 insertions(+), 748 deletions(-) create mode 100644 proposals/utils/pdf_diff_logic.py diff --git a/main/models.py b/main/models.py index 18d5d409a..bdbcac5a5 100644 --- a/main/models.py +++ b/main/models.py @@ -5,9 +5,9 @@ NO = 'N' DOUBT = '?' YES_NO_DOUBT = ( - (YES, _('ja')), - (NO, _('nee')), - (DOUBT, _('twijfel')), + (YES, _('Ja')), + (NO, _('Nee')), + (DOUBT, _('Twijfel')), ) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 6134cbbf3..8bda7801e 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -30,4 +30,16 @@ {% endfor %} {% endif %} + {% if extra_documents %} + {% for document in extra_documents %} + {% include document %} + {% endfor %} + {% endif %} + + {% if dmp_file %} + {% include dmp_file %} + {% endif %} + + {% include embargo %} + {% endblock %} \ No newline at end of file diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html index d7560b7eb..6b491d820 100644 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ b/proposals/templates/proposals/pdf/table_with_header.html @@ -1,4 +1,4 @@ -{% if section_title is not None %} +{% if section_title %}

{{ section_title }}

{% endif %} {% if study_title %} diff --git a/proposals/utils/__init__.py b/proposals/utils/__init__.py index 4661c3735..583297b59 100644 --- a/proposals/utils/__init__.py +++ b/proposals/utils/__init__.py @@ -1 +1,2 @@ -from .proposal_utils import * \ No newline at end of file +from .proposal_utils import * +from .pdf_diff_logic import * \ No newline at end of file diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py new file mode 100644 index 000000000..a018005db --- /dev/null +++ b/proposals/utils/pdf_diff_logic.py @@ -0,0 +1,779 @@ + +from datetime import date +from copy import copy + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.template.loader import get_template +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ + +from proposals.templatetags.proposal_filters import needs_details, medical_traits, \ +necessity_required, has_adults + +class PDFSection: + + section_title = None + row_fields = None + + def __init__(self, object): + self.object = object + # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value + self._row_fields = copy(self.row_fields) + + def render(self, context): + context = context.flatten() + template = get_template("proposals/pdf/table_with_header.html") + context.update( + { + "section_title": self.section_title, + "rows": self.get_rows(), + } + ) + return template.render(context) + + def get_rows(self): + + rows = [RowClass(self.object, field) for field in self._row_fields] + + return rows + + def get_study_title(self, study): + if study.name: + study_title = format_html('{}{}{}{}{}', + _('Traject '), + study.order, + mark_safe(' '), + study.name, + mark_safe(' ') + ) + else: + study_title = format_html('{}{}', + _('Traject'), + {study.order} + ) + return study_title + + def get_session_title(self, session): + + order = session.order + study_order = session.study.order + study_name = session.study.name + studies_number = session.study.proposal.studies_number + sessions_number = session.study.sessions_number + + if studies_number > 1 and sessions_number > 1: + session_title = format_html('{}{}{}{}{}{}{}', + _('Traject '), + study_order, + mark_safe(' '), + study_name, + mark_safe(' , '), + _('sessie '), + order + ) + elif studies_number > 1: + session_title = format_html('{}{}{}{}{}', + _('Traject '), + study_order, + mark_safe(' '), + study_name, + mark_safe(' ') + ) + elif sessions_number >= 1: + session_title = format_html('{}{}', + _('Sessie '), + order + ) + return session_title + + def get_task_title(self, task): + order=task.order + session_order=task.session.order + study_order=task.session.study.order + study_name=task.session.study.name + studies_number=task.session.study.proposal.studies_number + if studies_number > 1: + task_title = format_html('{}{}{}{}{}{}{}{}{}', + _('Traject '), + study_order, + mark_safe(' '), + study_name, + mark_safe(' , '), + _('sessie '), + session_order, + _(', taak '), + order + ) + else: + task_title = format_html('{}{}{}{}', + _('Sessie '), + session_order, + _(', taak '), + order + ) + return task_title + +class GeneralSection(PDFSection): + '''This class generates the data for the general section of + the PDF page.''' + + section_title = _("Algemene informatie over de aanvraag") + row_fields = [ + 'relation', + 'supervisor', + 'student_program', + 'student_context', + 'student_context_details', + 'student_justification', + 'other_applicants', + 'applicants', + 'other_stakeholders', + 'stakeholders', + 'date_start', + 'title', + 'funding', + 'funding_details', + 'funding_name', + 'self_assessment', + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not obj.relation.needs_supervisor: + rows.remove('supervisor') + if not obj.relation.check_in_course: + rows.remove('student_program') + rows.remove('student_context') + if obj.student_context is not None: + if not obj.student_context.needs_details: + rows.remove('student_context_details') + else: + rows.remove('student_context_details') + rows.remove('student_justification') + if not obj.other_applicants: + rows.remove('applicants') + if not obj.other_stakeholders: + rows.remove('stakeholders') + if not needs_details(obj.funding.all()): + rows.remove('funding_details') + if not needs_details(obj.funding.all(), 'needs_name'): + rows.remove('funding_name') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class WMOSection(PDFSection): + '''Object for this section is proposal.wmo''' + section_title = _("Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?") + row_fields = [ + 'get_metc_display', + 'metc_details', + 'metc_institution', + 'get_is_medical_display', + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not obj.metc == 'Y': + rows.remove('metc_details') + rows.remove('metc_institution') + else: + rows.remove('get_is_medical_display') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class METCSection(PDFSection): + '''Object for this section is proposal.wmo + This class exists because the RowValueClass does some + funky things for working with the metc_decision_pdf field''' + section_title = _("Aanmelding bij de METC") + + row_fields = [ + 'metc_application', + 'metc_decision', + 'metc_decision_pdf' + ] + +class TrajectoriesSection(PDFSection): + + section_title = _("Eén of meerdere trajecten?") + + row_fields = [ + 'studies_similar', + 'studies_number' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if obj.studies_similar: + rows.remove('studies_number') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class StudySection(PDFSection): + '''object for this study is proposal.study''' + section_title = _('De Deelnemers') + row_fields = [ + 'age_groups', + 'legally_incapable', + 'legally_incapable_details', + 'has_special_details', + 'special_details', + 'traits', + 'traits_details', + 'necessity', + 'necessity_reason', + 'recruitment', + 'recruitment_details', + 'compensation', + 'compensation_details', + 'hierarchy', + 'hierarchy_details', + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not has_adults(obj): + rows.remove('legally_incapable') + rows.remove('legally_incapable_details') + elif not obj.legally_incapable: + rows.remove('legally_incapable_details') + if not obj.has_special_details: + rows.remove('special_details') + rows.remove('traits') + rows.remove('traits_details') + elif not medical_traits(obj.special_details.all()): + rows.remove('traits') + rows.remove('traits_details') + elif not needs_details(obj.traits.all()): + rows.remove('traits_details') + if not necessity_required(obj): + rows.remove('necessity') + rows.remove('necessity_reason') + if not needs_details(obj.recruitment.all()): + rows.remove('recruitment_details') + if not obj.compensation.needs_details: + rows.remove('compensation_details') + if not obj.hierarchy: + rows.remove('hierarchy_details') + + rows = [RowClass(obj, field) for field in rows] + + return rows + + def render(self, context): + if self.object.proposal.studies_number > 1: + context.update( + { + 'study_title': super().get_study_title(self.object) + } + ) + return super().render(context) + +class InterventionSection(PDFSection): + '''This class will receive a intervention object''' + section_title = _('Het interventieonderzoek') + row_fields = [ + 'setting', + 'setting_details', + 'supervision', + 'leader_has_coc', + 'period', + 'multiple_sessions', + 'session_frequency', + 'amount_per_week', + 'duration', + 'measurement', + 'experimenter', + 'description', + 'has_controls', + 'controls_description', + 'extra_task' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if obj.version == 1: + fields_to_remove = ['multiple_sessions', + 'session_frequency', + 'extra_task'] + for field in fields_to_remove: + rows.remove(field) + else: + rows.remove('amount_per_week') + if not obj.multiple_sessions: + rows.remove('session_frequency') + if obj.settings_contains_schools: + rows.remove('extra_task') + + if not needs_details(obj.setting.all()): + rows.remove('setting_details') + if not obj.study.has_children() or \ + not needs_details(obj.setting.all(), 'needs_supervision'): + rows.remove('supervision') + rows.remove('leader_has_coc') + elif obj.supervision: + rows.remove('leader_has_coc') + if not obj.has_controls: + rows.remove('controls_description') + + rows = [RowClass(obj, field) for field in rows] + + return rows + + def render(self, context): + if self.object.study.proposal.studies_number > 1: + context.update( + { + 'study_title': super().get_study_title(self.object.study) + } + ) + return super().render(context) + +class ObservationSection(InterventionSection): + '''Gets passed an observation object''' + section_title = _('Het observatieonderzoek') + row_fields = [ + 'setting', + 'setting_details', + 'supervision', + 'leader_has_coc', + 'days', + 'mean_hours', + 'details_who', + 'details_why', + 'details_frequency', + 'is_anonymous', + 'is_anonymous_details', + 'is_in_target_group', + 'is_in_target_group_details', + 'is_nonpublic_space', + 'is_nonpublic_space_details', + 'has_advanced_consent', + 'has_advanced_consent_details', + 'needs_approval', + 'approval_institution', + 'approval_document', + 'registrations', + 'registrations_details' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if obj.version == 1: + to_remove_if_v1 = ['details_who', + 'details_why', + 'is_anonymous_details', + 'is_in_target_group_details', + 'is_nonpublic_space_details', + 'has_advanced_consent_details' + ] + for field in to_remove_if_v1: + rows.remove(field) + + if not obj.is_nonpublic_space: + rows.remove('has_advanced_consent') + if not obj.needs_approval: + rows.remove('approval_institution') + rows.remove('approval_document') + elif obj.study.proposal.is_practice(): + rows.remove('approval_document') + else: + to_remove_if_v2 = ['days', 'mean_hours', 'approval_document'] + for field in to_remove_if_v2: + rows.remove(field) + + if not obj.is_anonymous: + rows.remove('is_anonymous_details') + if not obj.is_in_target_group: + rows.remove('is_in_target_group_details') + if not obj.is_nonpublic_space: + rows.remove('is_nonpublic_space_details') + rows.remove('has_advanced_consent') + rows.remove('has_advanced_consent_details') + elif obj.has_advanced_consent: + rows.remove('has_advanced_consent_details') + if not needs_details(obj.setting.all(), 'is_school'): + rows.remove('needs_approval') + if not obj.needs_approval: + rows.remove('approval_institution') + + if not needs_details(obj.setting.all()): + rows.remove('setting_details') + if not obj.study.has_children() or \ + not needs_details(obj.setting.all(), 'needs_supervision'): + rows.remove('supervision') + rows.remove('leader_has_coc') + elif obj.supervision: + rows.remove('leader_has_coc') + if not needs_details(obj.registrations.all()): + rows.remove('registrations_details') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class SessionsSection(StudySection): + '''Gets passed a study object + This Section looks maybe a bit unnecessary, but it does remove some logic, plus + the study_title.html from the template.''' + + section_title = _("Het takenonderzoek en interviews") + + def get_rows(self): + + rows = [RowValueClass(self.object, 'sessions_number')] + + return rows + +class SessionSection(PDFSection): + '''Gets passed a session object''' + + row_fields = [ + 'setting', + 'setting_details', + 'supervision', + 'leader_has_coc', + 'tasks_number', + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not needs_details(obj.setting.all()): + rows.remove('setting_details') + if not obj.study.has_children() or \ + not needs_details(obj.setting.all(), 'needs_supervision'): + rows.remove('supervision') + rows.remove('leader_has_coc') + elif obj.supervision: + rows.remove('leader_has_coc') + + rows = [RowClass(obj, field) for field in rows] + + return rows + + def render(self, context): + context.update( + { + 'study_title': super().get_session_title(self.object) + } + ) + return super().render(context) + +class TaskSection(PDFSection): + '''Gets passed a task object''' + + row_fields = [ + 'name', + 'duration', + 'registrations', + 'registrations_details', + 'registration_kinds', + 'registration_kinds_details', + 'feedback', + 'feedback_details', + 'description' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not needs_details(obj.registrations.all()): + rows.remove('registrations_details') + if not needs_details(obj.registrations.all(), 'needs_kind') or \ + not needs_details(obj.registration_kinds.all()): + rows.remove('registration_kinds') + rows.remove('registration_kinds_details') + elif not needs_details(obj.registration_kinds.all()): + rows.remove('registration_kinds_details') + if not obj.feedback: + rows.remove('feedback_details') + + rows = [RowClass(obj, field) for field in rows] + + return rows + + def render(self, context): + context.update( + { + 'study_title': super().get_task_title(self.object) + } + ) + return super().render(context) + +class TasksOverviewSection(PDFSection): + '''Gets passed a session object + This might be unecessary ... Maybe just use the existing template language ... + Because the verbose name of this field is formatted, the method for retrieving + the verbose name in the RowClass is quite convoluded.''' + + row_fields = [ + 'tasks_duration' + ] + + def render(self, context): + '''Here I am just overriding the render function, to get the correct formatting + The naming is a bit confusing, might fix later''' + context.update( + { + 'study_title': _('Overzicht van het takenonderzoek') + } + ) + return super().render(context) + +class StudyOverviewSection(StudySection): + '''Receives a Study object''' + + section_title = _('Overzicht en eigen beoordeling van het gehele onderzoek') + row_fields = [ + 'deception', + 'deception_details', + 'negativity', + 'negativity_details', + 'stressful', + 'stressful_details', + 'risk', + 'risk_details' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + rows_to_remove = [] + for x in range(0, 7, 2): + if getattr(obj, rows[x]) == 'N': + rows_to_remove.append(rows[x+1]) + rows = [row for row in rows if row not in rows_to_remove] + + if not obj.has_sessions and not obj.deception == 'N': + rows.remove('deception') + rows.remove('deception_details') + elif not obj.has_sessions: + rows.remove('deception') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class InformedConsentFormsSection(InterventionSection): + '''Receives a Documents object''' + + section_title = _('Informed consent formulieren') + + def get_rows(self): + obj = self.object + + rows = [] + + rows.append(RowClass(obj.proposal, 'translated_forms')) + if obj.proposal.translated_forms: + rows.append(RowClass(obj.proposal, 'translated_forms_languages')) + if not obj.proposal.is_practice() and obj.informed_consent: + rows.append(RowClass(obj, 'informed_consent')) + rows.append(RowClass(obj, 'briefing')) + if obj.study.passive_consent is not None: + rows.append(RowClass(obj.study, 'passive_consent')) + if obj.study.passive_consent: + rows.append(RowClass(obj.study, 'passive_consent_details')) + if obj.director_consent_declaration: + rows.append(RowClass(obj, 'director_consent_declaration')) + if obj.director_consent_information: + rows.append(RowClass(obj, 'director_consent_information')) + if obj.parents_information: + rows.append(RowClass(obj, 'parents_information')) + + return rows + +class ExtraDocumentsSection(PDFSection): + '''gets a documents object''' + + row_fields = [ + 'informed_consent', + 'briefing' + ] + + def __init__(self, object, count): + super().__init__(object) + self.section_title = _('Extra formulieren ') + str(count) + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not obj.informed_consent: + rows.remove('informed_consent') + if not obj.briefing: + rows.remove('briefing') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class DMPFileSection(PDFSection): + '''Gets passed a proposal object.''' + + section_title = _('Data Management Plan') + + row_fields = ['dmp_file'] + +class EmbargoSection(PDFSection): + '''Gets passed a proposal object''' + + section_title = _('Aanmelding Versturen') + + row_fields = [ + 'embargo', + 'embargo_end_date' + ] + + def get_rows(self): + obj = self.object + rows = self._row_fields + + if not obj.embargo: + rows.remove('embargo_end_date') + + rows = [RowClass(obj, field) for field in rows] + + return rows + +class RowClass: + + verbose_name_diff_field_dict = { + 'get_metc_display': 'metc', + 'get_is_medical_display': 'is_medical' + } + + def __init__(self, object, field): + self.object = object + self.field = field + + def verbose_name(self): + if self.field in self.verbose_name_diff_field_dict: + verbose_name_field = self.verbose_name_diff_field_dict[self.field] + verbose_name = self.get_verbose_name(verbose_name_field) + else: + verbose_name= self.get_verbose_name(self.field) + return verbose_name + + def value(self): + return RowValueClass(self.object, self.field).render() + + def get_verbose_name(self, field): + if field != 'tasks_duration': + return mark_safe(self.object._meta.get_field(field).verbose_name) + else: + return mark_safe(self.object._meta.get_field(field).verbose_name % self.object.net_duration()) + +class RowValueClass: + + def __init__(self, object, field): + + self.object = object + self.field = field + + def render(self): + from ..models import Funding, Relation + + + value = getattr(self.object, self.field) + + User = get_user_model() + + if value in ('Y', 'N', '?'): + return self.yes_no_doubt(value) + if type(value) in (str, int, date): + return value + elif value is None: + return _('Onbekend') + elif type(value) == bool: + return _('Ja') if value else _('Nee') + elif type(value) == User: + return self.handle_user(value) + elif type(value) == Relation: + return value.description + elif value.__class__.__name__ == 'ManyRelatedManager': + if value.all().model == User: + return self.get_applicants_names(value) + else: + return self.get_object_list(value) + elif value.__class__.__name__ == 'FieldFile': + return self.handle_field_file(value, self.object) + elif callable(value): + return value() + + def handle_user(self, user): + return user.get_full_name() + + def get_applicants_names(self, applicants): + applicant_names = [applicant.get_full_name() for applicant in applicants.all()] + return self.create_unordered_html_list(applicant_names) + + def get_object_list(self, object): + list_of_objects = [obj for obj in object.all()] + return self.create_unordered_html_list(list_of_objects) + + def create_unordered_html_list(self, list): + html_output = mark_safe('
    ') + + for item in list: + html_output += format_html('{}{}{}', + mark_safe('
  • '), + item, + mark_safe('
  • ') + ) + + html_output += mark_safe('
') + + return html_output + + def handle_field_file(self, field_file, object): + from ..models import Proposal + if object == Proposal and field_file == object.wmo.metc_decision_pdf: + if object.wmo.metc_decision_pdf and not object.is_practice(): + output = format_html('{}{}{}{}{}', + mark_safe('
'), + _('Download'), + mark_safe('') + ) + else: + output = _('Niet aangeleverd') + else: + output = format_html('{}{}{}{}{}', + mark_safe(''), + _('Download'), + mark_safe('') + ) + return output + + def yes_no_doubt(self, value): + from main.models import YES_NO_DOUBT + d = dict(YES_NO_DOUBT) + return d[value] diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index e1c00b329..79c3bbb21 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- -from collections import defaultdict, OrderedDict -from datetime import datetime, date +from collections import defaultdict +from datetime import datetime from io import BytesIO import os @@ -12,7 +12,7 @@ from django.core.mail import send_mail from django.db.models import Q from django.urls import reverse -from django.template.loader import render_to_string, get_template +from django.template.loader import render_to_string, from django.utils.translation import activate, get_language, ugettext as _ from django.utils.deconstruct import deconstructible @@ -302,742 +302,6 @@ def _get_next_proposal_number(current_year) -> int: except Proposal.DoesNotExist: return 1 -from django.contrib.auth import get_user_model -from django.utils.safestring import mark_safe -from django.utils.html import format_html -from copy import copy -from django.conf import settings -from proposals.templatetags.proposal_filters import needs_details, medical_traits, \ -necessity_required, has_adults - -'''NOTE TO SELF: -Might not have to have the whole tuple system ... -Would streamline code a lot.''' - - -class PDFSection: - - section_title = None - study_title = None - row_fields = None - verbose_name_diff_field_dict = { - 'get_metc_display': 'metc', - 'get_is_medical_display': 'is_medical' - } - - def __init__(self, object): - self.object = object - # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value - self._row_fields = copy(self.row_fields) - - def render(self, context): - template = get_template("proposals/pdf/table_with_header.html") - context.update( - { - "section_title": self.section_title, - "rows": self.get_rows(), - } - ) - - return template.render(context.flatten()) - - def get_rows(self): - raise Exception('You forgot to define the get_rows function for your subclass!') - - def get_study_title(self, study): - if study.name: - study_title = format_html('{}{}{}{}{}', - _('Traject '), - study.order, - mark_safe(' '), - study.name, - mark_safe(' ') - ) - else: - study_title = format_html('{}{}', - _('Traject'), - {study.order} - ) - return study_title - - def get_session_title(self, session): - - order = session.order - study_order = session.study.order - study_name = session.study.name - studies_number = session.study.proposal.studies_number - sessions_number = session.study.sessions_number - - if studies_number > 1 and sessions_number > 1: - session_title = format_html('{}{}{}{}{}{}{}', - _('Traject '), - study_order, - mark_safe(' '), - study_name, - mark_safe(' , '), - _('sessie '), - order - ) - elif studies_number > 1: - session_title = format_html('{}{}{}{}{}', - _('Traject '), - study_order, - mark_safe(' '), - study_name, - mark_safe(' ') - ) - elif sessions_number >= 1: - session_title = format_html('{}{}', - _('Sessie '), - order - ) - return session_title - - def get_task_title(self, task): - order=task.order - session_order=task.session.order - study_order=task.session.study.order - study_name=task.session.study.name - studies_number=task.session.study.proposal.studies_number - if studies_number > 1: - task_title = format_html('{}{}{}{}{}{}{}{}{}', - _('Traject '), - study_order, - mark_safe(' '), - study_name, - mark_safe(' , '), - _('sessie '), - session_order, - _(', taak '), - order - ) - else: - task_title = format_html('{}{}{}{}', - _('Sessie '), - session_order, - _(', taak '), - order - ) - return task_title - -class GeneralSection(PDFSection): - '''This class generates the data for the general section of - the PDF page.''' - - section_title = _("Algemene informatie over de aanvraag") - row_fields = [ - 'relation', - 'supervisor', - 'student_program', - 'student_context', - 'student_context_details', - 'student_justification', - 'other_applicants', - 'applicants', - 'other_stakeholders', - 'stakeholders', - 'date_start', - 'title', - 'funding', - 'funding_details', - 'funding_name', - 'self_assessment', - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if not obj.relation.needs_supervisor: - rows.remove('supervisor') - if not obj.relation.check_in_course: - rows.remove('student_program') - rows.remove('student_context') - if obj.student_context is not None: - if not obj.student_context.needs_details: - rows.remove('student_context_details') - else: - rows.remove('student_context_details') - rows.remove('student_justification') - if not obj.other_applicants: - rows.remove('applicants') - if not obj.other_stakeholders: - rows.remove('stakeholders') - if not needs_details(obj.funding.all()): - rows.remove('funding_details') - if not needs_details(obj.funding.all(), 'needs_name'): - rows.remove('funding_name') - - rows = [RowClass(obj, field) for field in rows] - - return rows - -class WMOSection(PDFSection): - '''Object for this section is proposal.wmo''' - section_title = _("Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?") - row_fields = [ - 'get_metc_display', - 'metc_details', - 'metc_institution', - 'get_is_medical_display', - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if not obj.metc == 'Y': - rows.remove('metc_details') - rows.remove('metc_institution') - else: - rows.remove('get_is_medical_display') - - rows = [RowClass(obj, field) for field in rows] - - return rows - -class METCSection(PDFSection): - '''Object for this section is proposal.wmo - This class exists because the RowValueClass does some - funky things for working with the metc_decision_pdf field''' - section_title = _("Aanmelding bij de METC") - - row_fields = [ - 'metc_application', - 'metc_decision', - 'metc_decision_pdf' - ] - - def get_rows(self): - - rows = [RowClass(self.object, field) for field in self._row_fields] - - return rows - -class TrajectoriesSection(PDFSection): - - section_title = _("Eén of meerdere trajecten?") - - row_fields = [ - 'studies_similar', - 'studies_number' - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if obj.studies_similar: - rows.remove('studies_number') - - rows = [RowClass(obj, field) for field in rows] - - return rows - -class StudySection(PDFSection): - '''object for this study is proposal.study''' - section_title = _('De Deelnemers') - row_fields = [ - 'age_groups', - 'legally_incapable', - 'legally_incapable_details', - 'has_special_details', - 'special_details', - 'traits', - 'traits_details', - 'necessity', - 'necessity_reason', - 'recruitment', - 'recruitment_details', - 'compensation', - 'compensation_details', - 'hierarchy', - 'hierarchy_details', - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if not has_adults(obj): - rows.remove('legally_incapable') - rows.remove('legally_incapable_details') - elif not obj.legally_incapable: - rows.remove('legally_incapable_details') - if not obj.has_special_details: - rows.remove('special_details') - rows.remove('traits') - rows.remove('traits_details') - elif not medical_traits(obj.special_details.all()): - rows.remove('traits') - rows.remove('traits_details') - elif not needs_details(obj.traits.all()): - rows.remove('traits_details') - if not necessity_required(obj): - rows.remove('necessity') - rows.remove('necessity_reason') - if not needs_details(obj.recruitment.all()): - rows.remove('recruitment_details') - if not obj.compensation.needs_details: - rows.remove('compensation_details') - if not obj.hierarchy: - rows.remove('hierarchy_details') - - rows = [RowClass(obj, field) for field in rows] - - return rows - - def render(self, context): - if self.object.proposal.studies_number > 1: - context.update( - { - 'study_title': super().get_study_title(self.object) - } - ) - return super().render(context) - -class InterventionSection(PDFSection): - '''This class will receive a intervention object''' - section_title = _('Het interventieonderzoek') - row_fields = [ - 'setting', - 'setting_details', - 'supervision', - 'leader_has_coc', - 'period', - 'multiple_sessions', - 'session_frequency', - 'amount_per_week', - 'duration', - 'measurement', - 'experimenter', - 'description', - 'has_controls', - 'controls_description', - 'extra_task' - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if obj.version == 1: - fields_to_remove = ['multiple_sessions', - 'session_frequency', - 'extra_task'] - for field in fields_to_remove: - rows.remove(field) - else: - rows.remove('amount_per_week') - if not obj.multiple_sessions: - rows.remove('session_frequency') - if obj.settings_contains_schools: - rows.remove('extra_task') - - if not needs_details(obj.setting.all()): - rows.remove('setting_details') - if not obj.study.has_children() or \ - not needs_details(obj.setting.all(), 'needs_supervision'): - rows.remove('supervision') - rows.remove('leader_has_coc') - elif obj.supervision: - rows.remove('leader_has_coc') - if not obj.has_controls: - rows.remove('controls_description') - - rows = [RowClass(obj, field) for field in rows] - - return rows - - def render(self, context): - if self.object.study.proposal.studies_number > 1: - context.update( - { - 'study_title': super().get_study_title(self.object.study) - } - ) - return super().render(context) - -class ObservationSection(InterventionSection): - '''Gets passed an observation object''' - section_title = _('Het observatieonderzoek') - row_fields = [ - 'setting', - 'setting_details', - 'supervision', - 'leader_has_coc', - 'days', - 'mean_hours', - 'details_who', - 'details_why', - 'details_frequency', - 'is_anonymous', - 'is_anonymous_details', - 'is_in_target_group', - 'is_in_target_group_details', - 'is_nonpublic_space', - 'is_nonpublic_space_details', - 'has_advanced_consent', - 'has_advanced_consent_details', - 'needs_approval', - 'approval_institution', - 'approval_document', - 'registrations', - 'registrations_details' - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if obj.version == 1: - to_remove_if_v1 = ['details_who', - 'details_why', - 'is_anonymous_details', - 'is_in_target_group_details', - 'is_nonpublic_space_details', - 'has_advanced_consent_details' - ] - for field in to_remove_if_v1: - rows.remove(field) - - if not obj.is_nonpublic_space: - rows.remove('has_advanced_consent') - if not obj.needs_approval: - rows.remove('approval_institution') - rows.remove('approval_document') - elif obj.study.proposal.is_practice(): - rows.remove('approval_document') - else: - to_remove_if_v2 = ['days', 'mean_hours', 'approval_document'] - for field in to_remove_if_v2: - rows.remove(field) - - if not obj.is_anonymous: - rows.remove('is_anonymous_details') - if not obj.is_in_target_group: - rows.remove('is_in_target_group_details') - if not obj.is_nonpublic_space: - rows.remove('is_nonpublic_space_details') - rows.remove('has_advanced_consent') - rows.remove('has_advanced_consent_details') - elif obj.has_advanced_consent: - rows.remove('has_advanced_consent_details') - if not needs_details(obj.setting.all(), 'is_school'): - rows.remove('needs_approval') - if not obj.needs_approval: - rows.remove('approval_institution') - - if not needs_details(obj.setting.all()): - rows.remove('setting_details') - if not obj.study.has_children() or \ - not needs_details(obj.setting.all(), 'needs_supervision'): - rows.remove('supervision') - rows.remove('leader_has_coc') - elif obj.supervision: - rows.remove('leader_has_coc') - if not needs_details(obj.registrations.all()): - rows.remove('registrations_details') - - rows = [RowClass(obj, field) for field in rows] - - return rows - -class SessionsSection(StudySection): - '''Gets passed a study object - This Section looks maybe a bit unnecessary, but it does remove some logic, plus - the study_title.html from the template.''' - section_title = _("Het takenonderzoek en interviews") - - def get_rows(self): - - rows = [RowValueClass(self.object, 'sessions_number')] - - return rows -class SessionSection(PDFSection): - '''Gets passed a session object''' - - row_fields = [ - 'setting', - 'setting_details', - 'supervision', - 'leader_has_coc', - 'tasks_number', - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if not needs_details(obj.setting.all()): - rows.remove('setting_details') - if not obj.study.has_children() or \ - not needs_details(obj.setting.all(), 'needs_supervision'): - rows.remove('supervision') - rows.remove('leader_has_coc') - elif obj.supervision: - rows.remove('leader_has_coc') - - rows = [RowClass(obj, field) for field in rows] - - return rows - - def render(self, context): - context.update( - { - 'study_title': super().get_session_title(self.object) - } - ) - return super().render(context) - -class TaskSection(PDFSection): - '''Gets passed a task object''' - - row_fields = [ - 'name', - 'duration', - 'registrations', - 'registrations_details', - 'registration_kinds', - 'registration_kinds_details', - 'feedback', - 'feedback_details', - 'description' - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - if not needs_details(obj.registrations.all()): - rows.remove('registrations_details') - if not needs_details(obj.registrations.all(), 'needs_kind') or \ - not needs_details(obj.registration_kinds.all()): - rows.remove('registration_kinds') - rows.remove('registration_kinds_details') - elif not needs_details(obj.registration_kinds.all()): - rows.remove('registration_kinds_details') - if not obj.feedback: - rows.remove('feedback_details') - - rows = [RowClass(obj, field) for field in rows] - - return rows - - def render(self, context): - context.update( - { - 'study_title': super().get_task_title(self.object) - } - ) - return super().render(context) - -class TasksOverviewSection(PDFSection): - '''Gets passed a session object - This might be unecessary ... Maybe just use the existing template language ... - Because the verbose name of this field is formatted, the method for retrieving - the verbose name in the RowClass is quite convoluded.''' - - row_fields = [ - 'tasks_duration' - ] - - def get_rows(self): - - rows = [RowClass(self.object, field) for field in self._row_fields] - - return rows - - def render(self, context): - '''Here I am just overriding the render function, to get the correct formatting - The naming is a bit confusing, might fix later''' - context.update( - { - 'study_title': _('Overzicht van het takenonderzoek') - } - ) - return super().render(context) - -class StudyOverviewSection(StudySection): - '''Receives a Study object''' - - section_title = _('Overzicht en eigen beoordeling van het gehele onderzoek') - row_fields = [ - 'deception', - 'deception_details', - 'negativity', - 'negativity_details', - 'stressful', - 'stressful_details', - 'risk', - 'risk_details' - ] - - def get_rows(self): - obj = self.object - rows = self._row_fields - - rows_to_remove = [] - for x in range(0, 7, 2): - if getattr(obj, rows[x]) == 'N': - rows_to_remove.append(rows[x+1]) - rows = [row for row in rows if row not in rows_to_remove] - - if not obj.has_sessions and not obj.deception == 'N': - rows.remove('deception') - rows.remove('deception_details') - elif not obj.has_sessions: - rows.remove('deception') - - rows = [RowClass(obj, field) for field in rows] - - return rows - -class InformedConsentFormsSection(InterventionSection): - '''Receives a Documents object''' - - section_title = _('Informed consent formulieren') - - '''TODO: Debug''' - def get_rows(self): - obj = self.object - rows = [] - rows.append(RowClass(obj.proposal, 'translated_forms')) - if obj.proposal.translated_forms: - rows.append(RowClass(obj.proposal, 'translated_forms_languages')) - if not obj.proposal.is_practice and obj.informed_consent: - rows.append(RowClass(obj, 'informed_consent')) - rows.append(RowClass(obj, 'briefing')) - if obj.study.passive_consent is not None: - rows.append(RowClass(obj.study, 'passive_consent')) - if obj.study.passive_consent: - rows.append(RowClass(obj.study, 'passive_consent_details')) - if obj.director_consent_declaration: - rows.append(RowClass(obj, 'director_consent_declaration')) - if obj.director_consent_information: - rows.append(RowClass(obj, 'director_consent_information')) - if obj.parents_information: - rows.append(RowClass(obj, 'parents_information')) - breakpoint() - return rows -class RowClass: - - verbose_name_diff_field_dict = { - 'get_metc_display': 'metc', - 'get_is_medical_display': 'is_medical' - } - - def __init__(self, object, field): - self.object = object - self.field = field - - def verbose_name(self): - if self.field in self.verbose_name_diff_field_dict: - verbose_name_field = self.verbose_name_diff_field_dict[self.field] - verbose_name = self.get_verbose_name(verbose_name_field), - else: - verbose_name= self.get_verbose_name(self.field) - return verbose_name - - def value(self): - return RowValueClass(self.object, self.field).render() - - def get_verbose_name(self, field): - if field != 'tasks_duration': - return mark_safe(self.object._meta.get_field(field).verbose_name) - else: - return mark_safe(self.object._meta.get_field(field).verbose_name % self.object.net_duration()) - -class RowValueClass: - - def __init__(self, object, field): - - self.object = object - self.field = field - - def render(self): - from ..models import Funding, Relation - - - value = getattr(self.object, self.field) - - User = get_user_model() - - if value in ('Y', 'N', '?'): - return self.yes_no_doubt(value) - if type(value) in (str, int, date): - return value - elif value is None: - return _('Onbekend') - elif type(value) == bool: - return _('Ja') if value else _('Nee') - elif type(value) == User: - return self.handle_user(value) - elif type(value) == Relation: - return value.description - elif value.__class__.__name__ == 'ManyRelatedManager': - if value.all().model == User: - return self.get_applicants_names(value) - else: - return self.get_object_list(value) - elif value.__class__.__name__ == 'FieldFile': - return self.handle_field_file(value, self.object) - elif callable(value): - return value() - - def handle_user(self, user): - return user.get_full_name() - - def get_applicants_names(self, applicants): - applicant_names = [applicant.get_full_name() for applicant in applicants.all()] - return self.create_unordered_html_list(applicant_names) - - def get_object_list(self, object): - list_of_objects = [obj for obj in object.all()] - return self.create_unordered_html_list(list_of_objects) - - def create_unordered_html_list(self, list): - html_output = mark_safe('
    ') - - for item in list: - html_output += format_html('{}{}{}', - mark_safe('
  • '), - item, - mark_safe('
  • ') - ) - - html_output += mark_safe('
') - - return html_output - - def handle_field_file(self, field_file, object): - from ..models import Proposal - if type(object) == Proposal: - if object.wmo.metc_decision_pdf and not object.is_practice(): - output = format_html('{}{}{}{}{}', - mark_safe(''), - _('Download'), - mark_safe('') - ) - else: - output = _('Niet aangeleverd') - else: - output = format_html('{}{}{}{}{}', - mark_safe(''), - _('Download'), - mark_safe('') - ) - return output - - def yes_no_doubt(self, value): - from main.models import YES_NO_DOUBT - d = dict(YES_NO_DOUBT) - return d[value] - def generate_pdf(proposal, template=False): """Grandfathered function for pdf saving. The template arg currently only exists for backwards compatibility.""" @@ -1061,8 +325,6 @@ def generate_pdf(proposal, template=False): return proposal.pdf - - def pdf_link_callback(uri, rel): """ Convert HTML URIs to absolute system paths so xhtml2pdf can access those diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 41b877610..4c75ceb5f 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -581,7 +581,7 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection, \ TrajectoriesSection, StudySection, InterventionSection, ObservationSection, SessionsSection, \ SessionSection, TaskSection, TasksOverviewSection, StudyOverviewSection, \ -InformedConsentFormsSection +InformedConsentFormsSection, ExtraDocumentsSection, DMPFileSection, EmbargoSection \ class NewPDFViewTest(generic.TemplateView): @@ -618,7 +618,18 @@ def get_context_data(self, **kwargs): study_sections.append(StudyOverviewSection(study)) study_sections.append(InformedConsentFormsSection(study.documents)) context['studies'].append(study_sections) - + extra_documents = [] + for count, document in enumerate(Documents.objects.filter( + proposal = model, + study__isnull = True + )): + extra_documents.append(ExtraDocumentsSection(document, count+1)) + if extra_documents: + context['extra_documents'] = extra_documents + if model.dmp_file: + context['dmp_file'] = DMPFileSection(model) + context['embargo'] = EmbargoSection(model) + return context From d1c55b5cb7212dce94abd40bd54c9bbfeb6b74f5 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Sep 2023 14:31:12 +0200 Subject: [PATCH 020/148] Started implementing it for diff + organizing --- .../proposals/new_proposal_diff.html | 180 +++++++++++ .../proposals/pdf/diff_table_with_header.html | 33 ++ .../templates/proposals/pdf/new_pdf_test.html | 48 ++- .../templates/proposals/proposal_pdf.html | 131 +------- proposals/utils/pdf_diff_logic.py | 281 ++++++++++-------- proposals/utils/proposal_utils.py | 2 +- proposals/views/proposal_views.py | 77 +++-- 7 files changed, 460 insertions(+), 292 deletions(-) create mode 100644 proposals/templates/proposals/new_proposal_diff.html create mode 100644 proposals/templates/proposals/pdf/diff_table_with_header.html diff --git a/proposals/templates/proposals/new_proposal_diff.html b/proposals/templates/proposals/new_proposal_diff.html new file mode 100644 index 000000000..e5fee7cad --- /dev/null +++ b/proposals/templates/proposals/new_proposal_diff.html @@ -0,0 +1,180 @@ +{% extends "base/base.html" %} + +{% load i18n %} +{% load proposal_filters %} +{% load static %} +{% load uil_filters %} +{% load get_field_name %} +{% load diff_tags %} + +{% block header_title %} + {% trans "Overzicht van wijzigingen" %} - {{ block.super }} +{% endblock %} + +{% block html_head %} + + +{% endblock %} + +{% block content %} +
+
+

{% trans "Overzicht van wijzigingen" %}

+

+ {% trans "Dit overzicht toont de gemaakte wijzigingen in de revisie/het amendement ten opzichte van de originele aanvraag." %} +

+
+
+
+
+
+ +
+ {% with p_proposal=proposal.parent %} + + {% include general %} + + {% with wmo=proposal.wmo %} + {% with p_wmo=p_proposal.wmo %} +

{% trans "Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" %}

+ + + + + + + + + + + + {% if wmo.metc == 'Y' or p_wmo.metc == 'Y' %} + + + + + + + + + + + {% else %} + + + + + + {% endif %} +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "wmo" "metc" %}{{ p_wmo.get_metc_display }}{{ wmo.get_metc_display }}
{% get_verbose_field_name "proposals" "wmo" "metc_details" %}{{ p_wmo.metc_details }}{{ wmo.metc_details }}
{% get_verbose_field_name "proposals" "wmo" "metc_institution" %}{{ p_wmo.metc_institution }}{{ wmo.metc_institution }}
{% get_verbose_field_name "proposals" "wmo" "is_medical" %}{{ p_wmo.get_is_medical_display }}{{ wmo.get_is_medical_display }}
+ + {% if wmo.status != wmo.NO_WMO or p_wmo.status != p_wmo.NO_WMO %} +

{% trans "Aanmelding bij de METC" %}

+ + + + + + + + + + + + + + + + + + + {% if p_wmo.metc_decision_pdf %} + + {% endif %} + {% if wmo.metc_decision_pdf %} + + {% endif %} + +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "wmo" "metc_application" %}{{ p_wmo.metc_application|yesno:_("ja,nee") }}{{ wmo.metc_application|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "wmo" "metc_decision" %}{{ p_wmo.metc_decision|yesno:_("ja,nee") }}{{ wmo.metc_decision|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "wmo" "metc_decision_pdf" %}{% trans "Download" %}{% trans "Download" %}
+ {% endif %} + {% endwith %} + {% endwith %} + +

{% trans "Eén of meerdere trajecten?" %}

+ + + + + + + + + + + + {% if not proposal.studies_similar or not p_proposal.studies_similar %} + + + + + + {% endif %} +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "proposal" "studies_similar" %}{{ p_proposal.studies_similar|yesno:_("ja,nee") }}{{ proposal.studies_similar|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "studies_number" %}{{ p_proposal.studies_number }}{{ proposal.studies_number }}
+ + {% if proposal.wmo.status == proposal.wmo.NO_WMO or proposal.wmo.status == proposal.wmo.JUDGED %} + {% include 'proposals/diff/study.html' %} + +

{% trans "Concept-aanmelding versturen" %}

+ + + + + + + + + + + + {% if proposal.embargo or p_proposal.embargo %} + + + + + + {% endif %} + + + + + +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "proposal" "embargo" %}{{ p_proposal.embargo|yesno:_("ja,nee") }}{{ proposal.embargo|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "embargo_end_date" %}{{ p_proposal.embargo_end_date }}{{ proposal.embargo_end_date }}
{% get_verbose_field_name "proposals" "proposal" "comments" %}{{ p_proposal.comments }}{{ proposal.comments }}
+ {% endif %} + {% endwith %} + +

+ +

+ +
+
+{% endblock %} diff --git a/proposals/templates/proposals/pdf/diff_table_with_header.html b/proposals/templates/proposals/pdf/diff_table_with_header.html new file mode 100644 index 000000000..6c7c0b787 --- /dev/null +++ b/proposals/templates/proposals/pdf/diff_table_with_header.html @@ -0,0 +1,33 @@ +{% load i18n %} +{% load proposal_filters %} +{% load static %} +{% load uil_filters %} +{% load get_field_name %} +{% load diff_tags %} + +{% if section_title %} +

{{ section_title }}

+{% endif %} +{% if study_title %} +

{{ study_title }}

+{% endif %} + + + + + + +{% for row in rows %} + + + +{% endfor %} +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{{ row.verbose_name }}{{ row.value }}{{row.value_2}}
+ +

{% trans "Algemene informatie over de aanvraag" %}

+ + + + + + \ No newline at end of file diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 8bda7801e..74ed47785 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -13,14 +13,14 @@ {% block content %} - {% include test %} - {% include wmo_test %} + {% include general %} + {% comment %} {% include wmo %} - {% if metc_test %} - {% include metc_test %} + {% if metc %} + {% include metc %} {% endif %} - {% include trajectories_test %} + {% include trajectories %} {% if studies %} {% for study in studies %} @@ -42,4 +42,42 @@ {% include embargo %} + {% include general %} {% endcomment %} + + {% comment %} Code to copy into pdf file + +

{% get_verbose_field_name "proposals" "proposal" "summary" %}

+

{{ proposal.summary|linebreaks }}

+ + {% include wmo %} + + {% if metc %} + {% include metc %} + {% endif %} + + {% include trajectories %} + + {% if studies %} + {% for study in studies %} + {% for study_section in study %} + {% include study_section %} + {% endfor %} + {% endfor %} + {% endif %} + + {% if dmp_file %} + {% include dmp_file %} + {% endif %} + + {% if dmp_file %} + {% include dmp_file %} + {% endif %} + + {% include embargo %} + +

{% get_verbose_field_name "proposals" "proposal" "comments" %}

+

+ {{ proposal.comments }} +

{% endcomment %} + {% endblock %} \ No newline at end of file diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index dd3cc9f88..1dbbd27b0 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -79,136 +79,17 @@

{% trans 'Indiener' %}

{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% trans 'E-mail' %}{{ proposal.created_by.email }}
-

{% trans "Algemene informatie over de aanvraag" %}

- - - - - {% if proposal.relation.needs_supervisor %} - - - - {% endif %} - {% if proposal.relation.check_in_course %} - - - - - - - {% if proposal.student_context.needs_details %} - - - - {% endif %} - - - - {% endif %} - - - - {% if proposal.other_applicants %} - - - - {% endif %} - - - - {% if proposal.other_stakeholders %} - - - - {% endif %} - - - - - - - - - - {% if proposal.funding.all|needs_details %} - - - - {% endif %} - {% if proposal.funding.all|needs_details:"needs_name" %} - - - - {% endif %} - - - -
{% get_verbose_field_name "proposals" "proposal" "relation" %}{{ proposal.relation }}
{% get_verbose_field_name "proposals" "proposal" "supervisor" %}{{ proposal.supervisor.get_full_name }}
{% get_verbose_field_name "proposals" "proposal" "student_program" %}{{ proposal.student_program }}
{% get_verbose_field_name "proposals" "proposal" "student_context" %}{{ proposal.student_context }}
{% get_verbose_field_name "proposals" "proposal" "student_context_details" %}{{ proposal.student_context_details }}
{% get_verbose_field_name "proposals" "proposal" "student_justification" %}{{ proposal.student_justification }}
{% get_verbose_field_name "proposals" "proposal" "other_applicants" %}{{ proposal.other_applicants|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "applicants" %} -
    - {% for applicant in proposal.applicants.all %} -
  • - {{ applicant.get_full_name }} -
  • - {% endfor %} -
-
{% get_verbose_field_name "proposals" "proposal" "other_stakeholders" %}{{ proposal.other_stakeholders|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "stakeholders" %}{{ proposal.stakeholders }}
{% get_verbose_field_name "proposals" "proposal" "date_start" %}{{ proposal.date_start|default:_("onbekend") }}
{% get_verbose_field_name "proposals" "proposal" "title" %}{{ proposal.title }}
{% get_verbose_field_name "proposals" "proposal" "funding" %}{{ proposal.funding.all|unordered_list }}
{% get_verbose_field_name "proposals" "proposal" "funding_details" %}{{ proposal.funding_details }}
{% get_verbose_field_name "proposals" "proposal" "funding_name" %}{{ proposal.funding_name }}
{% get_verbose_field_name "proposals" "proposal" "self_assessment" %}{{ proposal.self_assessment }}
+ {% include general %}

{% get_verbose_field_name "proposals" "proposal" "summary" %}

{{ proposal.summary|linebreaks }}

- {% with wmo=proposal.wmo %} -

{% trans "Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" %}

- - - - - {% if wmo.metc == 'Y' %} - - - - - - - {% else %} - - - - {% endif %} -
{% get_verbose_field_name "proposals" "wmo" "metc" %}{{ wmo.get_metc_display }}
{% get_verbose_field_name "proposals" "wmo" "metc_details" %}{{ wmo.metc_details }}
{% get_verbose_field_name "proposals" "wmo" "metc_institution" %}{{ wmo.metc_institution }}
{% get_verbose_field_name "proposals" "wmo" "is_medical" %}{{ wmo.get_is_medical_display }}
+ {% include wmo %} - {% if wmo.status != wmo.NO_WMO %} -

{% trans "Aanmelding bij de METC" %}

- - - - - - - - {% if wmo.metc_decision_pdf and not proposal.is_practice %} - - - - {% else %} - - - - - {% endif %} -
{% get_verbose_field_name "proposals" "wmo" "metc_application" %}{{ wmo.metc_application|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "wmo" "metc_decision" %}{{ wmo.metc_decision|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "wmo" "metc_decision_pdf" %}{% trans "Download" %}
{% get_verbose_field_name "proposals" "wmo" "metc_decision_pdf" %}{% trans "Niet aangeleverd" %}
- {% endif %} - {% endwith %} + {% if metc %} + {% include metc %} + {% endif %} -

{% trans "Eén of meerdere trajecten?" %}

- - - - - {% if not proposal.studies_similar %} - - - - {% endif %} -
{% get_verbose_field_name "proposals" "proposal" "studies_similar" %}{{ proposal.studies_similar|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "studies_number" %}{{ proposal.studies_number }}
+ {% include trajectories %} {% if proposal.wmo.status == proposal.wmo.NO_WMO %} {% for study in proposal.study_set.all %} diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py index a018005db..9f490713f 100644 --- a/proposals/utils/pdf_diff_logic.py +++ b/proposals/utils/pdf_diff_logic.py @@ -12,32 +12,53 @@ from proposals.templatetags.proposal_filters import needs_details, medical_traits, \ necessity_required, has_adults +from ..models import Relation + +'''NOTE: The current implementation does not account for page break formatting, present +in the previous pdf template''' + class PDFSection: section_title = None row_fields = None - def __init__(self, object): + def __init__(self, object, object_2 = None): self.object = object - # Create a copy of the class level row_fields, such that we can safely manipulate it without changing the class value - self._row_fields = copy(self.row_fields) + self.object_2 = object_2 def render(self, context): context = context.flatten() - template = get_template("proposals/pdf/table_with_header.html") + if self.object_2: + template = get_template("proposals/pdf/diff_table_with_header.html") + else: + template = get_template("proposals/pdf/table_with_header.html") context.update( { "section_title": self.section_title, - "rows": self.get_rows(), + "rows": self.make_rows(), } ) return template.render(context) - - def get_rows(self): - rows = [RowClass(self.object, field) for field in self._row_fields] + def make_rows(self): + if self.object_2: + row_fields_1 = self.get_row_fields(self.object) + row_fields_2 = self.get_row_fields(self.object_2) + + row_fields_both = list(set(row_fields_1) | set(row_fields_2)) + + #The merging above messes with the order, so I reorder it here + ordered_row_fields = [row for row in self.row_fields if row in row_fields_both] + + rows = [RowClass(self.object, field, self.object_2) for field in ordered_row_fields] + else: + row_fields = self.get_row_fields(self.object) + rows = [RowClass(self.object, field) for field in row_fields] return rows + + def get_row_fields(self): + return self.row_fields def get_study_title(self, study): if study.name: @@ -115,6 +136,125 @@ def get_task_title(self, task): ) return task_title +class RowClass: + + verbose_name_diff_field_dict = { + 'get_metc_display': 'metc', + 'get_is_medical_display': 'is_medical' + } + + def __init__(self, object, field, object_2 = None): + self.object = object + self.object_2 = object_2 + self.field = field + + def verbose_name(self): + if self.field in self.verbose_name_diff_field_dict: + verbose_name_field = self.verbose_name_diff_field_dict[self.field] + verbose_name = self.get_verbose_name(verbose_name_field) + else: + verbose_name= self.get_verbose_name(self.field) + return verbose_name + + def value(self): + return RowValueClass(self.object, self.field).render() + + def value_2(self): + return RowValueClass(self.object_2, self.field).render() + + def get_verbose_name(self, field): + if field != 'tasks_duration': + return mark_safe(self.object._meta.get_field(field).verbose_name) + else: + return mark_safe(self.object._meta.get_field(field).verbose_name % self.object.net_duration()) + +class RowValueClass: + + def __init__(self, object, field): + + self.object = object + self.field = field + + def render(self): + + value = getattr(self.object, self.field) + + User = get_user_model() + + if value in ('Y', 'N', '?'): + return self.yes_no_doubt(value) + if type(value) in (str, int, date): + return value + elif value is None: + return _('Onbekend') + elif type(value) == bool: + return _('Ja') if value else _('Nee') + elif type(value) == User: + return self.handle_user(value) + elif type(value) == Relation: + return value.description + elif value.__class__.__name__ == 'ManyRelatedManager': + if value.all().model == User: + return self.get_applicants_names(value) + else: + return self.get_object_list(value) + elif value.__class__.__name__ == 'FieldFile': + return self.handle_field_file(value, self.object) + elif callable(value): + return value() + + def handle_user(self, user): + return user.get_full_name() + + def get_applicants_names(self, applicants): + applicant_names = [applicant.get_full_name() for applicant in applicants.all()] + return self.create_unordered_html_list(applicant_names) + + def get_object_list(self, object): + list_of_objects = [obj for obj in object.all()] + return self.create_unordered_html_list(list_of_objects) + + def create_unordered_html_list(self, list): + html_output = mark_safe('
    ') + + for item in list: + html_output += format_html('{}{}{}', + mark_safe('
  • '), + item, + mark_safe('
  • ') + ) + + html_output += mark_safe('
') + + return html_output + + def handle_field_file(self, field_file, object): + from ..models import Proposal + if object == Proposal and field_file == object.wmo.metc_decision_pdf: + if object.wmo.metc_decision_pdf and not object.is_practice(): + output = format_html('{}{}{}{}{}', + mark_safe(''), + _('Download'), + mark_safe('') + ) + else: + output = _('Niet aangeleverd') + else: + output = format_html('{}{}{}{}{}', + mark_safe(''), + _('Download'), + mark_safe('') + ) + return output + + def yes_no_doubt(self, value): + from main.models import YES_NO_DOUBT + d = dict(YES_NO_DOUBT) + return d[value] class GeneralSection(PDFSection): '''This class generates the data for the general section of the PDF page.''' @@ -139,9 +279,9 @@ class GeneralSection(PDFSection): 'self_assessment', ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, object): + obj = object + rows = copy(self.row_fields) if not obj.relation.needs_supervisor: rows.remove('supervisor') @@ -163,8 +303,6 @@ def get_rows(self): if not needs_details(obj.funding.all(), 'needs_name'): rows.remove('funding_name') - rows = [RowClass(obj, field) for field in rows] - return rows class WMOSection(PDFSection): @@ -660,120 +798,3 @@ def get_rows(self): return rows -class RowClass: - - verbose_name_diff_field_dict = { - 'get_metc_display': 'metc', - 'get_is_medical_display': 'is_medical' - } - - def __init__(self, object, field): - self.object = object - self.field = field - - def verbose_name(self): - if self.field in self.verbose_name_diff_field_dict: - verbose_name_field = self.verbose_name_diff_field_dict[self.field] - verbose_name = self.get_verbose_name(verbose_name_field) - else: - verbose_name= self.get_verbose_name(self.field) - return verbose_name - - def value(self): - return RowValueClass(self.object, self.field).render() - - def get_verbose_name(self, field): - if field != 'tasks_duration': - return mark_safe(self.object._meta.get_field(field).verbose_name) - else: - return mark_safe(self.object._meta.get_field(field).verbose_name % self.object.net_duration()) - -class RowValueClass: - - def __init__(self, object, field): - - self.object = object - self.field = field - - def render(self): - from ..models import Funding, Relation - - - value = getattr(self.object, self.field) - - User = get_user_model() - - if value in ('Y', 'N', '?'): - return self.yes_no_doubt(value) - if type(value) in (str, int, date): - return value - elif value is None: - return _('Onbekend') - elif type(value) == bool: - return _('Ja') if value else _('Nee') - elif type(value) == User: - return self.handle_user(value) - elif type(value) == Relation: - return value.description - elif value.__class__.__name__ == 'ManyRelatedManager': - if value.all().model == User: - return self.get_applicants_names(value) - else: - return self.get_object_list(value) - elif value.__class__.__name__ == 'FieldFile': - return self.handle_field_file(value, self.object) - elif callable(value): - return value() - - def handle_user(self, user): - return user.get_full_name() - - def get_applicants_names(self, applicants): - applicant_names = [applicant.get_full_name() for applicant in applicants.all()] - return self.create_unordered_html_list(applicant_names) - - def get_object_list(self, object): - list_of_objects = [obj for obj in object.all()] - return self.create_unordered_html_list(list_of_objects) - - def create_unordered_html_list(self, list): - html_output = mark_safe('
    ') - - for item in list: - html_output += format_html('{}{}{}', - mark_safe('
  • '), - item, - mark_safe('
  • ') - ) - - html_output += mark_safe('
') - - return html_output - - def handle_field_file(self, field_file, object): - from ..models import Proposal - if object == Proposal and field_file == object.wmo.metc_decision_pdf: - if object.wmo.metc_decision_pdf and not object.is_practice(): - output = format_html('{}{}{}{}{}', - mark_safe(''), - _('Download'), - mark_safe('') - ) - else: - output = _('Niet aangeleverd') - else: - output = format_html('{}{}{}{}{}', - mark_safe(''), - _('Download'), - mark_safe('') - ) - return output - - def yes_no_doubt(self, value): - from main.models import YES_NO_DOUBT - d = dict(YES_NO_DOUBT) - return d[value] diff --git a/proposals/utils/proposal_utils.py b/proposals/utils/proposal_utils.py index 79c3bbb21..35bcc8136 100644 --- a/proposals/utils/proposal_utils.py +++ b/proposals/utils/proposal_utils.py @@ -12,7 +12,7 @@ from django.core.mail import send_mail from django.db.models import Q from django.urls import reverse -from django.template.loader import render_to_string, +from django.template.loader import render_to_string from django.utils.translation import activate, get_language, ugettext as _ from django.utils.deconstruct import deconstructible diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 4c75ceb5f..78bc1e5e2 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -12,13 +12,14 @@ from django.utils.translation import ugettext_lazy as _ from django.views import generic #from easy_pdf.views import PDFTemplateResponseMixin, PDFTemplateView -from typing import Tuple, Union +from typing import Any, Tuple, Union from main.utils import get_document_contents, get_secretary, is_secretary from main.views import AllowErrorsOnBackbuttonMixin, CreateView, DeleteView, \ UpdateView, UserAllowedMixin from observations.models import Observation from proposals.utils.validate_proposal import get_form_errors +from proposals.utils.pdf_diff_logic import * from reviews.mixins import CommitteeMixin, UsersOrGroupsAllowedMixin from reviews.utils.review_utils import start_review, start_review_pre_assessment from studies.models import Documents @@ -552,36 +553,54 @@ class ProposalAsPdf(LoginRequiredMixin, PDFTemplateResponseMixin, def get_context_data(self, **kwargs): """Adds 'BASE_URL' to template context""" context = super(ProposalAsPdf, self).get_context_data(**kwargs) - context['BASE_URL'] = settings.BASE_URL - if self.object.is_pre_approved: - self.template_name = 'proposals/proposal_pdf_pre_approved.html' - elif self.object.is_pre_assessment: - self.template_name = 'proposals/proposal_pdf_pre_assessment.html' - - documents = { - 'extra': [] - } - - for document in Documents.objects.filter(proposal=self.object).all(): - if document.study: - documents[document.study.pk] = document - else: - documents['extra'].append(document) - - context['documents'] = documents + context['general'] = GeneralSection(self.object) + context['wmo'] = WMOSection(self.object.wmo) + if self.object.wmo.status != self.object.wmo.NO_WMO: + context['metc'] = METCSection(self.object.wmo) + context['trajectories'] = TrajectoriesSection(self.object) + if self.object.wmo.status == self.object.wmo.NO_WMO: + context['studies'] = [] + for study in self.object.study_set.all(): + study_sections = [] + study_sections.append(StudySection(study)) + if study.has_intervention: + study_sections.append(InterventionSection(study.intervention)) + if study.has_observation: + study_sections.append(ObservationSection(study.observation)) + if study.has_sessions: + study_sections.append(SessionsSection(study)) + for session in study.session_set.all(): + study_sections.append(SessionSection(session)) + for task in session.task_set.all(): + study_sections.append(TaskSection(task)) + study_sections.append(TasksOverviewSection(session)) + study_sections.append(StudyOverviewSection(study)) + study_sections.append(InformedConsentFormsSection(study.documents)) + context['studies'].append(study_sections) + extra_documents = [] + for count, document in enumerate(Documents.objects.filter( + proposal = self.object, + study__isnull = True + )): + extra_documents.append(ExtraDocumentsSection(document, count+1)) + if extra_documents: + context['extra_documents'] = extra_documents + if self.object.dmp_file: + context['dmp_file'] = DMPFileSection(self.object) + context['embargo'] = EmbargoSection(self.object) return context class ProposalDifference(LoginRequiredMixin, generic.DetailView): model = Proposal - template_name = 'proposals/proposal_diff.html' + template_name = 'proposals/new_proposal_diff.html' -from proposals.utils.proposal_utils import GeneralSection, WMOSection, METCSection, \ -TrajectoriesSection, StudySection, InterventionSection, ObservationSection, SessionsSection, \ -SessionSection, TaskSection, TasksOverviewSection, StudyOverviewSection, \ -InformedConsentFormsSection, ExtraDocumentsSection, DMPFileSection, EmbargoSection \ + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['general'] = GeneralSection(self.object.parent, self.object) + return context class NewPDFViewTest(generic.TemplateView): @@ -589,16 +608,12 @@ class NewPDFViewTest(generic.TemplateView): def get_context_data(self, **kwargs): model = Proposal.objects.last() - test = GeneralSection(model) - wmo_test = WMOSection(model.wmo) - trajectories_test = TrajectoriesSection(model) context = super().get_context_data(**kwargs) - context['test'] = test - context['wmo_test'] = wmo_test + context['general'] = GeneralSection(model) + context['wmo'] = WMOSection(model.wmo) if model.wmo.status != model.wmo.NO_WMO: - metc_test = METCSection(model.wmo) - context['metc_test'] = metc_test - context['trajectories_test'] = trajectories_test + context['metc'] = METCSection(model.wmo) + context['trajectories'] = TrajectoriesSection(model) if model.wmo.status == model.wmo.NO_WMO: context['studies'] = [] for study in model.study_set.all(): From c85dfa131f5cbadc181bf01c32d01f64f5688bdc Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Sep 2023 15:59:52 +0200 Subject: [PATCH 021/148] seperate func for the sections logic + other improvements --- .../templates/proposals/pdf/new_pdf_test.html | 4 +- proposals/utils/pdf_diff_logic.py | 231 +++++++++++------- proposals/views/proposal_views.py | 37 +-- 3 files changed, 150 insertions(+), 122 deletions(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 74ed47785..917b9bc64 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -14,7 +14,7 @@ {% block content %} {% include general %} - {% comment %} {% include wmo %} + {% include wmo %} {% if metc %} {% include metc %} @@ -42,8 +42,6 @@ {% include embargo %} - {% include general %} {% endcomment %} - {% comment %} Code to copy into pdf file

{% get_verbose_field_name "proposals" "proposal" "summary" %}

diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py index 9f490713f..0f2fe96ba 100644 --- a/proposals/utils/pdf_diff_logic.py +++ b/proposals/utils/pdf_diff_logic.py @@ -12,8 +12,6 @@ from proposals.templatetags.proposal_filters import needs_details, medical_traits, \ necessity_required, has_adults -from ..models import Relation - '''NOTE: The current implementation does not account for page break formatting, present in the previous pdf template''' @@ -22,9 +20,13 @@ class PDFSection: section_title = None row_fields = None - def __init__(self, object, object_2 = None): - self.object = object - self.object_2 = object_2 + def __init__(self, object): + if type(object) == list: + self.object = object[0] + self.object_2 = object[1] + else: + self.object = object + self.object_2 = None def render(self, context): context = context.flatten() @@ -57,7 +59,7 @@ def make_rows(self): rows = [RowClass(self.object, field) for field in row_fields] return rows - def get_row_fields(self): + def get_row_fields(self, obj): return self.row_fields def get_study_title(self, study): @@ -176,6 +178,7 @@ def __init__(self, object, field): self.field = field def render(self): + from ..models import Relation value = getattr(self.object, self.field) @@ -255,6 +258,7 @@ def yes_no_doubt(self, value): from main.models import YES_NO_DOUBT d = dict(YES_NO_DOUBT) return d[value] + class GeneralSection(PDFSection): '''This class generates the data for the general section of the PDF page.''' @@ -279,8 +283,7 @@ class GeneralSection(PDFSection): 'self_assessment', ] - def get_row_fields(self, object): - obj = object + def get_row_fields(self, obj): rows = copy(self.row_fields) if not obj.relation.needs_supervisor: @@ -315,9 +318,8 @@ class WMOSection(PDFSection): 'get_is_medical_display', ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if not obj.metc == 'Y': rows.remove('metc_details') @@ -325,8 +327,6 @@ def get_rows(self): else: rows.remove('get_is_medical_display') - rows = [RowClass(obj, field) for field in rows] - return rows class METCSection(PDFSection): @@ -350,15 +350,12 @@ class TrajectoriesSection(PDFSection): 'studies_number' ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if obj.studies_similar: rows.remove('studies_number') - rows = [RowClass(obj, field) for field in rows] - return rows class StudySection(PDFSection): @@ -382,9 +379,8 @@ class StudySection(PDFSection): 'hierarchy_details', ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if not has_adults(obj): rows.remove('legally_incapable') @@ -410,8 +406,6 @@ def get_rows(self): if not obj.hierarchy: rows.remove('hierarchy_details') - rows = [RowClass(obj, field) for field in rows] - return rows def render(self, context): @@ -444,9 +438,8 @@ class InterventionSection(PDFSection): 'extra_task' ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if obj.version == 1: fields_to_remove = ['multiple_sessions', @@ -472,8 +465,6 @@ def get_rows(self): if not obj.has_controls: rows.remove('controls_description') - rows = [RowClass(obj, field) for field in rows] - return rows def render(self, context): @@ -513,9 +504,8 @@ class ObservationSection(InterventionSection): 'registrations_details' ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if obj.version == 1: to_remove_if_v1 = ['details_who', @@ -565,8 +555,6 @@ def get_rows(self): rows.remove('leader_has_coc') if not needs_details(obj.registrations.all()): rows.remove('registrations_details') - - rows = [RowClass(obj, field) for field in rows] return rows @@ -577,11 +565,10 @@ class SessionsSection(StudySection): section_title = _("Het takenonderzoek en interviews") - def get_rows(self): - - rows = [RowValueClass(self.object, 'sessions_number')] + row_fields = ['sessions_number'] - return rows + def get_row_fields(self, obj): + return self.row_fields class SessionSection(PDFSection): '''Gets passed a session object''' @@ -594,9 +581,8 @@ class SessionSection(PDFSection): 'tasks_number', ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if not needs_details(obj.setting.all()): rows.remove('setting_details') @@ -606,8 +592,6 @@ def get_rows(self): rows.remove('leader_has_coc') elif obj.supervision: rows.remove('leader_has_coc') - - rows = [RowClass(obj, field) for field in rows] return rows @@ -634,9 +618,8 @@ class TaskSection(PDFSection): 'description' ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if not needs_details(obj.registrations.all()): rows.remove('registrations_details') @@ -648,8 +631,6 @@ def get_rows(self): rows.remove('registration_kinds_details') if not obj.feedback: rows.remove('feedback_details') - - rows = [RowClass(obj, field) for field in rows] return rows @@ -696,9 +677,8 @@ class StudyOverviewSection(StudySection): 'risk_details' ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) rows_to_remove = [] for x in range(0, 7, 2): @@ -711,8 +691,6 @@ def get_rows(self): rows.remove('deception_details') elif not obj.has_sessions: rows.remove('deception') - - rows = [RowClass(obj, field) for field in rows] return rows @@ -721,27 +699,75 @@ class InformedConsentFormsSection(InterventionSection): section_title = _('Informed consent formulieren') - def get_rows(self): - obj = self.object - - rows = [] - - rows.append(RowClass(obj.proposal, 'translated_forms')) - if obj.proposal.translated_forms: - rows.append(RowClass(obj.proposal, 'translated_forms_languages')) - if not obj.proposal.is_practice() and obj.informed_consent: - rows.append(RowClass(obj, 'informed_consent')) - rows.append(RowClass(obj, 'briefing')) - if obj.study.passive_consent is not None: - rows.append(RowClass(obj.study, 'passive_consent')) - if obj.study.passive_consent: - rows.append(RowClass(obj.study, 'passive_consent_details')) - if obj.director_consent_declaration: - rows.append(RowClass(obj, 'director_consent_declaration')) - if obj.director_consent_information: - rows.append(RowClass(obj, 'director_consent_information')) - if obj.parents_information: - rows.append(RowClass(obj, 'parents_information')) + row_fields = [ + 'translated_forms', + 'translated_forms_languages', + 'informed_consent', + 'briefing', + 'passive_consent', + 'passive_consent_details', + 'director_consent_declaration', + 'director_consent_information', + 'parents_information' + ] + + def make_rows(self): + '''A few fields here need to access different objects, therefore this complex + overriding of the make_rows function ... :( ''' + + proposal_list = ['translated_forms', 'translated_forms_languages'] + study_list = ['passive_consent', 'passive_consent_details'] + if self.object_2: + row_fields_1 = self.get_row_fields(self.object) + row_fields_2 = self.get_row_fields(self.object_2) + + row_fields_both = list(set(row_fields_1) | set(row_fields_2)) + + ordered_row_fields = [row for row in self.row_fields if row in row_fields_both] + + rows = [] + + for field in ordered_row_fields: + if field in proposal_list: + rows.append(RowClass(self.object.proposal, field, self.object_2.proposal)) + if field in study_list: + rows.append(RowClass(self.object.study, field, self.object_2.study)) + else: + rows.append(RowClass(self.object, field, self.object_2)) + + else: + row_fields = self.get_row_fields(self.object) + + rows = [] + + for field in row_fields: + if field in proposal_list: + rows.append(RowClass(self.object.proposal, field)) + elif field in study_list: + rows.append(RowClass(self.object.study, field)) + else: + rows.append(RowClass(self.object, field)) + + return rows + + def get_row_fields(self, obj): + rows = copy(self.row_fields) + + if not obj.proposal.translated_forms: + rows.remove('translated_forms_languages') + if obj.proposal.is_practice() or not obj.informed_consent: + rows.remove('informed_consent') + rows.remove('briefing') + if obj.study.passive_consent is None: + rows.remove('passive_consent') + if not obj.study.passive_consent: + rows.remove('passive_consent_details') + if not obj.director_consent_declaration: + rows.remove('director_consent_declaration') + if not obj.director_consent_information: + rows.remove('director_consent_information') + if not obj.parents_information: + rows.remove('parents_information') return rows @@ -757,21 +783,19 @@ def __init__(self, object, count): super().__init__(object) self.section_title = _('Extra formulieren ') + str(count) - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if not obj.informed_consent: rows.remove('informed_consent') if not obj.briefing: rows.remove('briefing') - - rows = [RowClass(obj, field) for field in rows] return rows class DMPFileSection(PDFSection): - '''Gets passed a proposal object.''' + '''Gets passed a proposal object. + Also unnecessary I suppose. But I though why not ...''' section_title = _('Data Management Plan') @@ -787,14 +811,53 @@ class EmbargoSection(PDFSection): 'embargo_end_date' ] - def get_rows(self): - obj = self.object - rows = self._row_fields + def get_row_fields(self, obj): + rows = copy(self.row_fields) if not obj.embargo: rows.remove('embargo_end_date') - - rows = [RowClass(obj, field) for field in rows] return rows +def create_context_pdf_diff(context, model): + from studies.models import Documents + + context['general'] = GeneralSection(model) + context['wmo'] = WMOSection(model.wmo) + if model.wmo.status != model.wmo.NO_WMO: + context['metc'] = METCSection(model.wmo) + context['trajectories'] = TrajectoriesSection(model) + if model.wmo.status == model.wmo.NO_WMO: + context['studies'] = [] + for study in model.study_set.all(): + study_sections = [] + study_sections.append(StudySection(study)) + if study.has_intervention: + study_sections.append(InterventionSection(study.intervention)) + if study.has_observation: + study_sections.append(ObservationSection(study.observation)) + if study.has_sessions: + study_sections.append(SessionsSection(study)) + for session in study.session_set.all(): + study_sections.append(SessionSection(session)) + for task in session.task_set.all(): + study_sections.append(TaskSection(task)) + study_sections.append(TasksOverviewSection(session)) + study_sections.append(StudyOverviewSection(study)) + study_sections.append(InformedConsentFormsSection(study.documents)) + context['studies'].append(study_sections) + extra_documents = [] + for count, document in enumerate(Documents.objects.filter( + proposal = model, + study__isnull = True + )): + extra_documents.append(ExtraDocumentsSection(document, count+1)) + if extra_documents: + context['extra_documents'] = extra_documents + if model.dmp_file: + context['dmp_file'] = DMPFileSection(model) + context['embargo'] = EmbargoSection(model) + + return context + + diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 78bc1e5e2..c7707a36c 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -609,41 +609,8 @@ class NewPDFViewTest(generic.TemplateView): def get_context_data(self, **kwargs): model = Proposal.objects.last() context = super().get_context_data(**kwargs) - context['general'] = GeneralSection(model) - context['wmo'] = WMOSection(model.wmo) - if model.wmo.status != model.wmo.NO_WMO: - context['metc'] = METCSection(model.wmo) - context['trajectories'] = TrajectoriesSection(model) - if model.wmo.status == model.wmo.NO_WMO: - context['studies'] = [] - for study in model.study_set.all(): - study_sections = [] - study_sections.append(StudySection(study)) - if study.has_intervention: - study_sections.append(InterventionSection(study.intervention)) - if study.has_observation: - study_sections.append(ObservationSection(study.observation)) - if study.has_sessions: - study_sections.append(SessionsSection(study)) - for session in study.session_set.all(): - study_sections.append(SessionSection(session)) - for task in session.task_set.all(): - study_sections.append(TaskSection(task)) - study_sections.append(TasksOverviewSection(session)) - study_sections.append(StudyOverviewSection(study)) - study_sections.append(InformedConsentFormsSection(study.documents)) - context['studies'].append(study_sections) - extra_documents = [] - for count, document in enumerate(Documents.objects.filter( - proposal = model, - study__isnull = True - )): - extra_documents.append(ExtraDocumentsSection(document, count+1)) - if extra_documents: - context['extra_documents'] = extra_documents - if model.dmp_file: - context['dmp_file'] = DMPFileSection(model) - context['embargo'] = EmbargoSection(model) + + context = create_context_pdf_diff(context, model) return context From 51fc86a6b07043f3344f63d7e4223389a5eaf200 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Sep 2023 16:15:48 +0200 Subject: [PATCH 022/148] last commit of the day --- proposals/templates/proposals/pdf/new_pdf_test.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html index 917b9bc64..deaa433ad 100644 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ b/proposals/templates/proposals/pdf/new_pdf_test.html @@ -40,7 +40,9 @@ {% include dmp_file %} {% endif %} - {% include embargo %} + {% if embargo %} + {% include embargo %} + {% endif %} {% comment %} Code to copy into pdf file From 0577060770b7839e0cdc12a631d3dcc8c8a5f6ed Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 19 Sep 2023 17:01:25 +0200 Subject: [PATCH 023/148] Wooops. Forgot to commit a lot again ... Mainly implemented Diff --- .../templates/proposals/diff/sessions.html | 3 +- .../proposals/new_proposal_diff.html | 131 ++----- .../proposals/pdf/diff_table_with_header.html | 56 ++- .../pdf/single_object_diff_table.html | 23 ++ .../templates/proposals/proposal_pdf.html | 323 +----------------- proposals/templatetags/diff_tags.py | 11 +- proposals/utils/pdf_diff_logic.py | 214 +++++++++++- proposals/views/proposal_views.py | 53 +-- 8 files changed, 329 insertions(+), 485 deletions(-) create mode 100644 proposals/templates/proposals/pdf/single_object_diff_table.html diff --git a/proposals/templates/proposals/diff/sessions.html b/proposals/templates/proposals/diff/sessions.html index 84b1ec92c..0021a51d0 100644 --- a/proposals/templates/proposals/diff/sessions.html +++ b/proposals/templates/proposals/diff/sessions.html @@ -175,7 +175,8 @@

{% trans "Overzicht van het takenonderzoek" %}

{% trans "Revisie/amendement" %} - {% get_verbose_field_name "tasks" "session" "tasks_duration" session.net_duration %} + {% comment %} Hardcoded this, to get over an annoying error {% endcomment %} + {% get_verbose_field_name "tasks" "session" "tasks_duration" 45 %} {{ p_session.tasks_duration }} {{ session.tasks_duration }} diff --git a/proposals/templates/proposals/new_proposal_diff.html b/proposals/templates/proposals/new_proposal_diff.html index e5fee7cad..08e36f84a 100644 --- a/proposals/templates/proposals/new_proposal_diff.html +++ b/proposals/templates/proposals/new_proposal_diff.html @@ -48,76 +48,29 @@

{% trans "Overzicht van wijzigingen" %}

{% with p_proposal=proposal.parent %} {% include general %} - - {% with wmo=proposal.wmo %} - {% with p_wmo=p_proposal.wmo %} -

{% trans "Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" %}

- - - - - - - - - - - - {% if wmo.metc == 'Y' or p_wmo.metc == 'Y' %} - - - - - - - - - - - {% else %} - - - - - - {% endif %} -
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "wmo" "metc" %}{{ p_wmo.get_metc_display }}{{ wmo.get_metc_display }}
{% get_verbose_field_name "proposals" "wmo" "metc_details" %}{{ p_wmo.metc_details }}{{ wmo.metc_details }}
{% get_verbose_field_name "proposals" "wmo" "metc_institution" %}{{ p_wmo.metc_institution }}{{ wmo.metc_institution }}
{% get_verbose_field_name "proposals" "wmo" "is_medical" %}{{ p_wmo.get_is_medical_display }}{{ wmo.get_is_medical_display }}
- {% if wmo.status != wmo.NO_WMO or p_wmo.status != p_wmo.NO_WMO %} -

{% trans "Aanmelding bij de METC" %}

- - - - - - - - - - - - - - - - - - - {% if p_wmo.metc_decision_pdf %} - - {% endif %} - {% if wmo.metc_decision_pdf %} - - {% endif %} - -
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "wmo" "metc_application" %}{{ p_wmo.metc_application|yesno:_("ja,nee") }}{{ wmo.metc_application|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "wmo" "metc_decision" %}{{ p_wmo.metc_decision|yesno:_("ja,nee") }}{{ wmo.metc_decision|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "wmo" "metc_decision_pdf" %}{% trans "Download" %}{% trans "Download" %}
- {% endif %} - {% endwith %} - {% endwith %} + {% include wmo %} + + {% if metc %} + {% include metc %} + {% endif %} + + {% include trajectories %} -

{% trans "Eén of meerdere trajecten?" %}

+ {% if studies %} + {% for study in studies %} + {% for study_section in study %} + {% include study_section %} + {% endfor %} + {% endfor %} + + {% if dmp_file %} + {% include dmp_file %} + {% endif %} + + {% include embargo %} + +

{% trans "Eventuele opmerkingen" %}

@@ -125,47 +78,11 @@

{% trans "Eén of meerdere trajecten?" %}

- - - + + + - {% if not proposal.studies_similar or not p_proposal.studies_similar %} - - - - - - {% endif %}
{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "proposal" "studies_similar" %}{{ p_proposal.studies_similar|yesno:_("ja,nee") }}{{ proposal.studies_similar|yesno:_("ja,nee") }}{% get_verbose_field_name "proposals" "proposal" "comments" %}{{ p_proposal.comments }}{{ proposal.comments }}
{% get_verbose_field_name "proposals" "proposal" "studies_number" %}{{ p_proposal.studies_number }}{{ proposal.studies_number }}
- - {% if proposal.wmo.status == proposal.wmo.NO_WMO or proposal.wmo.status == proposal.wmo.JUDGED %} - {% include 'proposals/diff/study.html' %} - -

{% trans "Concept-aanmelding versturen" %}

- - - - - - - - - - - - {% if proposal.embargo or p_proposal.embargo %} - - - - - - {% endif %} - - - - - -
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "proposal" "embargo" %}{{ p_proposal.embargo|yesno:_("ja,nee") }}{{ proposal.embargo|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "embargo_end_date" %}{{ p_proposal.embargo_end_date }}{{ proposal.embargo_end_date }}
{% get_verbose_field_name "proposals" "proposal" "comments" %}{{ p_proposal.comments }}{{ proposal.comments }}
{% endif %} {% endwith %} diff --git a/proposals/templates/proposals/pdf/diff_table_with_header.html b/proposals/templates/proposals/pdf/diff_table_with_header.html index 6c7c0b787..1f1d154e9 100644 --- a/proposals/templates/proposals/pdf/diff_table_with_header.html +++ b/proposals/templates/proposals/pdf/diff_table_with_header.html @@ -1,9 +1,5 @@ -{% load i18n %} -{% load proposal_filters %} -{% load static %} -{% load uil_filters %} -{% load get_field_name %} {% load diff_tags %} +{% load i18n %} {% if section_title %}

{{ section_title }}

@@ -17,17 +13,41 @@

{{ study_title }}

{% trans "Originele aanvraag" %} {% trans "Revisie/amendement" %} -{% for row in rows %} - -{{ row.verbose_name }}{{ row.value }}{{row.value_2}} - -{% endfor %} - - -

{% trans "Algemene informatie over de aanvraag" %}

- +{% if warning and missing_object == 0 %} - - - - \ No newline at end of file + + + + + {%for row in rows|slice:"1:"%} + + + {% endfor %} +{% elif warning and missing_object == 1 %} + + + + + + {%for row in rows|slice:"1:"%} + + + {% endfor %} +{% else %} + {% for row in rows %} + + + + {% endfor %} +{% endif %} +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{{ rows.0.verbose_name }} +
+ {{ warning }} +
+
{{rows.0.value_2}}
{{row.verbose_name}}{{row.value_2}} +
{{ rows.0.verbose_name }}{{rows.0.value}} +
+ {{ warning }} +
+
{{row.verbose_name}}{{row.value}} +
{{ row.verbose_name }}{{ row.value }}{{row.value_2}}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/single_object_diff_table.html b/proposals/templates/proposals/pdf/single_object_diff_table.html new file mode 100644 index 000000000..dfbb1728b --- /dev/null +++ b/proposals/templates/proposals/pdf/single_object_diff_table.html @@ -0,0 +1,23 @@ +{% load diff_tags %} + + +{% if section_title %} +

{{ section_title }}

+{% endif %} +{% if study_title %} +

{{ study_title }}

+{% endif %} +
+ {{ warning }} +
+ + + + + +{% for row in rows %} + + + +{% endfor %} +
{{ diff_answer_header }}
{{ row.verbose_name }}{{ row.value }}
\ No newline at end of file diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index 1dbbd27b0..eed9d45bc 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -79,7 +79,9 @@

{% trans 'Indiener' %}

{% trans 'E-mail' %}{{ proposal.created_by.email }} + {% include general %} +

{% get_verbose_field_name "proposals" "proposal" "summary" %}

{{ proposal.summary|linebreaks }}

@@ -91,321 +93,30 @@

{% get_verbose_field_name "proposals" "proposal" "summary" %}

{% include trajectories %} - {% if proposal.wmo.status == proposal.wmo.NO_WMO %} - {% for study in proposal.study_set.all %} -

{% trans "De deelnemers" %}

- {% include "studies/study_title.html" %} - - - - - {% if study|has_adults %} - - - - {% if study.legally_incapable %} - - - - {% endif %} - {% endif %} - - - - {% if study.has_special_details %} - - - - {% if study.special_details.all|medical_traits %} - - - - {% if study.traits.all|needs_details %} - - - - {% endif %} - {% endif %} - {% endif %} - {% if study|necessity_required %} - - - - - - - {% endif %} - - - - {% if study.recruitment.all|needs_details %} - - - - {% endif %} - - - - {% if study.compensation.needs_details %} - - - - {% endif %} - - - - {% if study.hierarchy %} - - - - {% endif %} -
{% get_verbose_field_name "studies" "study" "age_groups" %}{{ study.age_groups.all|unordered_list }}
{% get_verbose_field_name "studies" "study" "legally_incapable" %}{{ study.legally_incapable|yesno:_("ja,nee") }}
{% get_verbose_field_name "studies" "study" "legally_incapable_details" %}{{ study.legally_incapable_details }}
{% get_verbose_field_name "studies" "study" "has_special_details" %}{{ study.has_special_details|yesno:_("ja,nee") }}
{% get_verbose_field_name "studies" "study" "special_details" %}{{ study.special_details.all|unordered_list }}
{% get_verbose_field_name "studies" "study" "traits" %}{{ study.traits.all|unordered_list }}
{% get_verbose_field_name "studies" "study" "traits_details" %}{{ study.traits_details }}
{% get_verbose_field_name "studies" "study" "necessity" %}{{ study.get_necessity_display }}
{% get_verbose_field_name "studies" "study" "necessity_reason" %}{{ study.necessity_reason }}
{% get_verbose_field_name "studies" "study" "recruitment" %}{{ study.recruitment.all|unordered_list }}
{% get_verbose_field_name "studies" "study" "recruitment_details" %}{{ study.recruitment_details }}
{% get_verbose_field_name "studies" "study" "compensation" %}{{ study.compensation }}
{% get_verbose_field_name "studies" "study" "compensation_details" %}{{ study.compensation_details }}
{% get_verbose_field_name "studies" "study" "hierarchy" %}{{ study.hierarchy|yesno:_("ja,nee") }}
{% get_verbose_field_name "studies" "study" "hierarchy_details" %}{{ study.hierarchy_details }}
- - {% if study.has_intervention %} - {% with intervention=study.intervention %} -

{% trans "Het interventieonderzoek" %}

- {% include "studies/study_title.html" %} - {% if intervention.version == 1 %} - {% include 'proposals/pdf/intervention_v1.html' %} - {% elif intervention.version == 2 %} - {% include 'proposals/pdf/intervention_v2.html' %} - {% endif %} - {% endwith %} - {% endif %} - - {% if study.has_observation %} - {% with observation=study.observation %} -

{% trans "Het observatieonderzoek" %}

- {% include "studies/study_title.html" %} - {% if observation.version == 1 %} - {% include 'proposals/pdf/observation_v1.html' %} - {% elif observation.version == 2 %} - {% include 'proposals/pdf/observation_v2.html' %} - {% endif %} - {% endwith %} - {% endif %} - - {% if study.has_sessions %} -

{% trans "Het takenonderzoek en interviews" %}

- {% include "studies/study_title.html" %} - - - - -
{% get_verbose_field_name "studies" "study" "sessions_number" %}{{ study.sessions_number }}
- - {% for session in study.session_set.all %} - {% include "tasks/session_title.html" %} - - - - - {% if session.setting.all|needs_details %} - - - - {% endif %} - {% if study.has_children and session.setting.all|needs_details:"needs_supervision" %} - - - - {% if not session.supervision %} - - - - {% endif %} - {% endif %} - - - -
{% get_verbose_field_name "tasks" "session" "setting" %}{{ session.setting.all|unordered_list }}
{% get_verbose_field_name "tasks" "session" "setting_details" %}{{ session.setting_details }}
{% get_verbose_field_name "tasks" "session" "supervision" %}{{ session.supervision|yesno:_("ja,nee") }}
{% get_verbose_field_name "tasks" "session" "leader_has_coc" %}{{ session.leader_has_coc|yesno:_("ja,nee") }}
{% get_verbose_field_name "tasks" "session" "tasks_number" %}{{ session.tasks_number }}
- {% for task in session.task_set.all %} - {% include "tasks/task_title.html" %} - - - - - - - - - - - {% if task.registrations.all|needs_details %} - - - - {% endif %} - {% if task.registrations.all|needs_details:"needs_kind" %} - - - - {% if task.registration_kinds.all|needs_details %} - - - - {% endif %} - {% endif %} - - - - {% if task.feedback %} - - - - {% endif %} -
{% get_verbose_field_name "tasks" "task" "name" %}{{ task.name }}
{% get_verbose_field_name "tasks" "task" "duration" %}{{ task.duration }}
{% get_verbose_field_name "tasks" "task" "registrations" %}{{ task.registrations.all|unordered_list }}
{% get_verbose_field_name "tasks" "task" "registrations_details" %}{{ task.registrations_details }}
{% get_verbose_field_name "tasks" "task" "registration_kinds" %}{{ task.registration_kinds.all|unordered_list }}
{% get_verbose_field_name "tasks" "task" "registration_kinds_details" %}{{ task.registration_kinds_details }}
{% get_verbose_field_name "tasks" "task" "feedback" %}{{ task.feedback|yesno:_("ja,nee") }}
{% get_verbose_field_name "tasks" "task" "feedback_details" %}{{ task.feedback_details }}
-

{% get_verbose_field_name "tasks" "task" "description" %}

-

{{ task.description|linebreaks }}

- {% endfor %} - -

{% trans "Overzicht van het takenonderzoek" %}

- - - - -
{% get_verbose_field_name "tasks" "session" "tasks_duration" session.net_duration %}{{ session.tasks_duration }}
- - {% endfor %} - {% endif %} - -

{% trans "Overzicht en eigen beoordeling van het gehele onderzoek" %}

- {% include "studies/study_title.html" %} - - {% if study.has_sessions %} - - - - {% if study.deception == 'Y' or study.deception == '?' %} - - - - {% endif %} - {% endif %} - - - - {% if study.negativity == 'Y' or study.negativity == '?' %} - - - - {% endif %} - - - - {% if study.stressful == 'Y' or study.stressful == '?' %} - - - - {% endif %} - - - - {% if study.risk == 'Y' or study.risk == '?' %} - - - - {% endif %} -
{% get_verbose_field_name "studies" "study" "deception" %}{{ study.get_deception_display }}
{% get_verbose_field_name "studies" "study" "deception_details" %}{{ study.deception_details }}
{% get_verbose_field_name "studies" "study" "negativity" %}{{ study.get_negativity_display }}
{% get_verbose_field_name "studies" "study" "negativity_details" %}{{ study.negativity_details }}
{% get_verbose_field_name "studies" "study" "stressful" %}{{ study.get_stressful_display }}
{% get_verbose_field_name "studies" "study" "stressful_details" %}{{ study.stressful_details }}
{% get_verbose_field_name "studies" "study" "risk" %}{{ study.get_risk_display }}
{% get_verbose_field_name "studies" "study" "risk_details" %}{{ study.risk_details }}
- -

{% trans "Informed consent formulieren" %}

- {% include "studies/study_title.html" %} - {% get_study_documents study_documents study %} - - - - - {% if proposal.translated_forms %} - - - - {% endif %} - {% if not proposal.is_practice and study_documents.informed_consent %} - - - - - - - {% endif %} - {% if study.passive_consent is not None %} - - - - {% if study.passive_consent %} - - - - {% endif %} - {% endif %} - {% if study_documents.director_consent_declaration %} - - - - {% endif %} - {% if study_documents.director_consent_information %} - - - - {% endif %} - {% if study_documents.parents_information %} - - - - {% endif %} -
{% get_verbose_field_name "proposals" "proposal" "translated_forms" %}{{ proposal.translated_forms|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "translated_forms_languages" %}{{ proposal.translated_forms_languages }}
{% get_verbose_field_name "studies" "documents" "informed_consent" %}{% trans "Download" %}
{% get_verbose_field_name "studies" "documents" "briefing" %}{% trans "Download" %}
{% get_verbose_field_name "studies" "study" "passive_consent" %}{{ study.passive_consent|yesno:_("ja,nee") }}
{% get_verbose_field_name "studies" "study" "passive_consent_details" %}{{ study.passive_consent_details }}
{% get_verbose_field_name "studies" "documents" "director_consent_declaration" %}{% trans "Download" %}
{% get_verbose_field_name "studies" "documents" "director_consent_information" %}{% trans "Download" %}
{% get_verbose_field_name "studies" "documents" "parents_information" %}{% trans "Download" %}
+ {% if studies %} + {% for study in studies %} + {% for study_section in study %} + {% include study_section %} + {% endfor %} {% endfor %} - {% if documents.extra %} - {% counter extra_form_counter create 1 %} - {% for extra_documents in documents.extra %} -

{% trans 'Extra formulieren' %} {% counter extra_form_counter value %}

- {% counter extra_form_counter increment 1 %} - - {% if extra_documents.informed_consent %} - - - - {% endif %} - {% if extra_documents.briefing %} - - - - {% endif %} -
{% get_verbose_field_name "studies" "documents" "informed_consent" %}{% trans "Download" %}
{% get_verbose_field_name "studies" "documents" "briefing" %}{% trans "Download" %}
- {{ extra_form_counter.increment }} + {% if extra_documents %} + {% for document in extra_documents %} + {% include document %} {% endfor %} {% endif %} - {% if proposal.dmp_file %} -

{% trans "Data Management Plan" %}

- - - - - -
- {% get_verbose_field_name "proposals" "proposal" "dmp_file" %} - - - {% trans "Download" %} - -
+ + {% if dmp_file %} + {% include dmp_file %} {% endif %} -

{% trans "Aanmelding versturen" %}

- - - - - {%if proposal.embargo %} - - - - {% endif %} -
{% get_verbose_field_name "proposals" "proposal" "embargo" %}{{ proposal.embargo|yesno:_("ja,nee") }}
{% get_verbose_field_name "proposals" "proposal" "embargo_end_date" %}{{ proposal.date_start|default:_("onbekend") }}
+ + {% include embargo %} +

{% get_verbose_field_name "proposals" "proposal" "comments" %}

{{ proposal.comments }}

+ {% endif %} diff --git a/proposals/templatetags/diff_tags.py b/proposals/templatetags/diff_tags.py index 30ea8da32..c283f3b21 100644 --- a/proposals/templatetags/diff_tags.py +++ b/proposals/templatetags/diff_tags.py @@ -10,8 +10,15 @@ def zip_equalize_lists(a, b): A zip implementation which will not stop when reaching the end of the smallest list, but will append None's to the smaller list to fill the gap """ - a = list(a) - b = list(b) + try: + a = list(a) + except TypeError: + a = [a] + try: + b = list(b) + except TypeError: + b = [b] + a_len = len(a) b_len = len(b) diff = abs(a_len - b_len) diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py index 0f2fe96ba..61ac43969 100644 --- a/proposals/utils/pdf_diff_logic.py +++ b/proposals/utils/pdf_diff_logic.py @@ -21,7 +21,7 @@ class PDFSection: row_fields = None def __init__(self, object): - if type(object) == list: + if type(object) == tuple: self.object = object[0] self.object_2 = object[1] else: @@ -50,9 +50,10 @@ def make_rows(self): row_fields_both = list(set(row_fields_1) | set(row_fields_2)) #The merging above messes with the order, so I reorder it here - ordered_row_fields = [row for row in self.row_fields if row in row_fields_both] + row_fields = [row for row in self.row_fields if row in row_fields_both] + - rows = [RowClass(self.object, field, self.object_2) for field in ordered_row_fields] + rows = [RowClass(self.object, field, self.object_2) for field in row_fields] else: row_fields = self.get_row_fields(self.object) @@ -416,6 +417,59 @@ def render(self, context): } ) return super().render(context) + +class DiffSectionPossibleMissingObjects(PDFSection): + '''This exists for instances of tables in the diff, where it is possible + for objects to be entirely missing from one version or the other. + Mostly used for studies and sub-sections of studies''' + + def __init__(self, objects_list): + '''The None object always needs to become object_2.''' + if objects_list[0] is None: + self.warning = _( + "Dit onderdeel is nieuw in de revisie en bestond niet in de originele aanvraag." + ) + self.missing_object = 0 + elif objects_list[1] is None: + self.warning = _( + "Dit onderdeel bestond in de originele aanvraag, maar niet meer in de revisie." + ) + self.missing_object = 1 + else: + self.warning = None + self.missing_object = None + self.object = objects_list[0] + self.object_2 = objects_list[1] + + def render(self, context): + context = context.flatten() + template = get_template("proposals/pdf/diff_table_with_header.html") + + if self.warning and self.missing_object: + context.update( + { + "warning": self.warning, + "missing_object": self.missing_object + } + ) + context.update( + { + "section_title": self.section_title, + "rows": self.make_rows(), + } + ) + return template.render(context) + +class StudySectionDiff(DiffSectionPossibleMissingObjects, StudySection): + + def render(self,context): + if self.object.proposal.studies_number > 1: + context.update( + { + 'study_title': super().get_study_title(self.object) + } + ) + return super().render(context) class InterventionSection(PDFSection): '''This class will receive a intervention object''' @@ -476,6 +530,17 @@ def render(self, context): ) return super().render(context) +class InterventionSectionDiff(DiffSectionPossibleMissingObjects, InterventionSection): + + def render(self, context): + if self.object.study.proposal.studies_number > 1: + context.update( + { + 'study_title': super().get_study_title(self.object.study) + } + ) + return super().render(context) + class ObservationSection(InterventionSection): '''Gets passed an observation object''' section_title = _('Het observatieonderzoek') @@ -557,8 +622,11 @@ def get_row_fields(self, obj): rows.remove('registrations_details') return rows + +class ObservationSectionDiff(InterventionSectionDiff, ObservationSection): + pass -class SessionsSection(StudySection): +class SessionsOverviewSection(StudySection): '''Gets passed a study object This Section looks maybe a bit unnecessary, but it does remove some logic, plus the study_title.html from the template.''' @@ -567,9 +635,11 @@ class SessionsSection(StudySection): row_fields = ['sessions_number'] +class SessionsSectionDiff(StudySectionDiff, SessionsOverviewSection): + def get_row_fields(self, obj): return self.row_fields - + class SessionSection(PDFSection): '''Gets passed a session object''' @@ -602,6 +672,16 @@ def render(self, context): } ) return super().render(context) + +class SessionSectionDiff(DiffSectionPossibleMissingObjects, SessionSection): + + def render(self, context): + context.update( + { + 'study_title': super().get_session_title(self.object) + } + ) + return super().render(context) class TaskSection(PDFSection): '''Gets passed a task object''' @@ -642,6 +722,16 @@ def render(self, context): ) return super().render(context) +class TaskSectionDiff(DiffSectionPossibleMissingObjects, TaskSection): + + def render(self, context): + context.update( + { + 'study_title': super().get_task_title(self.object) + } + ) + return super().render(context) + class TasksOverviewSection(PDFSection): '''Gets passed a session object This might be unecessary ... Maybe just use the existing template language ... @@ -653,8 +743,16 @@ class TasksOverviewSection(PDFSection): ] def render(self, context): - '''Here I am just overriding the render function, to get the correct formatting - The naming is a bit confusing, might fix later''' + context.update( + { + 'study_title': _('Overzicht van het takenonderzoek') + } + ) + return super().render(context) + +class TasksOverviewSectionDiff(DiffSectionPossibleMissingObjects, TaskSection): + + def render(self, context): context.update( { 'study_title': _('Overzicht van het takenonderzoek') @@ -693,6 +791,9 @@ def get_row_fields(self, obj): rows.remove('deception') return rows + +class StudyOverviewSectionDiff(StudySectionDiff, StudyOverviewSection): + pass class InformedConsentFormsSection(InterventionSection): '''Receives a Documents object''' @@ -714,7 +815,6 @@ class InformedConsentFormsSection(InterventionSection): def make_rows(self): '''A few fields here need to access different objects, therefore this complex overriding of the make_rows function ... :( ''' - proposal_list = ['translated_forms', 'translated_forms_languages'] study_list = ['passive_consent', 'passive_consent_details'] if self.object_2: @@ -730,7 +830,7 @@ def make_rows(self): for field in ordered_row_fields: if field in proposal_list: rows.append(RowClass(self.object.proposal, field, self.object_2.proposal)) - if field in study_list: + elif field in study_list: rows.append(RowClass(self.object.study, field, self.object_2.study)) else: rows.append(RowClass(self.object, field, self.object_2)) @@ -771,6 +871,9 @@ def get_row_fields(self, obj): return rows +class InformedConsentSectionDiff(InterventionSectionDiff, InformedConsentFormsSection): + pass + class ExtraDocumentsSection(PDFSection): '''gets a documents object''' @@ -818,17 +921,25 @@ def get_row_fields(self, obj): rows.remove('embargo_end_date') return rows - -def create_context_pdf_diff(context, model): + +def get_extra_documents(object): + pass + +def create_context_pdf(context, model): from studies.models import Documents context['general'] = GeneralSection(model) context['wmo'] = WMOSection(model.wmo) + if model.wmo.status != model.wmo.NO_WMO: context['metc'] = METCSection(model.wmo) + context['trajectories'] = TrajectoriesSection(model) + if model.wmo.status == model.wmo.NO_WMO: + context['studies'] = [] + for study in model.study_set.all(): study_sections = [] study_sections.append(StudySection(study)) @@ -837,7 +948,7 @@ def create_context_pdf_diff(context, model): if study.has_observation: study_sections.append(ObservationSection(study.observation)) if study.has_sessions: - study_sections.append(SessionsSection(study)) + study_sections.append(SessionsOverviewSection(study)) for session in study.session_set.all(): study_sections.append(SessionSection(session)) for task in session.task_set.all(): @@ -846,18 +957,97 @@ def create_context_pdf_diff(context, model): study_sections.append(StudyOverviewSection(study)) study_sections.append(InformedConsentFormsSection(study.documents)) context['studies'].append(study_sections) + extra_documents = [] + for count, document in enumerate(Documents.objects.filter( proposal = model, study__isnull = True )): extra_documents.append(ExtraDocumentsSection(document, count+1)) + if extra_documents: context['extra_documents'] = extra_documents if model.dmp_file: context['dmp_file'] = DMPFileSection(model) + context['embargo'] = EmbargoSection(model) return context + +from proposals.templatetags.diff_tags import zip_equalize_lists + +def create_context_diff(context, models): + p_proposal = models[0] + proposal = models[1] + + context['general'] = GeneralSection(models) + context['wmo'] = WMOSection((p_proposal.wmo, proposal.wmo)) + + if proposal.wmo.status != proposal.wmo.NO_WMO or p_proposal.wmo.status != p_proposal.wmo.NO_WMO: + context['metc'] = METCSection((p_proposal.wmo, proposal.wmo)) + + context['trajectories'] = TrajectoriesSection(models) + + if proposal.wmo.status == proposal.wmo.NO_WMO or proposal.wmo.status == proposal.wmo.JUDGED: + + context['studies'] = [] + + for diff_studies in zip_equalize_lists(p_proposal.study_set.all(), proposal.study_set.all()): + + p_study = diff_studies[0] + study = diff_studies[1] + + study_sections = [] + study_sections.append(StudySectionDiff((diff_studies))) + + if p_study is not None and p_study.has_intervention or \ + study is not None and study.has_intervention: + interventions = tuple((study.intervention if study is not None \ + else study for study in diff_studies)) + study_sections.append(InterventionSectionDiff(interventions)) + if p_study is not None and p_study.has_observation or \ + study is not None and study.has_observation: + observations = tuple((study.observation if study is not None \ + else study for study in diff_studies)) + study_sections.append(ObservationSectionDiff(observations)) + if p_study is not None and p_study.has_sessions or \ + study is not None and study.has_sessions: + study_sections.append(SessionsSectionDiff(diff_studies)) + p_sessions_set, sessions_set = tuple((study.session_set.all() if study is not None \ + else study for study in diff_studies)) + for diff_sessions in zip_equalize_lists(p_sessions_set, sessions_set): + p_sessions = diff_sessions[0] + sessions = diff_sessions[1] + study_sections.append(SessionSectionDiff(diff_sessions)) + p_tasks_set, tasks_set = tuple((session.task_set.all() if session is not None \ + else session for session in diff_sessions)) + for diff_tasks in zip_equalize_lists(p_tasks_set, tasks_set): + study_sections.append(TaskSectionDiff(diff_tasks)) + study_sections.append(TasksOverviewSection(diff_sessions)) + study_sections.append(StudyOverviewSectionDiff(diff_studies)) + documents = tuple(study.documents if study is not None \ + else study for study in diff_studies) + study_sections.append(InformedConsentSectionDiff(documents)) + context['studies'].append(study_sections) + + extra_documents = [] + + # for count, document in enumerate(Documents.objects.filter( + # proposal = models, + # study__isnull = True + # )): + # extra_documents.append(ExtraDocumentsSection(document, count+1)) + + # if extra_documents: + # context['extra_documents'] = extra_documents + if p_proposal.dmp_file or proposal.dmp_file: + context['dmp_file'] = DMPFileSection(models) + + context['embargo'] = EmbargoSection(models) + + return context + + diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index c7707a36c..7760a9dc0 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -552,43 +552,9 @@ class ProposalAsPdf(LoginRequiredMixin, PDFTemplateResponseMixin, def get_context_data(self, **kwargs): """Adds 'BASE_URL' to template context""" - context = super(ProposalAsPdf, self).get_context_data(**kwargs) - - context['general'] = GeneralSection(self.object) - context['wmo'] = WMOSection(self.object.wmo) - if self.object.wmo.status != self.object.wmo.NO_WMO: - context['metc'] = METCSection(self.object.wmo) - context['trajectories'] = TrajectoriesSection(self.object) - if self.object.wmo.status == self.object.wmo.NO_WMO: - context['studies'] = [] - for study in self.object.study_set.all(): - study_sections = [] - study_sections.append(StudySection(study)) - if study.has_intervention: - study_sections.append(InterventionSection(study.intervention)) - if study.has_observation: - study_sections.append(ObservationSection(study.observation)) - if study.has_sessions: - study_sections.append(SessionsSection(study)) - for session in study.session_set.all(): - study_sections.append(SessionSection(session)) - for task in session.task_set.all(): - study_sections.append(TaskSection(task)) - study_sections.append(TasksOverviewSection(session)) - study_sections.append(StudyOverviewSection(study)) - study_sections.append(InformedConsentFormsSection(study.documents)) - context['studies'].append(study_sections) - extra_documents = [] - for count, document in enumerate(Documents.objects.filter( - proposal = self.object, - study__isnull = True - )): - extra_documents.append(ExtraDocumentsSection(document, count+1)) - if extra_documents: - context['extra_documents'] = extra_documents - if self.object.dmp_file: - context['dmp_file'] = DMPFileSection(self.object) - context['embargo'] = EmbargoSection(self.object) + context = super().get_context_data(**kwargs) + + context = create_context_pdf(context, self.object) return context @@ -599,8 +565,17 @@ class ProposalDifference(LoginRequiredMixin, generic.DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) - context['general'] = GeneralSection(self.object.parent, self.object) + + context = create_context_diff(context, (self.object.parent, self.object)) + return context + + +# class ProposalDifference(LoginRequiredMixin, generic.DetailView): +# model = Proposal +# template_name = 'proposals/proposal_diff.html' + + class NewPDFViewTest(generic.TemplateView): @@ -610,7 +585,7 @@ def get_context_data(self, **kwargs): model = Proposal.objects.last() context = super().get_context_data(**kwargs) - context = create_context_pdf_diff(context, model) + context = create_context_pdf(context, model) return context From cffbf66566083402937ec1a41918f9246f684589 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 20 Sep 2023 16:14:47 +0200 Subject: [PATCH 024/148] Extra documents and documentation --- .../proposals/diff_table_with_header.html | 53 ++++ .../proposals/new_proposal_diff.html | 55 ++-- .../proposals/pdf/diff_table_with_header.html | 4 +- .../proposals/table_with_header.html | 13 + proposals/utils/pdf_diff_logic.py | 268 +++++++++++------- proposals/views/proposal_views.py | 22 -- 6 files changed, 271 insertions(+), 144 deletions(-) create mode 100644 proposals/templates/proposals/diff_table_with_header.html create mode 100644 proposals/templates/proposals/table_with_header.html diff --git a/proposals/templates/proposals/diff_table_with_header.html b/proposals/templates/proposals/diff_table_with_header.html new file mode 100644 index 000000000..46bcbea30 --- /dev/null +++ b/proposals/templates/proposals/diff_table_with_header.html @@ -0,0 +1,53 @@ +{% load diff_tags %} +{% load i18n %} + +{% if section_title %} +

{{ section_title }}

+{% endif %} +{% if study_title %} +

{{ study_title }}

+{% endif %} + + + + + + +{% if warning and missing_object == 0 %} + + + + + + {%for row in rows|slice:"1:"%} + + + {% endfor %} +{% elif warning and missing_object == 1 %} + + + + + + {%for row in rows|slice:"1:"%} + + + {% endfor %} +{% else %} + {% for row in rows %} + + + + {% endfor %} +{% endif %} +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{{ rows.0.verbose_name }} +
+ {{ warning }} +
+
{{rows.0.value}}
{{row.verbose_name}}{{row.value}} +
{{ rows.0.verbose_name }}{{rows.0.value}} +
+ {{ warning }} +
+
{{row.verbose_name}}{{row.value}} +
{{ row.verbose_name }}{{ row.value }}{{row.value_2}}
\ No newline at end of file diff --git a/proposals/templates/proposals/new_proposal_diff.html b/proposals/templates/proposals/new_proposal_diff.html index 08e36f84a..f7d1a3e15 100644 --- a/proposals/templates/proposals/new_proposal_diff.html +++ b/proposals/templates/proposals/new_proposal_diff.html @@ -45,7 +45,6 @@

{% trans "Overzicht van wijzigingen" %}

- {% with p_proposal=proposal.parent %} {% include general %} @@ -58,33 +57,39 @@

{% trans "Overzicht van wijzigingen" %}

{% include trajectories %} {% if studies %} - {% for study in studies %} - {% for study_section in study %} - {% include study_section %} - {% endfor %} - {% endfor %} + {% for study in studies %} + {% for study_section in study %} + {% include study_section %} + {% endfor %} + {% endfor %} - {% if dmp_file %} - {% include dmp_file %} - {% endif %} + {% if extra_documents %} + {% for document in extra_documents %} + {% include document %} + {% endfor %} + {% endif %} + + {% if dmp_file %} + {% include dmp_file %} + {% endif %} + + {% include embargo %} - {% include embargo %} - -

{% trans "Eventuele opmerkingen" %}

- - - - - - - - - - - -
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "proposal" "comments" %}{{ p_proposal.comments }}{{ proposal.comments }}
+ +

{% trans "Eventuele opmerkingen" %}

+ + + + + + + + + + + +
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{% get_verbose_field_name "proposals" "proposal" "comments" %}{{ p_proposal.comments }}{{ proposal.comments }}
{% endif %} - {% endwith %}

-

- - - -{% endblock %} diff --git a/proposals/templates/proposals/pdf/diff_table_with_header.html b/proposals/templates/proposals/pdf/diff_table_with_header.html deleted file mode 100644 index 46bcbea30..000000000 --- a/proposals/templates/proposals/pdf/diff_table_with_header.html +++ /dev/null @@ -1,53 +0,0 @@ -{% load diff_tags %} -{% load i18n %} - -{% if section_title %} -

{{ section_title }}

-{% endif %} -{% if study_title %} -

{{ study_title }}

-{% endif %} - - - - - - -{% if warning and missing_object == 0 %} - - - - - - {%for row in rows|slice:"1:"%} - - - {% endfor %} -{% elif warning and missing_object == 1 %} - - - - - - {%for row in rows|slice:"1:"%} - - - {% endfor %} -{% else %} - {% for row in rows %} - - - - {% endfor %} -{% endif %} -
{% trans "Originele aanvraag" %}{% trans "Revisie/amendement" %}
{{ rows.0.verbose_name }} -
- {{ warning }} -
-
{{rows.0.value}}
{{row.verbose_name}}{{row.value}} -
{{ rows.0.verbose_name }}{{rows.0.value}} -
- {{ warning }} -
-
{{row.verbose_name}}{{row.value}} -
{{ row.verbose_name }}{{ row.value }}{{row.value_2}}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/intervention_v1.html b/proposals/templates/proposals/pdf/intervention_v1.html deleted file mode 100644 index 462672fe3..000000000 --- a/proposals/templates/proposals/pdf/intervention_v1.html +++ /dev/null @@ -1,50 +0,0 @@ -{% load i18n %} -{% load proposal_filters %} -{% load get_field_name %} - - - - - - {% if intervention.setting.all|needs_details %} - - - - {% endif %} - {% if study.has_children and intervention.setting.all|needs_details:"needs_supervision" %} - - - - {% if not intervention.supervision %} - - - - {% endif %} - {% endif %} - - - - - - - - - - - - - - - - - - - - - - {% if intervention.has_controls %} - - - - {% endif %} -
{% get_verbose_field_name "interventions" "intervention" "setting" %}{{ intervention.setting.all|unordered_list }}
{% get_verbose_field_name "interventions" "intervention" "setting_details" %}{{ intervention.setting_details }}
{% get_verbose_field_name "interventions" "intervention" "supervision" %}{{ intervention.supervision|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "leader_has_coc" %}{{ intervention.leader_has_coc|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "period" %}{{ intervention.period }}
{% get_verbose_field_name "interventions" "intervention" "amount_per_week" %}{{ intervention.amount_per_week }}
{% get_verbose_field_name "interventions" "intervention" "duration" %}{{ intervention.duration }}
{% get_verbose_field_name "interventions" "intervention" "measurement" %}{{ intervention.measurement }}
{% get_verbose_field_name "interventions" "intervention" "experimenter" %}{{ intervention.experimenter }}
{% get_verbose_field_name "interventions" "intervention" "description" %}{{ intervention.description }}
{% get_verbose_field_name "interventions" "intervention" "has_controls" %}{{ intervention.has_controls|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "controls_description" %}{{ intervention.controls_description }}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/intervention_v2.html b/proposals/templates/proposals/pdf/intervention_v2.html deleted file mode 100644 index d5552ab83..000000000 --- a/proposals/templates/proposals/pdf/intervention_v2.html +++ /dev/null @@ -1,60 +0,0 @@ -{% load i18n %} -{% load proposal_filters %} -{% load get_field_name %} - - - - - - {% if intervention.setting.all|needs_details %} - - - - {% endif %} - {% if study.has_children and intervention.setting.all|needs_details:"needs_supervision" %} - - - - {% if not intervention.supervision %} - - - - {% endif %} - {% endif %} - - - - - - - {% if intervention.multiple_sessions %} - - - - {% endif %} - - - - - - - - - - - - - - - - {% if intervention.has_controls %} - - - - {% endif %} - {% if not intervention.settings_contains_schools %} - - - - {% endif %} -
{% get_verbose_field_name "interventions" "intervention" "setting" %}{{ intervention.setting.all|unordered_list }}
{% get_verbose_field_name "interventions" "intervention" "setting_details" %}{{ intervention.setting_details }}
{% get_verbose_field_name "interventions" "intervention" "supervision" %}{{ intervention.supervision|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "leader_has_coc" %}{{ intervention.leader_has_coc|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "period" %}{{ intervention.period }}
{% get_verbose_field_name "interventions" "intervention" "multiple_sessions" %}{{ intervention.multiple_sessions|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "session_frequency" %}{{ intervention.session_frequency }}
{% get_verbose_field_name "interventions" "intervention" "duration" %}{{ intervention.duration }}
{% get_verbose_field_name "interventions" "intervention" "measurement" %}{{ intervention.measurement }}
{% get_verbose_field_name "interventions" "intervention" "experimenter" %}{{ intervention.experimenter }}
{% get_verbose_field_name "interventions" "intervention" "description" %}{{ intervention.description }}
{% get_verbose_field_name "interventions" "intervention" "has_controls" %}{{ intervention.has_controls|yesno:_("ja,nee") }}
{% get_verbose_field_name "interventions" "intervention" "controls_description" %}{{ intervention.controls_description }}
{% get_verbose_field_name "interventions" "intervention" "extra_task" %}{{ intervention.extra_task|yesno:_("ja,nee") }}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/new_pdf_test.html b/proposals/templates/proposals/pdf/new_pdf_test.html deleted file mode 100644 index deaa433ad..000000000 --- a/proposals/templates/proposals/pdf/new_pdf_test.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends "base/base.html" %} - -{% load static %} -{% load proposal_filters %} -{% load fetc_filters %} -{% load i18n %} -{% load compare_tags %} -{% load uil_filters %} - -{% block header_title %} - New PDF test -{% endblock %} - -{% block content %} - - {% include general %} - {% include wmo %} - - {% if metc %} - {% include metc %} - {% endif %} - - {% include trajectories %} - - {% if studies %} - {% for study in studies %} - {% for study_section in study %} - {% include study_section %} - {% endfor %} - {% endfor %} - {% endif %} - - {% if extra_documents %} - {% for document in extra_documents %} - {% include document %} - {% endfor %} - {% endif %} - - {% if dmp_file %} - {% include dmp_file %} - {% endif %} - - {% if embargo %} - {% include embargo %} - {% endif %} - - {% comment %} Code to copy into pdf file - -

{% get_verbose_field_name "proposals" "proposal" "summary" %}

-

{{ proposal.summary|linebreaks }}

- - {% include wmo %} - - {% if metc %} - {% include metc %} - {% endif %} - - {% include trajectories %} - - {% if studies %} - {% for study in studies %} - {% for study_section in study %} - {% include study_section %} - {% endfor %} - {% endfor %} - {% endif %} - - {% if dmp_file %} - {% include dmp_file %} - {% endif %} - - {% if dmp_file %} - {% include dmp_file %} - {% endif %} - - {% include embargo %} - -

{% get_verbose_field_name "proposals" "proposal" "comments" %}

-

- {{ proposal.comments }} -

{% endcomment %} - -{% endblock %} \ No newline at end of file diff --git a/proposals/templates/proposals/pdf/observation_v1.html b/proposals/templates/proposals/pdf/observation_v1.html deleted file mode 100644 index b1eaca1bb..000000000 --- a/proposals/templates/proposals/pdf/observation_v1.html +++ /dev/null @@ -1,65 +0,0 @@ -{% load i18n %} -{% load proposal_filters %} -{% load get_field_name %} - - - - - - {% if observation.setting.all|needs_details %} - - - - {% endif %} - {% if study.has_children and observation.setting.all|needs_details:"needs_supervision" %} - - - - {% if not observation.supervision %} - - - - {% endif %} - {% endif %} - - - - - - - - - - - - - - - - {% if observation.is_nonpublic_space %} - - - - {% endif %} - - - - {% if observation.needs_approval %} - - - - {% if not proposal.is_practice %} - - - - {% endif %} - {% endif %} - - - - {% if observation.registrations.all|needs_details %} - - - - {% endif %} -
{% get_verbose_field_name "observations" "observation" "setting" %}{{ observation.setting.all|unordered_list }}
{% get_verbose_field_name "observations" "observation" "setting_details" %}{{ observation.setting_details }}
{% get_verbose_field_name "observations" "observation" "supervision" %}{{ observation.supervision|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "leader_has_coc" %}{{ observation.leader_has_coc|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "days" %}{{ observation.days }}
{% get_verbose_field_name "observations" "observation" "mean_hours" %}{{ observation.mean_hours }}
{% get_verbose_field_name "observations" "observation" "is_anonymous" %}{{ observation.is_anonymous|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "is_in_target_group" %}{{ observation.is_in_target_group|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "is_nonpublic_space" %}{{ observation.is_nonpublic_space|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "has_advanced_consent" %}{{ observation.has_advanced_consent|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "needs_approval" %}{{ observation.needs_approval|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "approval_institution" %}{{ observation.approval_institution }}
{% get_verbose_field_name "observations" "observation" "approval_document" %}{% trans "Download" %}
{% get_verbose_field_name "observations" "observation" "registrations" %}{{ observation.registrations.all|unordered_list }}
{% get_verbose_field_name "observations" "observation" "registrations_details" %}{{ observation.registrations_details }}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/observation_v2.html b/proposals/templates/proposals/pdf/observation_v2.html deleted file mode 100644 index ab49cc4bd..000000000 --- a/proposals/templates/proposals/pdf/observation_v2.html +++ /dev/null @@ -1,83 +0,0 @@ -{% load i18n %} -{% load proposal_filters %} -{% load get_field_name %} - - - - - - {% if observation.setting.all|needs_details %} - - - - {% endif %} - {% if study.has_children and observation.setting.all|needs_details:"needs_supervision" %} - - - - {% if not observation.supervision %} - - - - {% endif %} - {% endif %} - - - - - - - - - - - - - {% if observation.is_anonymous %} - - - - {% endif %} - - - - {% if observation.is_in_target_group %} - - - - {% endif %} - - - - {% if observation.is_nonpublic_space %} - - - - - - - {% if not observation.has_advanced_consent %} - - - - {% endif %} - {% endif %} - {% if observation.setting.all|needs_details:"is_school" %} - - - - {% endif %} - {% if observation.needs_approval %} - - - - {% endif %} - - - - {% if observation.registrations.all|needs_details %} - - - - {% endif %} -
{% get_verbose_field_name "observations" "observation" "setting" %}{{ observation.setting.all|unordered_list }}
{% get_verbose_field_name "observations" "observation" "setting_details" %}{{ observation.setting_details }}
{% get_verbose_field_name "observations" "observation" "supervision" %}{{ observation.supervision|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "leader_has_coc" %}{{ observation.leader_has_coc|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "details_who"|safe %}{{ observation.details_who }}
{% get_verbose_field_name "observations" "observation" "details_why"|safe %}{{ observation.details_why }}
{% get_verbose_field_name "observations" "observation" "details_frequency"|safe %}{{ observation.details_frequency }}
{% get_verbose_field_name "observations" "observation" "is_anonymous" %}{{ observation.is_anonymous|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "is_anonymous_details" %}{{ observation.is_anonymous_details }}
{% get_verbose_field_name "observations" "observation" "is_in_target_group" %}{{ observation.is_in_target_group|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "is_in_target_group_details" %}{{ observation.is_in_target_group_details }}
{% get_verbose_field_name "observations" "observation" "is_nonpublic_space" %}{{ observation.is_nonpublic_space|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "is_nonpublic_space_details" %}{{ observation.is_nonpublic_space_details }}
{% get_verbose_field_name "observations" "observation" "has_advanced_consent" %}{{ observation.has_advanced_consent|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "has_advanced_consent_details" %}{{ observation.has_advanced_consent_details }}
{% get_verbose_field_name "observations" "observation" "needs_approval" %}{{ observation.needs_approval|yesno:_("ja,nee") }}
{% get_verbose_field_name "observations" "observation" "approval_institution" %}{{ observation.approval_institution }}
{% get_verbose_field_name "observations" "observation" "registrations" %}{{ observation.registrations.all|unordered_list }}
{% get_verbose_field_name "observations" "observation" "registrations_details" %}{{ observation.registrations_details }}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/single_object_diff_table.html b/proposals/templates/proposals/pdf/single_object_diff_table.html deleted file mode 100644 index dfbb1728b..000000000 --- a/proposals/templates/proposals/pdf/single_object_diff_table.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load diff_tags %} - - -{% if section_title %} -

{{ section_title }}

-{% endif %} -{% if study_title %} -

{{ study_title }}

-{% endif %} -
- {{ warning }} -
- - - - - -{% for row in rows %} - - - -{% endfor %} -
{{ diff_answer_header }}
{{ row.verbose_name }}{{ row.value }}
\ No newline at end of file diff --git a/proposals/templates/proposals/pdf/table_with_header.html b/proposals/templates/proposals/pdf/table_with_header.html deleted file mode 100644 index 6b491d820..000000000 --- a/proposals/templates/proposals/pdf/table_with_header.html +++ /dev/null @@ -1,13 +0,0 @@ -{% if section_title %} -

{{ section_title }}

-{% endif %} -{% if study_title %} -

{{ study_title }}

-{% endif %} - -{% for row in rows %} - - - -{% endfor %} -
{{ row.verbose_name }}{{ row.value }}
\ No newline at end of file diff --git a/proposals/templates/proposals/proposal_diff.html b/proposals/templates/proposals/proposal_diff.html index 10927ac2b..d994b8249 100644 --- a/proposals/templates/proposals/proposal_diff.html +++ b/proposals/templates/proposals/proposal_diff.html @@ -14,6 +14,10 @@ {% block html_head %} From 7ecb51507f199e7d8695b3102acf0893a3d1a78a Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 10 Nov 2023 15:16:20 +0100 Subject: [PATCH 071/148] refactor: remove feedback module Fixes #430 Okay not really a refactor, but honestly none of the other tags really fit --- faqs/menus.py | 4 -- feedback/__init__.py | 0 feedback/admin.py | 10 ----- feedback/forms.py | 12 ------ feedback/migrations/0001_initial.py | 28 ------------- feedback/migrations/__init__.py | 0 feedback/models.py | 27 ------------- .../templates/feedback/feedback_form.html | 30 -------------- .../templates/feedback/feedback_list.html | 39 ------------------- .../templates/feedback/feedback_thanks.html | 23 ----------- feedback/tests.py | 3 -- feedback/urls.py | 11 ------ feedback/views.py | 39 ------------------- fetc/settings.py | 1 - fetc/urls.py | 1 - main/templates/main/index.html | 3 -- 16 files changed, 231 deletions(-) delete mode 100644 feedback/__init__.py delete mode 100644 feedback/admin.py delete mode 100644 feedback/forms.py delete mode 100644 feedback/migrations/0001_initial.py delete mode 100644 feedback/migrations/__init__.py delete mode 100644 feedback/models.py delete mode 100644 feedback/templates/feedback/feedback_form.html delete mode 100644 feedback/templates/feedback/feedback_list.html delete mode 100644 feedback/templates/feedback/feedback_thanks.html delete mode 100644 feedback/tests.py delete mode 100644 feedback/urls.py delete mode 100644 feedback/views.py diff --git a/faqs/menus.py b/faqs/menus.py index aa4f4845a..e412824ba 100644 --- a/faqs/menus.py +++ b/faqs/menus.py @@ -21,10 +21,6 @@ MenuItem( _("FAQs"), reverse("faqs:list"), - ), - MenuItem( - _("Feedback"), - reverse("feedback:create"), ) ) diff --git a/feedback/__init__.py b/feedback/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/feedback/admin.py b/feedback/admin.py deleted file mode 100644 index e783a64ce..000000000 --- a/feedback/admin.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib import admin - -from .models import Feedback - - -@admin.register(Feedback) -class FeedbackAdmin(admin.ModelAdmin): - fields = ('url', 'comment', 'submitter', 'priority', 'status') - list_display = ['url', 'comment', 'submitter', 'date_created'] - list_filter = ('priority', 'status') diff --git a/feedback/forms.py b/feedback/forms.py deleted file mode 100644 index dc2cdae54..000000000 --- a/feedback/forms.py +++ /dev/null @@ -1,12 +0,0 @@ -from django import forms - -from .models import Feedback - - -class FeedbackForm(forms.ModelForm): - class Meta: - model = Feedback - fields = ['url', 'comment'] - widgets = { - 'url': forms.HiddenInput(), - } diff --git a/feedback/migrations/0001_initial.py b/feedback/migrations/0001_initial.py deleted file mode 100644 index d178ddff9..000000000 --- a/feedback/migrations/0001_initial.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models -from django.conf import settings - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Feedback', - fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('url', models.URLField()), - ('comment', models.TextField(verbose_name='Feedback')), - ('priority', models.IntegerField(default=1, choices=[(1, 'Laag'), (2, 'Gemiddeld'), (3, 'Hoog')])), - ('status', models.IntegerField(default=1, choices=[(1, 'Open'), (2, 'Opgepakt'), (3, 'Afgehandeld')])), - ('date_created', models.DateTimeField(auto_now_add=True)), - ('date_modified', models.DateField(auto_now=True)), - ('submitter', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), - ], - ), - ] diff --git a/feedback/migrations/__init__.py b/feedback/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/feedback/models.py b/feedback/models.py deleted file mode 100644 index b168b09c9..000000000 --- a/feedback/models.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.db import models -from django.conf import settings -from django.utils.translation import ugettext_lazy as _ - -STATUS_CODES = ( - (1, _('Open')), - (2, _('Opgepakt')), - (3, _('Afgehandeld')), -) - -PRIORITY_CODES = ( - (1, _('Laag')), - (2, _('Gemiddeld')), - (3, _('Hoog')), -) - - -class Feedback(models.Model): - url = models.URLField() - comment = models.TextField(_('Feedback')) - priority = models.IntegerField(default=1, choices=PRIORITY_CODES) - status = models.IntegerField(default=1, choices=STATUS_CODES) - - date_created = models.DateTimeField(auto_now_add=True) - date_modified = models.DateField(auto_now=True) - - submitter = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) diff --git a/feedback/templates/feedback/feedback_form.html b/feedback/templates/feedback/feedback_form.html deleted file mode 100644 index 2a0d9584d..000000000 --- a/feedback/templates/feedback/feedback_form.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends "base/base.html" %} - -{% load static %} -{% load i18n %} - -{% block header_title %} - {% trans "Feedback versturen" %} - {{ block.super }} -{% endblock %} - -{% block content %} -
-
-

- {% trans "Feedback versturen" %} -

-

- {% trans "Hier kan je feedback achterlaten op het FETC-GW portal." %} -

-
{% csrf_token %} - {{ form.as_table }}
-

- - {% trans "Terug naar de vorige pagina" %} - - -

-
-
-
-{% endblock %} diff --git a/feedback/templates/feedback/feedback_list.html b/feedback/templates/feedback/feedback_list.html deleted file mode 100644 index 2f1947499..000000000 --- a/feedback/templates/feedback/feedback_list.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "base/base.html" %} - -{% load static %} -{% load i18n %} -{% load datatables %} - -{% block header_title %} - {% trans "Feedbackoverzicht" %} - {{ block.super }} -{% endblock %} - -{% block content %} -
-
-

- {% trans "Feedbackoverzicht" %} -

- - - - - - - - - - - {% for feedback in feedback_list %} - - - - - - - {% endfor %} - -
{% trans "Toegevoegd op" %}{% trans "URL" %}{% trans "Feedback" %}{% trans "Gegeven door" %}
{{ feedback.date_created|date:"j M Y, G:i" }}{{ feedback.url }}{{ feedback.comment }}{{ feedback.submitter.get_full_name }}
-
-
-{% endblock %} diff --git a/feedback/templates/feedback/feedback_thanks.html b/feedback/templates/feedback/feedback_thanks.html deleted file mode 100644 index fd9c0e0a3..000000000 --- a/feedback/templates/feedback/feedback_thanks.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "base/base.html" %} - -{% load static %} -{% load i18n %} - -{% block header_title %} - {% trans "Bedankt voor je feedback!" %} - {{ block.super }} -{% endblock %} - -{% block content %} -
-
-

- {% trans "Bedankt voor je feedback!" %} -

-

- {% blocktrans with url=feedback.url %} - Klik hier om terug te keren naar pagina waar je gebleven was. - {% endblocktrans %} -

-
-
-{% endblock %} diff --git a/feedback/tests.py b/feedback/tests.py deleted file mode 100644 index 7ce503c2d..000000000 --- a/feedback/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/feedback/urls.py b/feedback/urls.py deleted file mode 100644 index 7bccea3aa..000000000 --- a/feedback/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path - -from .views import FeedbackCreate, FeedbackListing, FeedbackThanks - -app_name = 'feedback' - -urlpatterns = [ - path('', FeedbackListing.as_view(), name='overview'), - path('create/', FeedbackCreate.as_view(), name='create'), - path('thanks//', FeedbackThanks.as_view(), name='thanks'), -] diff --git a/feedback/views.py b/feedback/views.py deleted file mode 100644 index 675b02c05..000000000 --- a/feedback/views.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.contrib.messages.views import SuccessMessageMixin -from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ -from django.views import generic - -from braces.views import LoginRequiredMixin - -from .forms import FeedbackForm -from .models import Feedback - - -class FeedbackCreate(LoginRequiredMixin, SuccessMessageMixin, generic.CreateView): - model = Feedback - form_class = FeedbackForm - success_message = _('Feedback verstuurd') - - def get_initial(self): - """Sets URL to the referrer and submitter to current User""" - initial = super(FeedbackCreate, self).get_initial() - initial['url'] = self.request.META.get('HTTP_REFERER') - return initial - - def form_valid(self, form): - """Sets submitter to current User""" - form.instance.submitter = self.request.user - return super(FeedbackCreate, self).form_valid(form) - - def get_success_url(self): - """Redirect to thank-you page""" - return reverse('feedback:thanks', args=(self.object.pk,)) - - -class FeedbackThanks(LoginRequiredMixin, generic.DetailView): - model = Feedback - template_name = 'feedback/feedback_thanks.html' - - -class FeedbackListing(LoginRequiredMixin, generic.ListView): - model = Feedback diff --git a/fetc/settings.py b/fetc/settings.py index 45697d112..3bf40c16d 100644 --- a/fetc/settings.py +++ b/fetc/settings.py @@ -50,7 +50,6 @@ 'interventions', 'observations', 'reviews', - 'feedback', 'faqs', 'modeltranslation', diff --git a/fetc/urls.py b/fetc/urls.py index 09b9285ed..aad85bf04 100644 --- a/fetc/urls.py +++ b/fetc/urls.py @@ -35,7 +35,6 @@ path('observations/', include('observations.urls')), path('interventions/', include('interventions.urls')), path('reviews/', include('reviews.urls')), - path('feedback/', include('feedback.urls')), path('faqs/', include('faqs.urls')), path('admin/', admin.site.urls), diff --git a/main/templates/main/index.html b/main/templates/main/index.html index 768af10c6..7744adbeb 100644 --- a/main/templates/main/index.html +++ b/main/templates/main/index.html @@ -211,9 +211,6 @@
  • {% trans "Veelgestelde vragen m.b.t. dit portal" %}
  • -
  • - {% trans "Feedback op dit portal geven" %} -
  • From 20c2e98687fb32dcdee39a9c2b478a9a07e2b346 Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 10 Nov 2023 15:23:48 +0100 Subject: [PATCH 072/148] feat: include submitter in other applicants mail Fixes #554 --- .../mail/concept_other_applicants.html | 4 ++-- .../mail/concept_other_applicants.txt | 4 ++-- .../submitted_longroute_other_applicants.html | 8 ++++---- .../submitted_longroute_other_applicants.txt | 8 ++++---- ...submitted_shortroute_other_applicants.html | 8 ++++---- .../submitted_shortroute_other_applicants.txt | 8 ++++---- reviews/utils/review_utils.py | 20 +++++++++++++++---- 7 files changed, 36 insertions(+), 24 deletions(-) diff --git a/reviews/templates/mail/concept_other_applicants.html b/reviews/templates/mail/concept_other_applicants.html index 5cc6b946e..ffe711064 100644 --- a/reviews/templates/mail/concept_other_applicants.html +++ b/reviews/templates/mail/concept_other_applicants.html @@ -3,7 +3,7 @@ {% block content_nl %} Beste collega,

    -Uw collega {{ creator }} heeft een concept-aanmelding ingediend bij de ethische commissie voor het onderzoek {{ title }}, waar u aan meewerkt.
    +Uw collega {{ creator }} (cc) heeft een concept-aanmelding ingediend bij de ethische commissie voor het onderzoek {{ title }}, waar u aan meewerkt.
    De aanmelding wordt door de eindverantwoordelijk onderzoeker {{ supervisor }} van deze aanvraag gecontroleerd. Zodra deze de concept-aanmelding, evt. na kleine aanpassingen, heeft goedgekeurd en ter toetsing bij de FETC-GW heeft ingediend, krijgt uw collega {{ creator }} van ons bericht.
    Indien de concept-aanmelding nog aanzienlijke wijzigingen uwerzijds behoeft zal de eindverantwoordelijk onderzoeker zelf contact met uw collega opnemen.
    @@ -14,7 +14,7 @@ {% block content_en %} Dear colleague,

    -Your colleague {{ creator }} has submitted a draft application to the ethics commision for the study {{ title }}, in which you are participating. +Your colleague {{ creator }} (cc) has submitted a draft application to the ethics commission for the study {{ title }}, in which you are participating. The application will be checked by the study's supervisor {{ supervisor }}, the researcher who has the final responsibility of this study.
    Your colleague {{ creator }} will receive a notification as soon as {{ supervisor }} has approved and formally submitted your draft application, possibly after making some minor revisions.
    In case {{ supervisor }} finds it necessary for you to make more substantial revisions in the application, he/she will notify your colleague about this, and meanwhile formally disapprove the study in order for you to be able to revise and resubmit it.
    diff --git a/reviews/templates/mail/concept_other_applicants.txt b/reviews/templates/mail/concept_other_applicants.txt index c40d5a63c..cf23ed1b2 100644 --- a/reviews/templates/mail/concept_other_applicants.txt +++ b/reviews/templates/mail/concept_other_applicants.txt @@ -3,7 +3,7 @@ {% block content_nl %} Beste collega, -Uw collega {{ creator }} heeft een concept-aanmelding ingediend bij de ethische commissie voor het onderzoek {{ title }}, waar u aan meewerkt. +Uw collega {{ creator }} (cc) heeft een concept-aanmelding ingediend bij de ethische commissie voor het onderzoek {{ title }}, waar u aan meewerkt. De aanmelding wordt door de eindverantwoordelijk onderzoeker {{ supervisor }} van deze aanvraag gecontroleerd. Zodra deze de concept-aanmelding, evt. na kleine aanpassingen, heeft goedgekeurd en ter toetsing bij de FETC-GW heeft ingediend, krijgt uw collega {{ creator }} van ons bericht. Indien de concept-aanmelding nog aanzienlijke wijzigingen uwerzijds behoeft zal de eindverantwoordelijk onderzoeker zelf contact met uw collega opnemen. @@ -14,7 +14,7 @@ U kunt de ingediende aanmelding hier in PDF vorm bekijken: {% block content_en %} Dear colleague, -Your colleague {{ creator }} has submitted a draft application to the ethics commision for the study {{ title }}, in which you are participating. +Your colleague {{ creator }} (cc) has submitted a draft application to the ethics commission for the study {{ title }}, in which you are participating. The application will be checked by the study's supervisor {{ supervisor }}, the researcher who has the final responsibility of this study. Your colleague {{ creator }} will receive a notification as soon as {{ supervisor }} has approved and formally submitted your draft application, possibly after making some minor revisions. In case {{ supervisor }} finds it necessary for you to make more substantial revisions in the application, he/she will notify your colleague about this, and meanwhile formally disapprove the study in order for you to be able to revise and resubmit it. diff --git a/reviews/templates/mail/submitted_longroute_other_applicants.html b/reviews/templates/mail/submitted_longroute_other_applicants.html index b8f87b052..a2a06cb17 100644 --- a/reviews/templates/mail/submitted_longroute_other_applicants.html +++ b/reviews/templates/mail/submitted_longroute_other_applicants.html @@ -4,14 +4,14 @@ {% if was_revised %} Beste collega,

    -Uw collega {{ creator }} heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen.
    +Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen.

    Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen.
    U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    {% else %} Beste collega,

    -Uw collega {{ creator }} heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status lange-route onderzoek, zie appendix A van het reglement voor de criteria.
    +Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status lange-route onderzoek, zie appendix A van het reglement voor de criteria.

    Dit houdt in dat je aanvraag op de eerstvolgende vergadering van de FETC-GW zal worden besproken, wanneer je aanvraag tenminste een week voor die vergadering is ingediend. Zie de FETC-GW-agenda voor een overzicht van de komende vergaderingen. Kort na de vergadering zal {{ creator }} de beoordeling ontvangen.
    U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    @@ -22,14 +22,14 @@ {% if was_revised %} Dear colleague,

    -Your colleague {{ creator }} has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your application.
    +Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your application.

    This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send your colleague {{ creator }} a review soon.
    You can find a PDF of your submission here.
    {% else %} Dear colleague,

    -Your colleague {{ creator }} has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria.
    +Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria.

    This means that your study will be discussed during the next FEtC-H meeting, if your application was submitted at least one week before that meeting. See the FEtC-H agenda for an overview of upcoming meetings. {{ creator }} will receive the assessment shortly after the meeting.
    You can find a PDF of your submission here.
    diff --git a/reviews/templates/mail/submitted_longroute_other_applicants.txt b/reviews/templates/mail/submitted_longroute_other_applicants.txt index 1e5026c1b..371b6b471 100644 --- a/reviews/templates/mail/submitted_longroute_other_applicants.txt +++ b/reviews/templates/mail/submitted_longroute_other_applicants.txt @@ -4,7 +4,7 @@ {% if was_revised %} Beste collega, -Uw collega {{ creator }} heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. +Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen. U kunt de ingediende aanmelding hier in PDF vorm bekijken: @@ -12,7 +12,7 @@ U kunt de ingediende aanmelding hier in PDF vorm bekijken: {% else %} Beste collega, -Uw collega {{ creator }} heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status 'lange-route onderzoek', zie appendix A van het reglement voor de criteria (https://fetc-gw.wp.hum.uu.nl/reglement-fetc-gw/). +Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status 'lange-route onderzoek', zie appendix A van het reglement voor de criteria (https://fetc-gw.wp.hum.uu.nl/reglement-fetc-gw/). Dit houdt in dat je aanvraag op de eerstvolgende vergadering van de FETC-GW zal worden besproken, wanneer je aanvraag tenminste een week voor die vergadering is ingediend. Zie de FETC-GW-agenda (https://fetc-gw.wp.hum.uu.nl/reglement-fetc-gw/) voor een overzicht van de komende vergaderingen. Kort na de vergadering zal {{ creator }} de beoordeling ontvangen. U kunt de ingediende aanmelding hier in PDF vorm bekijken: @@ -24,7 +24,7 @@ U kunt de ingediende aanmelding hier in PDF vorm bekijken: {% if was_revised %} Dear colleague, -Your colleague {{ creator }} has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. +Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send your colleague {{ creator }} a review soon. You can find a PDF file of your submission here: @@ -32,7 +32,7 @@ You can find a PDF file of your submission here: {% else %} Dear colleague, -Your colleague {{ creator }} has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria (https://fetc-gw.wp.hum.uu.nl/en/regulations-fetc-h/). +Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria (https://fetc-gw.wp.hum.uu.nl/en/regulations-fetc-h/). This means that your study will be discussed during the next FEtC-H meeting, if your application was submitted at least one week before that meeting. See the FEtC-H agenda (https://fetc-gw.wp.hum.uu.nl/en/category/agenda-en/) for an overview of upcoming meetings. {{ creator }} will receive the assessment shortly after the meeting. You can find a PDF file of your submission here: diff --git a/reviews/templates/mail/submitted_shortroute_other_applicants.html b/reviews/templates/mail/submitted_shortroute_other_applicants.html index 0ff83a5c1..86e8c69d9 100644 --- a/reviews/templates/mail/submitted_shortroute_other_applicants.html +++ b/reviews/templates/mail/submitted_shortroute_other_applicants.html @@ -4,14 +4,14 @@ {% if was_revised %} Beste collega,

    -Uw collega {{ creator }} heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen.
    +Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen.

    Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen.
    U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    {% else %} Beste collega,

    -Uw collega {{ creator }} heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status korte-route onderzoek gekregen.
    +Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status korte-route onderzoek gekregen.

    Dit houdt in dat wij ernaar streven om uw collega binnen twee werkweken een eerste beoordeling van de FETC-GW te sturen.
    U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    @@ -24,14 +24,14 @@ {% if was_revised %} Dear colleague,

    -Your colleague {{ creator }} has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your revised application.
    +Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your revised application.

    This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon.
    You can find a PDF of your submission here.
    {% else %} Dear colleague,

    -Your colleague {{ creator }} has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of short-route research. This means that your colleague will receive an assessment within two working weeks.
    +Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of short-route research. This means that your colleague will receive an assessment within two working weeks.
    You can find a PDF of your submission here.

    Note: It is possible that your application may still be classified as a 'long-route research', in which case the asssessment procedure may take longer, see the regulations for information. If the latter case, see section 2.8, p. 14 for the possible time paths.
    diff --git a/reviews/templates/mail/submitted_shortroute_other_applicants.txt b/reviews/templates/mail/submitted_shortroute_other_applicants.txt index d7d3d5683..5bb882d67 100644 --- a/reviews/templates/mail/submitted_shortroute_other_applicants.txt +++ b/reviews/templates/mail/submitted_shortroute_other_applicants.txt @@ -4,7 +4,7 @@ {% if was_revised %} Beste collega, -Uw collega {{ creator }} heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. +Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen. U kunt de ingediende aanmelding hier in PDF vorm bekijken: @@ -12,7 +12,7 @@ U kunt de ingediende aanmelding hier in PDF vorm bekijken: {% else %} Beste collega, -Uw collega {{ creator }} heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status 'korte-route onderzoek' gekregen. +Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status 'korte-route onderzoek' gekregen. Dit houdt in dat wij ernaar streven om uw collega binnen twee werkweken een eerste beoordeling van de FETC-GW te sturen. U kunt de ingediende aanmelding hier in PDF vorm bekijken: @@ -26,7 +26,7 @@ NB: Het is mogelijk dat de aanvraag alsnog als 'lange-route onderzoek' wordt aan {% if was_revised %} Dear colleague, -Your colleague {{ creator }} has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your revised application. +Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your revised application. This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send your colleague {{ creator }} a review soon. You can find a PDF file of your submission here: @@ -34,7 +34,7 @@ You can find a PDF file of your submission here: {% else %} Dear colleague, -Your colleague {{ creator }} has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of 'short-route research'. +Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of 'short-route research'. This means that we aim to send your colleague an initial assessment of the FETC-GW within two working weeks. You can find a PDF file of your submission here: diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index 772ed176f..dbf9c8da9 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -67,8 +67,15 @@ def start_supervisor_phase(proposal): params['creator'] = proposal.created_by.get_full_name() msg_plain = render_to_string('mail/concept_other_applicants.txt', params) msg_html = render_to_string('mail/concept_other_applicants.html', params) - applicants_to_remove = [proposal.created_by, proposal.supervisor] + + # Note: the original applicant gets the email as well as primary + # recipient + # They should be regarded as CC'd, but the currently used mail API + # doesn't support that. When moving to cdh.core mailing this should + # be corrected + applicants_to_remove = [proposal.supervisor] other_applicants_emails = [applicant.email for applicant in proposal.applicants.all() if applicant not in applicants_to_remove] + send_mail(subject, msg_plain, settings.EMAIL_FROM, other_applicants_emails, html_message=msg_html) subject = _('FETC-GW {}: beoordelen als eindverantwoordelijke'.format(reference)) @@ -147,10 +154,15 @@ def start_assignment_phase(proposal): else: msg_plain = render_to_string('mail/submitted_longroute_other_applicants.txt', params) msg_html = render_to_string('mail/submitted_longroute_other_applicants.html', params) - applicants_to_remove = [proposal.created_by] - other_applicants_emails = [applicant.email for applicant in proposal.applicants.all() if applicant not in applicants_to_remove] - send_mail(subject, msg_plain, settings.EMAIL_FROM, other_applicants_emails, html_message=msg_html) + # Note: the original applicant gets the email as well as primary + # recipient + # They should be regarded as CC'd, but the currently used mail API + # doesn't support that. When moving to cdh.core mailing this should + # be corrected + applicants_emails = [applicant.email for applicant in + proposal.applicants.all()] + send_mail(subject, msg_plain, settings.EMAIL_FROM, applicants_emails, html_message=msg_html) if proposal.inform_local_staff: notify_local_staff(proposal) From 9bae35b766d5af34003c262428d6658f71dd526d Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 10 Nov 2023 15:24:51 +0100 Subject: [PATCH 073/148] fix: remove E-prime from fixture Fixes #549 --- tasks/fixtures/registrations.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/fixtures/registrations.json b/tasks/fixtures/registrations.json index 7acbf8c3d..6d796ae4b 100644 --- a/tasks/fixtures/registrations.json +++ b/tasks/fixtures/registrations.json @@ -49,9 +49,9 @@ "pk": 4, "fields": { "order": 4, - "description": "gedrags- en/of reactietijd-registratie via experimentsoftware zoals jsPsych, Zep, Presentation, E-prime, etc", - "description_nl": "gedrags- en/of reactietijd-registratie via experimentsoftware zoals jsPsych, Zep, Presentation, E-prime, etc", - "description_en": "behavioral- and/or reaction time registration using experiment software such as jsPsych, Zep, Presentation, E-prime, etc.", + "description": "gedrags- en/of reactietijd-registratie via experimentsoftware zoals jsPsych, Zep, Presentation, etc", + "description_nl": "gedrags- en/of reactietijd-registratie via experimentsoftware zoals jsPsych, Zep, Presentation, etc", + "description_en": "behavioral- and/or reaction time registration using experiment software such as jsPsych, Zep, Presentation, etc.", "is_local": true, "needs_details": false, "needs_kind": false, From 6364f3151a75755f31050076873c3167dbed330c Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 10 Nov 2023 15:29:29 +0100 Subject: [PATCH 074/148] feature: add help text for other_applicants Fixes #550 --- locale/en/LC_MESSAGES/django.mo | Bin 148888 -> 147284 bytes locale/en/LC_MESSAGES/django.po | 810 +++++++++++++++----------------- proposals/models.py | 9 + 3 files changed, 395 insertions(+), 424 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 7f7aaf9ee8ba9bd0b2971da546689db7d244d140..d1d22016cf74818ef34ce87791e257ab18dba617 100644 GIT binary patch delta 19169 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 H&-woViL%Z} diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 705dc97c8..37add6149 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -2,12 +2,11 @@ # Copyright (C) 2016 # This file is distributed under the same license as the fetc-h package. # Martijn van der Klis , 2016. -#, fuzzy msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-07 10:34+0100\n" +"POT-Creation-Date: 2023-11-10 15:28+0100\n" "PO-Revision-Date: 2023-11-07 10:36+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -18,8 +17,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.1\n" -#: faqs/menus.py:7 main/templates/base/menu.html:125 -#: main/templates/main/index.html:201 +#: faqs/menus.py:7 main/templates/main/index.html:201 msgid "FETC-GW website" msgstr "FEtC-H website" @@ -36,8 +34,7 @@ msgstr "Regulations FEtC-H" msgid "https://fetc-gw.wp.hum.uu.nl/reglement-fetc-gw/" msgstr "https://fetc-gw.wp.hum.uu.nl/en/regulations-fetc-h/" -#: faqs/menus.py:17 main/templates/base/menu.html:134 -#: main/templates/main/index.html:209 +#: faqs/menus.py:17 main/templates/main/index.html:209 #: proposals/templates/proposals/study_consent.html:8 #: proposals/templates/proposals/translated_consent_forms.html:7 #: proposals/utils/pdf_diff_logic.py:859 @@ -50,17 +47,11 @@ msgstr "" "https://intranet.uu.nl/en/knowledgebase/documents-ethics-assessment-" "committee-humanities" -#: faqs/menus.py:22 main/templates/base/menu.html:137 +#: faqs/menus.py:22 msgid "FAQs" msgstr "FAQs" -#: faqs/menus.py:26 feedback/models.py:20 -#: feedback/templates/feedback/feedback_list.html:22 -#: main/templates/base/menu.html:140 -msgid "Feedback" -msgstr "Feedback" - -#: faqs/menus.py:31 main/templates/base/menu.html:122 +#: faqs/menus.py:27 msgid "Help" msgstr "Help" @@ -72,97 +63,11 @@ msgstr "FAQ" msgid "Frequently Asked Questions" msgstr "Frequently Asked Questions" -#: feedback/models.py:6 -msgid "Open" -msgstr "Open" - -#: feedback/models.py:7 -msgid "Opgepakt" -msgstr "In progress" - -#: feedback/models.py:8 -msgid "Afgehandeld" -msgstr "Processed" - -#: feedback/models.py:12 -msgid "Laag" -msgstr "Low" - -#: feedback/models.py:13 -msgid "Gemiddeld" -msgstr "Average" - -#: feedback/models.py:14 -msgid "Hoog" -msgstr "High" - -#: feedback/templates/feedback/feedback_form.html:7 -#: feedback/templates/feedback/feedback_form.html:14 -#: feedback/templates/feedback/feedback_form.html:25 -msgid "Feedback versturen" -msgstr "Send feedback" - -#: feedback/templates/feedback/feedback_form.html:17 -msgid "Hier kan je feedback achterlaten op het FETC-GW portal." -msgstr "You can leave feedback on the FEtC-H portal here." - -#: feedback/templates/feedback/feedback_form.html:23 -#: observations/templates/observations/observation_update_attachments.html:39 -#: proposals/templates/proposals/proposal_confirmation.html:36 -#: proposals/templates/proposals/proposal_diff.html:58 -#: proposals/templates/proposals/proposal_update_attachments.html:26 -#: reviews/templates/reviews/change_chamber_form.html:19 -#: reviews/templates/reviews/decision_form.html:90 -#: reviews/templates/reviews/review_assign_form.html:46 -#: reviews/templates/reviews/review_close_form.html:41 -#: reviews/templates/reviews/review_discontinue_form.html:72 -#: studies/templates/studies/study_update_attachments.html:26 -msgid "Terug naar de vorige pagina" -msgstr "Back to the previous page" - -#: feedback/templates/feedback/feedback_list.html:8 -#: feedback/templates/feedback/feedback_list.html:15 -msgid "Feedbackoverzicht" -msgstr "Feedback overview" - -#: feedback/templates/feedback/feedback_list.html:20 -msgid "Toegevoegd op" -msgstr "Added on" - -#: feedback/templates/feedback/feedback_list.html:21 -msgid "URL" -msgstr "URL" - -#: feedback/templates/feedback/feedback_list.html:23 -msgid "Gegeven door" -msgstr "Given by" - -#: feedback/templates/feedback/feedback_thanks.html:7 -#: feedback/templates/feedback/feedback_thanks.html:14 -msgid "Bedankt voor je feedback!" -msgstr "Thanks for your feedback!" - -#: feedback/templates/feedback/feedback_thanks.html:17 -#, python-format -msgid "" -"\n" -" Klik hier om terug te keren naar " -"pagina waar je gebleven was.\n" -" " -msgstr "" -"\n" -"Click here to return to where you left off.\n" -" " - -#: feedback/views.py:15 -msgid "Feedback verstuurd" -msgstr "Feedback sent" - -#: fetc/settings.py:133 +#: fetc/settings.py:132 msgid "Nederlands" msgstr "Dutch" -#: fetc/settings.py:134 +#: fetc/settings.py:133 msgid "Engels" msgstr "English" @@ -282,14 +187,13 @@ msgstr "Intervention saved" #: main/forms/conditional_form.py:11 main/forms/conditional_form.py:20 #: main/forms/conditional_form.py:29 main/forms/conditional_form.py:38 #: main/forms/conditional_form.py:48 main/forms/mixins.py:83 -#: proposals/forms.py:569 proposals/forms.py:633 proposals/forms.py:648 +#: proposals/forms.py:570 proposals/forms.py:643 proposals/forms.py:658 #: studies/forms.py:104 tasks/forms.py:87 msgid "Dit veld is verplicht." msgstr "This field is required." -#: main/menus.py:6 main/templates/base/menu.html:7 -#: main/templates/main/index.html:7 main/templates/main/index.html:56 -#: main/templates/main/landing.html:34 +#: main/menus.py:6 main/templates/main/index.html:7 +#: main/templates/main/index.html:56 main/templates/main/landing.html:34 msgid "Startpagina" msgstr "Start page" @@ -317,7 +221,7 @@ msgstr "uncertain" msgid "Geef aan waar de dataverzameling plaatsvindt" msgstr "Specify where the data collection will take place" -#: main/models.py:70 observations/models.py:129 proposals/models.py:255 +#: main/models.py:70 observations/models.py:129 proposals/models.py:264 #: studies/models.py:208 studies/models.py:244 tasks/models.py:157 #: tasks/models.py:169 msgid "Namelijk" @@ -397,7 +301,7 @@ msgstr "Phase" #: reviews/templates/reviews/committee_members_workload.html:26 #: reviews/templates/reviews/vue_templates/decision_list.html:153 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:95 -#: reviews/templates/reviews/vue_templates/review_list.html:151 +#: reviews/templates/reviews/vue_templates/review_list.html:157 msgid "Datum ingediend" msgstr "Date submitted" @@ -405,7 +309,7 @@ msgstr "Date submitted" #: reviews/templates/reviews/committee_members_workload.html:27 #: reviews/templates/reviews/vue_templates/decision_list.html:163 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:105 -#: reviews/templates/reviews/vue_templates/review_list.html:161 +#: reviews/templates/reviews/vue_templates/review_list.html:167 msgid "Gewenste einddatum" msgstr "Desired end date" @@ -417,7 +321,7 @@ msgstr "My decision" #: main/templates/auth/user_detail.html:58 reviews/api/views.py:332 #: reviews/models.py:57 #: reviews/templates/reviews/vue_templates/decision_list.html:133 -#: reviews/templates/reviews/vue_templates/review_list.html:131 +#: reviews/templates/reviews/vue_templates/review_list.html:137 msgid "Afhandeling" msgstr "Conclusion" @@ -468,7 +372,7 @@ msgstr "Website export text" #: proposals/templates/proposals/proposal_confirmation.html:25 #: reviews/templates/reviews/vue_templates/decision_list.html:95 #: reviews/templates/reviews/vue_templates/review_list.html:88 -#: reviews/utils/review_actions.py:244 +#: reviews/utils/review_actions.py:245 msgid "Bevestigingsbrief versturen" msgstr "Send confirmation letter" @@ -505,147 +409,6 @@ msgstr "Save and go to next step >>" msgid "Welkom {}" msgstr "Welcome {}" -#: main/templates/base/menu.html:11 proposals/menus.py:80 -msgid "Mijn aanvragen" -msgstr "My applications" - -#: main/templates/base/menu.html:14 proposals/menus.py:9 -msgid "Nieuwe aanvraag starten" -msgstr "Start a new application" - -#: main/templates/base/menu.html:17 -msgid "Nieuwe studie starten op basis van een kopie van een oude studie" -msgstr "Start a new study based on a copy of an old study" - -#: main/templates/base/menu.html:20 -msgid "Nieuwe voortoetsing aanvraag starten" -msgstr "Start a new preliminary application" - -#: main/templates/base/menu.html:23 -msgid "" -"Nieuwe aanvraag starten (die al goedgekeurd is door een andere ethische " -"toetsingscommissie)" -msgstr "" -"Start a new application (that has been approved by another ethics committee)" - -#: main/templates/base/menu.html:26 proposals/menus.py:30 -msgid "Maak een revisie van een bestaande aanvraag" -msgstr "Create a revision for an existing application" - -#: main/templates/base/menu.html:29 proposals/menus.py:34 -msgid "Maak een amendement van een al goedgekeurde aanvraag" -msgstr "Create an amendment to an already approved application" - -#: main/templates/base/menu.html:32 proposals/menus.py:56 -#: proposals/views/proposal_views.py:77 -msgid "Mijn conceptaanvragen" -msgstr "My draft applications" - -#: main/templates/base/menu.html:35 proposals/menus.py:60 -#: proposals/views/proposal_views.py:127 -msgid "Mijn oefenaanvragen" -msgstr "My practice applications" - -#: main/templates/base/menu.html:38 proposals/menus.py:64 -#: proposals/views/proposal_views.py:89 -msgid "Mijn ingediende aanvragen" -msgstr "My submitted applications" - -#: main/templates/base/menu.html:41 proposals/menus.py:68 -#: proposals/views/proposal_views.py:101 -msgid "Mijn afgehandelde aanvragen" -msgstr "My processed applications" - -#: main/templates/base/menu.html:44 proposals/menus.py:72 -#: proposals/views/proposal_views.py:113 -msgid "Mijn aanvragen als eindverantwoordelijke" -msgstr "My supervised applications" - -#: main/templates/base/menu.html:47 proposals/menus.py:52 -msgid "Al mijn aanvragen" -msgstr "All my applications" - -#: main/templates/base/menu.html:52 proposals/menus.py:110 -#: proposals/views/proposal_views.py:154 -msgid "Archief" -msgstr "Archive" - -#: main/templates/base/menu.html:55 -msgid "Alle aanvragen bekijken van de Algemene Kamer" -msgstr "View all applications of the General Chamber" - -#: main/templates/base/menu.html:58 -msgid "Alle aanvragen bekijken van de Linguïstiek Kamer" -msgstr "" -"View all processed and approved applications of the Linguistics Chamber" - -#: main/templates/base/menu.html:62 proposals/menus.py:100 -msgid "Site-export" -msgstr "Site-export" - -#: main/templates/base/menu.html:69 reviews/forms.py:31 reviews/menus.py:60 -#: reviews/mixins.py:127 -msgid "Algemene Kamer" -msgstr "General Chamber" - -#: main/templates/base/menu.html:72 main/templates/base/menu.html:99 -#: reviews/menus.py:14 reviews/views.py:70 -msgid "Mijn openstaande besluiten" -msgstr "My pending decisions" - -#: main/templates/base/menu.html:75 main/templates/base/menu.html:102 -#: reviews/menus.py:18 -msgid "Al mijn besluiten" -msgstr "All my decisions" - -#: main/templates/base/menu.html:79 main/templates/base/menu.html:106 -#: reviews/menus.py:22 -msgid "Alle openstaande besluiten commissieleden" -msgstr "All pending decisions committee members" - -#: main/templates/base/menu.html:82 main/templates/base/menu.html:109 -#: reviews/menus.py:27 -msgid "Alle openstaande besluiten eindverantwoordelijken" -msgstr "All pending decisions supervisors" - -#: main/templates/base/menu.html:85 main/templates/base/menu.html:112 -#: reviews/menus.py:32 reviews/views.py:229 -msgid "Nog af te handelen aanvragen" -msgstr "Applications waiting for conclusion" - -#: main/templates/base/menu.html:88 main/templates/base/menu.html:115 -#: reviews/menus.py:47 reviews/views.py:275 -msgid "Alle ingezonden aanvragen" -msgstr "All submitted applications" - -#: main/templates/base/menu.html:96 reviews/forms.py:32 reviews/menus.py:67 -#: reviews/mixins.py:130 -msgid "Linguïstiek Kamer" -msgstr "Linguistics Chamber" - -#: main/templates/base/menu.html:128 -msgid "Reglement Algemene Kamer (AK)" -msgstr "Regulations General Chamber (GC)" - -#: main/templates/base/menu.html:131 -msgid " Reglement Linguïstiek Kamer (LK) " -msgstr " Regulations Linguistics Chamber (LC) " - -#: main/templates/base/menu.html:145 -#: main/templates/registration/logged_out.html:9 -msgid "Uitloggen" -msgstr "Log out" - -#: main/templates/base/menu.html:149 -msgid "FETC-GW-website" -msgstr "FEtC-H website" - -#: main/templates/base/menu.html:152 main/templates/main/landing.html:77 -#: main/templates/registration/login.html:15 -#: main/templates/registration/login.html:32 -msgid "Inloggen" -msgstr "Log in" - #: main/templates/base/sidebar.html:27 msgid "Toon voortgang" msgstr "Show progress" @@ -1001,11 +764,7 @@ msgstr "Regulations of the FEtC-H" msgid "Veelgestelde vragen m.b.t. dit portal" msgstr "Frequently asked questions relating to this portal" -#: main/templates/main/index.html:215 -msgid "Feedback op dit portal geven" -msgstr "Give feedback on this portal" - -#: main/templates/main/index.html:225 +#: main/templates/main/index.html:222 msgid "Bannerfoto door Kim O'leary" msgstr "Cover image by Kim O'leary" @@ -1042,6 +801,12 @@ msgstr "Javascript needs to be enabled to see the email address" msgid "Technische ondersteuning" msgstr "Technical support" +#: main/templates/main/landing.html:77 +#: main/templates/registration/login.html:15 +#: main/templates/registration/login.html:32 +msgid "Inloggen" +msgstr "Log in" + #: main/templates/main/landing.html:79 msgid "" "Om in te loggen heb je een Solis-ID nodig. Heb je geen Solis-ID, neem dan " @@ -1054,6 +819,10 @@ msgstr "" msgid "Log in met je Solis-ID" msgstr "Log in with your Solis-ID" +#: main/templates/registration/logged_out.html:9 +msgid "Uitloggen" +msgstr "Log out" + #: main/templates/registration/logged_out.html:12 msgid "Je bent succesvol uitgelogd." msgstr "You have successfully logged out." @@ -1154,7 +923,7 @@ msgid "" msgstr "As might happen on forums where the researcher also has an account." #: observations/models.py:65 observations/models.py:75 -#: observations/models.py:88 proposals/models.py:747 studies/models.py:172 +#: observations/models.py:88 proposals/models.py:756 studies/models.py:172 #: studies/models.py:228 studies/models.py:358 msgid "Licht toe" msgstr "Explain" @@ -1265,6 +1034,7 @@ msgstr "Recording behaviour" #: proposals/templates/proposals/proposal_update_attachments.html:7 #: proposals/templates/proposals/proposal_update_attachments.html:14 #: proposals/templates/proposals/proposal_update_attachments.html:25 +#: proposals/templates/proposals/proposal_update_date_start.html:7 #: studies/templates/studies/study_update_attachments.html:7 #: studies/templates/studies/study_update_attachments.html:14 #: studies/templates/studies/study_update_attachments.html:25 @@ -1281,6 +1051,20 @@ msgstr "" "On this page you can edit the forms related to the proposal " "%(title)s(reference number %(ref_number)s), trajectory %(order)s." +#: observations/templates/observations/observation_update_attachments.html:39 +#: proposals/templates/proposals/proposal_confirmation.html:36 +#: proposals/templates/proposals/proposal_diff.html:58 +#: proposals/templates/proposals/proposal_update_attachments.html:26 +#: proposals/templates/proposals/proposal_update_date_start.html:29 +#: reviews/templates/reviews/change_chamber_form.html:19 +#: reviews/templates/reviews/decision_form.html:90 +#: reviews/templates/reviews/review_assign_form.html:46 +#: reviews/templates/reviews/review_close_form.html:41 +#: reviews/templates/reviews/review_discontinue_form.html:72 +#: studies/templates/studies/study_update_attachments.html:26 +msgid "Terug naar de vorige pagina" +msgstr "Back to the previous page" + #: observations/utils.py:8 studies/models.py:143 studies/models.py:265 #: studies/templates/studies/study_end.html:89 msgid "Observatieonderzoek" @@ -1307,7 +1091,7 @@ msgstr "Last edited" msgid "Datum ingediend bij eindverantwoordelijke" msgstr "Date sent to supervisor" -#: proposals/forms.py:42 proposals/models.py:221 +#: proposals/forms.py:43 proposals/models.py:230 msgid "" "Zijn er nog andere onderzoekers bij deze aanvraag betrokken die " "niet geaffilieerd zijn aan een van de onderzoeksinstituten " @@ -1316,19 +1100,19 @@ msgstr "" "Are there any other researchers involved outside the above-" "mentioned institutes? " -#: proposals/forms.py:63 proposals/forms.py:279 proposals/validators.py:25 +#: proposals/forms.py:64 proposals/forms.py:280 proposals/validators.py:25 msgid "Er bestaat al een aanvraag met deze titel." msgstr "There is an existing application with this title." -#: proposals/forms.py:133 +#: proposals/forms.py:134 msgid "Selecteer..." msgstr "Select..." -#: proposals/forms.py:140 +#: proposals/forms.py:141 msgid "Docent" msgstr "Professor" -#: proposals/forms.py:141 +#: proposals/forms.py:142 msgid "" "Vul hier de docent van de cursus in waarbinnen je deze portal moet " "doorlopen. De docent kan na afloop de aanvraag inkijken in de portal. De " @@ -1339,23 +1123,23 @@ msgstr "" "This application will not be published in the semipublic archive of the FEtC-" "H." -#: proposals/forms.py:192 +#: proposals/forms.py:193 msgid "Je dient een promotor/begeleider op te geven." msgstr "You are required to specify a promotor/supervisor." -#: proposals/forms.py:199 +#: proposals/forms.py:200 msgid "Je kunt niet jezelf als promotor/begeleider opgeven." msgstr "You cannot submit yourself as the promotor/supervisor." -#: proposals/forms.py:213 +#: proposals/forms.py:214 msgid "Je hebt jezelf niet als onderzoekers geselecteerd." msgstr "You have not selected yourself." -#: proposals/forms.py:218 +#: proposals/forms.py:219 msgid "Je hebt geen andere onderzoekers geselecteerd." msgstr "You have not selected any other researchers." -#: proposals/forms.py:228 +#: proposals/forms.py:229 msgid "" "Dit veld is verplicht, maar je kunt later terugkomen om " "hem verder in te vullen." @@ -1363,7 +1147,7 @@ msgstr "" "This field is required, but you may choose to come back to this page later " "to fill it in." -#: proposals/forms.py:238 +#: proposals/forms.py:239 msgid "" "Indien je geen toestemming hebt van een andere ethische commissie, dien je " "het normale formulier in te vullen. Ga terug naar de startpagina, en " @@ -1376,23 +1160,23 @@ msgstr "" "page, and select \"Submit a new application that is completely new in this " "portal\" or \"from a copy of an old application.\"" -#: proposals/forms.py:265 +#: proposals/forms.py:266 msgid "Ik maak een oefenaanvraag aan" msgstr "I am creating a practice application" -#: proposals/forms.py:285 proposals/models.py:538 +#: proposals/forms.py:286 proposals/models.py:547 msgid "Te kopiëren aanvraag" msgstr "Application to be copied" -#: proposals/forms.py:287 proposals/models.py:540 +#: proposals/forms.py:288 proposals/models.py:549 msgid "Dit veld toont enkel aanvragen waar je zelf een medeuitvoerende bent." msgstr "This field shows only applications in which you are involved." -#: proposals/forms.py:327 proposals/forms.py:362 +#: proposals/forms.py:328 proposals/forms.py:363 msgid "Je kan de titel van je aanvraag nu, indien nodig, wijzigen." msgstr "You can, if necessary, change the title of your application here." -#: proposals/forms.py:329 proposals/forms.py:364 +#: proposals/forms.py:330 proposals/forms.py:365 msgid "" "De titel die je hier opgeeft is zichtbaar voor de FETC-GW-leden en, wanneer " "de aanvraag is goedgekeurd, ook voor alle medewerkers die in het archief van " @@ -1402,11 +1186,11 @@ msgstr "" "application is approved, also to employees viewing the archive of this " "portal." -#: proposals/forms.py:336 +#: proposals/forms.py:337 msgid "Te reviseren aanvraag" msgstr "Application to be revised" -#: proposals/forms.py:337 +#: proposals/forms.py:338 msgid "" "Dit veld toont enkel ingediende, (nog) niet goedgekeurde aanvragen waar jij " "een medeuitvoerende bent." @@ -1414,69 +1198,69 @@ msgstr "" "This field only shows submitted applications that have not been approved " "(yet) in which you are involved." -#: proposals/forms.py:371 +#: proposals/forms.py:372 msgid "Te amenderen aanvraag" msgstr "Application to be amended" -#: proposals/forms.py:372 +#: proposals/forms.py:373 msgid "" "Dit veld toont enkel goedgekeurde aanvragen waar je zelf een medeuitvoerende " "bent." msgstr "This field shows only approved applications in which you are involved." -#: proposals/forms.py:427 proposals/forms.py:557 proposals/forms.py:681 +#: proposals/forms.py:428 proposals/forms.py:558 proposals/forms.py:691 msgid "Dit veld is verplicht om verder te gaan." msgstr "This field is required to continue." -#: proposals/forms.py:435 +#: proposals/forms.py:436 msgid "Je dient een instelling op te geven." msgstr "You are required to specify an institution." -#: proposals/forms.py:493 +#: proposals/forms.py:494 msgid "In dit geval is een beslissing van een METC vereist" msgstr "In this case, a decision by a METC is required" -#: proposals/forms.py:501 +#: proposals/forms.py:502 msgid "Naam traject 1" msgstr "Title of trajectory 1" -#: proposals/forms.py:503 +#: proposals/forms.py:504 msgid "Naam traject 2" msgstr "Title of trajectory 2" -#: proposals/forms.py:505 +#: proposals/forms.py:506 msgid "Naam traject 3" msgstr "Title of trajectory 3" -#: proposals/forms.py:507 +#: proposals/forms.py:508 msgid "Naam traject 4" msgstr "Title of trajectory 4" -#: proposals/forms.py:509 +#: proposals/forms.py:510 msgid "Naam traject 5" msgstr "Title of trajectory 5" -#: proposals/forms.py:511 +#: proposals/forms.py:512 msgid "Naam traject 6" msgstr "Title of trajectory 6" -#: proposals/forms.py:513 +#: proposals/forms.py:514 msgid "Naam traject 7" msgstr "Title of trajectory 7" -#: proposals/forms.py:515 +#: proposals/forms.py:516 msgid "Naam traject 8" msgstr "Title of trajectory 8" -#: proposals/forms.py:517 +#: proposals/forms.py:518 msgid "Naam traject 9" msgstr "Title of trajectory 9" -#: proposals/forms.py:519 +#: proposals/forms.py:520 msgid "Naam traject 10" msgstr "Title of trajectory 10" -#: proposals/forms.py:563 +#: proposals/forms.py:564 msgid "" "Als niet dezelfde trajecten worden doorlopen, moeten er minstens twee " "verschillende trajecten zijn." @@ -1484,15 +1268,19 @@ msgstr "" "If different trajectories are used, at least two different trajectories " "should be filled in." -#: proposals/forms.py:640 +#: proposals/forms.py:588 +msgid "Nieuwe beoogde startdatum" +msgstr "New intended start date" + +#: proposals/forms.py:650 msgid "Toestemmingsverklaring voor traject {} nog niet toegevoegd." msgstr "Declaration of consent for trajectory {} not yet added." -#: proposals/forms.py:644 +#: proposals/forms.py:654 msgid "Informatiebrief voor traject {} nog niet toegevoegd." msgstr "Information letter for trajectory {} not yet added." -#: proposals/forms.py:656 +#: proposals/forms.py:666 msgid "" "De embargo-periode kan maximaal 2 jaar zijn. Kies een datum binnen 2 jaar " "van vandaag." @@ -1500,10 +1288,14 @@ msgstr "" "The embargo-period can last a maximum of 2 years. Pick a date within 2 years " "from today." -#: proposals/forms.py:687 +#: proposals/forms.py:697 msgid "Vul in in welke talen de formulieren worden vertaald." msgstr "Please fill in the languages" +#: proposals/menus.py:9 +msgid "Nieuwe aanvraag starten" +msgstr "Start a new application" + #: proposals/menus.py:13 msgid "Nieuwe aanvraag starten op basis van een kopie van een oude aanvraag" msgstr "Start a new application based on a copy of an old application" @@ -1524,10 +1316,46 @@ msgstr "" msgid "Nieuwe oefenaanvraag starten" msgstr "Start a new practice application" +#: proposals/menus.py:30 +msgid "Maak een revisie van een bestaande aanvraag" +msgstr "Create a revision for an existing application" + +#: proposals/menus.py:34 +msgid "Maak een amendement van een al goedgekeurde aanvraag" +msgstr "Create an amendment to an already approved application" + #: proposals/menus.py:42 msgid "Nieuwe aanvraag" msgstr "New application" +#: proposals/menus.py:52 +msgid "Al mijn aanvragen" +msgstr "All my applications" + +#: proposals/menus.py:56 proposals/views/proposal_views.py:78 +msgid "Mijn conceptaanvragen" +msgstr "My draft applications" + +#: proposals/menus.py:60 proposals/views/proposal_views.py:128 +msgid "Mijn oefenaanvragen" +msgstr "My practice applications" + +#: proposals/menus.py:64 proposals/views/proposal_views.py:90 +msgid "Mijn ingediende aanvragen" +msgstr "My submitted applications" + +#: proposals/menus.py:68 proposals/views/proposal_views.py:102 +msgid "Mijn afgehandelde aanvragen" +msgstr "My processed applications" + +#: proposals/menus.py:72 proposals/views/proposal_views.py:114 +msgid "Mijn aanvragen als eindverantwoordelijke" +msgstr "My supervised applications" + +#: proposals/menus.py:80 +msgid "Mijn aanvragen" +msgstr "My applications" + #: proposals/menus.py:90 msgid "Bekijk alle goedgekeurde aanvragen van de Algemene Kamer" msgstr "View all approved applications of the General Chamber" @@ -1536,6 +1364,14 @@ msgstr "View all approved applications of the General Chamber" msgid "Bekijk alle goedgekeurde aanvragen van de Linguïstiek Kamer" msgstr "View all approved applications of the Linguistics Chamber" +#: proposals/menus.py:100 +msgid "Site-export" +msgstr "Site-export" + +#: proposals/menus.py:110 proposals/views/proposal_views.py:155 +msgid "Archief" +msgstr "Archive" + #: proposals/mixins.py:20 #, python-format msgid "Aanvraag %(title)s bewerkt" @@ -1628,11 +1464,23 @@ msgstr "" "Are there any other researchers involved affiliated with ICON, OFR, OGK or " "ILS?" -#: proposals/models.py:229 +#: proposals/models.py:218 +msgid "" +"Werk je samen met een onderzoeker of organisatie buiten de UU en is je " +"onderzoek niet strikt anoniem? Neem dan contact op met de privacy officer. Er moeten dan wellicht afspraken " +"worden gemaakt over de verwerking van persoonsgegevens." +msgstr "" +"Do you work with a researcher or organization outside the UU and is your " +"research not strictly anonymous? Please contact the privacy officer. Agreements may then have to be made about " +"the processing of personal data." + +#: proposals/models.py:238 msgid "Andere betrokkenen" msgstr "Other people involved" -#: proposals/models.py:234 +#: proposals/models.py:243 msgid "" "Worden de informed consent formulieren nog vertaald naar een andere taal dan " "Nederlands of Engels?" @@ -1640,30 +1488,30 @@ msgstr "" "Will the informed consent forms be translated in a language other than Dutch " "or English?" -#: proposals/models.py:241 +#: proposals/models.py:250 msgid "Andere talen:" msgstr "Other languages:" -#: proposals/models.py:250 +#: proposals/models.py:259 msgid "Hoe wordt dit onderzoek gefinancierd?" msgstr "How is this study funded?" -#: proposals/models.py:261 +#: proposals/models.py:270 msgid "" "Wat is de naam van het gefinancierde project en wat is het projectnummer?" msgstr "What is the name of the funded project and what is the project number?" -#: proposals/models.py:265 +#: proposals/models.py:274 msgid "" "De titel die je hier opgeeft zal in de formele toestemmingsbrief gebruikt " "worden." msgstr "This title will be used in the formal letter of approval." -#: proposals/models.py:271 +#: proposals/models.py:280 msgid "Ruimte voor eventuele opmerkingen. Gebruik maximaal 1000 woorden." msgstr "Space for possible comments. Use a maximum of a 1000 words." -#: proposals/models.py:277 +#: proposals/models.py:286 msgid "" "

    Je hebt aangegeven dat je gebruik wilt gaan maken van één van de " "faciliteiten van het ILS, namelijk de database, Zep software en/of het ILS " @@ -1686,7 +1534,7 @@ msgstr "" "> - The title of the study
    - The planned starting date
    - The " "facilities you intend to use (database, lab, Zep software)" -#: proposals/models.py:297 +#: proposals/models.py:306 msgid "" "Als de deelnemers van je onderzoek moeten worden misleid, kan je " "ervoor kiezen je applicatie pas later op te laten nemen in het " @@ -1698,16 +1546,16 @@ msgstr "" "for users of this portal. Would you like your application to be placed under " "a temporary embargo?" -#: proposals/models.py:308 +#: proposals/models.py:317 msgid "" "Vanaf welke datum mag je onderzoek wel in het archief worden weergegeven?" msgstr "From which date may your application be displayed in the archive?" -#: proposals/models.py:318 +#: proposals/models.py:327 msgid "Upload hier je aanvraag (in .pdf of .doc(x)-formaat)" msgstr "Upload your application here (in .pdf or .doc(x)-format)" -#: proposals/models.py:326 +#: proposals/models.py:335 msgid "" "Heb je formele toestemming van een ethische toetsingcommissie, uitgezonderd " "deze FETC-GW commissie?" @@ -1715,11 +1563,11 @@ msgstr "" "Do you have formal approval from an ethics committee, other than this FEtC-H " "committee?" -#: proposals/models.py:334 +#: proposals/models.py:343 msgid "Welk instituut heeft de aanvraag goedgekeurd?" msgstr "Which institute approved the application?" -#: proposals/models.py:342 +#: proposals/models.py:351 msgid "" "Upload hier je formele toestemmingsbrief van dit instituut (in .pdf of ." "doc(x)-formaat)" @@ -1727,22 +1575,22 @@ msgstr "" "Please upload the formal approval letter from this institute here (in .pdf " "or .doc(x)-format)" -#: proposals/models.py:350 +#: proposals/models.py:359 msgid "Ik vul de portal in in het kader van een cursus" msgstr "I am using this portal in the context of a course" -#: proposals/models.py:355 +#: proposals/models.py:364 msgid "Ik vul de portal in om de portal te exploreren" msgstr "I am using this portal to explore the portal" -#: proposals/models.py:367 +#: proposals/models.py:376 msgid "" "Kan voor alle deelnemersgroepen dezelfde informatiebrief en " "toestemmingsverklaring gebruikt worden?" msgstr "" "Can the same informed consent documents be used for all participant groups?" -#: proposals/models.py:369 +#: proposals/models.py:378 msgid "" "Daar waar de verschillen klein en qua belasting of risico irrelevant zijn is " "sprake van in essentie hetzelfde traject, en voldoet één set documenten voor " @@ -1766,11 +1614,11 @@ msgstr "" "time. However, if separate groups receive different kinds of tasks, " "they constitute separate trajectories." -#: proposals/models.py:385 +#: proposals/models.py:394 msgid "Hoeveel verschillende trajecten zijn er?" msgstr "How many different trajectories are there?" -#: proposals/models.py:403 +#: proposals/models.py:412 msgid "" "Ik heb kennis genomen van het bovenstaande en begrijp mijn " "verantwoordelijkheden ten opzichte van de AVG." @@ -1778,7 +1626,7 @@ msgstr "" "I have read the information above and have considered my responsibilities " "with regard to the AVG." -#: proposals/models.py:410 +#: proposals/models.py:419 msgid "" "Als je een Data Management Plan hebt voor deze aanvraag, kan je kiezen om " "deze hier bij te voegen. Het aanleveren van een DMP vergemakkelijkt het " @@ -1788,24 +1636,24 @@ msgstr "" "include it here. Supplying a DMP can expedite ethical assessment of " "proposals." -#: proposals/models.py:422 proposals/utils/pdf_diff_logic.py:980 +#: proposals/models.py:431 proposals/utils/pdf_diff_logic.py:980 #: reviews/models.py:184 msgid "Ruimte voor eventuele opmerkingen" msgstr "Space for possible comments" -#: proposals/models.py:434 +#: proposals/models.py:443 msgid "Datum bevestigingsbrief verstuurd" msgstr "Date confirmation sent" -#: proposals/models.py:439 reviews/forms.py:110 +#: proposals/models.py:448 reviews/forms.py:110 msgid "Is er een revisie geweest na het indienen van deze aanvraag?" msgstr "Has this proposal been amended after it was submitted?" -#: proposals/models.py:444 +#: proposals/models.py:453 msgid "Leg uit" msgstr "Explain why" -#: proposals/models.py:450 +#: proposals/models.py:459 msgid "" "Wat zijn de belangrijkste ethische kwesties in dit onderzoek en beschrijf " "kort hoe ga je daarmee omgaat. Gebruik maximaal 1000 woorden." @@ -1814,23 +1662,23 @@ msgstr "" "please describe briefly how you will address them. Use a maximum of a 1000 " "words." -#: proposals/models.py:464 +#: proposals/models.py:473 msgid "In welke hoedanigheid ben je betrokken bij dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:472 +#: proposals/models.py:481 msgid "Wat is je studierichting?" msgstr "What is your course of study?" -#: proposals/models.py:479 +#: proposals/models.py:488 msgid "In welke context doe je dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:486 +#: proposals/models.py:495 msgid "Namelijk:" msgstr "Please specify:" -#: proposals/models.py:493 +#: proposals/models.py:502 msgid "" "Studenten (die mensgebonden onderzoek uitvoeren binnen hun studieprogramma) " "hoeven in principe geen aanvraag in te dienen bij de FETC-GW. Bespreek met " @@ -1844,7 +1692,7 @@ msgstr "" "do not not, you can terminate your proposal now. If you do, please explain " "what the reason is:" -#: proposals/models.py:510 +#: proposals/models.py:519 msgid "" "Uitvoerenden, inclusief uzelf. Let op! De andere onderzoekers moeten " "ten minste één keer zijn ingelogd op dit portaal om ze te kunnen selecteren." @@ -1853,13 +1701,13 @@ msgstr "" "researchers need to have logged into this portal at least once, in order to " "be selectable here." -#: proposals/models.py:517 +#: proposals/models.py:526 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 #: proposals/templates/proposals/vue_templates/proposal_list.html:166 msgid "Promotor/Begeleider" msgstr "Promotor/Supervisor" -#: proposals/models.py:520 +#: proposals/models.py:529 msgid "" "Je aanvraag moet, als je alles hebt ingevuld, via de portal \n" " naar je promotor of begeleider gestuurd worden. Deze " @@ -1889,53 +1737,53 @@ msgstr "" "you wait for them to do this, but remember to come back and fill in this " "field before submitting." -#: proposals/models.py:547 +#: proposals/models.py:556 msgid "" "Is deze aanvraag een revisie van of amendement op een ingediende aanvraag?" msgstr "" "Is this application a revision or an amendment of a previously submitted " "application?" -#: proposals/models.py:619 +#: proposals/models.py:628 msgid "Amendement" msgstr "Amendment" -#: proposals/models.py:619 reviews/api/views.py:39 reviews/api/views.py:328 +#: proposals/models.py:628 reviews/api/views.py:39 reviews/api/views.py:328 #: reviews/templates/reviews/committee_members_workload.html:36 #: reviews/templates/reviews/committee_members_workload.html:82 #: reviews/templates/reviews/review_detail_sidebar.html:106 msgid "Revisie" msgstr "Revision" -#: proposals/models.py:625 +#: proposals/models.py:634 msgid "Normaal" msgstr "Normal" -#: proposals/models.py:630 +#: proposals/models.py:639 msgid "Voortoetsing" msgstr "Preliminary assessment" -#: proposals/models.py:632 +#: proposals/models.py:641 msgid "Oefening" msgstr "Practice" -#: proposals/models.py:634 +#: proposals/models.py:643 msgid "Extern getoetst" msgstr "External approval" -#: proposals/models.py:732 +#: proposals/models.py:741 msgid "Geen beoordeling door METC noodzakelijk" msgstr "Assessment by METC not required" -#: proposals/models.py:733 +#: proposals/models.py:742 msgid "In afwachting beslissing METC" msgstr "Pending decision by METC" -#: proposals/models.py:734 +#: proposals/models.py:743 msgid "Beslissing METC geüpload" msgstr "METC decision uploaded" -#: proposals/models.py:738 +#: proposals/models.py:747 msgid "" "Vindt de dataverzameling plaats binnen het UMC Utrecht of andere instelling " "waar toetsing door een METC verplicht is gesteld?" @@ -1943,11 +1791,11 @@ msgstr "" "Will the data collection take place at the UMC Utrecht or another " "institution for which an assessment by a METC is required?" -#: proposals/models.py:752 +#: proposals/models.py:761 msgid "Welke instelling?" msgstr "Which institution?" -#: proposals/models.py:758 +#: proposals/models.py:767 msgid "" "Is de onderzoeksvraag medisch-wetenschappelijk van aard (zoals gedefinieerd " "door de WMO)?" @@ -1955,7 +1803,7 @@ msgstr "" "Is the nature of the research question medical (as defined by the Medical " "Research Involving Human Subjects Act (WMO))?" -#: proposals/models.py:760 +#: proposals/models.py:769 msgid "" "De definitie van medisch-wetenschappelijk onderzoek is: Medisch-" "wetenschappelijk onderzoek is onderzoek dat als doel heeft het beantwoorden " @@ -1976,7 +1824,7 @@ msgstr "" "Committee on Research Involving Human Subjects, Definition of medical " "research, 2005, ccmo.nl)" -#: proposals/models.py:776 +#: proposals/models.py:785 msgid "" "Je onderzoek moet beoordeeld worden door een METC, maar dient nog wel bij de " "FETC-GW te worden geregistreerd. Is dit onderzoek al aangemeld bij een METC?" @@ -1985,15 +1833,15 @@ msgstr "" "registered with the FEtC-H. Has an application for this project already been " "submitted to an METC?" -#: proposals/models.py:783 +#: proposals/models.py:792 msgid "Is de METC al tot een beslissing gekomen?" msgstr "Has the METC already come to a decision?" -#: proposals/models.py:788 +#: proposals/models.py:797 msgid "Upload hier de beslissing van het METC (in .pdf of .doc(x)-formaat)" msgstr "Please upload the decision of METC (in .pdf or .doc(x)-format) here" -#: proposals/models.py:826 +#: proposals/models.py:835 #, python-brace-format msgid "WMO {title}, status {status}" msgstr "WMO {title}, status {status}" @@ -3160,6 +3008,26 @@ msgstr "" "On this page you can edit the forms related to the proposal " "%(title)s(reference number %(ref_number)s)" +#: proposals/templates/proposals/proposal_update_date_start.html:14 +#: proposals/templates/proposals/proposal_update_date_start.html:28 +msgid "Startdatum aanpassen" +msgstr "Edit start date" + +#: proposals/templates/proposals/proposal_update_date_start.html:17 +#, python-format +msgid "" +"Op deze pagina kan de startdatum worden aangepast van de aanvraag %(title)s " +"(referentienummer %(ref_number)s). Let op! Als de review al " +"is afgerond, wordt de nieuwe startdatum niet automatisch weergegeven in de " +"PDF. Mocht je de PDF opnieuw willen genereren, neem hierover dan contact op " +"met" +msgstr "" +"On this page, the start date of proposal %(title)s (reference number " +"%(ref_number)s) can be edited. Note! If the review has " +"already been concluded, the new start date will not be displayed in the PDF. " +"If you would like the PDF to be generated with the new start date, please " +"reach out to " + #: proposals/templates/proposals/study_consent.html:27 msgid "Toestemmingsverklaring van de schoolleider/hoofd van het departement" msgstr "Informed consent school director/ head of the institution" @@ -3323,7 +3191,7 @@ msgstr "Route:" #: proposals/templates/proposals/vue_templates/proposal_list.html:187 #: reviews/templates/reviews/vue_templates/decision_list.html:185 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:128 -#: reviews/templates/reviews/vue_templates/review_list.html:184 +#: reviews/templates/reviews/vue_templates/review_list.html:190 msgid "Indieners" msgstr "Applicants" @@ -3344,7 +3212,7 @@ msgstr "Hide" #: proposals/templates/proposals/vue_templates/proposal_list.html:139 #: reviews/templates/reviews/vue_templates/decision_list.html:141 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:83 -#: reviews/templates/reviews/vue_templates/review_list.html:139 +#: reviews/templates/reviews/vue_templates/review_list.html:145 msgid "Revisie/amendement van" msgstr "Revision/amendment of" @@ -3495,40 +3363,40 @@ msgstr "" "You must confirm your understanding of the AVG before you can submit your " "application." -#: proposals/views/proposal_views.py:44 +#: proposals/views/proposal_views.py:45 msgid "Publiek archief" msgstr "Public archive" -#: proposals/views/proposal_views.py:45 +#: proposals/views/proposal_views.py:46 msgid "Dit overzicht toont alle goedgekeurde aanvragen." msgstr "This overview shows all approved applications." -#: proposals/views/proposal_views.py:64 +#: proposals/views/proposal_views.py:65 msgid "Mijn aanvraag" msgstr "My application" -#: proposals/views/proposal_views.py:65 +#: proposals/views/proposal_views.py:66 msgid "Dit overzicht toont al je aanvragen." msgstr "This overview shows all your applications." -#: proposals/views/proposal_views.py:78 +#: proposals/views/proposal_views.py:79 msgid "Dit overzicht toont al je nog niet ingediende aanvragen." msgstr "This overview shows all the applications you have not yet submitted." -#: proposals/views/proposal_views.py:90 +#: proposals/views/proposal_views.py:91 msgid "Dit overzicht toont al je ingediende aanvragen." msgstr "This overview shows all the applications you have submitted." -#: proposals/views/proposal_views.py:102 +#: proposals/views/proposal_views.py:103 msgid "Dit overzicht toont al je beoordeelde aanvragen." msgstr "This overview shows all your applications that have been assessed." -#: proposals/views/proposal_views.py:115 +#: proposals/views/proposal_views.py:116 msgid "" "Dit overzicht toont alle aanvragen waarvan je eindverantwoordelijke bent." msgstr "This overview shows all your supervised applications." -#: proposals/views/proposal_views.py:128 +#: proposals/views/proposal_views.py:129 msgid "" "Dit overzicht toont alle oefenaanvragen waar je als student, onderzoeker of " "eindverantwoordelijke bij betrokken bent." @@ -3536,15 +3404,15 @@ msgstr "" "This overview shows all practice applications in which you are involved as a " "student, researcher or accountable researcher." -#: proposals/views/proposal_views.py:247 +#: proposals/views/proposal_views.py:248 msgid "Aanvraag verwijderd" msgstr "Application deleted" -#: proposals/views/proposal_views.py:385 +#: proposals/views/proposal_views.py:398 msgid "Wijzigingen opgeslagen" msgstr "Changes saved" -#: proposals/views/proposal_views.py:486 +#: proposals/views/proposal_views.py:499 msgid "Aanvraag gekopieerd" msgstr "Application copied" @@ -3585,7 +3453,7 @@ msgstr "Stage" #: reviews/api/views.py:35 reviews/api/views.py:324 reviews/models.py:45 #: reviews/templates/reviews/vue_templates/decision_list.html:178 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:121 -#: reviews/templates/reviews/vue_templates/review_list.html:177 +#: reviews/templates/reviews/vue_templates/review_list.html:183 msgid "Route" msgstr "Route" @@ -3605,6 +3473,14 @@ msgstr "long (4-week) route" msgid "direct naar revisie" msgstr "straight to revision" +#: reviews/forms.py:31 reviews/menus.py:60 reviews/mixins.py:127 +msgid "Algemene Kamer" +msgstr "General Chamber" + +#: reviews/forms.py:32 reviews/menus.py:67 reviews/mixins.py:130 +msgid "Linguïstiek Kamer" +msgstr "Linguistics Chamber" + #: reviews/forms.py:64 msgid "Selecteer de commissieleden" msgstr "Select committee members" @@ -3633,6 +3509,26 @@ msgstr "Start date period:" msgid "Eind datum periode:" msgstr "End date period:" +#: reviews/menus.py:14 reviews/views.py:70 +msgid "Mijn openstaande besluiten" +msgstr "My pending decisions" + +#: reviews/menus.py:18 +msgid "Al mijn besluiten" +msgstr "All my decisions" + +#: reviews/menus.py:22 +msgid "Alle openstaande besluiten commissieleden" +msgstr "All pending decisions committee members" + +#: reviews/menus.py:27 +msgid "Alle openstaande besluiten eindverantwoordelijken" +msgstr "All pending decisions supervisors" + +#: reviews/menus.py:32 reviews/views.py:229 +msgid "Nog af te handelen aanvragen" +msgstr "Applications waiting for conclusion" + #: reviews/menus.py:37 reviews/views.py:241 msgid "Aanvragen in revisie" msgstr "Applications in revision" @@ -3641,6 +3537,10 @@ msgstr "Applications in revision" msgid "Alle lopende aanvragen" msgstr "All running applications" +#: reviews/menus.py:47 reviews/views.py:275 +msgid "Alle ingezonden aanvragen" +msgstr "All submitted applications" + #: reviews/menus.py:52 msgid "Overzicht werkverdeling commissieleden" msgstr "Overview workload committee members" @@ -4314,7 +4214,7 @@ msgid "Verplaats naar andere kamer" msgstr "Move study to different reviewing chamber" #: reviews/templates/reviews/vue_templates/review_list.html:95 -#: reviews/utils/review_actions.py:281 +#: reviews/utils/review_actions.py:282 msgid "Verberg aanvraag uit het archief" msgstr "Remove this application from the archive" @@ -4322,6 +4222,10 @@ msgstr "Remove this application from the archive" msgid "Plaats aanvraag in archief" msgstr "Add this application to the archive" +#: reviews/templates/reviews/vue_templates/review_list.html:122 +msgid "Reviewronde beëindigd: " +msgstr "Reviewing round ended: " + #: reviews/templatetags/documents_list.py:145 msgid "Hoofdtraject" msgstr "Main trajectory" @@ -4378,85 +4282,89 @@ msgstr "Information letter for the parents" msgid "Toestemmingsdocument observatie" msgstr "Consent document for observation" -#: reviews/utils/review_actions.py:129 +#: reviews/utils/review_actions.py:130 msgid "Geef jouw beslissing en/of commentaar door" msgstr "Provide feedback on this proposal" -#: reviews/utils/review_actions.py:155 +#: reviews/utils/review_actions.py:156 msgid "Deze aanvraag afsluiten" msgstr "Conclude this application" -#: reviews/utils/review_actions.py:185 +#: reviews/utils/review_actions.py:186 msgid "Beëindig definitief de afhandeling van deze aanvraag" msgstr "Discontinue assessment of this application" -#: reviews/utils/review_actions.py:215 +#: reviews/utils/review_actions.py:216 msgid "Verander aangestelde commissieleden" msgstr "Change appointment of committee members" -#: reviews/utils/review_actions.py:245 +#: reviews/utils/review_actions.py:246 msgid "Datum van bevestigingsbrief aanpassen" msgstr "Change date of confirmation letter" -#: reviews/utils/review_actions.py:283 +#: reviews/utils/review_actions.py:284 msgid "Plaats aanvraag in het archief." msgstr "Add this application to the archive" +#: reviews/utils/review_actions.py:304 +msgid "Startdatum wijzigen" +msgstr "Edit start date" + #: reviews/utils/review_utils.py:54 msgid "FETC-GW {}: bevestiging indienen concept-aanmelding" msgstr "FEtC-H {}: confirmation of draft application submission" -#: reviews/utils/review_utils.py:74 +#: reviews/utils/review_utils.py:81 msgid "FETC-GW {}: beoordelen als eindverantwoordelijke" msgstr "FEtC-H {}: assess as researcher with final responsibility" -#: reviews/utils/review_utils.py:124 +#: reviews/utils/review_utils.py:131 msgid "FETC-GW {}: aanmelding ontvangen" msgstr "FEtC-H {}: application received" -#: reviews/utils/review_utils.py:218 +#: reviews/utils/review_utils.py:230 msgid "FETC-GW {}: nieuwe aanvraag voor voortoetsing" msgstr "FEtC-H {}: new application for preliminary assessment" -#: reviews/utils/review_utils.py:232 +#: reviews/utils/review_utils.py:244 msgid "FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing" msgstr "" "FEtC-H {}: confirmation of submission of application for preliminary " "assessment" -#: reviews/utils/review_utils.py:281 +#: reviews/utils/review_utils.py:293 msgid "FETC-GW {}: nieuwe aanvraag ingediend" msgstr "FEtC-H {}: new application submitted" -#: reviews/utils/review_utils.py:296 +#: reviews/utils/review_utils.py:308 msgid "FETC-GW {}: nieuwe beoordeling toegevoegd" msgstr "FEtC-H {}: new decision added" -#: reviews/utils/review_utils.py:312 +#: reviews/utils/review_utils.py:324 msgid "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld" msgstr "FEtC-H {}: a supervisor has reviewed your application" -#: reviews/utils/review_utils.py:338 +#: reviews/utils/review_utils.py:350 msgid "De aanvraag bevat het gebruik van wilsonbekwame volwassenen." msgstr "" "The application contains the participation of adults incapable of informed " "consent." -#: reviews/utils/review_utils.py:341 +#: reviews/utils/review_utils.py:353 msgid "De aanvraag bevat het gebruik van misleiding." msgstr "The application contains the use of misrepresentation." -#: reviews/utils/review_utils.py:344 +#: reviews/utils/review_utils.py:356 msgid "" "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" msgstr "" "A hierarchal relationship between researcher(s) and participant(s) exists." -#: reviews/utils/review_utils.py:347 +#: reviews/utils/review_utils.py:359 msgid "Het onderzoek verzamelt bijzondere persoonsgegevens." msgstr "This study collects special or sensitive personal details." -#: reviews/utils/review_utils.py:350 +#: reviews/utils/review_utils.py:362 msgid "" "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht " "verhoogde kwetsbaarheid met zich meebrengen." @@ -4464,7 +4372,7 @@ msgstr "" "The study selects participants based on particular characteristics which " "might entail increased vulnerability." -#: reviews/utils/review_utils.py:356 +#: reviews/utils/review_utils.py:368 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op " "onderdelen of als geheel zodanig belastend is dat deze ondanks de verkregen " @@ -4474,7 +4382,7 @@ msgstr "" "study, in part or in its entirety, is so burdensome that despite acquiring " "informed consent it might raise questions." -#: reviews/utils/review_utils.py:360 +#: reviews/utils/review_utils.py:372 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op " "psychische of fysieke schade bij deelname aan het onderzoek meer dan " @@ -4484,7 +4392,7 @@ msgstr "" "psychological or physical harm in participating in the study are more than " "minimal." -#: reviews/utils/review_utils.py:367 +#: reviews/utils/review_utils.py:379 #, python-brace-format msgid "" "De totale duur van de taken in sessie {s}, exclusief pauzes en andere niet-" @@ -4495,14 +4403,14 @@ msgstr "" "non-task elements ({d} minutes) is greater than the task duration limit " "({max_d} minutes) for the age group {ag}." -#: reviews/utils/review_utils.py:384 +#: reviews/utils/review_utils.py:396 #, python-brace-format msgid "Het onderzoek observeert deelnemers in de volgende setting: {s}" msgstr "" "The application contains sessions with participants in the following " "setting: {s}" -#: reviews/utils/review_utils.py:388 +#: reviews/utils/review_utils.py:400 msgid "" "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met " "informed consent achteraf." @@ -4510,7 +4418,7 @@ msgstr "" "The study observes participants in a non-public space and works with " "retrospective informed consent." -#: reviews/utils/review_utils.py:390 +#: reviews/utils/review_utils.py:402 msgid "" "De onderzoeker begeeft zich \"under cover\" in een beheerde niet-publieke " "ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie " @@ -4520,11 +4428,11 @@ msgstr "" "(e.g. a digital discussion group), and takes part actively in the discussion " "and/or collects data which can be traced back to individuals." -#: reviews/utils/review_utils.py:395 +#: reviews/utils/review_utils.py:407 msgid "De aanvraag bevat het gebruik van {}" msgstr "The application makes use of {}" -#: reviews/utils/review_utils.py:416 +#: reviews/utils/review_utils.py:428 msgid "" "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." msgstr "" @@ -5703,46 +5611,100 @@ msgstr "Task edited" msgid "Taak verwijderd" msgstr "Task deleted" -#: proposals/forms.py:190 -msgid "Je dient een eindverantwoordelijke op te geven." -msgstr "You are required to specify the researcher with final responsibility." +#~ msgid "Feedback" +#~ msgstr "Feedback" -#: proposals/forms.py:579 -msgid "Nieuwe beoogde startdatum" -msgstr "New intended start date" +#~ msgid "Open" +#~ msgstr "Open" -#: proposals/models.py:517 -#: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 -#: proposals/templates/proposals/vue_templates/proposal_list.html:166 -msgid "Eindverantwoordelijke onderzoeker" -msgstr "Researcher with final responsibility" +#~ msgid "Opgepakt" +#~ msgstr "In progress" -#: proposals/templates/proposals/proposal_update_date_start.html:14 -#: proposals/templates/proposals/proposal_update_date_start.html:28 -msgid "Startdatum aanpassen" -msgstr "Edit start date" +#~ msgid "Afgehandeld" +#~ msgstr "Processed" -#: proposals/templates/proposals/proposal_update_date_start.html:17 -msgid "" -"Op deze pagina kan de startdatum worden aangepast van de aanvraag %(title)s " -"(referentienummer %(ref_number)s). Let op! Als de review al " -"is afgerond, wordt de nieuwe startdatum niet automatisch weergegeven in de " -"PDF. Mocht je de PDF opnieuw willen genereren, neem hierover dan contact op " -"met" -msgstr "" -"On this page, the start date of proposal %(title)s (reference number " -"%(ref_number)s) can be edited. Note! If the review has " -"already been concluded, the new start date will not be displayed in the PDF. " -"If you would like the PDF to be generated with the new start date, please " -"reach out to " +#~ msgid "Laag" +#~ msgstr "Low" -#: reviews/templates/reviews/vue_templates/review_list.html:122 -msgid "Reviewronde beëindigd: " -msgstr "Reviewing round ended: " +#~ msgid "Gemiddeld" +#~ msgstr "Average" -#: reviews/utils/review_actions.py:304 -msgid "Startdatum wijzigen" -msgstr "Edit start date" +#~ msgid "Hoog" +#~ msgstr "High" + +#~ msgid "Feedback versturen" +#~ msgstr "Send feedback" + +#~ msgid "Hier kan je feedback achterlaten op het FETC-GW portal." +#~ msgstr "You can leave feedback on the FEtC-H portal here." + +#~ msgid "Feedbackoverzicht" +#~ msgstr "Feedback overview" + +#~ msgid "Toegevoegd op" +#~ msgstr "Added on" + +#~ msgid "URL" +#~ msgstr "URL" + +#~ msgid "Gegeven door" +#~ msgstr "Given by" + +#~ msgid "Bedankt voor je feedback!" +#~ msgstr "Thanks for your feedback!" + +#, python-format +#~ msgid "" +#~ "\n" +#~ " Klik hier om terug te keren naar " +#~ "pagina waar je gebleven was.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ "Click here to return to where you left off.\n" +#~ " " + +#~ msgid "Feedback verstuurd" +#~ msgstr "Feedback sent" + +#~ msgid "Nieuwe studie starten op basis van een kopie van een oude studie" +#~ msgstr "Start a new study based on a copy of an old study" + +#~ msgid "Nieuwe voortoetsing aanvraag starten" +#~ msgstr "Start a new preliminary application" + +#~ msgid "" +#~ "Nieuwe aanvraag starten (die al goedgekeurd is door een andere ethische " +#~ "toetsingscommissie)" +#~ msgstr "" +#~ "Start a new application (that has been approved by another ethics " +#~ "committee)" + +#~ msgid "Alle aanvragen bekijken van de Algemene Kamer" +#~ msgstr "View all applications of the General Chamber" + +#~ msgid "Alle aanvragen bekijken van de Linguïstiek Kamer" +#~ msgstr "" +#~ "View all processed and approved applications of the Linguistics Chamber" + +#~ msgid "Reglement Algemene Kamer (AK)" +#~ msgstr "Regulations General Chamber (GC)" + +#~ msgid " Reglement Linguïstiek Kamer (LK) " +#~ msgstr " Regulations Linguistics Chamber (LC) " + +#~ msgid "FETC-GW-website" +#~ msgstr "FEtC-H website" + +#~ msgid "Feedback op dit portal geven" +#~ msgstr "Give feedback on this portal" + +#~ msgid "Je dient een eindverantwoordelijke op te geven." +#~ msgstr "" +#~ "You are required to specify the researcher with final responsibility." + +#~ msgid "Eindverantwoordelijke onderzoeker" +#~ msgstr "Researcher with final responsibility" #~ msgid "" #~ "De revisie bevat interventieonderzoek, terwijl de originele aanvraag dat " diff --git a/proposals/models.py b/proposals/models.py index df5d9492f..1d6735709 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -215,6 +215,15 @@ class Proposal(models.Model): 'Zijn er nog andere onderzoekers bij deze aanvraag betrokken die geaffilieerd zijn aan één van de onderzoeksinstituten ICON, OFR, OGK of ILS?' ), default=False, + help_text=mark_safe_lazy(_('Werk je samen met een onderzoeker of ' + 'organisatie buiten de UU en is je ' + 'onderzoek niet strikt anoniem? Neem dan ' + 'contact op met de privacy ' + 'officer. ' + 'Er moeten dan wellicht afspraken worden ' + 'gemaakt over de verwerking van ' + 'persoonsgegevens.')), ) other_stakeholders = models.BooleanField( From b2f6404bae14a1b19c993181ae0bd235dd208ee7 Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 10 Nov 2023 15:30:34 +0100 Subject: [PATCH 075/148] chore: remove MO file from tree Fixes #514 --- .gitignore | 2 +- locale/en/LC_MESSAGES/django.mo | Bin 147284 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 locale/en/LC_MESSAGES/django.mo diff --git a/.gitignore b/.gitignore index ee1ad8e43..71f2b417a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ *.pyc __pycache__/ .env* - +*.mo ### Project-specific ### media/ diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index d1d22016cf74818ef34ce87791e257ab18dba617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147284 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 Date: Fri, 10 Nov 2023 15:37:49 +0100 Subject: [PATCH 076/148] fix: added missing migration Thanks Github for reminding me! ;) --- .../0050_alter_proposal_other_applicants.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 proposals/migrations/0050_alter_proposal_other_applicants.py diff --git a/proposals/migrations/0050_alter_proposal_other_applicants.py b/proposals/migrations/0050_alter_proposal_other_applicants.py new file mode 100644 index 000000000..a8756a846 --- /dev/null +++ b/proposals/migrations/0050_alter_proposal_other_applicants.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2023-11-10 14:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('proposals', '0049_alter_proposal_supervisor'), + ] + + operations = [ + migrations.AlterField( + model_name='proposal', + name='other_applicants', + field=models.BooleanField(default=False, help_text='Werk je samen met een onderzoeker of organisatie buiten de UU en is je onderzoek niet strikt anoniem? Neem dan contact op met de privacy officer. Er moeten dan wellicht afspraken worden gemaakt over de verwerking van persoonsgegevens.', verbose_name='Zijn er nog andere onderzoekers bij deze aanvraag betrokken die geaffilieerd zijn aan één van de onderzoeksinstituten ICON, OFR, OGK of ILS?'), + ), + ] From 15410f69305ed186462c23382fa449e7dd7a1cf5 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 13 Nov 2023 10:12:23 +0100 Subject: [PATCH 077/148] Removed pdf_template_name property of proposal model --- proposals/models.py | 4 ---- proposals/views/proposal_views.py | 6 ------ 2 files changed, 10 deletions(-) diff --git a/proposals/models.py b/proposals/models.py index 249f7bc12..4c1cef382 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -701,10 +701,6 @@ def generate_pdf(self, force_overwrite=False): ) return pdf - @property - def pdf_template_name(self): - return 'proposals/proposal_pdf.html' - def use_canonical_pdf(self): """Returns False if this proposal should regenerate its PDF on request. Proposals that have already been decided on should diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 23af7d08b..ad4ccebbb 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -591,12 +591,6 @@ def get_object(self, *args, **kwargs): self.object = super().get_object(*args, **kwargs) return self.object - def get_template_names(self): - """Determine the correct PDf template for given proposal""" - proposal = self.get_object() - self.template_name = proposal.pdf_template_name - return [self.template_name] - def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) From 6cdfacb1849f0daae44ab9793897295a8188d78f Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 14 Nov 2023 15:35:59 +0100 Subject: [PATCH 078/148] Added is_commission_review field to Review model --- .../0013_is_commission_review_field.py | 29 +++++++++++++++++++ reviews/models.py | 4 +++ reviews/tests.py | 3 ++ reviews/utils/review_utils.py | 1 + 4 files changed, 37 insertions(+) create mode 100644 reviews/migrations/0013_is_commission_review_field.py diff --git a/reviews/migrations/0013_is_commission_review_field.py b/reviews/migrations/0013_is_commission_review_field.py new file mode 100644 index 000000000..91cac5c7b --- /dev/null +++ b/reviews/migrations/0013_is_commission_review_field.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.20 on 2023-11-14 09:46 + +from django.db import migrations, models + +def update_is_commssion_review(apps, schema_editor): + + Review = apps.get_model('reviews', 'Review') + + for review in Review.objects.all(): + #Hardcoded this to account for possible future changes to stages + SUPERVISOR_STAGE = 0 + if review.stage == SUPERVISOR_STAGE: + review.is_commission_review = False + review.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('reviews', '0012_auto_20211213_1503'), + ] + + operations = [ + migrations.AddField( + model_name='review', + name='is_commission_review', + field=models.BooleanField(default=True), + ), + migrations.RunPython(update_is_commssion_review), + ] diff --git a/reviews/models.py b/reviews/models.py index c964e0b20..37e730bbd 100644 --- a/reviews/models.py +++ b/reviews/models.py @@ -63,6 +63,10 @@ class Review(models.Model): date_end = models.DateTimeField(blank=True, null=True) date_should_end = models.DateField(blank=True, null=True) + is_commission_review = models.BooleanField( + default=True + ) + proposal = models.ForeignKey(Proposal, on_delete=models.CASCADE) def update_go(self, last_decision=None): diff --git a/reviews/tests.py b/reviews/tests.py index 81fad6e90..069d99910 100644 --- a/reviews/tests.py +++ b/reviews/tests.py @@ -154,6 +154,7 @@ def test_start_supervisor_review(self): # If the Relation on a Proposal requires a supervisor, a Review for the supervisor should be started. review = start_review(self.proposal) self.assertEqual(review.stage, Review.SUPERVISOR) + self.assertEqual(review.is_commission_review, False) self.assertEqual(Decision.objects.filter(reviewer=self.supervisor).count(), 1) self.assertEqual(Decision.objects.filter(review=review).count(), 1) self.assertEqual(review.decision_set.count(), 1) @@ -170,6 +171,7 @@ def test_start_review(self): review = start_review(self.proposal) self.assertEqual(review.stage, Review.ASSIGNMENT) + self.assertEqual(review.is_commission_review, True) self.assertEqual(Decision.objects.filter(reviewer=self.secretary).count(), 1) self.assertEqual(Decision.objects.filter(review=review).count(), 1) self.assertEqual(review.decision_set.count(), 1) @@ -196,6 +198,7 @@ def test_decision_supervisor(self): decision.save() review.refresh_from_db() self.assertEqual(review.go, True) + self.assertEqual(review.is_commission_review, False) self.assertEqual(len(mail.outbox), 2) self.check_subject_lines(mail.outbox) diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index 772ed176f..dae480cdd 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -42,6 +42,7 @@ def start_supervisor_phase(proposal): """ review = Review.objects.create(proposal=proposal, date_start=timezone.now()) review.stage = Review.SUPERVISOR + review.is_commission_review = False review.save() proposal.date_submitted_supervisor = timezone.now() From 667860ee8efd8ee43c2d538b5e1bc53d670159f0 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 14 Nov 2023 15:39:55 +0100 Subject: [PATCH 079/148] Supervisor name in review detail sidebar --- reviews/templates/reviews/review_detail_sidebar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reviews/templates/reviews/review_detail_sidebar.html b/reviews/templates/reviews/review_detail_sidebar.html index ae1f10c15..7f24fcfc7 100644 --- a/reviews/templates/reviews/review_detail_sidebar.html +++ b/reviews/templates/reviews/review_detail_sidebar.html @@ -47,7 +47,7 @@

    {% if review.proposal.supervisor %}
  • - {% trans "Supervisor" %}: {{ review.proposal.supervisor }} + {% trans "Supervisor" %}: {{ review.proposal.supervisor.get_full_name }}
  • {% endif %}
  • From 53bfe72dc6bd8deeae1900ae876bafbfec864f07 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 14 Nov 2023 16:31:18 +0100 Subject: [PATCH 080/148] Added chamber info to PDF --- locale/en/LC_MESSAGES/django.mo | Bin 148888 -> 147361 bytes locale/en/LC_MESSAGES/django.po | 682 ++++++------------ .../templates/proposals/proposal_pdf.html | 1 + 3 files changed, 239 insertions(+), 444 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 7f7aaf9ee8ba9bd0b2971da546689db7d244d140..6b35444f66f139c54d711693a57edd18b9963a2f 100644 GIT binary patch delta 18837 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 G-hTlIg7=94 diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 705dc97c8..a9fa9a318 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-07 10:34+0100\n" +"POT-Creation-Date: 2023-11-14 16:23+0100\n" "PO-Revision-Date: 2023-11-07 10:36+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -40,7 +40,7 @@ msgstr "https://fetc-gw.wp.hum.uu.nl/en/regulations-fetc-h/" #: main/templates/main/index.html:209 #: proposals/templates/proposals/study_consent.html:8 #: proposals/templates/proposals/translated_consent_forms.html:7 -#: proposals/utils/pdf_diff_logic.py:859 +#: proposals/utils/pdf_diff_logic.py:869 msgid "Informed consent formulieren" msgstr "Informed consent forms" @@ -111,6 +111,7 @@ msgstr "You can leave feedback on the FEtC-H portal here." #: proposals/templates/proposals/proposal_confirmation.html:36 #: proposals/templates/proposals/proposal_diff.html:58 #: proposals/templates/proposals/proposal_update_attachments.html:26 +#: proposals/templates/proposals/proposal_update_date_start.html:29 #: reviews/templates/reviews/change_chamber_form.html:19 #: reviews/templates/reviews/decision_form.html:90 #: reviews/templates/reviews/review_assign_form.html:46 @@ -239,8 +240,7 @@ msgstr "How many times a week will the intervention session take place?" #: interventions/templates/interventions/intervention_form.html:7 #: interventions/templates/interventions/intervention_form.html:49 -#: proposals/templates/proposals/proposal_pdf_empty.html:186 -#: proposals/utils/pdf_diff_logic.py:586 +#: proposals/utils/pdf_diff_logic.py:596 msgid "Het interventieonderzoek" msgstr "Intervention study" @@ -282,7 +282,7 @@ msgstr "Intervention saved" #: main/forms/conditional_form.py:11 main/forms/conditional_form.py:20 #: main/forms/conditional_form.py:29 main/forms/conditional_form.py:38 #: main/forms/conditional_form.py:48 main/forms/mixins.py:83 -#: proposals/forms.py:569 proposals/forms.py:633 proposals/forms.py:648 +#: proposals/forms.py:570 proposals/forms.py:643 proposals/forms.py:658 #: studies/forms.py:104 tasks/forms.py:87 msgid "Dit veld is verplicht." msgstr "This field is required." @@ -358,8 +358,7 @@ msgid "Gebruiksersnaam" msgstr "Username" #: main/templates/auth/user_detail.html:30 -#: proposals/templates/proposals/proposal_pdf.html:119 -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:66 +#: proposals/templates/proposals/proposal_pdf.html:120 msgid "E-mail" msgstr "E-mail" @@ -397,7 +396,7 @@ msgstr "Phase" #: reviews/templates/reviews/committee_members_workload.html:26 #: reviews/templates/reviews/vue_templates/decision_list.html:153 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:95 -#: reviews/templates/reviews/vue_templates/review_list.html:151 +#: reviews/templates/reviews/vue_templates/review_list.html:157 msgid "Datum ingediend" msgstr "Date submitted" @@ -405,7 +404,7 @@ msgstr "Date submitted" #: reviews/templates/reviews/committee_members_workload.html:27 #: reviews/templates/reviews/vue_templates/decision_list.html:163 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:105 -#: reviews/templates/reviews/vue_templates/review_list.html:161 +#: reviews/templates/reviews/vue_templates/review_list.html:167 msgid "Gewenste einddatum" msgstr "Desired end date" @@ -417,7 +416,7 @@ msgstr "My decision" #: main/templates/auth/user_detail.html:58 reviews/api/views.py:332 #: reviews/models.py:57 #: reviews/templates/reviews/vue_templates/decision_list.html:133 -#: reviews/templates/reviews/vue_templates/review_list.html:131 +#: reviews/templates/reviews/vue_templates/review_list.html:137 msgid "Afhandeling" msgstr "Conclusion" @@ -426,7 +425,7 @@ msgstr "Conclusion" msgid "Acties" msgstr "Actions" -#: main/templates/auth/user_detail.html:75 reviews/models.py:135 +#: main/templates/auth/user_detail.html:75 reviews/models.py:139 msgid ", met revisie" msgstr ", with revision" @@ -468,7 +467,7 @@ msgstr "Website export text" #: proposals/templates/proposals/proposal_confirmation.html:25 #: reviews/templates/reviews/vue_templates/decision_list.html:95 #: reviews/templates/reviews/vue_templates/review_list.html:88 -#: reviews/utils/review_actions.py:244 +#: reviews/utils/review_actions.py:245 msgid "Bevestigingsbrief versturen" msgstr "Send confirmation letter" @@ -537,27 +536,27 @@ msgid "Maak een amendement van een al goedgekeurde aanvraag" msgstr "Create an amendment to an already approved application" #: main/templates/base/menu.html:32 proposals/menus.py:56 -#: proposals/views/proposal_views.py:77 +#: proposals/views/proposal_views.py:78 msgid "Mijn conceptaanvragen" msgstr "My draft applications" #: main/templates/base/menu.html:35 proposals/menus.py:60 -#: proposals/views/proposal_views.py:127 +#: proposals/views/proposal_views.py:128 msgid "Mijn oefenaanvragen" msgstr "My practice applications" #: main/templates/base/menu.html:38 proposals/menus.py:64 -#: proposals/views/proposal_views.py:89 +#: proposals/views/proposal_views.py:90 msgid "Mijn ingediende aanvragen" msgstr "My submitted applications" #: main/templates/base/menu.html:41 proposals/menus.py:68 -#: proposals/views/proposal_views.py:101 +#: proposals/views/proposal_views.py:102 msgid "Mijn afgehandelde aanvragen" msgstr "My processed applications" #: main/templates/base/menu.html:44 proposals/menus.py:72 -#: proposals/views/proposal_views.py:113 +#: proposals/views/proposal_views.py:114 msgid "Mijn aanvragen als eindverantwoordelijke" msgstr "My supervised applications" @@ -566,7 +565,7 @@ msgid "Al mijn aanvragen" msgstr "All my applications" #: main/templates/base/menu.html:52 proposals/menus.py:110 -#: proposals/views/proposal_views.py:154 +#: proposals/views/proposal_views.py:155 msgid "Archief" msgstr "Archive" @@ -1154,7 +1153,7 @@ msgid "" msgstr "As might happen on forums where the researcher also has an account." #: observations/models.py:65 observations/models.py:75 -#: observations/models.py:88 proposals/models.py:747 studies/models.py:172 +#: observations/models.py:88 proposals/models.py:737 studies/models.py:172 #: studies/models.py:228 studies/models.py:358 msgid "Licht toe" msgstr "Explain" @@ -1238,8 +1237,7 @@ msgstr "How many hours of observation will take place on average per day?" #: observations/templates/observations/observation_form.html:7 #: observations/templates/observations/observation_form.html:44 -#: proposals/templates/proposals/proposal_pdf_empty.html:229 -#: proposals/utils/pdf_diff_logic.py:642 +#: proposals/utils/pdf_diff_logic.py:652 msgid "Het observatieonderzoek" msgstr "Observational study" @@ -1265,6 +1263,7 @@ msgstr "Recording behaviour" #: proposals/templates/proposals/proposal_update_attachments.html:7 #: proposals/templates/proposals/proposal_update_attachments.html:14 #: proposals/templates/proposals/proposal_update_attachments.html:25 +#: proposals/templates/proposals/proposal_update_date_start.html:7 #: studies/templates/studies/study_update_attachments.html:7 #: studies/templates/studies/study_update_attachments.html:14 #: studies/templates/studies/study_update_attachments.html:25 @@ -1307,7 +1306,7 @@ msgstr "Last edited" msgid "Datum ingediend bij eindverantwoordelijke" msgstr "Date sent to supervisor" -#: proposals/forms.py:42 proposals/models.py:221 +#: proposals/forms.py:43 proposals/models.py:221 msgid "" "Zijn er nog andere onderzoekers bij deze aanvraag betrokken die " "niet geaffilieerd zijn aan een van de onderzoeksinstituten " @@ -1316,19 +1315,19 @@ msgstr "" "Are there any other researchers involved outside the above-" "mentioned institutes? " -#: proposals/forms.py:63 proposals/forms.py:279 proposals/validators.py:25 +#: proposals/forms.py:64 proposals/forms.py:280 proposals/validators.py:25 msgid "Er bestaat al een aanvraag met deze titel." msgstr "There is an existing application with this title." -#: proposals/forms.py:133 +#: proposals/forms.py:134 msgid "Selecteer..." msgstr "Select..." -#: proposals/forms.py:140 +#: proposals/forms.py:141 msgid "Docent" msgstr "Professor" -#: proposals/forms.py:141 +#: proposals/forms.py:142 msgid "" "Vul hier de docent van de cursus in waarbinnen je deze portal moet " "doorlopen. De docent kan na afloop de aanvraag inkijken in de portal. De " @@ -1339,23 +1338,23 @@ msgstr "" "This application will not be published in the semipublic archive of the FEtC-" "H." -#: proposals/forms.py:192 +#: proposals/forms.py:193 msgid "Je dient een promotor/begeleider op te geven." msgstr "You are required to specify a promotor/supervisor." -#: proposals/forms.py:199 +#: proposals/forms.py:200 msgid "Je kunt niet jezelf als promotor/begeleider opgeven." msgstr "You cannot submit yourself as the promotor/supervisor." -#: proposals/forms.py:213 +#: proposals/forms.py:214 msgid "Je hebt jezelf niet als onderzoekers geselecteerd." msgstr "You have not selected yourself." -#: proposals/forms.py:218 +#: proposals/forms.py:219 msgid "Je hebt geen andere onderzoekers geselecteerd." msgstr "You have not selected any other researchers." -#: proposals/forms.py:228 +#: proposals/forms.py:229 msgid "" "Dit veld is verplicht, maar je kunt later terugkomen om " "hem verder in te vullen." @@ -1363,7 +1362,7 @@ msgstr "" "This field is required, but you may choose to come back to this page later " "to fill it in." -#: proposals/forms.py:238 +#: proposals/forms.py:239 msgid "" "Indien je geen toestemming hebt van een andere ethische commissie, dien je " "het normale formulier in te vullen. Ga terug naar de startpagina, en " @@ -1376,23 +1375,23 @@ msgstr "" "page, and select \"Submit a new application that is completely new in this " "portal\" or \"from a copy of an old application.\"" -#: proposals/forms.py:265 +#: proposals/forms.py:266 msgid "Ik maak een oefenaanvraag aan" msgstr "I am creating a practice application" -#: proposals/forms.py:285 proposals/models.py:538 +#: proposals/forms.py:286 proposals/models.py:538 msgid "Te kopiëren aanvraag" msgstr "Application to be copied" -#: proposals/forms.py:287 proposals/models.py:540 +#: proposals/forms.py:288 proposals/models.py:540 msgid "Dit veld toont enkel aanvragen waar je zelf een medeuitvoerende bent." msgstr "This field shows only applications in which you are involved." -#: proposals/forms.py:327 proposals/forms.py:362 +#: proposals/forms.py:328 proposals/forms.py:363 msgid "Je kan de titel van je aanvraag nu, indien nodig, wijzigen." msgstr "You can, if necessary, change the title of your application here." -#: proposals/forms.py:329 proposals/forms.py:364 +#: proposals/forms.py:330 proposals/forms.py:365 msgid "" "De titel die je hier opgeeft is zichtbaar voor de FETC-GW-leden en, wanneer " "de aanvraag is goedgekeurd, ook voor alle medewerkers die in het archief van " @@ -1402,11 +1401,11 @@ msgstr "" "application is approved, also to employees viewing the archive of this " "portal." -#: proposals/forms.py:336 +#: proposals/forms.py:337 msgid "Te reviseren aanvraag" msgstr "Application to be revised" -#: proposals/forms.py:337 +#: proposals/forms.py:338 msgid "" "Dit veld toont enkel ingediende, (nog) niet goedgekeurde aanvragen waar jij " "een medeuitvoerende bent." @@ -1414,69 +1413,69 @@ msgstr "" "This field only shows submitted applications that have not been approved " "(yet) in which you are involved." -#: proposals/forms.py:371 +#: proposals/forms.py:372 msgid "Te amenderen aanvraag" msgstr "Application to be amended" -#: proposals/forms.py:372 +#: proposals/forms.py:373 msgid "" "Dit veld toont enkel goedgekeurde aanvragen waar je zelf een medeuitvoerende " "bent." msgstr "This field shows only approved applications in which you are involved." -#: proposals/forms.py:427 proposals/forms.py:557 proposals/forms.py:681 +#: proposals/forms.py:428 proposals/forms.py:558 proposals/forms.py:691 msgid "Dit veld is verplicht om verder te gaan." msgstr "This field is required to continue." -#: proposals/forms.py:435 +#: proposals/forms.py:436 msgid "Je dient een instelling op te geven." msgstr "You are required to specify an institution." -#: proposals/forms.py:493 +#: proposals/forms.py:494 msgid "In dit geval is een beslissing van een METC vereist" msgstr "In this case, a decision by a METC is required" -#: proposals/forms.py:501 +#: proposals/forms.py:502 msgid "Naam traject 1" msgstr "Title of trajectory 1" -#: proposals/forms.py:503 +#: proposals/forms.py:504 msgid "Naam traject 2" msgstr "Title of trajectory 2" -#: proposals/forms.py:505 +#: proposals/forms.py:506 msgid "Naam traject 3" msgstr "Title of trajectory 3" -#: proposals/forms.py:507 +#: proposals/forms.py:508 msgid "Naam traject 4" msgstr "Title of trajectory 4" -#: proposals/forms.py:509 +#: proposals/forms.py:510 msgid "Naam traject 5" msgstr "Title of trajectory 5" -#: proposals/forms.py:511 +#: proposals/forms.py:512 msgid "Naam traject 6" msgstr "Title of trajectory 6" -#: proposals/forms.py:513 +#: proposals/forms.py:514 msgid "Naam traject 7" msgstr "Title of trajectory 7" -#: proposals/forms.py:515 +#: proposals/forms.py:516 msgid "Naam traject 8" msgstr "Title of trajectory 8" -#: proposals/forms.py:517 +#: proposals/forms.py:518 msgid "Naam traject 9" msgstr "Title of trajectory 9" -#: proposals/forms.py:519 +#: proposals/forms.py:520 msgid "Naam traject 10" msgstr "Title of trajectory 10" -#: proposals/forms.py:563 +#: proposals/forms.py:564 msgid "" "Als niet dezelfde trajecten worden doorlopen, moeten er minstens twee " "verschillende trajecten zijn." @@ -1484,15 +1483,19 @@ msgstr "" "If different trajectories are used, at least two different trajectories " "should be filled in." -#: proposals/forms.py:640 +#: proposals/forms.py:588 +msgid "Nieuwe beoogde startdatum" +msgstr "New intended start date" + +#: proposals/forms.py:650 msgid "Toestemmingsverklaring voor traject {} nog niet toegevoegd." msgstr "Declaration of consent for trajectory {} not yet added." -#: proposals/forms.py:644 +#: proposals/forms.py:654 msgid "Informatiebrief voor traject {} nog niet toegevoegd." msgstr "Information letter for trajectory {} not yet added." -#: proposals/forms.py:656 +#: proposals/forms.py:666 msgid "" "De embargo-periode kan maximaal 2 jaar zijn. Kies een datum binnen 2 jaar " "van vandaag." @@ -1500,7 +1503,7 @@ msgstr "" "The embargo-period can last a maximum of 2 years. Pick a date within 2 years " "from today." -#: proposals/forms.py:687 +#: proposals/forms.py:697 msgid "Vul in in welke talen de formulieren worden vertaald." msgstr "Please fill in the languages" @@ -1788,8 +1791,8 @@ msgstr "" "include it here. Supplying a DMP can expedite ethical assessment of " "proposals." -#: proposals/models.py:422 proposals/utils/pdf_diff_logic.py:980 -#: reviews/models.py:184 +#: proposals/models.py:422 proposals/utils/pdf_diff_logic.py:990 +#: reviews/models.py:188 msgid "Ruimte voor eventuele opmerkingen" msgstr "Space for possible comments" @@ -1923,19 +1926,19 @@ msgstr "Practice" msgid "Extern getoetst" msgstr "External approval" -#: proposals/models.py:732 +#: proposals/models.py:722 msgid "Geen beoordeling door METC noodzakelijk" msgstr "Assessment by METC not required" -#: proposals/models.py:733 +#: proposals/models.py:723 msgid "In afwachting beslissing METC" msgstr "Pending decision by METC" -#: proposals/models.py:734 +#: proposals/models.py:724 msgid "Beslissing METC geüpload" msgstr "METC decision uploaded" -#: proposals/models.py:738 +#: proposals/models.py:728 msgid "" "Vindt de dataverzameling plaats binnen het UMC Utrecht of andere instelling " "waar toetsing door een METC verplicht is gesteld?" @@ -1943,11 +1946,11 @@ msgstr "" "Will the data collection take place at the UMC Utrecht or another " "institution for which an assessment by a METC is required?" -#: proposals/models.py:752 +#: proposals/models.py:742 msgid "Welke instelling?" msgstr "Which institution?" -#: proposals/models.py:758 +#: proposals/models.py:748 msgid "" "Is de onderzoeksvraag medisch-wetenschappelijk van aard (zoals gedefinieerd " "door de WMO)?" @@ -1955,7 +1958,7 @@ msgstr "" "Is the nature of the research question medical (as defined by the Medical " "Research Involving Human Subjects Act (WMO))?" -#: proposals/models.py:760 +#: proposals/models.py:750 msgid "" "De definitie van medisch-wetenschappelijk onderzoek is: Medisch-" "wetenschappelijk onderzoek is onderzoek dat als doel heeft het beantwoorden " @@ -1976,7 +1979,7 @@ msgstr "" "Committee on Research Involving Human Subjects, Definition of medical " "research, 2005, ccmo.nl)" -#: proposals/models.py:776 +#: proposals/models.py:766 msgid "" "Je onderzoek moet beoordeeld worden door een METC, maar dient nog wel bij de " "FETC-GW te worden geregistreerd. Is dit onderzoek al aangemeld bij een METC?" @@ -1985,15 +1988,15 @@ msgstr "" "registered with the FEtC-H. Has an application for this project already been " "submitted to an METC?" -#: proposals/models.py:783 +#: proposals/models.py:773 msgid "Is de METC al tot een beslissing gekomen?" msgstr "Has the METC already come to a decision?" -#: proposals/models.py:788 +#: proposals/models.py:778 msgid "Upload hier de beslissing van het METC (in .pdf of .doc(x)-formaat)" msgstr "Please upload the decision of METC (in .pdf or .doc(x)-format) here" -#: proposals/models.py:826 +#: proposals/models.py:816 #, python-brace-format msgid "WMO {title}, status {status}" msgstr "WMO {title}, status {status}" @@ -2222,7 +2225,7 @@ msgstr "" "follow with regard to data." #: proposals/templates/proposals/proposal_data_management.html:24 -#: proposals/utils/pdf_diff_logic.py:954 +#: proposals/utils/pdf_diff_logic.py:964 #: reviews/templatetags/documents_list.py:245 msgid "Data Management Plan" msgstr "Data Management Plan" @@ -2371,9 +2374,6 @@ msgstr "" #: proposals/templates/proposals/proposal_form.html:76 #: proposals/templates/proposals/proposal_form_pre_approved.html:7 #: proposals/templates/proposals/proposal_form_pre_approved.html:81 -#: proposals/templates/proposals/proposal_pdf_empty.html:60 -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:69 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:59 #: proposals/utils/pdf_diff_logic.py:419 proposals/utils/proposal_utils.py:40 #: proposals/utils/proposal_utils.py:55 proposals/utils/validate_proposal.py:33 #: proposals/utils/validate_proposal.py:43 @@ -2516,7 +2516,6 @@ msgstr "" "the archive." #: proposals/templates/proposals/proposal_pdf.html:87 -#, python-format msgid "" "FETC-GW - %(title)s (referentienummer %(reference_number)s, " "ingediend door %(submitter)s)" @@ -2524,196 +2523,29 @@ msgstr "" "FEtC-H - %(title)s (reference number %(reference_number)s, " "submitted by %(submitter)s)" -#: proposals/templates/proposals/proposal_pdf.html:93 +#: proposals/templates/proposals/proposal_pdf.html:94 #, python-format msgid "%(type)s van referentienummer %(reference_number)s" msgstr "%(type)s of reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:109 +#: proposals/templates/proposals/proposal_pdf.html:110 #, python-format msgid "Referentienummer %(reference_number)s" msgstr "Reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:113 +#: proposals/templates/proposals/proposal_pdf.html:114 msgid "Huidige staat van de aanvraag" msgstr "Current state of the application" -#: proposals/templates/proposals/proposal_pdf.html:116 -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:60 +#: proposals/templates/proposals/proposal_pdf.html:117 msgid "Indiener" msgstr "Applicant" -#: proposals/templates/proposals/proposal_pdf.html:118 -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:63 +#: proposals/templates/proposals/proposal_pdf.html:119 #: tasks/templates/tasks/task_list.html:7 msgid "Naam" msgstr "Name" -#: proposals/templates/proposals/proposal_pdf_empty.html:42 -msgid "" -"\n" -" FETC-GW - naam aanvraag (referentienummer referentienummer)\n" -" " -msgstr "" -"\n" -" FEtC-H - application name (reference number reference " -"number)\n" -" " - -#: proposals/templates/proposals/proposal_pdf_empty.html:56 -msgid "" -"\n" -" Referentienummer referentienummer\n" -" " -msgstr "" -"\n" -" Reference number reference number\n" -" " - -#: proposals/templates/proposals/proposal_pdf_empty.html:104 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:110 -#: proposals/templates/proposals/wmo_form.html:7 -#: proposals/templates/proposals/wmo_form.html:30 -#: proposals/utils/pdf_diff_logic.py:478 -msgid "" -"Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" -msgstr "" -"Ethical assessment by a Medical Ethical Testing Committee (METC) required?" - -#: proposals/templates/proposals/proposal_pdf_empty.html:120 -#: proposals/templates/proposals/wmo_application.html:7 -#: proposals/templates/proposals/wmo_application.html:27 -#: proposals/utils/pdf_diff_logic.py:503 -msgid "Aanmelding bij de METC" -msgstr "Registration with the METC" - -#: proposals/templates/proposals/proposal_pdf_empty.html:134 -#: proposals/templates/proposals/study_start.html:7 -#: proposals/templates/proposals/study_start.html:64 -#: proposals/utils/pdf_diff_logic.py:511 -#: proposals/utils/validate_proposal.py:87 -msgid "Eén of meerdere trajecten?" -msgstr "One or more trajectories?" - -#: proposals/templates/proposals/proposal_pdf_empty.html:145 -#: proposals/utils/pdf_diff_logic.py:529 -#: studies/templates/studies/study_form.html:7 -#: studies/templates/studies/study_form.html:82 -msgid "De deelnemers" -msgstr "Participants" - -#: proposals/templates/proposals/proposal_pdf_empty.html:279 -#: proposals/utils/pdf_diff_logic.py:733 -#: studies/templates/studies/session_start.html:7 -#: studies/templates/studies/session_start.html:17 -#: tasks/templates/tasks/task_form.html:7 -#: tasks/templates/tasks/task_form.html:30 -#: tasks/templates/tasks/task_start.html:7 -#: tasks/templates/tasks/task_start.html:28 -msgid "Het takenonderzoek en interviews" -msgstr "Task-based research and interviews" - -#: proposals/templates/proposals/proposal_pdf_empty.html:286 -#: proposals/templates/proposals/proposal_start.html:62 -#: proposals/templates/proposals/proposal_start_practice.html:63 -#: proposals/templates/proposals/study_start.html:81 -msgid "Sessie" -msgstr "Session" - -#: proposals/templates/proposals/proposal_pdf_empty.html:304 -#: proposals/templates/proposals/proposal_start.html:69 -#: proposals/templates/proposals/proposal_start_practice.html:70 -#: proposals/templates/proposals/study_start.html:88 -msgid "Taak" -msgstr "Task" - -#: proposals/templates/proposals/proposal_pdf_empty.html:335 -#: proposals/utils/pdf_diff_logic.py:308 tasks/templates/tasks/task_end.html:7 -#: tasks/templates/tasks/task_end.html:18 -msgid "Overzicht van het takenonderzoek" -msgstr "Overview of task-based research" - -#: proposals/templates/proposals/proposal_pdf_empty.html:343 -#: proposals/utils/pdf_diff_logic.py:821 -#: studies/templates/studies/study_end.html:7 -#: studies/templates/studies/study_end.html:28 -msgid "Overzicht en eigen beoordeling van het gehele onderzoek" -msgstr "Overview and self-assessment of the entire study" - -#: proposals/templates/proposals/proposal_pdf_empty.html:372 -msgid "Informed consent formulieren voor het onderzoek" -msgstr "Informed consent forms for the study" - -#: proposals/templates/proposals/proposal_pdf_empty.html:389 -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:150 -#: proposals/templates/proposals/proposal_submit.html:181 -#: proposals/utils/pdf_diff_logic.py:962 -msgid "Aanmelding versturen" -msgstr "Submit application" - -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:42 -#, python-format -msgid "" -"\n" -" FETC-GW - Aanvraag elders al goedgekeurde aanvraag %(title)s " -"(referentienummer %(reference_number)s, ingediend door %(submitter)s)\n" -" " -msgstr "" -"\n" -" FEtC-H - Application for preapproved assessment %(title)s " -"(reference number %(reference_number)s, submitted by %(submitter)s)\n" -" " - -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:56 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:55 -#, python-format -msgid "" -"\n" -" Referentienummer %(reference_number)s\n" -" " -msgstr "" -"\n" -" Reference number %(reference_number)s\n" -" " - -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:92 -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:109 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:75 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:91 -#: tasks/templates/tasks/task_list.html:21 -msgid "ja,nee" -msgstr "yes,no" - -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:119 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:99 -msgid "onbekend" -msgstr "unknown" - -#: proposals/templates/proposals/proposal_pdf_pre_approved.html:143 -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:105 -#: proposals/utils/pdf_diff_logic.py:281 -msgid "Download" -msgstr "Download" - -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:41 -#, python-format -msgid "" -"\n" -" FETC-GW - Aanvraag voor voortoetsing %(title)s " -"(referentienummer %(reference_number)s, ingediend door %(submitter)s)\n" -" " -msgstr "" -"\n" -" FEtC-H - Application for preliminary assessment %(title)s " -"(reference number %(reference_number)s, submitted by %(submitter)s)\n" -" " - -#: proposals/templates/proposals/proposal_pdf_pre_assessment.html:130 -#: proposals/templates/proposals/proposal_submit.html:175 -msgid "Aanvraag voor voortoetsing versturen" -msgstr "Submit application for preliminary assessment" - #: proposals/templates/proposals/proposal_public_archive.html:8 #: proposals/templates/proposals/proposal_public_archive.html:14 msgid "Goedgekeurde aanvragen" @@ -2828,6 +2660,12 @@ msgstr "" "For example: parents of children up to 15 years of age, teachers, or " "an experimental and control group that receive significantly different tasks." +#: proposals/templates/proposals/proposal_start.html:62 +#: proposals/templates/proposals/proposal_start_practice.html:63 +#: proposals/templates/proposals/study_start.html:81 +msgid "Sessie" +msgstr "Session" + #: proposals/templates/proposals/proposal_start.html:63 #: proposals/templates/proposals/proposal_start_practice.html:64 #: proposals/templates/proposals/study_start.html:82 @@ -2835,6 +2673,12 @@ msgid "Alle taken/onderdelen die iemand op één dag uitvoert." msgstr "" "All tasks or procedures that a participant completes in a day combined. " +#: proposals/templates/proposals/proposal_start.html:69 +#: proposals/templates/proposals/proposal_start_practice.html:70 +#: proposals/templates/proposals/study_start.html:88 +msgid "Taak" +msgstr "Task" + #: proposals/templates/proposals/proposal_start.html:70 #: proposals/templates/proposals/proposal_start_practice.html:71 #: proposals/templates/proposals/study_start.html:89 @@ -3103,6 +2947,10 @@ msgstr "" "The intended start date can be edited on this " "page." +#: proposals/templates/proposals/proposal_submit.html:175 +msgid "Aanvraag voor voortoetsing versturen" +msgstr "Submit application for preliminary assessment" + #: proposals/templates/proposals/proposal_submit.html:177 msgid "Terug naar beoordeling >>" msgstr "Back to review >>" @@ -3111,6 +2959,11 @@ msgstr "Back to review >>" msgid "Concept-aanmelding versturen" msgstr "Submit draft application" +#: proposals/templates/proposals/proposal_submit.html:181 +#: proposals/utils/pdf_diff_logic.py:972 +msgid "Aanmelding versturen" +msgstr "Submit application" + #: proposals/templates/proposals/proposal_submitted.html:8 #: proposals/templates/proposals/proposal_submitted.html:22 msgid "Aanvraag voor voortoetsing verstuurd" @@ -3160,6 +3013,26 @@ msgstr "" "On this page you can edit the forms related to the proposal " "%(title)s(reference number %(ref_number)s)" +#: proposals/templates/proposals/proposal_update_date_start.html:14 +#: proposals/templates/proposals/proposal_update_date_start.html:28 +msgid "Startdatum aanpassen" +msgstr "Edit start date" + +#: proposals/templates/proposals/proposal_update_date_start.html:17 +#, python-format +msgid "" +"Op deze pagina kan de startdatum worden aangepast van de aanvraag %(title)s " +"(referentienummer %(ref_number)s). Let op! Als de review al " +"is afgerond, wordt de nieuwe startdatum niet automatisch weergegeven in de " +"PDF. Mocht je de PDF opnieuw willen genereren, neem hierover dan contact op " +"met" +msgstr "" +"On this page, the start date of proposal %(title)s (reference number " +"%(ref_number)s) can be edited. Note! If the review has " +"already been concluded, the new start date will not be displayed in the PDF. " +"If you would like the PDF to be generated with the new start date, please " +"reach out to " + #: proposals/templates/proposals/study_consent.html:27 msgid "Toestemmingsverklaring van de schoolleider/hoofd van het departement" msgstr "Informed consent school director/ head of the institution" @@ -3233,6 +3106,13 @@ msgstr "Add additional forms" msgid "Extra formulieren" msgstr "Additional forms" +#: proposals/templates/proposals/study_start.html:7 +#: proposals/templates/proposals/study_start.html:64 +#: proposals/utils/pdf_diff_logic.py:521 +#: proposals/utils/validate_proposal.py:87 +msgid "Eén of meerdere trajecten?" +msgstr "One or more trajectories?" + #: proposals/templates/proposals/study_start.html:13 msgid "" "Geef elk traject hieronder een behulpzame naam van maximaal 15 karakters." @@ -3323,7 +3203,7 @@ msgstr "Route:" #: proposals/templates/proposals/vue_templates/proposal_list.html:187 #: reviews/templates/reviews/vue_templates/decision_list.html:185 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:128 -#: reviews/templates/reviews/vue_templates/review_list.html:184 +#: reviews/templates/reviews/vue_templates/review_list.html:190 msgid "Indieners" msgstr "Applicants" @@ -3344,10 +3224,16 @@ msgstr "Hide" #: proposals/templates/proposals/vue_templates/proposal_list.html:139 #: reviews/templates/reviews/vue_templates/decision_list.html:141 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:83 -#: reviews/templates/reviews/vue_templates/review_list.html:139 +#: reviews/templates/reviews/vue_templates/review_list.html:145 msgid "Revisie/amendement van" msgstr "Revision/amendment of" +#: proposals/templates/proposals/wmo_application.html:7 +#: proposals/templates/proposals/wmo_application.html:27 +#: proposals/utils/pdf_diff_logic.py:513 +msgid "Aanmelding bij de METC" +msgstr "Registration with the METC" + #: proposals/templates/proposals/wmo_application.html:33 msgid "" "Zolang je aanvraag nog niet is beoordeeld door de METC, kan je niet verder " @@ -3365,6 +3251,14 @@ msgstr "WMO check" msgid "Opnieuw beginnen" msgstr "Start again" +#: proposals/templates/proposals/wmo_form.html:7 +#: proposals/templates/proposals/wmo_form.html:30 +#: proposals/utils/pdf_diff_logic.py:488 +msgid "" +"Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" +msgstr "" +"Ethical assessment by a Medical Ethical Testing Committee (METC) required?" + #: proposals/utils/pdf_diff_logic.py:93 msgid "" "Dit onderdeel is nieuw in de revisie en bestond niet in de originele " @@ -3380,14 +3274,23 @@ msgstr "" "This section was present in the original application, but was removed for " "the revision." -#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:126 +#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:130 msgid "Onbekend" msgstr "Unknown" +#: proposals/utils/pdf_diff_logic.py:281 +msgid "Download" +msgstr "Download" + #: proposals/utils/pdf_diff_logic.py:284 msgid "Niet aangeleverd" msgstr "Not provided" +#: proposals/utils/pdf_diff_logic.py:308 tasks/templates/tasks/task_end.html:7 +#: tasks/templates/tasks/task_end.html:18 +msgid "Overzicht van het takenonderzoek" +msgstr "Overview of task-based research" + #: proposals/utils/pdf_diff_logic.py:321 proposals/utils/pdf_diff_logic.py:348 #: proposals/utils/pdf_diff_logic.py:357 proposals/utils/pdf_diff_logic.py:381 msgid "Traject " @@ -3405,7 +3308,29 @@ msgstr "Session " msgid ", taak " msgstr ", task " -#: proposals/utils/pdf_diff_logic.py:930 +#: proposals/utils/pdf_diff_logic.py:539 +#: studies/templates/studies/study_form.html:7 +#: studies/templates/studies/study_form.html:82 +msgid "De deelnemers" +msgstr "Participants" + +#: proposals/utils/pdf_diff_logic.py:743 +#: studies/templates/studies/session_start.html:7 +#: studies/templates/studies/session_start.html:17 +#: tasks/templates/tasks/task_form.html:7 +#: tasks/templates/tasks/task_form.html:30 +#: tasks/templates/tasks/task_start.html:7 +#: tasks/templates/tasks/task_start.html:28 +msgid "Het takenonderzoek en interviews" +msgstr "Task-based research and interviews" + +#: proposals/utils/pdf_diff_logic.py:831 +#: studies/templates/studies/study_end.html:7 +#: studies/templates/studies/study_end.html:28 +msgid "Overzicht en eigen beoordeling van het gehele onderzoek" +msgstr "Overview and self-assessment of the entire study" + +#: proposals/utils/pdf_diff_logic.py:940 msgid "Extra formulieren " msgstr "Additional forms " @@ -3495,40 +3420,40 @@ msgstr "" "You must confirm your understanding of the AVG before you can submit your " "application." -#: proposals/views/proposal_views.py:44 +#: proposals/views/proposal_views.py:45 msgid "Publiek archief" msgstr "Public archive" -#: proposals/views/proposal_views.py:45 +#: proposals/views/proposal_views.py:46 msgid "Dit overzicht toont alle goedgekeurde aanvragen." msgstr "This overview shows all approved applications." -#: proposals/views/proposal_views.py:64 +#: proposals/views/proposal_views.py:65 msgid "Mijn aanvraag" msgstr "My application" -#: proposals/views/proposal_views.py:65 +#: proposals/views/proposal_views.py:66 msgid "Dit overzicht toont al je aanvragen." msgstr "This overview shows all your applications." -#: proposals/views/proposal_views.py:78 +#: proposals/views/proposal_views.py:79 msgid "Dit overzicht toont al je nog niet ingediende aanvragen." msgstr "This overview shows all the applications you have not yet submitted." -#: proposals/views/proposal_views.py:90 +#: proposals/views/proposal_views.py:91 msgid "Dit overzicht toont al je ingediende aanvragen." msgstr "This overview shows all the applications you have submitted." -#: proposals/views/proposal_views.py:102 +#: proposals/views/proposal_views.py:103 msgid "Dit overzicht toont al je beoordeelde aanvragen." msgstr "This overview shows all your applications that have been assessed." -#: proposals/views/proposal_views.py:115 +#: proposals/views/proposal_views.py:116 msgid "" "Dit overzicht toont alle aanvragen waarvan je eindverantwoordelijke bent." msgstr "This overview shows all your supervised applications." -#: proposals/views/proposal_views.py:128 +#: proposals/views/proposal_views.py:129 msgid "" "Dit overzicht toont alle oefenaanvragen waar je als student, onderzoeker of " "eindverantwoordelijke bij betrokken bent." @@ -3536,15 +3461,15 @@ msgstr "" "This overview shows all practice applications in which you are involved as a " "student, researcher or accountable researcher." -#: proposals/views/proposal_views.py:247 +#: proposals/views/proposal_views.py:248 msgid "Aanvraag verwijderd" msgstr "Application deleted" -#: proposals/views/proposal_views.py:385 +#: proposals/views/proposal_views.py:398 msgid "Wijzigingen opgeslagen" msgstr "Changes saved" -#: proposals/views/proposal_views.py:486 +#: proposals/views/proposal_views.py:499 msgid "Aanvraag gekopieerd" msgstr "Application copied" @@ -3585,7 +3510,7 @@ msgstr "Stage" #: reviews/api/views.py:35 reviews/api/views.py:324 reviews/models.py:45 #: reviews/templates/reviews/vue_templates/decision_list.html:178 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:121 -#: reviews/templates/reviews/vue_templates/review_list.html:177 +#: reviews/templates/reviews/vue_templates/review_list.html:183 msgid "Route" msgstr "Route" @@ -3593,11 +3518,11 @@ msgstr "Route" msgid "Start datum" msgstr "Start date review" -#: reviews/forms.py:14 reviews/models.py:142 +#: reviews/forms.py:14 reviews/models.py:146 msgid "korte (2-weken) route" msgstr "short (2-week) route" -#: reviews/forms.py:15 reviews/models.py:141 +#: reviews/forms.py:15 reviews/models.py:145 msgid "lange (4-weken) route" msgstr "long (4-week) route" @@ -3697,24 +3622,24 @@ msgstr "Post hoc negative advice by FETC-H" msgid "Niet verder in behandeling genomen" msgstr "Not to be assessed further" -#: reviews/models.py:51 reviews/models.py:178 +#: reviews/models.py:51 reviews/models.py:182 #: reviews/templates/reviews/review_table.html:9 msgid "Beslissing" msgstr "Decision" -#: reviews/models.py:143 +#: reviews/models.py:147 msgid "nog geen route" msgstr "no route assigned" -#: reviews/models.py:172 +#: reviews/models.py:176 msgid "goedgekeurd" msgstr "endorsed" -#: reviews/models.py:173 +#: reviews/models.py:177 msgid "niet goedgekeurd" msgstr "not endorsed" -#: reviews/models.py:174 +#: reviews/models.py:178 msgid "revisie noodzakelijk" msgstr "revision necessary" @@ -4314,7 +4239,7 @@ msgid "Verplaats naar andere kamer" msgstr "Move study to different reviewing chamber" #: reviews/templates/reviews/vue_templates/review_list.html:95 -#: reviews/utils/review_actions.py:281 +#: reviews/utils/review_actions.py:282 msgid "Verberg aanvraag uit het archief" msgstr "Remove this application from the archive" @@ -4322,6 +4247,10 @@ msgstr "Remove this application from the archive" msgid "Plaats aanvraag in archief" msgstr "Add this application to the archive" +#: reviews/templates/reviews/vue_templates/review_list.html:122 +msgid "Reviewronde beëindigd: " +msgstr "Reviewing round ended: " + #: reviews/templatetags/documents_list.py:145 msgid "Hoofdtraject" msgstr "Main trajectory" @@ -4378,85 +4307,89 @@ msgstr "Information letter for the parents" msgid "Toestemmingsdocument observatie" msgstr "Consent document for observation" -#: reviews/utils/review_actions.py:129 +#: reviews/utils/review_actions.py:130 msgid "Geef jouw beslissing en/of commentaar door" msgstr "Provide feedback on this proposal" -#: reviews/utils/review_actions.py:155 +#: reviews/utils/review_actions.py:156 msgid "Deze aanvraag afsluiten" msgstr "Conclude this application" -#: reviews/utils/review_actions.py:185 +#: reviews/utils/review_actions.py:186 msgid "Beëindig definitief de afhandeling van deze aanvraag" msgstr "Discontinue assessment of this application" -#: reviews/utils/review_actions.py:215 +#: reviews/utils/review_actions.py:216 msgid "Verander aangestelde commissieleden" msgstr "Change appointment of committee members" -#: reviews/utils/review_actions.py:245 +#: reviews/utils/review_actions.py:246 msgid "Datum van bevestigingsbrief aanpassen" msgstr "Change date of confirmation letter" -#: reviews/utils/review_actions.py:283 +#: reviews/utils/review_actions.py:284 msgid "Plaats aanvraag in het archief." msgstr "Add this application to the archive" -#: reviews/utils/review_utils.py:54 +#: reviews/utils/review_actions.py:304 +msgid "Startdatum wijzigen" +msgstr "Edit start date" + +#: reviews/utils/review_utils.py:55 msgid "FETC-GW {}: bevestiging indienen concept-aanmelding" msgstr "FEtC-H {}: confirmation of draft application submission" -#: reviews/utils/review_utils.py:74 +#: reviews/utils/review_utils.py:75 msgid "FETC-GW {}: beoordelen als eindverantwoordelijke" msgstr "FEtC-H {}: assess as researcher with final responsibility" -#: reviews/utils/review_utils.py:124 +#: reviews/utils/review_utils.py:125 msgid "FETC-GW {}: aanmelding ontvangen" msgstr "FEtC-H {}: application received" -#: reviews/utils/review_utils.py:218 +#: reviews/utils/review_utils.py:219 msgid "FETC-GW {}: nieuwe aanvraag voor voortoetsing" msgstr "FEtC-H {}: new application for preliminary assessment" -#: reviews/utils/review_utils.py:232 +#: reviews/utils/review_utils.py:233 msgid "FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing" msgstr "" "FEtC-H {}: confirmation of submission of application for preliminary " "assessment" -#: reviews/utils/review_utils.py:281 +#: reviews/utils/review_utils.py:282 msgid "FETC-GW {}: nieuwe aanvraag ingediend" msgstr "FEtC-H {}: new application submitted" -#: reviews/utils/review_utils.py:296 +#: reviews/utils/review_utils.py:297 msgid "FETC-GW {}: nieuwe beoordeling toegevoegd" msgstr "FEtC-H {}: new decision added" -#: reviews/utils/review_utils.py:312 +#: reviews/utils/review_utils.py:313 msgid "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld" msgstr "FEtC-H {}: a supervisor has reviewed your application" -#: reviews/utils/review_utils.py:338 +#: reviews/utils/review_utils.py:339 msgid "De aanvraag bevat het gebruik van wilsonbekwame volwassenen." msgstr "" "The application contains the participation of adults incapable of informed " "consent." -#: reviews/utils/review_utils.py:341 +#: reviews/utils/review_utils.py:342 msgid "De aanvraag bevat het gebruik van misleiding." msgstr "The application contains the use of misrepresentation." -#: reviews/utils/review_utils.py:344 +#: reviews/utils/review_utils.py:345 msgid "" "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" msgstr "" "A hierarchal relationship between researcher(s) and participant(s) exists." -#: reviews/utils/review_utils.py:347 +#: reviews/utils/review_utils.py:348 msgid "Het onderzoek verzamelt bijzondere persoonsgegevens." msgstr "This study collects special or sensitive personal details." -#: reviews/utils/review_utils.py:350 +#: reviews/utils/review_utils.py:351 msgid "" "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht " "verhoogde kwetsbaarheid met zich meebrengen." @@ -4464,7 +4397,7 @@ msgstr "" "The study selects participants based on particular characteristics which " "might entail increased vulnerability." -#: reviews/utils/review_utils.py:356 +#: reviews/utils/review_utils.py:357 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op " "onderdelen of als geheel zodanig belastend is dat deze ondanks de verkregen " @@ -4474,7 +4407,7 @@ msgstr "" "study, in part or in its entirety, is so burdensome that despite acquiring " "informed consent it might raise questions." -#: reviews/utils/review_utils.py:360 +#: reviews/utils/review_utils.py:361 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op " "psychische of fysieke schade bij deelname aan het onderzoek meer dan " @@ -4484,7 +4417,7 @@ msgstr "" "psychological or physical harm in participating in the study are more than " "minimal." -#: reviews/utils/review_utils.py:367 +#: reviews/utils/review_utils.py:368 #, python-brace-format msgid "" "De totale duur van de taken in sessie {s}, exclusief pauzes en andere niet-" @@ -4495,14 +4428,14 @@ msgstr "" "non-task elements ({d} minutes) is greater than the task duration limit " "({max_d} minutes) for the age group {ag}." -#: reviews/utils/review_utils.py:384 +#: reviews/utils/review_utils.py:385 #, python-brace-format msgid "Het onderzoek observeert deelnemers in de volgende setting: {s}" msgstr "" "The application contains sessions with participants in the following " "setting: {s}" -#: reviews/utils/review_utils.py:388 +#: reviews/utils/review_utils.py:389 msgid "" "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met " "informed consent achteraf." @@ -4510,7 +4443,7 @@ msgstr "" "The study observes participants in a non-public space and works with " "retrospective informed consent." -#: reviews/utils/review_utils.py:390 +#: reviews/utils/review_utils.py:391 msgid "" "De onderzoeker begeeft zich \"under cover\" in een beheerde niet-publieke " "ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie " @@ -4520,11 +4453,11 @@ msgstr "" "(e.g. a digital discussion group), and takes part actively in the discussion " "and/or collects data which can be traced back to individuals." -#: reviews/utils/review_utils.py:395 +#: reviews/utils/review_utils.py:396 msgid "De aanvraag bevat het gebruik van {}" msgstr "The application makes use of {}" -#: reviews/utils/review_utils.py:416 +#: reviews/utils/review_utils.py:417 msgid "" "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." msgstr "" @@ -5633,6 +5566,10 @@ msgstr "Net duration (in minutes)" msgid "Feedback?" msgstr "Feedback?" +#: tasks/templates/tasks/task_list.html:21 +msgid "ja,nee" +msgstr "yes,no" + #: tasks/templates/tasks/task_list.html:27 msgid "Taak bewerken" msgstr "Edit task" @@ -5702,146 +5639,3 @@ msgstr "Task edited" #: tasks/views/task_views.py:50 msgid "Taak verwijderd" msgstr "Task deleted" - -#: proposals/forms.py:190 -msgid "Je dient een eindverantwoordelijke op te geven." -msgstr "You are required to specify the researcher with final responsibility." - -#: proposals/forms.py:579 -msgid "Nieuwe beoogde startdatum" -msgstr "New intended start date" - -#: proposals/models.py:517 -#: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 -#: proposals/templates/proposals/vue_templates/proposal_list.html:166 -msgid "Eindverantwoordelijke onderzoeker" -msgstr "Researcher with final responsibility" - -#: proposals/templates/proposals/proposal_update_date_start.html:14 -#: proposals/templates/proposals/proposal_update_date_start.html:28 -msgid "Startdatum aanpassen" -msgstr "Edit start date" - -#: proposals/templates/proposals/proposal_update_date_start.html:17 -msgid "" -"Op deze pagina kan de startdatum worden aangepast van de aanvraag %(title)s " -"(referentienummer %(ref_number)s). Let op! Als de review al " -"is afgerond, wordt de nieuwe startdatum niet automatisch weergegeven in de " -"PDF. Mocht je de PDF opnieuw willen genereren, neem hierover dan contact op " -"met" -msgstr "" -"On this page, the start date of proposal %(title)s (reference number " -"%(ref_number)s) can be edited. Note! If the review has " -"already been concluded, the new start date will not be displayed in the PDF. " -"If you would like the PDF to be generated with the new start date, please " -"reach out to " - -#: reviews/templates/reviews/vue_templates/review_list.html:122 -msgid "Reviewronde beëindigd: " -msgstr "Reviewing round ended: " - -#: reviews/utils/review_actions.py:304 -msgid "Startdatum wijzigen" -msgstr "Edit start date" - -#~ msgid "" -#~ "De revisie bevat interventieonderzoek, terwijl de originele aanvraag dat " -#~ "niet bevat." -#~ msgstr "" -#~ "This revision involves intervention research, whereas the original " -#~ "application does not." - -#~ msgid "" -#~ "De revisie bevat geen interventieonderzoek, terwijl de originele aanvraag " -#~ "dat wel bevat." -#~ msgstr "" -#~ "This revision does not involve intervention research, whereas the " -#~ "original application does include this." - -#~ msgid "" -#~ "De revisie en de originele aanvraag hebben beide een " -#~ "interventieonderzoek, maar deze zijn niet te vergelijken. Dit komt " -#~ "doordat de revisie een andere versie van het formulier gebruikt." -#~ msgstr "" -#~ "This revision and the original application both involve intervention " -#~ "research, but this aspect cannot be compared. The revision uses a newer " -#~ "version of the form than the original." - -#~ msgid "ja,nee," -#~ msgstr "yes,no," - -#~ msgid "" -#~ "De revisie bevat observatieonderzoek, terwijl de originele aanvraag dat " -#~ "niet bevat." -#~ msgstr "" -#~ "This revision involves observation research, whereas the original " -#~ "application does not." - -#~ msgid "" -#~ "De revisie bevat geen observatieonderzoek, terwijl de originele aanvraag " -#~ "dat wel bevat." -#~ msgstr "" -#~ "This revision does not involve intervention research, whereas the " -#~ "original application involve this." - -#~ msgid "" -#~ "De revisie en de originele aanvraag hebben beide een observatieonderzoek, " -#~ "maar deze zijn niet te vergelijken. Dit komt doordat de revisie een " -#~ "andere versie van het formulier gebruikt." -#~ msgstr "" -#~ "This revision and the original application both involve observation " -#~ "research, but this aspect cannot be compared. The revision uses a newer " -#~ "version of the form than the original." - -#~ msgid "" -#~ "De revisie bevat takenonderzoek, terwijl de originele aanvraag dat niet " -#~ "bevat." -#~ msgstr "" -#~ "This revision involves tasks research, whereas the original application " -#~ "does not." - -#~ msgid "" -#~ "De revisie bevat geen takenonderzoek, terwijl de originele aanvraag dat " -#~ "wel bevat." -#~ msgstr "" -#~ "This revision does not involve tasks research, whereas the original " -#~ "application does involve this." - -#~ msgid "Dit traject is nieuw in de revisie." -#~ msgstr "This trajectory was added in this revision." - -#~ msgid "Dit traject is weggehaald uit de revisie" -#~ msgstr "This trajectory was removed in this revision." - -#, python-format -#~ msgid "" -#~ "Klik hier om opnieuw in te loggen met je " -#~ "Solis-ID." -#~ msgstr "" -#~ "Click here to log in again with your Solis-" -#~ "ID." - -#~ msgid "" -#~ "Aan het einde van de procedure kan je deze aanvraag ter\n" -#~ " verificatie naar je eindverantwoordelijke sturen. De\n" -#~ " eindverantwoordelijke zal de aanvraag vervolgens kunnen aanpassen " -#~ "en\n" -#~ " indienen bij de FETC-GW.

    NB: als je je\n" -#~ " eindverantwoordelijke niet kunt vinden met dit veld, moeten zij\n" -#~ " waarschijnlijk eerst één keer inloggen in deze portal. Je kunt " -#~ "nog wel\n" -#~ " verder met de aanvraag, maar vergeet dit veld niet in te vullen " -#~ "voor je de\n" -#~ " aanvraag indient." -#~ msgstr "" -#~ "At the end of the procedure, you can send this application to the " -#~ "researcher with final responsibility for verification. The researcher " -#~ "with final responsibility can then make adjustments and submit the study " -#~ "to the FEtC-H. Note: if you cannot find your supervisor " -#~ "using this field, they may have to log into this portal at least once " -#~ "with their Solis-ID. You can continue filling in the application while " -#~ "you wait for them to do this, but remember to come back and fill in this " -#~ "field before submitting." - -#~ msgid "Werkverdeling overzicht van afgelopen jaar" -#~ msgstr "Workload overview of past year" diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index ec5b1216f..d88eb9442 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -87,6 +87,7 @@ {% blocktrans with title=proposal.title reference_number=proposal.reference_number submitter=proposal.created_by.get_full_name trimmed %} FETC-GW - {{ title }} (referentienummer {{ reference_number }}, ingediend door {{ submitter }}) {% endblocktrans %} + - {% trans proposal.reviewing_committee.name %} {% if proposal.is_revision %}
    From c3c459e2336da0708181fd288e2ae4d7fa599272 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 15 Nov 2023 12:10:25 +0100 Subject: [PATCH 081/148] fixes #491 --- locale/en/LC_MESSAGES/django.mo | Bin 147361 -> 147299 bytes locale/en/LC_MESSAGES/django.po | 112 +++++++++--------- proposals/forms.py | 12 +- .../0050_alter_proposal_avg_understood.py | 19 +++ proposals/models.py | 7 +- proposals/utils/pdf_diff_logic.py | 2 +- proposals/validators.py | 8 +- 7 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 proposals/migrations/0050_alter_proposal_avg_understood.py diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 6b35444f66f139c54d711693a57edd18b9963a2f..eba2b348e36c7f4aaa3e8f23c90f91674b9f1bff 100644 GIT binary patch delta 11023 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\n" "Language-Team: \n" @@ -282,7 +282,7 @@ msgstr "Intervention saved" #: main/forms/conditional_form.py:11 main/forms/conditional_form.py:20 #: main/forms/conditional_form.py:29 main/forms/conditional_form.py:38 #: main/forms/conditional_form.py:48 main/forms/mixins.py:83 -#: proposals/forms.py:570 proposals/forms.py:643 proposals/forms.py:658 +#: proposals/forms.py:570 proposals/forms.py:653 proposals/forms.py:668 #: studies/forms.py:104 tasks/forms.py:87 msgid "Dit veld is verplicht." msgstr "This field is required." @@ -1153,7 +1153,7 @@ msgid "" msgstr "As might happen on forums where the researcher also has an account." #: observations/models.py:65 observations/models.py:75 -#: observations/models.py:88 proposals/models.py:737 studies/models.py:172 +#: observations/models.py:88 proposals/models.py:738 studies/models.py:172 #: studies/models.py:228 studies/models.py:358 msgid "Licht toe" msgstr "Explain" @@ -1379,11 +1379,11 @@ msgstr "" msgid "Ik maak een oefenaanvraag aan" msgstr "I am creating a practice application" -#: proposals/forms.py:286 proposals/models.py:538 +#: proposals/forms.py:286 proposals/models.py:539 msgid "Te kopiëren aanvraag" msgstr "Application to be copied" -#: proposals/forms.py:288 proposals/models.py:540 +#: proposals/forms.py:288 proposals/models.py:541 msgid "Dit veld toont enkel aanvragen waar je zelf een medeuitvoerende bent." msgstr "This field shows only applications in which you are involved." @@ -1423,7 +1423,8 @@ msgid "" "bent." msgstr "This field shows only approved applications in which you are involved." -#: proposals/forms.py:428 proposals/forms.py:558 proposals/forms.py:691 +#: proposals/forms.py:428 proposals/forms.py:558 proposals/forms.py:587 +#: proposals/forms.py:701 msgid "Dit veld is verplicht om verder te gaan." msgstr "This field is required to continue." @@ -1483,19 +1484,19 @@ msgstr "" "If different trajectories are used, at least two different trajectories " "should be filled in." -#: proposals/forms.py:588 +#: proposals/forms.py:598 msgid "Nieuwe beoogde startdatum" msgstr "New intended start date" -#: proposals/forms.py:650 +#: proposals/forms.py:660 msgid "Toestemmingsverklaring voor traject {} nog niet toegevoegd." msgstr "Declaration of consent for trajectory {} not yet added." -#: proposals/forms.py:654 +#: proposals/forms.py:664 msgid "Informatiebrief voor traject {} nog niet toegevoegd." msgstr "Information letter for trajectory {} not yet added." -#: proposals/forms.py:666 +#: proposals/forms.py:676 msgid "" "De embargo-periode kan maximaal 2 jaar zijn. Kies een datum binnen 2 jaar " "van vandaag." @@ -1503,7 +1504,7 @@ msgstr "" "The embargo-period can last a maximum of 2 years. Pick a date within 2 years " "from today." -#: proposals/forms.py:697 +#: proposals/forms.py:707 msgid "Vul in in welke talen de formulieren worden vertaald." msgstr "Please fill in the languages" @@ -1775,13 +1776,13 @@ msgstr "How many different trajectories are there?" #: proposals/models.py:403 msgid "" -"Ik heb kennis genomen van het bovenstaande en begrijp mijn " -"verantwoordelijkheden ten opzichte van de AVG." +"Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de " +"privacy officer." msgstr "" -"I have read the information above and have considered my responsibilities " -"with regard to the AVG." +"I discussed my application and documents for participants with the " +"privacy officer." -#: proposals/models.py:410 +#: proposals/models.py:411 msgid "" "Als je een Data Management Plan hebt voor deze aanvraag, kan je kiezen om " "deze hier bij te voegen. Het aanleveren van een DMP vergemakkelijkt het " @@ -1791,24 +1792,24 @@ msgstr "" "include it here. Supplying a DMP can expedite ethical assessment of " "proposals." -#: proposals/models.py:422 proposals/utils/pdf_diff_logic.py:990 +#: proposals/models.py:423 proposals/utils/pdf_diff_logic.py:990 #: reviews/models.py:188 msgid "Ruimte voor eventuele opmerkingen" msgstr "Space for possible comments" -#: proposals/models.py:434 +#: proposals/models.py:435 msgid "Datum bevestigingsbrief verstuurd" msgstr "Date confirmation sent" -#: proposals/models.py:439 reviews/forms.py:110 +#: proposals/models.py:440 reviews/forms.py:110 msgid "Is er een revisie geweest na het indienen van deze aanvraag?" msgstr "Has this proposal been amended after it was submitted?" -#: proposals/models.py:444 +#: proposals/models.py:445 msgid "Leg uit" msgstr "Explain why" -#: proposals/models.py:450 +#: proposals/models.py:451 msgid "" "Wat zijn de belangrijkste ethische kwesties in dit onderzoek en beschrijf " "kort hoe ga je daarmee omgaat. Gebruik maximaal 1000 woorden." @@ -1817,23 +1818,23 @@ msgstr "" "please describe briefly how you will address them. Use a maximum of a 1000 " "words." -#: proposals/models.py:464 +#: proposals/models.py:465 msgid "In welke hoedanigheid ben je betrokken bij dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:472 +#: proposals/models.py:473 msgid "Wat is je studierichting?" msgstr "What is your course of study?" -#: proposals/models.py:479 +#: proposals/models.py:480 msgid "In welke context doe je dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:486 +#: proposals/models.py:487 msgid "Namelijk:" msgstr "Please specify:" -#: proposals/models.py:493 +#: proposals/models.py:494 msgid "" "Studenten (die mensgebonden onderzoek uitvoeren binnen hun studieprogramma) " "hoeven in principe geen aanvraag in te dienen bij de FETC-GW. Bespreek met " @@ -1847,7 +1848,7 @@ msgstr "" "do not not, you can terminate your proposal now. If you do, please explain " "what the reason is:" -#: proposals/models.py:510 +#: proposals/models.py:511 msgid "" "Uitvoerenden, inclusief uzelf. Let op! De andere onderzoekers moeten " "ten minste één keer zijn ingelogd op dit portaal om ze te kunnen selecteren." @@ -1856,13 +1857,13 @@ msgstr "" "researchers need to have logged into this portal at least once, in order to " "be selectable here." -#: proposals/models.py:517 +#: proposals/models.py:518 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 #: proposals/templates/proposals/vue_templates/proposal_list.html:166 msgid "Promotor/Begeleider" msgstr "Promotor/Supervisor" -#: proposals/models.py:520 +#: proposals/models.py:521 msgid "" "Je aanvraag moet, als je alles hebt ingevuld, via de portal \n" " naar je promotor of begeleider gestuurd worden. Deze " @@ -1892,53 +1893,53 @@ msgstr "" "you wait for them to do this, but remember to come back and fill in this " "field before submitting." -#: proposals/models.py:547 +#: proposals/models.py:548 msgid "" "Is deze aanvraag een revisie van of amendement op een ingediende aanvraag?" msgstr "" "Is this application a revision or an amendment of a previously submitted " "application?" -#: proposals/models.py:619 +#: proposals/models.py:620 msgid "Amendement" msgstr "Amendment" -#: proposals/models.py:619 reviews/api/views.py:39 reviews/api/views.py:328 +#: proposals/models.py:620 reviews/api/views.py:39 reviews/api/views.py:328 #: reviews/templates/reviews/committee_members_workload.html:36 #: reviews/templates/reviews/committee_members_workload.html:82 #: reviews/templates/reviews/review_detail_sidebar.html:106 msgid "Revisie" msgstr "Revision" -#: proposals/models.py:625 +#: proposals/models.py:626 msgid "Normaal" msgstr "Normal" -#: proposals/models.py:630 +#: proposals/models.py:631 msgid "Voortoetsing" msgstr "Preliminary assessment" -#: proposals/models.py:632 +#: proposals/models.py:633 msgid "Oefening" msgstr "Practice" -#: proposals/models.py:634 +#: proposals/models.py:635 msgid "Extern getoetst" msgstr "External approval" -#: proposals/models.py:722 +#: proposals/models.py:723 msgid "Geen beoordeling door METC noodzakelijk" msgstr "Assessment by METC not required" -#: proposals/models.py:723 +#: proposals/models.py:724 msgid "In afwachting beslissing METC" msgstr "Pending decision by METC" -#: proposals/models.py:724 +#: proposals/models.py:725 msgid "Beslissing METC geüpload" msgstr "METC decision uploaded" -#: proposals/models.py:728 +#: proposals/models.py:729 msgid "" "Vindt de dataverzameling plaats binnen het UMC Utrecht of andere instelling " "waar toetsing door een METC verplicht is gesteld?" @@ -1946,11 +1947,11 @@ msgstr "" "Will the data collection take place at the UMC Utrecht or another " "institution for which an assessment by a METC is required?" -#: proposals/models.py:742 +#: proposals/models.py:743 msgid "Welke instelling?" msgstr "Which institution?" -#: proposals/models.py:748 +#: proposals/models.py:749 msgid "" "Is de onderzoeksvraag medisch-wetenschappelijk van aard (zoals gedefinieerd " "door de WMO)?" @@ -1958,7 +1959,7 @@ msgstr "" "Is the nature of the research question medical (as defined by the Medical " "Research Involving Human Subjects Act (WMO))?" -#: proposals/models.py:750 +#: proposals/models.py:751 msgid "" "De definitie van medisch-wetenschappelijk onderzoek is: Medisch-" "wetenschappelijk onderzoek is onderzoek dat als doel heeft het beantwoorden " @@ -1979,7 +1980,7 @@ msgstr "" "Committee on Research Involving Human Subjects, Definition of medical " "research, 2005, ccmo.nl)" -#: proposals/models.py:766 +#: proposals/models.py:767 msgid "" "Je onderzoek moet beoordeeld worden door een METC, maar dient nog wel bij de " "FETC-GW te worden geregistreerd. Is dit onderzoek al aangemeld bij een METC?" @@ -1988,15 +1989,15 @@ msgstr "" "registered with the FEtC-H. Has an application for this project already been " "submitted to an METC?" -#: proposals/models.py:773 +#: proposals/models.py:774 msgid "Is de METC al tot een beslissing gekomen?" msgstr "Has the METC already come to a decision?" -#: proposals/models.py:778 +#: proposals/models.py:779 msgid "Upload hier de beslissing van het METC (in .pdf of .doc(x)-formaat)" msgstr "Please upload the decision of METC (in .pdf or .doc(x)-format) here" -#: proposals/models.py:816 +#: proposals/models.py:817 #, python-brace-format msgid "WMO {title}, status {status}" msgstr "WMO {title}, status {status}" @@ -2516,6 +2517,7 @@ msgstr "" "the archive." #: proposals/templates/proposals/proposal_pdf.html:87 +#, python-format msgid "" "FETC-GW - %(title)s (referentienummer %(reference_number)s, " "ingediend door %(submitter)s)" @@ -3413,12 +3415,9 @@ msgstr "Overview of task-based research: session {} (trajectory {})" msgid "AVG en Data Management" msgstr "AVG and Data Management" -#: proposals/validators.py:33 -msgid "" -"Je dient kennis genomen te hebben van de AVG om jouw aanvraag in te dienen" -msgstr "" -"You must confirm your understanding of the AVG before you can submit your " -"application." +#: proposals/validators.py:35 +msgid "Je dient deze vraag in te vullen om jouw aanvraag in te dienen" +msgstr "You must answer this question before you can submit your application" #: proposals/views/proposal_views.py:45 msgid "Publiek archief" @@ -5639,3 +5638,10 @@ msgstr "Task edited" #: tasks/views/task_views.py:50 msgid "Taak verwijderd" msgstr "Task deleted" + +#~ msgid "" +#~ "Ik heb kennis genomen van het bovenstaande en begrijp mijn " +#~ "verantwoordelijkheden ten opzichte van de AVG." +#~ msgstr "" +#~ "I have read the information above and have considered my responsibilities " +#~ "with regard to the AVG." diff --git a/proposals/forms.py b/proposals/forms.py index bb860fb6f..78b872f5f 100644 --- a/proposals/forms.py +++ b/proposals/forms.py @@ -574,8 +574,18 @@ class ProposalDataManagementForm(SoftValidationMixin, forms.ModelForm): class Meta: model = Proposal fields = ['avg_understood', 'dmp_file'] + widgets = { + 'avg_understood': forms.RadioSelect(choices=YES_NO), + } + + def clean(self): + cleaned_data = super(ProposalDataManagementForm, self).clean() - _soft_validation_fields = ['avg_understood'] + if cleaned_data['avg_understood'] is None: + self.add_error( + 'avg_understood', + _('Dit veld is verplicht om verder te gaan.') + ) class ProposalUpdateDataManagementForm(forms.ModelForm): class Meta: diff --git a/proposals/migrations/0050_alter_proposal_avg_understood.py b/proposals/migrations/0050_alter_proposal_avg_understood.py new file mode 100644 index 000000000..e90b6e4bf --- /dev/null +++ b/proposals/migrations/0050_alter_proposal_avg_understood.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.20 on 2023-11-15 10:56 + +from django.db import migrations, models +import proposals.validators + + +class Migration(migrations.Migration): + + dependencies = [ + ('proposals', '0049_alter_proposal_supervisor'), + ] + + operations = [ + migrations.AlterField( + model_name='proposal', + name='avg_understood', + field=models.BooleanField(blank=True, default=None, null=True, validators=[proposals.validators.AVGUnderstoodValidator], verbose_name='Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de privacy officer.'), + ), + ] diff --git a/proposals/models.py b/proposals/models.py index 4c1cef382..7e7a2329f 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -400,9 +400,10 @@ class Proposal(models.Model): ) avg_understood = models.BooleanField( - _('Ik heb kennis genomen van het bovenstaande en begrijp mijn verantwoordelijkheden ten opzichte van de AVG.'), - default=False, - null=False, + _('Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de privacy officer.'), + default=None, + null=True, + blank=True, validators=[AVGUnderstoodValidator], ) diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py index f4c5e651d..7a3024472 100644 --- a/proposals/utils/pdf_diff_logic.py +++ b/proposals/utils/pdf_diff_logic.py @@ -963,7 +963,7 @@ class DMPFileSection(PageBreakMixin, BaseSection): section_title = _("Data Management Plan") - row_fields = ["dmp_file"] + row_fields = ["dmp_file", "avg_understood"] class EmbargoSection(BaseSection): diff --git a/proposals/validators.py b/proposals/validators.py index c70cd8f65..d73291e6b 100644 --- a/proposals/validators.py +++ b/proposals/validators.py @@ -27,9 +27,11 @@ def __call__(self, value): def AVGUnderstoodValidator(value): - - if value != True: +# This does not seem to do anything, so I removed it from the model, however, +# if I try to remove this validator entirely I get an error when making +# migrations? + if value is None: raise forms.ValidationError( - _('Je dient kennis genomen te hebben van de AVG om jouw aanvraag in ' + _('Je dient deze vraag in te vullen om jouw aanvraag in ' 'te dienen'), code='avg' ) From 7ef30eceb18ed6b0e619c9a84ec8604e0e29cbcc Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 16 Nov 2023 11:11:48 +0100 Subject: [PATCH 082/148] Implemented requested changes on PR #579 --- proposals/forms.py | 8 +++---- .../migrations/0034_auto_20211213_1503.py | 8 +++++-- .../0050_alter_proposal_avg_understood.py | 19 --------------- .../migrations/0050_replace_avg_understood.py | 24 +++++++++++++++++++ proposals/models.py | 4 +--- .../templates/proposals/proposal_pdf.html | 5 ++-- proposals/utils/pdf_diff_logic.py | 2 +- proposals/validators.py | 11 --------- .../0013_is_commission_review_field.py | 1 + reviews/models.py | 3 ++- .../reviews/review_detail_sidebar.html | 2 +- reviews/views.py | 2 +- 12 files changed, 43 insertions(+), 46 deletions(-) delete mode 100644 proposals/migrations/0050_alter_proposal_avg_understood.py create mode 100644 proposals/migrations/0050_replace_avg_understood.py diff --git a/proposals/forms.py b/proposals/forms.py index 78b872f5f..21cabcf24 100644 --- a/proposals/forms.py +++ b/proposals/forms.py @@ -573,17 +573,17 @@ def clean(self): class ProposalDataManagementForm(SoftValidationMixin, forms.ModelForm): class Meta: model = Proposal - fields = ['avg_understood', 'dmp_file'] + fields = ['privacy_officer', 'dmp_file'] widgets = { - 'avg_understood': forms.RadioSelect(choices=YES_NO), + 'privacy_officer': forms.RadioSelect(choices=YES_NO), } def clean(self): cleaned_data = super(ProposalDataManagementForm, self).clean() - if cleaned_data['avg_understood'] is None: + if cleaned_data['privacy_officer'] is None: self.add_error( - 'avg_understood', + 'privacy_officer', _('Dit veld is verplicht om verder te gaan.') ) diff --git a/proposals/migrations/0034_auto_20211213_1503.py b/proposals/migrations/0034_auto_20211213_1503.py index f026a0ed4..a5afdc58d 100644 --- a/proposals/migrations/0034_auto_20211213_1503.py +++ b/proposals/migrations/0034_auto_20211213_1503.py @@ -5,8 +5,12 @@ import django.db.models.deletion import main.validators import proposals.utils.proposal_utils -import proposals.validators +def AVGUnderstoodValidator(): + '''This was formerly a validator, imported from proposals.validators, + but it is currently no longer required, so it has been removed. + To prevent an error, it has been replaced with this stub.''' + pass class Migration(migrations.Migration): @@ -18,7 +22,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='proposal', name='avg_understood', - field=models.BooleanField(default=False, validators=[proposals.validators.AVGUnderstoodValidator], verbose_name='Ik heb kennis genomen van het bovenstaande en begrijp mijn verantwoordelijkheden ten opzichte van de AVG.'), + field=models.BooleanField(default=False, validators=[AVGUnderstoodValidator], verbose_name='Ik heb kennis genomen van het bovenstaande en begrijp mijn verantwoordelijkheden ten opzichte van de AVG.'), ), migrations.AlterField( model_name='proposal', diff --git a/proposals/migrations/0050_alter_proposal_avg_understood.py b/proposals/migrations/0050_alter_proposal_avg_understood.py deleted file mode 100644 index e90b6e4bf..000000000 --- a/proposals/migrations/0050_alter_proposal_avg_understood.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.20 on 2023-11-15 10:56 - -from django.db import migrations, models -import proposals.validators - - -class Migration(migrations.Migration): - - dependencies = [ - ('proposals', '0049_alter_proposal_supervisor'), - ] - - operations = [ - migrations.AlterField( - model_name='proposal', - name='avg_understood', - field=models.BooleanField(blank=True, default=None, null=True, validators=[proposals.validators.AVGUnderstoodValidator], verbose_name='Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de privacy officer.'), - ), - ] diff --git a/proposals/migrations/0050_replace_avg_understood.py b/proposals/migrations/0050_replace_avg_understood.py new file mode 100644 index 000000000..a9a9c9958 --- /dev/null +++ b/proposals/migrations/0050_replace_avg_understood.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.20 on 2023-11-16 09:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + replaces = [('proposals', '0050_alter_proposal_avg_understood'), ('proposals', '0051_auto_20231116_1030')] + + dependencies = [ + ('proposals', '0049_alter_proposal_supervisor'), + ] + + operations = [ + migrations.RemoveField( + model_name='proposal', + name='avg_understood', + ), + migrations.AddField( + model_name='proposal', + name='privacy_officer', + field=models.BooleanField(blank=True, default=None, null=True, verbose_name='Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de privacy officer.'), + ), + ] diff --git a/proposals/models.py b/proposals/models.py index 7e7a2329f..09749e2b0 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -15,7 +15,6 @@ from main.models import YES, YES_NO_DOUBT from main.validators import MaxWordsValidator, validate_pdf_or_doc -from .validators import AVGUnderstoodValidator from .utils import available_urls, FilenameFactory, OverwriteStorage from datetime import date, timedelta @@ -399,12 +398,11 @@ class Proposal(models.Model): blank=True, ) - avg_understood = models.BooleanField( + privacy_officer = models.BooleanField( _('Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de privacy officer.'), default=None, null=True, blank=True, - validators=[AVGUnderstoodValidator], ) dmp_file = models.FileField( diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index d88eb9442..2548b9eb4 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -84,10 +84,9 @@ {% block page_header %}
  • {% endif %} - {% if review.stage == review.SUPERVISOR %} + {% if review.is_commission_review == False %}
  • {% blocktrans trimmed %} diff --git a/reviews/views.py b/reviews/views.py index 9a08ce0c1..81c6bfba7 100644 --- a/reviews/views.py +++ b/reviews/views.py @@ -556,7 +556,7 @@ def form_valid(self, form): # Don't notify the secretary if this is a supervisor decision. # If it was a GO they the secretary will be notified anyway - if not review.stage == review.SUPERVISOR: + if review.is_commission_review == True: notify_secretary(form.instance) return super(DecisionUpdateView, self).form_valid(form) From 75ab28aee8f4ddba6c883a7ad015b8bcc280d872 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 16 Nov 2023 14:17:32 +0100 Subject: [PATCH 083/148] changed is_commission_review to is_committee_review + minor tweaks --- ..._understood.py => 0050_auto_20231116_1413.py} | 4 +--- proposals/templates/proposals/proposal_pdf.html | 2 +- ..._field.py => 0013_add_is_committee_review.py} | 16 +++++++++------- reviews/models.py | 4 ++-- .../templates/reviews/review_detail_sidebar.html | 2 +- reviews/tests.py | 6 +++--- reviews/utils/review_utils.py | 2 +- reviews/views.py | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) rename proposals/migrations/{0050_replace_avg_understood.py => 0050_auto_20231116_1413.py} (78%) rename reviews/migrations/{0013_is_commission_review_field.py => 0013_add_is_committee_review.py} (54%) diff --git a/proposals/migrations/0050_replace_avg_understood.py b/proposals/migrations/0050_auto_20231116_1413.py similarity index 78% rename from proposals/migrations/0050_replace_avg_understood.py rename to proposals/migrations/0050_auto_20231116_1413.py index a9a9c9958..2de122f4d 100644 --- a/proposals/migrations/0050_replace_avg_understood.py +++ b/proposals/migrations/0050_auto_20231116_1413.py @@ -1,12 +1,10 @@ -# Generated by Django 3.2.20 on 2023-11-16 09:41 +# Generated by Django 3.2.20 on 2023-11-16 13:13 from django.db import migrations, models class Migration(migrations.Migration): - replaces = [('proposals', '0050_alter_proposal_avg_understood'), ('proposals', '0051_auto_20231116_1030')] - dependencies = [ ('proposals', '0049_alter_proposal_supervisor'), ] diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index 2548b9eb4..9d1d10631 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -85,7 +85,7 @@ {% block page_header %}
  • {% endif %} - {% if review.is_commission_review == False %} + {% if not review.is_committee_review %}
  • {% blocktrans trimmed %} diff --git a/reviews/tests.py b/reviews/tests.py index 069d99910..60a4de5dc 100644 --- a/reviews/tests.py +++ b/reviews/tests.py @@ -154,7 +154,7 @@ def test_start_supervisor_review(self): # If the Relation on a Proposal requires a supervisor, a Review for the supervisor should be started. review = start_review(self.proposal) self.assertEqual(review.stage, Review.SUPERVISOR) - self.assertEqual(review.is_commission_review, False) + self.assertEqual(review.is_committee_review, False) self.assertEqual(Decision.objects.filter(reviewer=self.supervisor).count(), 1) self.assertEqual(Decision.objects.filter(review=review).count(), 1) self.assertEqual(review.decision_set.count(), 1) @@ -171,7 +171,7 @@ def test_start_review(self): review = start_review(self.proposal) self.assertEqual(review.stage, Review.ASSIGNMENT) - self.assertEqual(review.is_commission_review, True) + self.assertEqual(review.is_committee_review, True) self.assertEqual(Decision.objects.filter(reviewer=self.secretary).count(), 1) self.assertEqual(Decision.objects.filter(review=review).count(), 1) self.assertEqual(review.decision_set.count(), 1) @@ -198,7 +198,7 @@ def test_decision_supervisor(self): decision.save() review.refresh_from_db() self.assertEqual(review.go, True) - self.assertEqual(review.is_commission_review, False) + self.assertEqual(review.is_committee_review, False) self.assertEqual(len(mail.outbox), 2) self.check_subject_lines(mail.outbox) diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index dae480cdd..d0a568fd0 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -42,7 +42,7 @@ def start_supervisor_phase(proposal): """ review = Review.objects.create(proposal=proposal, date_start=timezone.now()) review.stage = Review.SUPERVISOR - review.is_commission_review = False + review.is_committee_review = False review.save() proposal.date_submitted_supervisor = timezone.now() diff --git a/reviews/views.py b/reviews/views.py index 81c6bfba7..260438ca5 100644 --- a/reviews/views.py +++ b/reviews/views.py @@ -556,7 +556,7 @@ def form_valid(self, form): # Don't notify the secretary if this is a supervisor decision. # If it was a GO they the secretary will be notified anyway - if review.is_commission_review == True: + if review.is_committee_review: notify_secretary(form.instance) return super(DecisionUpdateView, self).form_valid(form) From 333536dc7aeb39c2b637c5e06b8f0b7e103288cf Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 20 Nov 2023 14:26:30 +0100 Subject: [PATCH 084/148] Reviewer.get_full_name on detail page. fixes #581 --- reviews/templates/reviews/review_table.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reviews/templates/reviews/review_table.html b/reviews/templates/reviews/review_table.html index f107068d5..b6a2f4cca 100644 --- a/reviews/templates/reviews/review_table.html +++ b/reviews/templates/reviews/review_table.html @@ -14,7 +14,7 @@ {% for decision in review.decision_set.all %} - {{ decision.reviewer }} + {{ decision.reviewer.get_full_name }} {{ decision.get_go_display|default:_("open") }} {{ decision.date_decision|date:"j F Y, G:i" }} {{ decision.comments }} From f402a27c532430a2a93a27b73b72e270deac215b Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 20 Nov 2023 16:20:20 +0100 Subject: [PATCH 085/148] email to notify secretary when all decisions are complete. fixes #563 --- reviews/models.py | 2 + .../templates/mail/all_decisions_notify.txt | 14 + reviews/utils/review_utils.py | 383 ++++++++++++------ 3 files changed, 273 insertions(+), 126 deletions(-) create mode 100644 reviews/templates/mail/all_decisions_notify.txt diff --git a/reviews/models.py b/reviews/models.py index 20825474a..0f5aead33 100644 --- a/reviews/models.py +++ b/reviews/models.py @@ -114,6 +114,8 @@ def update_go(self, last_decision=None): # For a review by commission: else: # Set the stage to CLOSING + from reviews.utils import notify_secretary_all_decisions + notify_secretary_all_decisions(self) self.stage = self.CLOSING self.save() else: diff --git a/reviews/templates/mail/all_decisions_notify.txt b/reviews/templates/mail/all_decisions_notify.txt new file mode 100644 index 000000000..5c2847a58 --- /dev/null +++ b/reviews/templates/mail/all_decisions_notify.txt @@ -0,0 +1,14 @@ +{% extends "mail/base-internal.txt" %} + +{% block content %} +Alle beoordelingen zijn toegevoegd bij de aanvraag {{ proposal.reference_number }}. + +De review is klaar om afgesloten te worden. + +Overzicht beoordelingen: +{% for decision in decisions %} +Beoordelaar: {{ decision.reviewer.get_full_name }} +Beoordeling: {{ decision.get_go_display }} +Opmerkingen: {{ decision.comments|default:"geen"|safe }} +{% endfor %} +{% endblock %} diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index d0a568fd0..ef882fb3b 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -52,39 +52,62 @@ def start_supervisor_phase(proposal): decision = Decision.objects.create(review=review, reviewer=proposal.supervisor) reference = proposal.committee_prefixed_refnum() - subject = _('FETC-GW {}: bevestiging indienen concept-aanmelding'.format(reference)) + subject = _("FETC-GW {}: bevestiging indienen concept-aanmelding".format(reference)) params = { - 'proposal': proposal, - 'title': proposal.title, - 'supervisor': proposal.supervisor.get_full_name(), - 'secretary': get_secretary().get_full_name(), - 'pdf_url': settings.BASE_URL + proposal.pdf.url, + "proposal": proposal, + "title": proposal.title, + "supervisor": proposal.supervisor.get_full_name(), + "secretary": get_secretary().get_full_name(), + "pdf_url": settings.BASE_URL + proposal.pdf.url, } - msg_plain = render_to_string('mail/concept_creator.txt', params) - msg_html = render_to_string('mail/concept_creator.html', params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, [proposal.created_by.email], html_message=msg_html) + msg_plain = render_to_string("mail/concept_creator.txt", params) + msg_html = render_to_string("mail/concept_creator.html", params) + send_mail( + subject, + msg_plain, + settings.EMAIL_FROM, + [proposal.created_by.email], + html_message=msg_html, + ) if proposal.other_applicants: - params['creator'] = proposal.created_by.get_full_name() - msg_plain = render_to_string('mail/concept_other_applicants.txt', params) - msg_html = render_to_string('mail/concept_other_applicants.html', params) + params["creator"] = proposal.created_by.get_full_name() + msg_plain = render_to_string("mail/concept_other_applicants.txt", params) + msg_html = render_to_string("mail/concept_other_applicants.html", params) applicants_to_remove = [proposal.created_by, proposal.supervisor] - other_applicants_emails = [applicant.email for applicant in proposal.applicants.all() if applicant not in applicants_to_remove] - send_mail(subject, msg_plain, settings.EMAIL_FROM, other_applicants_emails, html_message=msg_html) + other_applicants_emails = [ + applicant.email + for applicant in proposal.applicants.all() + if applicant not in applicants_to_remove + ] + send_mail( + subject, + msg_plain, + settings.EMAIL_FROM, + other_applicants_emails, + html_message=msg_html, + ) - subject = _('FETC-GW {}: beoordelen als eindverantwoordelijke'.format(reference)) + subject = _("FETC-GW {}: beoordelen als eindverantwoordelijke".format(reference)) params = { - 'proposal': proposal, - 'creator': proposal.created_by.get_full_name(), - 'proposal_url': settings.BASE_URL + reverse('reviews:decide', args=(decision.pk,)), - 'secretary': get_secretary().get_full_name(), - 'revision': proposal.is_revision, - 'revision_type': proposal.type(), - 'my_supervised': settings.BASE_URL + reverse('proposals:my_supervised'), + "proposal": proposal, + "creator": proposal.created_by.get_full_name(), + "proposal_url": settings.BASE_URL + + reverse("reviews:decide", args=(decision.pk,)), + "secretary": get_secretary().get_full_name(), + "revision": proposal.is_revision, + "revision_type": proposal.type(), + "my_supervised": settings.BASE_URL + reverse("proposals:my_supervised"), } - msg_plain = render_to_string('mail/concept_supervisor.txt', params) - msg_html = render_to_string('mail/concept_supervisor.html', params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, [proposal.supervisor.email], html_message=msg_html) + msg_plain = render_to_string("mail/concept_supervisor.txt", params) + msg_html = render_to_string("mail/concept_supervisor.html", params) + send_mail( + subject, + msg_plain, + settings.EMAIL_FROM, + [proposal.supervisor.email], + html_message=msg_html, + ) return review @@ -110,7 +133,9 @@ def start_assignment_phase(proposal): review.short_route = short_route if short_route: - review.date_should_end = timezone.now() + timezone.timedelta(weeks=settings.SHORT_ROUTE_WEEKS) + review.date_should_end = timezone.now() + timezone.timedelta( + weeks=settings.SHORT_ROUTE_WEEKS + ) review.save() proposal.date_submitted = timezone.now() @@ -122,36 +147,58 @@ def start_assignment_phase(proposal): notify_secretary_assignment(review) - subject = _('FETC-GW {}: aanmelding ontvangen'.format(proposal.committee_prefixed_refnum())) + subject = _( + "FETC-GW {}: aanmelding ontvangen".format(proposal.committee_prefixed_refnum()) + ) params = { - 'secretary': secretary.get_full_name(), - 'review_date': review.date_should_end, - 'pdf_url': settings.BASE_URL + proposal.pdf.url, - 'title': proposal.title, + "secretary": secretary.get_full_name(), + "review_date": review.date_should_end, + "pdf_url": settings.BASE_URL + proposal.pdf.url, + "title": proposal.title, } if review.short_route: - msg_plain = render_to_string('mail/submitted_shortroute.txt', params) - msg_html = render_to_string('mail/submitted_shortroute.html', params) + msg_plain = render_to_string("mail/submitted_shortroute.txt", params) + msg_html = render_to_string("mail/submitted_shortroute.html", params) else: - msg_plain = render_to_string('mail/submitted_longroute.txt', params) - msg_html = render_to_string('mail/submitted_longroute.html', params) + msg_plain = render_to_string("mail/submitted_longroute.txt", params) + msg_html = render_to_string("mail/submitted_longroute.html", params) recipients = [proposal.created_by.email] if proposal.relation.needs_supervisor: recipients.append(proposal.supervisor.email) - send_mail(subject, msg_plain, settings.EMAIL_FROM, recipients, html_message=msg_html) + send_mail( + subject, msg_plain, settings.EMAIL_FROM, recipients, html_message=msg_html + ) if proposal.supervisor is None and proposal.other_applicants: - params['creator'] = proposal.created_by.get_full_name() + params["creator"] = proposal.created_by.get_full_name() if review.short_route: - msg_plain = render_to_string('mail/submitted_shortroute_other_applicants.txt', params) - msg_html = render_to_string('mail/submitted_shortroute_other_applicants.html', params) + msg_plain = render_to_string( + "mail/submitted_shortroute_other_applicants.txt", params + ) + msg_html = render_to_string( + "mail/submitted_shortroute_other_applicants.html", params + ) else: - msg_plain = render_to_string('mail/submitted_longroute_other_applicants.txt', params) - msg_html = render_to_string('mail/submitted_longroute_other_applicants.html', params) + msg_plain = render_to_string( + "mail/submitted_longroute_other_applicants.txt", params + ) + msg_html = render_to_string( + "mail/submitted_longroute_other_applicants.html", params + ) applicants_to_remove = [proposal.created_by] - other_applicants_emails = [applicant.email for applicant in proposal.applicants.all() if applicant not in applicants_to_remove] - - send_mail(subject, msg_plain, settings.EMAIL_FROM, other_applicants_emails, html_message=msg_html) + other_applicants_emails = [ + applicant.email + for applicant in proposal.applicants.all() + if applicant not in applicants_to_remove + ] + + send_mail( + subject, + msg_plain, + settings.EMAIL_FROM, + other_applicants_emails, + html_message=msg_html, + ) if proposal.inform_local_staff: notify_local_staff(proposal) @@ -173,7 +220,7 @@ def remind_reviewers(): review__short_route=True, review__date_should_end__gte=today, review__date_should_end__lte=next_two_days, - go='', # Checks if the decision has already been done; we don't + go="", # Checks if the decision has already been done; we don't # check for None as the field cannot be None according to the field # definition ) @@ -184,13 +231,20 @@ def remind_reviewers(): proposal.committee_prefixed_refnum(), ) params = { - 'creator': proposal.created_by.get_full_name(), - 'proposal_url': settings.BASE_URL + reverse('reviews:decide', args=(decision.pk,)), - 'secretary': get_secretary().get_full_name(), + "creator": proposal.created_by.get_full_name(), + "proposal_url": settings.BASE_URL + + reverse("reviews:decide", args=(decision.pk,)), + "secretary": get_secretary().get_full_name(), } - msg_plain = render_to_string('mail/reminder.txt', params) - msg_html = render_to_string('mail/reminder.html', params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, [decision.reviewer.email], html_message=msg_html) + msg_plain = render_to_string("mail/reminder.txt", params) + msg_html = render_to_string("mail/reminder.html", params) + send_mail( + subject, + msg_plain, + settings.EMAIL_FROM, + [decision.reviewer.email], + html_message=msg_html, + ) def start_review_pre_assessment(proposal): @@ -206,7 +260,9 @@ def start_review_pre_assessment(proposal): review = Review.objects.create(proposal=proposal, date_start=timezone.now()) review.stage = Review.ASSIGNMENT review.short_route = True - review.date_should_end = timezone.now() + timezone.timedelta(weeks=settings.PREASSESSMENT_ROUTE_WEEKS) + review.date_should_end = timezone.now() + timezone.timedelta( + weeks=settings.PREASSESSMENT_ROUTE_WEEKS + ) review.save() proposal.date_submitted = timezone.now() @@ -216,27 +272,36 @@ def start_review_pre_assessment(proposal): secretary = get_secretary() Decision.objects.create(review=review, reviewer=secretary) - subject = _('FETC-GW {}: nieuwe aanvraag voor voortoetsing'.format( - proposal.committee_prefixed_refnum(), + subject = _( + "FETC-GW {}: nieuwe aanvraag voor voortoetsing".format( + proposal.committee_prefixed_refnum(), ) - ) - + ) + params = { - 'secretary': secretary.get_full_name(), - 'proposal': proposal, - 'proposal_pdf': settings.BASE_URL + proposal.pdf.url, + "secretary": secretary.get_full_name(), + "proposal": proposal, + "proposal_pdf": settings.BASE_URL + proposal.pdf.url, } - msg_plain = render_to_string('mail/pre_assessment_secretary.txt', params) - msg_html = render_to_string('mail/pre_assessment_secretary.html', params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email], html_message=msg_html) + msg_plain = render_to_string("mail/pre_assessment_secretary.txt", params) + msg_html = render_to_string("mail/pre_assessment_secretary.html", params) + send_mail( + subject, + msg_plain, + settings.EMAIL_FROM, + [secretary.email], + html_message=msg_html, + ) - subject = _('FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing'.format( - proposal.committee_prefixed_refnum(),) - ) + subject = _( + "FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing".format( + proposal.committee_prefixed_refnum(), + ) + ) params = { - 'secretary': secretary.get_full_name(), + "secretary": secretary.get_full_name(), } - msg_plain = render_to_string('mail/pre_assessment_creator.txt', params) + msg_plain = render_to_string("mail/pre_assessment_creator.txt", params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [proposal.created_by.email]) @@ -245,28 +310,32 @@ def start_review_route(review, commission_users, use_short_route): Creates Decisions and sends notification e-mail to the selected Reviewers """ - template = 'mail/assignment_shortroute.txt' if use_short_route else 'mail/assignment_longroute.txt' + template = ( + "mail/assignment_shortroute.txt" + if use_short_route + else "mail/assignment_longroute.txt" + ) was_revised = review.proposal.is_revision if was_revised: - subject = 'FETC-GW {}: gereviseerde aanvraag ter beoordeling' + subject = "FETC-GW {}: gereviseerde aanvraag ter beoordeling" else: - subject = 'FETC-GW {}: nieuwe aanvraag ter beoordeling' + subject = "FETC-GW {}: nieuwe aanvraag ter beoordeling" # These emails are Dutch-only, therefore intentionally untranslated - subject = subject.format(review.proposal.committee_prefixed_refnum(), - ) + subject = subject.format( + review.proposal.committee_prefixed_refnum(), + ) for user in commission_users: - Decision.objects.create(review=review, reviewer=user) params = { - 'secretary': get_secretary().get_full_name(), - 'reviewer': user.get_full_name(), - 'review_date': review.date_should_end, - 'is_pre_assessment': review.proposal.is_pre_assessment, - 'was_revised': was_revised, + "secretary": get_secretary().get_full_name(), + "reviewer": user.get_full_name(), + "review_date": review.date_should_end, + "is_pre_assessment": review.proposal.is_pre_assessment, + "was_revised": was_revised, } msg_plain = render_to_string(template, params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [user.email]) @@ -279,12 +348,14 @@ def notify_secretary_assignment(review): secretary = get_secretary() proposal = review.proposal committee = review.proposal.reviewing_committee - subject = _('FETC-GW {}: nieuwe aanvraag ingediend').format(proposal.committee_prefixed_refnum()) + subject = _("FETC-GW {}: nieuwe aanvraag ingediend").format( + proposal.committee_prefixed_refnum() + ) params = { - 'secretary': secretary.get_full_name(), - 'review': review, + "secretary": secretary.get_full_name(), + "review": review, } - msg_plain = render_to_string('mail/submitted.txt', params) + msg_plain = render_to_string("mail/submitted.txt", params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) @@ -294,14 +365,31 @@ def notify_secretary(decision): """ secretary = get_secretary() proposal = decision.review.proposal - subject = _('FETC-GW {}: nieuwe beoordeling toegevoegd').format( + subject = _("FETC-GW {}: nieuwe beoordeling toegevoegd").format( proposal.committee_prefixed_refnum(), ) params = { - 'secretary': secretary.get_full_name(), - 'decision': decision, + "secretary": secretary.get_full_name(), + "decision": decision, + } + msg_plain = render_to_string("mail/decision_notify.txt", params) + send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) + + +def notify_secretary_all_decisions(review): + """ + Notifies a secretary all Decisions have been made for a certain review + """ + secretary = get_secretary() + subject = _("FETC-GW {}: alle beoordelingen toegevoegd").format( + review.proposal.committee_prefixed_refnum(), + ) + params = { + "secretary": secretary.get_full_name(), + "proposal": review.proposal, + "decisions": review.decision_set.all() } - msg_plain = render_to_string('mail/decision_notify.txt', params) + msg_plain = render_to_string("mail/all_decisions_notify.txt", params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) @@ -310,18 +398,20 @@ def notify_supervisor_nogo(decision): proposal = decision.review.proposal supervisor = proposal.supervisor receivers = set(applicant for applicant in proposal.applicants.all()) - subject = _('FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld'.format( - proposal.committee_prefixed_refnum(),) + subject = _( + "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld".format( + proposal.committee_prefixed_refnum(), + ) ) params = { - 'secretary': secretary.get_full_name(), - 'decision': decision, - 'supervisor': supervisor, + "secretary": secretary.get_full_name(), + "decision": decision, + "supervisor": supervisor, } for applicant in receivers: - params['applicant'] = applicant - msg_plain = render_to_string('mail/supervisor_decision.txt', params) + params["applicant"] = applicant + msg_plain = render_to_string("mail/supervisor_decision.txt", params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [applicant.email]) @@ -334,40 +424,66 @@ def auto_review(proposal: Proposal): reasons = [] for study in proposal.study_set.all(): - if study.legally_incapable: - reasons.append(_('De aanvraag bevat het gebruik van wilsonbekwame volwassenen.')) + reasons.append( + _("De aanvraag bevat het gebruik van wilsonbekwame volwassenen.") + ) if study.deception in [YES, DOUBT]: - reasons.append(_('De aanvraag bevat het gebruik van misleiding.')) + reasons.append(_("De aanvraag bevat het gebruik van misleiding.")) if study.hierarchy: - reasons.append(_('Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)')) + reasons.append( + _( + "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" + ) + ) if study.has_special_details: - reasons.append(_('Het onderzoek verzamelt bijzondere persoonsgegevens.')) + reasons.append(_("Het onderzoek verzamelt bijzondere persoonsgegevens.")) if study.has_traits: - reasons.append(_('Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht verhoogde kwetsbaarheid met zich meebrengen.')) + reasons.append( + _( + "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht verhoogde kwetsbaarheid met zich meebrengen." + ) + ) for task in Task.objects.filter(session__study=study): reasons.extend(auto_review_task(study, task)) if study.stressful in [YES, DOUBT]: - reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op onderdelen of \ -als geheel zodanig belastend is dat deze ondanks de verkregen informed consent vragen zou kunnen oproepen.')) + reasons.append( + _( + "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op onderdelen of \ +als geheel zodanig belastend is dat deze ondanks de verkregen informed consent vragen zou kunnen oproepen." + ) + ) if study.risk in [YES, DOUBT]: - reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) de risico\'s op psychische of \ -fysieke schade bij deelname aan het onderzoek meer dan minimaal zijn.')) + reasons.append( + _( + "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op psychische of \ +fysieke schade bij deelname aan het onderzoek meer dan minimaal zijn." + ) + ) if study.has_sessions: for session in study.session_set.all(): for age_group in study.age_groups.all(): if session.net_duration() > age_group.max_net_duration: - reasons.append(_('De totale duur van de taken in sessie {s}, exclusief pauzes \ + reasons.append( + _( + "De totale duur van de taken in sessie {s}, exclusief pauzes \ en andere niet-taak elementen ({d} minuten), is groter dan het streefmaximum ({max_d} minuten) \ -voor de leeftijdsgroep {ag}.').format(s=session.order, ag=age_group, d=session.net_duration(), max_d=age_group.max_net_duration)) +voor de leeftijdsgroep {ag}." + ).format( + s=session.order, + ag=age_group, + d=session.net_duration(), + max_d=age_group.max_net_duration, + ) + ) return reasons @@ -382,18 +498,30 @@ def auto_review_observation(observation): if observation.settings_requires_review(): for setting in observation.settings_requires_review(): - reasons.append(_('Het onderzoek observeert deelnemers in de volgende setting: {s}').format(s=setting)) + reasons.append( + _( + "Het onderzoek observeert deelnemers in de volgende setting: {s}" + ).format(s=setting) + ) if observation.is_nonpublic_space: if not observation.has_advanced_consent: - reasons.append(_('Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met informed consent achteraf.')) + reasons.append( + _( + "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met informed consent achteraf." + ) + ) if observation.is_anonymous: - reasons.append(_('De onderzoeker begeeft zich "under cover" in een beheerde niet-publieke ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie deel en/of verzamelt data die te herleiden zijn tot individuele personen.')) + reasons.append( + _( + 'De onderzoeker begeeft zich "under cover" in een beheerde niet-publieke ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie deel en/of verzamelt data die te herleiden zijn tot individuele personen.' + ) + ) for registration in observation.registrations.all(): if registration.requires_review: reasons.append( - _('De aanvraag bevat het gebruik van {}').format( + _("De aanvraag bevat het gebruik van {}").format( registration.description ) ) @@ -413,8 +541,15 @@ def auto_review_task(study, task): if registration.requires_review: if registration.age_min: for age_group in study.age_groups.all(): - if age_group.age_max is not None and age_group.age_max < registration.age_min: - reasons.append(_('De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar.').format(registration.age_min)) + if ( + age_group.age_max is not None + and age_group.age_max < registration.age_min + ): + reasons.append( + _( + "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." + ).format(registration.age_min) + ) break return reasons @@ -423,7 +558,7 @@ def auto_review_task(study, task): def discontinue_review(review): """ Set continuation to discontinued on the given review, - and set DECISION_MADE on its proposal. """ + and set DECISION_MADE on its proposal.""" # Set review continuation review.continuation = review.DISCONTINUED @@ -448,21 +583,17 @@ def assign_reviewers(review, list_of_users, route): obsolete_reviewers = current_reviewers - list_of_users if review.proposal.is_revision: - #Revisions should end in one week. - review.date_should_end = timezone.now() + \ - timezone.timedelta( - weeks=1 - ) + # Revisions should end in one week. + review.date_should_end = timezone.now() + timezone.timedelta(weeks=1) elif review.date_should_end is not None: - #if the date_end_variable gets assigned through auto review - #the review keeps this date + # if the date_end_variable gets assigned through auto review + # the review keeps this date pass elif route == True: - #The short route reviews should take two weeks. - review.date_should_end = timezone.now() + \ - timezone.timedelta( - weeks=settings.SHORT_ROUTE_WEEKS - ) + # The short route reviews should take two weeks. + review.date_should_end = timezone.now() + timezone.timedelta( + weeks=settings.SHORT_ROUTE_WEEKS + ) elif route == False: # We have no desired end date for long track reviews review.date_should_end = None @@ -471,8 +602,7 @@ def assign_reviewers(review, list_of_users, route): start_review_route(review, new_reviewers, route) # Remove the Decision for obsolete reviewers - Decision.objects.filter(review=review, - reviewer__in=obsolete_reviewers).delete() + Decision.objects.filter(review=review, reviewer__in=obsolete_reviewers).delete() review.save() @@ -480,6 +610,7 @@ def assign_reviewers(review, list_of_users, route): # This prevents it waiting for removed reviewers review.update_go() + def straight_to_revision(review): """This action by the secretary in ReviewAssignForm bypasses the usual review process and sends a review straight to revision""" From 82627e5d4cbcaeb9c7b0aa5584d806a01012ef06 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 20 Nov 2023 16:46:02 +0100 Subject: [PATCH 086/148] unblacked review_utils --- reviews/utils/review_utils.py | 368 ++++++++++++---------------------- 1 file changed, 126 insertions(+), 242 deletions(-) diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index ef882fb3b..597e19f2d 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -52,62 +52,39 @@ def start_supervisor_phase(proposal): decision = Decision.objects.create(review=review, reviewer=proposal.supervisor) reference = proposal.committee_prefixed_refnum() - subject = _("FETC-GW {}: bevestiging indienen concept-aanmelding".format(reference)) + subject = _('FETC-GW {}: bevestiging indienen concept-aanmelding'.format(reference)) params = { - "proposal": proposal, - "title": proposal.title, - "supervisor": proposal.supervisor.get_full_name(), - "secretary": get_secretary().get_full_name(), - "pdf_url": settings.BASE_URL + proposal.pdf.url, + 'proposal': proposal, + 'title': proposal.title, + 'supervisor': proposal.supervisor.get_full_name(), + 'secretary': get_secretary().get_full_name(), + 'pdf_url': settings.BASE_URL + proposal.pdf.url, } - msg_plain = render_to_string("mail/concept_creator.txt", params) - msg_html = render_to_string("mail/concept_creator.html", params) - send_mail( - subject, - msg_plain, - settings.EMAIL_FROM, - [proposal.created_by.email], - html_message=msg_html, - ) + msg_plain = render_to_string('mail/concept_creator.txt', params) + msg_html = render_to_string('mail/concept_creator.html', params) + send_mail(subject, msg_plain, settings.EMAIL_FROM, [proposal.created_by.email], html_message=msg_html) if proposal.other_applicants: - params["creator"] = proposal.created_by.get_full_name() - msg_plain = render_to_string("mail/concept_other_applicants.txt", params) - msg_html = render_to_string("mail/concept_other_applicants.html", params) + params['creator'] = proposal.created_by.get_full_name() + msg_plain = render_to_string('mail/concept_other_applicants.txt', params) + msg_html = render_to_string('mail/concept_other_applicants.html', params) applicants_to_remove = [proposal.created_by, proposal.supervisor] - other_applicants_emails = [ - applicant.email - for applicant in proposal.applicants.all() - if applicant not in applicants_to_remove - ] - send_mail( - subject, - msg_plain, - settings.EMAIL_FROM, - other_applicants_emails, - html_message=msg_html, - ) + other_applicants_emails = [applicant.email for applicant in proposal.applicants.all() if applicant not in applicants_to_remove] + send_mail(subject, msg_plain, settings.EMAIL_FROM, other_applicants_emails, html_message=msg_html) - subject = _("FETC-GW {}: beoordelen als eindverantwoordelijke".format(reference)) + subject = _('FETC-GW {}: beoordelen als eindverantwoordelijke'.format(reference)) params = { - "proposal": proposal, - "creator": proposal.created_by.get_full_name(), - "proposal_url": settings.BASE_URL - + reverse("reviews:decide", args=(decision.pk,)), - "secretary": get_secretary().get_full_name(), - "revision": proposal.is_revision, - "revision_type": proposal.type(), - "my_supervised": settings.BASE_URL + reverse("proposals:my_supervised"), + 'proposal': proposal, + 'creator': proposal.created_by.get_full_name(), + 'proposal_url': settings.BASE_URL + reverse('reviews:decide', args=(decision.pk,)), + 'secretary': get_secretary().get_full_name(), + 'revision': proposal.is_revision, + 'revision_type': proposal.type(), + 'my_supervised': settings.BASE_URL + reverse('proposals:my_supervised'), } - msg_plain = render_to_string("mail/concept_supervisor.txt", params) - msg_html = render_to_string("mail/concept_supervisor.html", params) - send_mail( - subject, - msg_plain, - settings.EMAIL_FROM, - [proposal.supervisor.email], - html_message=msg_html, - ) + msg_plain = render_to_string('mail/concept_supervisor.txt', params) + msg_html = render_to_string('mail/concept_supervisor.html', params) + send_mail(subject, msg_plain, settings.EMAIL_FROM, [proposal.supervisor.email], html_message=msg_html) return review @@ -133,9 +110,7 @@ def start_assignment_phase(proposal): review.short_route = short_route if short_route: - review.date_should_end = timezone.now() + timezone.timedelta( - weeks=settings.SHORT_ROUTE_WEEKS - ) + review.date_should_end = timezone.now() + timezone.timedelta(weeks=settings.SHORT_ROUTE_WEEKS) review.save() proposal.date_submitted = timezone.now() @@ -147,58 +122,36 @@ def start_assignment_phase(proposal): notify_secretary_assignment(review) - subject = _( - "FETC-GW {}: aanmelding ontvangen".format(proposal.committee_prefixed_refnum()) - ) + subject = _('FETC-GW {}: aanmelding ontvangen'.format(proposal.committee_prefixed_refnum())) params = { - "secretary": secretary.get_full_name(), - "review_date": review.date_should_end, - "pdf_url": settings.BASE_URL + proposal.pdf.url, - "title": proposal.title, + 'secretary': secretary.get_full_name(), + 'review_date': review.date_should_end, + 'pdf_url': settings.BASE_URL + proposal.pdf.url, + 'title': proposal.title, } if review.short_route: - msg_plain = render_to_string("mail/submitted_shortroute.txt", params) - msg_html = render_to_string("mail/submitted_shortroute.html", params) + msg_plain = render_to_string('mail/submitted_shortroute.txt', params) + msg_html = render_to_string('mail/submitted_shortroute.html', params) else: - msg_plain = render_to_string("mail/submitted_longroute.txt", params) - msg_html = render_to_string("mail/submitted_longroute.html", params) + msg_plain = render_to_string('mail/submitted_longroute.txt', params) + msg_html = render_to_string('mail/submitted_longroute.html', params) recipients = [proposal.created_by.email] if proposal.relation.needs_supervisor: recipients.append(proposal.supervisor.email) - send_mail( - subject, msg_plain, settings.EMAIL_FROM, recipients, html_message=msg_html - ) + send_mail(subject, msg_plain, settings.EMAIL_FROM, recipients, html_message=msg_html) if proposal.supervisor is None and proposal.other_applicants: - params["creator"] = proposal.created_by.get_full_name() + params['creator'] = proposal.created_by.get_full_name() if review.short_route: - msg_plain = render_to_string( - "mail/submitted_shortroute_other_applicants.txt", params - ) - msg_html = render_to_string( - "mail/submitted_shortroute_other_applicants.html", params - ) + msg_plain = render_to_string('mail/submitted_shortroute_other_applicants.txt', params) + msg_html = render_to_string('mail/submitted_shortroute_other_applicants.html', params) else: - msg_plain = render_to_string( - "mail/submitted_longroute_other_applicants.txt", params - ) - msg_html = render_to_string( - "mail/submitted_longroute_other_applicants.html", params - ) + msg_plain = render_to_string('mail/submitted_longroute_other_applicants.txt', params) + msg_html = render_to_string('mail/submitted_longroute_other_applicants.html', params) applicants_to_remove = [proposal.created_by] - other_applicants_emails = [ - applicant.email - for applicant in proposal.applicants.all() - if applicant not in applicants_to_remove - ] - - send_mail( - subject, - msg_plain, - settings.EMAIL_FROM, - other_applicants_emails, - html_message=msg_html, - ) + other_applicants_emails = [applicant.email for applicant in proposal.applicants.all() if applicant not in applicants_to_remove] + + send_mail(subject, msg_plain, settings.EMAIL_FROM, other_applicants_emails, html_message=msg_html) if proposal.inform_local_staff: notify_local_staff(proposal) @@ -220,7 +173,7 @@ def remind_reviewers(): review__short_route=True, review__date_should_end__gte=today, review__date_should_end__lte=next_two_days, - go="", # Checks if the decision has already been done; we don't + go='', # Checks if the decision has already been done; we don't # check for None as the field cannot be None according to the field # definition ) @@ -231,20 +184,13 @@ def remind_reviewers(): proposal.committee_prefixed_refnum(), ) params = { - "creator": proposal.created_by.get_full_name(), - "proposal_url": settings.BASE_URL - + reverse("reviews:decide", args=(decision.pk,)), - "secretary": get_secretary().get_full_name(), + 'creator': proposal.created_by.get_full_name(), + 'proposal_url': settings.BASE_URL + reverse('reviews:decide', args=(decision.pk,)), + 'secretary': get_secretary().get_full_name(), } - msg_plain = render_to_string("mail/reminder.txt", params) - msg_html = render_to_string("mail/reminder.html", params) - send_mail( - subject, - msg_plain, - settings.EMAIL_FROM, - [decision.reviewer.email], - html_message=msg_html, - ) + msg_plain = render_to_string('mail/reminder.txt', params) + msg_html = render_to_string('mail/reminder.html', params) + send_mail(subject, msg_plain, settings.EMAIL_FROM, [decision.reviewer.email], html_message=msg_html) def start_review_pre_assessment(proposal): @@ -260,9 +206,7 @@ def start_review_pre_assessment(proposal): review = Review.objects.create(proposal=proposal, date_start=timezone.now()) review.stage = Review.ASSIGNMENT review.short_route = True - review.date_should_end = timezone.now() + timezone.timedelta( - weeks=settings.PREASSESSMENT_ROUTE_WEEKS - ) + review.date_should_end = timezone.now() + timezone.timedelta(weeks=settings.PREASSESSMENT_ROUTE_WEEKS) review.save() proposal.date_submitted = timezone.now() @@ -272,36 +216,27 @@ def start_review_pre_assessment(proposal): secretary = get_secretary() Decision.objects.create(review=review, reviewer=secretary) - subject = _( - "FETC-GW {}: nieuwe aanvraag voor voortoetsing".format( - proposal.committee_prefixed_refnum(), + subject = _('FETC-GW {}: nieuwe aanvraag voor voortoetsing'.format( + proposal.committee_prefixed_refnum(), ) - ) - + ) + params = { - "secretary": secretary.get_full_name(), - "proposal": proposal, - "proposal_pdf": settings.BASE_URL + proposal.pdf.url, + 'secretary': secretary.get_full_name(), + 'proposal': proposal, + 'proposal_pdf': settings.BASE_URL + proposal.pdf.url, } - msg_plain = render_to_string("mail/pre_assessment_secretary.txt", params) - msg_html = render_to_string("mail/pre_assessment_secretary.html", params) - send_mail( - subject, - msg_plain, - settings.EMAIL_FROM, - [secretary.email], - html_message=msg_html, - ) + msg_plain = render_to_string('mail/pre_assessment_secretary.txt', params) + msg_html = render_to_string('mail/pre_assessment_secretary.html', params) + send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email], html_message=msg_html) - subject = _( - "FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing".format( - proposal.committee_prefixed_refnum(), - ) - ) + subject = _('FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing'.format( + proposal.committee_prefixed_refnum(),) + ) params = { - "secretary": secretary.get_full_name(), + 'secretary': secretary.get_full_name(), } - msg_plain = render_to_string("mail/pre_assessment_creator.txt", params) + msg_plain = render_to_string('mail/pre_assessment_creator.txt', params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [proposal.created_by.email]) @@ -310,32 +245,28 @@ def start_review_route(review, commission_users, use_short_route): Creates Decisions and sends notification e-mail to the selected Reviewers """ - template = ( - "mail/assignment_shortroute.txt" - if use_short_route - else "mail/assignment_longroute.txt" - ) + template = 'mail/assignment_shortroute.txt' if use_short_route else 'mail/assignment_longroute.txt' was_revised = review.proposal.is_revision if was_revised: - subject = "FETC-GW {}: gereviseerde aanvraag ter beoordeling" + subject = 'FETC-GW {}: gereviseerde aanvraag ter beoordeling' else: - subject = "FETC-GW {}: nieuwe aanvraag ter beoordeling" + subject = 'FETC-GW {}: nieuwe aanvraag ter beoordeling' # These emails are Dutch-only, therefore intentionally untranslated - subject = subject.format( - review.proposal.committee_prefixed_refnum(), - ) + subject = subject.format(review.proposal.committee_prefixed_refnum(), + ) for user in commission_users: + Decision.objects.create(review=review, reviewer=user) params = { - "secretary": get_secretary().get_full_name(), - "reviewer": user.get_full_name(), - "review_date": review.date_should_end, - "is_pre_assessment": review.proposal.is_pre_assessment, - "was_revised": was_revised, + 'secretary': get_secretary().get_full_name(), + 'reviewer': user.get_full_name(), + 'review_date': review.date_should_end, + 'is_pre_assessment': review.proposal.is_pre_assessment, + 'was_revised': was_revised, } msg_plain = render_to_string(template, params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [user.email]) @@ -348,14 +279,12 @@ def notify_secretary_assignment(review): secretary = get_secretary() proposal = review.proposal committee = review.proposal.reviewing_committee - subject = _("FETC-GW {}: nieuwe aanvraag ingediend").format( - proposal.committee_prefixed_refnum() - ) + subject = _('FETC-GW {}: nieuwe aanvraag ingediend').format(proposal.committee_prefixed_refnum()) params = { - "secretary": secretary.get_full_name(), - "review": review, + 'secretary': secretary.get_full_name(), + 'review': review, } - msg_plain = render_to_string("mail/submitted.txt", params) + msg_plain = render_to_string('mail/submitted.txt', params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) @@ -365,17 +294,16 @@ def notify_secretary(decision): """ secretary = get_secretary() proposal = decision.review.proposal - subject = _("FETC-GW {}: nieuwe beoordeling toegevoegd").format( + subject = _('FETC-GW {}: nieuwe beoordeling toegevoegd').format( proposal.committee_prefixed_refnum(), ) params = { - "secretary": secretary.get_full_name(), - "decision": decision, + 'secretary': secretary.get_full_name(), + 'decision': decision, } - msg_plain = render_to_string("mail/decision_notify.txt", params) + msg_plain = render_to_string('mail/decision_notify.txt', params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) - def notify_secretary_all_decisions(review): """ Notifies a secretary all Decisions have been made for a certain review @@ -392,26 +320,23 @@ def notify_secretary_all_decisions(review): msg_plain = render_to_string("mail/all_decisions_notify.txt", params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) - def notify_supervisor_nogo(decision): secretary = get_secretary() proposal = decision.review.proposal supervisor = proposal.supervisor receivers = set(applicant for applicant in proposal.applicants.all()) - subject = _( - "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld".format( - proposal.committee_prefixed_refnum(), - ) + subject = _('FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld'.format( + proposal.committee_prefixed_refnum(),) ) params = { - "secretary": secretary.get_full_name(), - "decision": decision, - "supervisor": supervisor, + 'secretary': secretary.get_full_name(), + 'decision': decision, + 'supervisor': supervisor, } for applicant in receivers: - params["applicant"] = applicant - msg_plain = render_to_string("mail/supervisor_decision.txt", params) + params['applicant'] = applicant + msg_plain = render_to_string('mail/supervisor_decision.txt', params) send_mail(subject, msg_plain, settings.EMAIL_FROM, [applicant.email]) @@ -424,66 +349,40 @@ def auto_review(proposal: Proposal): reasons = [] for study in proposal.study_set.all(): + if study.legally_incapable: - reasons.append( - _("De aanvraag bevat het gebruik van wilsonbekwame volwassenen.") - ) + reasons.append(_('De aanvraag bevat het gebruik van wilsonbekwame volwassenen.')) if study.deception in [YES, DOUBT]: - reasons.append(_("De aanvraag bevat het gebruik van misleiding.")) + reasons.append(_('De aanvraag bevat het gebruik van misleiding.')) if study.hierarchy: - reasons.append( - _( - "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" - ) - ) + reasons.append(_('Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)')) if study.has_special_details: - reasons.append(_("Het onderzoek verzamelt bijzondere persoonsgegevens.")) + reasons.append(_('Het onderzoek verzamelt bijzondere persoonsgegevens.')) if study.has_traits: - reasons.append( - _( - "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht verhoogde kwetsbaarheid met zich meebrengen." - ) - ) + reasons.append(_('Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht verhoogde kwetsbaarheid met zich meebrengen.')) for task in Task.objects.filter(session__study=study): reasons.extend(auto_review_task(study, task)) if study.stressful in [YES, DOUBT]: - reasons.append( - _( - "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op onderdelen of \ -als geheel zodanig belastend is dat deze ondanks de verkregen informed consent vragen zou kunnen oproepen." - ) - ) + reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op onderdelen of \ +als geheel zodanig belastend is dat deze ondanks de verkregen informed consent vragen zou kunnen oproepen.')) if study.risk in [YES, DOUBT]: - reasons.append( - _( - "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op psychische of \ -fysieke schade bij deelname aan het onderzoek meer dan minimaal zijn." - ) - ) + reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) de risico\'s op psychische of \ +fysieke schade bij deelname aan het onderzoek meer dan minimaal zijn.')) if study.has_sessions: for session in study.session_set.all(): for age_group in study.age_groups.all(): if session.net_duration() > age_group.max_net_duration: - reasons.append( - _( - "De totale duur van de taken in sessie {s}, exclusief pauzes \ + reasons.append(_('De totale duur van de taken in sessie {s}, exclusief pauzes \ en andere niet-taak elementen ({d} minuten), is groter dan het streefmaximum ({max_d} minuten) \ -voor de leeftijdsgroep {ag}." - ).format( - s=session.order, - ag=age_group, - d=session.net_duration(), - max_d=age_group.max_net_duration, - ) - ) +voor de leeftijdsgroep {ag}.').format(s=session.order, ag=age_group, d=session.net_duration(), max_d=age_group.max_net_duration)) return reasons @@ -498,30 +397,18 @@ def auto_review_observation(observation): if observation.settings_requires_review(): for setting in observation.settings_requires_review(): - reasons.append( - _( - "Het onderzoek observeert deelnemers in de volgende setting: {s}" - ).format(s=setting) - ) + reasons.append(_('Het onderzoek observeert deelnemers in de volgende setting: {s}').format(s=setting)) if observation.is_nonpublic_space: if not observation.has_advanced_consent: - reasons.append( - _( - "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met informed consent achteraf." - ) - ) + reasons.append(_('Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met informed consent achteraf.')) if observation.is_anonymous: - reasons.append( - _( - 'De onderzoeker begeeft zich "under cover" in een beheerde niet-publieke ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie deel en/of verzamelt data die te herleiden zijn tot individuele personen.' - ) - ) + reasons.append(_('De onderzoeker begeeft zich "under cover" in een beheerde niet-publieke ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie deel en/of verzamelt data die te herleiden zijn tot individuele personen.')) for registration in observation.registrations.all(): if registration.requires_review: reasons.append( - _("De aanvraag bevat het gebruik van {}").format( + _('De aanvraag bevat het gebruik van {}').format( registration.description ) ) @@ -541,15 +428,8 @@ def auto_review_task(study, task): if registration.requires_review: if registration.age_min: for age_group in study.age_groups.all(): - if ( - age_group.age_max is not None - and age_group.age_max < registration.age_min - ): - reasons.append( - _( - "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." - ).format(registration.age_min) - ) + if age_group.age_max is not None and age_group.age_max < registration.age_min: + reasons.append(_('De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar.').format(registration.age_min)) break return reasons @@ -558,7 +438,7 @@ def auto_review_task(study, task): def discontinue_review(review): """ Set continuation to discontinued on the given review, - and set DECISION_MADE on its proposal.""" + and set DECISION_MADE on its proposal. """ # Set review continuation review.continuation = review.DISCONTINUED @@ -583,17 +463,21 @@ def assign_reviewers(review, list_of_users, route): obsolete_reviewers = current_reviewers - list_of_users if review.proposal.is_revision: - # Revisions should end in one week. - review.date_should_end = timezone.now() + timezone.timedelta(weeks=1) + #Revisions should end in one week. + review.date_should_end = timezone.now() + \ + timezone.timedelta( + weeks=1 + ) elif review.date_should_end is not None: - # if the date_end_variable gets assigned through auto review - # the review keeps this date + #if the date_end_variable gets assigned through auto review + #the review keeps this date pass elif route == True: - # The short route reviews should take two weeks. - review.date_should_end = timezone.now() + timezone.timedelta( - weeks=settings.SHORT_ROUTE_WEEKS - ) + #The short route reviews should take two weeks. + review.date_should_end = timezone.now() + \ + timezone.timedelta( + weeks=settings.SHORT_ROUTE_WEEKS + ) elif route == False: # We have no desired end date for long track reviews review.date_should_end = None @@ -602,7 +486,8 @@ def assign_reviewers(review, list_of_users, route): start_review_route(review, new_reviewers, route) # Remove the Decision for obsolete reviewers - Decision.objects.filter(review=review, reviewer__in=obsolete_reviewers).delete() + Decision.objects.filter(review=review, + reviewer__in=obsolete_reviewers).delete() review.save() @@ -610,7 +495,6 @@ def assign_reviewers(review, list_of_users, route): # This prevents it waiting for removed reviewers review.update_go() - def straight_to_revision(review): """This action by the secretary in ReviewAssignForm bypasses the usual review process and sends a review straight to revision""" From ea01d88484112f32309d06e5cc7e7ca7c03db3ba Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 21 Nov 2023 09:57:16 +0100 Subject: [PATCH 087/148] corrected email params --- reviews/utils/review_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index 597e19f2d..5295b304c 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -309,7 +309,7 @@ def notify_secretary_all_decisions(review): Notifies a secretary all Decisions have been made for a certain review """ secretary = get_secretary() - subject = _("FETC-GW {}: alle beoordelingen toegevoegd").format( + subject = "FETC-GW {}: alle beoordelingen toegevoegd".format( review.proposal.committee_prefixed_refnum(), ) params = { @@ -318,7 +318,7 @@ def notify_secretary_all_decisions(review): "decisions": review.decision_set.all() } msg_plain = render_to_string("mail/all_decisions_notify.txt", params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, [secretary.email]) + send_mail(subject, msg_plain, settings.EMAIL_FROM, ['fetc-gw@uu.nl']) def notify_supervisor_nogo(decision): secretary = get_secretary() From 4d061bf0fff054ae70989a18fe3655855ce4437d Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Tue, 21 Nov 2023 16:03:30 +0100 Subject: [PATCH 088/148] chore: post-merge cleanup --- locale/en/LC_MESSAGES/django.po | 393 ++++++++++---------------------- 1 file changed, 117 insertions(+), 276 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index e8b428c89..4f89bcc22 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-15 12:06+0100\n" +"POT-Creation-Date: 2023-11-21 16:02+0100\n" "PO-Revision-Date: 2023-11-07 10:36+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -63,21 +63,7 @@ msgstr "FAQ" msgid "Frequently Asked Questions" msgstr "Frequently Asked Questions" -#: observations/templates/observations/observation_update_attachments.html:39 -#: proposals/templates/proposals/proposal_confirmation.html:36 -#: proposals/templates/proposals/proposal_diff.html:58 -#: proposals/templates/proposals/proposal_update_attachments.html:26 -#: proposals/templates/proposals/proposal_update_date_start.html:29 -#: reviews/templates/reviews/change_chamber_form.html:19 -#: reviews/templates/reviews/decision_form.html:90 -#: reviews/templates/reviews/review_assign_form.html:46 -#: reviews/templates/reviews/review_close_form.html:41 -#: reviews/templates/reviews/review_discontinue_form.html:72 -#: studies/templates/studies/study_update_attachments.html:26 -msgid "Terug naar de vorige pagina" -msgstr "Back to the previous page" - -#: fetc/settings.py:133 +#: fetc/settings.py:132 msgid "Nederlands" msgstr "Dutch" @@ -234,7 +220,7 @@ msgstr "uncertain" msgid "Geef aan waar de dataverzameling plaatsvindt" msgstr "Specify where the data collection will take place" -#: main/models.py:70 observations/models.py:129 proposals/models.py:264 +#: main/models.py:70 observations/models.py:129 proposals/models.py:263 #: studies/models.py:208 studies/models.py:244 tasks/models.py:157 #: tasks/models.py:169 msgid "Namelijk" @@ -275,7 +261,7 @@ msgid "Gebruiksersnaam" msgstr "Username" #: main/templates/auth/user_detail.html:30 -#: proposals/templates/proposals/proposal_pdf.html:120 +#: proposals/templates/proposals/proposal_pdf.html:119 msgid "E-mail" msgstr "E-mail" @@ -342,7 +328,7 @@ msgstr "Conclusion" msgid "Acties" msgstr "Actions" -#: main/templates/auth/user_detail.html:75 reviews/models.py:139 +#: main/templates/auth/user_detail.html:75 reviews/models.py:140 msgid ", met revisie" msgstr ", with revision" @@ -421,147 +407,6 @@ msgstr "Save and go to next step >>" msgid "Welkom {}" msgstr "Welcome {}" -#: main/templates/base/menu.html:11 proposals/menus.py:80 -msgid "Mijn aanvragen" -msgstr "My applications" - -#: main/templates/base/menu.html:14 proposals/menus.py:9 -msgid "Nieuwe aanvraag starten" -msgstr "Start a new application" - -#: main/templates/base/menu.html:17 -msgid "Nieuwe studie starten op basis van een kopie van een oude studie" -msgstr "Start a new study based on a copy of an old study" - -#: main/templates/base/menu.html:20 -msgid "Nieuwe voortoetsing aanvraag starten" -msgstr "Start a new preliminary application" - -#: main/templates/base/menu.html:23 -msgid "" -"Nieuwe aanvraag starten (die al goedgekeurd is door een andere ethische " -"toetsingscommissie)" -msgstr "" -"Start a new application (that has been approved by another ethics committee)" - -#: main/templates/base/menu.html:26 proposals/menus.py:30 -msgid "Maak een revisie van een bestaande aanvraag" -msgstr "Create a revision for an existing application" - -#: main/templates/base/menu.html:29 proposals/menus.py:34 -msgid "Maak een amendement van een al goedgekeurde aanvraag" -msgstr "Create an amendment to an already approved application" - -#: main/templates/base/menu.html:32 proposals/menus.py:56 -#: proposals/views/proposal_views.py:78 -msgid "Mijn conceptaanvragen" -msgstr "My draft applications" - -#: main/templates/base/menu.html:35 proposals/menus.py:60 -#: proposals/views/proposal_views.py:128 -msgid "Mijn oefenaanvragen" -msgstr "My practice applications" - -#: main/templates/base/menu.html:38 proposals/menus.py:64 -#: proposals/views/proposal_views.py:90 -msgid "Mijn ingediende aanvragen" -msgstr "My submitted applications" - -#: main/templates/base/menu.html:41 proposals/menus.py:68 -#: proposals/views/proposal_views.py:102 -msgid "Mijn afgehandelde aanvragen" -msgstr "My processed applications" - -#: main/templates/base/menu.html:44 proposals/menus.py:72 -#: proposals/views/proposal_views.py:114 -msgid "Mijn aanvragen als eindverantwoordelijke" -msgstr "My supervised applications" - -#: main/templates/base/menu.html:47 proposals/menus.py:52 -msgid "Al mijn aanvragen" -msgstr "All my applications" - -#: main/templates/base/menu.html:52 proposals/menus.py:110 -#: proposals/views/proposal_views.py:155 -msgid "Archief" -msgstr "Archive" - -#: main/templates/base/menu.html:55 -msgid "Alle aanvragen bekijken van de Algemene Kamer" -msgstr "View all applications of the General Chamber" - -#: main/templates/base/menu.html:58 -msgid "Alle aanvragen bekijken van de Linguïstiek Kamer" -msgstr "" -"View all processed and approved applications of the Linguistics Chamber" - -#: main/templates/base/menu.html:62 proposals/menus.py:100 -msgid "Site-export" -msgstr "Site-export" - -#: main/templates/base/menu.html:69 reviews/forms.py:31 reviews/menus.py:60 -#: reviews/mixins.py:127 -msgid "Algemene Kamer" -msgstr "General Chamber" - -#: main/templates/base/menu.html:72 main/templates/base/menu.html:99 -#: reviews/menus.py:14 reviews/views.py:70 -msgid "Mijn openstaande besluiten" -msgstr "My pending decisions" - -#: main/templates/base/menu.html:75 main/templates/base/menu.html:102 -#: reviews/menus.py:18 -msgid "Al mijn besluiten" -msgstr "All my decisions" - -#: main/templates/base/menu.html:79 main/templates/base/menu.html:106 -#: reviews/menus.py:22 -msgid "Alle openstaande besluiten commissieleden" -msgstr "All pending decisions committee members" - -#: main/templates/base/menu.html:82 main/templates/base/menu.html:109 -#: reviews/menus.py:27 -msgid "Alle openstaande besluiten eindverantwoordelijken" -msgstr "All pending decisions supervisors" - -#: main/templates/base/menu.html:85 main/templates/base/menu.html:112 -#: reviews/menus.py:32 reviews/views.py:229 -msgid "Nog af te handelen aanvragen" -msgstr "Applications waiting for conclusion" - -#: main/templates/base/menu.html:88 main/templates/base/menu.html:115 -#: reviews/menus.py:47 reviews/views.py:275 -msgid "Alle ingezonden aanvragen" -msgstr "All submitted applications" - -#: main/templates/base/menu.html:96 reviews/forms.py:32 reviews/menus.py:67 -#: reviews/mixins.py:130 -msgid "Linguïstiek Kamer" -msgstr "Linguistics Chamber" - -#: main/templates/base/menu.html:128 -msgid "Reglement Algemene Kamer (AK)" -msgstr "Regulations General Chamber (GC)" - -#: main/templates/base/menu.html:131 -msgid " Reglement Linguïstiek Kamer (LK) " -msgstr " Regulations Linguistics Chamber (LC) " - -#: main/templates/base/menu.html:145 -#: main/templates/registration/logged_out.html:9 -msgid "Uitloggen" -msgstr "Log out" - -#: main/templates/base/menu.html:149 -msgid "FETC-GW-website" -msgstr "FEtC-H website" - -#: main/templates/base/menu.html:152 main/templates/main/landing.html:77 -#: main/templates/registration/login.html:15 -#: main/templates/registration/login.html:32 -msgid "Inloggen" -msgstr "Log in" - #: main/templates/base/sidebar.html:27 msgid "Toon voortgang" msgstr "Show progress" @@ -978,7 +823,7 @@ msgstr "Log out" #: main/templates/registration/logged_out.html:12 msgid "Je bent succesvol uitgelogd." -msgstr "You have successfully logged out." +msgstr "" #: main/templates/registration/logged_out.html:17 #, python-format @@ -1076,7 +921,7 @@ msgid "" msgstr "As might happen on forums where the researcher also has an account." #: observations/models.py:65 observations/models.py:75 -#: observations/models.py:88 proposals/models.py:738 studies/models.py:172 +#: observations/models.py:88 proposals/models.py:745 studies/models.py:172 #: studies/models.py:228 studies/models.py:358 msgid "Licht toe" msgstr "Explain" @@ -1243,7 +1088,7 @@ msgstr "Last edited" msgid "Datum ingediend bij eindverantwoordelijke" msgstr "Date sent to supervisor" -#: proposals/forms.py:43 proposals/models.py:221 +#: proposals/forms.py:43 proposals/models.py:229 msgid "" "Zijn er nog andere onderzoekers bij deze aanvraag betrokken die " "niet geaffilieerd zijn aan een van de onderzoeksinstituten " @@ -1316,11 +1161,11 @@ msgstr "" msgid "Ik maak een oefenaanvraag aan" msgstr "I am creating a practice application" -#: proposals/forms.py:286 proposals/models.py:539 +#: proposals/forms.py:286 proposals/models.py:546 msgid "Te kopiëren aanvraag" msgstr "Application to be copied" -#: proposals/forms.py:288 proposals/models.py:541 +#: proposals/forms.py:288 proposals/models.py:548 msgid "Dit veld toont enkel aanvragen waar je zelf een medeuitvoerende bent." msgstr "This field shows only applications in which you are involved." @@ -1530,40 +1375,40 @@ msgstr "Archive" msgid "Aanvraag %(title)s bewerkt" msgstr "Application %(title)s edited" -#: proposals/models.py:143 +#: proposals/models.py:142 msgid "Concept" msgstr "Draft" -#: proposals/models.py:146 +#: proposals/models.py:145 msgid "Opgestuurd ter beoordeling door eindverantwoordelijke" msgstr "Sent for assessment by the researcher with final responsibility" -#: proposals/models.py:147 +#: proposals/models.py:146 msgid "Opgestuurd ter beoordeling door FETC-GW" msgstr "Sent for assessment by FEtC-H" -#: proposals/models.py:149 proposals/models.py:150 +#: proposals/models.py:148 proposals/models.py:149 msgid "Aanvraag is beoordeeld door FETC-GW" msgstr "Application has been assessed by FEtC-H" -#: proposals/models.py:156 +#: proposals/models.py:155 msgid "in het kader van een cursus" msgstr "in the context of a course" -#: proposals/models.py:157 +#: proposals/models.py:156 msgid "om de portal te exploreren" msgstr "to explore the portal" # Not actually used in the interface -#: proposals/models.py:169 +#: proposals/models.py:168 msgid "Door welke comissie dient deze aanvraag te worden beoordeeld?" msgstr "Which chamber should be reviewing this application?" -#: proposals/models.py:178 +#: proposals/models.py:177 msgid "Aan welk onderzoeksinstituut ben je verbonden?" msgstr "To which research institute are you affiliated?" -#: proposals/models.py:184 +#: proposals/models.py:183 msgid "" "Wat is de beoogde startdatum van het onderzoek waarvoor deze aanvraag wordt " "ingediend?" @@ -1571,7 +1416,7 @@ msgstr "" "What is the desired starting date of the actual research for which this " "application is being submitted?" -#: proposals/models.py:185 +#: proposals/models.py:184 msgid "" "NB: Voor een aanvraag van een onderzoek dat al gestart is voordat de FETC-GW " "de aanvraag heeft goedgekeurd kan geen formele goedkeuring meer gegeven " @@ -1581,7 +1426,7 @@ msgstr "" "has approved it cannot receive formal approval; in such cases, the FEtC-H " "only provides a post-hoc advice." -#: proposals/models.py:194 +#: proposals/models.py:193 msgid "" "Wat is de titel van je aanvraag? Deze titel zal worden gebruikt in alle " "formele correspondentie." @@ -1589,7 +1434,7 @@ msgstr "" "What is the title of your application? This title will be used in all formal " "correspondence." -#: proposals/models.py:199 +#: proposals/models.py:198 msgid "" "De titel die je hier opgeeft is zichtbaar voor de FETC-GW-leden en, wanneer " "de aanvraag is goedgekeurd, ook voor alle medewerkers die in het archief van " @@ -1601,7 +1446,7 @@ msgstr "" "portal. The title cannot be identical to that of a study you have previously " "submitted." -#: proposals/models.py:207 +#: proposals/models.py:206 msgid "" "Geef een duidelijke, bondige beschrijving van de onderzoeksvraag of -vragen. " "Gebruik maximaal 200 woorden." @@ -1609,7 +1454,7 @@ msgstr "" "Give a clear, concise description of the research question or questions. Use " "a maximum of 200 words." -#: proposals/models.py:215 +#: proposals/models.py:214 msgid "" "Zijn er nog andere onderzoekers bij deze aanvraag betrokken die geaffilieerd " "zijn aan één van de onderzoeksinstituten ICON, OFR, OGK of ILS?" @@ -1617,7 +1462,7 @@ msgstr "" "Are there any other researchers involved affiliated with ICON, OFR, OGK or " "ILS?" -#: proposals/models.py:218 +#: proposals/models.py:217 msgid "" "Werk je samen met een onderzoeker of organisatie buiten de UU en is je " "onderzoek niet strikt anoniem? Neem dan contact op met de privacy officer. Agreements may then have to be made about " "the processing of personal data." -#: proposals/models.py:238 +#: proposals/models.py:237 msgid "Andere betrokkenen" msgstr "Other people involved" -#: proposals/models.py:243 +#: proposals/models.py:242 msgid "" "Worden de informed consent formulieren nog vertaald naar een andere taal dan " "Nederlands of Engels?" @@ -1641,30 +1486,30 @@ msgstr "" "Will the informed consent forms be translated in a language other than Dutch " "or English?" -#: proposals/models.py:250 +#: proposals/models.py:249 msgid "Andere talen:" msgstr "Other languages:" -#: proposals/models.py:259 +#: proposals/models.py:258 msgid "Hoe wordt dit onderzoek gefinancierd?" msgstr "How is this study funded?" -#: proposals/models.py:270 +#: proposals/models.py:269 msgid "" "Wat is de naam van het gefinancierde project en wat is het projectnummer?" msgstr "What is the name of the funded project and what is the project number?" -#: proposals/models.py:274 +#: proposals/models.py:273 msgid "" "De titel die je hier opgeeft zal in de formele toestemmingsbrief gebruikt " "worden." msgstr "This title will be used in the formal letter of approval." -#: proposals/models.py:280 +#: proposals/models.py:279 msgid "Ruimte voor eventuele opmerkingen. Gebruik maximaal 1000 woorden." msgstr "Space for possible comments. Use a maximum of a 1000 words." -#: proposals/models.py:286 +#: proposals/models.py:285 msgid "" "

    Je hebt aangegeven dat je gebruik wilt gaan maken van één van de " "faciliteiten van het ILS, namelijk de database, Zep software en/of het ILS " @@ -1687,7 +1532,7 @@ msgstr "" "> - The title of the study
    - The planned starting date
    - The " "facilities you intend to use (database, lab, Zep software)" -#: proposals/models.py:306 +#: proposals/models.py:305 msgid "" "Als de deelnemers van je onderzoek moeten worden misleid, kan je " "ervoor kiezen je applicatie pas later op te laten nemen in het " @@ -1699,16 +1544,16 @@ msgstr "" "for users of this portal. Would you like your application to be placed under " "a temporary embargo?" -#: proposals/models.py:317 +#: proposals/models.py:316 msgid "" "Vanaf welke datum mag je onderzoek wel in het archief worden weergegeven?" msgstr "From which date may your application be displayed in the archive?" -#: proposals/models.py:327 +#: proposals/models.py:326 msgid "Upload hier je aanvraag (in .pdf of .doc(x)-formaat)" msgstr "Upload your application here (in .pdf or .doc(x)-format)" -#: proposals/models.py:335 +#: proposals/models.py:334 msgid "" "Heb je formele toestemming van een ethische toetsingcommissie, uitgezonderd " "deze FETC-GW commissie?" @@ -1716,11 +1561,11 @@ msgstr "" "Do you have formal approval from an ethics committee, other than this FEtC-H " "committee?" -#: proposals/models.py:343 +#: proposals/models.py:342 msgid "Welk instituut heeft de aanvraag goedgekeurd?" msgstr "Which institute approved the application?" -#: proposals/models.py:351 +#: proposals/models.py:350 msgid "" "Upload hier je formele toestemmingsbrief van dit instituut (in .pdf of ." "doc(x)-formaat)" @@ -1728,22 +1573,22 @@ msgstr "" "Please upload the formal approval letter from this institute here (in .pdf " "or .doc(x)-format)" -#: proposals/models.py:359 +#: proposals/models.py:358 msgid "Ik vul de portal in in het kader van een cursus" msgstr "I am using this portal in the context of a course" -#: proposals/models.py:364 +#: proposals/models.py:363 msgid "Ik vul de portal in om de portal te exploreren" msgstr "I am using this portal to explore the portal" -#: proposals/models.py:376 +#: proposals/models.py:375 msgid "" "Kan voor alle deelnemersgroepen dezelfde informatiebrief en " "toestemmingsverklaring gebruikt worden?" msgstr "" "Can the same informed consent documents be used for all participant groups?" -#: proposals/models.py:378 +#: proposals/models.py:377 msgid "" "Daar waar de verschillen klein en qua belasting of risico irrelevant zijn is " "sprake van in essentie hetzelfde traject, en voldoet één set documenten voor " @@ -1767,19 +1612,19 @@ msgstr "" "time. However, if separate groups receive different kinds of tasks, " "they constitute separate trajectories." -#: proposals/models.py:394 +#: proposals/models.py:393 msgid "Hoeveel verschillende trajecten zijn er?" msgstr "How many different trajectories are there?" -#: proposals/models.py:412 +#: proposals/models.py:411 msgid "" "Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de " "privacy officer." msgstr "" -"I discussed my application and documents for participants with the " -"privacy officer." +"I discussed my application and documents for participants with the privacy " +"officer." -#: proposals/models.py:411 +#: proposals/models.py:418 msgid "" "Als je een Data Management Plan hebt voor deze aanvraag, kan je kiezen om " "deze hier bij te voegen. Het aanleveren van een DMP vergemakkelijkt het " @@ -1789,24 +1634,24 @@ msgstr "" "include it here. Supplying a DMP can expedite ethical assessment of " "proposals." -#: proposals/models.py:423 proposals/utils/pdf_diff_logic.py:990 -#: reviews/models.py:188 +#: proposals/models.py:430 proposals/utils/pdf_diff_logic.py:990 +#: reviews/models.py:189 msgid "Ruimte voor eventuele opmerkingen" msgstr "Space for possible comments" -#: proposals/models.py:435 +#: proposals/models.py:442 msgid "Datum bevestigingsbrief verstuurd" msgstr "Date confirmation sent" -#: proposals/models.py:440 reviews/forms.py:110 +#: proposals/models.py:447 reviews/forms.py:110 msgid "Is er een revisie geweest na het indienen van deze aanvraag?" msgstr "Has this proposal been amended after it was submitted?" -#: proposals/models.py:445 +#: proposals/models.py:452 msgid "Leg uit" msgstr "Explain why" -#: proposals/models.py:451 +#: proposals/models.py:458 msgid "" "Wat zijn de belangrijkste ethische kwesties in dit onderzoek en beschrijf " "kort hoe ga je daarmee omgaat. Gebruik maximaal 1000 woorden." @@ -1815,23 +1660,23 @@ msgstr "" "please describe briefly how you will address them. Use a maximum of a 1000 " "words." -#: proposals/models.py:465 +#: proposals/models.py:472 msgid "In welke hoedanigheid ben je betrokken bij dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:473 +#: proposals/models.py:480 msgid "Wat is je studierichting?" msgstr "What is your course of study?" -#: proposals/models.py:480 +#: proposals/models.py:487 msgid "In welke context doe je dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:487 +#: proposals/models.py:494 msgid "Namelijk:" msgstr "Please specify:" -#: proposals/models.py:494 +#: proposals/models.py:501 msgid "" "Studenten (die mensgebonden onderzoek uitvoeren binnen hun studieprogramma) " "hoeven in principe geen aanvraag in te dienen bij de FETC-GW. Bespreek met " @@ -1845,7 +1690,7 @@ msgstr "" "do not not, you can terminate your proposal now. If you do, please explain " "what the reason is:" -#: proposals/models.py:511 +#: proposals/models.py:518 msgid "" "Uitvoerenden, inclusief uzelf. Let op! De andere onderzoekers moeten " "ten minste één keer zijn ingelogd op dit portaal om ze te kunnen selecteren." @@ -1854,13 +1699,13 @@ msgstr "" "researchers need to have logged into this portal at least once, in order to " "be selectable here." -#: proposals/models.py:518 +#: proposals/models.py:525 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 #: proposals/templates/proposals/vue_templates/proposal_list.html:166 msgid "Promotor/Begeleider" msgstr "Promotor/Supervisor" -#: proposals/models.py:521 +#: proposals/models.py:528 msgid "" "Je aanvraag moet, als je alles hebt ingevuld, via de portal \n" " naar je promotor of begeleider gestuurd worden. Deze " @@ -1890,53 +1735,53 @@ msgstr "" "you wait for them to do this, but remember to come back and fill in this " "field before submitting." -#: proposals/models.py:548 +#: proposals/models.py:555 msgid "" "Is deze aanvraag een revisie van of amendement op een ingediende aanvraag?" msgstr "" "Is this application a revision or an amendment of a previously submitted " "application?" -#: proposals/models.py:620 +#: proposals/models.py:627 msgid "Amendement" msgstr "Amendment" -#: proposals/models.py:620 reviews/api/views.py:39 reviews/api/views.py:328 +#: proposals/models.py:627 reviews/api/views.py:39 reviews/api/views.py:328 #: reviews/templates/reviews/committee_members_workload.html:36 #: reviews/templates/reviews/committee_members_workload.html:82 #: reviews/templates/reviews/review_detail_sidebar.html:106 msgid "Revisie" msgstr "Revision" -#: proposals/models.py:626 +#: proposals/models.py:633 msgid "Normaal" msgstr "Normal" -#: proposals/models.py:631 +#: proposals/models.py:638 msgid "Voortoetsing" msgstr "Preliminary assessment" -#: proposals/models.py:633 +#: proposals/models.py:640 msgid "Oefening" msgstr "Practice" -#: proposals/models.py:635 +#: proposals/models.py:642 msgid "Extern getoetst" msgstr "External approval" -#: proposals/models.py:723 +#: proposals/models.py:730 msgid "Geen beoordeling door METC noodzakelijk" msgstr "Assessment by METC not required" -#: proposals/models.py:724 +#: proposals/models.py:731 msgid "In afwachting beslissing METC" msgstr "Pending decision by METC" -#: proposals/models.py:725 +#: proposals/models.py:732 msgid "Beslissing METC geüpload" msgstr "METC decision uploaded" -#: proposals/models.py:729 +#: proposals/models.py:736 msgid "" "Vindt de dataverzameling plaats binnen het UMC Utrecht of andere instelling " "waar toetsing door een METC verplicht is gesteld?" @@ -1944,11 +1789,11 @@ msgstr "" "Will the data collection take place at the UMC Utrecht or another " "institution for which an assessment by a METC is required?" -#: proposals/models.py:743 +#: proposals/models.py:750 msgid "Welke instelling?" msgstr "Which institution?" -#: proposals/models.py:749 +#: proposals/models.py:756 msgid "" "Is de onderzoeksvraag medisch-wetenschappelijk van aard (zoals gedefinieerd " "door de WMO)?" @@ -1956,7 +1801,7 @@ msgstr "" "Is the nature of the research question medical (as defined by the Medical " "Research Involving Human Subjects Act (WMO))?" -#: proposals/models.py:751 +#: proposals/models.py:758 msgid "" "De definitie van medisch-wetenschappelijk onderzoek is: Medisch-" "wetenschappelijk onderzoek is onderzoek dat als doel heeft het beantwoorden " @@ -1977,7 +1822,7 @@ msgstr "" "Committee on Research Involving Human Subjects, Definition of medical " "research, 2005, ccmo.nl)" -#: proposals/models.py:767 +#: proposals/models.py:774 msgid "" "Je onderzoek moet beoordeeld worden door een METC, maar dient nog wel bij de " "FETC-GW te worden geregistreerd. Is dit onderzoek al aangemeld bij een METC?" @@ -1986,15 +1831,15 @@ msgstr "" "registered with the FEtC-H. Has an application for this project already been " "submitted to an METC?" -#: proposals/models.py:774 +#: proposals/models.py:781 msgid "Is de METC al tot een beslissing gekomen?" msgstr "Has the METC already come to a decision?" -#: proposals/models.py:779 +#: proposals/models.py:786 msgid "Upload hier de beslissing van het METC (in .pdf of .doc(x)-formaat)" msgstr "Please upload the decision of METC (in .pdf or .doc(x)-format) here" -#: proposals/models.py:817 +#: proposals/models.py:824 #, python-brace-format msgid "WMO {title}, status {status}" msgstr "WMO {title}, status {status}" @@ -2516,31 +2361,31 @@ msgstr "" #: proposals/templates/proposals/proposal_pdf.html:87 #, python-format msgid "" -"FETC-GW - %(title)s (referentienummer %(reference_number)s, " -"ingediend door %(submitter)s)" +"FETC-GW - %(title)s (referentienummer %(reviewing_committee)s-" +"%(reference_number)s, ingediend door %(submitter)s)" msgstr "" -"FEtC-H - %(title)s (reference number %(reference_number)s, " -"submitted by %(submitter)s)" +"FEtC-H - %(title)s (reference number %(reviewing_committee)s-" +"%(reference_number)s, submitted by %(submitter)s)" -#: proposals/templates/proposals/proposal_pdf.html:94 +#: proposals/templates/proposals/proposal_pdf.html:93 #, python-format msgid "%(type)s van referentienummer %(reference_number)s" msgstr "%(type)s of reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:110 +#: proposals/templates/proposals/proposal_pdf.html:109 #, python-format msgid "Referentienummer %(reference_number)s" msgstr "Reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:114 +#: proposals/templates/proposals/proposal_pdf.html:113 msgid "Huidige staat van de aanvraag" msgstr "Current state of the application" -#: proposals/templates/proposals/proposal_pdf.html:117 +#: proposals/templates/proposals/proposal_pdf.html:116 msgid "Indiener" msgstr "Applicant" -#: proposals/templates/proposals/proposal_pdf.html:119 +#: proposals/templates/proposals/proposal_pdf.html:118 #: tasks/templates/tasks/task_list.html:7 msgid "Naam" msgstr "Name" @@ -3273,7 +3118,7 @@ msgstr "" "This section was present in the original application, but was removed for " "the revision." -#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:130 +#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:131 msgid "Onbekend" msgstr "Unknown" @@ -3412,10 +3257,6 @@ msgstr "Overview of task-based research: session {} (trajectory {})" msgid "AVG en Data Management" msgstr "AVG and Data Management" -#: proposals/validators.py:35 -msgid "Je dient deze vraag in te vullen om jouw aanvraag in te dienen" -msgstr "You must answer this question before you can submit your application" - #: proposals/views/proposal_views.py:45 msgid "Publiek archief" msgstr "Public archive" @@ -3514,11 +3355,11 @@ msgstr "Route" msgid "Start datum" msgstr "Start date review" -#: reviews/forms.py:14 reviews/models.py:146 +#: reviews/forms.py:14 reviews/models.py:147 msgid "korte (2-weken) route" msgstr "short (2-week) route" -#: reviews/forms.py:15 reviews/models.py:145 +#: reviews/forms.py:15 reviews/models.py:146 msgid "lange (4-weken) route" msgstr "long (4-week) route" @@ -3650,24 +3491,24 @@ msgstr "Post hoc negative advice by FETC-H" msgid "Niet verder in behandeling genomen" msgstr "Not to be assessed further" -#: reviews/models.py:51 reviews/models.py:182 +#: reviews/models.py:51 reviews/models.py:183 #: reviews/templates/reviews/review_table.html:9 msgid "Beslissing" msgstr "Decision" -#: reviews/models.py:147 +#: reviews/models.py:148 msgid "nog geen route" msgstr "no route assigned" -#: reviews/models.py:176 +#: reviews/models.py:177 msgid "goedgekeurd" msgstr "endorsed" -#: reviews/models.py:177 +#: reviews/models.py:178 msgid "niet goedgekeurd" msgstr "not endorsed" -#: reviews/models.py:178 +#: reviews/models.py:179 msgid "revisie noodzakelijk" msgstr "revision necessary" @@ -4367,57 +4208,57 @@ msgstr "Edit start date" msgid "FETC-GW {}: bevestiging indienen concept-aanmelding" msgstr "FEtC-H {}: confirmation of draft application submission" -#: reviews/utils/review_utils.py:75 +#: reviews/utils/review_utils.py:82 msgid "FETC-GW {}: beoordelen als eindverantwoordelijke" msgstr "FEtC-H {}: assess as researcher with final responsibility" -#: reviews/utils/review_utils.py:125 +#: reviews/utils/review_utils.py:132 msgid "FETC-GW {}: aanmelding ontvangen" msgstr "FEtC-H {}: application received" -#: reviews/utils/review_utils.py:219 +#: reviews/utils/review_utils.py:231 msgid "FETC-GW {}: nieuwe aanvraag voor voortoetsing" msgstr "FEtC-H {}: new application for preliminary assessment" -#: reviews/utils/review_utils.py:233 +#: reviews/utils/review_utils.py:245 msgid "FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing" msgstr "" "FEtC-H {}: confirmation of submission of application for preliminary " "assessment" -#: reviews/utils/review_utils.py:282 +#: reviews/utils/review_utils.py:294 msgid "FETC-GW {}: nieuwe aanvraag ingediend" msgstr "FEtC-H {}: new application submitted" -#: reviews/utils/review_utils.py:297 +#: reviews/utils/review_utils.py:309 msgid "FETC-GW {}: nieuwe beoordeling toegevoegd" msgstr "FEtC-H {}: new decision added" -#: reviews/utils/review_utils.py:313 +#: reviews/utils/review_utils.py:325 msgid "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld" msgstr "FEtC-H {}: a supervisor has reviewed your application" -#: reviews/utils/review_utils.py:339 +#: reviews/utils/review_utils.py:351 msgid "De aanvraag bevat het gebruik van wilsonbekwame volwassenen." msgstr "" "The application contains the participation of adults incapable of informed " "consent." -#: reviews/utils/review_utils.py:342 +#: reviews/utils/review_utils.py:354 msgid "De aanvraag bevat het gebruik van misleiding." msgstr "The application contains the use of misrepresentation." -#: reviews/utils/review_utils.py:345 +#: reviews/utils/review_utils.py:357 msgid "" "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" msgstr "" "A hierarchal relationship between researcher(s) and participant(s) exists." -#: reviews/utils/review_utils.py:348 +#: reviews/utils/review_utils.py:360 msgid "Het onderzoek verzamelt bijzondere persoonsgegevens." msgstr "This study collects special or sensitive personal details." -#: reviews/utils/review_utils.py:351 +#: reviews/utils/review_utils.py:363 msgid "" "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht " "verhoogde kwetsbaarheid met zich meebrengen." @@ -4425,7 +4266,7 @@ msgstr "" "The study selects participants based on particular characteristics which " "might entail increased vulnerability." -#: reviews/utils/review_utils.py:357 +#: reviews/utils/review_utils.py:369 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op " "onderdelen of als geheel zodanig belastend is dat deze ondanks de verkregen " @@ -4435,7 +4276,7 @@ msgstr "" "study, in part or in its entirety, is so burdensome that despite acquiring " "informed consent it might raise questions." -#: reviews/utils/review_utils.py:361 +#: reviews/utils/review_utils.py:373 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op " "psychische of fysieke schade bij deelname aan het onderzoek meer dan " @@ -4445,7 +4286,7 @@ msgstr "" "psychological or physical harm in participating in the study are more than " "minimal." -#: reviews/utils/review_utils.py:368 +#: reviews/utils/review_utils.py:380 #, python-brace-format msgid "" "De totale duur van de taken in sessie {s}, exclusief pauzes en andere niet-" @@ -4456,14 +4297,14 @@ msgstr "" "non-task elements ({d} minutes) is greater than the task duration limit " "({max_d} minutes) for the age group {ag}." -#: reviews/utils/review_utils.py:385 +#: reviews/utils/review_utils.py:397 #, python-brace-format msgid "Het onderzoek observeert deelnemers in de volgende setting: {s}" msgstr "" "The application contains sessions with participants in the following " "setting: {s}" -#: reviews/utils/review_utils.py:389 +#: reviews/utils/review_utils.py:401 msgid "" "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met " "informed consent achteraf." @@ -4471,7 +4312,7 @@ msgstr "" "The study observes participants in a non-public space and works with " "retrospective informed consent." -#: reviews/utils/review_utils.py:391 +#: reviews/utils/review_utils.py:403 msgid "" "De onderzoeker begeeft zich \"under cover\" in een beheerde niet-publieke " "ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie " @@ -4481,11 +4322,11 @@ msgstr "" "(e.g. a digital discussion group), and takes part actively in the discussion " "and/or collects data which can be traced back to individuals." -#: reviews/utils/review_utils.py:396 +#: reviews/utils/review_utils.py:408 msgid "De aanvraag bevat het gebruik van {}" msgstr "The application makes use of {}" -#: reviews/utils/review_utils.py:417 +#: reviews/utils/review_utils.py:429 msgid "" "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." msgstr "" From aeae91ef9170553a12050d21855220048a49a6de Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Tue, 21 Nov 2023 16:06:45 +0100 Subject: [PATCH 089/148] fix: added merge migration to resolve conflicts --- proposals/migrations/0051_merge_20231121_1606.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 proposals/migrations/0051_merge_20231121_1606.py diff --git a/proposals/migrations/0051_merge_20231121_1606.py b/proposals/migrations/0051_merge_20231121_1606.py new file mode 100644 index 000000000..0ef8b45a1 --- /dev/null +++ b/proposals/migrations/0051_merge_20231121_1606.py @@ -0,0 +1,14 @@ +# Generated by Django 3.2.23 on 2023-11-21 15:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('proposals', '0050_alter_proposal_other_applicants'), + ('proposals', '0050_auto_20231116_1413'), + ] + + operations = [ + ] From 9a5c417d5d5ea46b3672b6b4aaef24a64a7af9ad Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 21 Nov 2023 16:09:26 +0100 Subject: [PATCH 090/148] changed email contents + fixed tests --- .../templates/mail/all_decisions_notify.txt | 8 ++++++-- reviews/tests.py | 4 ++-- reviews/utils/review_utils.py | 20 +++++++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/reviews/templates/mail/all_decisions_notify.txt b/reviews/templates/mail/all_decisions_notify.txt index 5c2847a58..a7ab55478 100644 --- a/reviews/templates/mail/all_decisions_notify.txt +++ b/reviews/templates/mail/all_decisions_notify.txt @@ -1,7 +1,7 @@ {% extends "mail/base-internal.txt" %} {% block content %} -Alle beoordelingen zijn toegevoegd bij de aanvraag {{ proposal.reference_number }}. +Alle beoordelingen zijn toegevoegd bij de aanvraag {{ review.proposal.reference_number }}. De review is klaar om afgesloten te worden. @@ -9,6 +9,10 @@ Overzicht beoordelingen: {% for decision in decisions %} Beoordelaar: {{ decision.reviewer.get_full_name }} Beoordeling: {{ decision.get_go_display }} -Opmerkingen: {{ decision.comments|default:"geen"|safe }} {% endfor %} + +Detailpagina: {{ review_detail_page }} + +Review afsluiten: {{ close_review_page }} + {% endblock %} diff --git a/reviews/tests.py b/reviews/tests.py index 60a4de5dc..9d619aef2 100644 --- a/reviews/tests.py +++ b/reviews/tests.py @@ -247,8 +247,8 @@ def test_decision_commission(self): self.assertEqual(review.go, False) # no go notify_secretary(decisions[1]) - self.assertEqual(len(mail.outbox), 3) - self.assertIn(c, mail.outbox[2].body) + self.assertEqual(len(mail.outbox), 4) + self.assertIn(c, mail.outbox[3].body) decisions[1].go = Decision.APPROVED decisions[1].save() diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index 5295b304c..4b2911d5d 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -5,7 +5,7 @@ from django.core.mail import send_mail from django.urls import reverse from django.template.loader import render_to_string -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import activate, get_language, ugettext_lazy as _ from django.utils import timezone from main.models import YES, DOUBT @@ -308,17 +308,29 @@ def notify_secretary_all_decisions(review): """ Notifies a secretary all Decisions have been made for a certain review """ + # Change language to Dutch for this e-mail, but save the current language to reset it later + current_language = get_language() + activate("nl") + secretary = get_secretary() subject = "FETC-GW {}: alle beoordelingen toegevoegd".format( review.proposal.committee_prefixed_refnum(), ) params = { "secretary": secretary.get_full_name(), - "proposal": review.proposal, - "decisions": review.decision_set.all() + "review": review, + "decisions": review.decision_set.all(), + "review_detail_page": settings.BASE_URL + + (reverse("reviews:detail", args=[review.pk])), + "close_review_page": settings.BASE_URL + + (reverse("reviews:close", args=[review.pk])), } msg_plain = render_to_string("mail/all_decisions_notify.txt", params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, ['fetc-gw@uu.nl']) + send_mail(subject, msg_plain, settings.EMAIL_FROM, ["fetc-gw@uu.nl"]) + + # Reset the current language + activate(current_language) + def notify_supervisor_nogo(decision): secretary = get_secretary() From 2807b93a4b027376ce2330a85f4ef23171bc4d24 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 22 Nov 2023 11:35:47 +0100 Subject: [PATCH 091/148] changed email recipient to npm --- reviews/utils/review_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index 4b2911d5d..0eef5b54e 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -326,7 +326,7 @@ def notify_secretary_all_decisions(review): + (reverse("reviews:close", args=[review.pk])), } msg_plain = render_to_string("mail/all_decisions_notify.txt", params) - send_mail(subject, msg_plain, settings.EMAIL_FROM, ["fetc-gw@uu.nl"]) + send_mail(subject, msg_plain, settings.EMAIL_FROM, [settings.EMAIL_FROM]) # Reset the current language activate(current_language) From 1cbc8ec4070a0cd65f336c23059da8f85b9b201a Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 21 Nov 2023 14:14:27 +0100 Subject: [PATCH 092/148] Refactor of all choices in reviews/models.py --- main/views.py | 2 +- proposals/api/views.py | 2 +- proposals/models.py | 4 +- proposals/utils/statistics_utils.py | 2 +- reviews/api/views.py | 58 +++++++------- reviews/forms.py | 4 +- reviews/migrations/0003_decision_go_char.py | 8 +- reviews/models.py | 85 ++++++++------------- reviews/tests.py | 24 +++--- reviews/utils/review_actions.py | 6 +- reviews/utils/review_utils.py | 8 +- reviews/views.py | 36 ++++----- 12 files changed, 110 insertions(+), 129 deletions(-) diff --git a/main/views.py b/main/views.py index 0a4a89c16..c4d13e7fa 100644 --- a/main/views.py +++ b/main/views.py @@ -112,7 +112,7 @@ def get_user_reviews(self): """Returns all Committee Reviews of this user""" reviews = {} objects = Review.objects.filter( - stage__gte=Review.ASSIGNMENT, + stage__gte=Review.Stages.ASSIGNMENT, proposal__status__gte=Proposal.SUBMITTED, proposal__created_by=self.get_object() ) diff --git a/proposals/api/views.py b/proposals/api/views.py index af99992d9..059d6357b 100644 --- a/proposals/api/views.py +++ b/proposals/api/views.py @@ -55,7 +55,7 @@ def get_context(self): 'DECISION_MADE': Proposal.DECISION_MADE, } context['review'] = { - 'REVISION': Review.REVISION, + 'REVISION': Review.Continuations.REVISION, } context['user_pk'] = self.request.user.pk diff --git a/proposals/models.py b/proposals/models.py index 09749e2b0..c0576899a 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -641,7 +641,7 @@ def supervisor_decision(self): if self.supervisor and self.status == Proposal.SUBMITTED_TO_SUPERVISOR: decisions = Decision.objects.filter( review__proposal=self, - review__stage=Review.SUPERVISOR + review__stage=Review.Stages.SUPERVISOR ).order_by('-pk') if decisions: @@ -672,7 +672,7 @@ def mark_reviewed(self, continuation, time=None): # Importing here to prevent circular import from reviews.models import Review self.status_review = continuation in [ - Review.GO, Review.GO_POST_HOC + Review.Continuations.GO, Review.Continuations.GO_POST_HOC ] self.date_reviewed = time self.generate_pdf() diff --git a/proposals/utils/statistics_utils.py b/proposals/utils/statistics_utils.py index 2aeb6c230..c15f5e803 100644 --- a/proposals/utils/statistics_utils.py +++ b/proposals/utils/statistics_utils.py @@ -57,7 +57,7 @@ def get_review_qs_for_proposals(proposal_data: QuerySet) -> QuerySet: return Review.objects.filter( proposal__in=proposal_data, ).exclude( - stage=Review.SUPERVISOR, + stage=Review.Stages.SUPERVISOR, date_end=None, ) diff --git a/reviews/api/views.py b/reviews/api/views.py index 37d5aa0a8..881eb348e 100644 --- a/reviews/api/views.py +++ b/reviews/api/views.py @@ -61,12 +61,12 @@ def get_context(self): context['is_secretary'] = is_secretary(self.request.user) context['review'] = { - 'ASSIGNMENT': Review.ASSIGNMENT, - 'COMMISSION': Review.COMMISSION, - 'CLOSING': Review.CLOSING, - 'CLOSED': Review.CLOSED, - 'GO': Review.GO, - 'GO_POST_HOC': Review.GO_POST_HOC, + 'ASSIGNMENT': Review.Stages.ASSIGNMENT, + 'COMMISSION': Review.Stages.COMMISSION, + 'CLOSING': Review.Stages.CLOSING, + 'CLOSED': Review.Stages.CLOSED, + 'GO': Review.Continuations.GO, + 'GO_POST_HOC': Review.Continuations.GO_POST_HOC, } context['current_user_pk'] = self.request.user.pk @@ -96,7 +96,7 @@ def get_queryset_for_committee(self): objects = Decision.objects.filter( reviewer=self.request.user, review__proposal__reviewing_committee=self.committee, - review__continuation__lt=Review.DISCONTINUED, + review__continuation__lt=Review.Continuations.DISCONTINUED, ) for obj in objects: @@ -119,7 +119,7 @@ def get_queryset_for_secretary(self): objects = Decision.objects.filter( reviewer__groups__name=settings.GROUP_SECRETARY, review__proposal__reviewing_committee=self.committee, - review__continuation__lt=Review.DISCONTINUED, + review__continuation__lt=Review.Continuations.DISCONTINUED, ) for obj in objects: @@ -172,7 +172,7 @@ def get_queryset_for_committee(self): reviewer=self.request.user, go='', review__proposal__reviewing_committee=self.committee, - review__continuation__lt=Review.DISCONTINUED, + review__continuation__lt=Review.Continuations.DISCONTINUED, ) for obj in objects: @@ -196,7 +196,7 @@ def get_queryset_for_secretary(self): reviewer__groups__name=settings.GROUP_SECRETARY, go='', review__proposal__reviewing_committee=self.committee, - review__continuation__lt=Review.DISCONTINUED, + review__continuation__lt=Review.Continuations.DISCONTINUED, ) for obj in objects: @@ -238,8 +238,8 @@ def get_queryset(self): objects = Decision.objects.filter( go='', review__proposal__reviewing_committee=self.committee, - review__continuation__lt=Review.DISCONTINUED, - ).exclude(review__stage=Review.SUPERVISOR) + review__continuation__lt=Review.Continuations.DISCONTINUED, + ).exclude(review__stage=Review.Stages.SUPERVISOR) for obj in objects: proposal = obj.review.proposal @@ -292,7 +292,7 @@ def get_queryset(self): """ objects = Decision.objects.filter( go='', - review__stage=Review.SUPERVISOR, + review__stage=Review.Stages.SUPERVISOR, review__proposal__status=Proposal.SUBMITTED_TO_SUPERVISOR, review__proposal__reviewing_committee=self.committee ) @@ -354,13 +354,13 @@ def get_context(self): context['is_secretary'] = is_secretary(self.request.user) context['review'] = { - 'ASSIGNMENT': Review.ASSIGNMENT, - 'COMMISSION': Review.COMMISSION, - 'CLOSING': Review.CLOSING, - 'CLOSED': Review.CLOSED, - 'GO': Review.GO, - 'GO_POST_HOC': Review.GO_POST_HOC, - 'REVISION': Review.REVISION, + 'ASSIGNMENT': Review.Stages.ASSIGNMENT, + 'COMMISSION': Review.Stages.COMMISSION, + 'CLOSING': Review.Stages.CLOSING, + 'CLOSED': Review.Stages.CLOSED, + 'GO': Review.Continuations.GO, + 'GO_POST_HOC': Review.Continuations.GO_POST_HOC, + 'REVISION': Review.Continuations.REVISION, } context['current_user_pk'] = self.request.user.pk @@ -375,13 +375,13 @@ def get_queryset(self): """Returns all open Committee Decisions of all Users""" reviews = {} objects = Review.objects.filter( - stage__gte=Review.CLOSING, + stage__gte=Review.Stages.CLOSING, proposal__status__gte=Proposal.SUBMITTED, proposal__date_confirmed=None, proposal__reviewing_committee=self.committee, ).filter( - Q(continuation=Review.GO) | - Q(continuation=Review.GO_POST_HOC) | + Q(continuation=Review.Continuations.GO) | + Q(continuation=Review.Continuations.GO_POST_HOC) | Q(continuation=None) ).select_related( 'proposal', @@ -420,15 +420,15 @@ def get_queryset(self): # that the review of its parent is "in revision" revision_reviews = Review.objects.filter( proposal__is_revision=True, # Not a copy - stage__gte=Review.ASSIGNMENT, # Not a supervisor review + stage__gte=Review.Stages.ASSIGNMENT, # Not a supervisor review ) # 2. Get candidate reviews: # All reviews whose conclusion is "revision necessary" # that are in the current committee candidates = Review.objects.filter( proposal__reviewing_committee=self.committee, - stage=Review.CLOSED, - continuation=Review.REVISION, + stage=Review.Stages.CLOSED, + continuation=Review.Continuations.REVISION, ) # 3. Finally, exclude candidates whose proposal # has a child with a revision review @@ -461,8 +461,8 @@ def get_queryset(self): """Returns all open Reviews""" reviews = OrderedDict() objects = Review.objects.filter( - stage__gte=Review.ASSIGNMENT, - stage__lte=Review.CLOSING, + stage__gte=Review.Stages.ASSIGNMENT, + stage__lte=Review.Stages.CLOSING, proposal__status__gte=Proposal.SUBMITTED, proposal__reviewing_committee=self.committee, ).select_related( @@ -508,7 +508,7 @@ def get_queryset(self): """Returns all open Committee Decisions of all Users""" reviews = OrderedDict() objects = Review.objects.filter( - stage__gte=Review.ASSIGNMENT, + stage__gte=Review.Stages.ASSIGNMENT, proposal__status__gte=Proposal.SUBMITTED, proposal__reviewing_committee=self.committee, ).select_related( diff --git a/reviews/forms.py b/reviews/forms.py index 39ab86608..f7b66609f 100644 --- a/reviews/forms.py +++ b/reviews/forms.py @@ -102,7 +102,7 @@ def __init__(self, *args, **kwargs): allow_long_route_continuation = kwargs.pop('allow_long_route_continuation', False) super(ReviewCloseForm, self).__init__(*args, **kwargs) if not allow_long_route_continuation: - self.fields['continuation'].choices = [x for x in Review.CONTINUATIONS if x[0] != Review.LONG_ROUTE] + self.fields['continuation'].choices = [x for x in Review.Continuations.choices if x != Review.Continuations.LONG_ROUTE] self.fields['in_archive'].label = _('Voeg deze aanvraag toe aan het archief') self.fields['in_archive'].widget = forms.RadioSelect(choices=YES_NO) @@ -145,7 +145,7 @@ def __init__(self, *args, **kwargs): """Removes the empty label for the go field, and sets it as required""" super(DecisionForm, self).__init__(*args, **kwargs) self.fields['go'].empty_label = None - self.fields['go'].choices = Decision.APPROVAL + self.fields['go'].choices = Decision.Approval.choices self.fields['go'].required = True class StartEndDateForm(forms.Form): diff --git a/reviews/migrations/0003_decision_go_char.py b/reviews/migrations/0003_decision_go_char.py index 5b82ec488..7df471ad0 100644 --- a/reviews/migrations/0003_decision_go_char.py +++ b/reviews/migrations/0003_decision_go_char.py @@ -14,9 +14,9 @@ def forwards(apps, schema_editor): if decision.go is None: decision.go_char = '' elif decision.go: - decision.go_char = Decision.APPROVED + decision.go_char = Decision.Approval.APPROVED else: - decision.go_char = Decision.NOT_APPROVED + decision.go_char = Decision.Approval.NOT_APPROVED decision.save() @@ -26,9 +26,9 @@ def backwards(apps, schema_editor): return for decision in apps.get_model('reviews', 'decision').objects.all(): - if decision.go_char == Decision.APPROVED: + if decision.go_char == Decision.Approval.APPROVED: decision.go = True - elif decision.go_char == Decision.NOT_APPROVED: + elif decision.go_char == Decision.Approval.NOT_APPROVED: decision.go = False else: decision.go = None diff --git a/reviews/models.py b/reviews/models.py index 20825474a..e376c3081 100644 --- a/reviews/models.py +++ b/reviews/models.py @@ -8,39 +8,25 @@ class Review(models.Model): - SUPERVISOR = 0 - ASSIGNMENT = 1 - COMMISSION = 2 - CLOSING = 3 - CLOSED = 4 - STAGES = ( - (SUPERVISOR, _('Beoordeling door eindverantwoordelijke')), - (ASSIGNMENT, _('Aanstelling commissieleden')), - (COMMISSION, _('Beoordeling door commissie')), - (CLOSING, _('Afsluiting door secretaris')), - (CLOSED, _('Afgesloten')), - ) - - GO = 0 - REVISION = 1 - NO_GO = 2 - LONG_ROUTE = 3 - METC = 4 - GO_POST_HOC = 5 - NO_GO_POST_HOC = 6 - DISCONTINUED = 7 - CONTINUATIONS = ( - (GO, _('Goedkeuring door FETC-GW')), - (REVISION, _('Revisie noodzakelijk')), - (NO_GO, _('Afwijzing door FETC-GW')), - (LONG_ROUTE, _('Open review met lange (4-weken) route')), - (METC, _('Laat opnieuw beoordelen door METC')), - (GO_POST_HOC, _('Positief advies van FETC-GW, post-hoc')), - (NO_GO_POST_HOC, _('Negatief advies van FETC-GW, post-hoc')), - (DISCONTINUED, _('Niet verder in behandeling genomen')), - ) - stage = models.PositiveIntegerField(choices=STAGES, default=SUPERVISOR) + class Stages(models.IntegerChoices): + SUPERVISOR = 0, _('Beoordeling door eindverantwoordelijke') + ASSIGNMENT = 1, _('Aanstelling commissieleden') + COMMISSION = 2, _('Beoordeling door commissie') + CLOSING = 3, _('Afsluiting door secretaris') + CLOSED = 4, _('Afgesloten') + + class Continuations(models.IntegerChoices): + GO = 0, _('Goedkeuring door FETC-GW') + REVISION = 1, _('Revisie noodzakelijk') + NO_GO = 2, _('Afwijzing door FETC-GW') + LONG_ROUTE = 3, _('Open review met lange (4-weken) route') + METC = 4, _('Laat opnieuw beoordelen door METC') + GO_POST_HOC = 5, _('Positief advies van FETC-GW, post-hoc') + NO_GO_POST_HOC = 6, _('Negatief advies van FETC-GW, post-hoc') + DISCONTINUED = 7, _('Niet verder in behandeling genomen') + + stage = models.PositiveIntegerField(choices=Stages.choices, default=Stages.SUPERVISOR) short_route = models.BooleanField( _('Route'), default=None, @@ -55,8 +41,8 @@ class Review(models.Model): ) continuation = models.PositiveIntegerField( _('Afhandeling'), - choices=CONTINUATIONS, - default=GO, + choices=Continuations.choices, + default=Continuations.GO, ) date_start = models.DateTimeField() @@ -76,7 +62,7 @@ def update_go(self, last_decision=None): """ # If this review is discontinued, it is set in stone - if self.continuation == self.DISCONTINUED: + if self.continuation == self.Continuations.DISCONTINUED: return all_decisions = self.decision_set.count() @@ -85,7 +71,7 @@ def update_go(self, last_decision=None): for decision in self.decision_set.all(): if decision.go != '': closed_decisions += 1 - final_go &= decision.go == Decision.APPROVED + final_go &= decision.go == Decision.Approval.APPROVED if all_decisions == closed_decisions: self.go = final_go @@ -103,7 +89,7 @@ def update_go(self, last_decision=None): # in an uWSGI environment, in which it errors. from reviews.utils import start_assignment_phase start_assignment_phase(self.proposal) - self.stage = self.CLOSED + self.stage = self.Stages.CLOSED # On NO-GO, reset the Proposal status else: # See comment above @@ -114,7 +100,7 @@ def update_go(self, last_decision=None): # For a review by commission: else: # Set the stage to CLOSING - self.stage = self.CLOSING + self.stage = self.Stages.CLOSING self.save() else: # In case there is still an unmade decision, make sure to @@ -127,14 +113,11 @@ def get_continuation_display(self): # If this review hasn't concluded, this will only return 'Approved' as # this is the default. Thus, we return 'unknown' if we are still pre- # conclusion. - if self.stage <= Review.COMMISSION: + if self.stage <= Review.Stages.COMMISSION: return _("Onbekend") # Get the human readable string - continuation = dict(self.CONTINUATIONS).get( - self.continuation, - self.continuation - ) + continuation = dict(self.Continuations.choices)[self.continuation] if self.proposal.has_minor_revision: continuation += str(_(', met revisie')) @@ -170,21 +153,19 @@ def __str__(self): class Decision(models.Model): - APPROVED = 'Y' - NOT_APPROVED = 'N' - NEEDS_REVISION = '?' - APPROVAL = ( - (APPROVED, _('goedgekeurd')), - (NOT_APPROVED, _('niet goedgekeurd')), - (NEEDS_REVISION, _('revisie noodzakelijk')), - ) + class Approval(models.TextChoices): + APPROVED = 'Y', _('goedgekeurd') + NOT_APPROVED = 'N', _('niet goedgekeurd') + NEEDS_REVISION = '?', _('revisie noodzakelijk') go = models.CharField( _('Beslissing'), max_length=1, - choices=APPROVAL, + choices=Approval.choices, blank=True) + date_decision = models.DateTimeField(blank=True, null=True) + comments = models.TextField( _('Ruimte voor eventuele opmerkingen'), blank=True) diff --git a/reviews/tests.py b/reviews/tests.py index 60a4de5dc..ed9839527 100644 --- a/reviews/tests.py +++ b/reviews/tests.py @@ -153,7 +153,7 @@ def test_start_supervisor_review(self): """ # If the Relation on a Proposal requires a supervisor, a Review for the supervisor should be started. review = start_review(self.proposal) - self.assertEqual(review.stage, Review.SUPERVISOR) + self.assertEqual(review.stage, Review.Stages.SUPERVISOR) self.assertEqual(review.is_committee_review, False) self.assertEqual(Decision.objects.filter(reviewer=self.supervisor).count(), 1) self.assertEqual(Decision.objects.filter(review=review).count(), 1) @@ -170,7 +170,7 @@ def test_start_review(self): self.proposal.save() review = start_review(self.proposal) - self.assertEqual(review.stage, Review.ASSIGNMENT) + self.assertEqual(review.stage, Review.Stages.ASSIGNMENT) self.assertEqual(review.is_committee_review, True) self.assertEqual(Decision.objects.filter(reviewer=self.secretary).count(), 1) self.assertEqual(Decision.objects.filter(review=review).count(), 1) @@ -194,7 +194,7 @@ def test_decision_supervisor(self): mail.outbox = [] decision = Decision.objects.filter(review=review)[0] - decision.go = Decision.APPROVED + decision.go = Decision.Approval.APPROVED decision.save() review.refresh_from_db() self.assertEqual(review.go, True) @@ -221,12 +221,12 @@ def test_decision_commission(self): self.proposal.relation = Relation.objects.get(pk=5) self.proposal.save() review = start_review(self.proposal) - self.assertEqual(review.stage, Review.ASSIGNMENT) + self.assertEqual(review.stage, Review.Stages.ASSIGNMENT) self.assertEqual(review.go, None) # Create a Decision for a member of the commission group Decision.objects.create(review=review, reviewer=self.c1) - review.stage = Review.COMMISSION + review.stage = Review.Stages.COMMISSION review.refresh_from_db() self.assertEqual(len(mail.outbox), 2) @@ -234,12 +234,12 @@ def test_decision_commission(self): decisions = Decision.objects.filter(review=review) self.assertEqual(len(decisions), 2) - decisions[0].go = Decision.APPROVED + decisions[0].go = Decision.Approval.APPROVED decisions[0].save() review.refresh_from_db() self.assertEqual(review.go, None) # undecided - decisions[1].go = Decision.NOT_APPROVED + decisions[1].go = Decision.Approval.NOT_APPROVED c = 'Let\'s test "escaping" of < and >' decisions[1].comments = c decisions[1].save() @@ -250,7 +250,7 @@ def test_decision_commission(self): self.assertEqual(len(mail.outbox), 3) self.assertIn(c, mail.outbox[2].body) - decisions[1].go = Decision.APPROVED + decisions[1].go = Decision.Approval.APPROVED decisions[1].save() review.refresh_from_db() self.assertEqual(review.go, True) # go @@ -413,7 +413,7 @@ def test_decision(self): previous_review_date = copy(self.proposal.date_reviewed) form_values = { # We choose GO_POST_HOC because GO (0) is already the default - "continuation": self.review.GO_POST_HOC, + "continuation": self.review.Continuations.GO_POST_HOC, } self.client.force_login(self.secretary) page = self.post(form_values) @@ -438,7 +438,7 @@ def test_long_route(self): self.review.short_route = True self.review.save() form_values = { - "continuation": self.review.LONG_ROUTE, + "continuation": self.review.Continuations.LONG_ROUTE, } self.client.force_login(self.secretary) page = self.post(form_values) @@ -446,7 +446,7 @@ def test_long_route(self): # Assertions self.assertEqual( self.review.stage, - self.review.CLOSED, + self.review.Stages.CLOSED, ) # A new review should have been created # with a decision @@ -463,7 +463,7 @@ def test_metc(self): """When posted with review.METC, check that proposal is turned back into a Draft and its WMO gets flagged.""" form_values = { - "continuation": self.review.METC, + "continuation": self.review.Continuations.METC, } self.client.force_login(self.secretary) self.post(form_values) diff --git a/reviews/utils/review_actions.py b/reviews/utils/review_actions.py index 41801ca66..14d4cf5c0 100644 --- a/reviews/utils/review_actions.py +++ b/reviews/utils/review_actions.py @@ -199,9 +199,9 @@ def is_available(self): if not settings.GROUP_SECRETARY in user_groups: return False - if self.review.stage not in [Review.REVISION, - Review.NO_GO, - Review.CLOSING, + if self.review.stage not in [Review.Continuations.REVISION, + Review.Continuations.NO_GO, + Review.Stages.CLOSING, ]: return False diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py index d0a568fd0..157d27ee8 100644 --- a/reviews/utils/review_utils.py +++ b/reviews/utils/review_utils.py @@ -41,7 +41,7 @@ def start_supervisor_phase(proposal): - send an e-mail to other applicants """ review = Review.objects.create(proposal=proposal, date_start=timezone.now()) - review.stage = Review.SUPERVISOR + review.stage = Review.Stages.SUPERVISOR review.is_committee_review = False review.save() @@ -106,7 +106,7 @@ def start_assignment_phase(proposal): short_route = len(reasons) == 0 review = Review.objects.create(proposal=proposal, date_start=timezone.now()) - review.stage = Review.ASSIGNMENT + review.stage = Review.Stages.ASSIGNMENT review.short_route = short_route if short_route: @@ -169,7 +169,7 @@ def remind_reviewers(): next_two_days = today + datetime.timedelta(days=2) decisions = Decision.objects.filter( - review__stage=Review.COMMISSION, + review__stage=Review.Stages.COMMISSION, review__short_route=True, review__date_should_end__gte=today, review__date_should_end__lte=next_two_days, @@ -204,7 +204,7 @@ def start_review_pre_assessment(proposal): :param proposal: the current Proposal """ review = Review.objects.create(proposal=proposal, date_start=timezone.now()) - review.stage = Review.ASSIGNMENT + review.stage = Review.Stages.ASSIGNMENT review.short_route = True review.date_should_end = timezone.now() + timezone.timedelta(weeks=settings.PREASSESSMENT_ROUTE_WEEKS) review.save() diff --git a/reviews/views.py b/reviews/views.py index 260438ca5..cfd42a8be 100644 --- a/reviews/views.py +++ b/reviews/views.py @@ -143,7 +143,7 @@ def get_all_open_decisions(self): open_decisions = ( self.get_committee_decisions() .filter( - review__stage=Review.COMMISSION, + review__stage=Review.Stages.COMMISSION, ) .order_by("reviewer", "review__date_start") ) @@ -160,7 +160,7 @@ def get_review_counts_last_year(self): base_filter = Q( decision__review__date_start__gt=self.start_date, decision__review__date_start__lt=self.end_date, - decision__review__stage__gt=Review.SUPERVISOR, + decision__review__stage__gt=Review.Stages.SUPERVISOR, ) return reviewers.annotate( total=Count("decision", filter=base_filter), @@ -353,7 +353,7 @@ def form_valid(self, form): else: # Directly mark this Proposal as closed: applicants should start a revision Proposal for decision in Decision.objects.filter(review=review): - decision.go = Decision.NEEDS_REVISION + decision.go = Decision.Approval.NEEDS_REVISION decision.date_decision = timezone.now() decision.save() @@ -364,9 +364,9 @@ def form_valid(self, form): proposal.date_reviewed = timezone.now() proposal.save() - form.instance.continuation = Review.REVISION + form.instance.continuation = Review.Continuations.REVISION form.instance.date_end = timezone.now() - form.instance.stage = Review.CLOSED + form.instance.stage = Review.Stages.CLOSED return super(ReviewAssignView, self).form_valid(form) @@ -434,13 +434,13 @@ def get_initial(self): review = self.get_object() initial = super(ReviewCloseView, self).get_initial() - initial["continuation"] = Review.GO if review.go else Review.NO_GO + initial["continuation"] = Review.Continuations.GO if review.go else Review.Continuations.NO_GO if review.proposal.date_start and review.proposal.date_start < date.today(): initial["continuation"] = ( - Review.GO_POST_HOC - if initial["continuation"] == Review.GO - else Review.NO_GO_POST_HOC + Review.Continuations.GO_POST_HOC + if initial["continuation"] == Review.Continuations.GO + else Review.Continuations.NO_GO_POST_HOC ) initial["in_archive"] = not review.proposal.is_pre_assessment @@ -450,18 +450,18 @@ def form_valid(self, form): proposal = form.instance.proposal if form.instance.continuation in [ - Review.GO, - Review.NO_GO, - Review.GO_POST_HOC, - Review.NO_GO_POST_HOC, - Review.REVISION, + Review.Continuations.GO, + Review.Continuations.NO_GO, + Review.Continuations.GO_POST_HOC, + Review.Continuations.NO_GO_POST_HOC, + Review.Continuations.REVISION, ]: proposal.mark_reviewed(form.instance.continuation) - elif form.instance.continuation == Review.LONG_ROUTE: + elif form.instance.continuation == Review.Continuations.LONG_ROUTE: # Create a new review review = Review.objects.create( proposal=proposal, - stage=Review.COMMISSION, + stage=Review.Stages.COMMISSION, short_route=False, date_start=timezone.now(), ) @@ -469,7 +469,7 @@ def form_valid(self, form): Decision.objects.create(review=review, reviewer=get_secretary()) # Start the long review route start_review_route(review, get_reviewers(), False) - elif form.instance.continuation == Review.METC: + elif form.instance.continuation == Review.Continuations.METC: proposal.enforce_wmo() proposal.in_archive = form.cleaned_data["in_archive"] @@ -479,7 +479,7 @@ def form_valid(self, form): ] proposal.save() - form.instance.stage = Review.CLOSED + form.instance.stage = Review.Stages.CLOSED return super(ReviewCloseView, self).form_valid(form) From a325ff6ca2267ff0fd8a39786bfd5ee47dada4e8 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Wed, 22 Nov 2023 15:12:33 +0100 Subject: [PATCH 093/148] Refactor of all choices in main/models.py (incl. YES_NO_DOUBT) --- docs/_build/html/_modules/core/models.html | 2 +- .../_build/html/_modules/proposals/forms.html | 12 +++---- .../html/_modules/proposals/models.html | 8 ++--- docs/_build/html/_modules/studies/forms.html | 12 +++---- docs/_build/html/_modules/studies/models.html | 12 +++---- main/models.py | 35 ++++++++----------- proposals/forms.py | 14 ++++---- proposals/models.py | 8 ++--- proposals/tests.py | 6 ++-- proposals/utils/pdf_diff_logic.py | 4 +-- proposals/views/wmo_views.py | 6 ++-- reviews/tests.py | 6 ++-- reviews/utils/review_utils.py | 8 ++--- studies/forms.py | 20 +++++------ studies/models.py | 12 +++---- 15 files changed, 79 insertions(+), 86 deletions(-) diff --git a/docs/_build/html/_modules/core/models.html b/docs/_build/html/_modules/core/models.html index 812faa697..ec2ec10d6 100644 --- a/docs/_build/html/_modules/core/models.html +++ b/docs/_build/html/_modules/core/models.html @@ -158,7 +158,7 @@

    Source code for core.models

     YES = 'Y'
     NO = 'N'
     DOUBT = '?'
    -YES_NO_DOUBT = (
    +YesNoDoubt.choices = (
         (YES, _('ja')),
         (NO, _('nee')),
         (DOUBT, _('twijfel')),
    diff --git a/docs/_build/html/_modules/proposals/forms.html b/docs/_build/html/_modules/proposals/forms.html
    index 6581e514d..b0404e95d 100644
    --- a/docs/_build/html/_modules/proposals/forms.html
    +++ b/docs/_build/html/_modules/proposals/forms.html
    @@ -161,7 +161,7 @@ 

    Source code for proposals.forms

     from django.utils.translation import ugettext_lazy as _
     
     from core.forms import ConditionalModelForm, SoftValidationMixin
    -from core.models import DOUBT, NO, YES, YES_NO_DOUBT
    +from core.models import DOUBT, NO, YES, YesNoDoubt.choices
     from core.utils import YES_NO, get_users_as_list
     from .models import Proposal, Relation, Wmo
     from .utils import check_local_facilities
    @@ -476,11 +476,11 @@ 

    Source code for proposals.forms

             """
             super(WmoForm, self).__init__(*args, **kwargs)
             self.fields['metc'].empty_label = None
    -        self.fields['metc'].choices = YES_NO_DOUBT
    +        self.fields['metc'].choices = YesNoDoubt.choices
             self.fields['is_medical'].empty_label = None
    -        self.fields['is_medical'].choices = YES_NO_DOUBT
    +        self.fields['is_medical'].choices = YesNoDoubt.choices
             self.fields['is_behavioristic'].empty_label = None
    -        self.fields['is_behavioristic'].choices = YES_NO_DOUBT
    + self.fields['is_behavioristic'].choices = YesNoDoubt.choices
    [docs] def clean(self): """ @@ -524,9 +524,9 @@

    Source code for proposals.forms

             """
             super(WmoCheckForm, self).__init__(*args, **kwargs)
             self.fields['is_medical'].empty_label = None
    -        self.fields['is_medical'].choices = YES_NO_DOUBT
    +        self.fields['is_medical'].choices = YesNoDoubt.choices
             self.fields['is_behavioristic'].empty_label = None
    -        self.fields['is_behavioristic'].choices = YES_NO_DOUBT
    + self.fields['is_behavioristic'].choices = YesNoDoubt.choices
    [docs]class WmoApplicationForm(ConditionalModelForm): diff --git a/docs/_build/html/_modules/proposals/models.html b/docs/_build/html/_modules/proposals/models.html index b39325fdd..6eb92e1cd 100644 --- a/docs/_build/html/_modules/proposals/models.html +++ b/docs/_build/html/_modules/proposals/models.html @@ -161,7 +161,7 @@

    Source code for proposals.models

     from django.utils.encoding import python_2_unicode_compatible
     from django.utils.translation import ugettext_lazy as _
     
    -from core.models import YES, YES_NO_DOUBT
    +from core.models import YES, YesNoDoubt.choices
     from core.validators import MaxWordsValidator, validate_pdf_or_doc
     from .utils import available_urls
     
    @@ -616,7 +616,7 @@ 

    Source code for proposals.models

             _('Vindt de dataverzameling plaats binnen het UMC Utrecht of \
     andere instelling waar toetsing door een METC verplicht is gesteld?'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True,
             default=None,
         )
    @@ -645,7 +645,7 @@ 

    Source code for proposals.models

     onderzoekspopulatie. (CCMO-notitie, Definitie medisch-wetenschappelijk \
     onderzoek, 2005, ccmo.nl)'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True,
         )
     
    @@ -659,7 +659,7 @@ 

    Source code for proposals.models

     worden in hun leven zoals het ook had plaatsgevonden zonder de observatie, \
     slechts dan kan "nee" ingevuld worden.'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True,
         )
     
    diff --git a/docs/_build/html/_modules/studies/forms.html b/docs/_build/html/_modules/studies/forms.html
    index 80d8d54c7..856f20c00 100644
    --- a/docs/_build/html/_modules/studies/forms.html
    +++ b/docs/_build/html/_modules/studies/forms.html
    @@ -158,7 +158,7 @@ 

    Source code for studies.forms

     from django.utils.translation import ugettext_lazy as _
     
     from core.forms import ConditionalModelForm, SoftValidationMixin
    -from core.models import DOUBT, YES, YES_NO_DOUBT
    +from core.models import DOUBT, YES, YesNoDoubt.choices
     from core.utils import YES_NO
     from .models import AgeGroup, Documents, Study
     from .utils import check_necessity_required
    @@ -205,7 +205,7 @@ 

    Source code for studies.forms

             self.fields['legally_incapable'].label = "Geert"
             self.fields['compensation'].empty_label = None
             self.fields['necessity'].empty_label = None
    -        self.fields['necessity'].choices = YES_NO_DOUBT
    +        self.fields['necessity'].choices = YesNoDoubt.choices
     
             self.fields['age_groups'].queryset = AgeGroup.objects.filter(
                 is_active=True)
    @@ -349,13 +349,13 @@

    Source code for studies.forms

             super(StudyEndForm, self).__init__(*args, **kwargs)
     
             self.fields['deception'].empty_label = None
    -        self.fields['deception'].choices = YES_NO_DOUBT
    +        self.fields['deception'].choices = YesNoDoubt.choices
             self.fields['negativity'].empty_label = None
    -        self.fields['negativity'].choices = YES_NO_DOUBT
    +        self.fields['negativity'].choices = YesNoDoubt.choices
             self.fields['stressful'].empty_label = None
    -        self.fields['stressful'].choices = YES_NO_DOUBT
    +        self.fields['stressful'].choices = YesNoDoubt.choices
             self.fields['risk'].empty_label = None
    -        self.fields['risk'].choices = YES_NO_DOUBT
    +        self.fields['risk'].choices = YesNoDoubt.choices
     
             self.fields['negativity'].label = mark_safe(
                 self.fields['negativity'].label)
    diff --git a/docs/_build/html/_modules/studies/models.html b/docs/_build/html/_modules/studies/models.html
    index 48a066f0e..7815845fd 100644
    --- a/docs/_build/html/_modules/studies/models.html
    +++ b/docs/_build/html/_modules/studies/models.html
    @@ -160,7 +160,7 @@ 

    Source code for studies.models

     from django.utils.translation import ugettext_lazy as _
     from django.utils.encoding import python_2_unicode_compatible
     
    -from core.models import YES_NO_DOUBT
    +from core.models import YesNoDoubt.choices
     from core.validators import validate_pdf_or_doc
     from proposals.models import Proposal
     
    @@ -312,7 +312,7 @@ 

    Source code for studies.models

     of zou u de vraag ook kunnen beantwoorden door volwassen deelnemers \
     te testen?'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         necessity_reason = models.TextField(
             _('Leg uit waarom'),
    @@ -385,7 +385,7 @@ 

    Source code for studies.models

     geheugentaak of het geven van gefingeerde feedback. Wellicht ten overvloede: \
     het gaat hierbij niet om fillers.'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         deception_details = models.TextField(
             _('Geef een toelichting en beschrijf hoe en wanneer de deelnemer \
    @@ -398,7 +398,7 @@ 

    Source code for studies.models

     uitspraken, negatieve feedback, frustrerende, zware, (heel) lange en/of \
     (heel) saaie taken.'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         negativity_details = models.TextField(
             _('Licht uw antwoord toe.'),
    @@ -417,7 +417,7 @@ 

    Source code for studies.models

     tijdens het onderzoek, niet om de opgelopen psychische of fysieke schade \
     door het onderzoek.')),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         stressful_details = models.TextField(
             _('Licht uw antwoord toe. Geef concrete voorbeelden van de relevante \
    @@ -447,7 +447,7 @@ 

    Source code for studies.models

     inspanning; dit alles, waar relevant, onder begeleiding van adequaat \
     geschoolde specialisten).')),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         risk_details = models.TextField(
             _('Licht toe'),
    diff --git a/main/models.py b/main/models.py
    index 05f9105a2..109fdcc38 100644
    --- a/main/models.py
    +++ b/main/models.py
    @@ -3,39 +3,32 @@
     from django.db import models
     from django.utils.translation import ugettext_lazy as _
     
    -YES = 'Y'
    -NO = 'N'
    -DOUBT = '?'
    -YES_NO_DOUBT = (
    -    (YES, _('ja')),
    -    (NO, _('nee')),
    -    (DOUBT, _('twijfel')),
    -)
     
    +class YesNoDoubt(models.TextChoices):
    +    YES = 'Y', _('ja')
    +    NO = 'N', _('nee')
    +    DOUBT = '?', _('twijfel')
     
     class SystemMessage(models.Model):
    -    URGENT = 1
    -    ATTENTION = 2
    -    INFO = 3
    -    # Not translated, as it's backend only
    -    LEVELS = (
    -        (URGENT, "Urgent"),
    -        (ATTENTION, "Attention"),
    -        (INFO, "Info")
    -    )
    +
    +    class Levels(models.IntegerChoices):
    +        # Not translated, as it's backend only
    +        URGENT = 1, "Urgent"
    +        ATTENTION = 2, "Attention"
    +        INFO = 3, "Info"
     
         message = models.TextField()
    -    level = models.IntegerField(choices=LEVELS)
    +    level = models.IntegerField(choices=Levels.choices)
         not_before = models.DateTimeField()
         not_after = models.DateTimeField()
     
         @property
         def css_class(self):
    -        if self.level == self.URGENT:
    +        if self.level == self.Levels.URGENT:
                 return 'failed'
    -        if self.level == self.ATTENTION:
    +        if self.level == self.Levels.ATTENTION:
                 return 'warning'
    -        if self.level == self.INFO:
    +        if self.level == self.Levels.INFO:
                 return 'info'
     
             return ''
    diff --git a/proposals/forms.py b/proposals/forms.py
    index 21cabcf24..7bd16fff5 100644
    --- a/proposals/forms.py
    +++ b/proposals/forms.py
    @@ -13,7 +13,7 @@
     mark_safe_lazy = lazy(mark_safe, str)
     
     from main.forms import ConditionalModelForm, SoftValidationMixin
    -from main.models import DOUBT, NO, YES, YES_NO_DOUBT
    +from main.models import YesNoDoubt
     from main.utils import YES_NO, get_users_as_list
     from .field import ParentChoiceModelField
     from .models import Proposal, Relation, Wmo
    @@ -412,9 +412,9 @@ def __init__(self, *args, **kwargs):
             """
             super(WmoForm, self).__init__(*args, **kwargs)
             self.fields['metc'].empty_label = None
    -        self.fields['metc'].choices = YES_NO_DOUBT
    +        self.fields['metc'].choices = YesNoDoubt.choices
             self.fields['is_medical'].empty_label = None
    -        self.fields['is_medical'].choices = YES_NO_DOUBT
    +        self.fields['is_medical'].choices = YesNoDoubt.choices
     
         def clean(self):
             """
    @@ -429,13 +429,13 @@ def clean(self):
                                          'gaan.'))
     
             self.check_dependency(cleaned_data, 'metc', 'metc_details',
    -                              f1_value=YES)
    +                              f1_value=YesNoDoubt.YES)
             self.check_dependency(cleaned_data, 'metc', 'metc_institution',
    -                              f1_value=YES,
    +                              f1_value=YesNoDoubt.YES,
                                   error_message=_(
                                       'Je dient een instelling op te geven.'))
             self.check_dependency_list(cleaned_data, 'metc', 'is_medical',
    -                                   f1_value_list=[NO, DOUBT])
    +                                   f1_value_list=[YesNoDoubt.NO, YesNoDoubt.DOUBT])
     
     
     class WmoCheckForm(forms.ModelForm):
    @@ -455,7 +455,7 @@ def __init__(self, *args, **kwargs):
             """
             super(WmoCheckForm, self).__init__(*args, **kwargs)
             self.fields['is_medical'].empty_label = None
    -        self.fields['is_medical'].choices = YES_NO_DOUBT
    +        self.fields['is_medical'].choices = YesNoDoubt.choices
     
     
     class WmoApplicationForm(SoftValidationMixin, ConditionalModelForm):
    diff --git a/proposals/models.py b/proposals/models.py
    index c0576899a..c68bcbd75 100644
    --- a/proposals/models.py
    +++ b/proposals/models.py
    @@ -13,7 +13,7 @@
     from django.utils.safestring import mark_safe
     mark_safe_lazy = lazy(mark_safe, str)
     
    -from main.models import YES, YES_NO_DOUBT
    +from main.models import YesNoDoubt
     from main.validators import MaxWordsValidator, validate_pdf_or_doc
     from .utils import available_urls, FilenameFactory, OverwriteStorage
     from datetime import date, timedelta
    @@ -727,7 +727,7 @@ class Wmo(models.Model):
             _('Vindt de dataverzameling plaats binnen het UMC Utrecht of \
     andere instelling waar toetsing door een METC verplicht is gesteld?'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True,
             default=None,
         )
    @@ -756,7 +756,7 @@ class Wmo(models.Model):
     onderzoekspopulatie. (CCMO-notitie, Definitie medisch-wetenschappelijk \
     onderzoek, 2005, ccmo.nl)'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True,
         )
     
    @@ -803,7 +803,7 @@ def save(self, *args, **kwargs):
             super(Wmo, self).save(*args, **kwargs)
     
         def update_status(self):
    -        if self.metc == YES or self.is_medical == YES or self.enforced_by_commission:
    +        if self.metc == YesNoDoubt.YES or self.is_medical == YesNoDoubt.YES or self.enforced_by_commission:
                 if self.metc_decision and self.metc_decision_pdf:
                     self.status = self.JUDGED
                 else:
    diff --git a/proposals/tests.py b/proposals/tests.py
    index 2e4192ca8..50837f3cc 100644
    --- a/proposals/tests.py
    +++ b/proposals/tests.py
    @@ -5,7 +5,7 @@
     from django.core.files.uploadedfile import SimpleUploadedFile
     from django.conf import settings
     
    -from main.models import Setting, YES, NO
    +from main.models import Setting, YesNoDoubt.YES, NO
     from interventions.models import Intervention
     from observations.models import Observation
     from tasks.models import Session, Task, Registration
    @@ -139,7 +139,7 @@ def test_status(self):
             proposal = self.p1
             self.assertEqual(proposal.status, Proposal.DRAFT)
     
    -        wmo = Wmo.objects.create(proposal=proposal, metc=YES)
    +        wmo = Wmo.objects.create(proposal=proposal, metc=YesNoDoubt.YES)
             self.assertEqual(proposal.wmo.status, Wmo.WAITING)
             wmo.metc = NO
             wmo.save()
    @@ -281,7 +281,7 @@ def setUp(self):
         def test_status(self):
             self.assertEqual(self.wmo.status, Wmo.NO_WMO)
     
    -        self.wmo.metc = YES
    +        self.wmo.metc = YesNoDoubt.YES
             self.wmo.save()
     
             self.assertEqual(self.wmo.status, Wmo.WAITING)
    diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py
    index 9ac7cdd57..311e616ed 100644
    --- a/proposals/utils/pdf_diff_logic.py
    +++ b/proposals/utils/pdf_diff_logic.py
    @@ -286,9 +286,9 @@ def handle_field_file(self, field_file):
             return output
     
         def yes_no_doubt(self, value):
    -        from main.models import YES_NO_DOUBT
    +        from main.models import YesNoDoubt
     
    -        d = dict(YES_NO_DOUBT)
    +        d = dict(YesNoDoubt.choices)
             return d[value]
     
     
    diff --git a/proposals/views/wmo_views.py b/proposals/views/wmo_views.py
    index a3669f6eb..1b0cb4be5 100644
    --- a/proposals/views/wmo_views.py
    +++ b/proposals/views/wmo_views.py
    @@ -6,7 +6,7 @@
     from django.views.decorators.csrf import csrf_exempt
     from django.utils.translation import ugettext_lazy as _
     
    -from main.models import YES, DOUBT
    +from main.models import YesNoDoubt
     from main.views import CreateView, UpdateView, AllowErrorsOnBackbuttonMixin
     from main.utils import get_secretary
     
    @@ -139,8 +139,8 @@ def check_wmo(request):
         """
         This call checks which WMO message should be generated.
         """
    -    is_metc = request.POST.get('metc') == YES
    -    is_medical = request.POST.get('medical') == YES
    +    is_metc = request.POST.get('metc') == YesNoDoubt.YES
    +    is_medical = request.POST.get('medical') == YesNoDoubt.YES
     
         doubt = request.POST.get('metc') == DOUBT or request.POST.get('medical') == DOUBT
     
    diff --git a/reviews/tests.py b/reviews/tests.py
    index ed9839527..645d709f5 100644
    --- a/reviews/tests.py
    +++ b/reviews/tests.py
    @@ -8,7 +8,7 @@
     
     from .models import Review, Decision
     from .utils import start_review, auto_review, auto_review_observation, auto_review_task, notify_secretary
    -from main.models import YES, NO, DOUBT
    +from main.models import YesNoDoubt
     from proposals.models import Proposal, Relation, Wmo
     from proposals.utils import generate_ref_number
     from studies.models import Study, Compensation, AgeGroup
    @@ -291,13 +291,13 @@ def test_auto_review(self):
             reasons = auto_review(self.proposal)
             self.assertEqual(len(reasons), 5)
     
    -        self.study.stressful = YES
    +        self.study.stressful = YesNoDoubt.YES
             self.study.save()
     
             reasons = auto_review(self.proposal)
             self.assertEqual(len(reasons), 6)
     
    -        self.study.risk = YES
    +        self.study.risk = YesNoDoubt.YES
             self.study.save()
     
             reasons = auto_review(self.proposal)
    diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py
    index 157d27ee8..a955c2822 100644
    --- a/reviews/utils/review_utils.py
    +++ b/reviews/utils/review_utils.py
    @@ -8,7 +8,7 @@
     from django.utils.translation import ugettext_lazy as _
     from django.utils import timezone
     
    -from main.models import YES, DOUBT
    +from main.models import YesNoDoubt
     from main.utils import get_secretary
     from proposals.models import Proposal
     from tasks.models import Task
    @@ -338,7 +338,7 @@ def auto_review(proposal: Proposal):
             if study.legally_incapable:
                 reasons.append(_('De aanvraag bevat het gebruik van wilsonbekwame volwassenen.'))
     
    -        if study.deception in [YES, DOUBT]:
    +        if study.deception in [YesNoDoubt.YES, DOUBT]:
                 reasons.append(_('De aanvraag bevat het gebruik van misleiding.'))
     
             if study.hierarchy:
    @@ -353,11 +353,11 @@ def auto_review(proposal: Proposal):
             for task in Task.objects.filter(session__study=study):
                 reasons.extend(auto_review_task(study, task))
     
    -        if study.stressful in [YES, DOUBT]:
    +        if study.stressful in [YesNoDoubt.YES, DOUBT]:
                 reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op onderdelen of \
     als geheel zodanig belastend is dat deze ondanks de verkregen informed consent vragen zou kunnen oproepen.'))
     
    -        if study.risk in [YES, DOUBT]:
    +        if study.risk in [YesNoDoubt.YES, DOUBT]:
                 reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) de risico\'s op psychische of \
     fysieke schade bij deelname aan het onderzoek meer dan minimaal zijn.'))
     
    diff --git a/studies/forms.py b/studies/forms.py
    index 6da3d4296..b71d4a61c 100644
    --- a/studies/forms.py
    +++ b/studies/forms.py
    @@ -6,7 +6,7 @@
     from django.utils.translation import ugettext_lazy as _
     
     from main.forms import ConditionalModelForm, SoftValidationMixin
    -from main.models import DOUBT, YES, YES_NO_DOUBT
    +from main.models import YesNoDoubt
     from main.utils import YES_NO
     from .models import AgeGroup, Documents, Study
     from .utils import check_necessity_required
    @@ -56,7 +56,7 @@ def __init__(self, *args, **kwargs):
             super(StudyForm, self).__init__(*args, **kwargs)
             self.fields['compensation'].empty_label = None
             self.fields['necessity'].empty_label = None
    -        self.fields['necessity'].choices = YES_NO_DOUBT
    +        self.fields['necessity'].choices = YesNoDoubt.choices
     
             self.fields['age_groups'].queryset = AgeGroup.objects.filter(
                 is_active=True)
    @@ -183,13 +183,13 @@ def __init__(self, *args, **kwargs):
             super(StudyEndForm, self).__init__(*args, **kwargs)
     
             self.fields['deception'].empty_label = None
    -        self.fields['deception'].choices = YES_NO_DOUBT
    +        self.fields['deception'].choices = YesNoDoubt.choices
             self.fields['negativity'].empty_label = None
    -        self.fields['negativity'].choices = YES_NO_DOUBT
    +        self.fields['negativity'].choices = YesNoDoubt.choices
             self.fields['stressful'].empty_label = None
    -        self.fields['stressful'].choices = YES_NO_DOUBT
    +        self.fields['stressful'].choices = YesNoDoubt.choices
             self.fields['risk'].empty_label = None
    -        self.fields['risk'].choices = YES_NO_DOUBT
    +        self.fields['risk'].choices = YesNoDoubt.choices
     
             self.fields['negativity'].label = mark_safe(
                 self.fields['negativity'].label)
    @@ -224,15 +224,15 @@ def clean(self):
     
             self.check_dependency_list(cleaned_data, 'deception',
                                        'deception_details',
    -                                   f1_value_list=[YES, DOUBT])
    +                                   f1_value_list=[YesNoDoubt.YES, YesNoDoubt.DOUBT])
             self.check_dependency_list(cleaned_data, 'negativity',
                                        'negativity_details',
    -                                   f1_value_list=[YES, DOUBT])
    +                                   f1_value_list=[YesNoDoubt.YES, YesNoDoubt.DOUBT])
             self.check_dependency_list(cleaned_data, 'stressful',
                                        'stressful_details',
    -                                   f1_value_list=[YES, DOUBT])
    +                                   f1_value_list=[YesNoDoubt.YES, YesNoDoubt.DOUBT])
             self.check_dependency_list(cleaned_data, 'risk', 'risk_details',
    -                                   f1_value_list=[YES, DOUBT])
    +                                   f1_value_list=[YesNoDoubt.YES, YesNoDoubt.DOUBT])
     
     
     class StudyUpdateAttachmentsForm(forms.ModelForm):
    diff --git a/studies/models.py b/studies/models.py
    index 9d6c02a7f..806b32042 100644
    --- a/studies/models.py
    +++ b/studies/models.py
    @@ -12,7 +12,7 @@
     from django.utils.safestring import mark_safe
     mark_safe_lazy = lazy(mark_safe, str)
     
    -from main.models import YES_NO_DOUBT
    +from main.models import YesNoDoubt
     from main.validators import validate_pdf_or_doc
     from proposals.models import Proposal
     from studies.utils import study_urls
    @@ -216,7 +216,7 @@ class Study(models.Model):
     of zou je de vraag ook kunnen beantwoorden door volwassen deelnemers \
     te testen?'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         necessity_reason = models.TextField(
             _('Leg uit waarom'),
    @@ -290,7 +290,7 @@ class Study(models.Model):
     geheugentaak of het geven van gefingeerde feedback. Wellicht ten overvloede: \
     het gaat hierbij niet om fillers.'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         deception_details = models.TextField(
             _('Geef een toelichting en beschrijf hoe en wanneer de deelnemer \
    @@ -303,7 +303,7 @@ class Study(models.Model):
     uitspraken, negatieve feedback, frustrerende, zware, (heel) lange en/of \
     (heel) saaie taken.'),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         negativity_details = models.TextField(
             _('Licht je antwoord toe.'),
    @@ -322,7 +322,7 @@ class Study(models.Model):
     tijdens het onderzoek, niet om de opgelopen psychische of fysieke schade \
     door het onderzoek.')),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         stressful_details = models.TextField(
             _('Licht je antwoord toe. Geef concrete voorbeelden van de relevante \
    @@ -352,7 +352,7 @@ class Study(models.Model):
     inspanning; dit alles, waar relevant, onder begeleiding van adequaat \
     geschoolde specialisten).')),
             max_length=1,
    -        choices=YES_NO_DOUBT,
    +        choices=YesNoDoubt.choices,
             blank=True)
         risk_details = models.TextField(
             _('Licht toe'),
    
    From f14001e06d6b35c63fe53ba1309cc8a684f8e660 Mon Sep 17 00:00:00 2001
    From: Edo Storm 
    Date: Wed, 22 Nov 2023 16:46:44 +0100
    Subject: [PATCH 094/148] Refactor of all choices in proposals/models.py
    
    ---
     fetc/settings.py                    |  6 ++-
     main/views.py                       | 10 ++---
     proposals/api/views.py              | 12 +++---
     proposals/copy.py                   |  2 +-
     proposals/forms.py                  |  6 +--
     proposals/models.py                 | 61 +++++++++++------------------
     proposals/tests.py                  | 16 ++++----
     proposals/utils/statistics_utils.py |  2 +-
     proposals/views/proposal_views.py   |  8 ++--
     proposals/views/wmo_views.py        |  6 +--
     reviews/api/views.py                |  8 ++--
     reviews/models.py                   |  2 +-
     reviews/tests.py                    |  6 +--
     reviews/utils/review_actions.py     |  2 +-
     reviews/views.py                    |  2 +-
     15 files changed, 68 insertions(+), 81 deletions(-)
    
    diff --git a/fetc/settings.py b/fetc/settings.py
    index 45697d112..b1a7feb1f 100644
    --- a/fetc/settings.py
    +++ b/fetc/settings.py
    @@ -152,8 +152,10 @@
     MEDIA_URL = '/media/'
     
     # E-mail settings
    -EMAIL_HOST = 'localhost'
    -EMAIL_PORT = 2525
    +EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
    +EMAIL_FILE_PATH = "email/"
    +# EMAIL_HOST = 'localhost'
    +# EMAIL_PORT = 2525
     EMAIL_FROM = 'T.D.Mees@uu.nl'
     EMAIL_LOCAL_STAFF = 'T.D.Mees@uu.nl'
     
    diff --git a/main/views.py b/main/views.py
    index c4d13e7fa..b37d99a1e 100644
    --- a/main/views.py
    +++ b/main/views.py
    @@ -113,7 +113,7 @@ def get_user_reviews(self):
             reviews = {}
             objects = Review.objects.filter(
                 stage__gte=Review.Stages.ASSIGNMENT,
    -            proposal__status__gte=Proposal.SUBMITTED,
    +            proposal__status__gte=Proposal.Statuses.SUBMITTED,
                 proposal__created_by=self.get_object()
             )
     
    @@ -375,10 +375,10 @@ def get_object(self, queryset=None):
                 commission |= get_user_model().objects.filter(
                     groups__name=settings.GROUP_GENERAL_CHAMBER)
     
    -        if proposal.status >= Proposal.SUBMITTED:
    +        if proposal.status >= Proposal.Statuses.SUBMITTED:
                 if self.request.user not in commission:
                     raise PermissionDenied
    -        elif proposal.status >= Proposal.SUBMITTED_TO_SUPERVISOR:
    +        elif proposal.status >= Proposal.Statuses.SUBMITTED_TO_SUPERVISOR:
                 if self.request.user not in supervisor:
                     raise PermissionDenied
             else:
    @@ -432,10 +432,10 @@ def check_allowed(self):
                         groups__name=settings.GROUP_GENERAL_CHAMBER
                     )
     
    -            if proposal.status >= Proposal.SUBMITTED:
    +            if proposal.status >= Proposal.Statuses.SUBMITTED:
                     if self.request.user not in commission:
                         raise PermissionDenied
    -            elif proposal.status >= Proposal.SUBMITTED_TO_SUPERVISOR:
    +            elif proposal.status >= Proposal.Statuses.SUBMITTED_TO_SUPERVISOR:
                     if self.request.user not in supervisor:
                         raise PermissionDenied
                 else:
    diff --git a/proposals/api/views.py b/proposals/api/views.py
    index 059d6357b..19ef2f458 100644
    --- a/proposals/api/views.py
    +++ b/proposals/api/views.py
    @@ -51,8 +51,8 @@ def get_context(self):
     
             context['is_secretary'] = is_secretary(self.request.user)
             context['proposal'] = {
    -            'SUBMITTED_TO_SUPERVISOR': Proposal.SUBMITTED_TO_SUPERVISOR,
    -            'DECISION_MADE': Proposal.DECISION_MADE,
    +            'SUBMITTED_TO_SUPERVISOR': Proposal.Statuses.SUBMITTED_TO_SUPERVISOR,
    +            'DECISION_MADE': Proposal.Statuses.DECISION_MADE,
             }
             context['review'] = {
                 'REVISION': Review.Continuations.REVISION,
    @@ -81,7 +81,7 @@ class MyConceptsApiView(BaseProposalsApiView):
         def get_queryset(self):
             """Returns all non-submitted Proposals for the current User"""
             return self.get_my_proposals().filter(
    -            status__lt=Proposal.SUBMITTED_TO_SUPERVISOR
    +            status__lt=Proposal.Statuses.SUBMITTED_TO_SUPERVISOR
             )
     
     
    @@ -101,8 +101,8 @@ class MySubmittedApiView(BaseProposalsApiView):
         def get_queryset(self):
             """Returns all submitted Proposals for the current User"""
             return self.get_my_proposals().filter(
    -            status__gte=Proposal.SUBMITTED_TO_SUPERVISOR,
    -            status__lt=Proposal.DECISION_MADE
    +            status__gte=Proposal.Statuses.SUBMITTED_TO_SUPERVISOR,
    +            status__lt=Proposal.Statuses.DECISION_MADE
             )
     
     
    @@ -111,7 +111,7 @@ class MyCompletedApiView(BaseProposalsApiView):
         def get_queryset(self):
             """Returns all completed Proposals for the current User"""
             return self.get_my_proposals().filter(
    -            status__gte=Proposal.DECISION_MADE
    +            status__gte=Proposal.Statuses.DECISION_MADE
             )
     
     
    diff --git a/proposals/copy.py b/proposals/copy.py
    index 461164d81..9b866be53 100644
    --- a/proposals/copy.py
    +++ b/proposals/copy.py
    @@ -29,7 +29,7 @@ def copy_proposal(original_proposal, is_revision, created_by_user):
             copy_proposal.reference_number = generate_ref_number()
     
         copy_proposal.created_by = created_by_user
    -    copy_proposal.status = Proposal.DRAFT
    +    copy_proposal.status = Proposal.Statuses.DRAFT
         copy_proposal.status_review = None
         copy_proposal.pdf = None
         copy_proposal.date_created = timezone.now()
    diff --git a/proposals/forms.py b/proposals/forms.py
    index 7bd16fff5..5f4f373b1 100644
    --- a/proposals/forms.py
    +++ b/proposals/forms.py
    @@ -264,7 +264,7 @@ def clean(self):
     class ProposalStartPracticeForm(forms.Form):
         practice_reason = forms.ChoiceField(
             label=_('Ik maak een oefenaanvraag aan'),
    -        choices=Proposal.PRACTICE_REASONS,
    +        choices=Proposal.PracticeReasons.choices,
             widget=forms.RadioSelect())
     
     
    @@ -302,7 +302,7 @@ def _get_parent_queryset(self):
             ).filter(
                 Q(applicants=self.user, ) | Q(supervisor=self.user)
             ).filter(
    -            Q(status=Proposal.DRAFT) | Q(status__gte=Proposal.DECISION_MADE)
    +            Q(status=Proposal.Statuses.DRAFT) | Q(status__gte=Proposal.Statuses.DECISION_MADE)
             ).distinct()
     
     
    @@ -346,7 +346,7 @@ def _get_parent_queryset(self):
             # Those are eligible for revisions
             return Proposal.objects.filter(
                 is_pre_assessment=False,
    -            status=Proposal.DECISION_MADE,
    +            status=Proposal.Statuses.DECISION_MADE,
                 status_review=False,
                 children__isnull=True,
             ).filter(
    diff --git a/proposals/models.py b/proposals/models.py
    index c68bcbd75..e0b051de4 100644
    --- a/proposals/models.py
    +++ b/proposals/models.py
    @@ -133,28 +133,17 @@ class Proposal(models.Model):
     
         objects = ProposalQuerySet.as_manager()
     
    -    DRAFT = 1
    -    SUBMITTED_TO_SUPERVISOR = 40
    -    SUBMITTED = 50
    -    DECISION_MADE = 55
    -    WMO_DECISION_MADE = 60
    -    STATUSES = (
    -        (DRAFT, _('Concept')),
    +    class Statuses(models.IntegerChoices):
    +        DRAFT = 1, _('Concept')
    +        SUBMITTED_TO_SUPERVISOR = 40, _('Opgestuurd ter beoordeling door eindverantwoordelijke')
    +        SUBMITTED = 50, _('Opgestuurd ter beoordeling door FETC-GW')
    +        DECISION_MADE = 55, _('Aanvraag is beoordeeld door FETC-GW')
    +        WMO_DECISION_MADE = 60, _('Aanvraag is beoordeeld door FETC-GW')
     
    -        (SUBMITTED_TO_SUPERVISOR,
    -         _('Opgestuurd ter beoordeling door eindverantwoordelijke')),
    -        (SUBMITTED, _('Opgestuurd ter beoordeling door FETC-GW')),
    +    class PracticeReasons(models.IntegerChoices):
    +        COURSE = 1, _('om de portal te exploreren')
    +        EXPLORATION = 2, _('in het kader van een cursus')
     
    -        (DECISION_MADE, _('Aanvraag is beoordeeld door FETC-GW')),
    -        (WMO_DECISION_MADE, _('Aanvraag is beoordeeld door FETC-GW')),
    -    )
    -
    -    COURSE = 1
    -    EXPLORATION = 2
    -    PRACTICE_REASONS = (
    -        (COURSE, _('in het kader van een cursus')),
    -        (EXPLORATION, _('om de portal te exploreren')),
    -    )
     
         # Fields of a proposal
         reference_number = models.CharField(
    @@ -388,8 +377,8 @@ class Proposal(models.Model):
     
         # Status
         status = models.PositiveIntegerField(
    -        choices=STATUSES,
    -        default=DRAFT,
    +        choices=Statuses.choices,
    +        default=Statuses.DRAFT,
         )
     
         status_review = models.BooleanField(
    @@ -638,7 +627,7 @@ def supervisor_decision(self):
             """Returns the Decision of the supervisor for this Proposal (if any and in current stage)"""
             from reviews.models import Review, Decision
     
    -        if self.supervisor and self.status == Proposal.SUBMITTED_TO_SUPERVISOR:
    +        if self.supervisor and self.status == Proposal.Statuses.SUBMITTED_TO_SUPERVISOR:
                 decisions = Decision.objects.filter(
                     review__proposal=self,
                     review__stage=Review.Stages.SUPERVISOR
    @@ -659,7 +648,7 @@ def latest_review(self):
     
         def enforce_wmo(self):
             """Send proposal back to draft phase with WMO enforced."""
    -        self.status = self.DRAFT
    +        self.status = self.Statuses.DRAFT
             self.save()
             self.wmo.enforced_by_commission = True
             self.wmo.save()
    @@ -668,7 +657,7 @@ def mark_reviewed(self, continuation, time=None):
             """Finalize a proposal after a decision has been made."""
             if time is None:
                 time = timezone.now()
    -        self.status = self.DECISION_MADE
    +        self.status = self.Statuses.DECISION_MADE
             # Importing here to prevent circular import
             from reviews.models import Review
             self.status_review = continuation in [
    @@ -714,14 +703,10 @@ def __str__(self):
     
     
     class Wmo(models.Model):
    -    NO_WMO = 0
    -    WAITING = 1
    -    JUDGED = 2
    -    WMO_STATUSES = (
    -        (NO_WMO, _('Geen beoordeling door METC noodzakelijk')),
    -        (WAITING, _('In afwachting beslissing METC')),
    -        (JUDGED, _('Beslissing METC geüpload')),
    -    )
    +    class WMOStatuses(models.IntegerChoices):
    +        NO_WMO = 0, _('Geen beoordeling door METC noodzakelijk')
    +        WAITING = 1, _('In afwachting beslissing METC')
    +        JUDGED = 2, _('Beslissing METC geüpload')
     
         metc = models.CharField(
             _('Vindt de dataverzameling plaats binnen het UMC Utrecht of \
    @@ -784,8 +769,8 @@ class Wmo(models.Model):
     
         # Status
         status = models.PositiveIntegerField(
    -        choices=WMO_STATUSES,
    -        default=NO_WMO,
    +        choices=WMOStatuses.choices,
    +        default=WMOStatuses.NO_WMO,
         )
     
         enforced_by_commission = models.BooleanField(default=False)
    @@ -805,11 +790,11 @@ def save(self, *args, **kwargs):
         def update_status(self):
             if self.metc == YesNoDoubt.YES or self.is_medical == YesNoDoubt.YES or self.enforced_by_commission:
                 if self.metc_decision and self.metc_decision_pdf:
    -                self.status = self.JUDGED
    +                self.status = self.WMOStatuses.JUDGED
                 else:
    -                self.status = self.WAITING
    +                self.status = self.WMOStatuses.WAITING
             else:
    -            self.status = self.NO_WMO
    +            self.status = self.WMOStatuses.NO_WMO
     
         def __str__(self):
             return _('WMO {title}, status {status}').format(
    diff --git a/proposals/tests.py b/proposals/tests.py
    index 50837f3cc..42f85e8e8 100644
    --- a/proposals/tests.py
    +++ b/proposals/tests.py
    @@ -137,13 +137,13 @@ def test_revision_reference_number(self):
     
         def test_status(self):
             proposal = self.p1
    -        self.assertEqual(proposal.status, Proposal.DRAFT)
    +        self.assertEqual(proposal.status, Proposal.Statuses.DRAFT)
     
             wmo = Wmo.objects.create(proposal=proposal, metc=YesNoDoubt.YES)
    -        self.assertEqual(proposal.wmo.status, Wmo.WAITING)
    +        self.assertEqual(proposal.wmo.status, Wmo.WMOStatuses.WAITING)
             wmo.metc = NO
             wmo.save()
    -        self.assertEqual(proposal.wmo.status, Wmo.NO_WMO)
    +        self.assertEqual(proposal.wmo.status, Wmo.WMOStatuses.NO_WMO)
             #self.assertEqual(proposal.continue_url(), '/studies/create/1/')
     
             s = Study.objects.create(proposal=proposal, order=1)
    @@ -279,22 +279,22 @@ def setUp(self):
             self.wmo = Wmo.objects.create(proposal=self.p1, metc=NO)
     
         def test_status(self):
    -        self.assertEqual(self.wmo.status, Wmo.NO_WMO)
    +        self.assertEqual(self.wmo.status, Wmo.WMOStatuses.NO_WMO)
     
             self.wmo.metc = YesNoDoubt.YES
             self.wmo.save()
     
    -        self.assertEqual(self.wmo.status, Wmo.WAITING)
    +        self.assertEqual(self.wmo.status, Wmo.WMOStatuses.WAITING)
     
             self.wmo.metc_decision = True
             self.wmo.save()
     
    -        self.assertEqual(self.wmo.status, Wmo.WAITING)
    +        self.assertEqual(self.wmo.status, Wmo.WMOStatuses.WAITING)
     
             self.wmo.metc_decision_pdf = SimpleUploadedFile('test.pdf', b'contents')
             self.wmo.save()
     
    -        self.assertEqual(self.wmo.status, Wmo.JUDGED)
    +        self.assertEqual(self.wmo.status, Wmo.WMOStatuses.JUDGED)
     
     
     class CopyTestCase(BaseProposalTestCase):
    @@ -304,7 +304,7 @@ def setUp(self):
     
             self.wmo_1 = Wmo.objects.create(
                 proposal=self.p1,
    -            metc=Wmo.JUDGED,
    +            metc=Wmo.WMOStatuses.JUDGED,
             )
     
             self.study_1 = Study.objects.create(
    diff --git a/proposals/utils/statistics_utils.py b/proposals/utils/statistics_utils.py
    index c15f5e803..bf630fd1a 100644
    --- a/proposals/utils/statistics_utils.py
    +++ b/proposals/utils/statistics_utils.py
    @@ -27,7 +27,7 @@ def get_qs_for_year(year: int) -> QuerySet:
         return Proposal.objects.filter(
             date_submitted__year=year,
             is_revision=False,
    -        status__gte=Proposal.DECISION_MADE,
    +        status__gte=Proposal.Statuses.DECISION_MADE,
         )
     
     
    diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py
    index ad4ccebbb..c170f12c0 100644
    --- a/proposals/views/proposal_views.py
    +++ b/proposals/views/proposal_views.py
    @@ -446,7 +446,7 @@ def form_valid(self, form):
             if 'save_back' not in self.request.POST and 'js-redirect-submit' not in self.request.POST:
                 proposal = self.get_object()
                 proposal.generate_pdf()
    -            if not proposal.is_practice() and proposal.status == Proposal.DRAFT:
    +            if not proposal.is_practice() and proposal.status == Proposal.Statuses.DRAFT:
                     start_review(proposal)
             return success_url
     
    @@ -762,14 +762,14 @@ def get_context_data(self, **kwargs):
         def get_form_kwargs(self):
             """Sets in_course as a form kwarg"""
             kwargs = super(ProposalCreatePractice, self).get_form_kwargs()
    -        kwargs['in_course'] = self.kwargs['reason'] == Proposal.COURSE
    +        kwargs['in_course'] = self.kwargs['reason'] == Proposal.PracticeReasons.COURSE
             return kwargs
     
         def form_valid(self, form):
             """Sets in_course and is_exploration"""
    -        form.instance.in_course = self.kwargs['reason'] == Proposal.COURSE
    +        form.instance.in_course = self.kwargs['reason'] == Proposal.PracticeReasons.COURSE
             form.instance.is_exploration = self.kwargs[
    -                                           'reason'] == Proposal.EXPLORATION
    +                                           'reason'] == Proposal.PracticeReasons.EXPLORATION
             return super(ProposalCreatePractice, self).form_valid(form)
     
     
    diff --git a/proposals/views/wmo_views.py b/proposals/views/wmo_views.py
    index 1b0cb4be5..06ce56296 100644
    --- a/proposals/views/wmo_views.py
    +++ b/proposals/views/wmo_views.py
    @@ -33,7 +33,7 @@ def get_next_url(self):
             else, start the Wmo application.
             """
             wmo = self.object
    -        if wmo.status == Wmo.NO_WMO:
    +        if wmo.status == Wmo.WMOStatuses.NO_WMO:
                 return reverse('proposals:study_start', args=(wmo.proposal.pk,))
             else:
                 return reverse('proposals:wmo_application', args=(wmo.pk,))
    @@ -86,7 +86,7 @@ def get_context_data(self, **kwargs):
         def get_next_url(self):
             """Continue to the definition of a Study if we have completed the Wmo application"""
             wmo = self.object
    -        if wmo.status == Wmo.WAITING:
    +        if wmo.status == Wmo.WMOStatuses.WAITING:
                 return reverse('proposals:wmo_application', args=(wmo.pk,))
             else:
                 return reverse('proposals:study_start', args=(wmo.proposal.pk,))
    @@ -108,7 +108,7 @@ class PreAssessmentMixin(object):
         def get_next_url(self):
             """Different continue URL for pre-assessment Proposals"""
             wmo = self.object
    -        if wmo.status == Wmo.NO_WMO:
    +        if wmo.status == Wmo.WMOStatuses.NO_WMO:
                 return reverse('proposals:submit_pre', args=(self.object.proposal.pk,))
             else:
                 return reverse('proposals:wmo_application_pre', args=(wmo.pk,))
    diff --git a/reviews/api/views.py b/reviews/api/views.py
    index 881eb348e..29409d76c 100644
    --- a/reviews/api/views.py
    +++ b/reviews/api/views.py
    @@ -293,7 +293,7 @@ def get_queryset(self):
             objects = Decision.objects.filter(
                 go='',
                 review__stage=Review.Stages.SUPERVISOR,
    -            review__proposal__status=Proposal.SUBMITTED_TO_SUPERVISOR,
    +            review__proposal__status=Proposal.Statuses.SUBMITTED_TO_SUPERVISOR,
                 review__proposal__reviewing_committee=self.committee
             )
     
    @@ -376,7 +376,7 @@ def get_queryset(self):
             reviews = {}
             objects = Review.objects.filter(
                 stage__gte=Review.Stages.CLOSING,
    -            proposal__status__gte=Proposal.SUBMITTED,
    +            proposal__status__gte=Proposal.Statuses.SUBMITTED,
                 proposal__date_confirmed=None,
                 proposal__reviewing_committee=self.committee,
             ).filter(
    @@ -463,7 +463,7 @@ def get_queryset(self):
             objects = Review.objects.filter(
                 stage__gte=Review.Stages.ASSIGNMENT,
                 stage__lte=Review.Stages.CLOSING,
    -            proposal__status__gte=Proposal.SUBMITTED,
    +            proposal__status__gte=Proposal.Statuses.SUBMITTED,
                 proposal__reviewing_committee=self.committee,
             ).select_related(
                 'proposal',
    @@ -509,7 +509,7 @@ def get_queryset(self):
             reviews = OrderedDict()
             objects = Review.objects.filter(
                 stage__gte=Review.Stages.ASSIGNMENT,
    -            proposal__status__gte=Proposal.SUBMITTED,
    +            proposal__status__gte=Proposal.Statuses.SUBMITTED,
                 proposal__reviewing_committee=self.committee,
             ).select_related(
                 'proposal',
    diff --git a/reviews/models.py b/reviews/models.py
    index e376c3081..6b3fc9b95 100644
    --- a/reviews/models.py
    +++ b/reviews/models.py
    @@ -95,7 +95,7 @@ def update_go(self, last_decision=None):
                         # See comment above
                         from reviews.utils import notify_supervisor_nogo
                         notify_supervisor_nogo(last_decision)
    -                    self.proposal.status = Proposal.DRAFT
    +                    self.proposal.status = Proposal.Statuses.DRAFT
                         self.proposal.save()
                 # For a review by commission:
                 else:
    diff --git a/reviews/tests.py b/reviews/tests.py
    index 645d709f5..1e0967df2 100644
    --- a/reviews/tests.py
    +++ b/reviews/tests.py
    @@ -402,7 +402,7 @@ def test_open_review(self):
             )
             self.assertGreaterEqual(
                 p.status,
    -            p.SUBMITTED_TO_SUPERVISOR,
    +            p.Statuses.SUBMITTED_TO_SUPERVISOR,
             )
     
         def test_decision(self):
    @@ -425,7 +425,7 @@ def test_decision(self):
             )
             self.assertEqual(
                 self.proposal.status,
    -            self.proposal.DECISION_MADE,
    +            self.proposal.Statuses.DECISION_MADE,
             )
             self.assertEqual(
                 self.proposal.status_review,
    @@ -471,7 +471,7 @@ def test_metc(self):
             # Assertions
             self.assertEqual(
                 self.proposal.status,
    -            self.proposal.DRAFT,
    +            self.proposal.Statuses.DRAFT,
             )
             self.assertEqual(
                 self.proposal.wmo.enforced_by_commission,
    diff --git a/reviews/utils/review_actions.py b/reviews/utils/review_actions.py
    index 14d4cf5c0..60f8a7a55 100644
    --- a/reviews/utils/review_actions.py
    +++ b/reviews/utils/review_actions.py
    @@ -265,7 +265,7 @@ def is_available(self):
                review.proposal.embargo_end_date > datetime.date.today():
                 return False
             
    -        if review.proposal.status < Proposal.DECISION_MADE:
    +        if review.proposal.status < Proposal.Statuses.DECISION_MADE:
                 return False
     
             return True
    diff --git a/reviews/views.py b/reviews/views.py
    index cfd42a8be..70ed8550f 100644
    --- a/reviews/views.py
    +++ b/reviews/views.py
    @@ -359,7 +359,7 @@ def form_valid(self, form):
     
                 # Mark the proposal as finished
                 proposal = form.instance.proposal
    -            proposal.status = Proposal.DECISION_MADE
    +            proposal.status = Proposal.Statuses.DECISION_MADE
                 proposal.status_review = False
                 proposal.date_reviewed = timezone.now()
                 proposal.save()
    
    From af87f9786c5863bbebf53705487f63a373058288 Mon Sep 17 00:00:00 2001
    From: Edo Storm 
    Date: Thu, 23 Nov 2023 10:30:53 +0100
    Subject: [PATCH 095/148] Removed DESIGNS from studies, because they are unused
    
    ---
     studies/models.py | 8 --------
     1 file changed, 8 deletions(-)
    
    diff --git a/studies/models.py b/studies/models.py
    index 806b32042..e39884d16 100644
    --- a/studies/models.py
    +++ b/studies/models.py
    @@ -136,14 +136,6 @@ class Study(models.Model):
         A model to store a study within a Proposal.
         A Study consists of participant details, experiment design and consent forms.
         """
    -    OBSERVATION = 0
    -    INTERVENTION = 1
    -    SESSIONS = 2
    -    DESIGNS = (
    -        (OBSERVATION, _('Observatieonderzoek')),
    -        (INTERVENTION, _('Interventieonderzoek')),
    -        (SESSIONS, _('Taakonderzoek en interviews')),
    -    )
     
         order = models.PositiveIntegerField()
         name = models.CharField(
    
    From d25a7bca26c8867710fff30945ee26b6f8229f7c Mon Sep 17 00:00:00 2001
    From: Edo Storm 
    Date: Thu, 23 Nov 2023 11:28:26 +0100
    Subject: [PATCH 096/148] Undid some accidentally committed changes
    
    ---
     docs/_build/html/_modules/core/models.html      |  2 +-
     docs/_build/html/_modules/proposals/forms.html  | 12 ++++++------
     docs/_build/html/_modules/proposals/models.html |  8 ++++----
     docs/_build/html/_modules/studies/forms.html    | 12 ++++++------
     docs/_build/html/_modules/studies/models.html   | 12 ++++++------
     fetc/settings.py                                |  6 ++----
     proposals/tests.py                              |  2 +-
     7 files changed, 26 insertions(+), 28 deletions(-)
    
    diff --git a/docs/_build/html/_modules/core/models.html b/docs/_build/html/_modules/core/models.html
    index ec2ec10d6..812faa697 100644
    --- a/docs/_build/html/_modules/core/models.html
    +++ b/docs/_build/html/_modules/core/models.html
    @@ -158,7 +158,7 @@ 

    Source code for core.models

     YES = 'Y'
     NO = 'N'
     DOUBT = '?'
    -YesNoDoubt.choices = (
    +YES_NO_DOUBT = (
         (YES, _('ja')),
         (NO, _('nee')),
         (DOUBT, _('twijfel')),
    diff --git a/docs/_build/html/_modules/proposals/forms.html b/docs/_build/html/_modules/proposals/forms.html
    index b0404e95d..6581e514d 100644
    --- a/docs/_build/html/_modules/proposals/forms.html
    +++ b/docs/_build/html/_modules/proposals/forms.html
    @@ -161,7 +161,7 @@ 

    Source code for proposals.forms

     from django.utils.translation import ugettext_lazy as _
     
     from core.forms import ConditionalModelForm, SoftValidationMixin
    -from core.models import DOUBT, NO, YES, YesNoDoubt.choices
    +from core.models import DOUBT, NO, YES, YES_NO_DOUBT
     from core.utils import YES_NO, get_users_as_list
     from .models import Proposal, Relation, Wmo
     from .utils import check_local_facilities
    @@ -476,11 +476,11 @@ 

    Source code for proposals.forms

             """
             super(WmoForm, self).__init__(*args, **kwargs)
             self.fields['metc'].empty_label = None
    -        self.fields['metc'].choices = YesNoDoubt.choices
    +        self.fields['metc'].choices = YES_NO_DOUBT
             self.fields['is_medical'].empty_label = None
    -        self.fields['is_medical'].choices = YesNoDoubt.choices
    +        self.fields['is_medical'].choices = YES_NO_DOUBT
             self.fields['is_behavioristic'].empty_label = None
    -        self.fields['is_behavioristic'].choices = YesNoDoubt.choices
    + self.fields['is_behavioristic'].choices = YES_NO_DOUBT
    [docs] def clean(self): """ @@ -524,9 +524,9 @@

    Source code for proposals.forms

             """
             super(WmoCheckForm, self).__init__(*args, **kwargs)
             self.fields['is_medical'].empty_label = None
    -        self.fields['is_medical'].choices = YesNoDoubt.choices
    +        self.fields['is_medical'].choices = YES_NO_DOUBT
             self.fields['is_behavioristic'].empty_label = None
    -        self.fields['is_behavioristic'].choices = YesNoDoubt.choices
    + self.fields['is_behavioristic'].choices = YES_NO_DOUBT
    [docs]class WmoApplicationForm(ConditionalModelForm): diff --git a/docs/_build/html/_modules/proposals/models.html b/docs/_build/html/_modules/proposals/models.html index 6eb92e1cd..b39325fdd 100644 --- a/docs/_build/html/_modules/proposals/models.html +++ b/docs/_build/html/_modules/proposals/models.html @@ -161,7 +161,7 @@

    Source code for proposals.models

     from django.utils.encoding import python_2_unicode_compatible
     from django.utils.translation import ugettext_lazy as _
     
    -from core.models import YES, YesNoDoubt.choices
    +from core.models import YES, YES_NO_DOUBT
     from core.validators import MaxWordsValidator, validate_pdf_or_doc
     from .utils import available_urls
     
    @@ -616,7 +616,7 @@ 

    Source code for proposals.models

             _('Vindt de dataverzameling plaats binnen het UMC Utrecht of \
     andere instelling waar toetsing door een METC verplicht is gesteld?'),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True,
             default=None,
         )
    @@ -645,7 +645,7 @@ 

    Source code for proposals.models

     onderzoekspopulatie. (CCMO-notitie, Definitie medisch-wetenschappelijk \
     onderzoek, 2005, ccmo.nl)'),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True,
         )
     
    @@ -659,7 +659,7 @@ 

    Source code for proposals.models

     worden in hun leven zoals het ook had plaatsgevonden zonder de observatie, \
     slechts dan kan "nee" ingevuld worden.'),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True,
         )
     
    diff --git a/docs/_build/html/_modules/studies/forms.html b/docs/_build/html/_modules/studies/forms.html
    index 856f20c00..80d8d54c7 100644
    --- a/docs/_build/html/_modules/studies/forms.html
    +++ b/docs/_build/html/_modules/studies/forms.html
    @@ -158,7 +158,7 @@ 

    Source code for studies.forms

     from django.utils.translation import ugettext_lazy as _
     
     from core.forms import ConditionalModelForm, SoftValidationMixin
    -from core.models import DOUBT, YES, YesNoDoubt.choices
    +from core.models import DOUBT, YES, YES_NO_DOUBT
     from core.utils import YES_NO
     from .models import AgeGroup, Documents, Study
     from .utils import check_necessity_required
    @@ -205,7 +205,7 @@ 

    Source code for studies.forms

             self.fields['legally_incapable'].label = "Geert"
             self.fields['compensation'].empty_label = None
             self.fields['necessity'].empty_label = None
    -        self.fields['necessity'].choices = YesNoDoubt.choices
    +        self.fields['necessity'].choices = YES_NO_DOUBT
     
             self.fields['age_groups'].queryset = AgeGroup.objects.filter(
                 is_active=True)
    @@ -349,13 +349,13 @@

    Source code for studies.forms

             super(StudyEndForm, self).__init__(*args, **kwargs)
     
             self.fields['deception'].empty_label = None
    -        self.fields['deception'].choices = YesNoDoubt.choices
    +        self.fields['deception'].choices = YES_NO_DOUBT
             self.fields['negativity'].empty_label = None
    -        self.fields['negativity'].choices = YesNoDoubt.choices
    +        self.fields['negativity'].choices = YES_NO_DOUBT
             self.fields['stressful'].empty_label = None
    -        self.fields['stressful'].choices = YesNoDoubt.choices
    +        self.fields['stressful'].choices = YES_NO_DOUBT
             self.fields['risk'].empty_label = None
    -        self.fields['risk'].choices = YesNoDoubt.choices
    +        self.fields['risk'].choices = YES_NO_DOUBT
     
             self.fields['negativity'].label = mark_safe(
                 self.fields['negativity'].label)
    diff --git a/docs/_build/html/_modules/studies/models.html b/docs/_build/html/_modules/studies/models.html
    index 7815845fd..48a066f0e 100644
    --- a/docs/_build/html/_modules/studies/models.html
    +++ b/docs/_build/html/_modules/studies/models.html
    @@ -160,7 +160,7 @@ 

    Source code for studies.models

     from django.utils.translation import ugettext_lazy as _
     from django.utils.encoding import python_2_unicode_compatible
     
    -from core.models import YesNoDoubt.choices
    +from core.models import YES_NO_DOUBT
     from core.validators import validate_pdf_or_doc
     from proposals.models import Proposal
     
    @@ -312,7 +312,7 @@ 

    Source code for studies.models

     of zou u de vraag ook kunnen beantwoorden door volwassen deelnemers \
     te testen?'),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True)
         necessity_reason = models.TextField(
             _('Leg uit waarom'),
    @@ -385,7 +385,7 @@ 

    Source code for studies.models

     geheugentaak of het geven van gefingeerde feedback. Wellicht ten overvloede: \
     het gaat hierbij niet om fillers.'),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True)
         deception_details = models.TextField(
             _('Geef een toelichting en beschrijf hoe en wanneer de deelnemer \
    @@ -398,7 +398,7 @@ 

    Source code for studies.models

     uitspraken, negatieve feedback, frustrerende, zware, (heel) lange en/of \
     (heel) saaie taken.'),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True)
         negativity_details = models.TextField(
             _('Licht uw antwoord toe.'),
    @@ -417,7 +417,7 @@ 

    Source code for studies.models

     tijdens het onderzoek, niet om de opgelopen psychische of fysieke schade \
     door het onderzoek.')),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True)
         stressful_details = models.TextField(
             _('Licht uw antwoord toe. Geef concrete voorbeelden van de relevante \
    @@ -447,7 +447,7 @@ 

    Source code for studies.models

     inspanning; dit alles, waar relevant, onder begeleiding van adequaat \
     geschoolde specialisten).')),
             max_length=1,
    -        choices=YesNoDoubt.choices,
    +        choices=YES_NO_DOUBT,
             blank=True)
         risk_details = models.TextField(
             _('Licht toe'),
    diff --git a/fetc/settings.py b/fetc/settings.py
    index b1a7feb1f..45697d112 100644
    --- a/fetc/settings.py
    +++ b/fetc/settings.py
    @@ -152,10 +152,8 @@
     MEDIA_URL = '/media/'
     
     # E-mail settings
    -EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
    -EMAIL_FILE_PATH = "email/"
    -# EMAIL_HOST = 'localhost'
    -# EMAIL_PORT = 2525
    +EMAIL_HOST = 'localhost'
    +EMAIL_PORT = 2525
     EMAIL_FROM = 'T.D.Mees@uu.nl'
     EMAIL_LOCAL_STAFF = 'T.D.Mees@uu.nl'
     
    diff --git a/proposals/tests.py b/proposals/tests.py
    index 42f85e8e8..b146365ed 100644
    --- a/proposals/tests.py
    +++ b/proposals/tests.py
    @@ -5,7 +5,7 @@
     from django.core.files.uploadedfile import SimpleUploadedFile
     from django.conf import settings
     
    -from main.models import Setting, YesNoDoubt.YES, NO
    +from main.models import Setting, YesNoDoubt
     from interventions.models import Intervention
     from observations.models import Observation
     from tasks.models import Session, Task, Registration
    
    From 28411f1536d992a69e41d952c1606e1bf4e192f3 Mon Sep 17 00:00:00 2001
    From: Edo Storm 
    Date: Thu, 23 Nov 2023 16:49:24 +0100
    Subject: [PATCH 097/148] Ty's fixes
    
    ---
     proposals/utils/pdf_diff_logic.py | 3 +--
     reviews/forms.py                  | 3 ++-
     reviews/models.py                 | 2 +-
     reviews/utils/review_utils.py     | 6 +++---
     4 files changed, 7 insertions(+), 7 deletions(-)
    
    diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py
    index 311e616ed..488e29282 100644
    --- a/proposals/utils/pdf_diff_logic.py
    +++ b/proposals/utils/pdf_diff_logic.py
    @@ -288,8 +288,7 @@ def handle_field_file(self, field_file):
         def yes_no_doubt(self, value):
             from main.models import YesNoDoubt
     
    -        d = dict(YesNoDoubt.choices)
    -        return d[value]
    +        return YesNoDoubt(value).label
     
     
     class SubTitle:
    diff --git a/reviews/forms.py b/reviews/forms.py
    index f7b66609f..56fc4eea2 100644
    --- a/reviews/forms.py
    +++ b/reviews/forms.py
    @@ -102,7 +102,8 @@ def __init__(self, *args, **kwargs):
             allow_long_route_continuation = kwargs.pop('allow_long_route_continuation', False)
             super(ReviewCloseForm, self).__init__(*args, **kwargs)
             if not allow_long_route_continuation:
    -            self.fields['continuation'].choices = [x for x in Review.Continuations.choices if x != Review.Continuations.LONG_ROUTE]
    +            self.fields['continuation'].choices = [x for x in Review.Continuations.choices 
    +                                                   if x[0] != Review.Continuations.LONG_ROUTE]
     
             self.fields['in_archive'].label = _('Voeg deze aanvraag toe aan het archief')
             self.fields['in_archive'].widget = forms.RadioSelect(choices=YES_NO)
    diff --git a/reviews/models.py b/reviews/models.py
    index 6b3fc9b95..49b821a71 100644
    --- a/reviews/models.py
    +++ b/reviews/models.py
    @@ -117,7 +117,7 @@ def get_continuation_display(self):
                 return _("Onbekend")
     
             # Get the human readable string
    -        continuation = dict(self.Continuations.choices)[self.continuation]
    +        continuation = self.Continuations(self.continuation).label
     
             if self.proposal.has_minor_revision:
                 continuation += str(_(', met revisie'))
    diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py
    index a955c2822..8a45073ed 100644
    --- a/reviews/utils/review_utils.py
    +++ b/reviews/utils/review_utils.py
    @@ -338,7 +338,7 @@ def auto_review(proposal: Proposal):
             if study.legally_incapable:
                 reasons.append(_('De aanvraag bevat het gebruik van wilsonbekwame volwassenen.'))
     
    -        if study.deception in [YesNoDoubt.YES, DOUBT]:
    +        if study.deception in [YesNoDoubt.YES, YesNoDoubt.DOUBT]:
                 reasons.append(_('De aanvraag bevat het gebruik van misleiding.'))
     
             if study.hierarchy:
    @@ -353,11 +353,11 @@ def auto_review(proposal: Proposal):
             for task in Task.objects.filter(session__study=study):
                 reasons.extend(auto_review_task(study, task))
     
    -        if study.stressful in [YesNoDoubt.YES, DOUBT]:
    +        if study.stressful in [YesNoDoubt.YES, YesNoDoubt.DOUBT]:
                 reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op onderdelen of \
     als geheel zodanig belastend is dat deze ondanks de verkregen informed consent vragen zou kunnen oproepen.'))
     
    -        if study.risk in [YesNoDoubt.YES, DOUBT]:
    +        if study.risk in [YesNoDoubt.YES, YesNoDoubt.DOUBT]:
                 reasons.append(_('De onderzoeker geeft aan dat (of twijfelt erover of) de risico\'s op psychische of \
     fysieke schade bij deelname aan het onderzoek meer dan minimaal zijn.'))
     
    
    From 95f4f7ef68e54a510bb71b69de96ca7aaf5678e2 Mon Sep 17 00:00:00 2001
    From: Edo Storm 
    Date: Tue, 28 Nov 2023 14:05:35 +0100
    Subject: [PATCH 098/148] Things I missed ...
    
    ---
     proposals/tests.py                | 4 ++--
     proposals/utils/pdf_diff_logic.py | 4 ++--
     proposals/views/wmo_views.py      | 2 +-
     reviews/tests.py                  | 4 ++--
     reviews/utils/review_utils.py     | 4 ++--
     5 files changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/proposals/tests.py b/proposals/tests.py
    index b146365ed..5c9631519 100644
    --- a/proposals/tests.py
    +++ b/proposals/tests.py
    @@ -141,7 +141,7 @@ def test_status(self):
     
             wmo = Wmo.objects.create(proposal=proposal, metc=YesNoDoubt.YES)
             self.assertEqual(proposal.wmo.status, Wmo.WMOStatuses.WAITING)
    -        wmo.metc = NO
    +        wmo.metc = YesNoDoubt.NO
             wmo.save()
             self.assertEqual(proposal.wmo.status, Wmo.WMOStatuses.NO_WMO)
             #self.assertEqual(proposal.continue_url(), '/studies/create/1/')
    @@ -276,7 +276,7 @@ def test_supervisor(self):
     class WmoTestCase(BaseProposalTestCase):
         def setUp(self):
             super(WmoTestCase, self).setUp()
    -        self.wmo = Wmo.objects.create(proposal=self.p1, metc=NO)
    +        self.wmo = Wmo.objects.create(proposal=self.p1, metc=YesNoDoubt.NO)
     
         def test_status(self):
             self.assertEqual(self.wmo.status, Wmo.WMOStatuses.NO_WMO)
    diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py
    index 488e29282..9daef35f8 100644
    --- a/proposals/utils/pdf_diff_logic.py
    +++ b/proposals/utils/pdf_diff_logic.py
    @@ -1014,12 +1014,12 @@ def create_context_pdf(context, model):
             sections.append(WMOSection(model.wmo))
     
             if not model.is_pre_assessment:
    -            if model.wmo.status != model.wmo.NO_WMO:
    +            if model.wmo.status != model.wmo.WMOStatuses.NO_WMO:
                     sections.append(METCSection(model.wmo))
     
                 sections.append(TrajectoriesSection(model))
     
    -            if model.wmo.status == model.wmo.NO_WMO:
    +            if model.wmo.status == model.wmo.WMOStatuses.NO_WMO:
                     for study in model.study_set.all():
                         sections.append(StudySection(study))
                         if study.has_intervention:
    diff --git a/proposals/views/wmo_views.py b/proposals/views/wmo_views.py
    index 06ce56296..33eea8dd4 100644
    --- a/proposals/views/wmo_views.py
    +++ b/proposals/views/wmo_views.py
    @@ -142,7 +142,7 @@ def check_wmo(request):
         is_metc = request.POST.get('metc') == YesNoDoubt.YES
         is_medical = request.POST.get('medical') == YesNoDoubt.YES
     
    -    doubt = request.POST.get('metc') == DOUBT or request.POST.get('medical') == DOUBT
    +    doubt = request.POST.get('metc') == YesNoDoubt.DOUBT or request.POST.get('medical') == YesNoDoubt.DOUBT
     
         # Default message: OK.
         message = _('Je onderzoek hoeft niet te worden beoordeeld door de METC.')
    diff --git a/reviews/tests.py b/reviews/tests.py
    index 1e0967df2..41d391576 100644
    --- a/reviews/tests.py
    +++ b/reviews/tests.py
    @@ -104,7 +104,7 @@ def setup_proposal(self):
             )
             self.proposal.wmo = Wmo.objects.create(
                 proposal=self.proposal,
    -            metc=NO,
    +            metc=YesNoDoubt.NO,
             )
             self.study = Study.objects.create(
                 proposal=self.proposal,
    @@ -267,7 +267,7 @@ def test_auto_review(self):
             reasons = auto_review(self.proposal)
             self.assertEqual(len(reasons), 1)
     
    -        self.study.deception = DOUBT
    +        self.study.deception = YesNoDoubt.DOUBT
             self.study.save()
     
             reasons = auto_review(self.proposal)
    diff --git a/reviews/utils/review_utils.py b/reviews/utils/review_utils.py
    index 8a45073ed..4b5398f16 100644
    --- a/reviews/utils/review_utils.py
    +++ b/reviews/utils/review_utils.py
    @@ -46,7 +46,7 @@ def start_supervisor_phase(proposal):
         review.save()
     
         proposal.date_submitted_supervisor = timezone.now()
    -    proposal.status = proposal.SUBMITTED_TO_SUPERVISOR
    +    proposal.status = proposal.Statuses.SUBMITTED_TO_SUPERVISOR
         proposal.save()
     
         decision = Decision.objects.create(review=review, reviewer=proposal.supervisor)
    @@ -114,7 +114,7 @@ def start_assignment_phase(proposal):
         review.save()
     
         proposal.date_submitted = timezone.now()
    -    proposal.status = proposal.SUBMITTED
    +    proposal.status = proposal.Statuses.SUBMITTED
         proposal.save()
     
         secretary = get_secretary()
    
    From 3ae6b51215dca40b5e0f821c2350492e3fdb4df4 Mon Sep 17 00:00:00 2001
    From: Edo Storm 
    Date: Mon, 27 Nov 2023 15:51:38 +0100
    Subject: [PATCH 099/148] Fix #259. Removing all references to title field in
     copy forms + copy.js
    
    ---
     proposals/forms.py                            | 26 -------------------
     proposals/static/proposals/js/copy.js         | 10 -------
     .../templates/proposals/proposal_copy.html    |  6 -----
     3 files changed, 42 deletions(-)
     delete mode 100644 proposals/static/proposals/js/copy.js
    
    diff --git a/proposals/forms.py b/proposals/forms.py
    index 21cabcf24..7403d8173 100644
    --- a/proposals/forms.py
    +++ b/proposals/forms.py
    @@ -275,11 +275,6 @@ class Meta:
             widgets = {
                 'is_revision': forms.HiddenInput(),
             }
    -        error_messages = {
    -            'title': {
    -                'unique': _('Er bestaat al een aanvraag met deze titel.'),
    -            },
    -        }
     
         parent = ParentChoiceModelField(
             queryset=Proposal.objects.all(),
    @@ -323,17 +318,6 @@ class RevisionProposalCopyForm(BaseProposalCopyForm):
         def __init__(self, *args, **kwargs):
             super().__init__(*args, **kwargs)
     
    -
    -        if 'title' in self.fields:
    -            self.fields['title'].label = _('Je kan de titel van je aanvraag nu, '
    -                                           'indien nodig, wijzigen.')
    -            self.fields['title'].help_text = _('De titel die je hier opgeeft is '
    -                                               'zichtbaar voor de FETC-GW-leden en,'
    -                                               ' wanneer de aanvraag is goedgekeurd,'
    -                                               ' ook voor alle medewerkers die in'
    -                                               ' het archief van deze portal '
    -                                               'kijken.')
    -
             self.fields['parent'].label = _('Te reviseren aanvraag')
             self.fields['parent'].help_text = _('Dit veld toont enkel ingediende,'
                                                 ' (nog) niet goedgekeurde aanvragen '
    @@ -359,16 +343,6 @@ class AmendmentProposalCopyForm(BaseProposalCopyForm):
         def __init__(self, *args, **kwargs):
             super().__init__(*args, **kwargs)
     
    -        if 'title' in self.fields:
    -            self.fields['title'].label = _('Je kan de titel van je aanvraag nu, '
    -                                           'indien nodig, wijzigen.')
    -            self.fields['title'].help_text = _('De titel die je hier opgeeft is '
    -                                               'zichtbaar voor de FETC-GW-leden en,'
    -                                               ' wanneer de aanvraag is goedgekeurd,'
    -                                               ' ook voor alle medewerkers die in'
    -                                               ' het archief van deze portal '
    -                                               'kijken.')
    -
             self.fields['parent'].label = _('Te amenderen aanvraag')
             self.fields['parent'].help_text = _('Dit veld toont enkel goedgekeurde'
                                                 ' aanvragen waar je zelf een '
    diff --git a/proposals/static/proposals/js/copy.js b/proposals/static/proposals/js/copy.js
    deleted file mode 100644
    index cedf6f664..000000000
    --- a/proposals/static/proposals/js/copy.js
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -$(function () {
    -     $('#id_parent').change(function () {
    -         // Get the displayed value
    -         let chosen = $( "#id_parent option:selected" ).text();
    -         // Split on the ( and trim to remove the user part
    -         chosen = chosen.split('(')[0].trim();
    -         // Set it as the new title
    -         $('#id_title').val(chosen);
    -     })
    -});
    \ No newline at end of file
    diff --git a/proposals/templates/proposals/proposal_copy.html b/proposals/templates/proposals/proposal_copy.html
    index 5513bb8d9..deffbfe14 100644
    --- a/proposals/templates/proposals/proposal_copy.html
    +++ b/proposals/templates/proposals/proposal_copy.html
    @@ -14,12 +14,6 @@
         - {{ block.super }}
     {% endblock %}
     
    -{% block html_head %}
    -    {% if is_revision or is_amendment %}
    -        
    -    {% endif %}
    -{% endblock %}
    -
     {% block content %}
         
    From 779cb580bc22d29e709854fa09c40891cc020e7b Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 28 Nov 2023 15:04:29 +0100 Subject: [PATCH 100/148] fix #536. Link to revise on list page. --- locale/en/LC_MESSAGES/django.po | 210 +++++++++--------- proposals/api/serializers.py | 4 +- .../templates/proposals/proposal_list.html | 13 +- .../vue_templates/proposal_list.html | 14 +- 4 files changed, 123 insertions(+), 118 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 4f89bcc22..444d514aa 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-21 16:02+0100\n" +"POT-Creation-Date: 2023-11-28 14:55+0100\n" "PO-Revision-Date: 2023-11-07 10:36+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -186,7 +186,7 @@ msgstr "Intervention saved" #: main/forms/conditional_form.py:11 main/forms/conditional_form.py:20 #: main/forms/conditional_form.py:29 main/forms/conditional_form.py:38 #: main/forms/conditional_form.py:48 main/forms/mixins.py:83 -#: proposals/forms.py:570 proposals/forms.py:653 proposals/forms.py:668 +#: proposals/forms.py:544 proposals/forms.py:627 proposals/forms.py:642 #: studies/forms.py:104 tasks/forms.py:87 msgid "Dit veld is verplicht." msgstr "This field is required." @@ -294,7 +294,7 @@ msgstr "Phase" #: proposals/api/views.py:92 proposals/api/views.py:122 #: proposals/api/views.py:172 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:102 -#: proposals/templates/proposals/vue_templates/proposal_list.html:153 +#: proposals/templates/proposals/vue_templates/proposal_list.html:157 #: reviews/api/views.py:49 reviews/api/views.py:280 reviews/api/views.py:342 #: reviews/templates/reviews/committee_members_workload.html:26 #: reviews/templates/reviews/vue_templates/decision_list.html:153 @@ -328,7 +328,7 @@ msgstr "Conclusion" msgid "Acties" msgstr "Actions" -#: main/templates/auth/user_detail.html:75 reviews/models.py:140 +#: main/templates/auth/user_detail.html:75 reviews/models.py:142 msgid ", met revisie" msgstr ", with revision" @@ -823,7 +823,7 @@ msgstr "Log out" #: main/templates/registration/logged_out.html:12 msgid "Je bent succesvol uitgelogd." -msgstr "" +msgstr "You have logged out succesfully" #: main/templates/registration/logged_out.html:17 #, python-format @@ -850,7 +850,7 @@ msgid "Wachtwoord" msgstr "Password" #: main/templatetags/compare_tags.py:80 -#: proposals/templates/proposals/vue_templates/proposal_list.html:49 +#: proposals/templates/proposals/vue_templates/proposal_list.html:51 #: reviews/templates/reviews/review_detail_sidebar.html:34 #: reviews/templates/reviews/simple_compare_link.html:8 #: reviews/templates/reviews/vue_templates/decision_list.html:53 @@ -1080,7 +1080,7 @@ msgstr "Date reviewed" #: proposals/api/views.py:96 proposals/api/views.py:134 #: proposals/api/views.py:155 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:71 -#: proposals/templates/proposals/vue_templates/proposal_list.html:108 +#: proposals/templates/proposals/vue_templates/proposal_list.html:112 msgid "Laatst bijgewerkt" msgstr "Last edited" @@ -1097,7 +1097,7 @@ msgstr "" "Are there any other researchers involved outside the above-" "mentioned institutes? " -#: proposals/forms.py:64 proposals/forms.py:280 proposals/validators.py:25 +#: proposals/forms.py:64 proposals/validators.py:25 msgid "Er bestaat al een aanvraag met deze titel." msgstr "There is an existing application with this title." @@ -1161,33 +1161,19 @@ msgstr "" msgid "Ik maak een oefenaanvraag aan" msgstr "I am creating a practice application" -#: proposals/forms.py:286 proposals/models.py:546 +#: proposals/forms.py:281 proposals/models.py:546 msgid "Te kopiëren aanvraag" msgstr "Application to be copied" -#: proposals/forms.py:288 proposals/models.py:548 +#: proposals/forms.py:283 proposals/models.py:548 msgid "Dit veld toont enkel aanvragen waar je zelf een medeuitvoerende bent." msgstr "This field shows only applications in which you are involved." -#: proposals/forms.py:328 proposals/forms.py:363 -msgid "Je kan de titel van je aanvraag nu, indien nodig, wijzigen." -msgstr "You can, if necessary, change the title of your application here." - -#: proposals/forms.py:330 proposals/forms.py:365 -msgid "" -"De titel die je hier opgeeft is zichtbaar voor de FETC-GW-leden en, wanneer " -"de aanvraag is goedgekeurd, ook voor alle medewerkers die in het archief van " -"deze portal kijken." -msgstr "" -"The title you submit here will be visible to the FEtC-H members and, if the " -"application is approved, also to employees viewing the archive of this " -"portal." - -#: proposals/forms.py:337 +#: proposals/forms.py:321 msgid "Te reviseren aanvraag" msgstr "Application to be revised" -#: proposals/forms.py:338 +#: proposals/forms.py:322 msgid "" "Dit veld toont enkel ingediende, (nog) niet goedgekeurde aanvragen waar jij " "een medeuitvoerende bent." @@ -1195,70 +1181,70 @@ msgstr "" "This field only shows submitted applications that have not been approved " "(yet) in which you are involved." -#: proposals/forms.py:372 +#: proposals/forms.py:346 msgid "Te amenderen aanvraag" msgstr "Application to be amended" -#: proposals/forms.py:373 +#: proposals/forms.py:347 msgid "" "Dit veld toont enkel goedgekeurde aanvragen waar je zelf een medeuitvoerende " "bent." msgstr "This field shows only approved applications in which you are involved." -#: proposals/forms.py:428 proposals/forms.py:558 proposals/forms.py:587 -#: proposals/forms.py:701 +#: proposals/forms.py:402 proposals/forms.py:532 proposals/forms.py:561 +#: proposals/forms.py:675 msgid "Dit veld is verplicht om verder te gaan." msgstr "This field is required to continue." -#: proposals/forms.py:436 +#: proposals/forms.py:410 msgid "Je dient een instelling op te geven." msgstr "You are required to specify an institution." -#: proposals/forms.py:494 +#: proposals/forms.py:468 msgid "In dit geval is een beslissing van een METC vereist" msgstr "In this case, a decision by a METC is required" -#: proposals/forms.py:502 +#: proposals/forms.py:476 msgid "Naam traject 1" msgstr "Title of trajectory 1" -#: proposals/forms.py:504 +#: proposals/forms.py:478 msgid "Naam traject 2" msgstr "Title of trajectory 2" -#: proposals/forms.py:506 +#: proposals/forms.py:480 msgid "Naam traject 3" msgstr "Title of trajectory 3" -#: proposals/forms.py:508 +#: proposals/forms.py:482 msgid "Naam traject 4" msgstr "Title of trajectory 4" -#: proposals/forms.py:510 +#: proposals/forms.py:484 msgid "Naam traject 5" msgstr "Title of trajectory 5" -#: proposals/forms.py:512 +#: proposals/forms.py:486 msgid "Naam traject 6" msgstr "Title of trajectory 6" -#: proposals/forms.py:514 +#: proposals/forms.py:488 msgid "Naam traject 7" msgstr "Title of trajectory 7" -#: proposals/forms.py:516 +#: proposals/forms.py:490 msgid "Naam traject 8" msgstr "Title of trajectory 8" -#: proposals/forms.py:518 +#: proposals/forms.py:492 msgid "Naam traject 9" msgstr "Title of trajectory 9" -#: proposals/forms.py:520 +#: proposals/forms.py:494 msgid "Naam traject 10" msgstr "Title of trajectory 10" -#: proposals/forms.py:564 +#: proposals/forms.py:538 msgid "" "Als niet dezelfde trajecten worden doorlopen, moeten er minstens twee " "verschillende trajecten zijn." @@ -1266,19 +1252,19 @@ msgstr "" "If different trajectories are used, at least two different trajectories " "should be filled in." -#: proposals/forms.py:598 +#: proposals/forms.py:572 msgid "Nieuwe beoogde startdatum" msgstr "New intended start date" -#: proposals/forms.py:660 +#: proposals/forms.py:634 msgid "Toestemmingsverklaring voor traject {} nog niet toegevoegd." msgstr "Declaration of consent for trajectory {} not yet added." -#: proposals/forms.py:664 +#: proposals/forms.py:638 msgid "Informatiebrief voor traject {} nog niet toegevoegd." msgstr "Information letter for trajectory {} not yet added." -#: proposals/forms.py:676 +#: proposals/forms.py:650 msgid "" "De embargo-periode kan maximaal 2 jaar zijn. Kies een datum binnen 2 jaar " "van vandaag." @@ -1286,7 +1272,7 @@ msgstr "" "The embargo-period can last a maximum of 2 years. Pick a date within 2 years " "from today." -#: proposals/forms.py:707 +#: proposals/forms.py:681 msgid "Vul in in welke talen de formulieren worden vertaald." msgstr "Please fill in the languages" @@ -1635,7 +1621,7 @@ msgstr "" "proposals." #: proposals/models.py:430 proposals/utils/pdf_diff_logic.py:990 -#: reviews/models.py:189 +#: reviews/models.py:191 msgid "Ruimte voor eventuele opmerkingen" msgstr "Space for possible comments" @@ -1701,7 +1687,7 @@ msgstr "" #: proposals/models.py:525 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 -#: proposals/templates/proposals/vue_templates/proposal_list.html:166 +#: proposals/templates/proposals/vue_templates/proposal_list.html:170 msgid "Promotor/Begeleider" msgstr "Promotor/Supervisor" @@ -1914,14 +1900,14 @@ msgid "Weet je zeker dat je de aanvraag %(title)s wilt verwijderen?" msgstr "Are you sure you want to delete the application %(title)s?" #: proposals/templates/proposals/proposal_confirm_delete.html:19 -#: proposals/templates/proposals/vue_templates/proposal_list.html:64 +#: proposals/templates/proposals/vue_templates/proposal_list.html:66 #: tasks/templates/tasks/session_confirm_delete.html:18 #: tasks/templates/tasks/task_confirm_delete.html:17 msgid "Verwijderen" msgstr "Delete" #: proposals/templates/proposals/proposal_confirm_delete.html:21 -#: proposals/templates/proposals/proposal_copy.html:99 +#: proposals/templates/proposals/proposal_copy.html:93 #: tasks/templates/tasks/session_confirm_delete.html:19 #: tasks/templates/tasks/task_confirm_delete.html:18 msgid "Annuleren" @@ -1941,21 +1927,21 @@ msgstr "" " " #: proposals/templates/proposals/proposal_copy.html:8 -#: proposals/templates/proposals/proposal_copy.html:28 +#: proposals/templates/proposals/proposal_copy.html:22 msgid "Revisie starten" msgstr "Start a revision" #: proposals/templates/proposals/proposal_copy.html:10 -#: proposals/templates/proposals/proposal_copy.html:30 +#: proposals/templates/proposals/proposal_copy.html:24 msgid "Amendement aanmaken" msgstr "Create an amendment" #: proposals/templates/proposals/proposal_copy.html:12 -#: proposals/templates/proposals/proposal_copy.html:32 +#: proposals/templates/proposals/proposal_copy.html:26 msgid "Een geheel nieuwe aanvraag indienen op basis van een oude studie" msgstr "Submit an entirely new application from a copy of an old application" -#: proposals/templates/proposals/proposal_copy.html:37 +#: proposals/templates/proposals/proposal_copy.html:31 msgid "" "Je kan hier op basis van de vorige versie van een aanvraag een revisie " "starten. Alleen studies die door de commissie als 'revisie noodzakelijk' " @@ -1965,7 +1951,7 @@ msgstr "" "application. Only applications that have been marked as 'revision necessary' " "by the committee can be selected here. " -#: proposals/templates/proposals/proposal_copy.html:43 +#: proposals/templates/proposals/proposal_copy.html:37 msgid "" "Als je supervisor je heeft gevraagd revisies te maken, dien je je huidige " "versie aan te passen. (Als je dat niet kan, vraag dan aan je supervisor of " @@ -1975,7 +1961,7 @@ msgstr "" "original application. (If you can't, ask your supervisor if they have " "correctly marked your study as 'revision necessary') " -#: proposals/templates/proposals/proposal_copy.html:50 +#: proposals/templates/proposals/proposal_copy.html:44 msgid "" "Let op! Er kan maar één revisie tegelijk bestaan. Mocht je jouw aanvraag " "hier niet zien als optie om te reviseren, bekijk dan of je aanvraag niet al " @@ -1985,7 +1971,7 @@ msgstr "" "application in the list of options on this page, please check if your " "application is not already in your list of draft applications." -#: proposals/templates/proposals/proposal_copy.html:58 +#: proposals/templates/proposals/proposal_copy.html:52 msgid "" "Je kan hier op basis van een reeds goedgekeurde aanvraag een amendement " "indienen. Je studie moet eerst goedgekeurd en afgehandeld zijn voordat die " @@ -1995,7 +1981,7 @@ msgstr "" "been approved. Your application must have been approved by the committee " "before it can be selected here. " -#: proposals/templates/proposals/proposal_copy.html:64 +#: proposals/templates/proposals/proposal_copy.html:58 msgid "" "Let op! Er kan maar één amendement tegelijk bestaan. Mocht je jouw aanvraag " "hier niet zien als optie om te reviseren, bekijk dan of je aanvraag niet al " @@ -2006,14 +1992,14 @@ msgstr "" "check if your application is not already in the your list of draft " "applications." -#: proposals/templates/proposals/proposal_copy.html:74 +#: proposals/templates/proposals/proposal_copy.html:68 msgid "" "Je kan hier een aanvraag kopiëren. Alle velden kunnen na het kopiëren " "aangepast worden." msgstr "" "Here you can copy an application. All fields can be edited after copying." -#: proposals/templates/proposals/proposal_copy.html:77 +#: proposals/templates/proposals/proposal_copy.html:71 msgid "" "Deze pagina is alleen bedoeld voor het geval je een geheel nieuwe aanvraag " "gaat doen op basis van een eerder uitgevoerde aanvraag. Aanvragen t.b.v. " @@ -2022,7 +2008,7 @@ msgstr "" "This page is only intended for creating an entirely new application based on " "a previous application. Applications for grant applications cannot be copied." -#: proposals/templates/proposals/proposal_copy.html:83 +#: proposals/templates/proposals/proposal_copy.html:77 #, python-format msgid "" "Als je gevraagd is om een revisie te maken van een eerder ingediende " @@ -2031,7 +2017,7 @@ msgstr "" "If you have been asked to revise a previously submitted application, you can " "do so here. " -#: proposals/templates/proposals/proposal_copy.html:89 +#: proposals/templates/proposals/proposal_copy.html:83 #, python-format msgid "" "Indien je wijzigingen hebt in een al goedgekeurde aanvraag die daarom " @@ -2042,7 +2028,7 @@ msgstr "" "to be re-reviewed, please make an amendment here." -#: proposals/templates/proposals/proposal_copy.html:101 +#: proposals/templates/proposals/proposal_copy.html:95 msgid "Kopiëren" msgstr "Copy" @@ -2279,13 +2265,13 @@ msgstr "" "different committee. If this is not the case, you are required to fill in " "the full form." -#: proposals/templates/proposals/proposal_list.html:43 +#: proposals/templates/proposals/proposal_list.html:45 #: proposals/templates/proposals/proposal_private_archive.html:43 #: reviews/templates/reviews/action_explaination.html:19 msgid "Uitleg" msgstr "Explanation" -#: proposals/templates/proposals/proposal_list.html:47 +#: proposals/templates/proposals/proposal_list.html:49 #: proposals/templates/proposals/proposal_private_archive.html:47 #, python-format msgid "" @@ -2295,7 +2281,7 @@ msgstr "" "Click to move on to the " "next step in the progress." -#: proposals/templates/proposals/proposal_list.html:54 +#: proposals/templates/proposals/proposal_list.html:56 #: proposals/templates/proposals/proposal_private_archive.html:54 #, python-format msgid "" @@ -2307,7 +2293,7 @@ msgstr "" "differences between a previous version (only available for revisions/" "amendments)." -#: proposals/templates/proposals/proposal_list.html:61 +#: proposals/templates/proposals/proposal_list.html:63 #: proposals/templates/proposals/proposal_private_archive.html:61 #, python-format msgid "" @@ -2317,7 +2303,7 @@ msgstr "" "Click to delete your " "application." -#: proposals/templates/proposals/proposal_list.html:68 +#: proposals/templates/proposals/proposal_list.html:70 #: proposals/templates/proposals/proposal_private_archive.html:68 #, python-format msgid "" @@ -2328,6 +2314,14 @@ msgstr "" "application." #: proposals/templates/proposals/proposal_list.html:75 +msgid "" +"Klik op om een revisie " +"aan te maken van je aanvraag." +msgstr "" +"Click to create a revision " +"for an application." + +#: proposals/templates/proposals/proposal_list.html:82 #: proposals/templates/proposals/proposal_private_archive.html:75 #, python-format msgid "" @@ -2337,7 +2331,7 @@ msgstr "" "Click to make your decision " "(as a supervisor)." -#: proposals/templates/proposals/proposal_list.html:82 +#: proposals/templates/proposals/proposal_list.html:89 #: proposals/templates/proposals/proposal_private_archive.html:82 #, python-format msgid "" @@ -2347,7 +2341,7 @@ msgstr "" "Click to hide a submitted " "application from the archive." -#: proposals/templates/proposals/proposal_list.html:88 +#: proposals/templates/proposals/proposal_list.html:95 #: proposals/templates/proposals/proposal_private_archive.html:88 #: reviews/templates/reviews/action_explaination.html:56 #, python-format @@ -3012,60 +3006,60 @@ msgstr "" "can be done after approval, or during a minimal revision." #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:43 -#: proposals/templates/proposals/vue_templates/proposal_list.html:73 +#: proposals/templates/proposals/vue_templates/proposal_list.html:75 msgid "Inzien" msgstr "Show" #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:50 -#: proposals/templates/proposals/vue_templates/proposal_list.html:87 +#: proposals/templates/proposals/vue_templates/proposal_list.html:91 msgid "Soort aanvraag" msgstr "Type of application" #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:57 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:65 -#: proposals/templates/proposals/vue_templates/proposal_list.html:94 -#: proposals/templates/proposals/vue_templates/proposal_list.html:102 +#: proposals/templates/proposals/vue_templates/proposal_list.html:98 +#: proposals/templates/proposals/vue_templates/proposal_list.html:106 msgid "Besloten op" msgstr "Concluded on" #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:78 -#: proposals/templates/proposals/vue_templates/proposal_list.html:115 +#: proposals/templates/proposals/vue_templates/proposal_list.html:119 msgid "Status" msgstr "State" #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:110 -#: proposals/templates/proposals/vue_templates/proposal_list.html:161 +#: proposals/templates/proposals/vue_templates/proposal_list.html:165 msgid "Nog niet ingediend" msgstr "Not yet submitted" #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:129 -#: proposals/templates/proposals/vue_templates/proposal_list.html:180 +#: proposals/templates/proposals/vue_templates/proposal_list.html:184 msgid "Route:" msgstr "Route:" #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:136 -#: proposals/templates/proposals/vue_templates/proposal_list.html:187 +#: proposals/templates/proposals/vue_templates/proposal_list.html:191 #: reviews/templates/reviews/vue_templates/decision_list.html:185 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:128 #: reviews/templates/reviews/vue_templates/review_list.html:190 msgid "Indieners" msgstr "Applicants" -#: proposals/templates/proposals/vue_templates/proposal_list.html:41 +#: proposals/templates/proposals/vue_templates/proposal_list.html:43 #: reviews/templates/reviews/vue_templates/decision_list.html:68 #: reviews/templates/reviews/vue_templates/decision_list.html:71 msgid "Beslissen" msgstr "Decide" -#: proposals/templates/proposals/vue_templates/proposal_list.html:60 +#: proposals/templates/proposals/vue_templates/proposal_list.html:62 msgid "Naar volgende stap" msgstr "To next step" -#: proposals/templates/proposals/vue_templates/proposal_list.html:80 -msgid "Verberg" -msgstr "Hide" +#: proposals/templates/proposals/vue_templates/proposal_list.html:85 +msgid "Maak revisie" +msgstr "Create revision" -#: proposals/templates/proposals/vue_templates/proposal_list.html:139 +#: proposals/templates/proposals/vue_templates/proposal_list.html:143 #: reviews/templates/reviews/vue_templates/decision_list.html:141 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:83 #: reviews/templates/reviews/vue_templates/review_list.html:145 @@ -3118,7 +3112,7 @@ msgstr "" "This section was present in the original application, but was removed for " "the revision." -#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:131 +#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:133 msgid "Onbekend" msgstr "Unknown" @@ -3355,11 +3349,11 @@ msgstr "Route" msgid "Start datum" msgstr "Start date review" -#: reviews/forms.py:14 reviews/models.py:147 +#: reviews/forms.py:14 reviews/models.py:149 msgid "korte (2-weken) route" msgstr "short (2-week) route" -#: reviews/forms.py:15 reviews/models.py:146 +#: reviews/forms.py:15 reviews/models.py:148 msgid "lange (4-weken) route" msgstr "long (4-week) route" @@ -3491,24 +3485,24 @@ msgstr "Post hoc negative advice by FETC-H" msgid "Niet verder in behandeling genomen" msgstr "Not to be assessed further" -#: reviews/models.py:51 reviews/models.py:183 +#: reviews/models.py:51 reviews/models.py:185 #: reviews/templates/reviews/review_table.html:9 msgid "Beslissing" msgstr "Decision" -#: reviews/models.py:148 +#: reviews/models.py:150 msgid "nog geen route" msgstr "no route assigned" -#: reviews/models.py:177 +#: reviews/models.py:179 msgid "goedgekeurd" msgstr "endorsed" -#: reviews/models.py:178 +#: reviews/models.py:180 msgid "niet goedgekeurd" msgstr "not endorsed" -#: reviews/models.py:179 +#: reviews/models.py:181 msgid "revisie noodzakelijk" msgstr "revision necessary" @@ -4234,31 +4228,31 @@ msgstr "FEtC-H {}: new application submitted" msgid "FETC-GW {}: nieuwe beoordeling toegevoegd" msgstr "FEtC-H {}: new decision added" -#: reviews/utils/review_utils.py:325 +#: reviews/utils/review_utils.py:352 msgid "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld" msgstr "FEtC-H {}: a supervisor has reviewed your application" -#: reviews/utils/review_utils.py:351 +#: reviews/utils/review_utils.py:378 msgid "De aanvraag bevat het gebruik van wilsonbekwame volwassenen." msgstr "" "The application contains the participation of adults incapable of informed " "consent." -#: reviews/utils/review_utils.py:354 +#: reviews/utils/review_utils.py:381 msgid "De aanvraag bevat het gebruik van misleiding." msgstr "The application contains the use of misrepresentation." -#: reviews/utils/review_utils.py:357 +#: reviews/utils/review_utils.py:384 msgid "" "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" msgstr "" "A hierarchal relationship between researcher(s) and participant(s) exists." -#: reviews/utils/review_utils.py:360 +#: reviews/utils/review_utils.py:387 msgid "Het onderzoek verzamelt bijzondere persoonsgegevens." msgstr "This study collects special or sensitive personal details." -#: reviews/utils/review_utils.py:363 +#: reviews/utils/review_utils.py:390 msgid "" "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht " "verhoogde kwetsbaarheid met zich meebrengen." @@ -4266,7 +4260,7 @@ msgstr "" "The study selects participants based on particular characteristics which " "might entail increased vulnerability." -#: reviews/utils/review_utils.py:369 +#: reviews/utils/review_utils.py:396 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op " "onderdelen of als geheel zodanig belastend is dat deze ondanks de verkregen " @@ -4276,7 +4270,7 @@ msgstr "" "study, in part or in its entirety, is so burdensome that despite acquiring " "informed consent it might raise questions." -#: reviews/utils/review_utils.py:373 +#: reviews/utils/review_utils.py:400 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op " "psychische of fysieke schade bij deelname aan het onderzoek meer dan " @@ -4286,7 +4280,7 @@ msgstr "" "psychological or physical harm in participating in the study are more than " "minimal." -#: reviews/utils/review_utils.py:380 +#: reviews/utils/review_utils.py:407 #, python-brace-format msgid "" "De totale duur van de taken in sessie {s}, exclusief pauzes en andere niet-" @@ -4297,14 +4291,14 @@ msgstr "" "non-task elements ({d} minutes) is greater than the task duration limit " "({max_d} minutes) for the age group {ag}." -#: reviews/utils/review_utils.py:397 +#: reviews/utils/review_utils.py:424 #, python-brace-format msgid "Het onderzoek observeert deelnemers in de volgende setting: {s}" msgstr "" "The application contains sessions with participants in the following " "setting: {s}" -#: reviews/utils/review_utils.py:401 +#: reviews/utils/review_utils.py:428 msgid "" "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met " "informed consent achteraf." @@ -4312,7 +4306,7 @@ msgstr "" "The study observes participants in a non-public space and works with " "retrospective informed consent." -#: reviews/utils/review_utils.py:403 +#: reviews/utils/review_utils.py:430 msgid "" "De onderzoeker begeeft zich \"under cover\" in een beheerde niet-publieke " "ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie " @@ -4322,11 +4316,11 @@ msgstr "" "(e.g. a digital discussion group), and takes part actively in the discussion " "and/or collects data which can be traced back to individuals." -#: reviews/utils/review_utils.py:408 +#: reviews/utils/review_utils.py:435 msgid "De aanvraag bevat het gebruik van {}" msgstr "The application makes use of {}" -#: reviews/utils/review_utils.py:429 +#: reviews/utils/review_utils.py:456 msgid "" "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." msgstr "" diff --git a/proposals/api/serializers.py b/proposals/api/serializers.py index 2ddb94171..d1706f221 100644 --- a/proposals/api/serializers.py +++ b/proposals/api/serializers.py @@ -66,9 +66,9 @@ class Meta: fields = ['pk', 'reference_number', 'title', 'is_revision', 'type', 'date_confirmed', 'date_submitted', 'date_submitted_supervisor', 'date_reviewed', 'date_modified', - 'parent', 'latest_review', 'supervisor_decision', + 'parent', 'children', 'latest_review', 'supervisor_decision', 'applicants', 'status', 'supervisor', 'continue_url', - 'pdf', 'in_archive'] + 'pdf', 'in_archive', 'is_pre_assessment', 'status_review'] parent = serializers.SerializerMethodField() diff --git a/proposals/templates/proposals/proposal_list.html b/proposals/templates/proposals/proposal_list.html index 2c540360c..03664fc49 100644 --- a/proposals/templates/proposals/proposal_list.html +++ b/proposals/templates/proposals/proposal_list.html @@ -37,6 +37,8 @@

    {{ title }}

    {% static "proposals/images/folder_delete.png" as img_hide %} {% static "proposals/images/folder_add.png" as img_add %} {% static 'reviews/images/scale.png' as img_decide %} + {% static 'proposals/images/pencil.png' as img_revise %} +

    {{ body }}

    @@ -62,11 +64,16 @@

    {% trans "Uitleg" %}

    Klik op om je aanvraag te verwijderen. {% endblocktrans %}
  • - {% endif %} - {% if submitted %} + {% endif %} + {% if submitted %} +
  • + {% blocktrans trimmed %} + Klik op om een ingediende aanvraag in te zien. + {% endblocktrans %} +
  • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag in te zien. + Klik op om een revisie aan te maken van je aanvraag. {% endblocktrans %}
  • {% endif %} diff --git a/proposals/templates/proposals/vue_templates/proposal_list.html b/proposals/templates/proposals/vue_templates/proposal_list.html index 53edb90be..a80c4f53d 100644 --- a/proposals/templates/proposals/vue_templates/proposal_list.html +++ b/proposals/templates/proposals/vue_templates/proposal_list.html @@ -7,6 +7,8 @@ {% static "main/images/page_white_acrobat.png" as img_pdf %} {% static "proposals/images/folder_delete.png" as img_hide %} {% static 'reviews/images/scale.png' as img_decide %} +{% static 'proposals/images/pencil.png' as img_revise %} + - - + + - -
    +

    {% trans "Voortgang" %}

      - {% for item in nav_items %} - {% if not item.is_title %} -
    • - {% if item.url %} - {{ item.title }} - {% else %} - {{ item.title }} - {% endif %} -
    • -
    • - {% for child in item.children %} -
    • - {% if child.url %} - {{ child.title }} - {% else %} - {{ child.title }} - {% endif %} -
    • -
    • - {% for subchild in child.children %} + {% for item in nav_items %} + {% if not item.is_title %}
    • - {% if subchild.url %} - {{ subchild.title }} + {% if item.url %} + {{ item.title }} {% else %} - {{ subchild.title }} + {{ item.title }} {% endif %}
    • -
    • - {% endfor %} +
    • +
      +
    • + {% for child in item.children %} +
    • + {% if child.url %} + {{ child.title }} + {% else %} + {{ child.title }} + {% endif %} +
    • +
    • +
      +
    • + {% for subchild in child.children %} +
    • + {% if subchild.url %} + {{ subchild.title }} + {% else %} + {{ subchild.title }} + {% endif %} +
    • +
    • +
      +
    • + {% endfor %} + {% endfor %} + {% else %} +
    + {{ item.title }} +
      + {% endif %} {% endfor %} - {% else %} -
    - {{ item.title }} -
      - {% endif %} - {% endfor %}
    diff --git a/main/templates/base/site_header.html b/main/templates/base/site_header.html index ece9f41a6..aac33d38d 100644 --- a/main/templates/base/site_header.html +++ b/main/templates/base/site_header.html @@ -1,2 +1,3 @@ {% load i18n %} + {% trans "Portal FETC - Geesteswetenschappen" %} diff --git a/main/templates/base/site_html_head.html b/main/templates/base/site_html_head.html index 3fe174739..60501b7c9 100644 --- a/main/templates/base/site_html_head.html +++ b/main/templates/base/site_html_head.html @@ -1,6 +1,10 @@ {% load static %} - - - -{% include "base/form_styling.html" %} \ No newline at end of file + + + +{% include "base/form_styling.html" %} diff --git a/main/templates/base/site_title.html b/main/templates/base/site_title.html index 1cabe3998..53157f48e 100644 --- a/main/templates/base/site_title.html +++ b/main/templates/base/site_title.html @@ -1,2 +1,3 @@ {% load i18n %} -{% trans "FETC-GW" %} \ No newline at end of file + +{% trans "FETC-GW" %} diff --git a/main/templates/error/400.html b/main/templates/error/400.html index 411a66c16..8c24478a5 100644 --- a/main/templates/error/400.html +++ b/main/templates/error/400.html @@ -10,9 +10,9 @@

    {% trans 'Server error' %}

    - {% blocktrans trimmed %} - Er is een fout opgetreden tijdens het opvragen van deze pagina. - {% endblocktrans %} + {% blocktrans trimmed %} + Er is een fout opgetreden tijdens het opvragen van deze pagina. + {% endblocktrans %}

    {% blocktrans trimmed %} diff --git a/main/templates/error/403.html b/main/templates/error/403.html index 98556bca1..e680da6c4 100644 --- a/main/templates/error/403.html +++ b/main/templates/error/403.html @@ -5,23 +5,13 @@ {% block content %}

    -

    - {% trans 'Geen toegang' %} -

    -

    - {% trans 'Je hebt geen toegang tot de opgevraagde pagina.' %} -

    +

    {% trans 'Geen toegang' %}

    +

    {% trans 'Je hebt geen toegang tot de opgevraagde pagina.' %}

    {% if request.user.is_authenticated %} -

    - {% trans 'Dit kan meerdere oorzaken hebben:' %} -

    +

    {% trans 'Dit kan meerdere oorzaken hebben:' %}

      -
    • - {% trans 'Je hebt niet de benodigde rechten om deze pagina te bekijken;' %} -
    • -
    • - {% trans 'Je bent niet als mede-onderzoeker opgegeven voor deze aanvraag;' %} -
    • +
    • {% trans 'Je hebt niet de benodigde rechten om deze pagina te bekijken;' %}
    • +
    • {% trans 'Je bent niet als mede-onderzoeker opgegeven voor deze aanvraag;' %}
    • {% trans 'Je probeert een door jou eerder genomen beslissing aan te passen, maar de beoordelingsperiode is verstreken.' %}
    • @@ -30,7 +20,7 @@

      {% url 'login' as login_url %} {% blocktrans trimmed %} - Je bent niet ingelogd, probeer in te loggen. + Je bent niet ingelogd, probeer in te loggen. {% endblocktrans %}

      {% endif %} diff --git a/main/templates/error/403_csrf.html b/main/templates/error/403_csrf.html index a4188bb55..0afd99004 100644 --- a/main/templates/error/403_csrf.html +++ b/main/templates/error/403_csrf.html @@ -9,28 +9,16 @@ {% block content %}
      -

      - {% trans 'Verzoek kon niet geverifieerd worden' %} -

      -

      - {% trans 'Er is iets fout gegaan met het verifiëren van je browser.' %} -

      +

      {% trans 'Verzoek kon niet geverifieerd worden' %}

      +

      {% trans 'Er is iets fout gegaan met het verifiëren van je browser.' %}

      {% trans 'Dit kan meerdere oorzaken hebben, zoals het gebruik van een script- of ad-blocker, of je cookie-instellingen. Probeer eerst een volledige verversing van de pagina:' %}

        -
      • - {% trans 'Voor Chrome: ctrl + F5 (Windows) of cmd + shift + R (Mac)' %} -
      • -
      • - {% trans 'Voor Firefox: ctrl + shift + R (Windows) of cmd + shift + R (Mac)' %} -
      • -
      • - {% trans 'Voor Edge: ctrl + F5' %} -
      • -
      • - {% trans 'Voor Safari: option + cmnd + E' %} -
      • +
      • {% trans 'Voor Chrome: ctrl + F5 (Windows) of cmd + shift + R (Mac)' %}
      • +
      • {% trans 'Voor Firefox: ctrl + shift + R (Windows) of cmd + shift + R (Mac)' %}
      • +
      • {% trans 'Voor Edge: ctrl + F5' %}
      • +
      • {% trans 'Voor Safari: option + cmnd + E' %}

      {% blocktrans trimmed %} diff --git a/main/templates/error/404.html b/main/templates/error/404.html index 907a31191..58af97167 100644 --- a/main/templates/error/404.html +++ b/main/templates/error/404.html @@ -5,12 +5,8 @@ {% block content %}

      -

      - {% trans 'Pagina niet gevonden' %} -

      -

      - {% trans 'Sorry, deze pagina is helaas niet (meer) beschikbaar.' %} -

      +

      {% trans 'Pagina niet gevonden' %}

      +

      {% trans 'Sorry, deze pagina is helaas niet (meer) beschikbaar.' %}

      {% blocktrans trimmed %} Mogelijk ben je hier terechtgekomen via een verouderde of foutieve link. Graag vernemen wij welke diff --git a/main/templates/error/500.html b/main/templates/error/500.html index da7446a24..c28084678 100644 --- a/main/templates/error/500.html +++ b/main/templates/error/500.html @@ -5,9 +5,7 @@ {% block content %}

      -

      - {% trans 'Server error' %} -

      +

      {% trans 'Server error' %}

      {% blocktrans trimmed %} Er is een fout opgetreden tijdens het opvragen van deze pagina. diff --git a/main/templates/main/index.html b/main/templates/main/index.html index 7744adbeb..10f923f63 100644 --- a/main/templates/main/index.html +++ b/main/templates/main/index.html @@ -18,7 +18,6 @@ {% blocktrans trimmed %} Deze portal is bedoeld voor medewerkers (en studenten) van de Faculteit Geesteswetenschappen. {% endblocktrans %} - {% if user.faculties.all %} {# Filters do not like blocktrans, so that value is just outside... #} {% blocktrans trimmed %} @@ -30,7 +29,6 @@ Volgens onze gegevens werk/studeer je bij een andere faculteit of dienst. {% endblocktrans %} {% endif %} - {% blocktrans trimmed %} Controleer of je inderdaad een aanvraag wilt indienen bij de Facultaire Ethische Toetsingscommissie van Geesteswetenschappen. {% endblocktrans %} @@ -52,44 +50,34 @@ {% endautoescape %}

      {% endfor %} -

      - {% trans "Startpagina" %} - {{ user.get_full_name }} -

      +

      {% trans "Startpagina" %} - {{ user.get_full_name }}

      -

      {% blocktrans trimmed %} - - Formele goedkeuring door één van beide kamers van de FETC-GW (middels een formele goedkeuringsbrief) is vereist voor mensgebonden onderzoek binnen de Faculteit Geesteswetenschappen. Voorafgaand aan het onderzoek, maar ook voorafgaand aan het rekruteren van deelnemers, moet de aanvraag zijn goedgekeurd. Het is dus van belang om te wachten met de aanvang van het onderzoek tot deze brief ontvangen is. - {% endblocktrans %} -

      +

      +

      {% blocktrans trimmed %} - - - NB: Goedgekeurde aanvragen komen in het archief van deze portal te staan, zie het menu hierboven. Dit archief is toegankelijk voor iedereen met een Solis-ID die bij de Faculteit Geesteswetenschappen werkt of studeert. - {% endblocktrans %} -

      +

      +

      {% blocktrans trimmed %} - Heb je een vraag over de werking van de portal, ontdek je een foutje, missende functionaliteit, of verkeerde vertaling? Neem dan contact op met portalsupport.gw@uu.nl. {% endblocktrans %} -

      -

      {% blocktrans trimmed %} In deze portal kan je het volgende doen: {% endblocktrans %}

      -
      +
      -
      - {% trans "Dien een nieuwe aanvraag in" %} -
      +
      {% trans "Dien een nieuwe aanvraag in" %}
      {# {% trans '(check de meest recente voorbeelddocumenten op intranet)' %}#}
      • @@ -140,9 +135,7 @@
      -
      - {% trans "Een aanvraag reviseren" %} -
      +
      {% trans "Een aanvraag reviseren" %}
      {# {% trans '(check de meest recente voorbeelddocumenten op intranet)' %}#}
      • @@ -156,9 +149,7 @@
      -
      - {% trans "Bekijk" %} -
      +
      {% trans "Bekijk" %}
      -
      - {% trans 'FETC-GW archief' %} -
      +
      {% trans 'FETC-GW archief' %}
      - - -
      - - -

      {% trans "Bannerfoto door Kim O'leary" %}

      - +
      + +
      +

      {% trans "Bannerfoto door Kim O'leary" %}

      +
      {% endblock %} diff --git a/main/templates/main/landing.html b/main/templates/main/landing.html index 1a5420bf7..3a61585ee 100644 --- a/main/templates/main/landing.html +++ b/main/templates/main/landing.html @@ -30,9 +30,7 @@ {# Very ugly imitation of uu-hero #}
      -

      - {% trans "Startpagina" %} -

      +

      {% trans "Startpagina" %}

      @@ -61,13 +59,15 @@

      {% trans 'Contact' %}

      - {% trans 'Secretaris FETC-GW' %}
      + {% trans 'Secretaris FETC-GW' %} +

      - {% trans 'Technische ondersteuning' %}
      + {% trans 'Technische ondersteuning' %} +
      @@ -82,15 +82,19 @@

      {% trans "Inloggen" %}

      {% endblocktrans %}

      {% if show_saml %} - - {% trans 'Log in met je Solis-ID' %}{% if login_descriptors %} (SAML){% endif %} + + {% trans 'Log in met je Solis-ID' %} + {% if login_descriptors %}(SAML){% endif %} {% endif %} {# Unnecessary layout hack #} {% if show_saml and show_django %}
      {% endif %} {% if show_django %} - - {% trans 'Log in met je Solis-ID' %}{% if login_descriptors %} (Non-SAML){% endif %} + + {% trans 'Log in met je Solis-ID' %} + {% if login_descriptors %}(Non-SAML){% endif %} {% endif %}
      diff --git a/main/templates/main/setting_checks.html b/main/templates/main/setting_checks.html index 2527c0bfc..6035230a7 100644 --- a/main/templates/main/setting_checks.html +++ b/main/templates/main/setting_checks.html @@ -12,4 +12,4 @@ } }); }); - \ No newline at end of file + diff --git a/main/templates/registration/logged_out.html b/main/templates/registration/logged_out.html index 724347283..f67b94eca 100644 --- a/main/templates/registration/logged_out.html +++ b/main/templates/registration/logged_out.html @@ -5,22 +5,18 @@ {% block content %}
      -

      - {% trans "Uitloggen" %} -

      -

      - {% trans "Je bent succesvol uitgelogd." %} -

      +

      {% trans "Uitloggen" %}

      +

      {% trans "Je bent succesvol uitgelogd." %}

      • {% url 'main:landing' as landing_url %} {% blocktrans trimmed %} - Klik hier om naar de startpagina te gaan. + Klik hier om naar de startpagina te gaan. {% endblocktrans %}
      • {% blocktrans trimmed %} - Klik hier om terug te keren naar de FETC-GW-website. + Klik hier om terug te keren naar de FETC-GW-website. {% endblocktrans %}
      diff --git a/main/templates/registration/login.html b/main/templates/registration/login.html index 6fe005bcb..846aa2fb0 100644 --- a/main/templates/registration/login.html +++ b/main/templates/registration/login.html @@ -11,24 +11,29 @@ {# Very ugly imitation of uu-hero #}
      -

      - {% trans "Inloggen" %} -

      +

      {% trans "Inloggen" %}

      {% if form.errors %} -

      - {% trans "Gebruikersnaam of wachtwoord incorrect. Probeer het alstublieft opnieuw." %} -

      +

      {% trans "Gebruikersnaam of wachtwoord incorrect. Probeer het alstublieft opnieuw." %}

      {% endif %} -

      - {% trans "Je kan hier inloggen met je Solis-ID en wachtwoord." %} -

      -
      {% csrf_token %} -
      -
      +

      {% trans "Je kan hier inloggen met je Solis-ID en wachtwoord." %}

      + + {% csrf_token %} + +
      + +
      diff --git a/observations/templates/observations/observation_form.html b/observations/templates/observations/observation_form.html index fc5738207..61eb3fa57 100644 --- a/observations/templates/observations/observation_form.html +++ b/observations/templates/observations/observation_form.html @@ -7,7 +7,6 @@ {% trans "Het observatieonderzoek" %} - {{ block.super }} {% endblock %} - {% block html_head %} -{% include "main/setting_checks.html" %} + + {% include "main/setting_checks.html" %} {% endblock %} {% block content %} @@ -40,14 +39,15 @@ {% with nav_items=study.proposal.available_urls active=3 %} {% include 'base/navigation.html' %} {% endwith %} -

      - {% trans "Het observatieonderzoek" %} -

      +

      {% trans "Het observatieonderzoek" %}

      {% include "studies/study_title.html" %} -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      {% with proposal=observation.study.proposal %} - {% include "base/form_buttons.html" %} + {% include "base/form_buttons.html" %} {% endwith %}
      diff --git a/observations/templates/observations/observation_update_attachments.html b/observations/templates/observations/observation_update_attachments.html index 543375f44..d01e80e15 100644 --- a/observations/templates/observations/observation_update_attachments.html +++ b/observations/templates/observations/observation_update_attachments.html @@ -8,7 +8,7 @@ {% endblock %} {% block html_head %} - + {% endblock %} {% block content %}
      -

      - {% trans "Formulieren aanpassen" %} -

      +

      {% trans "Formulieren aanpassen" %}

      {% blocktrans trimmed with title=study.proposal.title ref_number=study.proposal.reference_number order=study.order %} - Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag {{ title }} - (referentienummer {{ ref_number }}), traject {{ order }}. + Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag {{ title }} + (referentienummer {{ ref_number }}), traject {{ order }}. {% endblocktrans %}

      -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      - - {% trans "Terug naar de vorige pagina" %} + + {% trans "Terug naar de vorige pagina" %}
      diff --git a/proposals/templates/easy_pdf/base.html b/proposals/templates/easy_pdf/base.html index d888592f0..669599076 100644 --- a/proposals/templates/easy_pdf/base.html +++ b/proposals/templates/easy_pdf/base.html @@ -1,59 +1,64 @@ - - {{ title|default:"" }} - - {% block style_base %} - {% comment %} + + {{ title|default:"" }} + {% block style_base %} + {% comment %} See DEFAULT_CSS in https://github.com/chrisglass/xhtml2pdf/blob/master/xhtml2pdf/default.py for base style. - {% endcomment %} - - {% block layout_style %} - - {%endblock%} - {% block extra_style %}{% endblock %} - {% endblock %} - - -
      - {%block page_header%} - {%endblock%} - - {%block content%} - {%endblock%} -
      - - + + diff --git a/proposals/templates/proposals/compare_documents.html b/proposals/templates/proposals/compare_documents.html index 058749a64..146114de3 100644 --- a/proposals/templates/proposals/compare_documents.html +++ b/proposals/templates/proposals/compare_documents.html @@ -1,7 +1,7 @@ {% extends 'base/base.html' %} + {% load static %} {% load i18n %} - {% load describe_documents %} {% block header_title %} @@ -48,17 +48,17 @@

      {% trans 'Vergelijk documenten' %}

      - {% blocktrans %} - Hier kan je twee versies van een document vergelijken. Standaard - geeft hij een gecombineerde versie weer, waarbij tekst - die verwijderd is in het rood is gemarkeerd en nieuwe tekst - in het groen is gemarkeerd. + {% blocktrans trimmed %} + Hier kan je twee versies van een document vergelijken. Standaard + geeft hij een gecombineerde versie weer, waarbij tekst + die verwijderd is in het rood is gemarkeerd en nieuwe tekst + in het groen is gemarkeerd. {% endblocktrans %}

      - {% blocktrans %} - Je kan ook de bestanden naast elkaar bekijken, met dezelfde - markeringen. Klik hiervoor op 'Bekijk apart'. + {% blocktrans trimmed %} + Je kan ook de bestanden naast elkaar bekijken, met dezelfde + markeringen. Klik hiervoor op 'Bekijk apart'. {% endblocktrans %}

      @@ -68,40 +68,30 @@

      - - + +

      -
      -
      -

      - {% trans "Oud" %}: - {{ old_name }} -

      -
      -
      -

      - {% trans "Nieuw" %}: - {{ new_name }} -

      -
      +
      +
      +

      + {% trans "Oud" %}: + {{ old_name }} +

      +
      +
      +

      + {% trans "Nieuw" %}: + {{ new_name }} +

      +
      - -
      - - -
      - +
      + + +
      {% endblock %} diff --git a/proposals/templates/proposals/proposal_confirm_delete.html b/proposals/templates/proposals/proposal_confirm_delete.html index a5b86a9cb..43b9246ae 100644 --- a/proposals/templates/proposals/proposal_confirm_delete.html +++ b/proposals/templates/proposals/proposal_confirm_delete.html @@ -15,11 +15,12 @@

      {% trans "Aanvraag verwijderen" %}

      Weet je zeker dat je de aanvraag {{ title }} wilt verwijderen? {% endblocktrans %}

      -
      {% csrf_token %} - - {% trans "Annuleren" %} + + {% csrf_token %} + + {% trans "Annuleren" %}
      -
      x +
      + x {% endblock %} diff --git a/proposals/templates/proposals/proposal_confirmation.html b/proposals/templates/proposals/proposal_confirmation.html index 574c4a7da..915614cd8 100644 --- a/proposals/templates/proposals/proposal_confirmation.html +++ b/proposals/templates/proposals/proposal_confirmation.html @@ -24,16 +24,19 @@

      {% trans "Bevestigingsbrief versturen" %}

      - {% blocktrans with title=review.proposal.title %} + {% blocktrans trimmed with title=review.proposal.title %} Geef hieronder aan wanneer de bevestigingsbrief voor de aanvraag {{ title }} is verstuurd. {% endblocktrans %}

      -
      {% csrf_token %} - {{ form.as_table }}
      - - {% trans "Terug naar de vorige pagina" %} + + {% csrf_token %} + + {{ form.as_table }} +
      + + {% trans "Terug naar de vorige pagina" %}
      diff --git a/proposals/templates/proposals/proposal_copy.html b/proposals/templates/proposals/proposal_copy.html index deffbfe14..f4c92e10d 100644 --- a/proposals/templates/proposals/proposal_copy.html +++ b/proposals/templates/proposals/proposal_copy.html @@ -43,7 +43,7 @@

      {% blocktrans trimmed %} Let op! Er kan maar één revisie tegelijk bestaan. Mocht je jouw aanvraag hier niet zien - als optie om te reviseren, bekijk dan of je aanvraag niet al tussen je concept aanvragen + als optie om te reviseren, bekijk dan of je aanvraag niet al tussen je concept aanvragen staat. {% endblocktrans %}

      @@ -57,16 +57,14 @@

      {% blocktrans trimmed %} Let op! Er kan maar één amendement tegelijk bestaan. Mocht je jouw aanvraag hier niet zien - als optie om te reviseren, bekijk dan of je aanvraag niet al tussen je concept aanvragen + als optie om te reviseren, bekijk dan of je aanvraag niet al tussen je concept aanvragen staat. {% endblocktrans %}

      {% else %} {% url 'proposals:copy_revision' as revision_url %} {% url 'proposals:copy_amendment' as amendment_url %} -

      - {% trans "Je kan hier een aanvraag kopiëren. Alle velden kunnen na het kopiëren aangepast worden." %} -

      +

      {% trans "Je kan hier een aanvraag kopiëren. Alle velden kunnen na het kopiëren aangepast worden." %}

      {% blocktrans trimmed %} Deze pagina is alleen bedoeld voor het geval je een geheel nieuwe aanvraag gaat doen op basis van @@ -86,17 +84,16 @@

      {% endblocktrans %}

      {% endif %} -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      -

      - {% endblock %} diff --git a/proposals/templates/proposals/proposal_data_management.html b/proposals/templates/proposals/proposal_data_management.html index 65de386ca..0dde106bd 100644 --- a/proposals/templates/proposals/proposal_data_management.html +++ b/proposals/templates/proposals/proposal_data_management.html @@ -13,91 +13,95 @@ {% with nav_items=proposal.available_urls active=5 %} {% include 'base/navigation.html' %} {% endwith %} -

      - {% trans "Datamanagement en Privacy" %} -

      +

      {% trans "Datamanagement en Privacy" %}

      {% blocktrans trimmed %} - De Universiteit Utrecht streeft naar integriteit, duurzaamheid, en transparantie in de omgang met onderzoeksdata, waaronder persoonsgegevens. Sinds de introductie van de AVG zijn er duidelijke regels die onderzoekers moeten volgen met betrekking tot deze data. + De Universiteit Utrecht streeft naar integriteit, duurzaamheid, en transparantie in de omgang met onderzoeksdata, waaronder persoonsgegevens. Sinds de introductie van de AVG zijn er duidelijke regels die onderzoekers moeten volgen met betrekking tot deze data. {% endblocktrans %}

      {% trans "Data Management Plan" %}

        -
      • - {% blocktrans trimmed %} - Een data management plan is sinds 2020 verplicht bij de faculteit geesteswetenschappen, zowel als bij de instanties -NWO en ERC als zij subsidie voor een onderzoek bieden. - {% endblocktrans %} -
      • -
      • - {% blocktrans trimmed %} - De faculteit biedt uitgebreide informatie op het gebied van data management, waaronder ook hoe deze te schrijven.
        Je kunt bij de faculteit ook je DMP laten nakijken door Research Data Management Support of de facultaire datamanager. - {% endblocktrans %} -
      • -
      • - {% blocktrans trimmed %} - Op de website DMP-online vind je na het inloggen met je Solis-ID templates voor een DMP. Dit is waar je de templates die NWO en ERC vereisen kunt terugvinden, aangeboden door de UU. - {% endblocktrans %} -
      • -
      -

      {% trans "Nuttige workshops:" %}

      -

      - {% blocktrans trimmed %} - Als je dit nog niet gedaan hebt, wordt er sterk aangeraden om de volgende workshop te volgen: - {% endblocktrans %} -

      -
        {% blocktrans trimmed %}
      • - de workshop Quick -start to Research Data Management + {% blocktrans trimmed %} + Een data management plan is sinds 2020 verplicht bij de faculteit geesteswetenschappen, zowel als bij de instanties + NWO en ERC als zij subsidie voor een onderzoek bieden. + {% endblocktrans %} +
      • +
      • + {% blocktrans trimmed %} + De faculteit biedt uitgebreide informatie op het gebied van data management, waaronder ook hoe deze te schrijven. +
        + Je kunt bij de faculteit ook je DMP laten nakijken door Research Data Management Support of de facultaire datamanager. + {% endblocktrans %} +
      • +
      • + {% blocktrans trimmed %} + Op de website DMP-online vind je na het inloggen met je Solis-ID templates voor een DMP. Dit is waar je de templates die NWO en ERC vereisen kunt terugvinden, aangeboden door de UU. + {% endblocktrans %}
      • - - {% endblocktrans %}
      +

      {% trans "Nuttige workshops:" %}

      {% blocktrans trimmed %} - Voor advies op het gebied van data management planning kun je contact opnemen met de datamanager GW, Frans de Liagre Böhl via datamanagement.gw@uu.nl. + Als je dit nog niet gedaan hebt, wordt er sterk aangeraden om de volgende workshop te volgen: {% endblocktrans %}

      -

      {% trans "Privacy: AVG en GDPR" %}

      -

      +

      +

      + {% blocktrans trimmed %} + Voor advies op het gebied van data management planning kun je contact opnemen met de datamanager GW, Frans de Liagre Böhl via datamanagement.gw@uu.nl. + {% endblocktrans %} +

      +

      {% trans "Privacy: AVG en GDPR" %}

      +

      + {% blocktrans trimmed %} Wanneer je persoonsgebonden data verzamelt, zorg je er voor dat je je houdt aan de Algemene Verordening Gegevensbescherming, of AVG. Deze wet is de Nederlandse implementatie van het Europese GDPR. - {% endblocktrans %} -

      -
        + {% endblocktrans %} +

        +
        • {% blocktrans trimmed %} - De autoriteit persoonsgegevens heeft uitgebreide informatie in het Nederlands over hoe de AVG dataverzameling beïnvloedt. + De autoriteit persoonsgegevens heeft uitgebreide informatie in het Nederlands over hoe de AVG dataverzameling beïnvloedt. {% endblocktrans %}
        • -
        -

        {% trans "Nuttige workshops:" %}

        -

        - {% blocktrans trimmed %} +

      +

      {% trans "Nuttige workshops:" %}

      +

      + {% blocktrans trimmed %} Als je dit nog niet gedaan hebt, wordt er sterk aangeraden om de volgende workshop te volgen: - {% endblocktrans %} -

      -
        {% blocktrans trimmed %} + {% endblocktrans %} +

        + -

        {% blocktrans trimmed %} - Voor advies op het gebied van privacy en de AVG kun je contact opnemen met de privacy officer van GW via privacy.gw@uu.nl. - {% endblocktrans %} -

        - - -
        {% csrf_token %} - + personal data in research + + {% endblocktrans %} + +

        + {% blocktrans trimmed %} + Voor advies op het gebied van privacy en de AVG kun je contact opnemen met de privacy officer van GW via privacy.gw@uu.nl. + {% endblocktrans %} +

        + + {% csrf_token %} +
        {{ form.as_table }} -
        - {% include "base/form_buttons.html" %} -
        -
    -
    + + {% include "base/form_buttons.html" %} + + + {% endblock %} diff --git a/proposals/templates/proposals/proposal_diff.html b/proposals/templates/proposals/proposal_diff.html index d5cd970a1..739fb6d7b 100644 --- a/proposals/templates/proposals/proposal_diff.html +++ b/proposals/templates/proposals/proposal_diff.html @@ -36,7 +36,7 @@

    {% trans "Overzicht van wijzigingen bij aanmelding " %} - {{proposal.title}} - {{proposal.reference_number}} + {{ proposal.title }} - {{ proposal.reference_number }}

    {% trans "Dit overzicht toont de gemaakte wijzigingen in de revisie/het amendement ten opzichte van de originele aanvraag." %} @@ -46,19 +46,14 @@

    - +
    - - {% for section in sections %} - {% include section %} - {% endfor %} - + {% for section in sections %} + {% include section %} + {% endfor %}

    - +

    -
    {% endblock %} diff --git a/proposals/templates/proposals/proposal_export_list.html b/proposals/templates/proposals/proposal_export_list.html index 55a158af8..f6c6efd83 100644 --- a/proposals/templates/proposals/proposal_export_list.html +++ b/proposals/templates/proposals/proposal_export_list.html @@ -3,9 +3,7 @@ {% load static %} {% load i18n %} -{% block header_title %} - Goedgekeurde aanvragen - {{ block.super }} -{% endblock %} +{% block header_title %}Goedgekeurde aanvragen - {{ block.super }}{% endblock %} {% block content %}
    @@ -27,25 +25,21 @@

    Approved proposals

    {{ proposal.title }} {{ proposal.created_by.get_full_name }} - {% if proposal.supervisor %} - {{ proposal.supervisor.get_full_name }} - {% endif %} - - - {{ proposal.date_confirmed|date:"d M Y" }} + {% if proposal.supervisor %}{{ proposal.supervisor.get_full_name }}{% endif %} + {{ proposal.date_confirmed|date:"d M Y" }} {# Bad translation hack #} {% if proposal.reviewing_committee.name == "AK" %} - GC + GC {% else %} - LC + LC {% endif %} {% endfor %} -
    +

    {% endblock %} diff --git a/proposals/templates/proposals/proposal_form.html b/proposals/templates/proposals/proposal_form.html index 7a67cfd7e..02b196253 100644 --- a/proposals/templates/proposals/proposal_form.html +++ b/proposals/templates/proposals/proposal_form.html @@ -4,11 +4,13 @@ {% load i18n %} {% block header_title %} - {% trans "Algemene informatie over de aanvraag" %} - {{ block.super }} + {% trans "Algemene informatie over de aanvraag" %} - {{ block.super }} {% endblock %} {% block html_head %} - + + {% endblock %} {% block content %} -
    -
    - {% if not create %} - {% with nav_items=proposal.available_urls active=1 %} - {% include 'base/navigation.html' %} - {% endwith %} - {% endif %} - {% if is_practice %} -
    - {% trans "Je bewerkt op het moment een oefenaanvraag. Deze kan niet ter beoordeling door de FETC-GW worden ingediend." %} +
    +
    + {% if not create %} + {% with nav_items=proposal.available_urls active=1 %} + {% include 'base/navigation.html' %} + {% endwith %} + {% endif %} + {% if is_practice %} +
    + {% trans "Je bewerkt op het moment een oefenaanvraag. Deze kan niet ter beoordeling door de FETC-GW worden ingediend." %} +
    + {% endif %} +

    {% trans "Algemene informatie over de aanvraag" %}

    + {% if not create and is_supervisor %} + {% blocktrans trimmed %} + Je past nu een aanvraag aan van een student/PhD kandidaat onder jouw supervisie. Let er op dat je het + formulier + invult alsof jij die student/PhD kandidaat bent. + {% endblocktrans %} +
    +
    + {% endif %} +
    + {% csrf_token %} + + {{ form.as_table }} +
    + {% include "base/form_buttons.html" %} +
    - {% endif %} -

    {% trans "Algemene informatie over de aanvraag" %}

    - {% if not create and is_supervisor %} - {% blocktrans trimmed %} - Je past nu een aanvraag aan van een student/PhD kandidaat onder jouw supervisie. Let er op dat je het - formulier - invult alsof jij die student/PhD kandidaat bent. - {% endblocktrans %} -
    -
    - {% endif %} -
    {% csrf_token %} - {{ form.as_table }}
    - {% include "base/form_buttons.html" %} -
    -
    - - - - - + {% endblock %} diff --git a/proposals/templates/proposals/proposal_form_pre_approved.html b/proposals/templates/proposals/proposal_form_pre_approved.html index 9acfb000d..396a86f6b 100644 --- a/proposals/templates/proposals/proposal_form_pre_approved.html +++ b/proposals/templates/proposals/proposal_form_pre_approved.html @@ -8,8 +8,10 @@ {% endblock %} {% block html_head %} - - + + {% endblock %} {% block content %}

    {% trans "Algemene informatie over de aanvraag" %}

    - {% if not create and is_supervisor %} + {% if not create and is_supervisor %} {% blocktrans trimmed %} Je past nu een aanvraag aan van een student/PhD kandidaat onder je supervisie. Let er op dat je het formulier invult alsof jij die student/PhD kandidaat bent. {% endblocktrans %} -
    -
    +
    +
    {% endif %}
    {% csrf_token %} diff --git a/proposals/templates/proposals/proposal_list.html b/proposals/templates/proposals/proposal_list.html index ed621d985..0b97279d1 100644 --- a/proposals/templates/proposals/proposal_list.html +++ b/proposals/templates/proposals/proposal_list.html @@ -1,24 +1,18 @@ {% extends "base/base.html" %} -{% load vue_tags %} +{% load vue_tags %} {% load static %} {% load i18n %} {% get_current_language as LANGUAGE_CODE %} - -{% block header_title %} - {{ title }} - {{ block.super }} -{% endblock %} +{% block header_title %}{{ title }} - {{ block.super }}{% endblock %} {% block html_head %} - {# This template loads in either the dev or prod Vue library, depending on settings.DEBUG #} {% include 'uil.vue/vueloader.html' %} {# Load in the base component FancyList #} {% load_vue_component 'FancyList' %} - {% include 'proposals/vue_templates/proposal_list.html' %} - {% endblock %} + {% block content %}
    @@ -38,70 +33,81 @@

    {{ title }}

    {% static "proposals/images/folder_add.png" as img_add %} {% static 'reviews/images/scale.png' as img_decide %} {% static 'proposals/images/edit-undo.png' as img_revise %} - -

    - {{ body }} -

    +

    {{ body }}

    {% trans "Uitleg" %}

      {% if modifiable %}
    • {% blocktrans trimmed %} - Klik op om naar de volgende stap in + Klik op + + om naar de volgende stap in het proces te gaan. {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om de verschillen met de + Klik op + + om de verschillen met de voorgaande versie te zien (alleen beschikbaar voor revisies/amendementen). {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om je aanvraag te verwijderen. + Klik op + + om je aanvraag te verwijderen. {% endblocktrans %}
    • - {% endif %} - {% if submitted %} + {% endif %} + {% if submitted %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag in te zien. + Klik op + + om een ingediende aanvraag in te zien. {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om een revisie aan te maken van je aanvraag. + Klik op + + om een revisie aan te maken van je aanvraag. {% endblocktrans %}
    • {% endif %} {% if supervised %}
    • {% blocktrans trimmed %} - Klik op om je beslissing door te geven (als eindverantwoordelijke). + Klik op + + om je beslissing door te geven (als eindverantwoordelijke). {% endblocktrans %}
    • {% endif %} {% if is_secretary %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag te verbergen + Klik op + + om een ingediende aanvraag te verbergen uit het archief. {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag toe te voegen + Klik op + + om een ingediende aanvraag toe te voegen aan het archief. {% endblocktrans %}
    • {% endif %}
    -
    -
    {% endblock %} diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index 9d1d10631..3239d54d2 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -8,7 +8,6 @@ {% block extra_style %} {% endblock %} {% block page_header %} - {% endblock %} -{% block page_foot %} - Page of -{% endblock %} +{% block page_foot %}Page of {% endblock %} {% block content %} -
    -
    -

    - {% blocktrans with reference_number=proposal.reference_number trimmed %} - Referentienummer {{ reference_number }} - {% endblocktrans %} -

    -

    {% trans 'Huidige staat van de aanvraag' %}: {{proposal.get_status_display}} -

    - -

    {% trans 'Indiener' %}

    -
    -
    {% trans 'Naam' %}
    {{ proposal.created_by.get_full_name }}
    -
    {% trans 'E-mail' %}
    {{ proposal.created_by.email }}
    -
    - - {% for section in sections %} - {% include section %} - {% endfor %} - +
    +
    +

    + {% blocktrans with reference_number=proposal.reference_number trimmed %} + Referentienummer {{ reference_number }} + {% endblocktrans %} +

    +

    + {% trans 'Huidige staat van de aanvraag' %}: {{ proposal.get_status_display }} +

    +

    {% trans 'Indiener' %}

    +
    +
    {% trans 'Naam' %}
    +
    {{ proposal.created_by.get_full_name }}
    +
    {% trans 'E-mail' %}
    +
    {{ proposal.created_by.email }}
    +
    + {% for section in sections %} + {% include section %} + {% endfor %} +
    -
    {% endblock %} diff --git a/proposals/templates/proposals/proposal_private_archive.html b/proposals/templates/proposals/proposal_private_archive.html index 49a2fd430..d5e32d94b 100644 --- a/proposals/templates/proposals/proposal_private_archive.html +++ b/proposals/templates/proposals/proposal_private_archive.html @@ -1,24 +1,18 @@ {% extends "base/base.html" %} -{% load vue_tags %} +{% load vue_tags %} {% load static %} {% load i18n %} {% get_current_language as LANGUAGE_CODE %} - -{% block header_title %} - {{ title }} - {{ block.super }} -{% endblock %} +{% block header_title %}{{ title }} - {{ block.super }}{% endblock %} {% block html_head %} - {# This template loads in either the dev or prod Vue library, depending on settings.DEBUG #} {% include 'uil.vue/vueloader.html' %} {# Load in the base component FancyList #} {% load_vue_component 'FancyList' %} - {% include 'proposals/vue_templates/proposal_archive_list.html' %} - {% endblock %} + {% block content %}
    @@ -35,66 +30,76 @@

    {{ title }}

    {% static "proposals/images/delete.png" as img_delete %} {% static "main/images/page_white_acrobat.png" as img_pdf %} {% static "proposals/images/folder_delete.png" as img_hide %} - {% static "proposals/images/folder_add.png" as img_add%} + {% static "proposals/images/folder_add.png" as img_add %} {% static 'reviews/images/scale.png' as img_decide %} -

    - {{ body }} -

    +

    {{ body }}

    {% trans "Uitleg" %}

      {% if modifiable %}
    • {% blocktrans trimmed %} - Klik op om naar de volgende stap in + Klik op + + om naar de volgende stap in het proces te gaan. {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om de verschillen met de + Klik op + + om de verschillen met de voorgaande versie te zien (alleen beschikbaar voor revisies/amendementen). {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om je aanvraag te verwijderen. + Klik op + + om je aanvraag te verwijderen. {% endblocktrans %}
    • {% endif %} {% if submitted %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag in te zien. + Klik op + + om een ingediende aanvraag in te zien. {% endblocktrans %}
    • {% endif %} {% if supervised %}
    • {% blocktrans trimmed %} - Klik op om je beslissing door te geven (als eindverantwoordelijke). + Klik op + + om je beslissing door te geven (als eindverantwoordelijke). {% endblocktrans %}
    • {% endif %} {% if is_secretary %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag te verbergen + Klik op + + om een ingediende aanvraag te verbergen uit het archief. {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag toe te voegen + Klik op + + om een ingediende aanvraag toe te voegen aan het archief. {% endblocktrans %}
    • {% endif %}
    -
    -
    {% endblock %} diff --git a/proposals/templates/proposals/proposal_public_archive.html b/proposals/templates/proposals/proposal_public_archive.html index 79e27b4eb..f9ce6ced1 100644 --- a/proposals/templates/proposals/proposal_public_archive.html +++ b/proposals/templates/proposals/proposal_public_archive.html @@ -2,8 +2,8 @@ {% load static %} {% load i18n %} -{% get_current_language as language_code %} +{% get_current_language as language_code %} {% block header_title %} {% trans 'Goedgekeurde aanvragen' %} - {{ block.super }} {% endblock %} @@ -26,21 +26,19 @@

    {% trans 'Goedgekeurde aanvragen' %}

    {{ proposal.reference_number }} {{ proposal.title }} - - {{ proposal.date_confirmed|date:"d M Y" }} - + {{ proposal.date_confirmed|date:"d M Y" }} {% if proposal.reviewing_committee.name == "AK" %} - {% trans 'AK' %} + {% trans 'AK' %} {% else %} - {% trans 'LK' %} + {% trans 'LK' %} {% endif %} {% endfor %} -
    +
    {% endblock %} diff --git a/proposals/templates/proposals/proposal_start.html b/proposals/templates/proposals/proposal_start.html index 332b7f4dd..3661002e5 100644 --- a/proposals/templates/proposals/proposal_start.html +++ b/proposals/templates/proposals/proposal_start.html @@ -11,74 +11,72 @@

    {% trans "Een nieuwe aanvraag aanmelden" %}

    - -
      -
    • {% trans "Check voor het indienen:" %} + -
    • - {% blocktrans trimmed %} - Gebruik de juiste (meest recente) voorbeelddocumenten voor de informed consent. - {% endblocktrans %} -
    • -

      - {% blocktrans trimmed %} - Studenten moeten hun begeleider vragen om deze formulieren; dezelfde voorbeeldteksten, maar op niet-officiële formulieren, zijn te vinden op deze pagina. - {% endblocktrans %} -

      +

      -
    +

    - {% blocktrans %} + {% blocktrans trimmed %} Een voorstel is opgebouwd uit (van groot naar klein) (i) trajecten, (ii) sessies, (iii) taken. {% endblocktrans %}

      -

      -

    • {% trans "Traject" %}: +
    • + {% trans "Traject" %}: {% blocktrans trimmed %} - Als je met verschillende deelnemersgroepen werkt die een verschillend onderzoekstraject doorlopen waarvoor verschillende informed consent documenten nodig zijn.{% endblocktrans %} -

      {% blocktrans trimmed %} - Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een controlegroep en een experimentele groep die verschillende taken krijgen. + Als je met verschillende deelnemersgroepen werkt die een verschillend onderzoekstraject doorlopen waarvoor verschillende informed consent documenten nodig zijn. + {% endblocktrans %} +

      + {% blocktrans trimmed %} + Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een controlegroep en een experimentele groep die verschillende taken krijgen. {% endblocktrans %} -

      -

      -

      -

    • {% trans "Sessie" %}: - {% blocktrans trimmed %} - Alle taken/onderdelen die iemand op één dag uitvoert. - {% endblocktrans %} -
    • -

      -

      -

    • {% trans "Taak" %}: - {% blocktrans trimmed %} - Een taak of onderdeel van je onderzoek. -

      - Bijvoorbeeld: het invullen van een vragenlijst, een interview, of een taaltest. -

      - {% endblocktrans %} -
    • -

      +

      + +
    • + {% trans "Sessie" %}: + {% blocktrans trimmed %} + Alle taken/onderdelen die iemand op één dag uitvoert. + {% endblocktrans %} +
    • +
    • + {% trans "Taak" %}: + {% blocktrans trimmed %} + Een taak of onderdeel van je onderzoek. +

      + Bijvoorbeeld: het invullen van een vragenlijst, een interview, of een taaltest. +

      + {% endblocktrans %} +
    - - {% trans "Volgende stap >>" %} - + {% trans "Volgende stap >>" %}
    {% endblock %} diff --git a/proposals/templates/proposals/proposal_start_practice.html b/proposals/templates/proposals/proposal_start_practice.html index 091b688c0..a1ccefd10 100644 --- a/proposals/templates/proposals/proposal_start_practice.html +++ b/proposals/templates/proposals/proposal_start_practice.html @@ -10,79 +10,79 @@ {% block content %}
    -

    - {% trans "Een nieuwe aanvraag aanmelden (oefenportaal)" %} -

    - -
      -
    • {% trans "Check voor het indienen:" %} +

      {% trans "Een nieuwe aanvraag aanmelden (oefenportaal)" %}

      + -
    • - {% blocktrans trimmed %} - Gebruik de juiste (meest recente) voorbeelddocumenten voor de informed consent. - {% endblocktrans %} +

    • -

      - {% blocktrans trimmed %} - Studenten moeten hun begeleider vragen om deze formulieren; dezelfde voorbeeldteksten, maar op niet-officiële formulieren, zijn te vinden op deze pagina. - {% endblocktrans %} -

      - -
    +

    - {% blocktrans %} + {% blocktrans trimmed %} Een voorstel is opgebouwd uit (van groot naar klein) (i) trajecten, (ii) sessies, (iii) taken. {% endblocktrans %}

      -

      -

    • {% trans "Traject" %}: - {% blocktrans trimmed %} - Als je met verschillende deelnemersgroepen werkt die een verschillend onderzoekstraject doorlopen waarvoor verschillende informed consent documenten nodig zijn.{% endblocktrans %} -

      {% blocktrans trimmed %} - Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een controlegroep en een experimentele groep die verschillende taken krijgen. +

    • + {% trans "Traject" %}: + {% blocktrans trimmed %} + Als je met verschillende deelnemersgroepen werkt die een verschillend onderzoekstraject doorlopen waarvoor verschillende informed consent documenten nodig zijn. {% endblocktrans %} -

      -

      -

    • {% trans "Sessie" %}: - {% blocktrans trimmed %} - Alle taken/onderdelen die iemand op één dag uitvoert. - {% endblocktrans %} -
    • -

      -

      -

    • {% trans "Taak" %}: - {% blocktrans trimmed %} - Een taak of onderdeel van je onderzoek. -

      - Bijvoorbeeld: het invullen van een vragenlijst, een interview, of een taaltest. -

      - {% endblocktrans %} -
    • -

      +

      + {% blocktrans trimmed %} + Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een controlegroep en een experimentele groep die verschillende taken krijgen. + {% endblocktrans %} +

      + +
    • + {% trans "Sessie" %}: + {% blocktrans trimmed %} + Alle taken/onderdelen die iemand op één dag uitvoert. + {% endblocktrans %} +
    • +
    • + {% trans "Taak" %}: + {% blocktrans trimmed %} + Een taak of onderdeel van je onderzoek. +

      + Bijvoorbeeld: het invullen van een vragenlijst, een interview, of een taaltest. +

      + {% endblocktrans %} +

    {% trans "Houd er rekening mee dat een oefenaanvraag niet ingediend kan worden." %}

    - {% csrf_token %} - {{ form.as_table }}
    + + {% csrf_token %} + + {{ form.as_table }} +
    {% include "base/form_buttons.html" %}
    - {% endblock %} diff --git a/proposals/templates/proposals/proposal_start_pre_approved.html b/proposals/templates/proposals/proposal_start_pre_approved.html index f9b8c79cf..4417f9b9c 100644 --- a/proposals/templates/proposals/proposal_start_pre_approved.html +++ b/proposals/templates/proposals/proposal_start_pre_approved.html @@ -3,28 +3,23 @@ {% load static %} {% load i18n %} - - {% block header_title %} {% trans "Een nieuwe aanvraag aanmelden (die al goedgekeurd is door een andere ethische toetsingscomissie)" %} - {{ block.super }} {% endblock %} {% block content %} - {% trans "https://fetc-gw.wp.hum.uu.nl/reglement-fetc-gw/" as reg_url %}
    -

    - {% trans "Een nieuwe aanvraag aanmelden (die al goedgekeurd is door een andere ethische toetsingscomissie)" %} -

    +

    {% trans "Een nieuwe aanvraag aanmelden (die al goedgekeurd is door een andere ethische toetsingscomissie)" %}

    - {% blocktrans trimmed %} - Je wilt een nieuwe aanvraag ter toetsing bij de FETC-GW aanmelden, die al getoetst is - door een andere ethische (toetsings) commissie. - Het is daarvoor noodzakelijk dat je goed bekend bent met het FETC-GW - reglement. - Je kan jezelf en de commissieleden veel tijd besparen door je eerst - goed te informeren. + {% blocktrans trimmed %} + Je wilt een nieuwe aanvraag ter toetsing bij de FETC-GW aanmelden, die al getoetst is + door een andere ethische (toetsings) commissie. + Het is daarvoor noodzakelijk dat je goed bekend bent met het FETC-GW + reglement. + Je kan jezelf en de commissieleden veel tijd besparen door je eerst + goed te informeren. {% endblocktrans %}

    @@ -32,15 +27,14 @@

    Gebruik bij het invullen s.v.p. geen afkortingen waar de FETC-GW wellicht niet mee bekend is. Raadpleeg bij vragen eerst het - reglement + reglement en neem eventueel daarna contact op met de secretaris ({{ secretary_name }}, fetc-gw@uu.nl). {% endblocktrans %}

    - - {% trans "Volgende stap >>" %} - + {% trans "Volgende stap >>" %}

    {% endblock %} diff --git a/proposals/templates/proposals/proposal_start_pre_assessment.html b/proposals/templates/proposals/proposal_start_pre_assessment.html index ee85f6885..a0e29d324 100644 --- a/proposals/templates/proposals/proposal_start_pre_assessment.html +++ b/proposals/templates/proposals/proposal_start_pre_assessment.html @@ -11,25 +11,36 @@

    {% trans "Nieuwe FETC-aanvraag voor (al dan niet goedgekeurde) subsidieaanvragen" %}

    -

    - -

      -
    • {% blocktrans trimmed %}Soms is bij het indienen van een aanvraag bij een subsidieverstrekker een ethische verklaring nodig.{% endblocktrans %}
    • -
    • {% blocktrans trimmed %}Goedgekeurde NWO-aanvragen hebben ook een ethische verklaring nodig alvorens een startdatum vastgesteld kan worden.{% endblocktrans %}
    • -
    - -

    {% blocktrans trimmed %}In deze gevallen kunnen onderzoekers de FETC-GW verzoeken om de onderzoeksaanvraag te laten toetsen. Dit kan via deze route van de portal{% endblocktrans %}.

    - -

    {% blocktrans trimmed %}NB: De toetsing kan alleen op hoofdlijnen plaatsvinden en vervangt NIET de reguliere ethische toetsing van een onderzoek; elke mensgebonden studie die in het kader van de onderzoeksaanvraag zal worden uitgevoerd dient vóóraf goedgekeurd te zijn door de FETC-GW.{% endblocktrans %} -

    - -

    - - - {% trans "Volgende stap >>" %} - +
  • + {% blocktrans trimmed %} + Soms is bij het indienen van een aanvraag bij een subsidieverstrekker een ethische verklaring nodig. + {% endblocktrans %} +
  • +
  • + {% blocktrans trimmed %} + Goedgekeurde NWO-aanvragen hebben ook een ethische verklaring nodig alvorens een startdatum vastgesteld kan worden. + {% endblocktrans %} +
  • + +

    + {% blocktrans trimmed %} + In deze gevallen kunnen onderzoekers de FETC-GW verzoeken om de onderzoeksaanvraag te laten toetsen. Dit kan via deze route van de portal + {% endblocktrans %} + . +

    +

    + {% blocktrans trimmed %} + NB: De toetsing kan alleen op hoofdlijnen plaatsvinden en vervangt NIET de reguliere ethische toetsing van een onderzoek; elke mensgebonden studie die in het kader van de onderzoeksaanvraag zal worden uitgevoerd dient vóóraf goedgekeurd te zijn door de FETC-GW. + {% endblocktrans %} +

    +

    + +

    + {% trans "Volgende stap >>" %} +
    -
    -{% endblock %} + {% endblock %} diff --git a/proposals/templates/proposals/proposal_submit.html b/proposals/templates/proposals/proposal_submit.html index d88a42209..ba041907c 100644 --- a/proposals/templates/proposals/proposal_submit.html +++ b/proposals/templates/proposals/proposal_submit.html @@ -15,8 +15,10 @@ {% endblock %} {% block html_head %} - - + + {% endblock %} {% block content %} @@ -53,27 +55,25 @@

    {% if proposal.is_pre_assessment %} - {% blocktrans %} + {% blocktrans trimmed %} Je aanvraag voor voortoetsing is compleet. {% endblocktrans %} - {% blocktrans %} + {% blocktrans trimmed %} Als je er zeker van bent dat je aanvraag op adequate wijze is gespecifieerd kan je de aanmelding nu ter beoordeling naar de FETC-GW versturen. {% endblocktrans %} - {% elif proposal.relation.needs_supervisor %} - {% blocktrans %} + {% blocktrans trimmed %} Je concept-aanmelding is compleet. {% endblocktrans %} - {% blocktrans %} + {% blocktrans trimmed %} Je kan nu je concept-aanmelding ter beoordeling naar je supervisor versturen. {% endblocktrans %} - {% else %} - {% blocktrans %} + {% blocktrans trimmed %} Je aanmelding is compleet. {% endblocktrans %} - {% blocktrans %} + {% blocktrans trimmed %} Als je er zeker van bent dat je aanvraag op adequate wijze is gespecifieerd kan je de aanmelding nu ter beoordeling naar de FETC-GW versturen. {% endblocktrans %} @@ -92,8 +92,7 @@

    de concept-aanvraag wordt dan bewaard voor eventuele latere wijziging en indiening. {% endblocktrans %}

    - - {% if not proposal.is_pre_assessment %} + {% if not proposal.is_pre_assessment %} {% for study in proposal.study_set.all %} {% if study.has_missing_forms %}
    @@ -119,54 +118,50 @@

    {% endif %} {% endfor %} {% endif %} -
    - - {% if troublesome_pages %} -
    -
    - {% blocktrans trimmed %} - Er zijn nog errors gevonden op de volgende pagina's: - {% endblocktrans %} -
    - - {% blocktrans trimmed %} - Dit komt waarschijnlijk doordat je nog niet alle verplichte velden heeft ingevuld. Je kan je - aanmelding pas versturen wanneer deze fouten gecorrigeerd zijn. - {% endblocktrans %} -
    - {% endif %} - {% if start_date_warning %} -
    -
    {% trans "Controleer uw beoogde startdatum" %}
    -

    - {% blocktrans trimmed %} - Omdat de beoogde startdatum binnen twee weken van vandaag ligt, kan de FETC helaas geen officiële goedkeuring meer geven voor deze aanvraag. Controleer daarom bij een revisie altijd of de beoogde startdatum nog klopt. - {% endblocktrans %} - {% url "proposals:update" proposal.pk as first_page_url %} - {% blocktrans trimmed %} - De beoogde startdatum vindt u op - deze pagina. - {% endblocktrans %} -

    -
    - {% endif %} - - - {% csrf_token %} - {{ form.as_table }}
    + {% if troublesome_pages %} +
    +
    + {% blocktrans trimmed %} + Er zijn nog errors gevonden op de volgende pagina's: + {% endblocktrans %} +
    + + {% blocktrans trimmed %} + Dit komt waarschijnlijk doordat je nog niet alle verplichte velden heeft ingevuld. Je kan je + aanmelding pas versturen wanneer deze fouten gecorrigeerd zijn. + {% endblocktrans %} +
    + {% endif %} + {% if start_date_warning %} +
    +
    {% trans "Controleer uw beoogde startdatum" %}
    +

    + {% blocktrans trimmed %} + Omdat de beoogde startdatum binnen twee weken van vandaag ligt, kan de FETC helaas geen officiële goedkeuring meer geven voor deze aanvraag. Controleer daarom bij een revisie altijd of de beoogde startdatum nog klopt. + {% endblocktrans %} + {% url "proposals:update" proposal.pk as first_page_url %} + {% blocktrans trimmed %} + De beoogde startdatum vindt u op + deze pagina. + {% endblocktrans %} +

    +
    + {% endif %} + {% csrf_token %} + + {{ form.as_table }} +
    {% if is_practice %} -
    - {% trans "Je bewerkt op het moment een oefenaanvraag. Deze kan niet ter beoordeling door de FETC-GW worden ingediend." %} -
    +
    + {% trans "Je bewerkt op het moment een oefenaanvraag. Deze kan niet ter beoordeling door de FETC-GW worden ingediend." %} +
    {% endif %} {% if troublesome_pages or is_practice %} {% include "base/form_buttons.html" with no_forward=1 %} diff --git a/proposals/templates/proposals/proposal_submitted.html b/proposals/templates/proposals/proposal_submitted.html index 7c3a14678..32df1340b 100644 --- a/proposals/templates/proposals/proposal_submitted.html +++ b/proposals/templates/proposals/proposal_submitted.html @@ -35,7 +35,6 @@

    {% trans "Je aanmelding is verstuurd." %} {% endif %} {% trans "Je ontvangt een e-mail ter bevestiging." %} - {% url 'proposals:my_submitted' as submitted_url %} {% blocktrans trimmed %} Klik hier om je ingediende aanvragen in te zien. diff --git a/proposals/templates/proposals/proposal_update_attachments.html b/proposals/templates/proposals/proposal_update_attachments.html index 941594ebb..b59faee2d 100644 --- a/proposals/templates/proposals/proposal_update_attachments.html +++ b/proposals/templates/proposals/proposal_update_attachments.html @@ -10,21 +10,25 @@ {% block content %}
    -

    - {% trans "Formulieren aanpassen" %} -

    +

    {% trans "Formulieren aanpassen" %}

    {% blocktrans trimmed with title=proposal.title ref_number=proposal.reference_number %} - Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag {{ title }} - (referentienummer {{ ref_number }}). + Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag {{ title }} + (referentienummer {{ ref_number }}). {% endblocktrans %}

    - {% csrf_token %} - {{ form.as_table }}
    + + {% csrf_token %} + + {{ form.as_table }} +
    - - {% trans "Terug naar de vorige pagina" %} + + {% trans "Terug naar de vorige pagina" %}
    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/proposals/templates/proposals/proposal_update_date_start.html b/proposals/templates/proposals/proposal_update_date_start.html index 389eceac6..143512cf0 100644 --- a/proposals/templates/proposals/proposal_update_date_start.html +++ b/proposals/templates/proposals/proposal_update_date_start.html @@ -10,24 +10,28 @@ {% block content %}
    -

    - {% trans "Startdatum aanpassen" %} -

    +

    {% trans "Startdatum aanpassen" %}

    {% blocktrans trimmed with title=proposal.title ref_number=proposal.reference_number %} - Op deze pagina kan de startdatum worden aangepast van de aanvraag {{ title }} - (referentienummer {{ ref_number }}). Let op! Als de review al is afgerond, - wordt de nieuwe startdatum niet automatisch weergegeven in de PDF. Mocht je de PDF - opnieuw willen genereren, neem hierover dan contact op met + Op deze pagina kan de startdatum worden aangepast van de aanvraag {{ title }} + (referentienummer {{ ref_number }}). Let op! Als de review al is afgerond, + wordt de nieuwe startdatum niet automatisch weergegeven in de PDF. Mocht je de PDF + opnieuw willen genereren, neem hierover dan contact op met {% endblocktrans %} portalsupport.gw@uu.nl.

    -
    {% csrf_token %} - {{ form.as_table }}
    + + {% csrf_token %} + + {{ form.as_table }} +
    - - {% trans "Terug naar de vorige pagina" %} + + {% trans "Terug naar de vorige pagina" %}
    -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/proposals/templates/proposals/study_consent.html b/proposals/templates/proposals/study_consent.html index b716a5f2f..7c8a54329 100644 --- a/proposals/templates/proposals/study_consent.html +++ b/proposals/templates/proposals/study_consent.html @@ -5,11 +5,11 @@ {% load uil_filters %} {% block header_title %} - {% trans "Informed consent formulieren" %} - {{ block.super }} + {% trans "Informed consent formulieren" %} - {{ block.super }} {% endblock %} {% block html_head %} - + {% endblock %} {% block content %} -
    -
    - {% with nav_items=proposal.available_urls active=4 %} - {% include 'base/navigation.html' %} - {% endwith %} - -

    - {% trans "Informed consent formulieren uploaden" %} -

    -

    - {% blocktrans trimmed %} - Hier kan je de Informed consent formulieren uploaden voor de opgegeven traject(en). Optioneel kan je indien nodig maximaal 10 - paar extra formulieren uploaden.
    Klik hiervoor op 'Voeg extra formulieren' onderaan de pagina. Deze velden - kan je weer weg halen door alle formulieren te wissen. - {% endblocktrans %} -

    - -

    - {% blocktrans trimmed %} - Gebruik de juiste (meest recente) voorbeelddocumenten voor de informed consent. - {% endblocktrans %} - - {% blocktrans trimmed %} - Studenten moeten hun begeleider vragen om deze formulieren; dezelfde voorbeeldteksten, maar op niet-officiële formulieren, zijn te vinden op deze pagina. - {% endblocktrans %} -

    - -

    - {% blocktrans trimmed %} - Let op dat je documenten geen redactionele fouten en/of taalfouten bevatten: een aanvraag kan hierom direct voor revisie worden teruggestuurd. - {% endblocktrans %} - {% blocktrans trimmed %} - Bij ontvangst worden alle bestandsnamen gewijzigd, zet hier dus geen belangrijke informatie in. - {% endblocktrans %} -

    - {% if external_permission %} -
    -

    {% blocktrans trimmed %} - Omdat er in één of meer trajecten onderzoek wordt uitgevoerd op een externe locatie waar toestemming voor vereist is, vragen we daar om een tweede set Informed Consent formulieren voor het management van de instelling. Dat is bijvoorbeeld de schoolleiding of het departementshoofd van een zorginstelling. Voeg waar nodig ook een informatiebrief voor de ouders/verzorgers toe. - {% endblocktrans %}

    -
    - {% endif %} -
    {% csrf_token %} - {{ formset.management_form }} - - {# Reset the counter, as we're looping again #} - {% counter extra_form_counter create 1 %} - {% for form in formset %} - - {% if form.instance.study %} - {# If it's connected to a study, use the study title and a simple div #} -
    - {% with study=form.instance.study %} - {% include 'studies/study_title.html' %} - {% endwith %} - {% else %} - {# If not, we have to do some fancy stuff for the extra forms #} - {% if form.instance.informed_consent or form.instance.briefing or form.instance.parents_information or form.instance.director_consent_information or form.instance.director_consent_declaration %} - {# We can't check this in Python, so we determine here if the object is empty or used #} - {% set used = 1 %} - {% else %} - {% set used = 0 %} - {# We only add the add link if the form is empty, as this simplifies the JS #} - - {% endif %} - -
    -

    {% trans 'Extra formulieren' %} {% counter extra_form_counter value %}

    - {% counter extra_form_counter increment 1 %} - - {% endif %} - - - {{ form.as_table }} -
    -
    - {% endfor %} -
    - {% include "base/form_buttons.html" %} - +
    +
    + {% with nav_items=proposal.available_urls active=4 %} + {% include 'base/navigation.html' %} + {% endwith %} +

    {% trans "Informed consent formulieren uploaden" %}

    +

    + {% blocktrans trimmed %} + Hier kan je de Informed consent formulieren uploaden voor de opgegeven traject(en). Optioneel kan je indien nodig maximaal 10 + paar extra formulieren uploaden. +
    + Klik hiervoor op 'Voeg extra formulieren' onderaan de pagina. Deze velden + kan je weer weg halen door alle formulieren te wissen. + {% endblocktrans %} +

    +

    + {% blocktrans trimmed %} + Gebruik de juiste (meest recente) voorbeelddocumenten voor de informed consent. + + {% endblocktrans %} + {% blocktrans trimmed %} + Studenten moeten hun begeleider vragen om deze formulieren; dezelfde voorbeeldteksten, maar op niet-officiële formulieren, zijn te vinden op deze pagina. + {% endblocktrans %} +

    +

    + {% blocktrans trimmed %} + Let op dat je documenten geen redactionele fouten en/of taalfouten bevatten: een aanvraag kan hierom direct voor revisie worden teruggestuurd. + {% endblocktrans %} + {% blocktrans trimmed %} + Bij ontvangst worden alle bestandsnamen gewijzigd, zet hier dus geen belangrijke informatie in. + {% endblocktrans %} +

    + {% if external_permission %} +
    +

    + {% blocktrans trimmed %} + Omdat er in één of meer trajecten onderzoek wordt uitgevoerd op een externe locatie waar toestemming voor vereist is, vragen we daar om een tweede set Informed Consent formulieren voor het management van de instelling. Dat is bijvoorbeeld de schoolleiding of het departementshoofd van een zorginstelling. Voeg waar nodig ook een informatiebrief voor de ouders/verzorgers toe. + {% endblocktrans %} +

    + {% endif %} +
    + {% csrf_token %} + {{ formset.management_form }} + {# Reset the counter, as we're looping again #} + {% counter extra_form_counter create 1 %} + {% for form in formset %} + {% if form.instance.study %} + {# If it's connected to a study, use the study title and a simple div #} +
    + {% with study=form.instance.study %} + {% include 'studies/study_title.html' %} + {% endwith %} + {% else %} + {# If not, we have to do some fancy stuff for the extra forms #} + {% if form.instance.informed_consent or form.instance.briefing or form.instance.parents_information or form.instance.director_consent_information or form.instance.director_consent_declaration %} + {# We can't check this in Python, so we determine here if the object is empty or used #} + {% set used = 1 %} + {% else %} + {% set used = 0 %} + {# We only add the add link if the form is empty, as this simplifies the JS #} + + {% endif %} +
    +

    {% trans 'Extra formulieren' %} {% counter extra_form_counter value %}

    + {% counter extra_form_counter increment 1 %} + {% endif %} + + {{ form.as_table }} +
    +
    + {% endfor %} +
    + {% include "base/form_buttons.html" %} + +
    - {% endblock %} diff --git a/proposals/templates/proposals/study_start.html b/proposals/templates/proposals/study_start.html index 66e5f1e0e..eebce8d03 100644 --- a/proposals/templates/proposals/study_start.html +++ b/proposals/templates/proposals/study_start.html @@ -8,7 +8,7 @@ {% endblock %} {% block html_head %} - + {% endblock %} {% block content %} @@ -60,42 +60,42 @@ {% with nav_items=proposal.available_urls active=3 %} {% include 'base/navigation.html' %} {% endwith %} -

    - {% trans "Eén of meerdere trajecten?" %} -

    +

    {% trans "Eén of meerdere trajecten?" %}

    - {% blocktrans %} + {% blocktrans trimmed %} Een voorstel is opgebouwd uit (van groot naar klein) (i) trajecten, (ii) sessies, (iii) taken. {% endblocktrans %}

      -

      -

    • {% trans "Traject" %}: +
    • + {% trans "Traject" %}: {% blocktrans trimmed %} - Als je met verschillende deelnemersgroepen werkt die een verschillend onderzoekstraject doorlopen waarvoor verschillende informed consent documenten nodig zijn.{% endblocktrans %} -

      {% blocktrans trimmed %} - Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een controlegroep en een experimentele groep die verschillende taken krijgen. + Als je met verschillende deelnemersgroepen werkt die een verschillend onderzoekstraject doorlopen waarvoor verschillende informed consent documenten nodig zijn. + {% endblocktrans %} +

      + {% blocktrans trimmed %} + Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een controlegroep en een experimentele groep die verschillende taken krijgen. {% endblocktrans %} -

      -

      -

    • {% trans "Sessie" %}: - {% blocktrans trimmed %} - Alle taken/onderdelen die iemand op één dag uitvoert. - {% endblocktrans %} -
    • -

      -

      -

    • {% trans "Taak" %}: - {% blocktrans trimmed %} - Een taak of onderdeel van je onderzoek. -

      - Bijvoorbeeld: het invullen van een vragenlijst, een interview, of een taaltest. -

      - {% endblocktrans %} -
    • -

      +

      + +
    • + {% trans "Sessie" %}: + {% blocktrans trimmed %} + Alle taken/onderdelen die iemand op één dag uitvoert. + {% endblocktrans %} +
    • +
    • + {% trans "Taak" %}: + {% blocktrans trimmed %} + Een taak of onderdeel van je onderzoek. +

      + Bijvoorbeeld: het invullen van een vragenlijst, een interview, of een taaltest. +

      + {% endblocktrans %} +
    -
    {% csrf_token %} + + {% csrf_token %} {{ form.as_table }}
    diff --git a/proposals/templates/proposals/table_with_header.html b/proposals/templates/proposals/table_with_header.html index b3d9a37fc..eb21d24f6 100644 --- a/proposals/templates/proposals/table_with_header.html +++ b/proposals/templates/proposals/table_with_header.html @@ -1,16 +1,14 @@ {% load i18n %} {% if page_break %} -

    {% trans section_title %}

    +

    {% trans section_title %}

    {% elif section_title %} -

    {% trans section_title %}

    -{% endif %} -{% if sub_title %} -

    {{ sub_title }}

    +

    {% trans section_title %}

    {% endif %} +{% if sub_title %}

    {{ sub_title }}

    {% endif %}
    -{% for row in rows %} -
    {{ row.verbose_name }}
    -
    {{ row.value }}
    -{% endfor %} -
    \ No newline at end of file + {% for row in rows %} +
    {{ row.verbose_name }}
    +
    {{ row.value }}
    + {% endfor %} +
    diff --git a/proposals/templates/proposals/table_with_header_diff.html b/proposals/templates/proposals/table_with_header_diff.html index 611565505..a035042c8 100644 --- a/proposals/templates/proposals/table_with_header_diff.html +++ b/proposals/templates/proposals/table_with_header_diff.html @@ -2,50 +2,47 @@ {% load i18n %} {% if section_title %} -

    {% trans section_title %}

    -{% endif %} -{% if sub_title %} -

    {{ sub_title }}

    +

    {% trans section_title %}

    {% endif %} +{% if sub_title %}

    {{ sub_title }}

    {% endif %} -{% if warning %} - {% for row in rows|slice:":1"%} - - - {# If the first object is missing, place a warning on the first TD #} - {% if missing_object == 'old' %} - - - {# Otherwise, we're missing the second one, thus we place the warning on the second #} - {% elif missing_object == 'new' %} - - - {% endif %} - - {% endfor %} - {%for row in rows|slice:"1:"%} - - - - {% endfor %} -{% else %} - {% for row in rows %} - - - - {% endfor %} -{% endif %} -
    {% trans "Originele aanvraag" %} {% trans "Revisie/amendement" %}
    {{ row.verbose_name }} -
    - {{ warning }} -
    -
    {{ row.value }}{{ row.value }} -
    - {{ warning }} -
    -
    {{row.verbose_name}}{{row.value}}
    {{ row.verbose_name }}{{ row.old_value }}{{ row.new_value }}
    \ No newline at end of file + {% if warning %} + {% for row in rows|slice:":1" %} + + {{ row.verbose_name }} + {# If the first object is missing, place a warning on the first TD #} + {% if missing_object == 'old' %} + +
    {{ warning }}
    + + {{ row.value }} + {# Otherwise, we're missing the second one, thus we place the warning on the second #} + {% elif missing_object == 'new' %} + {{ row.value }} + +
    {{ warning }}
    + + {% endif %} + + {% endfor %} + {% for row in rows|slice:"1:" %} + + {{ row.verbose_name }} + {{ row.value }} + + {% endfor %} + {% else %} + {% for row in rows %} + + {{ row.verbose_name }} + {{ row.old_value }} + {{ row.new_value }} + + {% endfor %} + {% endif %} + diff --git a/proposals/templates/proposals/translated_consent_forms.html b/proposals/templates/proposals/translated_consent_forms.html index 0db346fe4..9372d2237 100644 --- a/proposals/templates/proposals/translated_consent_forms.html +++ b/proposals/templates/proposals/translated_consent_forms.html @@ -12,7 +12,7 @@ $(function () { depends_on_value('translated_forms', 'True', 'translated_forms_languages'); }); - + {% endblock %} {% block content %} @@ -20,24 +20,23 @@
    {% with nav_items=proposal.available_urls active=pagenr %} {% include 'base/navigation.html' %} - {% endwith %} -

    - {% trans "Vertaling informed consent formulieren" %} -

    - + {% endwith %} +

    {% trans "Vertaling informed consent formulieren" %}

    {% blocktrans trimmed %} - Documenten moet in het Nederlands of in het Engels worden ingediend. - Echter, om je deelnemers op een adequate manier te informeren kan het noodzakelijk zijn om de documenten in hun moedertaal te vertalen. - Als dat het geval is, dan hoeven deze niet direct te worden ingediend. Het is wel noodzakelijk te vermelden dat deze vertaald zullen gaan worden. - Bij goedkeuring moeten de documenten in andere talen wel worden aangeleverd, omdat de portal ook dient als officieel archief van goedgekeurde aanvragen. - Dit kan eventueel na goedkeuring, maar kan ook bij een minimale revisie. + Documenten moet in het Nederlands of in het Engels worden ingediend. + Echter, om je deelnemers op een adequate manier te informeren kan het noodzakelijk zijn om de documenten in hun moedertaal te vertalen. + Als dat het geval is, dan hoeven deze niet direct te worden ingediend. Het is wel noodzakelijk te vermelden dat deze vertaald zullen gaan worden. + Bij goedkeuring moeten de documenten in andere talen wel worden aangeleverd, omdat de portal ook dient als officieel archief van goedgekeurde aanvragen. + Dit kan eventueel na goedkeuring, maar kan ook bij een minimale revisie. {% endblocktrans %}

    - - {% csrf_token %} - {{ form.as_table }}
    - {% include "base/form_buttons.html" %} + + {% csrf_token %} + + {{ form.as_table }} +
    + {% include "base/form_buttons.html" %}
    diff --git a/proposals/templates/proposals/wmo_application.html b/proposals/templates/proposals/wmo_application.html index 70cefa2df..c05c2ed3d 100644 --- a/proposals/templates/proposals/wmo_application.html +++ b/proposals/templates/proposals/wmo_application.html @@ -23,11 +23,12 @@ {% with nav_items=wmo.proposal.available_urls active=2 %} {% include 'base/navigation.html' %} {% endwith %} -

    - {% trans "Aanmelding bij de METC" %} -

    -
    {% csrf_token %} - {{ form.as_table }}
    +

    {% trans "Aanmelding bij de METC" %}

    + + {% csrf_token %} + + {{ form.as_table }} +
    {% if wmo.status == wmo.WMOStatuses.WAITING %}
    {% trans "Zolang je aanvraag nog niet is beoordeeld door de METC, kan je niet verder in het aanmeldingsproces." %} diff --git a/proposals/templates/proposals/wmo_check.html b/proposals/templates/proposals/wmo_check.html index f6adfa2df..15eb9015b 100644 --- a/proposals/templates/proposals/wmo_check.html +++ b/proposals/templates/proposals/wmo_check.html @@ -8,12 +8,14 @@ {% endblock %} {% block html_head %} - - + + {% endblock %} {% block content %} @@ -22,13 +24,17 @@ {% with nav_items=wmo.proposal.available_urls active=2 %} {% include 'base/navigation.html' %} {% endwith %} -

    - {% trans "WMO-check" %} -

    - {% csrf_token %} - {{ form.as_table }}
    +

    {% trans "WMO-check" %}

    + + {% csrf_token %} + + {{ form.as_table }} +
    - +
    diff --git a/proposals/templates/proposals/wmo_form.html b/proposals/templates/proposals/wmo_form.html index 3a9996d1e..334393725 100644 --- a/proposals/templates/proposals/wmo_form.html +++ b/proposals/templates/proposals/wmo_form.html @@ -8,7 +8,9 @@ {% endblock %} {% block html_head %} - + {% endblock %} - {% block content %}
    {% with nav_items=proposal.available_urls active=2 %} {% include 'base/navigation.html' %} {% endwith %} -

    - {% trans "Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" %} -

    - -
    {% csrf_token %} - {{ form.as_table }}
    +

    {% trans "Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" %}

    + + {% csrf_token %} + + {{ form.as_table }} +
    {% with proposal=wmo.proposal %} {% include "base/form_buttons.html" %} diff --git a/reviews/templates/mail/base-internal.html b/reviews/templates/mail/base-internal.html index 8c26cfe1e..e29ecf35a 100644 --- a/reviews/templates/mail/base-internal.html +++ b/reviews/templates/mail/base-internal.html @@ -1,7 +1,9 @@ -{% block content %} -{% endblock %} -
    -Namens de FETC-GW, met de vriendelijke groeten,
    -
    -de FETC-GW secretaris
    +{% block content %}{% endblock %} + +
    +Namens de FETC-GW, met de vriendelijke groeten, +
    +
    +de FETC-GW secretaris +
    {{ secretary }} diff --git a/reviews/templates/mail/base.html b/reviews/templates/mail/base.html index 09d344619..ba00e835d 100644 --- a/reviews/templates/mail/base.html +++ b/reviews/templates/mail/base.html @@ -1,23 +1,32 @@ -[English version below]
    -
    -{% block content_nl %} -{% endblock %} -
    -Namens de FETC-GW, met de vriendelijke groeten,
    -
    -de FETC-GW secretaris,
    -{{ secretary }}
    -
    -Dit is een automatisch gegenereerd bericht.
    -
    -~~~~~
    -
    -{% block content_en %} -{% endblock %} -
    -Kind regards on behalf of the FEtC-H,
    -
    -the secretary of the FEtC-H,
    -{{ secretary }}
    -
    +[English version below] +
    +
    +{% block content_nl %}{% endblock %} + +
    +Namens de FETC-GW, met de vriendelijke groeten, +
    +
    +de FETC-GW secretaris, +
    +{{ secretary }} +
    +
    +Dit is een automatisch gegenereerd bericht. +
    +
    +~~~~~ +
    +
    +{% block content_en %}{% endblock %} + +
    +Kind regards on behalf of the FEtC-H, +
    +
    +the secretary of the FEtC-H, +
    +{{ secretary }} +
    +
    This message was generated automatically. diff --git a/reviews/templates/mail/concept_creator.html b/reviews/templates/mail/concept_creator.html index 93d788ba1..f118bbf70 100644 --- a/reviews/templates/mail/concept_creator.html +++ b/reviews/templates/mail/concept_creator.html @@ -1,21 +1,29 @@ {% extends "mail/base.html" %} {% block content_nl %} -Beste collega,
    -
    -Uw concept-aanmelding wordt door de eindverantwoordelijk onderzoeker {{ supervisor }} van deze aanvraag gecontroleerd. -Zodra deze de concept-aanmelding, evt. na kleine aanpassingen, heeft goedgekeurd en ter toetsing bij de FETC-GW heeft ingediend, krijgt u van ons bericht.
    -Indien de concept-aanmelding nog aanzienlijke wijzigingen uwerzijds behoeft zal de eindverantwoordelijk onderzoeker zelf contact met u opnemen.
    -U kunt uw ingediende aanmelding hier in PDF vorm bekijken.
    -
    + Beste collega, +
    +
    + Uw concept-aanmelding wordt door de eindverantwoordelijk onderzoeker {{ supervisor }} van deze aanvraag gecontroleerd. + Zodra deze de concept-aanmelding, evt. na kleine aanpassingen, heeft goedgekeurd en ter toetsing bij de FETC-GW heeft ingediend, krijgt u van ons bericht. +
    + Indien de concept-aanmelding nog aanzienlijke wijzigingen uwerzijds behoeft zal de eindverantwoordelijk onderzoeker zelf contact met u opnemen. +
    + U kunt uw ingediende aanmelding hier in PDF vorm bekijken. +
    +
    {% endblock %} {% block content_en %} -Dear colleague,
    -
    -Your draft application will be checked by your supervisor {{ supervisor }}, the researcher who has the final responsibility of this study.
    -You will receive a notification as soon as {{ supervisor }} has approved and formally submitted your draft application, possibly after making some minor revisions.
    -In case {{ supervisor }} finds it necessary for you to make more substantial revisions in the application, he/she will notify you about this, and meanwhile formally disapprove the study in order for you to be able to revise and resubmit it.
    -You can find a PDF of your submission here. -
    + Dear colleague, +
    +
    + Your draft application will be checked by your supervisor {{ supervisor }}, the researcher who has the final responsibility of this study. +
    + You will receive a notification as soon as {{ supervisor }} has approved and formally submitted your draft application, possibly after making some minor revisions. +
    + In case {{ supervisor }} finds it necessary for you to make more substantial revisions in the application, he/she will notify you about this, and meanwhile formally disapprove the study in order for you to be able to revise and resubmit it. +
    + You can find a PDF of your submission here. +
    {% endblock %} diff --git a/reviews/templates/mail/concept_other_applicants.html b/reviews/templates/mail/concept_other_applicants.html index ffe711064..6e9b645fa 100644 --- a/reviews/templates/mail/concept_other_applicants.html +++ b/reviews/templates/mail/concept_other_applicants.html @@ -1,23 +1,33 @@ {% extends "mail/base.html" %} {% block content_nl %} -Beste collega,
    -
    -Uw collega {{ creator }} (cc) heeft een concept-aanmelding ingediend bij de ethische commissie voor het onderzoek {{ title }}, waar u aan meewerkt.
    -De aanmelding wordt door de eindverantwoordelijk onderzoeker {{ supervisor }} van deze aanvraag gecontroleerd. -Zodra deze de concept-aanmelding, evt. na kleine aanpassingen, heeft goedgekeurd en ter toetsing bij de FETC-GW heeft ingediend, krijgt uw collega {{ creator }} van ons bericht.
    -Indien de concept-aanmelding nog aanzienlijke wijzigingen uwerzijds behoeft zal de eindverantwoordelijk onderzoeker zelf contact met uw collega opnemen.
    -U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    -
    + Beste collega, +
    +
    + Uw collega {{ creator }} (cc) heeft een concept-aanmelding ingediend bij de ethische commissie voor het onderzoek {{ title }}, waar u aan meewerkt. +
    + De aanmelding wordt door de eindverantwoordelijk onderzoeker {{ supervisor }} van deze aanvraag gecontroleerd. + Zodra deze de concept-aanmelding, evt. na kleine aanpassingen, heeft goedgekeurd en ter toetsing bij de FETC-GW heeft ingediend, krijgt uw collega {{ creator }} van ons bericht. +
    + Indien de concept-aanmelding nog aanzienlijke wijzigingen uwerzijds behoeft zal de eindverantwoordelijk onderzoeker zelf contact met uw collega opnemen. +
    + U kunt de ingediende aanmelding hier in PDF vorm bekijken. +
    +
    {% endblock %} {% block content_en %} -Dear colleague,
    -
    -Your colleague {{ creator }} (cc) has submitted a draft application to the ethics commission for the study {{ title }}, in which you are participating. -The application will be checked by the study's supervisor {{ supervisor }}, the researcher who has the final responsibility of this study.
    -Your colleague {{ creator }} will receive a notification as soon as {{ supervisor }} has approved and formally submitted your draft application, possibly after making some minor revisions.
    -In case {{ supervisor }} finds it necessary for you to make more substantial revisions in the application, he/she will notify your colleague about this, and meanwhile formally disapprove the study in order for you to be able to revise and resubmit it.
    -You can find a PDF of your submission here.
    -
    + Dear colleague, +
    +
    + Your colleague {{ creator }} (cc) has submitted a draft application to the ethics commission for the study {{ title }}, in which you are participating. + The application will be checked by the study's supervisor {{ supervisor }}, the researcher who has the final responsibility of this study. +
    + Your colleague {{ creator }} will receive a notification as soon as {{ supervisor }} has approved and formally submitted your draft application, possibly after making some minor revisions. +
    + In case {{ supervisor }} finds it necessary for you to make more substantial revisions in the application, he/she will notify your colleague about this, and meanwhile formally disapprove the study in order for you to be able to revise and resubmit it. +
    + You can find a PDF of your submission here. +
    +
    {% endblock %} diff --git a/reviews/templates/mail/concept_supervisor.html b/reviews/templates/mail/concept_supervisor.html index bf8bc3373..b195da623 100644 --- a/reviews/templates/mail/concept_supervisor.html +++ b/reviews/templates/mail/concept_supervisor.html @@ -1,39 +1,47 @@ {% extends "mail/base.html" %} {% block content_nl %} -Beste collega,
    -
    -{{ creator }} heeft binnen de FETC-GW-webportal een concept-aanvraag opgesteld voor een onderzoek waarbij u als de eindverantwoordelijke onderzoeker bent aangewezen.
    - -

    -{{ proposal.reference_number }}: {{ proposal.title }}

    - -U kunt deze concept-aanmelding hier bekijken, eventueel na aanpassingen van uzelf of {{ creator }}, formeel ter toetsing bij de FETC-GW indienen.
    -Indien {{ creator }} wordt geacht de aanpassingen te maken, dient u de aanvraag formeel af te keuren en zelf {{ creator }} hiervan op de hoogte stellen.
    -
    -U kunt al uw aanmeldingen als supervisor en hun status hier bekijken.
    -
    -{% if revision %} -Let op: het gaat hierbij om een {{ revision_type|lower }} van een eerdere aanmelding.
    -Op het webportaal kunt u de wijzigingen ten opzichte van de vorige aanmelding inzien.
    -{% endif %} + Beste collega, +
    +
    + {{ creator }} heeft binnen de FETC-GW-webportal een concept-aanvraag opgesteld voor een onderzoek waarbij u als de eindverantwoordelijke onderzoeker bent aangewezen. +
    +

    {{ proposal.reference_number }}: {{ proposal.title }}

    + U kunt deze concept-aanmelding hier bekijken, eventueel na aanpassingen van uzelf of {{ creator }}, formeel ter toetsing bij de FETC-GW indienen. +
    + Indien {{ creator }} wordt geacht de aanpassingen te maken, dient u de aanvraag formeel af te keuren en zelf {{ creator }} hiervan op de hoogte stellen. +
    +
    + U kunt al uw aanmeldingen als supervisor en hun status hier bekijken. +
    +
    + {% if revision %} + Let op: het gaat hierbij om een {{ revision_type|lower }} van een eerdere aanmelding. +
    + Op het webportaal kunt u de wijzigingen ten opzichte van de vorige aanmelding inzien. +
    + {% endif %} {% endblock %} {% block content_en %} -Dear colleague,
    -
    -{{ creator }} has created, within the portal of the FEtC-H, a draft application for a study for which you are appointed as the supervisor.
    - -

    -{{ proposal.reference_number }}: {{ proposal.title }}

    - -You can review this draft application here and submit this study to the FEtC-H after you have approved it. Note that in case minor revisions are necessary, you can adjust the study yourself before submitting it.
    -In case the application needs to be revised more substantially by {{ creator }}, we ask you to formally disapprove it in order for {{ creator }} to be able to revise it. In such a case, we ask you to inform {{ creator }} about this.
    -
    -You can view all your supervised applications and their status here.
    -
    -{% if revision %} -Please note that this involves a {{ revision_type | lower }} of a previous application.
    -On the web portal you can check the differences between the current and previous application.
    -{% endif %} + Dear colleague, +
    +
    + {{ creator }} has created, within the portal of the FEtC-H, a draft application for a study for which you are appointed as the supervisor. +
    +

    {{ proposal.reference_number }}: {{ proposal.title }}

    + You can review this draft application here and submit this study to the FEtC-H after you have approved it. Note that in case minor revisions are necessary, you can adjust the study yourself before submitting it. +
    + In case the application needs to be revised more substantially by {{ creator }}, we ask you to formally disapprove it in order for {{ creator }} to be able to revise it. In such a case, we ask you to inform {{ creator }} about this. +
    +
    + You can view all your supervised applications and their status here. +
    +
    + {% if revision %} + Please note that this involves a {{ revision_type | lower }} of a previous application. +
    + On the web portal you can check the differences between the current and previous application. +
    + {% endif %} {% endblock %} diff --git a/reviews/templates/mail/pre_assessment_secretary.html b/reviews/templates/mail/pre_assessment_secretary.html index 0106f0b2d..1ccf5b463 100644 --- a/reviews/templates/mail/pre_assessment_secretary.html +++ b/reviews/templates/mail/pre_assessment_secretary.html @@ -1,7 +1,10 @@ {% extends "mail/base-internal.html" %} {% block content %} -Er is een nieuwe aanvraag voor voortoetsing ingediend (referentienummer: {{ proposal.reference_number }},
    -eindverantwoordelijke: {{ proposal.accountable_user.get_full_name }}).
    -U kunt de aanvraag hier bekijken.
    + Er is een nieuwe aanvraag voor voortoetsing ingediend (referentienummer: {{ proposal.reference_number }}, +
    + eindverantwoordelijke: {{ proposal.accountable_user.get_full_name }}). +
    + U kunt de aanvraag hier bekijken. +
    {% endblock %} diff --git a/reviews/templates/mail/reminder.html b/reviews/templates/mail/reminder.html index bf627a3bd..2c0cc2905 100644 --- a/reviews/templates/mail/reminder.html +++ b/reviews/templates/mail/reminder.html @@ -1,15 +1,21 @@ {% extends "mail/base.html" %} {% block content_nl %} -Beste collega,
    -
    -Je moet met spoed de aanvraag van {{ creator }} beoordelen. De deadline voor beoordeling is (bijna) verlopen.
    -U kunt deze aanvraag beoordelen via {{ proposal_url }}
    + Beste collega, +
    +
    + Je moet met spoed de aanvraag van {{ creator }} beoordelen. De deadline voor beoordeling is (bijna) verlopen. +
    + U kunt deze aanvraag beoordelen via {{ proposal_url }} +
    {% endblock %} {% block content_en %} -Dear colleague,
    -
    -You must urgently review {{creator}}'s study. The deadline for assessment has (almost) expired.
    -You can review this application via {{ proposal_url }}
    + Dear colleague, +
    +
    + You must urgently review {{ creator }}'s study. The deadline for assessment has (almost) expired. +
    + You can review this application via {{ proposal_url }} +
    {% endblock %} diff --git a/reviews/templates/mail/submitted_longroute.html b/reviews/templates/mail/submitted_longroute.html index 9c8c473f5..221c9549e 100644 --- a/reviews/templates/mail/submitted_longroute.html +++ b/reviews/templates/mail/submitted_longroute.html @@ -1,35 +1,45 @@ {% extends "mail/base.html" %} {% block content_nl %} -{% if was_revised %} -Beste collega,
    -
    -Je gereviseerde aanvraag is door de FETC-GW ontvangen.
    -
    -Dit houdt in dat je revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen je binnenkort een beoordeling te kunnen sturen.
    - -{% else %} -Beste collega,
    -
    -Je aanmelding is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status lange-route onderzoek, zie appendix A van het reglement voor de criteria.
    -
    -Dit houdt in dat je aanvraag op de eerstvolgende vergadering van de FETC-GW zal worden besproken, wanneer je aanvraag tenminste een week voor die vergadering is ingediend. Zie de FETC-GW-agenda voor een overzicht van de komende vergaderingen. Zeer kort na de vergadering zult u de beoordeling ontvangen.
    -{% endif %} + {% if was_revised %} + Beste collega, +
    +
    + Je gereviseerde aanvraag is door de FETC-GW ontvangen. +
    +
    + Dit houdt in dat je revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen je binnenkort een beoordeling te kunnen sturen. +
    + {% else %} + Beste collega, +
    +
    + Je aanmelding is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status lange-route onderzoek, zie appendix A van het reglement voor de criteria. +
    +
    + Dit houdt in dat je aanvraag op de eerstvolgende vergadering van de FETC-GW zal worden besproken, wanneer je aanvraag tenminste een week voor die vergadering is ingediend. Zie de FETC-GW-agenda voor een overzicht van de komende vergaderingen. Zeer kort na de vergadering zult u de beoordeling ontvangen. +
    + {% endif %} {% endblock %} {% block content_en %} -{% if was_revised %} -Dear colleague,
    -
    -The FEtC-H has received your revised application.
    -
    -This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon.
    - -{% else %} -Dear colleague,
    -
    -The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria.
    -
    -This means that your study will be discussed during the next FEtC-H meeting, if your application was submitted at least one week before that meeting. See the FEtC-H agenda for an overview of upcoming meetings. You will receive the assessment shortly after the meeting.
    -{% endif %} + {% if was_revised %} + Dear colleague, +
    +
    + The FEtC-H has received your revised application. +
    +
    + This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon. +
    + {% else %} + Dear colleague, +
    +
    + The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria. +
    +
    + This means that your study will be discussed during the next FEtC-H meeting, if your application was submitted at least one week before that meeting. See the FEtC-H agenda for an overview of upcoming meetings. You will receive the assessment shortly after the meeting. +
    + {% endif %} {% endblock %} diff --git a/reviews/templates/mail/submitted_longroute_other_applicants.html b/reviews/templates/mail/submitted_longroute_other_applicants.html index a2a06cb17..74cb64eaf 100644 --- a/reviews/templates/mail/submitted_longroute_other_applicants.html +++ b/reviews/templates/mail/submitted_longroute_other_applicants.html @@ -1,37 +1,53 @@ {% extends "mail/base.html" %} {% block content_nl %} -{% if was_revised %} -Beste collega,
    -
    -Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen.
    -
    -Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen.
    -U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    -{% else %} -Beste collega,
    -
    -Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status lange-route onderzoek, zie appendix A van het reglement voor de criteria.
    -
    -Dit houdt in dat je aanvraag op de eerstvolgende vergadering van de FETC-GW zal worden besproken, wanneer je aanvraag tenminste een week voor die vergadering is ingediend. Zie de FETC-GW-agenda voor een overzicht van de komende vergaderingen. Kort na de vergadering zal {{ creator }} de beoordeling ontvangen.
    -U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    -{% endif %} + {% if was_revised %} + Beste collega, +
    +
    + Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. +
    +
    + Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen. +
    + U kunt de ingediende aanmelding hier in PDF vorm bekijken. +
    + {% else %} + Beste collega, +
    +
    + Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status lange-route onderzoek, zie appendix A van het reglement voor de criteria. +
    +
    + Dit houdt in dat je aanvraag op de eerstvolgende vergadering van de FETC-GW zal worden besproken, wanneer je aanvraag tenminste een week voor die vergadering is ingediend. Zie de FETC-GW-agenda voor een overzicht van de komende vergaderingen. Kort na de vergadering zal {{ creator }} de beoordeling ontvangen. +
    + U kunt de ingediende aanmelding hier in PDF vorm bekijken. +
    + {% endif %} {% endblock %} {% block content_en %} -{% if was_revised %} -Dear colleague,
    -
    -Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your application.
    -
    -This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send your colleague {{ creator }} a review soon.
    -You can find a PDF of your submission here.
    -{% else %} -Dear colleague,
    -
    -Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria.
    -
    -This means that your study will be discussed during the next FEtC-H meeting, if your application was submitted at least one week before that meeting. See the FEtC-H agenda for an overview of upcoming meetings. {{ creator }} will receive the assessment shortly after the meeting.
    -You can find a PDF of your submission here.
    -{% endif %} + {% if was_revised %} + Dear colleague, +
    +
    + Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. +
    +
    + This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send your colleague {{ creator }} a review soon. +
    + You can find a PDF of your submission here. +
    + {% else %} + Dear colleague, +
    +
    + Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of long-route research, see appendix A in the regulations for the criteria. +
    +
    + This means that your study will be discussed during the next FEtC-H meeting, if your application was submitted at least one week before that meeting. See the FEtC-H agenda for an overview of upcoming meetings. {{ creator }} will receive the assessment shortly after the meeting. +
    + You can find a PDF of your submission here. +
    + {% endif %} {% endblock %} diff --git a/reviews/templates/mail/submitted_shortroute.html b/reviews/templates/mail/submitted_shortroute.html index 5deffff67..4c24abddc 100644 --- a/reviews/templates/mail/submitted_shortroute.html +++ b/reviews/templates/mail/submitted_shortroute.html @@ -1,39 +1,51 @@ {% extends "mail/base.html" %} {% block content_nl %} -{% if was_revised %} -Beste collega,
    -
    -Je gereviseerde aanvraag is door de FETC-GW ontvangen.
    -
    -Dit houdt in dat je revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen je binnenkort een beoordeling te kunnen sturen.
    - -{% else %} -Beste collega,
    -
    -Je aanmelding is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status korte-route onderzoek gekregen.
    -
    -Dit houdt in dat wij ernaar streven om je binnen twee werkweken een eerste beoordeling van de FETC-GW te sturen.
    -
    -NB: Het is mogelijk dat je aanvraag alsnog als 'lange-route onderzoek' wordt aangemerkt, in welk geval de beoordeling langer kan duren, zie het reglement. Houdt u hier a.u.b. rekening mee.
    -{% endif %} + {% if was_revised %} + Beste collega, +
    +
    + Je gereviseerde aanvraag is door de FETC-GW ontvangen. +
    +
    + Dit houdt in dat je revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen je binnenkort een beoordeling te kunnen sturen. +
    + {% else %} + Beste collega, +
    +
    + Je aanmelding is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status korte-route onderzoek gekregen. +
    +
    + Dit houdt in dat wij ernaar streven om je binnen twee werkweken een eerste beoordeling van de FETC-GW te sturen. +
    +
    + NB: Het is mogelijk dat je aanvraag alsnog als 'lange-route onderzoek' wordt aangemerkt, in welk geval de beoordeling langer kan duren, zie het reglement. Houdt u hier a.u.b. rekening mee. +
    + {% endif %} {% endblock %} {% block content_en %} -{% if was_revised %} -Dear colleague,
    -
    -The FEtC-H has received your revised application.
    -
    -This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon.
    - -{% else %} -Dear colleague,
    -
    -The FEtC-H has received your application. The automatic screening of the portal has given your study the status of short-route research. -This means that you will receive an assessment within two working weeks.
    -
    -Note: It is possible that your application may still be classified as a 'long-route research', in which case the asssessment procedure may take longer, see the regulations for information. If the latter case, see section 2.8, p. 14 for the possible time paths.
    -Please be aware of these possibilities and the different time paths involved.
    -{% endif %} + {% if was_revised %} + Dear colleague, +
    +
    + The FEtC-H has received your revised application. +
    +
    + This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon. +
    + {% else %} + Dear colleague, +
    +
    + The FEtC-H has received your application. The automatic screening of the portal has given your study the status of short-route research. + This means that you will receive an assessment within two working weeks. +
    +
    + Note: It is possible that your application may still be classified as a 'long-route research', in which case the asssessment procedure may take longer, see the regulations for information. If the latter case, see section 2.8, p. 14 for the possible time paths. +
    + Please be aware of these possibilities and the different time paths involved. +
    + {% endif %} {% endblock %} diff --git a/reviews/templates/mail/submitted_shortroute_other_applicants.html b/reviews/templates/mail/submitted_shortroute_other_applicants.html index 86e8c69d9..de4f41442 100644 --- a/reviews/templates/mail/submitted_shortroute_other_applicants.html +++ b/reviews/templates/mail/submitted_shortroute_other_applicants.html @@ -1,39 +1,56 @@ {% extends "mail/base.html" %} {% block content_nl %} -{% if was_revised %} -Beste collega,
    -
    -Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen.
    -
    -Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen.
    -U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    -{% else %} -Beste collega,
    -
    -Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status korte-route onderzoek gekregen.
    -
    -Dit houdt in dat wij ernaar streven om uw collega binnen twee werkweken een eerste beoordeling van de FETC-GW te sturen.
    -U kunt de ingediende aanmelding hier in PDF vorm bekijken.
    -
    -NB: Het is mogelijk dat je aanvraag alsnog als 'lange-route onderzoek' wordt aangemerkt, in welk geval de beoordeling langer kan duren, zie het reglement. Houdt u hier a.u.b. rekening mee.
    -{% endif %} + {% if was_revised %} + Beste collega, +
    +
    + Uw collega {{ creator }} (cc) heeft een gereviseerde aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. +
    +
    + Dit houdt in dat de revisie nu door twee leden van de FETC-GW zal worden beoordeeld; een eenvoudige revisie wordt alleen door de secretaris beoordeeld. We hopen uw collega, {{ creator }}, binnenkort een beoordeling te kunnen sturen. +
    + U kunt de ingediende aanmelding hier in PDF vorm bekijken. +
    + {% else %} + Beste collega, +
    +
    + Uw collega {{ creator }} (cc) heeft een aanvraag ingediend voor het onderzoek {{ title }}, waar u aan meewerkt, bij de ethische commissie. De aanvraag is door de FETC-GW ontvangen. De automatische screening van de portal heeft op basis van de door jou gegeven beschrijving voorlopig de status korte-route onderzoek gekregen. +
    +
    + Dit houdt in dat wij ernaar streven om uw collega binnen twee werkweken een eerste beoordeling van de FETC-GW te sturen. +
    + U kunt de ingediende aanmelding hier in PDF vorm bekijken. +
    +
    + NB: Het is mogelijk dat je aanvraag alsnog als 'lange-route onderzoek' wordt aangemerkt, in welk geval de beoordeling langer kan duren, zie het reglement. Houdt u hier a.u.b. rekening mee. +
    + {% endif %} {% endblock %} {% block content_en %} -{% if was_revised %} -Dear colleague,
    -
    -Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your revised application.
    -
    -This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon.
    -You can find a PDF of your submission here.
    -{% else %} -Dear colleague,
    -
    -Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of short-route research. This means that your colleague will receive an assessment within two working weeks.
    -You can find a PDF of your submission here.
    -
    -Note: It is possible that your application may still be classified as a 'long-route research', in which case the asssessment procedure may take longer, see the regulations for information. If the latter case, see section 2.8, p. 14 for the possible time paths.
    -{% endif %} + {% if was_revised %} + Dear colleague, +
    +
    + Your colleague {{ creator }} (cc) has submitted a revised application for the study {{ title }}, in which you are participating. The FEtC-H has received your revised application. +
    +
    + This means that your study will be assessed by two members of the FEtC-H; minor revisions will be assessed by the secretary only. We hope to be able to send you a review soon. +
    + You can find a PDF of your submission here. +
    + {% else %} + Dear colleague, +
    +
    + Your colleague {{ creator }} (cc) has submitted an application for the study {{ title }}, in which you are participating. The FEtC-H has received your application. The automatic screening of the portal has given your study the status of short-route research. This means that your colleague will receive an assessment within two working weeks. +
    + You can find a PDF of your submission here. +
    +
    + Note: It is possible that your application may still be classified as a 'long-route research', in which case the asssessment procedure may take longer, see the regulations for information. If the latter case, see section 2.8, p. 14 for the possible time paths. +
    + {% endif %} {% endblock %} diff --git a/reviews/templates/reviews/action_explaination.html b/reviews/templates/reviews/action_explaination.html index b17bce316..fd106c7fc 100644 --- a/reviews/templates/reviews/action_explaination.html +++ b/reviews/templates/reviews/action_explaination.html @@ -14,30 +14,37 @@ {% static 'reviews/images/website.png' as img_export %} {% static 'reviews/images/report_go.png' as img_confirm %} {% static 'reviews/images/tick.png' as img_confirmed %} -

    {% trans "Uitleg" %}

    • - {% blocktrans %} - Klik op om een ingediende aanvraag in te zien. + {% blocktrans trimmed %} + Klik op + + om een ingediende aanvraag in te zien. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om de verschillen met de voorgaande + {% blocktrans trimmed %} + Klik op + + om de verschillen met de voorgaande versie te zien (alleen beschikbaar voor revisies/amendementen). {% endblocktrans %}
    • - {% blocktrans %} - Klik op om alle details en beoordelingen van + {% blocktrans trimmed %} + Klik op + + om alle details en beoordelingen van een ingediende aanvraag te zien. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om je beslissing door te geven. + {% blocktrans trimmed %} + Klik op + + om je beslissing door te geven. {% endblocktrans %}
    @@ -47,42 +54,56 @@

    {% trans "Uitleg secretaris" %}

      {% if request.user|is_secretary %}
    • - {% blocktrans %} - Klik op om een ingediende aanvraag te verbergen uit het + {% blocktrans trimmed %} + Klik op + + om een ingediende aanvraag te verbergen uit het archief. {% endblocktrans %}
    • {% blocktrans trimmed %} - Klik op om een ingediende aanvraag toe te voegen + Klik op + + om een ingediende aanvraag toe te voegen aan het archief. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om beoordelaars aan te stellen. + {% blocktrans trimmed %} + Klik op + + om beoordelaars aan te stellen. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om een aanvraag + {% blocktrans trimmed %} + Klik op + + om een aanvraag te verplaatsen naar een andere kamer. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om een aanvraag af te sluiten. + {% blocktrans trimmed %} + Klik op + + om een aanvraag af te sluiten. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om aan te geven dat de + {% blocktrans trimmed %} + Klik op + + om aan te geven dat de bevestigingsbrief is verstuurd. {% endblocktrans %}
    • - {% blocktrans %} - Klik op om de opgegeven datum + {% blocktrans trimmed %} + Klik op + + om de opgegeven datum van de bevestigingsbrief te veranderen. {% endblocktrans %}
    • diff --git a/reviews/templates/reviews/auto_review.html b/reviews/templates/reviews/auto_review.html index f716b2316..0009e6681 100644 --- a/reviews/templates/reviews/auto_review.html +++ b/reviews/templates/reviews/auto_review.html @@ -4,17 +4,15 @@

      {% trans "Uitkomst automatische review" %}

      {% if auto_review_go %} - {% trans "Volgens de automatische review kan dit voorstel de korte (2-weken) route volgen." %} + {% trans "Volgens de automatische review kan dit voorstel de korte (2-weken) route volgen." %} {% else %} - {% trans "Volgens de automatische review moet dit voorstel nader worden bekeken." %} + {% trans "Volgens de automatische review moet dit voorstel nader worden bekeken." %} {% endif %}
      {% if not auto_review_go %} -

      {% trans "Redenen" %}

      -
        - {% for reason in auto_review_reasons %} -
      • {{ reason }}
      • - {% endfor %} -
      +

      {% trans "Redenen" %}

      +
        + {% for reason in auto_review_reasons %}
      • {{ reason }}
      • {% endfor %} +
      {% endif %}

      diff --git a/reviews/templates/reviews/change_chamber_form.html b/reviews/templates/reviews/change_chamber_form.html index 1b7ee7482..8daafe976 100644 --- a/reviews/templates/reviews/change_chamber_form.html +++ b/reviews/templates/reviews/change_chamber_form.html @@ -10,13 +10,17 @@ {% block content %}
      -

      - {% trans "Beoordelende kamer wijzigen" %} -

      - {% csrf_token %} - {{ form.as_table }}
      - - {% trans "Terug naar de vorige pagina" %} +

      {% trans "Beoordelende kamer wijzigen" %}

      + + {% csrf_token %} + + {{ form.as_table }} +
      + + {% trans "Terug naar de vorige pagina" %}
      diff --git a/reviews/templates/reviews/committee_members_workload.html b/reviews/templates/reviews/committee_members_workload.html index d337de54e..99455a54d 100644 --- a/reviews/templates/reviews/committee_members_workload.html +++ b/reviews/templates/reviews/committee_members_workload.html @@ -15,81 +15,73 @@ {% block content %}
      -

      {% trans 'Lopende reviews' %} {{ committee }}

      - +

      {% trans 'Lopende reviews' %} {{ committee }}

      - - - - - - - + + + + + + + - {% for decision in decisions %} - - - - - - {% if decision.review.date_should_end < today %} - + + - {% else %} - - {% endif %} - - {% endfor %} + + {% if decision.review.date_should_end < today %} + + {% else %} + + {% endif %} + + {% endfor %}
      {% trans "Reviewer" %}{% trans "Traject" %}{% trans "Referentienummer" %}{% trans "Datum ingediend" %}{% trans "Gewenste einddatum" %}
      {% trans "Reviewer" %}{% trans "Traject" %}{% trans "Referentienummer" %}{% trans "Datum ingediend" %}{% trans "Gewenste einddatum" %}
      {{ decision.reviewer.get_full_name }} - {% if decision.review.proposal.is_revision == True %} - {% trans 'Revisie' %} - {% elif decision.review.short_route == True %} - {% trans 'Korte route' %} - {% else %} - {% trans 'Lange route' %} - {% endif %} - - - {{ decision.review.proposal.reference_number }} - - {{decision.review.proposal.title}} - {{ decision.review.date_start|date:"j M Y" }} - {{ decision.review.date_should_end|date:"j M Y" }} + {% for decision in decisions %} +
      {{ decision.reviewer.get_full_name }} + {% if decision.review.proposal.is_revision == True %} + {% trans 'Revisie' %} + {% elif decision.review.short_route == True %} + {% trans 'Korte route' %} + {% else %} + {% trans 'Lange route' %} + {% endif %} - {{ decision.review.date_should_end|date:"j M Y" }} + + {{ decision.review.proposal.reference_number }} - {{ decision.review.proposal.title }}
      {{ decision.review.date_start|date:"j M Y" }}{{ decision.review.date_should_end|date:"j M Y" }}{{ decision.review.date_should_end|date:"j M Y" }}

      -

      {% trans 'Werkverdeling overzicht van afgelopen periode' %}

      -

      - {% trans 'Vul hieronder een start- en einddatum in voor de periode van dit overzicht.'%} -

      +

      {% trans 'Werkverdeling overzicht van afgelopen periode' %}

      +

      {% trans 'Vul hieronder een start- en einddatum in voor de periode van dit overzicht.' %}

      {% csrf_token %} - {{ form.as_table }} + {{ form.as_table }}
      - +

      - - - - - - - + + + + + + + {% for reviewer in reviewers %} - - - - - + + + + + {% endfor %} diff --git a/reviews/templates/reviews/decision_form.html b/reviews/templates/reviews/decision_form.html index 4a07c5c54..d565f4307 100644 --- a/reviews/templates/reviews/decision_form.html +++ b/reviews/templates/reviews/decision_form.html @@ -9,13 +9,11 @@ {% block content %}
      - {% with review=decision.review %} - {% include "reviews/review_detail_sidebar.html" %} - {% endwith %} + {% with review=decision.review %} + {% include "reviews/review_detail_sidebar.html" %} + {% endwith %}
      -

      - {% trans "Aanvraag beoordelen" %} -

      +

      {% trans "Aanvraag beoordelen" %}

      {% with proposal=decision.review.proposal %} {% url 'proposals:pdf' proposal.id as pdf_url %} {% url 'proposals:update' proposal.id as update_url %} @@ -29,8 +27,9 @@

      {% else %}

      - {% blocktrans trimmed with title=proposal.title %} - Je kunt nu de aanvraag {{ title }} bekijken.
      + {% blocktrans trimmed with title=proposal.title %} + Je kunt nu de aanvraag {{ title }} bekijken. +
      {% endblocktrans %}

      @@ -49,7 +48,8 @@

      1. {% blocktrans trimmed %} - door de supervisor (jijzelf)
        + door de supervisor (jijzelf) +
        Als supervisor kan je deze aanvraag hier aanpassen. Daarna word je teruggeleid naar deze pagina en kun je hieronder de aanvraag goedkeuren; dat betekent dat de aanvraag wordt ingediend bij de FETC-GW. @@ -57,12 +57,13 @@

      2. {% blocktrans trimmed %} - door de indiener (je student of promovendus)
        + door de indiener (je student of promovendus) +
        Indien je wilt dat de indiener de aanvraag zelf aanpast voordat je de studie kunt goedkeuren en daarmee bij de FETC-GW indient, selecteer dan 'revisie noodzakelijk' of ‘niet goedgekeurd’ hieronder, voeg eventuele opmerkingen toe, en klik op 'Beslissing opslaan'. Zodra je dit gedaan hebt kan de indiener weer aanpassingen doen. -
        +
        {% endblocktrans %}
      3. {# This list item is a somewhat hacky way to simulate a p tag, as you can't use those in a li #} @@ -77,20 +78,22 @@

        {% if proposal.is_revision %}

        {% url 'proposals:diff' proposal.id as diff_url %} - {% blocktrans %} + {% blocktrans trimmed %} Dit is een revisie van of amendement op een vorige aanvraag. De verschillen met de vorige aanvraag zijn hier in te zien. {% endblocktrans %}

        {% endif %} -
        {% csrf_token %} -

      {% trans "Reviewer" %}{% trans "Totaal" %}{% trans "Korte route" %}{% trans "Lange Route" %}{% trans "Revisie" %}
      {% trans "Reviewer" %}{% trans "Totaal" %}{% trans "Korte route" %}{% trans "Lange Route" %}{% trans "Revisie" %}
      {{ reviewer.get_full_name }} {{ reviewer.total }}{{ reviewer.num_short_route }}{{ reviewer.num_long_route }}{{ reviewer.num_revision }}{{ reviewer.get_full_name }}{{ reviewer.total }}{{ reviewer.num_short_route }}{{ reviewer.num_long_route }}{{ reviewer.num_revision }}
      {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      {% endwith %} diff --git a/reviews/templates/reviews/documents_list.html b/reviews/templates/reviews/documents_list.html index 42c683277..587a204b3 100644 --- a/reviews/templates/reviews/documents_list.html +++ b/reviews/templates/reviews/documents_list.html @@ -5,47 +5,34 @@ {% load compare_tags %} {% load documents_list %} - - {% for container in containers %} - -
      - {{container.header}} -
      - - - -{% if container.dmp_edit_link %} - - {% trans "Data Management Plan wijzigen" %} - - -{% endif %} - -{% if container.edit_link %} - - {% trans "Documenten wijzigen" %} - - -{% endif %} - - + {% endif %} + {% if container.edit_link %} + + {% trans "Documenten wijzigen" %} + + + {% endif %} {% endfor %} diff --git a/reviews/templates/reviews/review_assign_form.html b/reviews/templates/reviews/review_assign_form.html index 1c8b95f80..e639c5d94 100644 --- a/reviews/templates/reviews/review_assign_form.html +++ b/reviews/templates/reviews/review_assign_form.html @@ -22,32 +22,32 @@ {% block content %}
      - - {% with review=review %} - {% include "reviews/review_detail_sidebar.html" %} - {% endwith %} - + {% with review=review %} + {% include "reviews/review_detail_sidebar.html" %} + {% endwith %}
      -

      - {% trans "Commissieleden aanstellen" %} -

      - +

      {% trans "Commissieleden aanstellen" %}

      {% url 'reviews:workload' review.proposal.reviewing_committee as workload_url %} {% blocktrans trimmed with title=review.proposal.title %}

      Kies hier de geschikte route en commissieleden voor de aanvraag {{ title }}. klik hier voor een overzicht van de werkverdeling van deze commissie. - +

      {% endblocktrans %} -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      -
      {% if not review.proposal.is_pre_assessment %} {% include "reviews/auto_review.html" %} diff --git a/reviews/templates/reviews/review_close_form.html b/reviews/templates/reviews/review_close_form.html index d560fb90e..9a892a9ea 100644 --- a/reviews/templates/reviews/review_close_form.html +++ b/reviews/templates/reviews/review_close_form.html @@ -21,11 +21,9 @@ {% block content %}
      -

      - {% trans "Review afsluiten" %} -

      +

      {% trans "Review afsluiten" %}

      - {% blocktrans with title=review.proposal.title %} + {% blocktrans trimmed with title=review.proposal.title %} Sluit hier de beoordeling van de aanvraag {{ title }} af. Hieronder volgen de individuele beslissingen. {% endblocktrans %} @@ -33,19 +31,16 @@

      {% trans "Individuele beslissingen" %}

      {% include "reviews/review_table.html" %}

      {% trans "Uiteindelijk besluit" %}

      - -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      -
      - - {% endblock %} diff --git a/reviews/templates/reviews/review_detail.html b/reviews/templates/reviews/review_detail.html index 43378ba83..29c95cb7d 100644 --- a/reviews/templates/reviews/review_detail.html +++ b/reviews/templates/reviews/review_detail.html @@ -8,7 +8,7 @@ {% load uil_filters %} {% block header_title %} - {% blocktrans with proposal=review.proposal.title %} + {% blocktrans trimmed with proposal=review.proposal.title %} Details van besluitvorming bij aanmelding {{ proposal }} {% endblocktrans %} - {{ review.proposal.reference_number }} - {{ block.super }} @@ -18,7 +18,7 @@

      - {% blocktrans with proposal=review.proposal.title %} + {% blocktrans trimmed with proposal=review.proposal.title %} Details van besluitvorming bij aanmelding {{ proposal }} {% endblocktrans %} - {{ review.proposal.reference_number }} @@ -26,33 +26,23 @@

      - - {% with review=review %} - {% include "reviews/review_detail_sidebar.html" %} - {% endwith %} - + {% with review=review %} + {% include "reviews/review_detail_sidebar.html" %} + {% endwith %}
      -

      - {% trans "Reviewers" %} -

      +

      {% trans "Reviewers" %}

      {% include "reviews/review_table.html" %}

      {% trans "Handelingen" %}

        - {% for action in detail_actions %} -
      • - {{ action }} -
      • + {% for action in detail_actions %} +
      • {{ action }}
      • {% empty %} -
      • - {% trans "Geen handelingen beschikbaar" %} -
      • - {% endfor %} +
      • {% trans "Geen handelingen beschikbaar" %}
      • + {% endfor %}
      {% if not review.proposal.is_pre_assessment %} {% include "reviews/auto_review.html" %} {% endif %}
      -
      - {% endblock %} diff --git a/reviews/templates/reviews/review_detail_sidebar.html b/reviews/templates/reviews/review_detail_sidebar.html index 8c2e1b004..ce1dfadb8 100644 --- a/reviews/templates/reviews/review_detail_sidebar.html +++ b/reviews/templates/reviews/review_detail_sidebar.html @@ -12,26 +12,22 @@ Remember to include it in a with statement if the view does not provide it. {% endcomment %} -
      -

      - {% trans "Details" %} -

      +

      {% trans "Details" %}

        -
      • - {% trans "Referentie" %}: {{ review.proposal.reference_number }} -
      • -
      • - {% trans "Commissie" %}: {{review.proposal.reviewing_committee}} -
      • +
      • {% trans "Referentie" %}: {{ review.proposal.reference_number }}
      • +
      • {% trans "Commissie" %}: {{ review.proposal.reviewing_committee }}
      • {% if review.proposal.amendment_or_revision %}
      • {% blocktrans trimmed with parent=review.proposal.parent.reference_number r_or_a=review.proposal.amendment_or_revision %} - {{r_or_a}} van
        {{ parent }} + {{ r_or_a }} van +
        + {{ parent }} {% endblocktrans %}
        - +
      • @@ -39,43 +35,49 @@

      • {% trans "Aanvrager(s)" %}:
          - {% for name_email in review.get_applicant_names_emails %} -
        • {{ name_email }}
        • - {% endfor %} + {% for name_email in review.get_applicant_names_emails %}
        • {{ name_email }}
        • {% endfor %}
        {{ review.get_applicant_names }}
      • {% if review.proposal.supervisor %} -
      • - {% trans "Supervisor" %}: {{ review.proposal.supervisor.get_full_name }} -
      • +
      • {% trans "Supervisor" %}: {{ review.proposal.supervisor.get_full_name }}
      • {% endif %}
      • - {% blocktrans with date_start=review.date_start|date:"j F Y, G:i" %} - Reviewronde gestart op
        {{ date_start }}. + {% blocktrans trimmed with date_start=review.date_start|date:"j F Y, G:i" %} + Reviewronde gestart op +
        + {{ date_start }}. {% endblocktrans %}
      • {% if review.date_end %}
      • - {% blocktrans with date_end=review.date_end|date:"j F Y, G:i" %} - Reviewronde beëindigd op
        {{ date_end }}. + {% blocktrans trimmed with date_end=review.date_end|date:"j F Y, G:i" %} + Reviewronde beëindigd op +
        + {{ date_end }}. {% endblocktrans %}
      • {% endif %} {% if review.stage == review.Stages.CLOSED %}
      • - {% blocktrans with continuation=review.get_continuation_display %} - Afhandeling:
        {{ continuation }}. + {% blocktrans trimmed with continuation=review.get_continuation_display %} + Afhandeling: +
        + {{ continuation }}. {% endblocktrans %}
      • {% if review.proposal.date_confirmed %}
      • - {% blocktrans with date_confirmed=review.proposal.date_confirmed|date:"j F Y" %} - Bevestiging verzonden op
        {{ date_confirmed }}. + {% blocktrans trimmed with date_confirmed=review.proposal.date_confirmed|date:"j F Y" %} + Bevestiging verzonden op +
        + {{ date_confirmed }}. {% endblocktrans %} {% if review.proposal.confirmation_comments %} - {% blocktrans with comments=review.proposal.confirmation_comments %} - Opmerkingen:
        {{ comments }}. + {% blocktrans trimmed with comments=review.proposal.confirmation_comments %} + Opmerkingen: +
        + {{ comments }}. {% endblocktrans %} {% endif %}
      • @@ -84,7 +86,7 @@

        {% if review.proposal.is_pre_assessment %}
      • - {% blocktrans %} + {% blocktrans trimmed %} Dit is een aanvraag voor voortoetsing. {% endblocktrans %} @@ -100,23 +102,23 @@

      • {% endif %}

      - - - {% if review.proposal.has_minor_revision %} -

      {% trans 'Revisie' %}

      -

      {% blocktrans %} + {% if review.proposal.has_minor_revision %} +

      {% trans 'Revisie' %}

      +

      + {% blocktrans trimmed %} Deze aanvraag heeft een revisie gehad tijdens het beslisproces. - {% endblocktrans %}

      - {% if review.proposal.minor_revision_description %} -

      {% blocktrans %} - Er zijn de volgende opmerkingen bijgevoegd:
      + {% endblocktrans %} +

      + {% if review.proposal.minor_revision_description %} +

      + {% blocktrans trimmed %} + Er zijn de volgende opmerkingen bijgevoegd: +
      {% endblocktrans %} - {{ review.proposal.minor_revision_description }}

      - {% endif %} + {{ review.proposal.minor_revision_description }} +

      {% endif %} - - -

      {% trans "Documenten" %}

      - {% documents_list review user %} - + {% endif %} +

      {% trans "Documenten" %}

      + {% documents_list review user %}
      diff --git a/reviews/templates/reviews/review_discontinue_form.html b/reviews/templates/reviews/review_discontinue_form.html index f12e40821..abf941f0a 100644 --- a/reviews/templates/reviews/review_discontinue_form.html +++ b/reviews/templates/reviews/review_discontinue_form.html @@ -22,59 +22,57 @@ {% block content %}
      - - {% with review=review %} - {% include "reviews/review_detail_sidebar.html" %} - {% endwith %} - + {% with review=review %} + {% include "reviews/review_detail_sidebar.html" %} + {% endwith %}
      -

      - {% trans "Afhandeling definitief beëindigen" %} -

      - +

      {% trans "Afhandeling definitief beëindigen" %}

      {% blocktrans trimmed %} - Als een aanvraag definitief niet meer door de FETC-GW - afgehandeld gaat worden, en deze in de weg staat, - kan er voor gekozen worden deze te beëindigen. + Als een aanvraag definitief niet meer door de FETC-GW + afgehandeld gaat worden, en deze in de weg staat, + kan er voor gekozen worden deze te beëindigen. {% endblocktrans %}

      {% blocktrans trimmed %} - Een beëindigde aanvraag verschijnt niet meer in de pagina's - van de secretaris en beoordelaars. Deze - aanvraag kan ook niet meer gereviseerd worden, - maar nog wel gekopieerd. De aanvraag is nog wel zichtbaar - in de lijst met "alle ingediende aanvragen". + Een beëindigde aanvraag verschijnt niet meer in de pagina's + van de secretaris en beoordelaars. Deze + aanvraag kan ook niet meer gereviseerd worden, + maar nog wel gekopieerd. De aanvraag is nog wel zichtbaar + in de lijst met "alle ingediende aanvragen". {% endblocktrans %}

      {% if review.stage == review.Stages.CLOSED %} -

      - - {% trans "Attentie" %} - : - {% blocktrans trimmed %} - Deze aanvraag heeft op dit moment geen lopende beoordeling. Om deze aanvraag definitief te - beëindigen, moeten we de uitkomst van laatste beoordeling (zie linker balk) veranderen. - Dit kan verwarring veroorzaken bij de indiener, dus houd hier rekening mee. - {% endblocktrans %} -

      +

      + {% trans "Attentie" %}: + {% blocktrans trimmed %} + Deze aanvraag heeft op dit moment geen lopende beoordeling. Om deze aanvraag definitief te + beëindigen, moeten we de uitkomst van laatste beoordeling (zie linker balk) veranderen. + Dit kan verwarring veroorzaken bij de indiener, dus houd hier rekening mee. + {% endblocktrans %} +

      {% endif %}

      {% trans "Aanvraag" %}: {% blocktrans with title=review.proposal.title author=review.proposal.created_by trimmed %} - {{title}} door {{author}} + {{ title }} door {{ author }} {% endblocktrans %} -

      {% csrf_token %} - {{ form.as_table }}
      - - -
      +
      + {% csrf_token %} + + {{ form.as_table }} +
      + +
      +
      -
      -{% endblock %} + {% endblock %} diff --git a/reviews/templates/reviews/review_table.html b/reviews/templates/reviews/review_table.html index b6a2f4cca..481c1a4be 100644 --- a/reviews/templates/reviews/review_table.html +++ b/reviews/templates/reviews/review_table.html @@ -13,12 +13,12 @@ {% for decision in review.decision_set.all %} - - {{ decision.reviewer.get_full_name }} - {{ decision.get_go_display|default:_("open") }} - {{ decision.date_decision|date:"j F Y, G:i" }} - {{ decision.comments }} - + + {{ decision.reviewer.get_full_name }} + {{ decision.get_go_display|default:_("open") }} + {{ decision.date_decision|date:"j F Y, G:i" }} + {{ decision.comments }} + {% endfor %} diff --git a/reviews/templates/reviews/simple_compare_link.html b/reviews/templates/reviews/simple_compare_link.html index 5225ca6f2..a547d9ef8 100644 --- a/reviews/templates/reviews/simple_compare_link.html +++ b/reviews/templates/reviews/simple_compare_link.html @@ -1,10 +1,9 @@ - {% load static %} {% load i18n %} - {% if compare_url %} - - - + + + {% endif %} diff --git a/reviews/templates/reviews/ufl_list.html b/reviews/templates/reviews/ufl_list.html index 5fcdabf30..19b54414d 100644 --- a/reviews/templates/reviews/ufl_list.html +++ b/reviews/templates/reviews/ufl_list.html @@ -6,20 +6,14 @@ {% load vue_tags %} {% get_current_language as LANGUAGE_CODE %} - -{% block header_title %} - {{ committee_name }} - {{ title }} - {{ block.super }} -{% endblock %} +{% block header_title %}{{ committee_name }} - {{ title }} - {{ block.super }}{% endblock %} {% block html_head %} - {# This template loads in either the dev or prod Vue library, depending on settings.DEBUG #} {% include 'uil.vue/vueloader.html' %} {# Load in the base component FancyList #} {% load_vue_component 'FancyList' %} - {% include list_template %} - + {% endblock %} {% block content %} @@ -77,25 +77,23 @@ {% with nav_items=study.proposal.available_urls active=3 %} {% include 'base/navigation.html' %} {% endwith %} - -

      - {% trans "De deelnemers" %} -

      - +

      {% trans "De deelnemers" %}

      {% include "studies/study_title.html" %} - {% if not study.proposal.relation %}
      {% url 'proposals:update' study.proposal.pk as url %} - {% blocktrans %} + {% blocktrans trimmed %} Let op! Je hebt de vraag 'In welke hoedanigheid ben je betrokken bij deze aanvraag?' nog niet ingevuld, waardoor deze pagina nog kan veranderen op basis van je antwoord. {% endblocktrans %}
      {% endif %} -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      {% with proposal=study.proposal %} - {% include "base/form_buttons.html" %} + {% include "base/form_buttons.html" %} {% endwith %}
      diff --git a/studies/templates/studies/study_title.html b/studies/templates/studies/study_title.html index a9893f7e1..4ff01ca80 100644 --- a/studies/templates/studies/study_title.html +++ b/studies/templates/studies/study_title.html @@ -1,15 +1,15 @@ {% load i18n %} {% if study.proposal.studies_number > 1 %} -

      - {% if study.name %} - {% blocktrans with order=study.order name=study.name %} - Traject {{ order }} ({{ name }}) - {% endblocktrans %} - {% else %} - {% blocktrans with order=study.order %} - Traject {{ order }} - {% endblocktrans %} - {% endif %} -

      +

      + {% if study.name %} + {% blocktrans trimmed with order=study.order name=study.name %} + Traject {{ order }} ({{ name }}) + {% endblocktrans %} + {% else %} + {% blocktrans trimmed with order=study.order %} + Traject {{ order }} + {% endblocktrans %} + {% endif %} +

      {% endif %} diff --git a/studies/templates/studies/study_update_attachments.html b/studies/templates/studies/study_update_attachments.html index 5ee3d6560..7d6ca5288 100644 --- a/studies/templates/studies/study_update_attachments.html +++ b/studies/templates/studies/study_update_attachments.html @@ -10,20 +10,24 @@ {% block content %}
      -

      - {% trans "Formulieren aanpassen" %} -

      +

      {% trans "Formulieren aanpassen" %}

      {% blocktrans trimmed with title=documents.proposal.title ref_number=documents.proposal.reference_number order=documents.study.order %} - Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag {{ title }} - (referentienummer {{ ref_number }}), traject {{ order }}. + Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag {{ title }} + (referentienummer {{ ref_number }}), traject {{ order }}. {% endblocktrans %}

      -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      - - {% trans "Terug naar de vorige pagina" %} + + {% trans "Terug naar de vorige pagina" %}
      diff --git a/tasks/templates/tasks/session_confirm_delete.html b/tasks/templates/tasks/session_confirm_delete.html index f479ff79f..e906e1ecc 100644 --- a/tasks/templates/tasks/session_confirm_delete.html +++ b/tasks/templates/tasks/session_confirm_delete.html @@ -6,17 +6,20 @@ {% trans "Sessie verwijderen" %} - {{ block.super }} {% endblock %} - {% block content %}
      -

      - {% trans "Sessie verwijderen" %} -

      -
      {% csrf_token %} -

      Weet u zeker dat u deze sessie {{ session.order }} in de aanvraag {{ session.study.proposal.title }} wilt verwijderen?

      - - {% trans "Annuleren" %} +

      {% trans "Sessie verwijderen" %}

      + + {% csrf_token %} +

      + Weet u zeker dat u deze sessie {{ session.order }} in de aanvraag {{ session.study.proposal.title }} wilt verwijderen? +

      + + {% trans "Annuleren" %}
      diff --git a/tasks/templates/tasks/session_title.html b/tasks/templates/tasks/session_title.html index 2e549d91c..758f841e6 100644 --- a/tasks/templates/tasks/session_title.html +++ b/tasks/templates/tasks/session_title.html @@ -1,23 +1,23 @@ {% load i18n %} {% with order=session.order study_order=session.study.order study_name=session.study.name studies_number=session.study.proposal.studies_number sessions_number=session.study.sessions_number %} -{% if studies_number > 1 and sessions_number > 1 %} -

      - {% blocktrans %} - Traject {{ study_order }} ({{ study_name }}), sessie {{ order }} - {% endblocktrans %} -

      -{% elif studies_number > 1 %} -

      - {% blocktrans %} - Traject {{ study_order }} ({{ study_name }}) - {% endblocktrans %} -

      -{% elif sessions_number >= 1 %} -

      - {% blocktrans %} - Sessie {{ order }} - {% endblocktrans %} -

      -{% endif %} + {% if studies_number > 1 and sessions_number > 1 %} +

      + {% blocktrans trimmed %} + Traject {{ study_order }} ({{ study_name }}), sessie {{ order }} + {% endblocktrans %} +

      + {% elif studies_number > 1 %} +

      + {% blocktrans trimmed %} + Traject {{ study_order }} ({{ study_name }}) + {% endblocktrans %} +

      + {% elif sessions_number >= 1 %} +

      + {% blocktrans trimmed %} + Sessie {{ order }} + {% endblocktrans %} +

      + {% endif %} {% endwith %} diff --git a/tasks/templates/tasks/task_confirm_delete.html b/tasks/templates/tasks/task_confirm_delete.html index 17e2e7ae7..c39a183e1 100644 --- a/tasks/templates/tasks/task_confirm_delete.html +++ b/tasks/templates/tasks/task_confirm_delete.html @@ -9,13 +9,17 @@ {% block content %}
      -

      - {% trans "Taak verwijderen" %} -

      -
      {% csrf_token %} -

      Weet u zeker dat u de taak {{ task.name }} uit sessie {{ task.session.order }} in de aanvraag {{ task.session.study.proposal.title }} wilt verwijderen?

      - - {% trans "Annuleren" %} +

      {% trans "Taak verwijderen" %}

      + + {% csrf_token %} +

      + Weet u zeker dat u de taak {{ task.name }} uit sessie {{ task.session.order }} in de aanvraag {{ task.session.study.proposal.title }} wilt verwijderen? +

      + + {% trans "Annuleren" %}
      diff --git a/tasks/templates/tasks/task_end.html b/tasks/templates/tasks/task_end.html index ae76ec69b..8c2d8fa00 100644 --- a/tasks/templates/tasks/task_end.html +++ b/tasks/templates/tasks/task_end.html @@ -7,16 +7,13 @@ {% trans "Overzicht van het takenonderzoek" %} - {{ block.super }} {% endblock %} - {% block content %}
      {% with nav_items=session.study.proposal.available_urls active=3 %} {% include 'base/navigation.html' %} {% endwith %} -

      - {% trans "Overzicht van het takenonderzoek" %} -

      +

      {% trans "Overzicht van het takenonderzoek" %}

      {% include "tasks/session_title.html" %}

      @@ -25,13 +22,15 @@

      {% include "tasks/task_list.html" %}

      {% trans "Beantwoord op basis van dit overzicht de volgende vragen:" %}

      -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      {% with proposal=session.study.proposal study=session.study %} - {% include "base/form_buttons.html" %} + {% include "base/form_buttons.html" %} {% endwith %}
      - {% endblock %} diff --git a/tasks/templates/tasks/task_form.html b/tasks/templates/tasks/task_form.html index ccb16265d..53fce3fee 100644 --- a/tasks/templates/tasks/task_form.html +++ b/tasks/templates/tasks/task_form.html @@ -8,32 +8,31 @@ {% endblock %} {% block html_head %} - + {% endblock %} - {% block content %}
      {% with nav_items=task.session.study.proposal.available_urls active=3 %} {% include 'base/navigation.html' %} {% endwith %} - -

      - {% trans "Het takenonderzoek en interviews" %} -

      +

      {% trans "Het takenonderzoek en interviews" %}

      {% include "tasks/task_title.html" %} -
      {% csrf_token %} - {{ form.as_table }}
      + + {% csrf_token %} + + {{ form.as_table }} +
      {% with proposal=task.session.study.proposal study=task.session.study session=task.session %} - {% include "base/form_buttons.html" %} + {% include "base/form_buttons.html" %} {% endwith %}
      diff --git a/tasks/templates/tasks/task_list.html b/tasks/templates/tasks/task_list.html index 73137d60d..63fa4cb79 100644 --- a/tasks/templates/tasks/task_list.html +++ b/tasks/templates/tasks/task_list.html @@ -13,27 +13,30 @@ {% for task in session.task_set.all %} - - {{ task.name }} - {{ task.duration }} - {{ task.registrations.all|unordered_list }} - - {{ task.feedback|yesno:_("ja,nee") }} - {% if task.feedback %} - {{ task.feedback_details }} - {% endif %} - - - - {% if session.tasks_number > 1 %} - - {% endif %} - - + + {{ task.name }} + {{ task.duration }} + {{ task.registrations.all|unordered_list }} + + {{ task.feedback|yesno:_("ja,nee") }} + {% if task.feedback %}{{ task.feedback_details }}{% endif %} + + + + + + {% if session.tasks_number > 1 %} + + + + {% endif %} + + {% endfor %} - + {% endblock %} {% block content %} @@ -24,21 +24,19 @@ {% with nav_items=session.study.proposal.available_urls active=3 %} {% include 'base/navigation.html' %} {% endwith %} -

      - {% trans "Het takenonderzoek en interviews" %} -

      +

      {% trans "Het takenonderzoek en interviews" %}

      {% include "main/setting_checks.html" %} {% include "tasks/session_title.html" %} -
      {% csrf_token %} - {{ form.as_table }}
      -

      - {% trans "Voor elke taak stellen we in de komende schermen steeds dezelfde vragen." %} -

      + + {% csrf_token %} + + {{ form.as_table }} +
      +

      {% trans "Voor elke taak stellen we in de komende schermen steeds dezelfde vragen." %}

      {% with proposal=session.study.proposal study=session.study %} - {% include "base/form_buttons.html" %} + {% include "base/form_buttons.html" %} {% endwith %}
      - {% endblock %} diff --git a/tasks/templates/tasks/task_title.html b/tasks/templates/tasks/task_title.html index 51f26d6f3..7a0352a8d 100644 --- a/tasks/templates/tasks/task_title.html +++ b/tasks/templates/tasks/task_title.html @@ -1,17 +1,17 @@ {% load i18n %} {% with order=task.order session_order=task.session.order study_order=task.session.study.order study_name=task.session.study.name studies_number=task.session.study.proposal.studies_number %} -{% if studies_number > 1 %} -

      - {% blocktrans %} - Traject {{ study_order }} ({{ study_name }}), sessie {{ session_order }}, taak {{ order }} - {% endblocktrans %} -

      -{% else %} -

      - {% blocktrans %} - Sessie {{ session_order }}, taak {{ order }} - {% endblocktrans %} -

      -{% endif %} + {% if studies_number > 1 %} +

      + {% blocktrans trimmed %} + Traject {{ study_order }} ({{ study_name }}), sessie {{ session_order }}, taak {{ order }} + {% endblocktrans %} +

      + {% else %} +

      + {% blocktrans trimmed %} + Sessie {{ session_order }}, taak {{ order }} + {% endblocktrans %} +

      + {% endif %} {% endwith %} From dc56d72b6cb0fa8c03eef124adf505400762267a Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 12 Jan 2024 15:36:27 +0100 Subject: [PATCH 119/148] fix: regenerate and fix translation file --- locale/en/LC_MESSAGES/django.po | 2483 +++++++++++++------------------ 1 file changed, 1069 insertions(+), 1414 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 1580a6be9..cb1ab438b 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-11 16:40+0100\n" +"POT-Creation-Date: 2024-01-12 15:35+0100\n" "PO-Revision-Date: 2023-11-07 10:36+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -17,7 +17,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.1\n" -#: faqs/menus.py:7 main/templates/main/index.html:201 +#: faqs/menus.py:7 main/templates/main/index.html:187 msgid "FETC-GW website" msgstr "FEtC-H website" @@ -29,15 +29,15 @@ msgstr "https://fetc-gw.wp.hum.uu.nl/en/" msgid "Reglement FETC-GW" msgstr "Regulations FEtC-H" -#: faqs/menus.py:13 main/templates/main/index.html:204 -#: proposals/templates/proposals/proposal_start_pre_approved.html:14 +#: faqs/menus.py:13 main/templates/main/index.html:190 +#: proposals/templates/proposals/proposal_start_pre_approved.html:11 msgid "https://fetc-gw.wp.hum.uu.nl/reglement-fetc-gw/" msgstr "https://fetc-gw.wp.hum.uu.nl/en/regulations-fetc-h/" -#: faqs/menus.py:17 main/templates/main/index.html:209 +#: faqs/menus.py:17 main/templates/main/index.html:194 #: proposals/templates/proposals/study_consent.html:8 #: proposals/templates/proposals/translated_consent_forms.html:7 -#: proposals/utils/pdf_diff_logic.py:868 +#: proposals/utils/pdf_diff_logic.py:878 msgid "Informed consent formulieren" msgstr "Informed consent forms" @@ -51,7 +51,7 @@ msgstr "" msgid "FAQs" msgstr "FAQs" -#: faqs/menus.py:27 +#: faqs/menus.py:30 msgid "Help" msgstr "Help" @@ -59,47 +59,47 @@ msgstr "Help" msgid "FAQ" msgstr "FAQ" -#: faqs/templates/faqs/faq_list.html:6 faqs/templates/faqs/faq_list.html:13 +#: faqs/templates/faqs/faq_list.html:6 faqs/templates/faqs/faq_list.html:12 msgid "Frequently Asked Questions" msgstr "Frequently Asked Questions" -#: fetc/settings.py:132 +#: fetc/settings.py:128 msgid "Nederlands" msgstr "Dutch" -#: fetc/settings.py:133 +#: fetc/settings.py:129 msgid "Engels" msgstr "English" -#: interventions/models.py:15 +#: interventions/models.py:17 msgid "Wat is de periode waarbinnen de interventie plaatsvindt?" msgstr "What is the period in which the intervention will take place?" -#: interventions/models.py:16 +#: interventions/models.py:18 msgid "De interventie vindt plaats binnen het schooljaar 2018-2019" msgstr "The intervention will take place in the academic year 2018-2019" -#: interventions/models.py:22 +#: interventions/models.py:23 msgid "Zal de interventie vaker dan één keer plaatsvinden?" msgstr "Will there be more than one intervention session?" -#: interventions/models.py:27 +#: interventions/models.py:28 msgid "Wat is de frequentie van de interventie?" msgstr "What is the frequency of the intervention?" -#: interventions/models.py:32 +#: interventions/models.py:33 msgid "Wat is de duur van de interventie per sessie in minuten?" msgstr "What is the duration of the intervention session in minutes?" -#: interventions/models.py:38 +#: interventions/models.py:39 msgid "Wie voert de interventie uit?" msgstr "Who will conduct the intervention?" -#: interventions/models.py:43 +#: interventions/models.py:44 msgid "Geef een beschrijving van de experimentele interventie" msgstr "Give a description of the experimental intervention" -#: interventions/models.py:48 +#: interventions/models.py:50 msgid "" "Is er sprake van een controlegroep? (Let op: als de controlegroep ook een " "ander soort taken krijgt, moet je hier een apart traject voor aanmaken)" @@ -107,15 +107,15 @@ msgstr "" "Is there a control group? (If the control receives significantly different " "tasks, it should have its own trajectory)" -#: interventions/models.py:55 +#: interventions/models.py:58 msgid "Geef een beschrijving van de controleinterventie" msgstr "Give a description of the control intervention" -#: interventions/models.py:60 +#: interventions/models.py:63 msgid "Hoe wordt het effect van de interventie gemeten?" msgstr "How will the effect of the intervention be measured?" -#: interventions/models.py:61 +#: interventions/models.py:65 msgid "" "Wanneer je de deelnemer extra taken laat uitvoeren, dus een taak die niet " "behoort tot het reguliere onderwijspakket, dan moet je op de vorige pagina " @@ -125,12 +125,12 @@ msgstr "" "part of the regular educational package, you should also check \"task-based " "research\" on the previous page." -#: interventions/models.py:68 +#: interventions/models.py:73 msgid "Voert de leerling nog een taak uit die niet onder het leerplan valt?" msgstr "" "Does the pupil have to perform a task that is not part of the curriculum?" -#: interventions/models.py:69 +#: interventions/models.py:75 msgid "" "Moet het nog een taak doen, zoals het invullen van een " "(onderzoeks)vragenlijst, die niet binnen de interventie zelf valt?" @@ -138,21 +138,21 @@ msgstr "" "For example, does the pupil have to fill out a (research) questionnaire that " "is not part of intervention?" -#: interventions/models.py:75 +#: interventions/models.py:82 msgid "Hoe vaak per week vindt de interventiesessie plaats?" msgstr "How many times a week will the intervention session take place?" #: interventions/templates/interventions/intervention_form.html:7 -#: interventions/templates/interventions/intervention_form.html:49 -#: proposals/utils/pdf_diff_logic.py:595 +#: interventions/templates/interventions/intervention_form.html:48 +#: proposals/utils/pdf_diff_logic.py:605 msgid "Het interventieonderzoek" msgstr "Intervention study" #: interventions/templates/interventions/intervention_form.html:17 #: main/models.py:50 -#: observations/templates/observations/observation_form.html:27 -#: studies/templates/studies/study_end.html:67 -#: studies/templates/studies/study_end.html:98 +#: observations/templates/observations/observation_form.html:26 +#: studies/templates/studies/study_end.html:65 +#: studies/templates/studies/study_end.html:96 msgid "Setting" msgstr "Setting" @@ -164,7 +164,7 @@ msgstr "Description of the intervention" msgid "Extra taak" msgstr "Extra task" -#: interventions/templates/interventions/intervention_form.html:61 +#: interventions/templates/interventions/intervention_form.html:60 msgid "" "Als je dit nog niet gedaan hebt, zul je op de vorige pagina naast " "\"interventie\" ook \"takenonderzoek\" moeten aanvinken, om je aanvraag " @@ -174,25 +174,25 @@ msgstr "" "research\" on the previous page to answer the required task questions " "related to tasks." -#: interventions/utils.py:11 studies/models.py:254 -#: studies/templates/studies/study_end.html:58 +#: interventions/utils.py:11 studies/models.py:270 +#: studies/templates/studies/study_end.html:56 msgid "Interventieonderzoek" msgstr "Interventional research" -#: interventions/views.py:19 +#: interventions/views.py:20 msgid "Interventie opgeslagen" msgstr "Intervention saved" #: main/forms/conditional_form.py:11 main/forms/conditional_form.py:20 -#: main/forms/conditional_form.py:29 main/forms/conditional_form.py:38 -#: main/forms/conditional_form.py:48 main/forms/mixins.py:83 -#: proposals/forms.py:544 proposals/forms.py:627 proposals/forms.py:642 -#: studies/forms.py:104 tasks/forms.py:87 +#: main/forms/conditional_form.py:31 main/forms/conditional_form.py:42 +#: main/forms/conditional_form.py:58 main/forms/mixins.py:81 +#: proposals/forms.py:614 proposals/forms.py:699 proposals/forms.py:720 +#: studies/forms.py:137 tasks/forms.py:104 msgid "Dit veld is verplicht." msgstr "This field is required." #: main/menus.py:6 main/templates/main/index.html:7 -#: main/templates/main/index.html:56 main/templates/main/landing.html:34 +#: main/templates/main/index.html:53 main/templates/main/landing.html:33 msgid "Startpagina" msgstr "Start page" @@ -200,15 +200,15 @@ msgstr "Start page" msgid "Log in" msgstr "Log in" -#: main/menus.py:16 main/templates/base/login_header.html:7 +#: main/menus.py:17 main/templates/base/login_header.html:7 msgid "Log uit" msgstr "Log out" -#: main/models.py:8 main/utils.py:15 proposals/utils/pdf_diff_logic.py:234 +#: main/models.py:8 main/utils.py:15 proposals/utils/pdf_diff_logic.py:244 msgid "ja" msgstr "yes" -#: main/models.py:9 main/utils.py:15 proposals/utils/pdf_diff_logic.py:234 +#: main/models.py:9 main/utils.py:15 proposals/utils/pdf_diff_logic.py:244 msgid "nee" msgstr "no" @@ -220,13 +220,13 @@ msgstr "uncertain" msgid "Geef aan waar de dataverzameling plaatsvindt" msgstr "Specify where the data collection will take place" -#: main/models.py:63 observations/models.py:129 proposals/models.py:252 -#: studies/models.py:200 studies/models.py:236 tasks/models.py:157 -#: tasks/models.py:169 +#: main/models.py:63 observations/models.py:139 proposals/models.py:282 +#: studies/models.py:211 studies/models.py:253 tasks/models.py:169 +#: tasks/models.py:181 msgid "Namelijk" msgstr "Please specify" -#: main/models.py:68 +#: main/models.py:69 msgid "" "Vindt het afnemen van de taak plaats onder het toeziend oog van de leraar of " "een ander persoon die bevoegd is?" @@ -234,13 +234,13 @@ msgstr "" "Will the task be conducted under the supervision of the teacher or another " "qualified person?" -#: main/models.py:74 +#: main/models.py:76 msgid "Is de testleider in het bezit van een VOG?" msgstr "" "Does the test leader hold a Certificate of Conduct (Verklaring Omtrent " "Gedrag, VOG)?" -#: main/models.py:75 +#: main/models.py:78 msgid "" "Iedereen die op een school werkt moet in het bezit zijn van een " "Verklaring Omtrent Gedrag (VOG, zie >" -msgstr "Save and go to next step >>" - #: main/templates/base/login_header.html:6 msgid "Welkom {}" msgstr "Welcome {}" -#: main/templates/base/sidebar.html:27 +#: main/templates/base/sidebar.html:29 msgid "Toon voortgang" msgstr "Show progress" -#: main/templates/base/sidebar.html:30 +#: main/templates/base/sidebar.html:32 msgid "Sluiten" msgstr "Close" -#: main/templates/base/sidebar.html:31 +#: main/templates/base/sidebar.html:33 msgid "Voortgang" msgstr "Progress" -#: main/templates/base/site_header.html:2 +#: main/templates/base/site_header.html:3 msgid "Portal FETC - Geesteswetenschappen" msgstr "Portal FEtC – Humanities" -#: main/templates/base/site_title.html:2 +#: main/templates/base/site_title.html:3 msgid "FETC-GW" msgstr "FEtC-H" -#: main/templates/error/400.html:10 main/templates/error/500.html:9 +#: main/templates/error/400.html:10 main/templates/error/500.html:8 msgid "Server error" msgstr "Server error" -#: main/templates/error/400.html:13 main/templates/error/500.html:12 +#: main/templates/error/400.html:13 main/templates/error/500.html:10 msgid "Er is een fout opgetreden tijdens het opvragen van deze pagina." msgstr "We encountered an error while processing your request." -#: main/templates/error/400.html:18 main/templates/error/500.html:17 +#: main/templates/error/400.html:18 main/templates/error/500.html:15 msgid "Blijft dit probleem aanhouden?" msgstr "If this problem persists; " -#: main/templates/error/400.html:21 main/templates/error/403.html:41 -#: main/templates/error/403_csrf.html:39 main/templates/error/500.html:20 +#: main/templates/error/400.html:21 main/templates/error/403.html:31 +#: main/templates/error/403_csrf.html:27 main/templates/error/500.html:18 #: reviews/templates/reviews/review_closed.html:37 msgid "" "Neem dan contact op met het technisch beheer van de portal via portalsupport.gw@uu.nl. " -#: main/templates/error/403.html:9 +#: main/templates/error/403.html:8 msgid "Geen toegang" msgstr "Access denied" -#: main/templates/error/403.html:12 +#: main/templates/error/403.html:9 msgid "Je hebt geen toegang tot de opgevraagde pagina." msgstr "You are not allowed to view this page." -#: main/templates/error/403.html:16 +#: main/templates/error/403.html:11 msgid "Dit kan meerdere oorzaken hebben:" msgstr "This may be caused by the following:" -#: main/templates/error/403.html:20 +#: main/templates/error/403.html:13 msgid "Je hebt niet de benodigde rechten om deze pagina te bekijken;" msgstr "You don't have the required permissions to view this page;" -#: main/templates/error/403.html:23 +#: main/templates/error/403.html:14 msgid "Je bent niet als mede-onderzoeker opgegeven voor deze aanvraag;" msgstr "You have not been added as a researcher to this application;" -#: main/templates/error/403.html:26 +#: main/templates/error/403.html:16 msgid "" "Je probeert een door jou eerder genomen beslissing aan te passen, maar de " "beoordelingsperiode is verstreken." @@ -477,14 +473,14 @@ msgstr "" "You are trying to change one of your decisions, but the assessment period " "has expired." -#: main/templates/error/403.html:32 +#: main/templates/error/403.html:22 #, python-format msgid "" -"Je bent niet ingelogd, probeer in te loggen." +"Je bent niet ingelogd, probeer in te loggen." msgstr "" -"You are not logged in, please try to log in." +"You are not logged in, please ." -#: main/templates/error/403.html:38 main/templates/error/403_csrf.html:36 +#: main/templates/error/403.html:28 main/templates/error/403_csrf.html:24 #: reviews/templates/reviews/review_closed.html:34 msgid "Denk je dat dit niet klopt?" msgstr "Do you think this is in error?" @@ -493,15 +489,15 @@ msgstr "Do you think this is in error?" msgid "Verificatie Fout" msgstr "Verification Error" -#: main/templates/error/403_csrf.html:13 +#: main/templates/error/403_csrf.html:12 msgid "Verzoek kon niet geverifieerd worden" msgstr "Request could not be verified" -#: main/templates/error/403_csrf.html:16 +#: main/templates/error/403_csrf.html:13 msgid "Er is iets fout gegaan met het verifiëren van je browser." msgstr "Something went wrong while verifying your browser" -#: main/templates/error/403_csrf.html:19 +#: main/templates/error/403_csrf.html:15 msgid "" "Dit kan meerdere oorzaken hebben, zoals het gebruik van een script- of ad-" "blocker, of je cookie-instellingen. Probeer eerst een volledige " @@ -510,33 +506,33 @@ msgstr "" "This can have several causes, like using a script- or ad-blocker, or your " "cookie settings. First try a fresh refresh of the page:" -#: main/templates/error/403_csrf.html:23 +#: main/templates/error/403_csrf.html:18 msgid "Voor Chrome: ctrl + F5 (Windows) of cmd + shift + R (Mac)" msgstr "For Chrome: ctrl + F5 (Windows) or cmd + shift + R (Mac)" -#: main/templates/error/403_csrf.html:26 +#: main/templates/error/403_csrf.html:19 msgid "Voor Firefox: ctrl + shift + R (Windows) of cmd + shift + R (Mac)" msgstr "For Firefox: ctrl + shift + R (Windows) or cmd + shift + R (Mac)" -#: main/templates/error/403_csrf.html:29 +#: main/templates/error/403_csrf.html:20 msgid "Voor Edge: ctrl + F5" msgstr "For Edge: ctrl + F5" -#: main/templates/error/403_csrf.html:32 +#: main/templates/error/403_csrf.html:21 msgid "Voor Safari: option + cmnd + E" msgstr "For Safari: option + cmnd + E" -#: main/templates/error/404.html:9 +#: main/templates/error/404.html:8 msgid "Pagina niet gevonden" msgstr "Page not found" -#: main/templates/error/404.html:12 +#: main/templates/error/404.html:9 msgid "Sorry, deze pagina is helaas niet (meer) beschikbaar." msgstr "" "We are sorry but the page (or document) you have requested is currently not " "available." -#: main/templates/error/404.html:15 +#: main/templates/error/404.html:11 msgid "" "Mogelijk ben je hier terechtgekomen via een verouderde of foutieve link. " "Graag vernemen wij welke link niet werkt. Je kan ons dat laten weten door contacting our secretary. We will try to solve the problem as soon as possible." -#: main/templates/error/500.html:23 +#: main/templates/error/500.html:21 msgid "" "Maak hierbij zo veel mogelijk duidelijk wat je aan het doen was, en op welke " "pagina." @@ -564,16 +560,16 @@ msgstr "" "This portal is intended for employees (and students) of the Faculty of " "Humanities." -#: main/templates/main/index.html:24 +#: main/templates/main/index.html:23 msgid "Volgens onze gegevens werk/studeer je bij de" msgstr "According to our information, you work/study at the" -#: main/templates/main/index.html:29 +#: main/templates/main/index.html:28 msgid "" "Volgens onze gegevens werk/studeer je bij een andere faculteit of dienst." msgstr "According to our data, you work/study at another faculty or service." -#: main/templates/main/index.html:34 +#: main/templates/main/index.html:32 msgid "" "Controleer of je inderdaad een aanvraag wilt indienen bij de Facultaire " "Ethische Toetsingscommissie van Geesteswetenschappen." @@ -581,7 +577,7 @@ msgstr "" "Please check whether you indeed want to submit an application to the Faculty " "Ethics Assessment Committee – Humanities." -#: main/templates/main/index.html:39 +#: main/templates/main/index.html:37 msgid "" "Als je vermoedt dat dit incorrect is, neem dan contact op met portalsupport.gw@uu.nl." @@ -589,7 +585,7 @@ msgstr "" "If you suspect this is incorrect, please contact support at portalsupport.gw@uu.nl. " -#: main/templates/main/index.html:64 +#: main/templates/main/index.html:59 msgid "" "Formele goedkeuring door één van beide kamers van de FETC-GW (middels een " "formele goedkeuringsbrief) is vereist voor mensgebonden onderzoek binnen de " @@ -604,7 +600,7 @@ msgstr "" "even to recruiting participants. Therefore, always wait for the letter of " "approval before starting research activities." -#: main/templates/main/index.html:71 +#: main/templates/main/index.html:64 msgid "" "NB: Goedgekeurde aanvragen komen in het archief van deze portal te staan, " "zie het menu hierboven. Dit archief is toegankelijk voor iedereen met een " @@ -614,7 +610,7 @@ msgstr "" "studying or working at the Faculty of Humanities with a Solis-ID can access " "this archive through the menu bar above." -#: main/templates/main/index.html:79 +#: main/templates/main/index.html:69 msgid "" "Heb je een vraag over de werking van de portal, ontdek je een foutje, " "missende functionaliteit, of verkeerde vertaling? Neem dan contact op met " @@ -625,23 +621,23 @@ msgstr "" "email to portalsupport.gw@uu.nl." -#: main/templates/main/index.html:86 +#: main/templates/main/index.html:75 #: proposals/templates/proposals/proposal_start.html:16 -#: proposals/templates/proposals/proposal_start_practice.html:18 +#: proposals/templates/proposals/proposal_start_practice.html:16 msgid "Check voor het indienen:" msgstr "Before submitting an application, please consult:" -#: main/templates/main/index.html:89 +#: main/templates/main/index.html:78 #: proposals/templates/proposals/proposal_start.html:19 -#: proposals/templates/proposals/proposal_start_practice.html:21 +#: proposals/templates/proposals/proposal_start_practice.html:19 msgid "" -"De UU-webpagina " +"De UU-webpagina " "van de FETC-GW voor nieuws en de agenda." msgstr "" "The UU-" "webpage of the FEtC-H for news and upcoming dates." -#: main/templates/main/index.html:96 +#: main/templates/main/index.html:84 msgid "" "Het reglement van de FETC-GW." @@ -649,26 +645,26 @@ msgstr "" "The regulations of the FEtC-H ." -#: main/templates/main/index.html:102 +#: main/templates/main/index.html:90 msgid "" "Gebruik de juiste (meest recente) voorbeelddocumenten voor de informed consent. " -"(de laatstse versie is van december 2021)" +"(de laatstse versie is van december 2021) " msgstr "" "Make sure to use the correct (most recent) model documents for informed consent. (Latest " "version: December 2021)" -#: main/templates/main/index.html:106 +#: main/templates/main/index.html:96 msgid "" -"
    • Voor advies over data management (plannen): datamanagement.gw@uu.nl.
    • Voor advies " -"over privacy zaken: privacy.gw@uu.nl." -"
    • Voor vragen over de procedure: Desiree Capel.
    • Voor vragen over de portal zelf: portalsupport.gw@uu.nl.
    • " +"
    • Voor advies over data management (plannen): datamanagement.gw@uu.nl.
    • Voor " +"advies over privacy zaken: privacy.gw@uu." +"nl.
    • Voor vragen over de procedure: Desiree Capel.
    • Voor vragen over de portal zelf: portalsupport.gw@uu.nl.
    • " msgstr "" "
    • For advice on data management: datamanagement.gw@uu.nl.
    • For issues concerning privacy: portalsupport.gw@uu.nl." "
    • " -#: main/templates/main/index.html:115 +#: main/templates/main/index.html:112 msgid "In deze portal kan je het volgende doen:" msgstr "In this portal you can do the following:" -#: main/templates/main/index.html:124 +#: main/templates/main/index.html:120 msgid "Dien een nieuwe aanvraag in" msgstr "Submit a new proposal" -#: main/templates/main/index.html:129 +#: main/templates/main/index.html:124 msgid "die volledig nieuw is in deze portal;" msgstr "that is completely new in this portal;" -#: main/templates/main/index.html:132 +#: main/templates/main/index.html:127 msgid "op basis van een kopie van een oude aanvraag;" msgstr "from a copy of an old proposal;" -#: main/templates/main/index.html:135 +#: main/templates/main/index.html:130 msgid "voor (al dan niet goedgekeurde) subsidieaanvragen;" msgstr "to supplement a grant application" -#: main/templates/main/index.html:138 +#: main/templates/main/index.html:133 msgid "die al goedgekeurd is door een andere ethische toetsingscomissie." msgstr "that has been approved by another ethics committee." -#: main/templates/main/index.html:144 +#: main/templates/main/index.html:138 msgid "Een aanvraag reviseren" msgstr "Revise a proposal" -#: main/templates/main/index.html:149 +#: main/templates/main/index.html:142 msgid "als een revisie, gebaseerd op opmerkingen van de FETC-GW;" msgstr "as a revision, based on comments of the FEtC-H;" -#: main/templates/main/index.html:152 +#: main/templates/main/index.html:145 msgid "als amendement, wanneer de aanvraag al goedgekeurd is door de FETC-GW." msgstr "" "as an amendment, after your proposal has already been approved by the FEtC-H." -#: main/templates/main/index.html:160 +#: main/templates/main/index.html:152 msgid "Bekijk" msgstr "View" -#: main/templates/main/index.html:164 +#: main/templates/main/index.html:155 msgid "mijn conceptaanvragen;" msgstr "my draft applications;" -#: main/templates/main/index.html:167 +#: main/templates/main/index.html:158 msgid "mijn oefenaanvragen;" msgstr "my practice applications;" -#: main/templates/main/index.html:170 +#: main/templates/main/index.html:161 msgid "mijn ingediende aanvragen;" msgstr "my submitted applications;" -#: main/templates/main/index.html:173 +#: main/templates/main/index.html:164 msgid "mijn afgehandelde aanvragen;" msgstr "my processed applications;" -#: main/templates/main/index.html:176 +#: main/templates/main/index.html:167 msgid "mijn aanvragen als eindverantwoordelijke;" msgstr "my supervised applications;" -#: main/templates/main/index.html:179 +#: main/templates/main/index.html:170 msgid "al mijn aanvragen." msgstr "all my applications" -#: main/templates/main/index.html:183 +#: main/templates/main/index.html:173 msgid "FETC-GW archief" msgstr "FEtC-H archive" -#: main/templates/main/index.html:187 +#: main/templates/main/index.html:176 msgid "Alle goedgekeurde aanvragen bekijken van de Algemene Kamer" msgstr "View all processed and approved applications of the General Chamber" -#: main/templates/main/index.html:190 +#: main/templates/main/index.html:179 msgid "Alle goedgekeurde aanvragen bekijken van de Linguïstiek Kamer" msgstr "" "View all processed and approved applications of the Linguistics Chamber" -#: main/templates/main/index.html:205 +#: main/templates/main/index.html:190 msgid "Reglement van de FETC-GW" msgstr "Regulations of the FEtC-H" -#: main/templates/main/index.html:212 +#: main/templates/main/index.html:197 msgid "Veelgestelde vragen m.b.t. dit portal" msgstr "Frequently asked questions relating to this portal" -#: main/templates/main/index.html:222 +#: main/templates/main/index.html:204 msgid "Bannerfoto door Kim O'leary" msgstr "Cover image by Kim O'leary" -#: main/templates/main/landing.html:52 +#: main/templates/main/landing.html:50 msgid "" "Welkom bij het portal van de Facultaire Ethische Toetsingscommissie " "Geesteswetenschappen (FETC-GW)." @@ -776,8 +772,8 @@ msgstr "" "Welcome to the portal of the Faculty Ethics assessment Committee Humanities " "(FEtC-H)" -#: main/templates/main/landing.html:58 -#: main/templates/registration/logged_out.html:22 +#: main/templates/main/landing.html:56 +#: main/templates/registration/logged_out.html:18 msgid "" "Klik hier om terug te keren naar " "de FETC-GW-website." @@ -785,25 +781,25 @@ msgstr "" "Click here to return to the " "FEtC-H website." -#: main/templates/main/landing.html:62 +#: main/templates/main/landing.html:60 msgid "Contact" msgstr "Contact" -#: main/templates/main/landing.html:64 +#: main/templates/main/landing.html:62 msgid "Secretaris FETC-GW" msgstr "FEtC-H Secretary" -#: main/templates/main/landing.html:66 main/templates/main/landing.html:72 +#: main/templates/main/landing.html:65 main/templates/main/landing.html:72 msgid "Om hier een e-mail adres te zien moet Javascript aan staan" msgstr "Javascript needs to be enabled to see the email address" -#: main/templates/main/landing.html:70 +#: main/templates/main/landing.html:69 msgid "Technische ondersteuning" msgstr "Technical support" #: main/templates/main/landing.html:77 -#: main/templates/registration/login.html:15 -#: main/templates/registration/login.html:32 +#: main/templates/registration/login.html:14 +#: main/templates/registration/login.html:37 msgid "Inloggen" msgstr "Log in" @@ -815,59 +811,59 @@ msgstr "" "You need a Solis-ID to log in. If you do not have a Solis ID, please contact " "the secretary of the FEtC-H." -#: main/templates/main/landing.html:86 main/templates/main/landing.html:93 +#: main/templates/main/landing.html:87 main/templates/main/landing.html:96 msgid "Log in met je Solis-ID" msgstr "Log in with your Solis-ID" -#: main/templates/registration/logged_out.html:9 +#: main/templates/registration/logged_out.html:8 msgid "Uitloggen" msgstr "Log out" -#: main/templates/registration/logged_out.html:12 +#: main/templates/registration/logged_out.html:9 msgid "Je bent succesvol uitgelogd." msgstr "You have logged out succesfully" -#: main/templates/registration/logged_out.html:17 +#: main/templates/registration/logged_out.html:13 #, python-format msgid "" "Klik hier om naar de startpagina te gaan." msgstr "" "Click here to return to the start page." -#: main/templates/registration/login.html:23 +#: main/templates/registration/login.html:20 msgid "" "Gebruikersnaam of wachtwoord incorrect. Probeer het alstublieft opnieuw." msgstr "Username or password incorrect. Please try again." -#: main/templates/registration/login.html:27 +#: main/templates/registration/login.html:22 msgid "Je kan hier inloggen met je Solis-ID en wachtwoord." msgstr "You can log in here with your Solis-ID and password." -#: main/templates/registration/login.html:30 +#: main/templates/registration/login.html:29 msgid "Gebruikersnaam" msgstr "Username" -#: main/templates/registration/login.html:31 +#: main/templates/registration/login.html:35 msgid "Wachtwoord" msgstr "Password" -#: main/templatetags/compare_tags.py:80 +#: main/templatetags/compare_tags.py:63 #: proposals/templates/proposals/vue_templates/proposal_list.html:51 -#: reviews/templates/reviews/review_detail_sidebar.html:34 -#: reviews/templates/reviews/simple_compare_link.html:8 +#: reviews/templates/reviews/review_detail_sidebar.html:30 +#: reviews/templates/reviews/simple_compare_link.html:7 #: reviews/templates/reviews/vue_templates/decision_list.html:53 #: reviews/templates/reviews/vue_templates/review_list.html:54 msgid "Toon verschillen" msgstr "Show differences" -#: main/validators.py:14 +#: main/validators.py:17 #, python-format msgid "Dit veld mag maximaal %(limit_value)d woord bevatten." msgid_plural "Dit veld mag maximaal %(limit_value)d woorden bevatten." msgstr[0] "This field can contain a maximum of %(limit_value)d word." msgstr[1] "This field can contain a maximum of %(limit_value)d words." -#: main/validators.py:23 +#: main/validators.py:28 msgid "Alleen .pdf- of .doc(x)-bestanden zijn toegestaan." msgstr "Only .pdf or .doc(x) files are accepted." @@ -886,11 +882,11 @@ msgstr "" "will be observed. For example: The teacher will be observed. The observation " "of interest is the interaction between the teacher and their pupils." -#: observations/models.py:40 +#: observations/models.py:41 msgid "Beschrijf waarom er wordt geobserveerd." msgstr "Describe why the participant will be observed." -#: observations/models.py:42 +#: observations/models.py:43 msgid "" "Wat is het doel van de observatie? Bijvoorbeeld: Het doel van de observatie " "is inzicht te krijgen in hoe de leerkracht omgaat met de uitleg van de " @@ -902,42 +898,42 @@ msgstr "" "method. One question to be answered will be whether the teachers explain the " "new method well in understandable language." -#: observations/models.py:51 +#: observations/models.py:52 msgid "Beschrijf hoe vaak en hoe lang de observant wordt geobserveerd." msgstr "" "Describe how often and how long the participant will be observed." -#: observations/models.py:52 +#: observations/models.py:54 msgid "" "Bijvoorbeeld: De leraar zal 5 lessen van 45 minuten worden geobserveerd." msgstr "" "For example: Each teacher will be observed during 5 lessons of 45 minutes." -#: observations/models.py:58 +#: observations/models.py:61 msgid "Wordt er anoniem geobserveerd?" msgstr "Will the observation be anonymous?" -#: observations/models.py:60 +#: observations/models.py:63 msgid "" "Zoals zou kunnen voorkomen op fora en de onderzoeker ook een account heeft." msgstr "As might happen on forums where the researcher also has an account." -#: observations/models.py:65 observations/models.py:75 -#: observations/models.py:88 proposals/models.py:742 studies/models.py:164 -#: studies/models.py:220 studies/models.py:350 +#: observations/models.py:69 observations/models.py:79 +#: observations/models.py:94 proposals/models.py:793 studies/models.py:170 +#: studies/models.py:232 studies/models.py:392 msgid "Licht toe" msgstr "Explain" -#: observations/models.py:70 +#: observations/models.py:74 msgid "Doet de onderzoeker zich voor als behorende tot de doelgroep?" msgstr "" "Will the researcher present themselves as belonging to the target group?" -#: observations/models.py:80 +#: observations/models.py:84 msgid "Wordt er geobserveerd in een niet-openbare ruimte?" msgstr "Will observations be made in a non-public space?" -#: observations/models.py:81 +#: observations/models.py:86 msgid "" "Bijvoorbeeld er wordt geobserveerd bij iemand thuis, tijdens een " "hypotheekgesprek, tijdens politieverhoren of een forum waar een account voor " @@ -947,11 +943,11 @@ msgstr "" "negotiation, during a police interrogation or in a forum for which an " "account must be created." -#: observations/models.py:93 +#: observations/models.py:99 msgid "Vindt informed consent van tevoren plaats?" msgstr "Will informed consent take place beforehand?" -#: observations/models.py:99 +#: observations/models.py:105 msgid "" "Leg uit waarom informed consent niet van te voren plaatsvindt en geef ook op " "welke wijze dit achteraf verzorgd wordt." @@ -959,7 +955,7 @@ msgstr "" "Please explain why informed consent is not taken beforehand and how it will " "be taken afterwards." -#: observations/models.py:106 +#: observations/models.py:113 msgid "" "Heb je toestemming nodig van een (samenwerkende) instantie om deze " "observatie te mogen uitvoeren?" @@ -967,15 +963,15 @@ msgstr "" "Do you need permission from a (collaborating) institution in order to carry " "out this observation?" -#: observations/models.py:112 +#: observations/models.py:120 msgid "Welke instantie?" msgstr "Which institution?" -#: observations/models.py:118 +#: observations/models.py:126 msgid "Upload hier het toestemmingsdocument (in .pdf of .doc(x)-formaat)" msgstr "Upload the permission document (in .pdf or .doc(x)-format) here" -#: observations/models.py:125 +#: observations/models.py:134 msgid "" "Opnames zijn nooit anoniem en niet te anonimiseren. Let hierop bij het " "gebruik van de term ‘anoniem’ of ‘geanonimiseerd’ in je documenten voor " @@ -993,55 +989,55 @@ msgstr "" "versie-1.1_21dec2021.pdf' target='_blank'>Guidelines for Informed Consent, " "‘Audio and Video’." -#: observations/models.py:126 +#: observations/models.py:136 msgid "Hoe wordt het gedrag geregistreerd?" msgstr "How will the behaviour be recorded?" -#: observations/models.py:135 +#: observations/models.py:143 msgid "Op hoeveel dagen wordt er geobserveerd (per deelnemer)?" msgstr "How many days will observations be taken on (per participant)?" -#: observations/models.py:139 +#: observations/models.py:148 msgid "Hoeveel uur wordt er gemiddeld per dag geobserveerd?" msgstr "How many hours of observation will take place on average per day?" #: observations/templates/observations/observation_form.html:7 -#: observations/templates/observations/observation_form.html:44 -#: proposals/utils/pdf_diff_logic.py:651 +#: observations/templates/observations/observation_form.html:42 +#: proposals/utils/pdf_diff_logic.py:661 msgid "Het observatieonderzoek" msgstr "Observational study" -#: observations/templates/observations/observation_form.html:28 +#: observations/templates/observations/observation_form.html:27 msgid "Details observatie" msgstr "Details of observation" -#: observations/templates/observations/observation_form.html:29 +#: observations/templates/observations/observation_form.html:28 msgid "Anonimiteit" msgstr "Anonymity" -#: observations/templates/observations/observation_form.html:30 +#: observations/templates/observations/observation_form.html:29 msgid "Toestemming" msgstr "Permission" -#: observations/templates/observations/observation_form.html:31 +#: observations/templates/observations/observation_form.html:30 msgid "Registratie gedrag" msgstr "Recording behaviour" #: observations/templates/observations/observation_update_attachments.html:7 -#: observations/templates/observations/observation_update_attachments.html:27 -#: observations/templates/observations/observation_update_attachments.html:38 +#: observations/templates/observations/observation_update_attachments.html:26 +#: observations/templates/observations/observation_update_attachments.html:41 #: proposals/templates/proposals/proposal_update_attachments.html:7 -#: proposals/templates/proposals/proposal_update_attachments.html:14 -#: proposals/templates/proposals/proposal_update_attachments.html:25 +#: proposals/templates/proposals/proposal_update_attachments.html:13 +#: proposals/templates/proposals/proposal_update_attachments.html:28 #: proposals/templates/proposals/proposal_update_date_start.html:7 #: studies/templates/studies/study_update_attachments.html:7 -#: studies/templates/studies/study_update_attachments.html:14 -#: studies/templates/studies/study_update_attachments.html:25 +#: studies/templates/studies/study_update_attachments.html:13 +#: studies/templates/studies/study_update_attachments.html:28 msgid "Formulieren aanpassen" msgstr "Change forms" -#: observations/templates/observations/observation_update_attachments.html:30 -#: studies/templates/studies/study_update_attachments.html:17 +#: observations/templates/observations/observation_update_attachments.html:28 +#: studies/templates/studies/study_update_attachments.html:15 #, python-format msgid "" "Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag " @@ -1050,47 +1046,47 @@ msgstr "" "On this page you can edit the forms related to the proposal " "%(title)s(reference number %(ref_number)s), trajectory %(order)s." -#: observations/templates/observations/observation_update_attachments.html:39 -#: proposals/templates/proposals/proposal_confirmation.html:36 -#: proposals/templates/proposals/proposal_diff.html:58 -#: proposals/templates/proposals/proposal_update_attachments.html:26 -#: proposals/templates/proposals/proposal_update_date_start.html:29 -#: reviews/templates/reviews/change_chamber_form.html:19 -#: reviews/templates/reviews/decision_form.html:90 +#: observations/templates/observations/observation_update_attachments.html:43 +#: proposals/templates/proposals/proposal_confirmation.html:39 +#: proposals/templates/proposals/proposal_diff.html:55 +#: proposals/templates/proposals/proposal_update_attachments.html:30 +#: proposals/templates/proposals/proposal_update_date_start.html:33 +#: reviews/templates/reviews/change_chamber_form.html:23 +#: reviews/templates/reviews/decision_form.html:93 #: reviews/templates/reviews/review_assign_form.html:46 -#: reviews/templates/reviews/review_close_form.html:41 -#: reviews/templates/reviews/review_discontinue_form.html:72 -#: studies/templates/studies/study_update_attachments.html:26 +#: reviews/templates/reviews/review_close_form.html:40 +#: reviews/templates/reviews/review_discontinue_form.html:70 +#: studies/templates/studies/study_update_attachments.html:30 msgid "Terug naar de vorige pagina" msgstr "Back to the previous page" -#: observations/utils.py:8 studies/models.py:257 -#: studies/templates/studies/study_end.html:89 +#: observations/utils.py:8 studies/models.py:271 +#: studies/templates/studies/study_end.html:87 msgid "Observatieonderzoek" msgstr "Observational research" -#: observations/views.py:20 +#: observations/views.py:21 msgid "Observatie opgeslagen" msgstr "Observation saved" -#: proposals/api/views.py:28 proposals/api/views.py:130 -#: proposals/api/views.py:176 +#: proposals/api/views.py:23 proposals/api/views.py:116 +#: proposals/api/views.py:147 msgid "Datum afgerond" msgstr "Date reviewed" -#: proposals/api/views.py:32 proposals/api/views.py:77 -#: proposals/api/views.py:96 proposals/api/views.py:134 -#: proposals/api/views.py:155 +#: proposals/api/views.py:24 proposals/api/views.py:77 +#: proposals/api/views.py:90 proposals/api/views.py:117 +#: proposals/api/views.py:133 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:71 #: proposals/templates/proposals/vue_templates/proposal_list.html:116 msgid "Laatst bijgewerkt" msgstr "Last edited" -#: proposals/api/views.py:126 +#: proposals/api/views.py:114 msgid "Datum ingediend bij eindverantwoordelijke" msgstr "Date sent to supervisor" -#: proposals/forms.py:43 proposals/models.py:218 +#: proposals/forms.py:58 proposals/models.py:242 msgid "" "Zijn er nog andere onderzoekers bij deze aanvraag betrokken die " "niet geaffilieerd zijn aan een van de onderzoeksinstituten " @@ -1099,19 +1095,19 @@ msgstr "" "Are there any other researchers involved outside the above-" "mentioned institutes? " -#: proposals/forms.py:64 proposals/validators.py:25 +#: proposals/forms.py:79 proposals/validators.py:22 msgid "Er bestaat al een aanvraag met deze titel." msgstr "There is an existing application with this title." -#: proposals/forms.py:134 +#: proposals/forms.py:144 msgid "Selecteer..." msgstr "Select..." -#: proposals/forms.py:141 +#: proposals/forms.py:153 msgid "Docent" msgstr "Professor" -#: proposals/forms.py:142 +#: proposals/forms.py:155 msgid "" "Vul hier de docent van de cursus in waarbinnen je deze portal moet " "doorlopen. De docent kan na afloop de aanvraag inkijken in de portal. De " @@ -1122,23 +1118,23 @@ msgstr "" "This application will not be published in the semipublic archive of the FEtC-" "H." -#: proposals/forms.py:193 +#: proposals/forms.py:207 msgid "Je dient een promotor/begeleider op te geven." msgstr "You are required to specify a promotor/supervisor." -#: proposals/forms.py:200 +#: proposals/forms.py:213 msgid "Je kunt niet jezelf als promotor/begeleider opgeven." msgstr "You cannot submit yourself as the promotor/supervisor." -#: proposals/forms.py:214 +#: proposals/forms.py:227 msgid "Je hebt jezelf niet als onderzoekers geselecteerd." msgstr "You have not selected yourself." -#: proposals/forms.py:219 +#: proposals/forms.py:232 msgid "Je hebt geen andere onderzoekers geselecteerd." msgstr "You have not selected any other researchers." -#: proposals/forms.py:229 +#: proposals/forms.py:243 msgid "" "Dit veld is verplicht, maar je kunt later terugkomen om " "hem verder in te vullen." @@ -1146,7 +1142,7 @@ msgstr "" "This field is required, but you may choose to come back to this page later " "to fill it in." -#: proposals/forms.py:239 +#: proposals/forms.py:254 msgid "" "Indien je geen toestemming hebt van een andere ethische commissie, dien je " "het normale formulier in te vullen. Ga terug naar de startpagina, en " @@ -1159,23 +1155,23 @@ msgstr "" "page, and select \"Submit a new application that is completely new in this " "portal\" or \"from a copy of an old application.\"" -#: proposals/forms.py:266 +#: proposals/forms.py:286 msgid "Ik maak een oefenaanvraag aan" msgstr "I am creating a practice application" -#: proposals/forms.py:281 proposals/models.py:535 +#: proposals/forms.py:302 proposals/models.py:586 msgid "Te kopiëren aanvraag" msgstr "Application to be copied" -#: proposals/forms.py:283 proposals/models.py:537 +#: proposals/forms.py:304 proposals/models.py:588 msgid "Dit veld toont enkel aanvragen waar je zelf een medeuitvoerende bent." msgstr "This field shows only applications in which you are involved." -#: proposals/forms.py:321 +#: proposals/forms.py:346 msgid "Te reviseren aanvraag" msgstr "Application to be revised" -#: proposals/forms.py:322 +#: proposals/forms.py:348 msgid "" "Dit veld toont enkel ingediende, (nog) niet goedgekeurde aanvragen waar jij " "een medeuitvoerende bent." @@ -1183,70 +1179,70 @@ msgstr "" "This field only shows submitted applications that have not been approved " "(yet) in which you are involved." -#: proposals/forms.py:346 +#: proposals/forms.py:379 msgid "Te amenderen aanvraag" msgstr "Application to be amended" -#: proposals/forms.py:347 +#: proposals/forms.py:381 msgid "" "Dit veld toont enkel goedgekeurde aanvragen waar je zelf een medeuitvoerende " "bent." msgstr "This field shows only approved applications in which you are involved." -#: proposals/forms.py:402 proposals/forms.py:532 proposals/forms.py:561 -#: proposals/forms.py:675 +#: proposals/forms.py:439 proposals/forms.py:598 proposals/forms.py:630 +#: proposals/forms.py:752 msgid "Dit veld is verplicht om verder te gaan." msgstr "This field is required to continue." -#: proposals/forms.py:410 +#: proposals/forms.py:449 msgid "Je dient een instelling op te geven." msgstr "You are required to specify an institution." -#: proposals/forms.py:468 +#: proposals/forms.py:515 msgid "In dit geval is een beslissing van een METC vereist" msgstr "In this case, a decision by a METC is required" -#: proposals/forms.py:476 +#: proposals/forms.py:524 msgid "Naam traject 1" msgstr "Title of trajectory 1" -#: proposals/forms.py:478 +#: proposals/forms.py:527 msgid "Naam traject 2" msgstr "Title of trajectory 2" -#: proposals/forms.py:480 +#: proposals/forms.py:530 msgid "Naam traject 3" msgstr "Title of trajectory 3" -#: proposals/forms.py:482 +#: proposals/forms.py:533 msgid "Naam traject 4" msgstr "Title of trajectory 4" -#: proposals/forms.py:484 +#: proposals/forms.py:536 msgid "Naam traject 5" msgstr "Title of trajectory 5" -#: proposals/forms.py:486 +#: proposals/forms.py:539 msgid "Naam traject 6" msgstr "Title of trajectory 6" -#: proposals/forms.py:488 +#: proposals/forms.py:542 msgid "Naam traject 7" msgstr "Title of trajectory 7" -#: proposals/forms.py:490 +#: proposals/forms.py:545 msgid "Naam traject 8" msgstr "Title of trajectory 8" -#: proposals/forms.py:492 +#: proposals/forms.py:548 msgid "Naam traject 9" msgstr "Title of trajectory 9" -#: proposals/forms.py:494 +#: proposals/forms.py:551 msgid "Naam traject 10" msgstr "Title of trajectory 10" -#: proposals/forms.py:538 +#: proposals/forms.py:606 msgid "" "Als niet dezelfde trajecten worden doorlopen, moeten er minstens twee " "verschillende trajecten zijn." @@ -1254,19 +1250,19 @@ msgstr "" "If different trajectories are used, at least two different trajectories " "should be filled in." -#: proposals/forms.py:572 +#: proposals/forms.py:641 msgid "Nieuwe beoogde startdatum" msgstr "New intended start date" -#: proposals/forms.py:634 +#: proposals/forms.py:708 msgid "Toestemmingsverklaring voor traject {} nog niet toegevoegd." msgstr "Declaration of consent for trajectory {} not yet added." -#: proposals/forms.py:638 +#: proposals/forms.py:715 msgid "Informatiebrief voor traject {} nog niet toegevoegd." msgstr "Information letter for trajectory {} not yet added." -#: proposals/forms.py:650 +#: proposals/forms.py:729 msgid "" "De embargo-periode kan maximaal 2 jaar zijn. Kies een datum binnen 2 jaar " "van vandaag." @@ -1274,7 +1270,7 @@ msgstr "" "The embargo-period can last a maximum of 2 years. Pick a date within 2 years " "from today." -#: proposals/forms.py:681 +#: proposals/forms.py:761 msgid "Vul in in welke talen de formulieren worden vertaald." msgstr "Please fill in the languages" @@ -1291,112 +1287,112 @@ msgid "" "Nieuwe aanvraag starten voor (al dan niet goedgekeurde) subsidieaanvragen" msgstr "Start a new application to supplement a grant application" -#: proposals/menus.py:21 +#: proposals/menus.py:22 msgid "" "Nieuwe aanvraag starten (die al goedgekeurd is door een andere ethische " "toetsingscomissie)" msgstr "" "Start a new application (that has been approved by another ethics committee)" -#: proposals/menus.py:26 +#: proposals/menus.py:28 msgid "Nieuwe oefenaanvraag starten" msgstr "Start a new practice application" -#: proposals/menus.py:30 +#: proposals/menus.py:32 msgid "Maak een revisie van een bestaande aanvraag" msgstr "Create a revision for an existing application" -#: proposals/menus.py:34 +#: proposals/menus.py:36 msgid "Maak een amendement van een al goedgekeurde aanvraag" msgstr "Create an amendment to an already approved application" -#: proposals/menus.py:42 +#: proposals/menus.py:44 msgid "Nieuwe aanvraag" msgstr "New application" -#: proposals/menus.py:52 +#: proposals/menus.py:54 msgid "Al mijn aanvragen" msgstr "All my applications" -#: proposals/menus.py:56 proposals/views/proposal_views.py:78 +#: proposals/menus.py:58 proposals/views/proposal_views.py:98 msgid "Mijn conceptaanvragen" msgstr "My draft applications" -#: proposals/menus.py:60 proposals/views/proposal_views.py:128 +#: proposals/menus.py:62 proposals/views/proposal_views.py:157 msgid "Mijn oefenaanvragen" msgstr "My practice applications" -#: proposals/menus.py:64 proposals/views/proposal_views.py:90 +#: proposals/menus.py:66 proposals/views/proposal_views.py:112 msgid "Mijn ingediende aanvragen" msgstr "My submitted applications" -#: proposals/menus.py:68 proposals/views/proposal_views.py:102 +#: proposals/menus.py:70 proposals/views/proposal_views.py:126 msgid "Mijn afgehandelde aanvragen" msgstr "My processed applications" -#: proposals/menus.py:72 proposals/views/proposal_views.py:114 +#: proposals/menus.py:74 proposals/views/proposal_views.py:140 msgid "Mijn aanvragen als eindverantwoordelijke" msgstr "My supervised applications" -#: proposals/menus.py:80 +#: proposals/menus.py:82 msgid "Mijn aanvragen" msgstr "My applications" -#: proposals/menus.py:90 +#: proposals/menus.py:92 msgid "Bekijk alle goedgekeurde aanvragen van de Algemene Kamer" msgstr "View all approved applications of the General Chamber" -#: proposals/menus.py:95 +#: proposals/menus.py:97 msgid "Bekijk alle goedgekeurde aanvragen van de Linguïstiek Kamer" msgstr "View all approved applications of the Linguistics Chamber" -#: proposals/menus.py:100 +#: proposals/menus.py:102 msgid "Site-export" msgstr "Site-export" -#: proposals/menus.py:110 proposals/views/proposal_views.py:155 +#: proposals/menus.py:112 proposals/views/proposal_views.py:185 msgid "Archief" msgstr "Archive" -#: proposals/mixins.py:20 +#: proposals/mixins.py:21 #, python-format msgid "Aanvraag %(title)s bewerkt" msgstr "Application %(title)s edited" -#: proposals/models.py:137 +#: proposals/models.py:152 msgid "Concept" msgstr "Draft" -#: proposals/models.py:138 +#: proposals/models.py:154 msgid "Opgestuurd ter beoordeling door eindverantwoordelijke" msgstr "Sent for assessment by the researcher with final responsibility" -#: proposals/models.py:139 +#: proposals/models.py:156 msgid "Opgestuurd ter beoordeling door FETC-GW" msgstr "Sent for assessment by FEtC-H" -#: proposals/models.py:140 proposals/models.py:141 +#: proposals/models.py:157 proposals/models.py:158 msgid "Aanvraag is beoordeeld door FETC-GW" msgstr "Application has been assessed by FEtC-H" -#: proposals/models.py:144 +#: proposals/models.py:161 msgid "om de portal te exploreren" msgstr "to explore the portal" -#: proposals/models.py:145 +#: proposals/models.py:162 msgid "in het kader van een cursus" msgstr "in the context of a course" # Not actually used in the interface -#: proposals/models.py:157 +#: proposals/models.py:172 msgid "Door welke comissie dient deze aanvraag te worden beoordeeld?" msgstr "Which chamber should be reviewing this application?" -#: proposals/models.py:166 +#: proposals/models.py:179 msgid "Aan welk onderzoeksinstituut ben je verbonden?" msgstr "To which research institute are you affiliated?" -#: proposals/models.py:172 +#: proposals/models.py:185 msgid "" "Wat is de beoogde startdatum van het onderzoek waarvoor deze aanvraag wordt " "ingediend?" @@ -1404,7 +1400,7 @@ msgstr "" "What is the desired starting date of the actual research for which this " "application is being submitted?" -#: proposals/models.py:173 +#: proposals/models.py:188 msgid "" "NB: Voor een aanvraag van een onderzoek dat al gestart is voordat de FETC-GW " "de aanvraag heeft goedgekeurd kan geen formele goedkeuring meer gegeven " @@ -1414,7 +1410,7 @@ msgstr "" "has approved it cannot receive formal approval; in such cases, the FEtC-H " "only provides a post-hoc advice." -#: proposals/models.py:182 +#: proposals/models.py:198 msgid "" "Wat is de titel van je aanvraag? Deze titel zal worden gebruikt in alle " "formele correspondentie." @@ -1422,7 +1418,7 @@ msgstr "" "What is the title of your application? This title will be used in all formal " "correspondence." -#: proposals/models.py:187 +#: proposals/models.py:204 msgid "" "De titel die je hier opgeeft is zichtbaar voor de FETC-GW-leden en, wanneer " "de aanvraag is goedgekeurd, ook voor alle medewerkers die in het archief van " @@ -1434,7 +1430,7 @@ msgstr "" "portal. The title cannot be identical to that of a study you have previously " "submitted." -#: proposals/models.py:195 +#: proposals/models.py:213 msgid "" "Geef een duidelijke, bondige beschrijving van de onderzoeksvraag of -vragen. " "Gebruik maximaal 200 woorden." @@ -1442,7 +1438,7 @@ msgstr "" "Give a clear, concise description of the research question or questions. Use " "a maximum of 200 words." -#: proposals/models.py:203 +#: proposals/models.py:221 msgid "" "Zijn er nog andere onderzoekers bij deze aanvraag betrokken die geaffilieerd " "zijn aan één van de onderzoeksinstituten ICON, OFR, OGK of ILS?" @@ -1450,7 +1446,7 @@ msgstr "" "Are there any other researchers involved affiliated with ICON, OFR, OGK or " "ILS?" -#: proposals/models.py:206 +#: proposals/models.py:226 msgid "" "Werk je samen met een onderzoeker of organisatie buiten de UU en is je " "onderzoek niet strikt anoniem? Neem dan contact op met de privacy officer. Agreements may then have to be made about " "the processing of personal data." -#: proposals/models.py:226 +#: proposals/models.py:252 msgid "Andere betrokkenen" msgstr "Other people involved" -#: proposals/models.py:231 +#: proposals/models.py:259 msgid "" "Worden de informed consent formulieren nog vertaald naar een andere taal dan " "Nederlands of Engels?" @@ -1474,30 +1470,30 @@ msgstr "" "Will the informed consent forms be translated in a language other than Dutch " "or English?" -#: proposals/models.py:238 +#: proposals/models.py:268 msgid "Andere talen:" msgstr "Other languages:" -#: proposals/models.py:247 +#: proposals/models.py:277 msgid "Hoe wordt dit onderzoek gefinancierd?" msgstr "How is this study funded?" -#: proposals/models.py:258 +#: proposals/models.py:288 msgid "" "Wat is de naam van het gefinancierde project en wat is het projectnummer?" msgstr "What is the name of the funded project and what is the project number?" -#: proposals/models.py:262 +#: proposals/models.py:292 msgid "" "De titel die je hier opgeeft zal in de formele toestemmingsbrief gebruikt " "worden." msgstr "This title will be used in the formal letter of approval." -#: proposals/models.py:268 +#: proposals/models.py:298 msgid "Ruimte voor eventuele opmerkingen. Gebruik maximaal 1000 woorden." msgstr "Space for possible comments. Use a maximum of a 1000 words." -#: proposals/models.py:274 +#: proposals/models.py:305 msgid "" "

      Je hebt aangegeven dat je gebruik wilt gaan maken van één van de " "faciliteiten van het ILS, namelijk de database, Zep software en/of het ILS " @@ -1520,7 +1516,7 @@ msgstr "" "> - The title of the study
      - The planned starting date
      - The " "facilities you intend to use (database, lab, Zep software)" -#: proposals/models.py:294 +#: proposals/models.py:327 msgid "" "Als de deelnemers van je onderzoek moeten worden misleid, kan je " "ervoor kiezen je applicatie pas later op te laten nemen in het " @@ -1532,16 +1528,16 @@ msgstr "" "for users of this portal. Would you like your application to be placed under " "a temporary embargo?" -#: proposals/models.py:305 +#: proposals/models.py:339 msgid "" "Vanaf welke datum mag je onderzoek wel in het archief worden weergegeven?" msgstr "From which date may your application be displayed in the archive?" -#: proposals/models.py:315 +#: proposals/models.py:349 msgid "Upload hier je aanvraag (in .pdf of .doc(x)-formaat)" msgstr "Upload your application here (in .pdf or .doc(x)-format)" -#: proposals/models.py:323 +#: proposals/models.py:357 msgid "" "Heb je formele toestemming van een ethische toetsingcommissie, uitgezonderd " "deze FETC-GW commissie?" @@ -1549,11 +1545,11 @@ msgstr "" "Do you have formal approval from an ethics committee, other than this FEtC-H " "committee?" -#: proposals/models.py:331 +#: proposals/models.py:366 msgid "Welk instituut heeft de aanvraag goedgekeurd?" msgstr "Which institute approved the application?" -#: proposals/models.py:339 +#: proposals/models.py:374 msgid "" "Upload hier je formele toestemmingsbrief van dit instituut (in .pdf of ." "doc(x)-formaat)" @@ -1561,22 +1557,22 @@ msgstr "" "Please upload the formal approval letter from this institute here (in .pdf " "or .doc(x)-format)" -#: proposals/models.py:347 +#: proposals/models.py:383 msgid "Ik vul de portal in in het kader van een cursus" msgstr "I am using this portal in the context of a course" -#: proposals/models.py:352 +#: proposals/models.py:388 msgid "Ik vul de portal in om de portal te exploreren" msgstr "I am using this portal to explore the portal" -#: proposals/models.py:364 +#: proposals/models.py:401 msgid "" "Kan voor alle deelnemers dezelfde informatiebrief en, indien van " "toepassing, dezelfde toestemmingsverklaring gebruikt worden?" msgstr "" "Can the same informed consent documents be used for all participant groups?" -#: proposals/models.py:366 +#: proposals/models.py:405 msgid "" "Daar waar de verschillen klein en qua belasting of risico irrelevant zijn is " "sprake van in essentie hetzelfde traject, en voldoet één set documenten voor " @@ -1600,11 +1596,11 @@ msgstr "" "time. However, if separate groups receive different kinds of tasks, " "they constitute separate trajectories." -#: proposals/models.py:382 +#: proposals/models.py:422 msgid "Hoeveel verschillende trajecten zijn er?" msgstr "How many different trajectories are there?" -#: proposals/models.py:400 +#: proposals/models.py:441 msgid "" "Ik heb mijn aanvraag en de documenten voor deelnemers besproken met de " "privacy officer." @@ -1612,7 +1608,7 @@ msgstr "" "I discussed my application and documents for participants with the privacy " "officer." -#: proposals/models.py:407 +#: proposals/models.py:450 msgid "" "Als je een Data Management Plan hebt voor deze aanvraag, kan je kiezen om " "deze hier bij te voegen. Het aanleveren van een DMP vergemakkelijkt het " @@ -1622,24 +1618,24 @@ msgstr "" "include it here. Supplying a DMP can expedite ethical assessment of " "proposals." -#: proposals/models.py:419 proposals/utils/pdf_diff_logic.py:989 -#: reviews/models.py:172 +#: proposals/models.py:462 proposals/utils/pdf_diff_logic.py:999 +#: reviews/models.py:162 msgid "Ruimte voor eventuele opmerkingen" msgstr "Space for possible comments" -#: proposals/models.py:431 +#: proposals/models.py:474 msgid "Datum bevestigingsbrief verstuurd" msgstr "Date confirmation sent" -#: proposals/models.py:436 reviews/forms.py:113 +#: proposals/models.py:479 reviews/forms.py:123 msgid "Is er een revisie geweest na het indienen van deze aanvraag?" msgstr "Has this proposal been amended after it was submitted?" -#: proposals/models.py:441 +#: proposals/models.py:484 msgid "Leg uit" msgstr "Explain why" -#: proposals/models.py:447 +#: proposals/models.py:491 msgid "" "Wat zijn de belangrijkste ethische kwesties in dit onderzoek en beschrijf " "kort hoe ga je daarmee omgaat. Gebruik maximaal 1000 woorden." @@ -1648,23 +1644,23 @@ msgstr "" "please describe briefly how you will address them. Use a maximum of a 1000 " "words." -#: proposals/models.py:461 +#: proposals/models.py:505 msgid "In welke hoedanigheid ben je betrokken bij dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:469 +#: proposals/models.py:514 msgid "Wat is je studierichting?" msgstr "What is your course of study?" -#: proposals/models.py:476 +#: proposals/models.py:521 msgid "In welke context doe je dit onderzoek?" msgstr "In what capacity are you involved in this application?" -#: proposals/models.py:483 +#: proposals/models.py:528 msgid "Namelijk:" msgstr "Please specify:" -#: proposals/models.py:490 +#: proposals/models.py:536 msgid "" "Studenten (die mensgebonden onderzoek uitvoeren binnen hun studieprogramma) " "hoeven in principe geen aanvraag in te dienen bij de FETC-GW. Bespreek met " @@ -1678,7 +1674,7 @@ msgstr "" "do not not, you can terminate your proposal now. If you do, please explain " "what the reason is:" -#: proposals/models.py:507 +#: proposals/models.py:555 msgid "" "Uitvoerenden, inclusief uzelf. Let op! De andere onderzoekers moeten " "ten minste één keer zijn ingelogd op dit portaal om ze te kunnen selecteren." @@ -1687,13 +1683,13 @@ msgstr "" "researchers need to have logged into this portal at least once, in order to " "be selectable here." -#: proposals/models.py:514 +#: proposals/models.py:563 #: proposals/templates/proposals/vue_templates/proposal_archive_list.html:115 #: proposals/templates/proposals/vue_templates/proposal_list.html:174 msgid "Promotor/Begeleider" msgstr "Promotor/Supervisor" -#: proposals/models.py:517 +#: proposals/models.py:567 msgid "" "Je aanvraag moet, als je alles hebt ingevuld, via de portal \n" " naar je promotor of begeleider gestuurd worden. Deze " @@ -1723,53 +1719,53 @@ msgstr "" "you wait for them to do this, but remember to come back and fill in this " "field before submitting." -#: proposals/models.py:544 +#: proposals/models.py:594 msgid "" "Is deze aanvraag een revisie van of amendement op een ingediende aanvraag?" msgstr "" "Is this application a revision or an amendment of a previously submitted " "application?" -#: proposals/models.py:628 +#: proposals/models.py:677 msgid "Amendement" msgstr "Amendment" -#: proposals/models.py:628 reviews/api/views.py:39 reviews/api/views.py:328 -#: reviews/templates/reviews/committee_members_workload.html:36 -#: reviews/templates/reviews/committee_members_workload.html:82 +#: proposals/models.py:677 reviews/api/views.py:40 reviews/api/views.py:324 +#: reviews/templates/reviews/committee_members_workload.html:35 +#: reviews/templates/reviews/committee_members_workload.html:74 #: reviews/templates/reviews/review_detail_sidebar.html:106 msgid "Revisie" msgstr "Revision" -#: proposals/models.py:634 +#: proposals/models.py:683 msgid "Normaal" msgstr "Normal" -#: proposals/models.py:639 +#: proposals/models.py:688 msgid "Voortoetsing" msgstr "Preliminary assessment" -#: proposals/models.py:641 +#: proposals/models.py:690 msgid "Oefening" msgstr "Practice" -#: proposals/models.py:643 +#: proposals/models.py:692 msgid "Extern getoetst" msgstr "External approval" -#: proposals/models.py:728 +#: proposals/models.py:777 msgid "Geen beoordeling door METC noodzakelijk" msgstr "Assessment by METC not required" -#: proposals/models.py:729 +#: proposals/models.py:778 msgid "In afwachting beslissing METC" msgstr "Pending decision by METC" -#: proposals/models.py:730 +#: proposals/models.py:779 msgid "Beslissing METC geüpload" msgstr "METC decision uploaded" -#: proposals/models.py:733 +#: proposals/models.py:783 msgid "" "Vindt de dataverzameling plaats binnen het UMC Utrecht of andere instelling " "waar toetsing door een METC verplicht is gesteld?" @@ -1777,11 +1773,11 @@ msgstr "" "Will the data collection take place at the UMC Utrecht or another " "institution for which an assessment by a METC is required?" -#: proposals/models.py:747 +#: proposals/models.py:798 msgid "Welke instelling?" msgstr "Which institution?" -#: proposals/models.py:753 +#: proposals/models.py:805 msgid "" "Is de onderzoeksvraag medisch-wetenschappelijk van aard (zoals gedefinieerd " "door de WMO)?" @@ -1789,7 +1785,7 @@ msgstr "" "Is the nature of the research question medical (as defined by the Medical " "Research Involving Human Subjects Act (WMO))?" -#: proposals/models.py:755 +#: proposals/models.py:809 msgid "" "De definitie van medisch-wetenschappelijk onderzoek is: Medisch-" "wetenschappelijk onderzoek is onderzoek dat als doel heeft het beantwoorden " @@ -1810,7 +1806,7 @@ msgstr "" "Committee on Research Involving Human Subjects, Definition of medical " "research, 2005, ccmo.nl)" -#: proposals/models.py:771 +#: proposals/models.py:826 msgid "" "Je onderzoek moet beoordeeld worden door een METC, maar dient nog wel bij de " "FETC-GW te worden geregistreerd. Is dit onderzoek al aangemeld bij een METC?" @@ -1819,15 +1815,15 @@ msgstr "" "registered with the FEtC-H. Has an application for this project already been " "submitted to an METC?" -#: proposals/models.py:778 +#: proposals/models.py:834 msgid "Is de METC al tot een beslissing gekomen?" msgstr "Has the METC already come to a decision?" -#: proposals/models.py:783 +#: proposals/models.py:840 msgid "Upload hier de beslissing van het METC (in .pdf of .doc(x)-formaat)" msgstr "Please upload the decision of METC (in .pdf or .doc(x)-format) here" -#: proposals/models.py:821 +#: proposals/models.py:883 #, python-brace-format msgid "WMO {title}, status {status}" msgstr "WMO {title}, status {status}" @@ -1839,33 +1835,21 @@ msgstr "Compare documents" #: proposals/templates/proposals/compare_documents.html:51 msgid "" -"\n" -" Hier kan je twee versies van een document vergelijken. " -"Standaard\n" -" geeft hij een gecombineerde versie weer, waarbij " -"tekst\n" -" die verwijderd is in het rood is gemarkeerd en nieuwe tekst\n" -" in het groen is gemarkeerd.\n" -" " +"Hier kan je twee versies van een document vergelijken. Standaard geeft hij " +"een gecombineerde versie weer, waarbij tekst die verwijderd is in het " +"rood is gemarkeerd en nieuwe tekst in het groen is gemarkeerd." msgstr "" -"\n" -" This tool allows you to compare two documents. By default,\n" -" you are presented with a combined view in " -"whichremoved\n" -" text is marked in red and added text is marked in green.\n" -" " +"This tool allows you to compare two documents. By default, you are presented " +"with a combined view where removed text is marked in red and added " +"text is marked in green." #: proposals/templates/proposals/compare_documents.html:59 msgid "" -"\n" -" Je kan ook de bestanden naast elkaar bekijken, met dezelfde\n" -" markeringen. Klik hiervoor op 'Bekijk apart'.\n" -" " +"Je kan ook de bestanden naast elkaar bekijken, met dezelfde markeringen. " +"Klik hiervoor op 'Bekijk apart'." msgstr "" -"\n" "Documents can also be viewed side by side, with markings. To do so, click " -"'View separately'.\n" -" " +"'View separately'." #: proposals/templates/proposals/compare_documents.html:65 msgid "Je vergelijkt" @@ -1875,19 +1859,19 @@ msgstr "Comparing:" msgid "Er zijn geen wijzigingen gevonden in dit document!" msgstr "No changes were found in this document!" -#: proposals/templates/proposals/compare_documents.html:72 +#: proposals/templates/proposals/compare_documents.html:71 msgid "Bekijk apart" msgstr "View separately" -#: proposals/templates/proposals/compare_documents.html:75 +#: proposals/templates/proposals/compare_documents.html:72 msgid "Bekijk gecombineerd" msgstr "View combined" -#: proposals/templates/proposals/compare_documents.html:82 +#: proposals/templates/proposals/compare_documents.html:78 msgid "Oud" msgstr "Old" -#: proposals/templates/proposals/compare_documents.html:88 +#: proposals/templates/proposals/compare_documents.html:84 msgid "Nieuw" msgstr "New" @@ -1901,32 +1885,28 @@ msgstr "Delete application" msgid "Weet je zeker dat je de aanvraag %(title)s wilt verwijderen?" msgstr "Are you sure you want to delete the application %(title)s?" -#: proposals/templates/proposals/proposal_confirm_delete.html:19 +#: proposals/templates/proposals/proposal_confirm_delete.html:20 #: proposals/templates/proposals/vue_templates/proposal_list.html:66 -#: tasks/templates/tasks/session_confirm_delete.html:18 -#: tasks/templates/tasks/task_confirm_delete.html:17 +#: tasks/templates/tasks/session_confirm_delete.html:20 +#: tasks/templates/tasks/task_confirm_delete.html:20 msgid "Verwijderen" msgstr "Delete" #: proposals/templates/proposals/proposal_confirm_delete.html:21 #: proposals/templates/proposals/proposal_copy.html:93 -#: tasks/templates/tasks/session_confirm_delete.html:19 -#: tasks/templates/tasks/task_confirm_delete.html:18 +#: tasks/templates/tasks/session_confirm_delete.html:22 +#: tasks/templates/tasks/task_confirm_delete.html:22 msgid "Annuleren" msgstr "Cancel" #: proposals/templates/proposals/proposal_confirmation.html:27 #, python-format msgid "" -"\n" -" Geef hieronder aan wanneer de bevestigingsbrief voor de " -"aanvraag %(title)s is verstuurd.\n" -" " +"Geef hieronder aan wanneer de bevestigingsbrief voor de aanvraag " +"%(title)s is verstuurd." msgstr "" -"\n" -" Please state when the confirmation letter for %(title)s has " -"been sent here.\n" -" " +"Please state when the confirmation letter for %(title)s has been " +"sent here. " #: proposals/templates/proposals/proposal_copy.html:8 #: proposals/templates/proposals/proposal_copy.html:22 @@ -1994,14 +1974,14 @@ msgstr "" "check if your application is not already in the your list of draft " "applications." -#: proposals/templates/proposals/proposal_copy.html:68 +#: proposals/templates/proposals/proposal_copy.html:67 msgid "" "Je kan hier een aanvraag kopiëren. Alle velden kunnen na het kopiëren " "aangepast worden." msgstr "" "Here you can copy an application. All fields can be edited after copying." -#: proposals/templates/proposals/proposal_copy.html:71 +#: proposals/templates/proposals/proposal_copy.html:69 msgid "" "Deze pagina is alleen bedoeld voor het geval je een geheel nieuwe aanvraag " "gaat doen op basis van een eerder uitgevoerde aanvraag. Aanvragen t.b.v. " @@ -2010,7 +1990,7 @@ msgstr "" "This page is only intended for creating an entirely new application based on " "a previous application. Applications for grant applications cannot be copied." -#: proposals/templates/proposals/proposal_copy.html:77 +#: proposals/templates/proposals/proposal_copy.html:75 #, python-format msgid "" "Als je gevraagd is om een revisie te maken van een eerder ingediende " @@ -2019,7 +1999,7 @@ msgstr "" "If you have been asked to revise a previously submitted application, you can " "do so here. " -#: proposals/templates/proposals/proposal_copy.html:83 +#: proposals/templates/proposals/proposal_copy.html:81 #, python-format msgid "" "Indien je wijzigingen hebt in een al goedgekeurde aanvraag die daarom " @@ -2030,20 +2010,20 @@ msgstr "" "to be re-reviewed, please make an amendment here." -#: proposals/templates/proposals/proposal_copy.html:95 +#: proposals/templates/proposals/proposal_copy.html:94 msgid "Kopiëren" msgstr "Copy" #: proposals/templates/proposals/proposal_data_management.html:7 -#: proposals/utils/proposal_utils.py:121 +#: proposals/utils/proposal_utils.py:118 msgid "Datamanagement" msgstr "Data management" -#: proposals/templates/proposals/proposal_data_management.html:17 +#: proposals/templates/proposals/proposal_data_management.html:16 msgid "Datamanagement en Privacy" msgstr "Data Management and Privacy" -#: proposals/templates/proposals/proposal_data_management.html:20 +#: proposals/templates/proposals/proposal_data_management.html:18 msgid "" "De Universiteit Utrecht streeft naar integriteit, duurzaamheid, en " "transparantie in de omgang met onderzoeksdata, waaronder persoonsgegevens. " @@ -2055,13 +2035,13 @@ msgstr "" "introduction of the GDPR there are clear rules which researchers should " "follow with regard to data." -#: proposals/templates/proposals/proposal_data_management.html:24 -#: proposals/utils/pdf_diff_logic.py:963 -#: reviews/templatetags/documents_list.py:245 +#: proposals/templates/proposals/proposal_data_management.html:22 +#: proposals/utils/pdf_diff_logic.py:974 +#: reviews/templatetags/documents_list.py:224 msgid "Data Management Plan" msgstr "Data Management Plan" -#: proposals/templates/proposals/proposal_data_management.html:27 +#: proposals/templates/proposals/proposal_data_management.html:25 msgid "" "Een data management plan is sinds 2020 required by the Faculty of Humanities from 2020 " "onwards as well as by NWO or ERC if you are financed by these organizations. " -#: proposals/templates/proposals/proposal_data_management.html:33 +#: proposals/templates/proposals/proposal_data_management.html:32 msgid "" "De faculteit biedt uitgebreide informatie op het gebied van data management, " "waaronder ook hoe deze te " -"schrijven.
      Je kunt bij de faculteit ook je DMP laten nakijken door " -".
      Je kunt bij de faculteit ook je DMP laten nakijken " +"door
      Research Data " "Management Support of de facultaire datamanager." @@ -2094,7 +2074,7 @@ msgstr "" "target=\"_blank\">Research Data Management Support or the faculty data manager. " -#: proposals/templates/proposals/proposal_data_management.html:38 +#: proposals/templates/proposals/proposal_data_management.html:41 msgid "" "Op de website DMP-" "online vind je na het inloggen met je Solis-ID templates voor een DMP. " @@ -2106,19 +2086,19 @@ msgstr "" "Solis-ID. This is where you can find DMP templates mandated by NWO or ERC " "funding, provided by Utrecht University." -#: proposals/templates/proposals/proposal_data_management.html:43 -#: proposals/templates/proposals/proposal_data_management.html:75 +#: proposals/templates/proposals/proposal_data_management.html:46 +#: proposals/templates/proposals/proposal_data_management.html:79 msgid "Nuttige workshops:" msgstr "Recommended workshops" -#: proposals/templates/proposals/proposal_data_management.html:45 -#: proposals/templates/proposals/proposal_data_management.html:77 +#: proposals/templates/proposals/proposal_data_management.html:48 +#: proposals/templates/proposals/proposal_data_management.html:81 msgid "" "Als je dit nog niet gedaan hebt, wordt er sterk aangeraden om de volgende " "workshop te volgen:" msgstr "If you have not already done so, it is highly recommended you attend: " -#: proposals/templates/proposals/proposal_data_management.html:49 +#: proposals/templates/proposals/proposal_data_management.html:53 msgid "" "

    • de workshop Quick start to Research Data Management
    • " @@ -2126,7 +2106,7 @@ msgstr "" "
    • the workshop Quick start to Research Data Management
    • " -#: proposals/templates/proposals/proposal_data_management.html:58 +#: proposals/templates/proposals/proposal_data_management.html:61 msgid "" "Voor advies op het gebied van data management planning kun je contact " "opnemen met de datamanager GW, Frans de Liagre Böhl via datamanagement.gw@uu.nl, who is the data manager of " "the Faculty of Humanities." -#: proposals/templates/proposals/proposal_data_management.html:62 +#: proposals/templates/proposals/proposal_data_management.html:65 msgid "Privacy: AVG en GDPR" msgstr "Privacy: AVG and GDPR" -#: proposals/templates/proposals/proposal_data_management.html:64 +#: proposals/templates/proposals/proposal_data_management.html:67 msgid "" "Wanneer je persoonsgebonden data verzamelt, zorg je er voor dat je je houdt " "aan de Algemene Verordening Gegevensbescherming, of AVG. Deze wet is de " @@ -2154,7 +2134,7 @@ msgstr "" "regulation is in line with European GDPR privacy legislation." -#: proposals/templates/proposals/proposal_data_management.html:70 +#: proposals/templates/proposals/proposal_data_management.html:73 msgid "" "De autoriteit persoonsgegevens heeft de workshop Handling personal data in research " @@ -2175,7 +2155,7 @@ msgstr "" "
    • the workshop Handling personal data in research
    • " -#: proposals/templates/proposals/proposal_data_management.html:89 +#: proposals/templates/proposals/proposal_data_management.html:94 msgid "" "Voor advies op het gebied van privacy en de AVG kun je contact opnemen met " "de privacy officer van GW via privacy." @@ -2202,25 +2182,25 @@ msgstr "" "to the original application." #: proposals/templates/proposals/proposal_form.html:7 -#: proposals/templates/proposals/proposal_form.html:76 +#: proposals/templates/proposals/proposal_form.html:78 #: proposals/templates/proposals/proposal_form_pre_approved.html:7 -#: proposals/templates/proposals/proposal_form_pre_approved.html:81 -#: proposals/utils/pdf_diff_logic.py:418 proposals/utils/proposal_utils.py:40 -#: proposals/utils/proposal_utils.py:55 proposals/utils/validate_proposal.py:33 -#: proposals/utils/validate_proposal.py:43 +#: proposals/templates/proposals/proposal_form_pre_approved.html:83 +#: proposals/utils/pdf_diff_logic.py:428 proposals/utils/proposal_utils.py:47 +#: proposals/utils/proposal_utils.py:68 proposals/utils/validate_proposal.py:40 #: proposals/utils/validate_proposal.py:50 #: proposals/utils/validate_proposal.py:57 +#: proposals/utils/validate_proposal.py:64 msgid "Algemene informatie over de aanvraag" msgstr "General information about the application" -#: proposals/templates/proposals/proposal_form.html:56 -#: proposals/templates/proposals/proposal_form_pre_approved.html:72 -#: proposals/templates/proposals/proposal_submit.html:33 +#: proposals/templates/proposals/proposal_form.html:58 +#: proposals/templates/proposals/proposal_form_pre_approved.html:74 +#: proposals/templates/proposals/proposal_submit.html:35 msgid "Aantal woorden:" msgstr "Number of words:" -#: proposals/templates/proposals/proposal_form.html:73 -#: proposals/templates/proposals/proposal_submit.html:168 +#: proposals/templates/proposals/proposal_form.html:75 +#: proposals/templates/proposals/proposal_submit.html:163 msgid "" "Je bewerkt op het moment een oefenaanvraag. Deze kan niet ter beoordeling " "door de FETC-GW worden ingediend." @@ -2228,7 +2208,7 @@ msgstr "" "You are currently editing a practice application. These can not be submitted " "to the FETC-H for review." -#: proposals/templates/proposals/proposal_form.html:78 +#: proposals/templates/proposals/proposal_form.html:80 msgid "" "Je past nu een aanvraag aan van een student/PhD kandidaat onder jouw " "supervisie. Let er op dat je het formulier invult alsof jij die student/PhD " @@ -2238,7 +2218,7 @@ msgstr "" "supervision. Please note that this form should be filled in as if you were " "that student/PhD candidate. " -#: proposals/templates/proposals/proposal_form.html:105 +#: proposals/templates/proposals/proposal_form.html:110 msgid "" "Als de beoogde startdatum binnen twee weken van het indienen van de aanvraag " "ligt, kan de FETC geen officiële goedkeuring meer geven." @@ -2246,7 +2226,7 @@ msgstr "" "If the intended start date lies within two weeks of submission, the FETC-H " "will not be able to provide official approval for this proposal." -#: proposals/templates/proposals/proposal_form_pre_approved.html:83 +#: proposals/templates/proposals/proposal_form_pre_approved.html:85 msgid "" "Je past nu een aanvraag aan van een student/PhD kandidaat onder je " "supervisie. Let er op dat je het formulier invult alsof jij die student/PhD " @@ -2256,7 +2236,7 @@ msgstr "" "supervision. Please note that this form should be filled in as if you were " "that student/PhD candidate. " -#: proposals/templates/proposals/proposal_form_pre_approved.html:97 +#: proposals/templates/proposals/proposal_form_pre_approved.html:99 #, python-format msgid "" "Dit formulier is bedoeld voor aanvragen die al goedgekeurd zijn door een " @@ -2267,14 +2247,14 @@ msgstr "" "different committee. If this is not the case, you are required to fill in " "the full form." -#: proposals/templates/proposals/proposal_list.html:45 -#: proposals/templates/proposals/proposal_private_archive.html:43 -#: reviews/templates/reviews/action_explaination.html:19 +#: proposals/templates/proposals/proposal_list.html:37 +#: proposals/templates/proposals/proposal_private_archive.html:36 +#: reviews/templates/reviews/action_explaination.html:18 msgid "Uitleg" msgstr "Explanation" -#: proposals/templates/proposals/proposal_list.html:49 -#: proposals/templates/proposals/proposal_private_archive.html:47 +#: proposals/templates/proposals/proposal_list.html:41 +#: proposals/templates/proposals/proposal_private_archive.html:40 #, python-format msgid "" "Klik op om naar de " @@ -2283,8 +2263,9 @@ msgstr "" "Click to move on to the " "next step in the progress." -#: proposals/templates/proposals/proposal_list.html:56 -#: proposals/templates/proposals/proposal_private_archive.html:54 +#: proposals/templates/proposals/proposal_list.html:50 +#: proposals/templates/proposals/proposal_private_archive.html:49 +#: reviews/templates/reviews/action_explaination.html:28 #, python-format msgid "" "Klik op om de " @@ -2295,8 +2276,8 @@ msgstr "" "differences between a previous version (only available for revisions/" "amendments)." -#: proposals/templates/proposals/proposal_list.html:63 -#: proposals/templates/proposals/proposal_private_archive.html:61 +#: proposals/templates/proposals/proposal_list.html:59 +#: proposals/templates/proposals/proposal_private_archive.html:58 #, python-format msgid "" "Klik op om je aanvraag te " @@ -2305,8 +2286,9 @@ msgstr "" "Click to delete your " "application." -#: proposals/templates/proposals/proposal_list.html:70 -#: proposals/templates/proposals/proposal_private_archive.html:68 +#: proposals/templates/proposals/proposal_list.html:68 +#: proposals/templates/proposals/proposal_private_archive.html:67 +#: reviews/templates/reviews/action_explaination.html:21 #, python-format msgid "" "Klik op om een ingediende " @@ -2324,8 +2306,8 @@ msgstr "" "Click to create a revision for " "an application." -#: proposals/templates/proposals/proposal_list.html:82 -#: proposals/templates/proposals/proposal_private_archive.html:75 +#: proposals/templates/proposals/proposal_list.html:84 +#: proposals/templates/proposals/proposal_private_archive.html:76 #, python-format msgid "" "Klik op om je beslissing " @@ -2334,8 +2316,9 @@ msgstr "" "Click to make your decision " "(as a supervisor)." -#: proposals/templates/proposals/proposal_list.html:89 -#: proposals/templates/proposals/proposal_private_archive.html:82 +#: proposals/templates/proposals/proposal_list.html:93 +#: proposals/templates/proposals/proposal_private_archive.html:85 +#: reviews/templates/reviews/action_explaination.html:57 #, python-format msgid "" "Klik op om een ingediende " @@ -2344,9 +2327,9 @@ msgstr "" "Click to hide a submitted " "application from the archive." -#: proposals/templates/proposals/proposal_list.html:95 -#: proposals/templates/proposals/proposal_private_archive.html:88 -#: reviews/templates/reviews/action_explaination.html:56 +#: proposals/templates/proposals/proposal_list.html:101 +#: proposals/templates/proposals/proposal_private_archive.html:93 +#: reviews/templates/reviews/action_explaination.html:65 #, python-format msgid "" "Klik op om een ingediende " @@ -2355,7 +2338,7 @@ msgstr "" "Click to submit an application to " "the archive." -#: proposals/templates/proposals/proposal_pdf.html:87 +#: proposals/templates/proposals/proposal_pdf.html:86 #, python-format msgid "" "FETC-GW - %(title)s (referentienummer %(reviewing_committee)s-" @@ -2364,25 +2347,25 @@ msgstr "" "FEtC-H - %(title)s (reference number %(reviewing_committee)s-" "%(reference_number)s, submitted by %(submitter)s)" -#: proposals/templates/proposals/proposal_pdf.html:93 +#: proposals/templates/proposals/proposal_pdf.html:92 #, python-format msgid "%(type)s van referentienummer %(reference_number)s" msgstr "%(type)s of reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:109 +#: proposals/templates/proposals/proposal_pdf.html:106 #, python-format msgid "Referentienummer %(reference_number)s" msgstr "Reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:113 +#: proposals/templates/proposals/proposal_pdf.html:111 msgid "Huidige staat van de aanvraag" msgstr "Current state of the application" -#: proposals/templates/proposals/proposal_pdf.html:116 +#: proposals/templates/proposals/proposal_pdf.html:113 msgid "Indiener" msgstr "Applicant" -#: proposals/templates/proposals/proposal_pdf.html:118 +#: proposals/templates/proposals/proposal_pdf.html:115 #: tasks/templates/tasks/task_list.html:7 msgid "Naam" msgstr "Name" @@ -2408,11 +2391,11 @@ msgstr "Approval date" msgid "FETC-GW kamer" msgstr "FEtC-H chamber" -#: proposals/templates/proposals/proposal_public_archive.html:34 +#: proposals/templates/proposals/proposal_public_archive.html:32 msgid "AK" msgstr "GC" -#: proposals/templates/proposals/proposal_public_archive.html:36 +#: proposals/templates/proposals/proposal_public_archive.html:34 msgid "LK" msgstr "LC" @@ -2421,8 +2404,8 @@ msgstr "LC" msgid "Een nieuwe aanvraag aanmelden" msgstr "Register a new application" -#: proposals/templates/proposals/proposal_start.html:26 -#: proposals/templates/proposals/proposal_start_practice.html:28 +#: proposals/templates/proposals/proposal_start.html:25 +#: proposals/templates/proposals/proposal_start_practice.html:25 msgid "" "Het reglement van de Algemene Kamer (AK) of dat van de Linguistics Chamber." -#: proposals/templates/proposals/proposal_start.html:35 -#: proposals/templates/proposals/proposal_start_practice.html:37 +#: proposals/templates/proposals/proposal_start.html:34 +#: proposals/templates/proposals/proposal_start_practice.html:34 msgid "" "Gebruik de juiste (meest recente) voorbeelddocumenten voor de " @@ -2445,9 +2428,9 @@ msgstr "" "en/documents-ethics-assessment-committee-humanities\" " "target=\"_blank\">model documents for informed consent." -#: proposals/templates/proposals/proposal_start.html:40 -#: proposals/templates/proposals/proposal_start_practice.html:42 -#: proposals/templates/proposals/study_consent.html:89 +#: proposals/templates/proposals/proposal_start.html:39 +#: proposals/templates/proposals/proposal_start_practice.html:39 +#: proposals/templates/proposals/study_consent.html:88 msgid "" "Studenten moeten hun begeleider vragen om deze formulieren; dezelfde " "voorbeeldteksten, maar op niet-officiële formulieren, zijn te vinden op this page, though on non-" "official documents." -#: proposals/templates/proposals/proposal_start.html:47 -#: proposals/templates/proposals/proposal_start_practice.html:49 -#: proposals/templates/proposals/study_start.html:67 +#: proposals/templates/proposals/proposal_start.html:46 +#: proposals/templates/proposals/proposal_start_practice.html:46 +#: proposals/templates/proposals/study_start.html:65 msgid "" -"\n" -" Een voorstel is opgebouwd uit (van groot naar klein) (i) " -"trajecten, (ii) sessies, (iii) taken.\n" -" " +"Een voorstel is opgebouwd uit (van groot naar klein) (i) trajecten, (ii) " +"sessies, (iii) taken." msgstr "" -"\n" "An application consists of (i) trajectories, (ii) sessions, and (iii) tasks, " -"in descending order of subdivision. " +"in descending order of subdivision. " -#: proposals/templates/proposals/proposal_start.html:53 -#: proposals/templates/proposals/proposal_start_practice.html:55 -#: proposals/templates/proposals/study_start.html:73 -#: proposals/utils/pdf_diff_logic.py:327 -#: reviews/templates/reviews/committee_members_workload.html:24 +#: proposals/templates/proposals/proposal_start.html:52 +#: proposals/templates/proposals/proposal_start_practice.html:52 +#: proposals/templates/proposals/study_start.html:71 +#: proposals/utils/pdf_diff_logic.py:337 +#: reviews/templates/reviews/committee_members_workload.html:23 msgid "Traject" msgstr "Trajectory" -#: proposals/templates/proposals/proposal_start.html:54 -#: proposals/templates/proposals/proposal_start_practice.html:56 -#: proposals/templates/proposals/study_start.html:74 +#: proposals/templates/proposals/proposal_start.html:53 +#: proposals/templates/proposals/proposal_start_practice.html:53 +#: proposals/templates/proposals/study_start.html:72 msgid "" "Als je met verschillende deelnemersgroepen werkt die een verschillend " "onderzoekstraject doorlopen waarvoor verschillende informed consent " @@ -2491,8 +2471,8 @@ msgstr "" "not follow the same instructions during your research, they traverse " "different trajectories, and require separate informed consent documents. " -#: proposals/templates/proposals/proposal_start.html:56 -#: proposals/templates/proposals/proposal_start_practice.html:58 +#: proposals/templates/proposals/proposal_start.html:57 +#: proposals/templates/proposals/proposal_start_practice.html:57 #: proposals/templates/proposals/study_start.html:76 msgid "" "Bijvoorbeeld: ouders van leerlingen 15 jaar en jonger, docenten, een " @@ -2501,27 +2481,27 @@ msgstr "" "For example: parents of children up to 15 years of age, teachers, or " "an experimental and control group that receive significantly different tasks." -#: proposals/templates/proposals/proposal_start.html:62 +#: proposals/templates/proposals/proposal_start.html:63 #: proposals/templates/proposals/proposal_start_practice.html:63 -#: proposals/templates/proposals/study_start.html:81 +#: proposals/templates/proposals/study_start.html:82 msgid "Sessie" msgstr "Session" -#: proposals/templates/proposals/proposal_start.html:63 +#: proposals/templates/proposals/proposal_start.html:64 #: proposals/templates/proposals/proposal_start_practice.html:64 -#: proposals/templates/proposals/study_start.html:82 +#: proposals/templates/proposals/study_start.html:83 msgid "Alle taken/onderdelen die iemand op één dag uitvoert." msgstr "" "All tasks or procedures that a participant completes in a day combined. " #: proposals/templates/proposals/proposal_start.html:69 -#: proposals/templates/proposals/proposal_start_practice.html:70 +#: proposals/templates/proposals/proposal_start_practice.html:69 #: proposals/templates/proposals/study_start.html:88 msgid "Taak" msgstr "Task" #: proposals/templates/proposals/proposal_start.html:70 -#: proposals/templates/proposals/proposal_start_practice.html:71 +#: proposals/templates/proposals/proposal_start_practice.html:70 #: proposals/templates/proposals/study_start.html:89 msgid "" "Een taak of onderdeel van je onderzoek.

      Bijvoorbeeld: het " @@ -2530,25 +2510,25 @@ msgstr "" " A task or procedure within your study.

      For example: completing " "an interview, questionnaire, or language test.

      " -#: proposals/templates/proposals/proposal_start.html:80 -#: proposals/templates/proposals/proposal_start_pre_approved.html:42 -#: proposals/templates/proposals/proposal_start_pre_assessment.html:31 +#: proposals/templates/proposals/proposal_start.html:79 +#: proposals/templates/proposals/proposal_start_pre_approved.html:37 +#: proposals/templates/proposals/proposal_start_pre_assessment.html:43 msgid "Volgende stap >>" msgstr "Next step >>" #: proposals/templates/proposals/proposal_start_practice.html:7 -#: proposals/templates/proposals/proposal_start_practice.html:14 +#: proposals/templates/proposals/proposal_start_practice.html:13 msgid "Een nieuwe aanvraag aanmelden (oefenportaal)" msgstr "Register a new application (practice portal)" -#: proposals/templates/proposals/proposal_start_practice.html:80 +#: proposals/templates/proposals/proposal_start_practice.html:78 msgid "Houd er rekening mee dat een oefenaanvraag niet ingediend kan worden." msgstr "" "Please be advised that a practice application cannot be submitted to the " "FETC-H." -#: proposals/templates/proposals/proposal_start_pre_approved.html:9 -#: proposals/templates/proposals/proposal_start_pre_approved.html:18 +#: proposals/templates/proposals/proposal_start_pre_approved.html:7 +#: proposals/templates/proposals/proposal_start_pre_approved.html:14 msgid "" "Een nieuwe aanvraag aanmelden (die al goedgekeurd is door een andere " "ethische toetsingscomissie)" @@ -2556,7 +2536,7 @@ msgstr "" "Register a new application (that has been approved by another ethics " "committee)" -#: proposals/templates/proposals/proposal_start_pre_approved.html:21 +#: proposals/templates/proposals/proposal_start_pre_approved.html:16 #, python-format msgid "" "Je wilt een nieuwe aanvraag ter toetsing bij de FETC-GW aanmelden, die al " @@ -2572,7 +2552,7 @@ msgstr "" "yourself and the committee members a great deal of time by making sure you " "are properly informed." -#: proposals/templates/proposals/proposal_start_pre_approved.html:31 +#: proposals/templates/proposals/proposal_start_pre_approved.html:26 #, python-format msgid "" "Gebruik bij het invullen s.v.p. geen afkortingen waar de FETC-GW wellicht " @@ -2595,7 +2575,7 @@ msgstr "Ethical assessment for grant application" msgid "Nieuwe FETC-aanvraag voor (al dan niet goedgekeurde) subsidieaanvragen" msgstr "Submit a new application to supplement a grant application" -#: proposals/templates/proposals/proposal_start_pre_assessment.html:19 +#: proposals/templates/proposals/proposal_start_pre_assessment.html:17 msgid "" "Soms is bij het indienen van een aanvraag bij een subsidieverstrekker een " "ethische verklaring nodig." @@ -2603,7 +2583,7 @@ msgstr "" "Sometimes grant providers will require assessment by an ethics committee as " "part of their grant application procedure." -#: proposals/templates/proposals/proposal_start_pre_assessment.html:20 +#: proposals/templates/proposals/proposal_start_pre_assessment.html:22 msgid "" "Goedgekeurde NWO-aanvragen hebben ook een ethische verklaring nodig alvorens " "een startdatum vastgesteld kan worden." @@ -2612,7 +2592,7 @@ msgstr "" "supplement a grant application once the grant has been awarded. It is " "however still required before a starting date can be determined." -#: proposals/templates/proposals/proposal_start_pre_assessment.html:23 +#: proposals/templates/proposals/proposal_start_pre_assessment.html:28 msgid "" "In deze gevallen kunnen onderzoekers de FETC-GW verzoeken om de " "onderzoeksaanvraag te laten toetsen. Dit kan via deze route van de portal" @@ -2620,7 +2600,7 @@ msgstr "" "In these cases, researchers can request an assessment of their application " "by the FEtC-H through this route" -#: proposals/templates/proposals/proposal_start_pre_assessment.html:25 +#: proposals/templates/proposals/proposal_start_pre_assessment.html:34 msgid "" "NB: De toetsing kan alleen op hoofdlijnen plaatsvinden en vervangt NIET de " "reguliere ethische toetsing van een onderzoek; elke mensgebonden studie die " @@ -2634,77 +2614,47 @@ msgstr "" "process." #: proposals/templates/proposals/proposal_submit.html:8 -#: proposals/templates/proposals/proposal_submit.html:47 -#: proposals/utils/proposal_utils.py:49 proposals/utils/proposal_utils.py:58 +#: proposals/templates/proposals/proposal_submit.html:49 +#: proposals/utils/proposal_utils.py:59 proposals/utils/proposal_utils.py:73 msgid "Aanvraag voor voortoetsing klaar voor versturen" msgstr "Application for preliminary assessment ready to submit" #: proposals/templates/proposals/proposal_submit.html:10 -#: proposals/templates/proposals/proposal_submit.html:49 +#: proposals/templates/proposals/proposal_submit.html:51 msgid "Concept-aanmelding klaar voor versturen" msgstr "Draft application ready to submit" #: proposals/templates/proposals/proposal_submit.html:12 -#: proposals/templates/proposals/proposal_submit.html:51 +#: proposals/templates/proposals/proposal_submit.html:53 msgid "Aanmelding klaar voor versturen" msgstr "Application ready to submit" -#: proposals/templates/proposals/proposal_submit.html:56 -msgid "" -"\n" -" Je aanvraag voor voortoetsing is compleet.\n" -" " -msgstr "" -"\n" -" Your application for preliminary assessment is complete.\n" -" " +#: proposals/templates/proposals/proposal_submit.html:58 +msgid "Je aanvraag voor voortoetsing is compleet." +msgstr "Your application for preliminary assessment is complete." -#: proposals/templates/proposals/proposal_submit.html:59 +#: proposals/templates/proposals/proposal_submit.html:61 #: proposals/templates/proposals/proposal_submit.html:76 msgid "" -"\n" -" Als je er zeker van bent dat je aanvraag op adequate " -"wijze is gespecifieerd kan je de aanmelding\n" -" nu ter beoordeling naar de FETC-GW versturen.\n" -" " +"Als je er zeker van bent dat je aanvraag op adequate wijze is gespecifieerd " +"kan je de aanmelding nu ter beoordeling naar de FETC-GW versturen." msgstr "" -"\n" -" If you are sure your application is adequately described, you can now " -"submit the application\n" -" to the FEtC-H for assessment.\n" -" " +"If you are sure your application is adequately described, you can now submit " +"the application to the FEtC-H for assessment." -#: proposals/templates/proposals/proposal_submit.html:65 -msgid "" -"\n" -" Je concept-aanmelding is compleet.\n" -" " -msgstr "" -"\n" -" Your draft application is complete.\n" -" " +#: proposals/templates/proposals/proposal_submit.html:66 +msgid "Je concept-aanmelding is compleet." +msgstr "Your draft application is complete." -#: proposals/templates/proposals/proposal_submit.html:68 +#: proposals/templates/proposals/proposal_submit.html:69 msgid "" -"\n" -" Je kan nu je concept-aanmelding ter beoordeling naar " -"je supervisor versturen.\n" -" " +"Je kan nu je concept-aanmelding ter beoordeling naar je supervisor versturen." msgstr "" -"\n" -" You can now send your draft application to your supervisor for " -"assessment.\n" -" " +"You can now send your draft application to your supervisor for assessment." #: proposals/templates/proposals/proposal_submit.html:73 -msgid "" -"\n" -" Je aanmelding is compleet.\n" -" " -msgstr "" -"\n" -" Your application is complete.\n" -" " +msgid "Je aanmelding is compleet." +msgstr "Your application is complete." #: proposals/templates/proposals/proposal_submit.html:83 msgid "" @@ -2726,7 +2676,7 @@ msgstr "" "start page; the draft application can be saved for any later changes and " "submission." -#: proposals/templates/proposals/proposal_submit.html:101 +#: proposals/templates/proposals/proposal_submit.html:100 #, python-format msgid "" "Je hebt nog geen toestemmingsverklaring of informatiebrief toegevoegd voor " @@ -2741,7 +2691,7 @@ msgstr "" "you can return later; your application has already been saved and can be " "found under \"My drafts\"." -#: proposals/templates/proposals/proposal_submit.html:113 +#: proposals/templates/proposals/proposal_submit.html:112 #, python-format msgid "" "Je hebt aangeven dat je interventie een extra taak heeft, maar nog geen " @@ -2752,11 +2702,11 @@ msgstr "" "the task-based research form is missing for trajectory %(study_order)s.You " "can add it on this page." -#: proposals/templates/proposals/proposal_submit.html:128 +#: proposals/templates/proposals/proposal_submit.html:125 msgid "Er zijn nog errors gevonden op de volgende pagina's:" msgstr "Errors were found on the following pages:" -#: proposals/templates/proposals/proposal_submit.html:141 +#: proposals/templates/proposals/proposal_submit.html:136 msgid "" "Dit komt waarschijnlijk doordat je nog niet alle verplichte velden heeft " "ingevuld. Je kan je aanmelding pas versturen wanneer deze fouten " @@ -2765,11 +2715,11 @@ msgstr "" "This is probably because you have not yet filled in all required fields. You " "can submit your application when these errors have been corrected." -#: proposals/templates/proposals/proposal_submit.html:149 +#: proposals/templates/proposals/proposal_submit.html:144 msgid "Controleer uw beoogde startdatum" msgstr "Check your intended start date" -#: proposals/templates/proposals/proposal_submit.html:151 +#: proposals/templates/proposals/proposal_submit.html:146 msgid "" "Omdat de beoogde startdatum binnen twee weken van vandaag ligt, kan de FETC " "helaas geen officiële goedkeuring meer geven voor deze aanvraag. Controleer " @@ -2779,7 +2729,7 @@ msgstr "" "of today, the FETC-H will not be able to provide official approval for this " "application. Please make sure the entered date is still correct." -#: proposals/templates/proposals/proposal_submit.html:155 +#: proposals/templates/proposals/proposal_submit.html:150 #, python-format msgid "" "De beoogde startdatum vindt u op deze paginathis " "page." -#: proposals/templates/proposals/proposal_submit.html:175 +#: proposals/templates/proposals/proposal_submit.html:170 msgid "Aanvraag voor voortoetsing versturen" msgstr "Submit application for preliminary assessment" -#: proposals/templates/proposals/proposal_submit.html:177 +#: proposals/templates/proposals/proposal_submit.html:172 msgid "Terug naar beoordeling >>" msgstr "Back to review >>" -#: proposals/templates/proposals/proposal_submit.html:179 +#: proposals/templates/proposals/proposal_submit.html:174 msgid "Concept-aanmelding versturen" msgstr "Submit draft application" -#: proposals/templates/proposals/proposal_submit.html:181 -#: proposals/utils/pdf_diff_logic.py:971 +#: proposals/templates/proposals/proposal_submit.html:176 +#: proposals/utils/pdf_diff_logic.py:982 msgid "Aanmelding versturen" msgstr "Submit application" @@ -2836,7 +2786,7 @@ msgstr "Your application has been submitted." msgid "Je ontvangt een e-mail ter bevestiging." msgstr "You will receive a confirmation email." -#: proposals/templates/proposals/proposal_submitted.html:40 +#: proposals/templates/proposals/proposal_submitted.html:39 #, python-format msgid "" "Klik hier om je ingediende aanvragen in te " @@ -2845,7 +2795,7 @@ msgstr "" "Click here to see your submitted " "applications." -#: proposals/templates/proposals/proposal_update_attachments.html:17 +#: proposals/templates/proposals/proposal_update_attachments.html:15 #, python-format msgid "" "Op deze pagina kan je de formulieren aanpassen behorende bij de aanvraag " @@ -2854,12 +2804,12 @@ msgstr "" "On this page you can edit the forms related to the proposal " "%(title)s(reference number %(ref_number)s)" -#: proposals/templates/proposals/proposal_update_date_start.html:14 -#: proposals/templates/proposals/proposal_update_date_start.html:28 +#: proposals/templates/proposals/proposal_update_date_start.html:13 +#: proposals/templates/proposals/proposal_update_date_start.html:31 msgid "Startdatum aanpassen" msgstr "Edit start date" -#: proposals/templates/proposals/proposal_update_date_start.html:17 +#: proposals/templates/proposals/proposal_update_date_start.html:15 #, python-format msgid "" "Op deze pagina kan de startdatum worden aangepast van de aanvraag %(title)s " @@ -2878,24 +2828,23 @@ msgstr "" msgid "Toestemmingsverklaring van de schoolleider/hoofd van het departement" msgstr "Informed consent school director/ head of the institution" -#: proposals/templates/proposals/study_consent.html:74 +#: proposals/templates/proposals/study_consent.html:72 msgid "Informed consent formulieren uploaden" msgstr "Upload Informed consent forms" -#: proposals/templates/proposals/study_consent.html:77 +#: proposals/templates/proposals/study_consent.html:74 msgid "" "Hier kan je de Informed consent formulieren uploaden voor de opgegeven " "traject(en). Optioneel kan je indien nodig maximaal 10 paar extra " -"formulieren uploaden.
      Klik hiervoor op 'Voeg extra formulieren' " +"formulieren uploaden.
      Klik hiervoor op 'Voeg extra formulieren' " "onderaan de pagina. Deze velden kan je weer weg halen door alle formulieren " "te wissen." msgstr "" -" You can upload the informed consent forms for your trajectories " -"here. If needed, you can also upload up to 10 sets of additional forms.
      These extra fields can be removed by clearing all forms in one " -"section. " +"You can upload the informed consent forms for your trajectories here. If " +"needed, you can also upload up to 10 sets of additional forms.
      These " +"extra fields can be removed by clearing all forms in one section." -#: proposals/templates/proposals/study_consent.html:85 +#: proposals/templates/proposals/study_consent.html:83 msgid "" "Gebruik de juiste (meest recente) model documents for informed consent." -#: proposals/templates/proposals/study_consent.html:95 +#: proposals/templates/proposals/study_consent.html:93 msgid "" "Let op dat je documenten geen redactionele fouten en/of taalfouten bevatten: " "een aanvraag kan hierom direct voor revisie worden teruggestuurd." @@ -2915,7 +2864,7 @@ msgstr "" "grammatical errors. Your application may be sent straight back for revision " "because of these." -#: proposals/templates/proposals/study_consent.html:98 +#: proposals/templates/proposals/study_consent.html:96 msgid "" "Bij ontvangst worden alle bestandsnamen gewijzigd, zet hier dus geen " "belangrijke informatie in." @@ -2923,7 +2872,7 @@ msgstr "" "Files are renamed upon arrival, so please do not put information in the " "filename that you later rely on." -#: proposals/templates/proposals/study_consent.html:104 +#: proposals/templates/proposals/study_consent.html:103 msgid "" "Omdat er in één of meer trajecten onderzoek wordt uitgevoerd op een externe " "locatie waar toestemming voor vereist is, vragen we daar om een tweede set " @@ -2939,18 +2888,18 @@ msgstr "" "head of department of a medical institution. If applicable, please include " "the information letter for parents or guardians." -#: proposals/templates/proposals/study_consent.html:132 +#: proposals/templates/proposals/study_consent.html:136 msgid "Voeg extra formulieren toe" msgstr "Add additional forms" -#: proposals/templates/proposals/study_consent.html:138 +#: proposals/templates/proposals/study_consent.html:142 msgid "Extra formulieren" msgstr "Additional forms" #: proposals/templates/proposals/study_start.html:7 -#: proposals/templates/proposals/study_start.html:64 -#: proposals/utils/pdf_diff_logic.py:520 -#: proposals/utils/validate_proposal.py:87 +#: proposals/templates/proposals/study_start.html:63 +#: proposals/utils/pdf_diff_logic.py:530 +#: proposals/utils/validate_proposal.py:94 msgid "Eén of meerdere trajecten?" msgstr "One or more trajectories?" @@ -2975,20 +2924,20 @@ msgstr "" "You can now describe the nature of each trajectory of the study on " "the following pages." -#: proposals/templates/proposals/table_with_header_diff.html:13 +#: proposals/templates/proposals/table_with_header_diff.html:11 msgid "Originele aanvraag" msgstr "Original application" -#: proposals/templates/proposals/table_with_header_diff.html:14 +#: proposals/templates/proposals/table_with_header_diff.html:12 msgid "Revisie/amendement" msgstr "Revision/amendment" -#: proposals/templates/proposals/translated_consent_forms.html:25 +#: proposals/templates/proposals/translated_consent_forms.html:24 #: proposals/utils/validate_proposal.py:223 msgid "Vertaling informed consent formulieren" msgstr "Translation of informed consent forms" -#: proposals/templates/proposals/translated_consent_forms.html:29 +#: proposals/templates/proposals/translated_consent_forms.html:26 msgid "" "Documenten moet in het Nederlands of in het Engels worden ingediend. Echter, " "om je deelnemers op een adequate manier te informeren kan het noodzakelijk " @@ -3074,12 +3023,12 @@ msgid "Revisie/amendement van" msgstr "Revision/amendment of" #: proposals/templates/proposals/wmo_application.html:7 -#: proposals/templates/proposals/wmo_application.html:27 -#: proposals/utils/pdf_diff_logic.py:512 +#: proposals/templates/proposals/wmo_application.html:26 +#: proposals/utils/pdf_diff_logic.py:522 msgid "Aanmelding bij de METC" msgstr "Registration with the METC" -#: proposals/templates/proposals/wmo_application.html:33 +#: proposals/templates/proposals/wmo_application.html:34 msgid "" "Zolang je aanvraag nog niet is beoordeeld door de METC, kan je niet verder " "in het aanmeldingsproces." @@ -3088,17 +3037,17 @@ msgstr "" "the application process." #: proposals/templates/proposals/wmo_check.html:7 -#: proposals/templates/proposals/wmo_check.html:26 +#: proposals/templates/proposals/wmo_check.html:27 msgid "WMO-check" msgstr "WMO check" -#: proposals/templates/proposals/wmo_check.html:31 +#: proposals/templates/proposals/wmo_check.html:37 msgid "Opnieuw beginnen" msgstr "Start again" #: proposals/templates/proposals/wmo_form.html:7 #: proposals/templates/proposals/wmo_form.html:30 -#: proposals/utils/pdf_diff_logic.py:487 +#: proposals/utils/pdf_diff_logic.py:497 msgid "" "Ethische toetsing nodig door een Medische Ethische Toetsingscommissie (METC)?" msgstr "" @@ -3119,138 +3068,138 @@ msgstr "" "This section was present in the original application, but was removed for " "the revision." -#: proposals/utils/pdf_diff_logic.py:238 reviews/models.py:119 +#: proposals/utils/pdf_diff_logic.py:248 reviews/models.py:111 msgid "Onbekend" msgstr "Unknown" -#: proposals/utils/pdf_diff_logic.py:281 +#: proposals/utils/pdf_diff_logic.py:291 msgid "Download" msgstr "Download" -#: proposals/utils/pdf_diff_logic.py:284 +#: proposals/utils/pdf_diff_logic.py:294 msgid "Niet aangeleverd" msgstr "Not provided" -#: proposals/utils/pdf_diff_logic.py:307 tasks/templates/tasks/task_end.html:7 -#: tasks/templates/tasks/task_end.html:18 +#: proposals/utils/pdf_diff_logic.py:317 tasks/templates/tasks/task_end.html:7 +#: tasks/templates/tasks/task_end.html:16 msgid "Overzicht van het takenonderzoek" msgstr "Overview of task-based research" -#: proposals/utils/pdf_diff_logic.py:320 proposals/utils/pdf_diff_logic.py:347 -#: proposals/utils/pdf_diff_logic.py:356 proposals/utils/pdf_diff_logic.py:380 +#: proposals/utils/pdf_diff_logic.py:330 proposals/utils/pdf_diff_logic.py:357 +#: proposals/utils/pdf_diff_logic.py:366 proposals/utils/pdf_diff_logic.py:390 msgid "Traject " msgstr "Trajectory " -#: proposals/utils/pdf_diff_logic.py:350 proposals/utils/pdf_diff_logic.py:383 +#: proposals/utils/pdf_diff_logic.py:360 proposals/utils/pdf_diff_logic.py:393 msgid "sessie " msgstr "session " -#: proposals/utils/pdf_diff_logic.py:363 proposals/utils/pdf_diff_logic.py:391 +#: proposals/utils/pdf_diff_logic.py:373 proposals/utils/pdf_diff_logic.py:401 msgid "Sessie " msgstr "Session " -#: proposals/utils/pdf_diff_logic.py:385 proposals/utils/pdf_diff_logic.py:393 +#: proposals/utils/pdf_diff_logic.py:395 proposals/utils/pdf_diff_logic.py:403 msgid ", taak " msgstr ", task " -#: proposals/utils/pdf_diff_logic.py:538 +#: proposals/utils/pdf_diff_logic.py:548 #: studies/templates/studies/study_form.html:7 -#: studies/templates/studies/study_form.html:82 +#: studies/templates/studies/study_form.html:80 msgid "De deelnemers" msgstr "Participants" -#: proposals/utils/pdf_diff_logic.py:742 +#: proposals/utils/pdf_diff_logic.py:752 #: studies/templates/studies/session_start.html:7 -#: studies/templates/studies/session_start.html:17 +#: studies/templates/studies/session_start.html:16 #: tasks/templates/tasks/task_form.html:7 -#: tasks/templates/tasks/task_form.html:30 +#: tasks/templates/tasks/task_form.html:27 #: tasks/templates/tasks/task_start.html:7 -#: tasks/templates/tasks/task_start.html:28 +#: tasks/templates/tasks/task_start.html:27 msgid "Het takenonderzoek en interviews" msgstr "Task-based research and interviews" -#: proposals/utils/pdf_diff_logic.py:830 +#: proposals/utils/pdf_diff_logic.py:840 #: studies/templates/studies/study_end.html:7 -#: studies/templates/studies/study_end.html:28 +#: studies/templates/studies/study_end.html:27 msgid "Overzicht en eigen beoordeling van het gehele onderzoek" msgstr "Overview and self-assessment of the entire study" -#: proposals/utils/pdf_diff_logic.py:939 +#: proposals/utils/pdf_diff_logic.py:950 msgid "Extra formulieren " msgstr "Additional forms " -#: proposals/utils/proposal_utils.py:42 proposals/utils/validate_proposal.py:69 -#: proposals/utils/validate_proposal.py:76 +#: proposals/utils/proposal_utils.py:51 proposals/utils/validate_proposal.py:76 +#: proposals/utils/validate_proposal.py:83 msgid "Ethische toetsing nodig door een METC?" msgstr "Ethical assessment by a METC necessary?" -#: proposals/utils/proposal_utils.py:68 +#: proposals/utils/proposal_utils.py:87 msgid "Algemeen" msgstr "General" -#: proposals/utils/proposal_utils.py:73 +#: proposals/utils/proposal_utils.py:91 msgid "METC" msgstr "METC" -#: proposals/utils/proposal_utils.py:87 +#: proposals/utils/proposal_utils.py:98 msgid "Trajecten" msgstr "Trajectories" -#: proposals/utils/proposal_utils.py:100 +#: proposals/utils/proposal_utils.py:108 msgid "Uploaden" msgstr "Upload" -#: proposals/utils/proposal_utils.py:107 +#: proposals/utils/proposal_utils.py:111 msgid "Vertaling" msgstr "Translation" -#: proposals/utils/proposal_utils.py:114 +#: proposals/utils/proposal_utils.py:115 msgid "Formulieren" msgstr "Forms" -#: proposals/utils/proposal_utils.py:122 +#: proposals/utils/proposal_utils.py:119 msgid "Versturen" msgstr "Submit" -#: proposals/utils/proposal_utils.py:415 +#: proposals/utils/proposal_utils.py:417 msgid "FETC-GW: gereviseerde aanvraag gebruikt labfaciliteiten" msgstr "FEtC-H: A revised application uses lab facilities" -#: proposals/utils/proposal_utils.py:417 +#: proposals/utils/proposal_utils.py:419 msgid "FETC-GW: nieuwe aanvraag gebruikt labfaciliteiten" msgstr "FEtC-H: New application uses lab facilities" -#: proposals/utils/validate_proposal.py:98 +#: proposals/utils/validate_proposal.py:105 msgid "De deelnemers (traject {})" msgstr "Participants (trajectory {})" -#: proposals/utils/validate_proposal.py:106 +#: proposals/utils/validate_proposal.py:113 msgid "De onderzoekstype(n) (traject {})" msgstr "Type(s) of research (trajectory {})" -#: proposals/utils/validate_proposal.py:119 -#: proposals/utils/validate_proposal.py:128 +#: proposals/utils/validate_proposal.py:123 +#: proposals/utils/validate_proposal.py:132 msgid "Het interventieonderzoek (traject {})" msgstr "Intervention study (trajectory {})" -#: proposals/utils/validate_proposal.py:143 -#: proposals/utils/validate_proposal.py:152 +#: proposals/utils/validate_proposal.py:144 +#: proposals/utils/validate_proposal.py:153 msgid "Het observatieonderzoek (traject {})" msgstr "Observational study (trajectory {})" -#: proposals/utils/validate_proposal.py:163 +#: proposals/utils/validate_proposal.py:164 msgid "Het takenonderzoek (traject {})" msgstr "Task-based research: trajectory {}" -#: proposals/utils/validate_proposal.py:178 +#: proposals/utils/validate_proposal.py:179 msgid "Het takenonderzoek: sessie {} (traject {})" msgstr "Task-based research: session {} trajectory {}" -#: proposals/utils/validate_proposal.py:195 +#: proposals/utils/validate_proposal.py:196 msgid "Het takenonderzoek: sessie {} taak {} (traject {})" msgstr "Task-based research: session {} task {} (trajectory {})" -#: proposals/utils/validate_proposal.py:212 +#: proposals/utils/validate_proposal.py:213 msgid "Overzicht van takenonderzoek: sessie {} (traject {})" msgstr "Overview of task-based research: session {} (trajectory {})" @@ -3258,40 +3207,40 @@ msgstr "Overview of task-based research: session {} (trajectory {})" msgid "AVG en Data Management" msgstr "AVG and Data Management" -#: proposals/views/proposal_views.py:45 +#: proposals/views/proposal_views.py:63 msgid "Publiek archief" msgstr "Public archive" -#: proposals/views/proposal_views.py:46 +#: proposals/views/proposal_views.py:64 msgid "Dit overzicht toont alle goedgekeurde aanvragen." msgstr "This overview shows all approved applications." -#: proposals/views/proposal_views.py:65 +#: proposals/views/proposal_views.py:83 msgid "Mijn aanvraag" msgstr "My application" -#: proposals/views/proposal_views.py:66 +#: proposals/views/proposal_views.py:84 msgid "Dit overzicht toont al je aanvragen." msgstr "This overview shows all your applications." -#: proposals/views/proposal_views.py:79 +#: proposals/views/proposal_views.py:99 msgid "Dit overzicht toont al je nog niet ingediende aanvragen." msgstr "This overview shows all the applications you have not yet submitted." -#: proposals/views/proposal_views.py:91 +#: proposals/views/proposal_views.py:113 msgid "Dit overzicht toont al je ingediende aanvragen." msgstr "This overview shows all the applications you have submitted." -#: proposals/views/proposal_views.py:103 +#: proposals/views/proposal_views.py:127 msgid "Dit overzicht toont al je beoordeelde aanvragen." msgstr "This overview shows all your applications that have been assessed." -#: proposals/views/proposal_views.py:116 +#: proposals/views/proposal_views.py:142 msgid "" "Dit overzicht toont alle aanvragen waarvan je eindverantwoordelijke bent." msgstr "This overview shows all your supervised applications." -#: proposals/views/proposal_views.py:129 +#: proposals/views/proposal_views.py:159 msgid "" "Dit overzicht toont alle oefenaanvragen waar je als student, onderzoeker of " "eindverantwoordelijke bij betrokken bent." @@ -3299,60 +3248,60 @@ msgstr "" "This overview shows all practice applications in which you are involved as a " "student, researcher or accountable researcher." -#: proposals/views/proposal_views.py:248 +#: proposals/views/proposal_views.py:279 msgid "Aanvraag verwijderd" msgstr "Application deleted" -#: proposals/views/proposal_views.py:398 +#: proposals/views/proposal_views.py:432 msgid "Wijzigingen opgeslagen" msgstr "Changes saved" -#: proposals/views/proposal_views.py:499 +#: proposals/views/proposal_views.py:532 msgid "Aanvraag gekopieerd" msgstr "Application copied" -#: proposals/views/study_views.py:61 +#: proposals/views/study_views.py:62 msgid "Consent opgeslagen" msgstr "Consent saved" -#: proposals/views/wmo_views.py:52 +#: proposals/views/wmo_views.py:56 msgid "WMO-gegevens opgeslagen" msgstr "WMO information saved" -#: proposals/views/wmo_views.py:65 +#: proposals/views/wmo_views.py:69 msgid "WMO-gegevens bewerkt" msgstr "WMO information edited" -#: proposals/views/wmo_views.py:148 +#: proposals/views/wmo_views.py:156 msgid "Je onderzoek hoeft niet te worden beoordeeld door de METC." msgstr "Your application does not require assessment by an METC." -#: proposals/views/wmo_views.py:155 +#: proposals/views/wmo_views.py:164 #, python-brace-format msgid "" "Neem contact op met {secretary} om de twijfels weg te " "nemen." msgstr "Contact {secretary} to make sure." -#: proposals/views/wmo_views.py:161 +#: proposals/views/wmo_views.py:171 msgid "Je onderzoek zal moeten worden beoordeeld door de METC." msgstr "Your application will require assessment by an METC." -#: reviews/api/views.py:31 reviews/api/views.py:320 +#: reviews/api/views.py:32 reviews/api/views.py:316 #: reviews/templates/reviews/vue_templates/decision_list.html:111 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:61 #: reviews/templates/reviews/vue_templates/review_list.html:116 msgid "Stadium" msgstr "Stage" -#: reviews/api/views.py:35 reviews/api/views.py:324 reviews/models.py:31 +#: reviews/api/views.py:36 reviews/api/views.py:320 reviews/models.py:31 #: reviews/templates/reviews/vue_templates/decision_list.html:178 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:121 #: reviews/templates/reviews/vue_templates/review_list.html:183 msgid "Route" msgstr "Route" -#: reviews/api/views.py:53 reviews/api/views.py:284 reviews/api/views.py:346 +#: reviews/api/views.py:54 reviews/api/views.py:281 reviews/api/views.py:342 msgid "Start datum" msgstr "Start date review" @@ -3368,303 +3317,225 @@ msgstr "long route (4-weeks)" msgid "Direct terug naar aanvrager (Nog niet in behandeling)" msgstr "Return directly to applicant (not yet under review)" -#: reviews/forms.py:33 reviews/menus.py:60 reviews/mixins.py:127 +#: reviews/forms.py:34 reviews/menus.py:66 reviews/mixins.py:173 msgid "Algemene Kamer" msgstr "General Chamber" -#: reviews/forms.py:34 reviews/menus.py:67 reviews/mixins.py:130 +#: reviews/forms.py:35 reviews/menus.py:76 reviews/mixins.py:176 msgid "Linguïstiek Kamer" msgstr "Linguistics Chamber" -#: reviews/forms.py:66 +#: reviews/forms.py:68 msgid "Selecteer de commissieleden" msgstr "Select committee members" -#: reviews/forms.py:75 +#: reviews/forms.py:78 msgid "Er moet tenminste één beoordelaar geselecteerd worden." msgstr "You must select at least one reviewer." -#: reviews/forms.py:110 +#: reviews/forms.py:119 msgid "Voeg deze aanvraag toe aan het archief" msgstr "Add this application to the archive" -#: reviews/forms.py:116 +#: reviews/forms.py:127 msgid "Opmerkingen over revisie" msgstr "Comments about this revision" -#: reviews/forms.py:123 +#: reviews/forms.py:133 msgid "Bevestig beëindiging" msgstr "Confirm termination of this review" -#: reviews/forms.py:156 +#: reviews/forms.py:167 msgid "Start datum periode:" msgstr "Start date period:" -#: reviews/forms.py:157 +#: reviews/forms.py:168 msgid "Eind datum periode:" msgstr "End date period:" -#: reviews/menus.py:14 reviews/views.py:71 +#: reviews/menus.py:18 reviews/views.py:72 msgid "Mijn openstaande besluiten" msgstr "My pending decisions" -#: reviews/menus.py:18 +#: reviews/menus.py:22 msgid "Al mijn besluiten" msgstr "All my decisions" -#: reviews/menus.py:22 +#: reviews/menus.py:26 msgid "Alle openstaande besluiten commissieleden" msgstr "All pending decisions committee members" -#: reviews/menus.py:27 +#: reviews/menus.py:31 msgid "Alle openstaande besluiten eindverantwoordelijken" msgstr "All pending decisions supervisors" -#: reviews/menus.py:32 reviews/views.py:230 +#: reviews/menus.py:36 reviews/views.py:229 msgid "Nog af te handelen aanvragen" msgstr "Applications waiting for conclusion" -#: reviews/menus.py:37 reviews/views.py:242 +#: reviews/menus.py:41 reviews/views.py:241 msgid "Aanvragen in revisie" msgstr "Applications in revision" -#: reviews/menus.py:42 reviews/views.py:254 +#: reviews/menus.py:46 reviews/views.py:253 msgid "Alle lopende aanvragen" msgstr "All running applications" -#: reviews/menus.py:47 reviews/views.py:276 +#: reviews/menus.py:51 reviews/views.py:275 msgid "Alle ingezonden aanvragen" msgstr "All submitted applications" -#: reviews/menus.py:52 +#: reviews/menus.py:56 msgid "Overzicht werkverdeling commissieleden" msgstr "Overview workload committee members" -#: reviews/models.py:13 +#: reviews/models.py:12 msgid "Beoordeling door eindverantwoordelijke" msgstr "Assessment by researcher with final responsibility" -#: reviews/models.py:14 +#: reviews/models.py:13 msgid "Aanstelling commissieleden" msgstr "Appointment of committee members" -#: reviews/models.py:15 +#: reviews/models.py:14 msgid "Beoordeling door commissie" msgstr "Assessment by committee" -#: reviews/models.py:16 +#: reviews/models.py:15 msgid "Afsluiting door secretaris" msgstr "Conclusion by secretary" -#: reviews/models.py:17 +#: reviews/models.py:16 msgid "Afgesloten" msgstr "Concluded" -#: reviews/models.py:20 +#: reviews/models.py:19 msgid "Goedkeuring door FETC-GW" msgstr "Approval by FEtC-H" -#: reviews/models.py:21 +#: reviews/models.py:20 msgid "Revisie noodzakelijk" msgstr "Revision necessary" -#: reviews/models.py:22 +#: reviews/models.py:21 msgid "Afwijzing door FETC-GW" msgstr "Rejection by FEtC-H" -#: reviews/models.py:23 +#: reviews/models.py:22 msgid "Open review met lange (4-weken) route" msgstr "Open review on long (4-week) route" -#: reviews/models.py:24 +#: reviews/models.py:23 msgid "Laat opnieuw beoordelen door METC" msgstr "Submit for reassessment by METC" -#: reviews/models.py:25 +#: reviews/models.py:24 msgid "Positief advies van FETC-GW, post-hoc" msgstr "Post hoc positive advice by FEtC-H" -#: reviews/models.py:26 +#: reviews/models.py:25 msgid "Negatief advies van FETC-GW, post-hoc" msgstr "Post hoc negative advice by FETC-H" -#: reviews/models.py:27 +#: reviews/models.py:26 msgid "Niet verder in behandeling genomen" msgstr "Not to be assessed further" -#: reviews/models.py:37 reviews/models.py:164 +#: reviews/models.py:32 reviews/models.py:157 #: reviews/templates/reviews/review_table.html:9 msgid "Beslissing" msgstr "Decision" -#: reviews/models.py:131 +#: reviews/models.py:123 msgid "lange (4-weken) route" msgstr "long (4-week) route" -#: reviews/models.py:132 +#: reviews/models.py:124 msgid "korte (2-weken) route" msgstr "short (2-week) route" -#: reviews/models.py:133 +#: reviews/models.py:125 msgid "nog geen route" msgstr "no route assigned" -#: reviews/models.py:159 +#: reviews/models.py:152 msgid "goedgekeurd" msgstr "endorsed" -#: reviews/models.py:160 +#: reviews/models.py:153 msgid "niet goedgekeurd" msgstr "not endorsed" -#: reviews/models.py:161 +#: reviews/models.py:154 msgid "revisie noodzakelijk" msgstr "revision necessary" -#: reviews/templates/reviews/action_explaination.html:22 -#, python-format -msgid "" -"\n" -" Klik op om een " -"ingediende aanvraag in te zien.\n" -" " -msgstr "" -"\n" -" Click to view a submitted " -"application.\n" -" " - -#: reviews/templates/reviews/action_explaination.html:27 -#, python-format -msgid "" -"\n" -" Klik op om de verschillen met de voorgaande\n" -" versie te zien (alleen beschikbaar voor revisies/" -"amendementen).\n" -" " -msgstr "" -"\n" -" Click to show " -"differences between a previous version (only available for revisions/" -"amendments).\n" -" " - -#: reviews/templates/reviews/action_explaination.html:33 +#: reviews/templates/reviews/action_explaination.html:36 #, python-format msgid "" -"\n" -" Klik op " -"om alle details en beoordelingen van\n" -" een ingediende aanvraag te zien.\n" -" " +"Klik op om alle details " +"en beoordelingen van een ingediende aanvraag te zien." msgstr "" -"\n" -" Click to view " -"details of a submitted application.\n" -" " +"Click to view details " +"of a submitted application." -#: reviews/templates/reviews/action_explaination.html:39 +#: reviews/templates/reviews/action_explaination.html:44 #, python-format msgid "" -"\n" -" Klik op om " -"je beslissing door te geven.\n" -" " +"Klik op om je beslissing " +"door te geven." msgstr "" -"\n" -" Click to make your " -"decision.\n" -" " +"Click to make your decision " +"(as a supervisor)." -#: reviews/templates/reviews/action_explaination.html:46 +#: reviews/templates/reviews/action_explaination.html:53 msgid "Uitleg secretaris" msgstr "Explanation for secretary" -#: reviews/templates/reviews/action_explaination.html:50 -#, python-format -msgid "" -"\n" -" Klik op " -"om een ingediende aanvraag te verbergen uit het\n" -" archief.\n" -" " -msgstr "" -"\n" -" Click to hide a submitted " -"application from the archive.\n" -" " - -#: reviews/templates/reviews/action_explaination.html:62 +#: reviews/templates/reviews/action_explaination.html:73 #, python-format msgid "" -"\n" -" Klik op om beoordelaars aan te stellen.\n" -" " +"Klik op om " +"beoordelaars aan te stellen." msgstr "" -"\n" -" Click to assign " -"reviewers.\n" -" " +"Click to assign " +"reviewers." -#: reviews/templates/reviews/action_explaination.html:67 +#: reviews/templates/reviews/action_explaination.html:80 #, python-format msgid "" -"\n" -" Klik op om een aanvraag\n" -" te verplaatsen naar een andere kamer.\n" -" " +"Klik op om een aanvraag te verplaatsen naar een andere kamer." msgstr "" -"\n" -" Click on to move an application \n" -" to a different chamber.\n" -" " +"Click on to move an application to a different chamber." -#: reviews/templates/reviews/action_explaination.html:73 +#: reviews/templates/reviews/action_explaination.html:88 #, python-format msgid "" -"\n" -" Klik op " -"om een aanvraag af te sluiten.\n" -" " +"Klik op om een aanvraag af " +"te sluiten." msgstr "" -"\n" -" Click on " -"to conclude an application.\n" -" " +"Click on to conclude an " +"application." -#: reviews/templates/reviews/action_explaination.html:78 +#: reviews/templates/reviews/action_explaination.html:95 #, python-format msgid "" -"\n" -" Klik op om aan te geven dat de\n" -" bevestigingsbrief is verstuurd.\n" -" " +"Klik op om aan te " +"geven dat de bevestigingsbrief is verstuurd." msgstr "" -"\n" -" Click on to note that the\n" -" confirmation letter has been sent.\n" -" " +"Click on to note " +"that the confirmation letter has been sent." -#: reviews/templates/reviews/action_explaination.html:84 +#: reviews/templates/reviews/action_explaination.html:103 #, python-format msgid "" -"\n" -" Klik op om de opgegeven datum\n" -" van de bevestigingsbrief te veranderen.\n" -" " +"Klik op om de " +"opgegeven datum van de bevestigingsbrief te veranderen." msgstr "" -"\n" -" Click on to change the date of \n" -" the confirmation letter.\n" -" " +"Click on to " +"change the date of the confirmation letter." #: reviews/templates/reviews/auto_review.html:3 msgid "Uitkomst automatische review" @@ -3688,13 +3559,13 @@ msgid "Redenen" msgstr "Reasons" #: reviews/templates/reviews/change_chamber_form.html:7 -#: reviews/templates/reviews/change_chamber_form.html:14 +#: reviews/templates/reviews/change_chamber_form.html:13 msgid "Beoordelende kamer wijzigen" msgstr "Change reviewing chamber" -#: reviews/templates/reviews/change_chamber_form.html:18 -#: reviews/templates/reviews/review_assign_form.html:48 -#: reviews/templates/reviews/review_discontinue_form.html:74 +#: reviews/templates/reviews/change_chamber_form.html:21 +#: reviews/templates/reviews/review_assign_form.html:49 +#: reviews/templates/reviews/review_discontinue_form.html:73 msgid "OK" msgstr "OK" @@ -3707,49 +3578,49 @@ msgstr "%(committee)s workload overview" msgid "Lopende reviews" msgstr "Ongoing reviews" -#: reviews/templates/reviews/committee_members_workload.html:23 -#: reviews/templates/reviews/committee_members_workload.html:78 +#: reviews/templates/reviews/committee_members_workload.html:22 +#: reviews/templates/reviews/committee_members_workload.html:70 #: reviews/templates/reviews/review_table.html:8 #: reviews/templates/reviews/vue_templates/decision_list_reviewer.html:68 msgid "Reviewer" msgstr "Reviewer" -#: reviews/templates/reviews/committee_members_workload.html:38 -#: reviews/templates/reviews/committee_members_workload.html:80 +#: reviews/templates/reviews/committee_members_workload.html:37 +#: reviews/templates/reviews/committee_members_workload.html:72 msgid "Korte route" msgstr "Short route" -#: reviews/templates/reviews/committee_members_workload.html:40 +#: reviews/templates/reviews/committee_members_workload.html:39 msgid "Lange route" msgstr "Long route" -#: reviews/templates/reviews/committee_members_workload.html:63 +#: reviews/templates/reviews/committee_members_workload.html:57 msgid "Werkverdeling overzicht van afgelopen periode" msgstr "Workload overview of past period" -#: reviews/templates/reviews/committee_members_workload.html:65 +#: reviews/templates/reviews/committee_members_workload.html:58 msgid "" "Vul hieronder een start- en einddatum in voor de periode van dit overzicht." msgstr "Select a start- and enddate for the period of the overview below." -#: reviews/templates/reviews/committee_members_workload.html:72 +#: reviews/templates/reviews/committee_members_workload.html:64 msgid "Periode toepassen" msgstr "Apply period" -#: reviews/templates/reviews/committee_members_workload.html:79 +#: reviews/templates/reviews/committee_members_workload.html:71 msgid "Totaal" msgstr "Total" -#: reviews/templates/reviews/committee_members_workload.html:81 +#: reviews/templates/reviews/committee_members_workload.html:73 msgid "Lange Route" msgstr "Long route" #: reviews/templates/reviews/decision_form.html:7 -#: reviews/templates/reviews/decision_form.html:17 +#: reviews/templates/reviews/decision_form.html:16 msgid "Aanvraag beoordelen" msgstr "Assess the application" -#: reviews/templates/reviews/decision_form.html:24 +#: reviews/templates/reviews/decision_form.html:22 #, python-format msgid "" "Je kunt nu een go of no-go geven voor de aanvraag %(title)s, " @@ -3757,16 +3628,16 @@ msgid "" "target=\"_blank\">hier in te zien (downloadt als PDF)." msgstr "" " You can now give a go or no-go for the application %(title)s, " -"%(refnum)s in %(chamber)s.\n" +"%(refnum)s in %(chamber)s." " You can see the details of this application here (downloads as PDF)." -#: reviews/templates/reviews/decision_form.html:32 +#: reviews/templates/reviews/decision_form.html:30 #, python-format -msgid "Je kunt nu de aanvraag %(title)s bekijken.
      " -msgstr "You can now (re)view this application here: %(title)s." +msgid "Je kunt nu de aanvraag %(title)s bekijken.
      " +msgstr "You can now (re)view this application here: %(title)s.
      " -#: reviews/templates/reviews/decision_form.html:37 +#: reviews/templates/reviews/decision_form.html:36 msgid "" "Als de aanvraag (incl. geïnformeerde toestemmingsformulieren) in orde is, " "klik dan op ‘goedgekeurd’ en ‘Beslissing opslaan’ hieronder; dan wordt de " @@ -3776,7 +3647,7 @@ msgstr "" "'endorsed' and 'Save decision' below; the application will then be submitted " "to the FEtC-H. " -#: reviews/templates/reviews/decision_form.html:44 +#: reviews/templates/reviews/decision_form.html:43 msgid "" "Als de aanvraag nog niet in orde is, dan zijn er twee mogelijkheden om de " "aanvraag aan te passen:" @@ -3784,10 +3655,10 @@ msgstr "" "If the application is not yet in order, there are two methods to amend the " "study: " -#: reviews/templates/reviews/decision_form.html:51 +#: reviews/templates/reviews/decision_form.html:50 #, python-format msgid "" -"door de supervisor (jijzelf)
      Als supervisor kan je deze aanvraag Als supervisor kan je deze aanvraag hier aanpassen. Daarna word je " "teruggeleid naar deze pagina en kun je hieronder de aanvraag goedkeuren; dat " "betekent dat de aanvraag wordt ingediend bij de FETC-GW." @@ -3799,20 +3670,20 @@ msgstr "" #: reviews/templates/reviews/decision_form.html:59 msgid "" -"door de indiener (je student of promovendus)
      Indien je wilt dat de " +"door de indiener (je student of promovendus)
      Indien je wilt dat de " "indiener de aanvraag zelf aanpast voordat je de studie kunt goedkeuren en " "daarmee bij de FETC-GW indient, selecteer dan 'revisie noodzakelijk' of " "‘niet goedgekeurd’ hieronder, voeg eventuele opmerkingen toe, en klik op " "'Beslissing opslaan'. Zodra je dit gedaan hebt kan de indiener weer " -"aanpassingen doen.
      " +"aanpassingen doen.
      " msgstr "" "by the submitter (your student or PhD candidate)
      If you want the " "submitter to amend the application before you approve it (and thereby submit " "it to the FEtC-H), select 'revision necessary' or 'not endorsed' below, add " "any comments, and click 'Save decision'. Once you have done this, the " -"submitter can make changes again.
      " +"submitter can make changes again.
      " -#: reviews/templates/reviews/decision_form.html:70 +#: reviews/templates/reviews/decision_form.html:71 msgid "" "Als de indiener de gevraagde wijzigingen heeft doorgevoerd en opnieuw heeft " "verstuurd, zal je de aangepaste aanvraag opnieuw moeten beoordelen." @@ -3820,77 +3691,66 @@ msgstr "" "Once the submitter has made the requested changes and resubmitted the " "application, you will have to re-evaluate the application. " -#: reviews/templates/reviews/decision_form.html:80 +#: reviews/templates/reviews/decision_form.html:81 #, python-format msgid "" -"\n" -" Dit is een revisie van of amendement op een " -"vorige aanvraag. De verschillen met de vorige\n" -" aanvraag zijn hier " -"in te zien.\n" -" " +"Dit is een revisie van of amendement op een vorige aanvraag. De verschillen " +"met de vorige aanvraag zijn hier in te zien." msgstr "" -"\n" -" This is a revision or amendment of a previous application. You can check " -"the differences compared to the previous application here.\n" -" " +"This is a revision or amendment of a previous application. You can check the " +"differences compared to the previous application here." -#: reviews/templates/reviews/decision_form.html:93 +#: reviews/templates/reviews/decision_form.html:96 msgid "Beslissing opslaan" msgstr "Save decision" -#: reviews/templates/reviews/documents_list.html:36 -#: reviews/templates/reviews/documents_list.html:38 +#: reviews/templates/reviews/documents_list.html:26 +#: reviews/templates/reviews/documents_list.html:28 msgid "Data Management Plan wijzigen" msgstr "Edit Data Management Plan" -#: reviews/templates/reviews/documents_list.html:44 -#: reviews/templates/reviews/documents_list.html:46 +#: reviews/templates/reviews/documents_list.html:33 +#: reviews/templates/reviews/documents_list.html:35 msgid "Documenten wijzigen" msgstr "Edit documents" #: reviews/templates/reviews/review_assign_form.html:7 -#: reviews/templates/reviews/review_assign_form.html:32 +#: reviews/templates/reviews/review_assign_form.html:29 msgid "Commissieleden aanstellen" msgstr "Appoint committee members" -#: reviews/templates/reviews/review_assign_form.html:36 +#: reviews/templates/reviews/review_assign_form.html:31 #, python-format msgid "" "

      Kies hier de geschikte route en commissieleden voor de aanvraag " "%(title)s. klik hier voor een " -"overzicht van de werkverdeling van deze commissie. " +"overzicht van de werkverdeling van deze commissie.

      " msgstr "" "

      Choose the appropriate route and committee members for the application " "%(title)s here. Click here to see " -"an overview of the workload for each committee member. " +"an overview of the workload for each committee member.

      " #: reviews/templates/reviews/review_close_form.html:7 -#: reviews/templates/reviews/review_close_form.html:25 -#: reviews/templates/reviews/review_close_form.html:43 +#: reviews/templates/reviews/review_close_form.html:24 +#: reviews/templates/reviews/review_close_form.html:41 msgid "Review afsluiten" msgstr "Conclude review" -#: reviews/templates/reviews/review_close_form.html:28 +#: reviews/templates/reviews/review_close_form.html:26 #, python-format msgid "" -"\n" -" Sluit hier de beoordeling van de aanvraag %(title)s af. Hieronder volgen de individuele\n" -" beslissingen.\n" -" " +"Sluit hier de beoordeling van de aanvraag %(title)s af. Hieronder " +"volgen de individuele beslissingen." msgstr "" -"\n" -"\tConclude the review of application %(title)s here. The individual " -"decisions follow below.\n" -"\t" +"Conclude the review of application %(title)s here. The individual " +"decisions follow below." -#: reviews/templates/reviews/review_close_form.html:33 +#: reviews/templates/reviews/review_close_form.html:31 msgid "Individuele beslissingen" msgstr "Individual decisions" -#: reviews/templates/reviews/review_close_form.html:35 +#: reviews/templates/reviews/review_close_form.html:33 msgid "Uiteindelijk besluit" msgstr "Final decision" @@ -3920,152 +3780,90 @@ msgstr "" #: reviews/templates/reviews/review_detail.html:11 #, python-format -msgid "" -"\n" -" Details van besluitvorming bij aanmelding %(proposal)s\n" -" " -msgstr "" -"\n" -"Details on the review process of application %(proposal)s\n" -" " +msgid "Details van besluitvorming bij aanmelding %(proposal)s" +msgstr "Details on the review process of application %(proposal)s" #: reviews/templates/reviews/review_detail.html:21 #, python-format -msgid "" -"\n" -" Details van besluitvorming bij aanmelding " -"%(proposal)s\n" -" " -msgstr "" -"\n" -"Details on the review process of application %(proposal)s\n" -" " +msgid "Details van besluitvorming bij aanmelding %(proposal)s" +msgstr "Details on the review process of application %(proposal)s" -#: reviews/templates/reviews/review_detail.html:36 +#: reviews/templates/reviews/review_detail.html:33 msgid "Reviewers" msgstr "Reviewers" -#: reviews/templates/reviews/review_detail.html:39 +#: reviews/templates/reviews/review_detail.html:35 msgid "Handelingen" msgstr "Actions" -#: reviews/templates/reviews/review_detail.html:47 +#: reviews/templates/reviews/review_detail.html:40 msgid "Geen handelingen beschikbaar" msgstr "No actions available" -#: reviews/templates/reviews/review_detail_sidebar.html:22 +#: reviews/templates/reviews/review_detail_sidebar.html:18 msgid "Referentie" msgstr "Reference" -#: reviews/templates/reviews/review_detail_sidebar.html:25 +#: reviews/templates/reviews/review_detail_sidebar.html:19 msgid "Commissie" msgstr "Committee" -#: reviews/templates/reviews/review_detail_sidebar.html:30 +#: reviews/templates/reviews/review_detail_sidebar.html:23 #, python-format -msgid "%(r_or_a)s van
      %(parent)s" -msgstr "%(r_or_a)s of
      %(parent)s" +msgid "%(r_or_a)s van
      %(parent)s" +msgstr "%(r_or_a)s of
      %(parent)s" -#: reviews/templates/reviews/review_detail_sidebar.html:40 +#: reviews/templates/reviews/review_detail_sidebar.html:36 msgid "Aanvrager(s)" msgstr "Applicant" -#: reviews/templates/reviews/review_detail_sidebar.html:50 +#: reviews/templates/reviews/review_detail_sidebar.html:43 msgid "Supervisor" msgstr "" -#: reviews/templates/reviews/review_detail_sidebar.html:54 +#: reviews/templates/reviews/review_detail_sidebar.html:46 #, python-format -msgid "" -"\n" -" Reviewronde gestart op
      %(date_start)s.\n" -" " -msgstr "" -"\n" -" Reviewing round started on %(date_start)s.\n" -" " +msgid "Reviewronde gestart op
      %(date_start)s." +msgstr "eviewing round started on %(date_start)s." -#: reviews/templates/reviews/review_detail_sidebar.html:60 +#: reviews/templates/reviews/review_detail_sidebar.html:54 #, python-format -msgid "" -"\n" -" Reviewronde beëindigd op
      %(date_end)s.\n" -" " -msgstr "" -"\n" -" Reviewing round ended on %(date_end)s.\n" -" " +msgid "Reviewronde beëindigd op
      %(date_end)s." +msgstr "Reviewing round ended on %(date_end)s." -#: reviews/templates/reviews/review_detail_sidebar.html:67 +#: reviews/templates/reviews/review_detail_sidebar.html:63 #, python-format -msgid "" -"\n" -" Afhandeling:
      %(continuation)s.\n" -" " -msgstr "" -"\n" -" Continuation: %(continuation)s.\n" -" " +msgid "Afhandeling:
      %(continuation)s." +msgstr "Continuation: %(continuation)s." -#: reviews/templates/reviews/review_detail_sidebar.html:73 +#: reviews/templates/reviews/review_detail_sidebar.html:71 #, python-format -msgid "" -"\n" -" Bevestiging verzonden op
      %(date_confirmed)s.\n" -" " -msgstr "" -"\n" -" Confirmation sent on %(date_confirmed)s.\n" -" " +msgid "Bevestiging verzonden op
      %(date_confirmed)s." +msgstr "Confirmation sent on %(date_confirmed)s." #: reviews/templates/reviews/review_detail_sidebar.html:77 #, python-format -msgid "" -"\n" -" Opmerkingen:
      %(comments)s.\n" -" " -msgstr "" -"\n" -" Comments: %(comments)s.\n" -" " +msgid "Opmerkingen:
      %(comments)s." +msgstr "Comments:
      %(comments)s." -#: reviews/templates/reviews/review_detail_sidebar.html:87 -msgid "" -"\n" -" Dit is een aanvraag voor voortoetsing.\n" -" " -msgstr "" -"\n" -" This is an application for preliminary assessment.\n" -" " +#: reviews/templates/reviews/review_detail_sidebar.html:89 +msgid "Dit is een aanvraag voor voortoetsing." +msgstr "This is an application for preliminary assessment" -#: reviews/templates/reviews/review_detail_sidebar.html:96 +#: reviews/templates/reviews/review_detail_sidebar.html:98 msgid "Dit is een beslissing van een eindverantwoordelijke" msgstr "This is a supervisor review" -#: reviews/templates/reviews/review_detail_sidebar.html:107 -msgid "" -"\n" -" Deze aanvraag heeft een revisie gehad tijdens het " -"beslisproces.\n" -" " +#: reviews/templates/reviews/review_detail_sidebar.html:108 +msgid "Deze aanvraag heeft een revisie gehad tijdens het beslisproces." msgstr "" -"\n" -" A revision was made to this application after it was submitted to " -"the FEtC-H .\n" -" " +"A revision was made to this application after it was submitted to the FEtC-H" -#: reviews/templates/reviews/review_detail_sidebar.html:111 -msgid "" -"\n" -" Er zijn de volgende opmerkingen bijgevoegd:
      \n" -" " -msgstr "" -"\n" -" The following comments have been provided:
      \n" -" " +#: reviews/templates/reviews/review_detail_sidebar.html:114 +msgid "Er zijn de volgende opmerkingen bijgevoegd:
      " +msgstr "The following comments have been provided:
      " -#: reviews/templates/reviews/review_detail_sidebar.html:119 +#: reviews/templates/reviews/review_detail_sidebar.html:122 msgid "Documenten" msgstr "Documents" @@ -4073,11 +3871,11 @@ msgstr "Documents" msgid "Beoordeling beëindigen" msgstr "Terminate review" -#: reviews/templates/reviews/review_discontinue_form.html:32 +#: reviews/templates/reviews/review_discontinue_form.html:29 msgid "Afhandeling definitief beëindigen" msgstr "Terminate this review" -#: reviews/templates/reviews/review_discontinue_form.html:36 +#: reviews/templates/reviews/review_discontinue_form.html:31 msgid "" "Als een aanvraag definitief niet meer door de FETC-GW afgehandeld gaat " "worden, en deze in de weg staat, kan er voor gekozen worden deze te " @@ -4086,7 +3884,7 @@ msgstr "" "If a proposal will not be further assessed by the FEtC-H and its open review " "is getting in the way, it can be terminated using this form." -#: reviews/templates/reviews/review_discontinue_form.html:43 +#: reviews/templates/reviews/review_discontinue_form.html:38 msgid "" "Een beëindigde aanvraag verschijnt niet meer in de pagina's van de " "secretaris en beoordelaars. Deze aanvraag kan ook niet meer gereviseerd " @@ -4098,11 +3896,11 @@ msgstr "" "however it may still be copied. A terminated application still shows up in " "the list \"all submitted applications\" for future reference." -#: reviews/templates/reviews/review_discontinue_form.html:54 +#: reviews/templates/reviews/review_discontinue_form.html:48 msgid "Attentie" msgstr "Warning" -#: reviews/templates/reviews/review_discontinue_form.html:56 +#: reviews/templates/reviews/review_discontinue_form.html:49 msgid "" "Deze aanvraag heeft op dit moment geen lopende beoordeling. Om deze aanvraag " "definitief te beëindigen, moeten we de uitkomst van laatste beoordeling (zie " @@ -4114,11 +3912,11 @@ msgstr "" "left sidebar. Please keep in mind that this can be confusing to the " "submitter." -#: reviews/templates/reviews/review_discontinue_form.html:64 +#: reviews/templates/reviews/review_discontinue_form.html:57 msgid "Aanvraag" msgstr "Application" -#: reviews/templates/reviews/review_discontinue_form.html:65 +#: reviews/templates/reviews/review_discontinue_form.html:58 #, python-format msgid "%(title)s door %(author)s" msgstr "%(title)s by %(author)s" @@ -4141,7 +3939,7 @@ msgid "Verplaats naar andere kamer" msgstr "Move study to different reviewing chamber" #: reviews/templates/reviews/vue_templates/review_list.html:95 -#: reviews/utils/review_actions.py:282 +#: reviews/utils/review_actions.py:264 msgid "Verberg aanvraag uit het archief" msgstr "Remove this application from the archive" @@ -4153,87 +3951,87 @@ msgstr "Add this application to the archive" msgid "Reviewronde beëindigd: " msgstr "Reviewing round ended: " -#: reviews/templatetags/documents_list.py:145 +#: reviews/templatetags/documents_list.py:138 msgid "Hoofdtraject" msgstr "Main trajectory" -#: reviews/templatetags/documents_list.py:147 +#: reviews/templatetags/documents_list.py:140 msgid "Traject {}: {}" msgstr "Trajectory {}: {}" -#: reviews/templatetags/documents_list.py:158 +#: reviews/templatetags/documents_list.py:150 msgid "Extra documenten {}" msgstr "Extra documents {}" -#: reviews/templatetags/documents_list.py:213 +#: reviews/templatetags/documents_list.py:196 msgid "Aanmelding" msgstr "Application" -#: reviews/templatetags/documents_list.py:215 +#: reviews/templatetags/documents_list.py:198 msgid "Aanvraag in PDF-vorm" msgstr "Application in PDF format" -#: reviews/templatetags/documents_list.py:228 +#: reviews/templatetags/documents_list.py:210 msgid "Eerdere goedkeuring" msgstr "Prior approval" -#: reviews/templatetags/documents_list.py:236 +#: reviews/templatetags/documents_list.py:217 msgid "Aanvraag bij voortoetsing" msgstr "Application for preliminary assessment" -#: reviews/templatetags/documents_list.py:257 +#: reviews/templatetags/documents_list.py:240 msgid "Beslissing METC" msgstr "Decision by METC" -#: reviews/templatetags/documents_list.py:282 +#: reviews/templatetags/documents_list.py:262 msgid "Informed consent" msgstr "Informed consent" -#: reviews/templatetags/documents_list.py:283 +#: reviews/templatetags/documents_list.py:263 msgid "Informatiebrief" msgstr "Information letter" -#: reviews/templatetags/documents_list.py:284 +#: reviews/templatetags/documents_list.py:265 msgid "Consent declaratie directeur/departementshoofd" msgstr "Declaration of consent school director/head of the department" -#: reviews/templatetags/documents_list.py:286 +#: reviews/templatetags/documents_list.py:270 msgid "Informatiebrief directeur/departementshoofd" msgstr "Information letter school director/head of the department" -#: reviews/templatetags/documents_list.py:288 +#: reviews/templatetags/documents_list.py:274 msgid "Informatiebrief ouders" msgstr "Information letter for the parents" -#: reviews/templatetags/documents_list.py:296 +#: reviews/templatetags/documents_list.py:282 msgid "Toestemmingsdocument observatie" msgstr "Consent document for observation" -#: reviews/utils/review_actions.py:130 +#: reviews/utils/review_actions.py:118 msgid "Geef jouw beslissing en/of commentaar door" msgstr "Provide feedback on this proposal" -#: reviews/utils/review_actions.py:156 +#: reviews/utils/review_actions.py:141 msgid "Deze versie afhandelen" msgstr "Conclude this version" -#: reviews/utils/review_actions.py:186 +#: reviews/utils/review_actions.py:169 msgid "Beëindig definitief de afhandeling van deze aanvraag" msgstr "Discontinue assessment of this application" -#: reviews/utils/review_actions.py:216 +#: reviews/utils/review_actions.py:197 msgid "Verander aangestelde commissieleden" msgstr "Change appointment of committee members" -#: reviews/utils/review_actions.py:246 +#: reviews/utils/review_actions.py:229 msgid "Datum van bevestigingsbrief aanpassen" msgstr "Change date of confirmation letter" -#: reviews/utils/review_actions.py:284 +#: reviews/utils/review_actions.py:266 msgid "Plaats aanvraag in het archief." msgstr "Add this application to the archive" -#: reviews/utils/review_actions.py:304 +#: reviews/utils/review_actions.py:283 msgid "Startdatum wijzigen" msgstr "Edit start date" @@ -4241,57 +4039,57 @@ msgstr "Edit start date" msgid "FETC-GW {}: bevestiging indienen concept-aanmelding" msgstr "FEtC-H {}: confirmation of draft application submission" -#: reviews/utils/review_utils.py:92 +#: reviews/utils/review_utils.py:108 msgid "FETC-GW {}: beoordelen als eindverantwoordelijke" msgstr "FEtC-H {}: assess as researcher with final responsibility" -#: reviews/utils/review_utils.py:142 +#: reviews/utils/review_utils.py:168 msgid "FETC-GW {}: aanmelding ontvangen" msgstr "FEtC-H {}: application received" -#: reviews/utils/review_utils.py:241 +#: reviews/utils/review_utils.py:293 msgid "FETC-GW {}: nieuwe aanvraag voor voortoetsing" msgstr "FEtC-H {}: new application for preliminary assessment" -#: reviews/utils/review_utils.py:255 +#: reviews/utils/review_utils.py:314 msgid "FETC-GW {}: bevestiging indienen aanvraag voor voortoetsing" msgstr "" "FEtC-H {}: confirmation of submission of application for preliminary " "assessment" -#: reviews/utils/review_utils.py:306 +#: reviews/utils/review_utils.py:370 msgid "FETC-GW {}: nieuwe aanvraag ingediend" msgstr "FEtC-H {}: new application submitted" -#: reviews/utils/review_utils.py:321 +#: reviews/utils/review_utils.py:387 msgid "FETC-GW {}: nieuwe beoordeling toegevoegd" msgstr "FEtC-H {}: new decision added" -#: reviews/utils/review_utils.py:364 +#: reviews/utils/review_utils.py:432 msgid "FETC-GW {}: eindverantwoordelijke heeft je aanvraag beoordeeld" msgstr "FEtC-H {}: a supervisor has reviewed your application" -#: reviews/utils/review_utils.py:390 +#: reviews/utils/review_utils.py:459 msgid "De aanvraag bevat het gebruik van wilsonbekwame volwassenen." msgstr "" "The application contains the participation of adults incapable of informed " "consent." -#: reviews/utils/review_utils.py:393 +#: reviews/utils/review_utils.py:463 msgid "De aanvraag bevat het gebruik van misleiding." msgstr "The application contains the use of misrepresentation." -#: reviews/utils/review_utils.py:396 +#: reviews/utils/review_utils.py:468 msgid "" "Er bestaat een hiërarchische relatie tussen de onderzoeker(s) en deelnemer(s)" msgstr "" "A hierarchal relationship between researcher(s) and participant(s) exists." -#: reviews/utils/review_utils.py:399 +#: reviews/utils/review_utils.py:473 msgid "Het onderzoek verzamelt bijzondere persoonsgegevens." msgstr "This study collects special or sensitive personal details." -#: reviews/utils/review_utils.py:402 +#: reviews/utils/review_utils.py:478 msgid "" "Het onderzoek selecteert deelnemers op bijzondere kenmerken die wellicht " "verhoogde kwetsbaarheid met zich meebrengen." @@ -4299,7 +4097,7 @@ msgstr "" "The study selects participants based on particular characteristics which " "might entail increased vulnerability." -#: reviews/utils/review_utils.py:408 +#: reviews/utils/review_utils.py:488 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) het onderzoek op " "onderdelen of als geheel zodanig belastend is dat deze ondanks de verkregen " @@ -4309,7 +4107,7 @@ msgstr "" "study, in part or in its entirety, is so burdensome that despite acquiring " "informed consent it might raise questions." -#: reviews/utils/review_utils.py:412 +#: reviews/utils/review_utils.py:496 msgid "" "De onderzoeker geeft aan dat (of twijfelt erover of) de risico's op " "psychische of fysieke schade bij deelname aan het onderzoek meer dan " @@ -4319,7 +4117,7 @@ msgstr "" "psychological or physical harm in participating in the study are more than " "minimal." -#: reviews/utils/review_utils.py:419 +#: reviews/utils/review_utils.py:507 #, python-brace-format msgid "" "De totale duur van de taken in sessie {s}, exclusief pauzes en andere niet-" @@ -4330,14 +4128,14 @@ msgstr "" "non-task elements ({d} minutes) is greater than the task duration limit " "({max_d} minutes) for the age group {ag}." -#: reviews/utils/review_utils.py:436 +#: reviews/utils/review_utils.py:533 #, python-brace-format msgid "Het onderzoek observeert deelnemers in de volgende setting: {s}" msgstr "" "The application contains sessions with participants in the following " "setting: {s}" -#: reviews/utils/review_utils.py:440 +#: reviews/utils/review_utils.py:541 msgid "" "Het onderzoek observeert deelnemers in een niet-publieke ruimte en werkt met " "informed consent achteraf." @@ -4345,7 +4143,7 @@ msgstr "" "The study observes participants in a non-public space and works with " "retrospective informed consent." -#: reviews/utils/review_utils.py:442 +#: reviews/utils/review_utils.py:547 msgid "" "De onderzoeker begeeft zich \"under cover\" in een beheerde niet-publieke " "ruimte (bijv. een digitale gespreksgroep), en neemt actief aan de discussie " @@ -4355,77 +4153,77 @@ msgstr "" "(e.g. a digital discussion group), and takes part actively in the discussion " "and/or collects data which can be traced back to individuals." -#: reviews/utils/review_utils.py:447 +#: reviews/utils/review_utils.py:554 msgid "De aanvraag bevat het gebruik van {}" msgstr "The application makes use of {}" -#: reviews/utils/review_utils.py:468 +#: reviews/utils/review_utils.py:580 msgid "" "De aanvraag bevat psychofysiologische metingen bij kinderen onder de {} jaar." msgstr "" "The application contains psychophysiological measurements on children under " "{} year(s) old." -#: reviews/views.py:61 +#: reviews/views.py:62 msgid "Mijn besluiten" msgstr "My results" -#: reviews/views.py:83 +#: reviews/views.py:84 msgid "Openstaande besluiten commissieleden" msgstr "Pending decisions committee members" -#: reviews/views.py:201 +#: reviews/views.py:202 msgid "Openstaande besluiten eindverantwoordelijken" msgstr "Pending decisions supervisors" -#: reviews/views.py:567 -msgid ""vind je alle aanvragen waarvan je de eindverantwoordelijke bent +#: reviews/views.py:570 +msgid "" "Deze aanvraag is al beoordeeld, dus je kan je beoordeling niet meer " "toevoegen/aanpassen" msgstr "" "This application has already been assessed, so you cannot add/change your " "assessment" -#: studies/forms.py:41 +#: studies/forms.py:50 msgid "" "Maakt jouw onderzoek gebruik van wilsonbekwame (volwassen) deelnemers?" msgstr "" "Does your research make use of (adult) participants incapable of " "informed consent?" -#: studies/forms.py:83 +#: studies/forms.py:98 msgid "Je dient minimaal een bijzonder kenmerk te selecteren." msgstr "You are required to select at least one special characteristic." -#: studies/forms.py:85 +#: studies/forms.py:105 msgid "Je dient minimaal één type gegevens te selecteren." msgstr "You are required to select at least one characteristic." -#: studies/forms.py:92 +#: studies/forms.py:121 msgid "Leg uit wat de hiërarchische relatie is." msgstr "Explain the nature of this hierarchal relationship." -#: studies/forms.py:122 +#: studies/forms.py:158 msgid "Je dient minstens één van de opties te selecteren" msgstr "You must select at least one of the options" -#: studies/models.py:54 +#: studies/models.py:53 msgid "{}-{} jaar" msgstr "{}-{} years old" -#: studies/models.py:56 +#: studies/models.py:55 msgid "{} jaar en ouder" msgstr "{} years old and above" -#: studies/models.py:128 studies/templates/studies/study_form.html:26 +#: studies/models.py:131 studies/templates/studies/study_form.html:26 msgid "Werving" msgstr "Recruitment" -#: studies/models.py:142 +#: studies/models.py:144 msgid "Naam traject" msgstr "Trajectory title" -#: studies/models.py:149 +#: studies/models.py:148 msgid "Uit welke leeftijdscategorie(ën) bestaat je deelnemersgroep?" msgstr "What is/are the age category/ies of your participants?" @@ -4437,14 +4235,14 @@ msgstr "" "If the intended age group is 5-7 year-olds, for example, then you should " "fill in 4-5 and 6-11." -#: studies/models.py:153 +#: studies/models.py:156 msgid "" "Maakt je onderzoek gebruik van wilsonbekwame (volwassen) deelnemers?" msgstr "" "Does your application contain the use of (adult) participants incapable of informed consent?" -#: studies/models.py:155 +#: studies/models.py:160 msgid "" "Wilsonbekwame volwassenen zijn volwassenen waarvan redelijkerwijs mag worden " "aangenomen dat ze onvoldoende kunnen inschatten wat hun eventuele deelname " @@ -4460,11 +4258,11 @@ msgstr "" "express their own opinion). Here informed consent should always be obtained " "from a relevant representative." -#: studies/models.py:168 +#: studies/models.py:173 msgid "Worden er bijzondere persoonsgegevens verzameld?" msgstr "Will you collect any special or sensitive personal details?" -#: studies/models.py:169 +#: studies/models.py:175 msgid "" "zie de Richtlijnen" @@ -4473,12 +4271,12 @@ msgstr "" "nl/en/knowledgebase/documents-ethics-assessment-committee-" "humanities\">regulations." -#: studies/models.py:178 +#: studies/models.py:185 msgid "Geef aan welke bijzondere persoonsgegevens worden verzameld:" msgstr "" "Please select which kinds of special personal details may be collected:" -#: studies/models.py:183 +#: studies/models.py:190 msgid "" "Deelnemers kunnen geïncludeerd worden op bepaalde bijzondere kenmerken. Is " "dit in jouw onderzoek bij (een deel van) de deelnemers het geval?" @@ -4486,7 +4284,7 @@ msgstr "" "Participants can be included based on particular characteristics. Is this " "the case with (some of) the participants in this application?" -#: studies/models.py:185 +#: studies/models.py:194 msgid "" "In de meeste gevallen kun je dit soort gegevens alleen verzamelen als je " "daar toestemming voor hebt: zie de privacy officer before submitting your " "application." -#: studies/models.py:198 +#: studies/models.py:208 msgid "" "Selecteer de medische gegevens van je proefpersonen die worden verzameld" msgstr "Select the medical details of your participants that are recorded" -#: studies/models.py:204 +#: studies/models.py:214 msgid "" "Is het, om de onderzoeksvraag beantwoord te krijgen, noodzakelijk om het " "geselecteerde type deelnemer aan het onderzoek te laten meedoen?" @@ -4519,7 +4317,7 @@ msgstr "" "In order to answer the research question, is it necessary for the selected " "type of participants to participate in the study?" -#: studies/models.py:207 +#: studies/models.py:219 msgid "" "Is het bijvoorbeeld noodzakelijk om kinderen te testen, of zou je de vraag " "ook kunnen beantwoorden door volwassen deelnemers te testen?" @@ -4527,15 +4325,15 @@ msgstr "" "For example, is it necessary to test children, or would it be possible to " "answer the research question by testing adults?" -#: studies/models.py:214 +#: studies/models.py:227 msgid "Leg uit waarom" msgstr "Explain why" -#: studies/models.py:218 +#: studies/models.py:229 msgid "Hoe worden de deelnemers geworven?" msgstr "How will the participants be recruited?" -#: studies/models.py:221 +#: studies/models.py:234 #, python-brace-format msgid "" "Er zijn specifieke voorbeelddocumenten voor het gebruik van " @@ -4544,12 +4342,12 @@ msgstr "" "There are specific template documents for using Amazon Mechanical Turk/" "Prolific here." -#: studies/models.py:228 +#: studies/models.py:243 msgid "Welke vergoeding krijgt de deelnemer voor hun deelname?" msgstr "" "What compensation will participants receive for taking part in this study?" -#: studies/models.py:229 +#: studies/models.py:245 msgid "" "Het standaardbedrag voor vergoeding aan de deelnemers is €10,- per uur. " "Minderjarigen mogen geen geld ontvangen, maar wel een cadeautje." @@ -4557,26 +4355,26 @@ msgstr "" "The standard sum for compensation of participants is €10 per hour. Minors " "are not permitted to receive money, but can be given a gift." -#: studies/models.py:241 +#: studies/models.py:257 msgid "" "Bestaat een hiërarchische relatie tussen onderzoeker(s) en deelnemer(s)?" msgstr "" "Does a hierarchal relationship between researcher(s) and participant(s) " "exist?" -#: studies/models.py:247 +#: studies/models.py:264 msgid "Zo ja, wat is de relatie (bijv. docent-student)?" msgstr "If so, what is the nature of the relationship (e.g. teacher-student)?" -#: studies/models.py:260 +#: studies/models.py:272 msgid "Taakonderzoek en interviews" msgstr "Task-based research and interviews" -#: studies/models.py:265 +#: studies/models.py:276 msgid "Hoeveel sessies met taakonderzoek zullen de deelnemers doorlopen?" msgstr "How many sessions of tasks will the participants take part in?" -#: studies/models.py:268 +#: studies/models.py:283 msgid "" "Wanneer je bijvoorbeeld eerst de deelnemer een taak/aantal taken laat doen " "tijdens een eerste bezoek aan het lab en je laat de deelnemer nog een keer " @@ -4590,7 +4388,7 @@ msgstr "" "experiment to consist of two sessions. If multiple tasks are executed on the " "same day, with breaks in between, this is still considered to be one session." -#: studies/models.py:275 +#: studies/models.py:293 msgid "" "Is er binnen bovenstaand onderzoekstraject sprake van misleiding van de " "deelnemer?" @@ -4598,7 +4396,7 @@ msgstr "" "Does the above research trajectory involve misrepresentation to the " "participant?" -#: studies/models.py:277 +#: studies/models.py:297 msgid "" "Misleiding is het doelbewust verschaffen van inaccurate informatie over het " "doel en/of belangrijke aspecten van de gang van zaken tijdens het onderzoek. " @@ -4615,7 +4413,7 @@ msgstr "" "crucial memory task without announcing it, or giving false feedback. Fillers " "do not count as misrepresentation." -#: studies/models.py:288 +#: studies/models.py:311 msgid "" "Geef een toelichting en beschrijf hoe en wanneer de deelnemer zal worden " "gedebrieft." @@ -4623,7 +4421,7 @@ msgstr "" "Give an explanation and describe how and when the participant will be " "debriefed." -#: studies/models.py:292 +#: studies/models.py:318 msgid "" "Bevat bovenstaand onderzoekstraject elementen die tijdens de " "deelname niet-triviale negatieve emoties kunnen opwekken? Denk hierbij " @@ -4636,11 +4434,11 @@ msgstr "" "consider emotionally probing questions, insulting utterances, negative " "feedback, and frustrating, difficult, (very) long and/or (very) boring tasks." -#: studies/models.py:301 +#: studies/models.py:328 msgid "Licht je antwoord toe." msgstr "Explain your answer." -#: studies/models.py:304 +#: studies/models.py:331 msgid "" "Bevat bovenstaand onderzoekstraject elementen die tijdens de deelname " "zodanig belastend zijn dat deze ondanks de verkregen informed consentmeer " @@ -4695,7 +4493,7 @@ msgstr "" "em> minimal? I.e. is the chance of and/or magnitude of potential damage to " "participants clearly above that of the \"background risk\"?" -#: studies/models.py:332 +#: studies/models.py:372 msgid "" "Achtergrondrisico is datgene dat gezonde, gemiddelde burgers in de relevante " "leeftijdscategorie normaalgesproken in het dagelijks leven ten deel valt. " @@ -4722,16 +4520,16 @@ msgstr "" "evaluation, intelligence test, or heart rate measurement after physical " "exercise, all of which performed under professional supervision." -#: studies/models.py:437 +#: studies/models.py:479 #, python-format msgid "Study details for proposal %s" msgstr "Study details for proposal %s" -#: studies/models.py:442 +#: studies/models.py:484 msgid "Maak je gebruik van passieve informed consent?" msgstr "Will you use passive informed consent?" -#: studies/models.py:443 +#: studies/models.py:487 msgid "" "Wanneer je kinderen via een instelling (dus ook school) werft en je de " "ouders niet laat ondertekenen, maar in plaats daarvan de leiding van die " @@ -4747,7 +4545,7 @@ msgstr "" "a>." # studies/models.py:229 -#: studies/models.py:453 +#: studies/models.py:500 msgid "" "Licht je antwoord toe. Wij willen je wijzen op het reglement, sectie 3.1 'd' " "en 'e'. Passive consent is slechts in enkele gevallen toegestaan en draagt " @@ -4757,16 +4555,16 @@ msgstr "" "'d' and 'e'. Passive consent is allowed under certain situations but is not " "preferred by the committee." -#: studies/models.py:469 +#: studies/models.py:517 msgid "Upload hier de toestemmingsverklaring (in .pdf of .doc(x)-formaat)" msgstr "" "Please upload the declaration of consent here (in .pdf or .doc(x)-format)" -#: studies/models.py:477 +#: studies/models.py:525 msgid "Upload hier de informatiebrief (in .pdf of .doc(x)-formaat)" msgstr "Please upload the information letter here (in .pdf or .doc(x)-format)" -#: studies/models.py:486 +#: studies/models.py:534 msgid "" "Upload hier de toestemmingsverklaring voor de leiding of het management van " "de instelling (in .pdf of .doc(x)-format)" @@ -4774,7 +4572,7 @@ msgstr "" "Please upload the declaration of consent for the management of the school or " "institution (in .pdf or .doc(x)-format)" -#: studies/models.py:489 +#: studies/models.py:539 msgid "" "Upload indien mogelijk een ondertekende versie van het document. Upload als " "deze nog niet bestaat een blanco versie, en stuur de ondertekende versie " @@ -4785,7 +4583,7 @@ msgstr "" "and follow up by sending a signed copy to the secretary of the FEtC-H once " "available." -#: studies/models.py:496 +#: studies/models.py:547 msgid "" "Upload hier de informatiebrief voor de leiding of het management van de " "instelling (in .pdf of .doc(x)-formaat)" @@ -4793,7 +4591,7 @@ msgstr "" "Please upload the the information letter for the management of the school or " "institution (in .pdf or .doc(x)-format)" -#: studies/models.py:505 +#: studies/models.py:557 msgid "" "Upload hier de informatiebrief voor de ouders of verzorgers (in .pdf of ." "doc(x)-formaat)" @@ -4801,66 +4599,52 @@ msgstr "" "Please upload the the information letter for parents or guardians here (in ." "pdf or .doc(x)-format)" -#: studies/templates/studies/session_start.html:21 +#: studies/templates/studies/session_start.html:19 msgid "" -"\n" -" In de volgende vragen gaan we nader in op wat je in jouw " -"onderzoek van je deelnemers zal verlangen. Daarbij gelden de volgende " -"definities:\n" -" " +"In de volgende vragen gaan we nader in op wat je in jouw onderzoek van je " +"deelnemers zal verlangen. Daarbij gelden de volgende definities:" msgstr "" -"\n" -" The following questions probe further into the demands of your task-" -"based study on your participants. The following definitions will apply:\n" -" " +"The following questions probe further into the demands of your task-based " +"study on your participants. The following definitions will apply:" -#: studies/templates/studies/session_start.html:26 +#: studies/templates/studies/session_start.html:24 msgid "" -"\n" -" Sessie: Het geheel van de voor je onderzoek " -"benodigde betrokkenheid die je op één dag van een deelnemer vraagt. Bij een " +"Sessie: Het geheel van de voor je onderzoek benodigde " +"betrokkenheid die je op één dag van een deelnemer vraagt. Bij een " "labonderzoek is dat bijvoorbeeld alles wat er van onderzoekswege gebeurt " "vanaf het moment dat je de deelnemer ontvangt tot het moment dat je afscheid " "neemt, inclusief de benodigde pauzes. En bij een internet-vragenlijst is dat " "alles wat er van onderzoekswege gebeurt vanaf het welkomstscherm tot de " "afronding van de (reeks) vragenlijst(en), wederom inclusief benodigde " "pauzes. Bij veldwerk is dat de tijd dat je met de deelnemer in interactie " -"bent op één dag.\n" -" " -msgstr "" -"\n" -" Session: The entirety of the commitment which you " -"require of a participant in one day. In lab-based research, for example, " -"that means everything which happens as part of the research from the moment " -"you welcome the participant to the moment you part company from them, " -"including any necessary breaks. In an internet survey this means everything " -"which happens as part of the research from the welcome screen to the " -"conclusion of the (series of) survey(s), again including any necessary " -"breaks. For fieldwork, it refers to the time that you interact with the " -"participant on one day.\n" -" " - -#: studies/templates/studies/session_start.html:31 -msgid "" -"\n" -" Taak: Een coherente verzameling handelingen " -"die je via een gesproken of geschreven taak-instructie aan de deelnemer " -"oplegt, en ook als zodanig als 'taak' in een artikel zou beschrijven " -"(bijvoorbeeld: \"Beluister de volgende 200 zinnetjes en druk op een knop als " -"je een fout ontdekt\", \"Vul persoonlijkheidsvragenlijst X in\", \"Speel 10 " -"minuten met je kind zoals je dat thuis doet\", “houd 1 week een dagboek bij " -"van jouw media-gebruik”, “wil je je gender identiteit beschrijven”, “maak " -"foto’s van plekken in jouw leefomgeving die je bedreigend en inspirerend " -"vindt”, “zoek en deel met ons 10 foto’s uit jouw prive-archief om je " -"levensverhaal te kunnen vertellen”). Indien de specifieke opdracht aan de " -"deelnemer per item varieert (bijvoorbeeld: \"bij een Nederlandse zin " -"beoordeel je de betekenis, bij een Engelse zin de grammatica\"), beschouw " -"dit dan gewoon als één taak.\n" -" " -msgstr "" -"\n" -" Task: This refers to a coherent collection of actions " -"which you instruct the participant to perform via a spoken or written set of " +"bent op één dag." +msgstr "" +"Session: The entirety of the commitment which you require " +"of a participant in one day. In lab-based research, for example, that means " +"everything which happens as part of the research from the moment you welcome " +"the participant to the moment you part company from them, including any " +"necessary breaks. In an internet survey this means everything which happens " +"as part of the research from the welcome screen to the conclusion of the " +"(series of) survey(s), again including any necessary breaks. For fieldwork, " +"it refers to the time that you interact with the participant on one day." + +#: studies/templates/studies/session_start.html:29 +msgid "" +"Taak: Een coherente verzameling handelingen die je via een " +"gesproken of geschreven taak-instructie aan de deelnemer oplegt, en ook als " +"zodanig als 'taak' in een artikel zou beschrijven (bijvoorbeeld: \"Beluister " +"de volgende 200 zinnetjes en druk op een knop als je een fout ontdekt\", " +"\"Vul persoonlijkheidsvragenlijst X in\", \"Speel 10 minuten met je kind " +"zoals je dat thuis doet\", “houd 1 week een dagboek bij van jouw media-" +"gebruik”, “wil je je gender identiteit beschrijven”, “maak foto’s van " +"plekken in jouw leefomgeving die je bedreigend en inspirerend vindt”, “zoek " +"en deel met ons 10 foto’s uit jouw prive-archief om je levensverhaal te " +"kunnen vertellen”). Indien de specifieke opdracht aan de deelnemer per item " +"varieert (bijvoorbeeld: \"bij een Nederlandse zin beoordeel je de betekenis, " +"bij een Engelse zin de grammatica\"), beschouw dit dan gewoon als één taak." +msgstr "" +"Task: This refers to a coherent collection of actions which " +"you instruct the participant to perform via a spoken or written set of " "instructions, and which would also be described as a 'task' in an article (e." "g. \"Listen to the following 200 sentences and press a button when you hear " "a mistake\", \"Fill in personality questionnaire X\", \"Play with your child " @@ -4876,102 +4660,62 @@ msgstr "" "For each session we will ask the same questions in the following pages." #: studies/templates/studies/study_design.html:7 -#: studies/templates/studies/study_design.html:17 +#: studies/templates/studies/study_design.html:16 msgid "De onderzoekstype(n)" msgstr "Type(s) of research" -#: studies/templates/studies/study_design.html:21 +#: studies/templates/studies/study_design.html:19 msgid "" -"\n" -" De FETC-GW onderscheidt 3 typen onderzoek (die evt. ook " -"samen in één aanvraag voor kunnen komen):\n" -" " +"De FETC-GW onderscheidt 3 typen onderzoek (die evt. ook samen in één " +"aanvraag voor kunnen komen):" msgstr "" -"\n" -" The FEtC-H distinguishes 3 types of research (which may all be used " -"within one application):\n" -" " +"The FEtC-H distinguishes 3 types of research (which may all be used within " +"one application):" -#: studies/templates/studies/study_design.html:28 +#: studies/templates/studies/study_design.html:26 msgid "" -"\n" -" Interventieonderzoek:
      \n" -" De onderzoeker manipuleert d.m.v. een " -"interventie de context waarin de deelnemers in hun normale leven " -"doen wat ze normaliter ook doen.
      \n" -" De effecten kunnen gelijktijdig en/of achteraf " -"worden geobserveerd.\n" -" " +"Interventieonderzoek:
      De onderzoeker manipuleert d.m." +"v. een interventie de context waarin de deelnemers in hun normale " +"leven doen wat ze normaliter ook doen.
      De effecten kunnen " +"gelijktijdig en/of achteraf worden geobserveerd." msgstr "" -"\n" -" Interventional research:
      \n" -" The researcher uses an intervention to " -"manipulate the context in which participants do what they would otherwise " -"also do in their daily lives.
      Effects may be measured immediately or " -"after the fact.\n" -" " +"Interventional research:
      The researcher uses an " +"intervention to manipulate the context in which participants do " +"what they would otherwise also do in their daily lives.
      Effects may be " +"measured immediately or after the fact." #: studies/templates/studies/study_design.html:37 msgid "" -"\n" -" Observatieonderzoek:
      \n" -" De onderzoeker observeert deelnemers in hun " -"normale leven, maar grijpt hier niet op in.\n" -" " +"Observatieonderzoek:
      De onderzoeker observeert " +"deelnemers in hun normale leven, maar grijpt hier niet op in." msgstr "" -"\n" -" Observational research:
      \n" -"The researcher observes participants in their daily lives, but does not " -"interfere.\n" -" " +"Observational research:
      The researcher observes " +"participants in their daily lives, but does not interfere." -#: studies/templates/studies/study_design.html:45 +#: studies/templates/studies/study_design.html:46 msgid "" -"\n" -" Taakonderzoek en Interviews:\n" -" De onderzoeker\n" -"
        \n" -"
      • legt deelnemers een taak op (bijv. " -"vragenlijst, experiment) of
      • \n" -"
      • neemt een interview af, of
      • \n" -"
      • vraagt deelnemer deel te nemen aan een " -"focusgroep.
      • \n" -"

      \n" -" Onderzoek in het ILS-lab is vanwege de locatie " -"per definitie altijd taakonderzoek (óók als de deelnemers na ontvangst " -"alleen maar worden geobserveerd).\n" -" " +"Taakonderzoek en Interviews:
      De onderzoeker
        " +"
      • legt deelnemers een taak op (bijv. vragenlijst, experiment) of
      • " +"
      • neemt een interview af, of
      • vraagt deelnemer deel te nemen aan " +"een focusgroep.

      Onderzoek in het ILS-lab is vanwege de " +"locatie per definitie altijd taakonderzoek (óók als de deelnemers na " +"ontvangst alleen maar worden geobserveerd)." msgstr "" -"\n" -" Task-based research and interviews:
      \n" -" The researcher\n" -"
        \n" -"
      • gives participants a task to fulfil " -"(such as a questionnaire or experiment), or
      • \n" -"
      • interviews participants, or
      • \n" -"
      • asks participants to partake in a focus " -"group.
      • \n" -"

      \n" -" Research that takes place at the ILS-labs is " -"always categorized as task-based research due to the location (even if " -"participants are only observed after their arrival).\n" -" " - -#: studies/templates/studies/study_design.html:63 +"Task-based research and interviews:
      The researcher
        " +"
      • gives participants a task to fulfil (such as a questionnaire or " +"experiment), or
      • interviews participants, or
      • asks " +"participants to partake in a focus group.

      Research that " +"takes place at the ILS-labs is always categorized as task-based research " +"due to the location (even if participants are only observed after their " +"arrival)." + +#: studies/templates/studies/study_design.html:67 msgid "" -"\n" -" Om welk type onderzoek gaat het hier?\n" -" Je kan meerdere opties aankruisen.\n" -" " +"Om welk type onderzoek gaat het hier? Je kan meerdere opties aankruisen." msgstr "" -"\n" -" What type of research will be used here?\n" -" You can select multiple options.\n" -" " +"What type of research will be used here? You can select multiple options." -#: studies/templates/studies/study_design.html:79 +#: studies/templates/studies/study_design.html:83 msgid "" "Dit is bijvoorbeeld het geval wanneer je een observatiedeel combineert met " "een taakonderzoeksdeel, of met een interventiedeel (in dezelfde sessie, of " @@ -4988,167 +4732,121 @@ msgstr "" "otherwise would not be carried out) you should specify this separately as " "task-based research." -#: studies/templates/studies/study_design.html:95 +#: studies/templates/studies/study_design.html:99 msgid "" -"\n" -" Voor elk door jou aangekruiste type onderzoek kan je " -"op de hiernavolgende pagina's\n" -" de relevante informatie verschaffen.\n" -" " +"Voor elk door jou aangekruiste type onderzoek kan je op de hiernavolgende " +"pagina's de relevante informatie verschaffen." msgstr "" -"\n" -" For each type of research selected you can supply the relevant " -"information\n" -" on the following pages.\n" -" " +"For each type of research selected you can supply the relevant information " +"on the following pages." -#: studies/templates/studies/study_end.html:32 +#: studies/templates/studies/study_end.html:30 #, python-format -msgid "" -"\n" -" Deelnemers uit de leeftijdscategorieën " -"%(age_groups)s\n" -" " -msgstr "" -"\n" -" Participants from the age categories %(age_groups)s\n" -" " +msgid "Deelnemers uit de leeftijdscategorieën %(age_groups)s" +msgstr "Participants from the age categories %(age_groups)s" -#: studies/templates/studies/study_end.html:36 +#: studies/templates/studies/study_end.html:34 #, python-format -msgid "" -"\n" -" en met de bijzondere kenmerken %(traits)s\n" -" " -msgstr "" -"\n" -" and with the following special characteristics %(traits)s\n" -" " +msgid "en met de bijzondere kenmerken %(traits)s" +msgstr "and with the following special characteristics %(traits)s" -#: studies/templates/studies/study_end.html:40 -msgid "" -"\n" -" zonder bijzondere kenmerken\n" -" " -msgstr "" -"\n" -" without any special characteristics\n" -" " +#: studies/templates/studies/study_end.html:38 +msgid "zonder bijzondere kenmerken" +msgstr "without any special characteristics" -#: studies/templates/studies/study_end.html:45 -msgid "" -"\n" -" en zijnde wilsonbekwaam\n" -" " -msgstr "" -"\n" -" who are also incapable of giving informed consent\n" -" " +#: studies/templates/studies/study_end.html:43 +msgid "en zijnde wilsonbekwaam" +msgstr "who are also incapable of giving informed consent" -#: studies/templates/studies/study_end.html:49 -msgid "" -"\n" -" zullen aan de volgende onderdelen meedoen:\n" -" " -msgstr "" -"\n" -" will participate in the following parts:\n" -" " +#: studies/templates/studies/study_end.html:47 +msgid "zullen aan de volgende onderdelen meedoen:" +msgstr "will participate in the following parts:" -#: studies/templates/studies/study_end.html:61 +#: studies/templates/studies/study_end.html:59 msgid "Interventie bewerken" msgstr "Edit intervention" -#: studies/templates/studies/study_end.html:68 +#: studies/templates/studies/study_end.html:66 msgid "Aantal sessies (per week)" msgstr "Number of session (per week)" -#: studies/templates/studies/study_end.html:69 +#: studies/templates/studies/study_end.html:67 msgid "Duur per sessie (in minuten)" msgstr "Session duration (in minutes)" -#: studies/templates/studies/study_end.html:70 +#: studies/templates/studies/study_end.html:68 msgid "Controlegroep?" msgstr "Control group?" -#: studies/templates/studies/study_end.html:78 +#: studies/templates/studies/study_end.html:76 +#: studies/templates/studies/study_end.html:114 +#: studies/templates/studies/study_end.html:115 #: studies/templates/studies/study_end.html:116 #: studies/templates/studies/study_end.html:117 -#: studies/templates/studies/study_end.html:118 -#: studies/templates/studies/study_end.html:119 msgid "ja, nee" msgstr "yes, no" -#: studies/templates/studies/study_end.html:92 +#: studies/templates/studies/study_end.html:90 msgid "Observatie bewerken" msgstr "Edit observation" -#: studies/templates/studies/study_end.html:99 +#: studies/templates/studies/study_end.html:97 msgid "Aantal dagen" msgstr "Number of days" -#: studies/templates/studies/study_end.html:100 +#: studies/templates/studies/study_end.html:98 msgid "Duur per sessie (in uren)" msgstr "Duration per session (in hours)" -#: studies/templates/studies/study_end.html:101 +#: studies/templates/studies/study_end.html:99 msgid "Anoniem?" msgstr "Anonymous?" -#: studies/templates/studies/study_end.html:102 +#: studies/templates/studies/study_end.html:100 msgid "Doelgroep?" msgstr "Target group?" -#: studies/templates/studies/study_end.html:103 +#: studies/templates/studies/study_end.html:101 msgid "Niet openbaar?" msgstr "Non-public?" -#: studies/templates/studies/study_end.html:104 +#: studies/templates/studies/study_end.html:102 msgid "Toestemming nodig?" msgstr "Permission necessary?" -#: studies/templates/studies/study_end.html:106 +#: studies/templates/studies/study_end.html:104 msgid "Instantie" msgstr "Institution" -#: studies/templates/studies/study_end.html:108 +#: studies/templates/studies/study_end.html:106 #: tasks/templates/tasks/task_list.html:9 msgid "Registratie via" msgstr "Recording via" -#: studies/templates/studies/study_end.html:133 +#: studies/templates/studies/study_end.html:129 msgid "Takenonderzoek met de volgende opbouw:" msgstr "Task-based research structured as follows:" -#: studies/templates/studies/study_end.html:142 +#: studies/templates/studies/study_end.html:138 #: tasks/templates/tasks/session_confirm_delete.html:6 -#: tasks/templates/tasks/session_confirm_delete.html:14 +#: tasks/templates/tasks/session_confirm_delete.html:12 msgid "Sessie verwijderen" msgstr "Delete session" -#: studies/templates/studies/study_end.html:146 -#: tasks/templates/tasks/task_end.html:23 +#: studies/templates/studies/study_end.html:143 +#: tasks/templates/tasks/task_end.html:20 msgid "Deze sessie bestaat uit de volgende taken:" msgstr "This session consists of the following tasks:" -#: studies/templates/studies/study_end.html:156 +#: studies/templates/studies/study_end.html:153 msgid "" -"\n" -" Beantwoord op basis van dit overzicht de volgende " -"vragen,\n" -" en ga daarbij uit van het naar verwachting meest " -"kwetsbare c.q.\n" -" minst belastbare (bijv. jongste) geselecteerde " -"deelnemerstype\n" -" dat dit traject doorloopt.\n" -" " +"Beantwoord op basis van dit overzicht de volgende vragen, en ga daarbij uit " +"van het naar verwachting meest kwetsbare c.q. minst belastbare (bijv. " +"jongste) geselecteerde deelnemerstype dat dit traject doorloopt." msgstr "" -"\n" -" On the basis of this overview answer the following questions\n" -" with respect to those participants who are most vulnerable or least\n" -" able to bear any burden (e.g. the youngest) to follow this\n" -" trajectory.\n" -" " +"On the basis of this overview answer the following questions with respect to " +"those participants who are most vulnerable or least able to bear any burden " +"(e.g. the youngest) to follow this trajectory." #: studies/templates/studies/study_form.html:22 msgid "De leeftijdsgroep van je deelnemers" @@ -5174,42 +4872,26 @@ msgstr "Compensation" msgid "Hiërarchie" msgstr "Hierarchy" -#: studies/templates/studies/study_form.html:90 +#: studies/templates/studies/study_form.html:85 #, python-format msgid "" -"\n" -" Let op! Je hebt de vraag 'In " -"welke hoedanigheid ben je betrokken bij deze aanvraag?' nog niet " -"ingevuld, waardoor deze pagina nog kan veranderen op basis van je antwoord.\n" -" " +"Let op! Je hebt de vraag 'In welke hoedanigheid ben je " +"betrokken bij deze aanvraag?' nog niet ingevuld, waardoor deze pagina " +"nog kan veranderen op basis van je antwoord." msgstr "" -"\n" -" Warning! The question 'In welke " -"hoedanigheid ben je betrokken bij deze aanvraag?' has not been answered " -"yet. This page might change depending on your answer.\n" -" " +"Warning! The question 'In what capacity are you involved " +"in this application?' has not been answered yet. This page might change " +"depending on your answer." #: studies/templates/studies/study_title.html:6 #, python-format -msgid "" -"\n" -" Traject %(order)s (%(name)s)\n" -" " -msgstr "" -"\n" -" Trajectory %(order)s (%(name)s)\n" -" " +msgid "Traject %(order)s (%(name)s)" +msgstr "Trajectory %(order)s (%(name)s)" #: studies/templates/studies/study_title.html:10 #, python-format -msgid "" -"\n" -" Traject %(order)s\n" -" " -msgstr "" -"\n" -" Trajectory %(order)s\n" -" " +msgid "Traject %(order)s" +msgstr "Trajectory %(order)s" #: studies/templatetags/describe_documents.py:23 msgid "bestand" @@ -5239,7 +4921,7 @@ msgstr "information letter for parents" msgid "data management plan" msgstr "data management plan" -#: studies/templatetags/describe_documents.py:62 +#: studies/templatetags/describe_documents.py:64 msgid "" "\n" " {} bij {} van aanvraag {}-{}: {}\n" @@ -5249,7 +4931,7 @@ msgstr "" "{} of {} in application {}-{}: {}\n" " " -#: studies/templatetags/describe_documents.py:71 +#: studies/templatetags/describe_documents.py:76 msgid "" "\n" " {} van aanvraag {}-{}: {}\n" @@ -5259,48 +4941,48 @@ msgstr "" "{} of application {}-{}: {}\n" " " -#: studies/utils.py:63 +#: studies/utils.py:67 msgid "Deelnemers" msgstr "Participants" -#: studies/utils.py:69 +#: studies/utils.py:73 msgid "Onderzoekstype(n)" msgstr "Type(s) of research" -#: studies/utils.py:84 +#: studies/utils.py:88 msgid "Overzicht" msgstr "Overview" -#: studies/utils.py:92 +#: studies/utils.py:96 msgid "Traject {}" msgstr "Trajectory {}" -#: studies/views/session_views.py:22 +#: studies/views/session_views.py:24 #, python-format msgid "%(sessions_number)s sessie(s) voor studie %(title)s aangemaakt" msgstr "%(sessions_number)s sessions for application %(title)s created" -#: studies/views/study_views.py:29 +#: studies/views/study_views.py:36 msgid "Studie opgeslagen" msgstr "Application saved" -#: studies/views/study_views.py:63 +#: studies/views/study_views.py:70 msgid "Traject opgeslagen" msgstr "Trajectory saved" -#: tasks/forms.py:17 +#: tasks/forms.py:19 msgid "Is deze sessie een kopie van een voorgaande sessie?" msgstr "Is this session a copy of a previous session?" -#: tasks/forms.py:18 +#: tasks/forms.py:20 msgid "Na het kopiëren zijn alle velden bewerkbaar." msgstr "All fields can be edited after copying." -#: tasks/forms.py:23 +#: tasks/forms.py:26 msgid "Te kopiëren sessie" msgstr "Session to be copied" -#: tasks/forms.py:101 tasks/models.py:137 +#: tasks/forms.py:125 tasks/models.py:144 msgid "" "Wat is de duur van deze taak van begin tot eind in minuten, " "dus vanaf het moment dat de taak van start gaat tot en met het einde van de " @@ -5314,7 +4996,7 @@ msgstr "" "criterion), indicate the maximum duration that can reasonably be " "expected." -#: tasks/forms.py:181 +#: tasks/forms.py:217 msgid "Totale sessieduur moet minstens gelijk zijn aan netto sessieduur." msgstr "" "The total duration of the session must be at least as long as the net " @@ -5325,7 +5007,7 @@ msgid "Hoeveel taken worden er binnen deze sessie bij de deelnemer afgenomen?" msgstr "" "How many tasks will each participant have to carry out in this session?" -#: tasks/models.py:17 +#: tasks/models.py:21 msgid "" "Wanneer je bijvoorbeeld eerst de deelnemer observeert en de deelnemer " "vervolgens een vragenlijst afneemt, dan vul je hierboven \"2\" in. " @@ -5337,7 +5019,7 @@ msgstr "" "session debriefing and a short (<3 minute) exit interview are not counted as " "tasks." -#: tasks/models.py:24 +#: tasks/models.py:30 #, python-format msgid "" "De totale geschatte netto taakduur van je sessie komt op basis van je opgave " @@ -5351,19 +5033,19 @@ msgstr "" "task, breaks between tasks, and debriefing? (in case of a lab visit from " "entering the lab until leaving)" -#: tasks/models.py:84 +#: tasks/models.py:88 msgid "Sessie {}" msgstr "Session {}" -#: tasks/models.py:98 +#: tasks/models.py:102 msgid "Vastlegging gedrag" msgstr "Registration of behaviour" -#: tasks/models.py:121 +#: tasks/models.py:125 msgid "Wat is de naam van de taak?" msgstr "What is the title of the task?" -#: tasks/models.py:127 +#: tasks/models.py:132 msgid "" "Beschrijf de taak die de deelnemer moet uitvoeren, en leg kort uit hoe deze " "taak (en de eventuele manipulaties daarbinnen) aan de beantwoording van jouw " @@ -5379,7 +5061,7 @@ msgstr "" "participant. The committee members need to be in the clear on your exact " "plans." -#: tasks/models.py:149 +#: tasks/models.py:158 msgid "" "Hoe wordt het gedrag of de toestand van de deelnemer bij deze taak " "vastgelegd?" @@ -5387,7 +5069,7 @@ msgstr "" "How will the behaviour or the state of the participant be recorded in this " "task?" -#: tasks/models.py:150 +#: tasks/models.py:161 msgid "" "Opnames zijn nooit anoniem en niet te anonimiseren. Let hierop bij het " "gebruik van de term ‘anoniem’ of ‘geanonimiseerd’ in je documenten " @@ -5405,11 +5087,11 @@ msgstr "" "versie-1.1_21dec2021.pdf' target='_blank'>Guidelines for Informed Consent, " "‘Audio and Video’ (in Dutch)." -#: tasks/models.py:164 +#: tasks/models.py:176 msgid "Kies het soort meting" msgstr "Select the type of measurement" -#: tasks/models.py:175 +#: tasks/models.py:188 msgid "" "Krijgt de deelnemer tijdens of na deze taak feedback op hun gedrag of " "toestand?" @@ -5417,54 +5099,37 @@ msgstr "" "Will the participant receive feedback on their behaviour or state during or " "after this task?" -#: tasks/models.py:182 +#: tasks/models.py:196 msgid "Beschrijf hoe de feedback wordt gegeven." msgstr "Describe how the feedback will be given." -#: tasks/models.py:206 +#: tasks/models.py:220 msgid "Taak {} in sessie {}" msgstr "Task {} in session {}" #: tasks/templates/tasks/session_title.html:6 #, python-format -msgid "" -"\n" -" Traject %(study_order)s (%(study_name)s), sessie %(order)s\n" -" " +msgid "Traject %(study_order)s (%(study_name)s), sessie %(order)s" msgstr "" -"\n" -" Trajectory %(study_order)s (%(study_name)s), session %(order)s\n" -" " +"Trajectory %(study_order)s (%(study_name)s), session %(order)s" #: tasks/templates/tasks/session_title.html:12 #, python-format -msgid "" -"\n" -" Traject %(study_order)s (%(study_name)s)\n" -" " -msgstr "" -"\n" -" Trajectory %(study_order)s (%(study_name)s)\n" -" " +msgid "Traject %(study_order)s (%(study_name)s)" +msgstr "Trajectory %(study_order)s (%(study_name)s)" #: tasks/templates/tasks/session_title.html:18 #, python-format -msgid "" -"\n" -" Sessie %(order)s\n" -" " -msgstr "" -"\n" -" Session %(order)s\n" -" " +msgid "Sessie %(order)s" +msgstr "Session %(order)s" #: tasks/templates/tasks/task_confirm_delete.html:6 -#: tasks/templates/tasks/task_confirm_delete.html:13 -#: tasks/templates/tasks/task_list.html:29 +#: tasks/templates/tasks/task_confirm_delete.html:12 +#: tasks/templates/tasks/task_list.html:32 msgid "Taak verwijderen" msgstr "Delete task" -#: tasks/templates/tasks/task_end.html:27 +#: tasks/templates/tasks/task_end.html:24 msgid "Beantwoord op basis van dit overzicht de volgende vragen:" msgstr "Answer the following questions on the basis of this overview:" @@ -5492,40 +5157,30 @@ msgstr "We will ask the same questions for each task on the next few pages." #: tasks/templates/tasks/task_title.html:6 #, python-format msgid "" -"\n" -" Traject %(study_order)s (%(study_name)s), sessie " -"%(session_order)s, taak %(order)s\n" -" " +"Traject %(study_order)s (%(study_name)s), sessie %(session_order)s, " +"taak %(order)s" msgstr "" -"\n" -" Trajectory %(study_order)s (%(study_name)s), session " -"%(session_order)s, task %(order)s\n" -" " +"Trajectory %(study_order)s (%(study_name)s), session " +"%(session_order)s, task %(order)s" #: tasks/templates/tasks/task_title.html:12 #, python-format -msgid "" -"\n" -" Sessie %(session_order)s, taak %(order)s\n" -" " -msgstr "" -"\n" -" Session %(session_order)s, task %(order)s\n" -" " +msgid "Sessie %(session_order)s, taak %(order)s" +msgstr "Session %(session_order)s, task %(order)s" -#: tasks/utils.py:32 +#: tasks/utils.py:36 msgid "Takenonderzoek" msgstr "Task-based research" -#: tasks/utils.py:40 +#: tasks/utils.py:45 msgid "Het takenonderzoek: sessie {}" msgstr "Task-based research: session {}" -#: tasks/utils.py:47 +#: tasks/utils.py:54 msgid "Overzicht van takenonderzoek: sessie {}" msgstr "Overview of task-based research: session {}" -#: tasks/utils.py:62 +#: tasks/utils.py:71 msgid "Het takenonderzoek: sessie {} taak {}" msgstr "Task-based research: session {} task {}" @@ -5533,19 +5188,19 @@ msgstr "Task-based research: session {} task {}" msgid "Sessie verwijderd" msgstr "Session deleted" -#: tasks/views/session_views.py:55 +#: tasks/views/session_views.py:56 #, python-format msgid "%(tasks_number)s ta(a)k(en) aangemaakt" msgstr "%(tasks_number)s task(s) created" -#: tasks/views/session_views.py:131 +#: tasks/views/session_views.py:135 msgid "Taken toevoegen beëindigd" msgstr "Finished adding tasks" -#: tasks/views/task_views.py:21 +#: tasks/views/task_views.py:22 msgid "Taak bewerkt" msgstr "Task edited" -#: tasks/views/task_views.py:50 +#: tasks/views/task_views.py:56 msgid "Taak verwijderd" msgstr "Task deleted" From b6788d434cdc07c2a82bbd29271def3349e06368 Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 12 Jan 2024 15:36:40 +0100 Subject: [PATCH 120/148] ci: run linter checks for PR's --- .../workflows/check-missing-migrations.yml | 24 --------- .github/workflows/pr-checks.yml | 52 +++++++++++++++++++ 2 files changed, 52 insertions(+), 24 deletions(-) delete mode 100644 .github/workflows/check-missing-migrations.yml create mode 100644 .github/workflows/pr-checks.yml diff --git a/.github/workflows/check-missing-migrations.yml b/.github/workflows/check-missing-migrations.yml deleted file mode 100644 index 1d5423359..000000000 --- a/.github/workflows/check-missing-migrations.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Check for missing migrations - -on: - pull_request: -jobs: - run-check: - runs-on: ubuntu-latest - steps: - - name: Install OS dependencies - run: | - sudo apt-get update - sudo apt-get install libldap2-dev libsasl2-dev libssl-dev gettext poppler-utils poppler-data libpoppler-cpp-dev - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - name: Install Dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements.txt - - name: Check for missing migrations - run: | - python manage.py makemigrations --check --dry-run diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 000000000..93d9efd15 --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,52 @@ +name: PR checks + +on: + pull_request: +jobs: + check-migrations: + runs-on: ubuntu-latest + steps: + - name: Install OS dependencies + run: | + sudo apt-get update + sudo apt-get install libldap2-dev libsasl2-dev libssl-dev gettext poppler-utils poppler-data libpoppler-cpp-dev + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Check for missing migrations + run: | + python manage.py makemigrations --check --dry-run + check-djlint: + runs-on: ubuntu-latest + steps: + - name: Install OS dependencies + run: | + sudo apt-get update + sudo apt-get install libldap2-dev libsasl2-dev libssl-dev gettext poppler-utils poppler-data libpoppler-cpp-dev + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: 3.9 + - name: Install Dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Check for missing migrations + run: | + djlint . --check + black-check: # Rhymes with blackjack :D + name: Check if Black thinks everything is correctly formatted + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: psf/black@stable + with: + src: . # Change if you don't want to run black on the entire repo. + From 70bc5891ebd2a4dac237c8d06e5cd03e2041b542 Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 12 Jan 2024 15:39:23 +0100 Subject: [PATCH 121/148] chore: add ignore revs file --- .git-blame-ignore-revs | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..281e74073 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,5 @@ +# Black reformat +135eb9119066aedf946aaf3d22cbb839d59fc038 + +# DJLint reformat +664077453c8fe393cdd8db692a33d515e5db6f69 \ No newline at end of file From 6a4209fdb69e253b3fed2095b7e06c08b96b4800 Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 12 Jan 2024 15:49:23 +0100 Subject: [PATCH 122/148] style: fixed 'intentionally' wrong indentation This is totally not a formatting problem I used to check the checker, which I accidentally left in while committing. Well.... At least we know the CI check works :') --- studies/templates/studies/study_design.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/studies/templates/studies/study_design.html b/studies/templates/studies/study_design.html index c6f8bb79f..d0ed355dc 100644 --- a/studies/templates/studies/study_design.html +++ b/studies/templates/studies/study_design.html @@ -17,7 +17,7 @@

      {% trans "De onderzoekstype(n)" %}

      {% include "studies/study_title.html" %}

      {% blocktrans trimmed %} - De FETC-GW onderscheidt 3 typen onderzoek (die evt. ook samen in één aanvraag voor kunnen komen): + De FETC-GW onderscheidt 3 typen onderzoek (die evt. ook samen in één aanvraag voor kunnen komen): {% endblocktrans %}

        From f39b194c42d042d1bbdfa179aa46a01257951f22 Mon Sep 17 00:00:00 2001 From: "Mees, T.D. (Ty)" Date: Fri, 12 Jan 2024 16:00:36 +0100 Subject: [PATCH 123/148] fix: prevented djlint from messing up one line Okay, didn't realize there is this one case where we use Django-in-CSS. Luckily it's just the one. Right? --- proposals/templates/easy_pdf/base.html | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/proposals/templates/easy_pdf/base.html b/proposals/templates/easy_pdf/base.html index 669599076..27de4b5c4 100644 --- a/proposals/templates/easy_pdf/base.html +++ b/proposals/templates/easy_pdf/base.html @@ -10,13 +10,9 @@ {% block layout_style %} {% endblock %} diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index 23afcada4..7d3452927 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -401,6 +401,16 @@ class ProposalUpdateDataManagement(GroupRequiredMixin, generic.UpdateView): form_class = ProposalUpdateDataManagementForm group_required = settings.GROUP_SECRETARY + def form_valid(self, form): + ret = super().form_valid(form) + # Always regenerate the PDF after updating the DMP + # This is necessary, as the canonical PDF protection might already + # have kicked in if the secretary changes the documents later than + # we initially expected. + self.object.generate_pdf(force_overwrite=True) + + return ret + def get_success_url(self): """Continue to the URL specified in the 'next' POST parameter""" return reverse("reviews:detail", args=[self.object.latest_review().pk]) diff --git a/requirements.txt b/requirements.txt index a3d537aa8..1a6272a9f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --resolver=backtracking +# pip-compile requirements.in # -e git+https://github.com/UiL-OTS-labs/python-docx2txt#egg=docx2txt # via -r requirements.in @@ -21,15 +21,15 @@ asn1crypto==1.5.1 # pyhanko-certvalidator babel==2.14.0 # via sphinx -black==23.12.1 +black==24.2.0 # via -r requirements.in blessed==1.20.0 # via curtsies bpython==0.24 # via -r requirements.in -cdh-django-core @ git+https://github.com/CentreForDigitalHumanities/django-shared-core.git@v3.1.0 +cdh-django-core[federated-auth] @ git+https://github.com/CentreForDigitalHumanities/django-shared-core.git@v3.1.0 # via -r requirements.in -certifi==2023.11.17 +certifi==2024.2.2 # via requests cffi==1.16.0 # via cryptography @@ -46,13 +46,13 @@ closure==20191111 # via uil-django-core colorama==0.4.6 # via djlint -cryptography==41.0.7 +cryptography==42.0.5 # via # pyhanko # pyhanko-certvalidator # pyopenssl # pysaml2 -cssbeautifier==1.14.11 +cssbeautifier==1.15.1 # via djlint cssselect2==0.7.0 # via svglib @@ -68,7 +68,7 @@ defusedxml==0.7.1 # pysaml2 deprecated==1.2.14 # via cdh-django-core -django==3.2.23 +django==3.2.25 # via # -r requirements.in # cdh-django-core @@ -87,7 +87,7 @@ django-auth-ldap==4.6.0 # via -r requirements.in django-braces==1.15.0 # via -r requirements.in -django-debug-toolbar==4.2.0 +django-debug-toolbar==4.3.0 # via -r requirements.in django-extensions==3.2.3 # via -r requirements.in @@ -113,16 +113,12 @@ docutils==0.20.1 # via # sphinx # sphinx-rtd-theme -editorconfig==0.12.3 +editorconfig==0.12.4 # via # cssbeautifier # jsbeautifier -elementpath==4.1.5 +elementpath==4.4.0 # via xmlschema -freetype-py==2.3.0 - # via - # reportlab - # rlpycairo greenlet==3.0.3 # via bpython html-tag-names==0.1.2 @@ -137,21 +133,19 @@ idna==3.6 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==7.0.1 - # via sphinx jinja2==3.1.3 # via sphinx -jsbeautifier==1.14.11 +jsbeautifier==1.15.1 # via # cssbeautifier # djlint -json5==0.9.14 +json5==0.9.22 # via djlint lesscpy==0.15.1 # via uil-django-core lxml==5.1.0 # via svglib -markupsafe==2.1.3 +markupsafe==2.1.5 # via jinja2 mypy-extensions==1.0.0 # via black @@ -159,7 +153,7 @@ mysqlclient==1.4.6 # via -r requirements.in oscrypto==1.3.0 # via pyhanko-certvalidator -packaging==23.2 +packaging==24.0 # via # black # sphinx @@ -176,7 +170,7 @@ pillow==10.2.0 # -r requirements.in # reportlab # xhtml2pdf -platformdirs==4.1.0 +platformdirs==4.2.0 # via black ply==3.11 # via lesscpy @@ -190,8 +184,6 @@ pyasn1==0.5.1 # python-ldap pyasn1-modules==0.3.0 # via python-ldap -pycairo==1.25.1 - # via rlpycairo pycparser==2.21 # via cffi pygments==2.17.2 @@ -199,7 +191,7 @@ pygments==2.17.2 # -r requirements.in # bpython # sphinx -pyhanko==0.21.0 +pyhanko==0.23.0 # via xhtml2pdf pyhanko-certvalidator==0.26.3 # via @@ -207,25 +199,25 @@ pyhanko-certvalidator==0.26.3 # xhtml2pdf pyjwt==2.8.0 # via uil-django-core -pyopenssl==23.3.0 +pyopenssl==24.1.0 # via pysaml2 -pypdf==3.17.4 +pypdf==4.1.0 # via xhtml2pdf pypng==0.20220715.0 # via qrcode -pysaml2==7.4.2 +pysaml2==7.5.0 # via djangosaml2 pyscss==1.4.0 # via uil-django-core python-bidi==0.4.2 # via xhtml2pdf -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via pysaml2 python-ldap==3.4.4 # via django-auth-ldap python-magic==0.4.27 # via -r requirements.in -pytz==2023.3.post1 +pytz==2024.1 # via # django # djangorestframework @@ -240,7 +232,7 @@ qrcode==7.4.2 # via pyhanko regex==2023.12.25 # via djlint -reportlab[pycairo]==4.0.9 +reportlab==4.0.9 # via # svglib # xhtml2pdf @@ -253,8 +245,6 @@ requests==2.31.0 # pysaml2 # sphinx # uil-django-core -rlpycairo==0.3.0 - # via reportlab six==1.16.0 # via # blessed @@ -271,32 +261,27 @@ sphinx==7.2.6 # -r requirements.in # sphinx-rtd-theme # sphinxcontrib-apidoc - # sphinxcontrib-applehelp - # sphinxcontrib-devhelp # sphinxcontrib-django - # sphinxcontrib-htmlhelp # sphinxcontrib-jquery - # sphinxcontrib-qthelp - # sphinxcontrib-serializinghtml sphinx-rtd-theme==2.0.0 # via -r requirements.in -sphinxcontrib-apidoc==0.4.0 +sphinxcontrib-apidoc==0.5.0 # via -r requirements.in -sphinxcontrib-applehelp==1.0.7 +sphinxcontrib-applehelp==1.0.8 # via sphinx -sphinxcontrib-devhelp==1.0.5 +sphinxcontrib-devhelp==1.0.6 # via sphinx sphinxcontrib-django==2.5 # via -r requirements.in -sphinxcontrib-htmlhelp==2.0.4 +sphinxcontrib-htmlhelp==2.0.5 # via sphinx sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.6 +sphinxcontrib-qthelp==1.0.7 # via sphinx -sphinxcontrib-serializinghtml==1.1.9 +sphinxcontrib-serializinghtml==1.1.10 # via sphinx sqlparse==0.4.4 # via @@ -312,14 +297,13 @@ tomli==2.0.1 # via # black # djlint -tqdm==4.66.1 +tqdm==4.66.2 # via djlint -typing-extensions==4.9.0 +typing-extensions==4.10.0 # via # asgiref # black # django-modeltranslation - # pypdf # qrcode tzlocal==5.2 # via pyhanko @@ -327,7 +311,7 @@ ua-parser==0.18.0 # via user-agents uritools==4.0.2 # via pyhanko-certvalidator -urllib3==2.1.0 +urllib3==2.2.1 # via requests user-agents==2.2.0 # via django-user-agents @@ -342,9 +326,7 @@ webencodings==0.5.1 # tinycss2 wrapt==1.16.0 # via deprecated -xhtml2pdf==0.2.13 +xhtml2pdf==0.2.15 # via -r requirements.in -xmlschema==3.0.1 +xmlschema==2.5.1 # via pysaml2 -zipp==3.17.0 - # via importlib-metadata diff --git a/reviews/views.py b/reviews/views.py index 7e903eb8c..bbe716f2e 100644 --- a/reviews/views.py +++ b/reviews/views.py @@ -187,7 +187,7 @@ def get_review_counts_last_year(self): "decision", filter=base_filter & Q(decision__review__proposal__is_revision=True), ), - ) + ).exclude(total=0) class SupervisorDecisionOpenView(BaseDecisionListView): diff --git a/studies/views/study_views.py b/studies/views/study_views.py index 079580752..38e100737 100644 --- a/studies/views/study_views.py +++ b/studies/views/study_views.py @@ -169,6 +169,16 @@ class StudyUpdateAttachments(braces.GroupRequiredMixin, generic.UpdateView): form_class = StudyUpdateAttachmentsForm group_required = settings.GROUP_SECRETARY + def form_valid(self, form): + ret = super().form_valid(form) + # Always regenerate the PDF after updating any study documents + # This is necessary, as the canonical PDF protection might already + # have kicked in if the secretary changes the documents later than + # we initially expected. + self.object.proposal.generate_pdf(force_overwrite=True) + + return ret + def get_success_url(self): """Continue to the URL specified in the 'next' POST parameter""" return self.request.POST.get("next", "/") From 5232285c4c5393d1791c8a6c7ed547a937fb33e0 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 12 Mar 2024 15:32:01 +0100 Subject: [PATCH 142/148] formatting after merge conflict solving --- proposals/templates/proposals/proposal_pdf.html | 1 - proposals/views/proposal_views.py | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/proposals/templates/proposals/proposal_pdf.html b/proposals/templates/proposals/proposal_pdf.html index bc827c3a7..423850555 100644 --- a/proposals/templates/proposals/proposal_pdf.html +++ b/proposals/templates/proposals/proposal_pdf.html @@ -76,7 +76,6 @@ margin-top: 2rem; font-size: 150%; } - {% endblock %} diff --git a/proposals/views/proposal_views.py b/proposals/views/proposal_views.py index abc5b4cf5..141e94095 100644 --- a/proposals/views/proposal_views.py +++ b/proposals/views/proposal_views.py @@ -501,7 +501,10 @@ def form_valid(self, form): # Checks for practice proposals and starting the right # kind of review happen over there. proposal = form.instance - if 'save_back' not in self.request.POST and 'js-redirect-submit' not in self.request.POST: + if ( + "save_back" not in self.request.POST + and "js-redirect-submit" not in self.request.POST + ): start_review(proposal) return success_response From ba3fdaacff71e2bf50f8012e95823e14ace0bb29 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Mar 2024 10:05:41 +0100 Subject: [PATCH 143/148] fix: correct 'start of proposal' redirect for pre_approved --- main/templates/base/form_buttons.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main/templates/base/form_buttons.html b/main/templates/base/form_buttons.html index a3dd2e285..14b23b6ef 100644 --- a/main/templates/base/form_buttons.html +++ b/main/templates/base/form_buttons.html @@ -11,6 +11,9 @@ {% if proposal.is_pre_assessment %} {% trans "Terug naar begin aanvraag" %} + {% elif proposal.is_pre_approved %} + {% trans "Terug naar begin aanvraag" %} {% elif proposal.is_practice %} From a98e3c12bc62cf500e779068d0e3665a814c43d6 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Mar 2024 11:59:24 +0100 Subject: [PATCH 144/148] fix: improve buttons on proposal_confirmation.html --- locale/en/LC_MESSAGES/django.po | 132 +++++++++--------- .../proposals/proposal_confirmation.html | 4 +- 2 files changed, 70 insertions(+), 66 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 423d8517e..e9dc08b76 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-02-01 16:42+0100\n" +"POT-Creation-Date: 2024-03-14 11:57+0100\n" "PO-Revision-Date: 2024-01-17 10:48+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -63,11 +63,11 @@ msgstr "FAQ" msgid "Frequently Asked Questions" msgstr "Frequently Asked Questions" -#: fetc/settings.py:128 +#: fetc/settings.py:129 msgid "Nederlands" msgstr "Dutch" -#: fetc/settings.py:129 +#: fetc/settings.py:130 msgid "Engels" msgstr "English" @@ -204,11 +204,11 @@ msgstr "Log in" msgid "Log uit" msgstr "Log out" -#: main/models.py:8 main/utils.py:15 proposals/utils/pdf_diff_logic.py:244 +#: main/models.py:8 main/utils.py:16 proposals/utils/pdf_diff_logic.py:244 msgid "ja" msgstr "yes" -#: main/models.py:9 main/utils.py:15 proposals/utils/pdf_diff_logic.py:244 +#: main/models.py:9 main/utils.py:16 proposals/utils/pdf_diff_logic.py:244 msgid "nee" msgstr "no" @@ -261,7 +261,7 @@ msgid "Gebruiksersnaam" msgstr "Username" #: main/templates/auth/user_detail.html:21 -#: proposals/templates/proposals/proposal_pdf.html:117 +#: proposals/templates/proposals/proposal_pdf.html:115 msgid "E-mail" msgstr "E-mail" @@ -375,7 +375,6 @@ msgid "Bevestigingsbrief versturen" msgstr "Send confirmation letter" #: main/templates/auth/user_detail.html:97 -#: proposals/templates/proposals/proposal_confirmation.html:38 #: reviews/templates/reviews/vue_templates/decision_list.html:90 #: reviews/templates/reviews/vue_templates/review_list.html:83 msgid "Bevestigingsbrief verstuurd" @@ -386,20 +385,21 @@ msgid "<< Opslaan en vorige stap" msgstr "<< Save and go back to previous step" #: main/templates/base/form_buttons.html:13 -#: main/templates/base/form_buttons.html:17 -#: main/templates/base/form_buttons.html:21 +#: main/templates/base/form_buttons.html:16 +#: main/templates/base/form_buttons.html:20 +#: main/templates/base/form_buttons.html:24 msgid "Terug naar begin aanvraag" msgstr "Return to start of application" -#: main/templates/base/form_buttons.html:26 +#: main/templates/base/form_buttons.html:29 msgid "Terug naar begin traject" msgstr "Back to the beginning of the trajectory" -#: main/templates/base/form_buttons.html:30 +#: main/templates/base/form_buttons.html:33 msgid "Terug naar begin sessie" msgstr "Back to the beginning of the session" -#: main/templates/base/form_buttons.html:34 +#: main/templates/base/form_buttons.html:37 msgid "Opslaan en volgende stap >>" msgstr "Save and go to next step >>" @@ -1051,12 +1051,12 @@ msgstr "" "%(title)s(reference number %(ref_number)s), trajectory %(order)s." #: observations/templates/observations/observation_update_attachments.html:43 -#: proposals/templates/proposals/proposal_confirmation.html:39 +#: proposals/templates/proposals/proposal_confirmation.html:36 #: proposals/templates/proposals/proposal_diff.html:55 #: proposals/templates/proposals/proposal_update_attachments.html:30 #: proposals/templates/proposals/proposal_update_date_start.html:33 #: reviews/templates/reviews/change_chamber_form.html:23 -#: reviews/templates/reviews/decision_form.html:93 +#: reviews/templates/reviews/decision_form.html:92 #: reviews/templates/reviews/review_assign_form.html:46 #: reviews/templates/reviews/review_close_form.html:40 #: reviews/templates/reviews/review_discontinue_form.html:70 @@ -1922,6 +1922,10 @@ msgstr "" "Please state when the confirmation letter for %(title)s has been " "sent here. " +#: proposals/templates/proposals/proposal_confirmation.html:39 +msgid "Verstuur bevestigingsbrief" +msgstr "Send confirmation" + #: proposals/templates/proposals/proposal_copy.html:8 #: proposals/templates/proposals/proposal_copy.html:22 msgid "Revisie starten" @@ -2200,10 +2204,10 @@ msgstr "" #: proposals/templates/proposals/proposal_form_pre_approved.html:7 #: proposals/templates/proposals/proposal_form_pre_approved.html:83 #: proposals/utils/pdf_diff_logic.py:428 proposals/utils/proposal_utils.py:47 -#: proposals/utils/proposal_utils.py:68 proposals/utils/validate_proposal.py:40 -#: proposals/utils/validate_proposal.py:50 -#: proposals/utils/validate_proposal.py:57 -#: proposals/utils/validate_proposal.py:64 +#: proposals/utils/proposal_utils.py:68 proposals/utils/validate_proposal.py:41 +#: proposals/utils/validate_proposal.py:51 +#: proposals/utils/validate_proposal.py:58 +#: proposals/utils/validate_proposal.py:65 msgid "Algemene informatie over de aanvraag" msgstr "General information about the application" @@ -2352,7 +2356,7 @@ msgstr "" "Click to submit an application to " "the archive." -#: proposals/templates/proposals/proposal_pdf.html:86 +#: proposals/templates/proposals/proposal_pdf.html:84 #, python-format msgid "" "FETC-GW - %(title)s (referentienummer %(reviewing_committee)s-" @@ -2361,25 +2365,25 @@ msgstr "" "FEtC-H - %(title)s (reference number %(reviewing_committee)s-" "%(reference_number)s, submitted by %(submitter)s)" -#: proposals/templates/proposals/proposal_pdf.html:92 +#: proposals/templates/proposals/proposal_pdf.html:90 #, python-format msgid "%(type)s van referentienummer %(reference_number)s" msgstr "%(type)s of reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:106 +#: proposals/templates/proposals/proposal_pdf.html:104 #, python-format msgid "Referentienummer %(reference_number)s" msgstr "Reference number %(reference_number)s" -#: proposals/templates/proposals/proposal_pdf.html:111 +#: proposals/templates/proposals/proposal_pdf.html:109 msgid "Huidige staat van de aanvraag" msgstr "Current state of the application" -#: proposals/templates/proposals/proposal_pdf.html:113 +#: proposals/templates/proposals/proposal_pdf.html:111 msgid "Indiener" msgstr "Applicant" -#: proposals/templates/proposals/proposal_pdf.html:115 +#: proposals/templates/proposals/proposal_pdf.html:113 #: tasks/templates/tasks/task_list.html:7 msgid "Naam" msgstr "Name" @@ -2424,8 +2428,8 @@ msgid "" "Het reglement van de FEtC-H." msgstr "" -"The regulations of the FEtC-H ." +"The regulations of the FEtC-H ." #: proposals/templates/proposals/proposal_start.html:31 #: proposals/templates/proposals/proposal_start_practice.html:31 @@ -2909,7 +2913,7 @@ msgstr "Additional forms" #: proposals/templates/proposals/study_start.html:7 #: proposals/templates/proposals/study_start.html:63 #: proposals/utils/pdf_diff_logic.py:530 -#: proposals/utils/validate_proposal.py:94 +#: proposals/utils/validate_proposal.py:95 msgid "Eén of meerdere trajecten?" msgstr "One or more trajectories?" @@ -2943,7 +2947,7 @@ msgid "Revisie/amendement" msgstr "Revision/amendment" #: proposals/templates/proposals/translated_consent_forms.html:24 -#: proposals/utils/validate_proposal.py:223 +#: proposals/utils/validate_proposal.py:224 msgid "Vertaling informed consent formulieren" msgstr "Translation of informed consent forms" @@ -3138,8 +3142,8 @@ msgstr "Overview and self-assessment of the entire study" msgid "Extra formulieren " msgstr "Additional forms " -#: proposals/utils/proposal_utils.py:51 proposals/utils/validate_proposal.py:76 -#: proposals/utils/validate_proposal.py:83 +#: proposals/utils/proposal_utils.py:51 proposals/utils/validate_proposal.py:77 +#: proposals/utils/validate_proposal.py:84 msgid "Ethische toetsing nodig door een METC?" msgstr "Ethical assessment by a METC necessary?" @@ -3179,41 +3183,41 @@ msgstr "FEtC-H: A revised application uses lab facilities" msgid "FETC-GW: nieuwe aanvraag gebruikt labfaciliteiten" msgstr "FEtC-H: New application uses lab facilities" -#: proposals/utils/validate_proposal.py:105 +#: proposals/utils/validate_proposal.py:106 msgid "De deelnemers (traject {})" msgstr "Participants (trajectory {})" -#: proposals/utils/validate_proposal.py:113 +#: proposals/utils/validate_proposal.py:114 msgid "De onderzoekstype(n) (traject {})" msgstr "Type(s) of research (trajectory {})" -#: proposals/utils/validate_proposal.py:123 -#: proposals/utils/validate_proposal.py:132 +#: proposals/utils/validate_proposal.py:124 +#: proposals/utils/validate_proposal.py:133 msgid "Het interventieonderzoek (traject {})" msgstr "Intervention study (trajectory {})" -#: proposals/utils/validate_proposal.py:144 -#: proposals/utils/validate_proposal.py:153 +#: proposals/utils/validate_proposal.py:145 +#: proposals/utils/validate_proposal.py:154 msgid "Het observatieonderzoek (traject {})" msgstr "Observational study (trajectory {})" -#: proposals/utils/validate_proposal.py:164 +#: proposals/utils/validate_proposal.py:165 msgid "Het takenonderzoek (traject {})" msgstr "Task-based research: trajectory {}" -#: proposals/utils/validate_proposal.py:179 +#: proposals/utils/validate_proposal.py:180 msgid "Het takenonderzoek: sessie {} (traject {})" msgstr "Task-based research: session {} trajectory {}" -#: proposals/utils/validate_proposal.py:196 +#: proposals/utils/validate_proposal.py:197 msgid "Het takenonderzoek: sessie {} taak {} (traject {})" msgstr "Task-based research: session {} task {} (trajectory {})" -#: proposals/utils/validate_proposal.py:213 +#: proposals/utils/validate_proposal.py:214 msgid "Overzicht van takenonderzoek: sessie {} (traject {})" msgstr "Overview of task-based research: session {} (trajectory {})" -#: proposals/utils/validate_proposal.py:230 +#: proposals/utils/validate_proposal.py:231 msgid "AVG en Data Management" msgstr "AVG and Data Management" @@ -3262,11 +3266,11 @@ msgstr "" msgid "Aanvraag verwijderd" msgstr "Application deleted" -#: proposals/views/proposal_views.py:432 +#: proposals/views/proposal_views.py:452 msgid "Wijzigingen opgeslagen" msgstr "Changes saved" -#: proposals/views/proposal_views.py:532 +#: proposals/views/proposal_views.py:556 msgid "Aanvraag gekopieerd" msgstr "Application copied" @@ -3327,11 +3331,11 @@ msgstr "long route (4-weeks)" msgid "Direct terug naar aanvrager (Nog niet in behandeling)" msgstr "Return directly to applicant (not yet under review)" -#: reviews/forms.py:34 reviews/menus.py:66 reviews/mixins.py:173 +#: reviews/forms.py:34 reviews/menus.py:67 reviews/mixins.py:173 msgid "Algemene Kamer" msgstr "General Chamber" -#: reviews/forms.py:35 reviews/menus.py:76 reviews/mixins.py:176 +#: reviews/forms.py:35 reviews/menus.py:77 reviews/mixins.py:176 msgid "Linguïstiek Kamer" msgstr "Linguistics Chamber" @@ -3363,39 +3367,39 @@ msgstr "Start date period:" msgid "Eind datum periode:" msgstr "End date period:" -#: reviews/menus.py:18 reviews/views.py:73 +#: reviews/menus.py:19 reviews/views.py:73 msgid "Mijn openstaande besluiten" msgstr "My pending decisions" -#: reviews/menus.py:22 +#: reviews/menus.py:23 msgid "Al mijn besluiten" msgstr "All my decisions" -#: reviews/menus.py:26 +#: reviews/menus.py:27 msgid "Alle openstaande besluiten commissieleden" msgstr "All pending decisions committee members" -#: reviews/menus.py:31 +#: reviews/menus.py:32 msgid "Alle openstaande besluiten eindverantwoordelijken" msgstr "All pending decisions supervisors" -#: reviews/menus.py:36 reviews/views.py:230 +#: reviews/menus.py:37 reviews/views.py:230 msgid "Nog af te handelen aanvragen" msgstr "Applications waiting for conclusion" -#: reviews/menus.py:41 reviews/views.py:242 +#: reviews/menus.py:42 reviews/views.py:242 msgid "Aanvragen in revisie" msgstr "Applications in revision" -#: reviews/menus.py:46 reviews/views.py:254 +#: reviews/menus.py:47 reviews/views.py:254 msgid "Alle lopende aanvragen" msgstr "All running applications" -#: reviews/menus.py:51 reviews/views.py:280 +#: reviews/menus.py:52 reviews/views.py:280 msgid "Alle ingezonden aanvragen" msgstr "All submitted applications" -#: reviews/menus.py:56 +#: reviews/menus.py:57 msgid "Overzicht werkverdeling commissieleden" msgstr "Overview workload committee members" @@ -3630,7 +3634,7 @@ msgstr "Long route" msgid "Aanvraag beoordelen" msgstr "Assess the application" -#: reviews/templates/reviews/decision_form.html:22 +#: reviews/templates/reviews/decision_form.html:21 #, python-format msgid "" "Je kunt nu een go of no-go geven voor de aanvraag %(title)s, " @@ -3641,12 +3645,12 @@ msgstr "" "%(refnum)s in %(chamber)s. You can see the details of this application here (downloads as PDF)." -#: reviews/templates/reviews/decision_form.html:30 +#: reviews/templates/reviews/decision_form.html:29 #, python-format msgid "Je kunt nu de aanvraag %(title)s bekijken.
        " msgstr "You can now (re)view this application here: %(title)s.
        " -#: reviews/templates/reviews/decision_form.html:36 +#: reviews/templates/reviews/decision_form.html:35 msgid "" "Als de aanvraag (incl. geïnformeerde toestemmingsformulieren) in orde is, " "klik dan op ‘goedgekeurd’ en ‘Beslissing opslaan’ hieronder; dan wordt de " @@ -3656,7 +3660,7 @@ msgstr "" "'endorsed' and 'Save decision' below; the application will then be submitted " "to the FEtC-H. " -#: reviews/templates/reviews/decision_form.html:43 +#: reviews/templates/reviews/decision_form.html:42 msgid "" "Als de aanvraag nog niet in orde is, dan zijn er twee mogelijkheden om de " "aanvraag aan te passen:" @@ -3664,7 +3668,7 @@ msgstr "" "If the application is not yet in order, there are two methods to amend the " "study: " -#: reviews/templates/reviews/decision_form.html:50 +#: reviews/templates/reviews/decision_form.html:49 #, python-format msgid "" "door de supervisor (jijzelf)
        Als supervisor kan je deze aanvraag Indien je wilt dat de " "indiener de aanvraag zelf aanpast voordat je de studie kunt goedkeuren en " @@ -3692,7 +3696,7 @@ msgstr "" "any comments, and click 'Save decision'. Once you have done this, the " "submitter can make changes again.
        " -#: reviews/templates/reviews/decision_form.html:71 +#: reviews/templates/reviews/decision_form.html:70 msgid "" "Als de indiener de gevraagde wijzigingen heeft doorgevoerd en opnieuw heeft " "verstuurd, zal je de aangepaste aanvraag opnieuw moeten beoordelen." @@ -3700,7 +3704,7 @@ msgstr "" "Once the submitter has made the requested changes and resubmitted the " "application, you will have to re-evaluate the application. " -#: reviews/templates/reviews/decision_form.html:81 +#: reviews/templates/reviews/decision_form.html:80 #, python-format msgid "" "Dit is een revisie van of amendement op een vorige aanvraag. De verschillen " @@ -3710,7 +3714,7 @@ msgstr "" "differences compared to the previous application
        here." -#: reviews/templates/reviews/decision_form.html:96 +#: reviews/templates/reviews/decision_form.html:95 msgid "Beslissing opslaan" msgstr "Save decision" @@ -4185,7 +4189,7 @@ msgstr "Pending decisions committee members" msgid "Openstaande besluiten eindverantwoordelijken" msgstr "Pending decisions supervisors" -#: reviews/views.py:580 +#: reviews/views.py:600 msgid "" "Deze aanvraag is al beoordeeld, dus je kan je beoordeling niet meer " "toevoegen/aanpassen" diff --git a/proposals/templates/proposals/proposal_confirmation.html b/proposals/templates/proposals/proposal_confirmation.html index 915614cd8..337169d5e 100644 --- a/proposals/templates/proposals/proposal_confirmation.html +++ b/proposals/templates/proposals/proposal_confirmation.html @@ -33,10 +33,10 @@

        {% trans "Bevestigingsbrief versturen" %}

        {{ form.as_table }}
        + {% trans "Terug naar de vorige pagina" %} - {% trans "Terug naar de vorige pagina" %} + value="{% trans 'Verstuur bevestigingsbrief' %}" />
    From e992c48bf044df9486a6a48deadbb419689547d4 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Thu, 14 Mar 2024 14:28:32 +0100 Subject: [PATCH 145/148] fix: diff bugfix --- proposals/utils/pdf_diff_logic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/utils/pdf_diff_logic.py b/proposals/utils/pdf_diff_logic.py index ff2489d23..032ba5076 100644 --- a/proposals/utils/pdf_diff_logic.py +++ b/proposals/utils/pdf_diff_logic.py @@ -1103,7 +1103,7 @@ def create_context_diff(context, old_proposal, new_proposal): DiffSection(WMOSection(old_proposal.wmo), WMOSection(new_proposal.wmo)) ) - if new_proposal.is_pre_assessment: + if not new_proposal.is_pre_assessment: if ( new_proposal.wmo.status != new_proposal.wmo.WMOStatuses.NO_WMO or old_proposal.wmo.status != old_proposal.wmo.WMOStatuses.NO_WMO From e410f736d49a60e87bd49cabde09fc274fa9cda7 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 18 Mar 2024 11:08:05 +0100 Subject: [PATCH 146/148] fix: buttons on task and session delete --- tasks/templates/tasks/session_confirm_delete.html | 4 ++-- tasks/templates/tasks/task_confirm_delete.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/templates/tasks/session_confirm_delete.html b/tasks/templates/tasks/session_confirm_delete.html index e906e1ecc..73b4a59d2 100644 --- a/tasks/templates/tasks/session_confirm_delete.html +++ b/tasks/templates/tasks/session_confirm_delete.html @@ -15,10 +15,10 @@

    {% trans "Sessie verwijderen" %}

    Weet u zeker dat u deze sessie {{ session.order }} in de aanvraag {{ session.study.proposal.title }} wilt verwijderen?

    - - {% trans "Annuleren" %}
    diff --git a/tasks/templates/tasks/task_confirm_delete.html b/tasks/templates/tasks/task_confirm_delete.html index c39a183e1..799631119 100644 --- a/tasks/templates/tasks/task_confirm_delete.html +++ b/tasks/templates/tasks/task_confirm_delete.html @@ -15,10 +15,10 @@

    {% trans "Taak verwijderen" %}

    Weet u zeker dat u de taak {{ task.name }} uit sessie {{ task.session.order }} in de aanvraag {{ task.session.study.proposal.title }} wilt verwijderen?

    - - {% trans "Annuleren" %}
    From c7b8a1e2084d20b8f396676bcde4205de5bab7b3 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Mon, 18 Mar 2024 13:26:23 +0100 Subject: [PATCH 147/148] fix: formatting --- main/templates/base/form_buttons.html | 4 ++-- tasks/templates/tasks/session_confirm_delete.html | 3 +-- tasks/templates/tasks/task_confirm_delete.html | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/main/templates/base/form_buttons.html b/main/templates/base/form_buttons.html index 14b23b6ef..e7cd1ed23 100644 --- a/main/templates/base/form_buttons.html +++ b/main/templates/base/form_buttons.html @@ -12,8 +12,8 @@ {% trans "Terug naar begin aanvraag" %} {% elif proposal.is_pre_approved %} - {% trans "Terug naar begin aanvraag" %} + {% trans "Terug naar begin aanvraag" %} {% elif proposal.is_practice %} diff --git a/tasks/templates/tasks/session_confirm_delete.html b/tasks/templates/tasks/session_confirm_delete.html index 73b4a59d2..f5cbacfbd 100644 --- a/tasks/templates/tasks/session_confirm_delete.html +++ b/tasks/templates/tasks/session_confirm_delete.html @@ -18,8 +18,7 @@

    {% trans "Sessie verwijderen" %}

    -
    {% trans "Annuleren" %} + {% trans "Annuleren" %}

    diff --git a/tasks/templates/tasks/task_confirm_delete.html b/tasks/templates/tasks/task_confirm_delete.html index 799631119..70eb88b56 100644 --- a/tasks/templates/tasks/task_confirm_delete.html +++ b/tasks/templates/tasks/task_confirm_delete.html @@ -18,8 +18,7 @@

    {% trans "Taak verwijderen" %}

    - {% trans "Annuleren" %} + {% trans "Annuleren" %}

    From 1d9ddf165bf9188f04e30a1bbcd9952e496e0483 Mon Sep 17 00:00:00 2001 From: Edo Storm Date: Tue, 19 Mar 2024 16:13:30 +0100 Subject: [PATCH 148/148] Revert 'confirmation sent' text on button back to past tense --- locale/en/LC_MESSAGES/django.po | 25 +++---------------- .../proposals/proposal_confirmation.html | 2 +- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index e9dc08b76..6f60d5ff3 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-03-14 11:57+0100\n" +"POT-Creation-Date: 2024-03-19 16:09+0100\n" "PO-Revision-Date: 2024-01-17 10:48+0100\n" "Last-Translator: Anna Asbury \n" "Language-Team: \n" @@ -375,6 +375,7 @@ msgid "Bevestigingsbrief versturen" msgstr "Send confirmation letter" #: main/templates/auth/user_detail.html:97 +#: proposals/templates/proposals/proposal_confirmation.html:39 #: reviews/templates/reviews/vue_templates/decision_list.html:90 #: reviews/templates/reviews/vue_templates/review_list.html:83 msgid "Bevestigingsbrief verstuurd" @@ -1908,8 +1909,8 @@ msgstr "Delete" #: proposals/templates/proposals/proposal_confirm_delete.html:21 #: proposals/templates/proposals/proposal_copy.html:93 -#: tasks/templates/tasks/session_confirm_delete.html:22 -#: tasks/templates/tasks/task_confirm_delete.html:22 +#: tasks/templates/tasks/session_confirm_delete.html:21 +#: tasks/templates/tasks/task_confirm_delete.html:21 msgid "Annuleren" msgstr "Cancel" @@ -1922,10 +1923,6 @@ msgstr "" "Please state when the confirmation letter for %(title)s has been " "sent here. " -#: proposals/templates/proposals/proposal_confirmation.html:39 -msgid "Verstuur bevestigingsbrief" -msgstr "Send confirmation" - #: proposals/templates/proposals/proposal_copy.html:8 #: proposals/templates/proposals/proposal_copy.html:22 msgid "Revisie starten" @@ -5217,17 +5214,3 @@ msgstr "Task edited" #: tasks/views/task_views.py:56 msgid "Taak verwijderd" msgstr "Task deleted" - -#~ msgid "" -#~ "Het reglement van de Algemene Kamer (AK) of dat van de Linguïstiek Kamer " -#~ "(LK)." -#~ msgstr "" -#~ "The regulations of the General Chamber or " -#~ "those of the Linguistics Chamber." - -#~ msgid "Andere betrokkenen" -#~ msgstr "Other people involved" diff --git a/proposals/templates/proposals/proposal_confirmation.html b/proposals/templates/proposals/proposal_confirmation.html index 337169d5e..7637fd475 100644 --- a/proposals/templates/proposals/proposal_confirmation.html +++ b/proposals/templates/proposals/proposal_confirmation.html @@ -36,7 +36,7 @@

    {% trans "Bevestigingsbrief versturen" %}

    {% trans "Terug naar de vorige pagina" %} + value="{% trans 'Bevestigingsbrief verstuurd' %}" />