From 9d4b2fcca1d3164eb58b27936e5913f5a1785ec0 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Wed, 26 Oct 2022 14:26:16 +0200 Subject: [PATCH 01/10] Fixed #864 -- Ensuring we don't use the MP_NodeQuerySet for the Products (which don't make use of mp_tree) --- src/open_inwoner/pdc/managers.py | 12 +++++++++++- src/open_inwoner/pdc/models/category.py | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/open_inwoner/pdc/managers.py b/src/open_inwoner/pdc/managers.py index 6fe65247dc..61b0986924 100644 --- a/src/open_inwoner/pdc/managers.py +++ b/src/open_inwoner/pdc/managers.py @@ -1,7 +1,17 @@ +from django.db import models + from treebeard.mp_tree import MP_NodeQuerySet -class PublishedQueryset(MP_NodeQuerySet): +class PublishedQueryset(models.QuerySet): + def published(self): + return self.filter(published=True) + + def draft(self): + return self.filter(published=False) + + +class CategoryPublishedQueryset(MP_NodeQuerySet): def published(self): return self.filter(published=True) diff --git a/src/open_inwoner/pdc/models/category.py b/src/open_inwoner/pdc/models/category.py index 3b982aa077..8908761606 100644 --- a/src/open_inwoner/pdc/models/category.py +++ b/src/open_inwoner/pdc/models/category.py @@ -6,7 +6,7 @@ from treebeard.exceptions import InvalidMoveToDescendant from treebeard.mp_tree import MP_MoveHandler, MP_Node -from ..managers import PublishedQueryset +from ..managers import CategoryPublishedQueryset class PublishedMoveHandler(MP_MoveHandler): @@ -62,7 +62,7 @@ class Category(MP_Node): ) node_order_by = ["slug"] - objects = PublishedQueryset.as_manager() + objects = CategoryPublishedQueryset.as_manager() class Meta: verbose_name = _("Category") From 84e2646a56b13876ea7762b56fefee20f145a43e Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Fri, 28 Oct 2022 12:20:01 +0200 Subject: [PATCH 02/10] Fixed #866 -- Adding redirection-option, showing code+id in the admin tree, adding concept-status of questionnaires --- src/open_inwoner/pdc/views.py | 2 +- src/open_inwoner/questionnaire/admin.py | 16 ++++++++++--- src/open_inwoner/questionnaire/models.py | 23 +++++++++++++++++-- .../questionnaire/tests/test_models.py | 2 +- src/open_inwoner/questionnaire/views.py | 9 ++++++-- 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/open_inwoner/pdc/views.py b/src/open_inwoner/pdc/views.py index a3ace6b1bb..ffd464b725 100644 --- a/src/open_inwoner/pdc/views.py +++ b/src/open_inwoner/pdc/views.py @@ -62,7 +62,7 @@ def get_context_data(self, **kwargs): kwargs.update(product_locations=ProductLocation.objects.all()[:1000]) kwargs.update( questionnaire_roots=QuestionnaireStep.get_root_nodes().filter( - highlighted=True + highlighted=True, published=True ) ) if self.request.user.is_authenticated: diff --git a/src/open_inwoner/questionnaire/admin.py b/src/open_inwoner/questionnaire/admin.py index 17e7279ea1..dc4a63fa67 100644 --- a/src/open_inwoner/questionnaire/admin.py +++ b/src/open_inwoner/questionnaire/admin.py @@ -54,7 +54,7 @@ def clean(self): class QuestionnaireStepAdmin(TreeAdmin): form = QuestionnaireStepAdminForm inlines = (QuestionnaireStepFileInline,) - list_display = ("display_question_answer", "highlighted") + list_display = ("display_question_answer", "highlighted", "published") prepopulated_fields = {"slug": ("question",)} save_as = True list_editable = ("highlighted",) @@ -83,6 +83,8 @@ class QuestionnaireStepAdmin(TreeAdmin): "description", "category", "highlighted", + "published", + "redirect_to", ), }, ), @@ -97,11 +99,19 @@ class QuestionnaireStepAdmin(TreeAdmin): }, ), ) + raw_id_fields = ("redirect_to",) def display_question_answer(self, obj): + redirect = "" + if obj.redirect_to: + redirect = " - doorsturen -> {} - {}".format( + obj.redirect_to.question, obj.redirect_to.id + ) + + postfix = " ({} - {}{})".format(obj.id, obj.code, redirect) if not obj.parent_answer: - return obj.question - return "{} -> {}

".format(obj.parent_answer, obj.question) + return obj.question + postfix + return "{} -> {}".format(obj.parent_answer, obj.question) + postfix display_question_answer.allow_tags = True diff --git a/src/open_inwoner/questionnaire/models.py b/src/open_inwoner/questionnaire/models.py index 1e063a9530..26a32e89be 100644 --- a/src/open_inwoner/questionnaire/models.py +++ b/src/open_inwoner/questionnaire/models.py @@ -67,7 +67,26 @@ class QuestionnaireStep(MP_Node): highlighted = models.BooleanField( _("Highlighted"), default=False, - help_text=_("Whether the questionnaire should be highlighted or not."), + help_text=_( + "Alleen relevant voor vraag op het hoofdniveau. Indien aangevinkt dan wordt deze vraag getoond op de homepage." + ), + ) + published = models.BooleanField( + verbose_name=_("Published"), + default=True, + help_text=_( + "Alleen relevant voor vraag op het hoofdniveau. Indien uitgevinkt dan kunnen alleen beheerders de vragenlijst zien & doorlopen." + ), + ) + redirect_to = models.ForeignKey( + "self", + on_delete=models.SET_NULL, + verbose_name=_("Doorsturen naar andere stap (experimenteel)"), + blank=True, + null=True, + help_text=_( + "Indien ingesteld dan wordt de gebruiker na het kiezen van het antwoord doorgestuurd naar een andere vragenlijststap (eventueel in een andere boom)" + ), ) related_products = models.ManyToManyField( "pdc.Product", @@ -91,7 +110,7 @@ class Meta: ordering = ("path",) def __str__(self) -> str: - return self.question + return "{} ({} - {})".format(self.question, self.id, self.code) def get_absolute_url(self) -> str: if self.is_root(): diff --git a/src/open_inwoner/questionnaire/tests/test_models.py b/src/open_inwoner/questionnaire/tests/test_models.py index 4c2c9d2355..5db0dfda2d 100644 --- a/src/open_inwoner/questionnaire/tests/test_models.py +++ b/src/open_inwoner/questionnaire/tests/test_models.py @@ -23,7 +23,7 @@ def test_slug_unique(self): def test_str(self): root = QuestionnaireStepFactory.create(question="foo") - self.assertEqual("foo", str(root)) + self.assertTrue(str(root).startswith("foo")) def test_get_absolute_url_root(self): root = QuestionnaireStepFactory.create(code="foo", slug="foo") diff --git a/src/open_inwoner/questionnaire/views.py b/src/open_inwoner/questionnaire/views.py index 9909730641..13cd109e4d 100644 --- a/src/open_inwoner/questionnaire/views.py +++ b/src/open_inwoner/questionnaire/views.py @@ -62,7 +62,10 @@ def get_object(self) -> QuestionnaireStep: ) if slug: - return get_object_or_404(QuestionnaireStep, slug=slug) + if getattr(self.request, "user", False) and self.request.user.is_staff: + return get_object_or_404(QuestionnaireStep, slug=slug) + else: + return get_object_or_404(QuestionnaireStep, slug=slug, published=True) def get_form_kwargs(self) -> dict: instance = self.get_object() @@ -71,6 +74,8 @@ def get_form_kwargs(self) -> dict: def form_valid(self, form: QuestionnaireStepForm): questionnaire_step = form.cleaned_data["answer"] + if questionnaire_step.redirect_to: + questionnaire_step = questionnaire_step.redirect_to self.request.session[QUESTIONNAIRE_SESSION_KEY] = questionnaire_step.slug return HttpResponseRedirect(redirect_to=questionnaire_step.get_absolute_url()) @@ -148,4 +153,4 @@ def crumbs(self): ] def get_queryset(self): - return QuestionnaireStep.get_root_nodes() + return QuestionnaireStep.get_root_nodes().filter(published=True) From 1942dbd2d63bc5a6e78d2c855196d2e20ba11476 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Fri, 28 Oct 2022 12:37:08 +0200 Subject: [PATCH 03/10] Fixed #866 -- Adding missing migrations --- .../0018_questionnairestep_published.py | 22 ++++++++++ .../migrations/0019_auto_20221028_1144.py | 44 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/open_inwoner/questionnaire/migrations/0018_questionnairestep_published.py create mode 100644 src/open_inwoner/questionnaire/migrations/0019_auto_20221028_1144.py diff --git a/src/open_inwoner/questionnaire/migrations/0018_questionnairestep_published.py b/src/open_inwoner/questionnaire/migrations/0018_questionnairestep_published.py new file mode 100644 index 0000000000..3bc3de602a --- /dev/null +++ b/src/open_inwoner/questionnaire/migrations/0018_questionnairestep_published.py @@ -0,0 +1,22 @@ +# Generated by Django 3.2.15 on 2022-10-28 09:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("questionnaire", "0017_auto_20220617_0922"), + ] + + operations = [ + migrations.AddField( + model_name="questionnairestep", + name="published", + field=models.BooleanField( + default=True, + help_text="Whether the questionnaire-tree should be visible or not, only relevant for the top-level question", + verbose_name="Gepubliceerd", + ), + ), + ] diff --git a/src/open_inwoner/questionnaire/migrations/0019_auto_20221028_1144.py b/src/open_inwoner/questionnaire/migrations/0019_auto_20221028_1144.py new file mode 100644 index 0000000000..ce0bbdf417 --- /dev/null +++ b/src/open_inwoner/questionnaire/migrations/0019_auto_20221028_1144.py @@ -0,0 +1,44 @@ +# Generated by Django 3.2.15 on 2022-10-28 09:44 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("questionnaire", "0018_questionnairestep_published"), + ] + + operations = [ + migrations.AddField( + model_name="questionnairestep", + name="redirect_to", + field=models.ForeignKey( + blank=True, + help_text="Indien ingesteld dan wordt de gebruiker na het kiezen van het antwoord doorgestuurd naar een andere vragenlijststap (eventueel in een andere boom", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="questionnaire.questionnairestep", + verbose_name="Doorsturen naar andere stap (experimenteel)", + ), + ), + migrations.AlterField( + model_name="questionnairestep", + name="highlighted", + field=models.BooleanField( + default=False, + help_text="Alleen relevant voor vraag op het hoofdniveau. Indien aangevinkt dan wordt deze vraag getoond op de homepage.", + verbose_name="Uitgelicht", + ), + ), + migrations.AlterField( + model_name="questionnairestep", + name="published", + field=models.BooleanField( + default=True, + help_text="Alleen relevant voor vraag op het hoofdniveau. Indien uitgevinkt dan kunnen alleen beheerders de vragenlijst zien & doorlopen.", + verbose_name="Gepubliceerd", + ), + ), + ] From 1c2defce21115a8701aa75f64bbd0a4f75d377b5 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Fri, 28 Oct 2022 14:13:08 +0200 Subject: [PATCH 04/10] Removing emailconfirmation from admin-index --- src/open_inwoner/conf/fixtures/django-admin-index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/open_inwoner/conf/fixtures/django-admin-index.json b/src/open_inwoner/conf/fixtures/django-admin-index.json index 1cbfff9719..aa3f86b672 100644 --- a/src/open_inwoner/conf/fixtures/django-admin-index.json +++ b/src/open_inwoner/conf/fixtures/django-admin-index.json @@ -1 +1 @@ -[{"model": "admin_index.appgroup", "fields": {"order": 0, "name": "Gebruikersprofielen", "slug": "accounts", "models": [["accounts", "action"], ["accounts", "appointment"], ["accounts", "contact"], ["accounts", "document"], ["accounts", "invite"], ["accounts", "message"], ["accounts", "user"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 2, "name": "PDC", "slug": "pdc", "models": [["pdc", "category"], ["pdc", "organization"], ["pdc", "organizationtype"], ["pdc", "product"], ["pdc", "productcondition"], ["pdc", "productcontact"], ["pdc", "productlocation"], ["pdc", "tag"], ["pdc", "tagtype"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 5, "name": "Permissies, 2FA en logging", "slug": "permissies-2fa-en-logging", "models": [["auth", "group"], ["axes", "accessattempt"], ["axes", "accesslog"], ["cspreports", "cspreport"], ["otp_totp", "totpdevice"], ["timeline_logger", "timelinelog"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 7, "name": "Overige / Diverse", "slug": "overige-diverse", "models": [["account", "emailconfirmation"], ["admin_index", "appgroup"], ["admin_index", "applink"], ["admin_index", "contenttypeproxy"], ["easy_thumbnails", "source"], ["easy_thumbnails", "thumbnail"], ["easy_thumbnails", "thumbnaildimensions"], ["filer", "folder"], ["filer", "folderpermission"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 6, "name": "Configuratie", "slug": "configuratie", "models": [["configurations", "siteconfiguration"], ["configurations", "siteconfigurationpage"], ["flatpages", "flatpage"], ["haalcentraal", "haalcentraalconfig"], ["mail_editor", "mailtemplate"], ["openzaak", "openzaakconfig"], ["sites", "site"], ["zgw_consumers", "nlxconfig"], ["zgw_consumers", "service"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 3, "name": "Vragen en antwoorden", "slug": "vraag-antwoord", "models": [["pdc", "question"], ["questionnaire", "questionnairestep"], ["questionnaire", "questionnairestepfile"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 4, "name": "Zoeken", "slug": "zoeken", "models": [["search", "feedback"], ["search", "fieldboost"], ["search", "synonym"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 1, "name": "Plannen", "slug": "plannen", "models": [["plans", "actiontemplate"], ["plans", "plan"], ["plans", "plantemplate"]]}}, {"model": "admin_index.applink", "fields": {"order": 0, "app_group": ["overige-diverse"], "name": "Link naar Documentatie", "link": "https://taiga.maykinmedia.nl/project/open-inwoner/wiki/home"}}, {"model": "admin_index.applink", "fields": {"order": 1, "app_group": ["overige-diverse"], "name": "Link naar Github", "link": "https://github.com/maykinmedia/open-inwoner"}}, {"model": "admin_index.applink", "fields": {"order": 2, "app_group": ["overige-diverse"], "name": "Link naar Maykin", "link": "https://www.maykinmedia.nl/nl/"}}] \ No newline at end of file +[{"model": "admin_index.appgroup", "fields": {"order": 0, "name": "Gebruikersprofielen", "slug": "accounts", "models": [["accounts", "action"], ["accounts", "appointment"], ["accounts", "contact"], ["accounts", "document"], ["accounts", "invite"], ["accounts", "message"], ["accounts", "user"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 2, "name": "PDC", "slug": "pdc", "models": [["pdc", "category"], ["pdc", "organization"], ["pdc", "organizationtype"], ["pdc", "product"], ["pdc", "productcondition"], ["pdc", "productcontact"], ["pdc", "productlocation"], ["pdc", "tag"], ["pdc", "tagtype"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 5, "name": "Permissies, 2FA en logging", "slug": "permissies-2fa-en-logging", "models": [["auth", "group"], ["axes", "accessattempt"], ["axes", "accesslog"], ["cspreports", "cspreport"], ["otp_totp", "totpdevice"], ["timeline_logger", "timelinelog"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 7, "name": "Overige / Diverse", "slug": "overige-diverse", "models": [["admin_index", "appgroup"], ["admin_index", "applink"], ["admin_index", "contenttypeproxy"], ["easy_thumbnails", "source"], ["easy_thumbnails", "thumbnail"], ["easy_thumbnails", "thumbnaildimensions"], ["filer", "folder"], ["filer", "folderpermission"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 6, "name": "Configuratie", "slug": "configuratie", "models": [["configurations", "siteconfiguration"], ["configurations", "siteconfigurationpage"], ["flatpages", "flatpage"], ["haalcentraal", "haalcentraalconfig"], ["mail_editor", "mailtemplate"], ["openzaak", "openzaakconfig"], ["sites", "site"], ["zgw_consumers", "nlxconfig"], ["zgw_consumers", "service"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 3, "name": "Vragen en antwoorden", "slug": "vraag-antwoord", "models": [["pdc", "question"], ["questionnaire", "questionnairestep"], ["questionnaire", "questionnairestepfile"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 4, "name": "Zoeken", "slug": "zoeken", "models": [["search", "feedback"], ["search", "fieldboost"], ["search", "synonym"]]}}, {"model": "admin_index.appgroup", "fields": {"order": 1, "name": "Plannen", "slug": "plannen", "models": [["plans", "actiontemplate"], ["plans", "plan"], ["plans", "plantemplate"]]}}, {"model": "admin_index.applink", "fields": {"order": 0, "app_group": ["overige-diverse"], "name": "Link naar Documentatie", "link": "https://taiga.maykinmedia.nl/project/open-inwoner/wiki/home"}}, {"model": "admin_index.applink", "fields": {"order": 1, "app_group": ["overige-diverse"], "name": "Link naar Github", "link": "https://github.com/maykinmedia/open-inwoner"}}, {"model": "admin_index.applink", "fields": {"order": 2, "app_group": ["overige-diverse"], "name": "Link naar Maykin", "link": "https://www.maykinmedia.nl/nl/"}}] From caa3d2ec005e11bb52ccbb24159d11a8e9f7592c Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Fri, 28 Oct 2022 14:19:40 +0200 Subject: [PATCH 05/10] nulling invalid fixture --- .../questionnaire/fixtures/questionnaire_sampledata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/open_inwoner/questionnaire/fixtures/questionnaire_sampledata.json b/src/open_inwoner/questionnaire/fixtures/questionnaire_sampledata.json index 223039c973..7dd4387521 100644 --- a/src/open_inwoner/questionnaire/fixtures/questionnaire_sampledata.json +++ b/src/open_inwoner/questionnaire/fixtures/questionnaire_sampledata.json @@ -1 +1,2 @@ -[{"model": "questionnaire.questionnairestep", "pk": 1, "fields": {"path": "0002", "depth": 1, "numchild": 8, "parent_answer": "", "title": "Zelfdiagnose", "description": "Donec id elit non mi porta gravida at eget metus.", "question": "Wat is jouw situatie?", "question_subject": "Situatie", "slug": "wat-is-jouw-situatie", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 2, "fields": {"path": "00020001", "depth": 2, "numchild": 4, "parent_answer": "Ik wil werkervaring op doen", "title": "", "description": "", "question": "Op welke manier wil je werkervaring opdoen?", "question_subject": "Werkervaring", "slug": "op-welke-manier-wil-je-werkervaring-opdoen", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 3, "fields": {"path": "00020005", "depth": 2, "numchild": 0, "parent_answer": "Ik wil een eigen bedrijf beginnen", "title": "", "description": "", "question": "Ik wil een eigen bedrijf beginnen", "question_subject": "", "slug": "ik-wil-een-eigen-bedrijf-beginnen", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 4, "fields": {"path": "00020006", "depth": 2, "numchild": 0, "parent_answer": "Ik wil werken maar heb vragen over kinderopvang", "title": "", "description": "", "question": "Ik wil werken maar heb vragen over kinderopvang", "question_subject": "", "slug": "eligendi-dignissimos-explicabo", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 5, "fields": {"path": "00020008", "depth": 2, "numchild": 0, "parent_answer": "Ik heb kosten gemaakt die voor werk nodig zijn maar kan ze niet betalen", "title": "", "description": "", "question": "Ik heb kosten gemaakt die voor werk nodig zijn maar kan ze niet betalen", "question_subject": "", "slug": "ik-heb-kosten-gemaakt-die-voor-werk-nodig-zijn-maar-kan-ze-niet-betalen", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 6, "fields": {"path": "00020009", "depth": 2, "numchild": 0, "parent_answer": "Ik wil weten wat er wordt georganiseerd om werk te vinden", "title": "", "description": "", "question": "Ik wil weten wat er wordt georganiseerd om werk te vinden", "question_subject": "", "slug": "ik-wil-weten-wat-er-wordt-georganiseerd-om-werk-te-vinden", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 7, "fields": {"path": "0002000A", "depth": 2, "numchild": 0, "parent_answer": "Ik wil een opleiding of cursus gaan doen", "title": "", "description": "", "question": "Ik wil een opleiding of cursus gaan doen", "question_subject": "", "slug": "bar", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 8, "fields": {"path": "0002000B", "depth": 2, "numchild": 0, "parent_answer": "Ik wil weten wat er gebeurt als ik parttime of fulltime ga werken", "title": "", "description": "", "question": "Ik wil weten wat er gebeurt als ik parttime of fulltime ga werken", "question_subject": "", "slug": "quidem-reprehenderit-sint", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 9, "fields": {"path": "00020004", "depth": 2, "numchild": 0, "parent_answer": "Ik wil graag hulp bij het solliciteren", "title": "", "description": "", "question": "Ik wil graag hulp bij het solliciteren", "question_subject": "", "slug": "ducimus-voluptates-nihil", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 11, "fields": {"path": "000200010003", "depth": 3, "numchild": 1, "parent_answer": "Ik wil werkervaring op doen met uitzicht op een betaalde baan.", "title": "", "description": "", "question": "Uitslag mattis consectetur purus sit amet fermentum.", "question_subject": "", "slug": "ik-wil-werkervaring-op-doen-met-uitzicht-op-een-betaalde-baan", "help_text": "Vestibulum id ligula porta felis euismod semper. Curabitur blandit tempus porttitor. Curabitur blandit tempus porttitor. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 12, "fields": {"path": "000200010004", "depth": 3, "numchild": 0, "parent_answer": "Ik wil uitproberen of een beroep bij mij past", "title": "", "description": "", "question": "Ik wil uitproberen of een beroep bij mij past", "question_subject": "", "slug": "ik-wil-uitproberen-of-een-beroep-bij-mij-past", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 13, "fields": {"path": "0002000100030001", "depth": 4, "numchild": 0, "parent_answer": "Ik wil vrijwilligers werk gaan doen", "title": "", "description": "", "question": "Ik wil vrijwilligers werk gaan doen", "question_subject": "", "slug": "ik-wil-vrijwilligers-werk-gaan-doen", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 14, "fields": {"path": "000200010001", "depth": 3, "numchild": 0, "parent_answer": "Ik wil graag hulp bij het aanpassen/maken van mijn cv", "title": "", "description": "", "question": "Ik wil graag hulp bij het aanpassen/maken van mijn cv", "question_subject": "Hulp bij cv", "slug": "ik-wil-graag-hulp-bij-het-aanpassenmaken-van-mijn-cv", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "## **5 tips om een goed leesbaar cv te maken**\r\n\r\nEen werkgever mag niet teveel tijd aan iedere cv besteden, maar hij moet wel alle belangrijke informatie krijgen. Daarom is het belangrijk je cv zo goed mogelijk vorm te geven. Hieronder volgen een aantal tips om je daarbij te helpen.\r\n\r\n### **1\\. Creëer overzicht**\r\n\r\nMaak gebruik van herkenbare tussenkopjes, zoals ervaring, studie en competenties. Daarnaast is het belangrijk om de functietitels dikgedrukt te maken.\r\n\r\n### **2\\. Maak je cv opvallend, maar houd het zakelijk**\r\n\r\nDoor een mooie lay-out te gebruiken, springt jouw cv tussen de rest uit. Zorg dat je het niet overdrijft, want het blijft zakelijke correspondentie.\r\n\r\n### **3\\. Houd het kort**\r\n\r\nMaak je cv niet langer dan 1 tot 2 pagina’s, tenzij je een erg lange carrière hebt. Ben je nog niet zo lang op de arbeidsmarkt, houd het dan bij 1 pagina.\r\n\r\n### **4\\. Zet het belangrijkste op pagina 1**\r\n\r\nZet je werkervaring in a-chronologische volgorde; je meest recente werkgever bovenaan en zo werk je omlaag. Gebruik niet teveel ruimte voor je personalia, zodat je meer plek hebt voor belangrijkere informatie.\r\n\r\n### **5\\. Maak een profielschets**\r\n\r\nOp pagina 1 kun je ook een omschrijving van je sterke kanten geven. Zorg dat deze aansluiten bij de vacature en gebruik je eigen woorden. Houd de profielschets bij maximaal 3 regels.\r\n\r\n## **Een cv maken bij Nationale Vacaturebank**\r\n\r\nOnline solliciteren? Je kunt ook een curriculum vitae maken bij Nationale Vacaturebank. Hiervoor hoef je maar een paar stappen te doorlopen en je maakt een professioneel cv. Deze is meteen klaar om te gebruiken. Nu je cv maken? Klik dan [hier](https://www.nationalevacaturebank.nl/cv).\r\n\r\n## **Vind jij het lastig om een effectief cv op te stellen?**\r\n\r\nDan kan je ervoor kiezen om jouw document eerst op te sturen naar een professionele recruiter. Hij of zij weet precies waar de lezer van jouw cv op let en hoe je ervoor kan zorgen dat jouw werkervaring indruk maakt. Je krijgt dan feedback op de lay-out, inhoud en structuur. Dit kan al vanaf €35,-. [Hier lees je meer over deze service](https://www.sollicitatiedokter.nl/nationalevacaturebank/?utm_source=nvb&utm_medium=content&utm_campaign=%2FCurriculum-vitae%2Fin-vijf-stappen-een-goed-cv).\r\n\r\n## **De algemene inhoud van een cv**\r\n\r\nAlles wat je doet en gedaan hebt is belangrijk in je leven. Je moet je echter afvragen of het ook relevant is voor de functie die je wilt hebben. Noem daarom enkel de details die belangrijk zijn voor de vacature.\r\n\r\n### **1. Relevante ervaring noemen**\r\n\r\nNoem ook jouw sterke kanten en ervaringen op waar je misschien geen diploma’s van hebt. Als ze bij de vacature passen, zijn ze belangrijk om gezien te worden. Ben je timmerman en heb je daarnaast ervaring met lassen? Zet dat in je cv. Kom je nog maar net kijken op de arbeidsmarkt, maar heb je al wel ervaring met bestuursfuncties in verenigingen? Noem dit dan ook.\r\n\r\n### **2\\. Inhoud per onderwerp**\r\n\r\nIn een overzichtelijk cv komen een aantal belangrijke onderwerpen aan bod. Natuurlijk vind je hier informatie over je werkervaring, maar je kunt hier ook de talen noemen die je spreekt.\r\n\r\n### **3\\. Profielschets**\r\n\r\n* Met een profielschets laat je de werkgever zien wat die van jou kan verwachten.\r\n* Kijk in de vacature voor trefwoorden die bij jou passen. Kies hieruit de drie belangrijkste en verwerk deze (in je eigen woorden) in je profiel.\r\n* Vermijd clichés zoals flexibel en teamplayer. Gebruik juist je eigen woorden, die bij jou passen.\r\n* Laat goed zien wie jij bent als persoon.\r\n* Herkennen anderen, zoals vrienden en collega’s jou ook in je profielschets? Misschien kunnen ze je aanvullen of helpen iets beter te verwoorden?\r\n\r\n### **4\\. Werkervaring**\r\n\r\n* Noem de naam en de vestigingsplaats van het bedrijf waar je hebt gewerkt. Schrijf ook de functie op die je daar had.\r\n* Vertel wat je hebt bereikt bij je vorige werkgever. Noem bijvoorbeeld cijfers of zeg iets over onderscheidingen die je gekregen hebt.\r\n* Laat zien dat je gegroeid bent in je werkervaring. Dit doe je door te laten zien dat je telkens iets nieuws geleerd hebt bij de verschillende werkgevers.\r\n\r\n### **5\\. Opleiding**\r\n\r\n* Zet je meest recente opleiding bovenaan en werk naar beneden, zodat je eerst genoten opleiding onderaan staat\r\n* Heb je een diploma behaald? Noem dan de officiële naam van dit diploma.\r\n\r\n### **6\\. Talen**\r\n\r\n* Maak hier alleen een apart kopje voor als je in ieder geval één vreemde taal redelijk of goed spreekt.\r\n* Geef voor iedere taal aan wat je niveau is, zowel mondeling al schriftelijk.\r\n\r\n### **7\\. Competenties**\r\n\r\nVoor veel vakgebieden is het handig om een opsomming te maken van je competenties.\r\n\r\n* Geef per punt aan wat je sterke kanten zijn of welke vaardigheden je beheerst.\r\n* Vermijd woorden zoals ‘duizendpoot’, ‘multitasker’ of ‘teamplayer’. Probeer hier je eigen woorden te gebruiken. Het cv gaat immers over jou.\r\n\r\n### **8\\. Overig**\r\n\r\n* Onder dit kopje kun je alles noemen wat je verder nergens kwijt kunt, maar wat wel belangrijk is.\r\n* Vermeld hier bijvoorbeeld je hobby’s, vrijwilligerswerk en computervaardigheden.\r\n* Leef je niet teveel uit. Noem enkel de relevante zaken op die iets positiefs zeggen over jou.\r\n\r\n## **Controleer alles**\r\n\r\nEen cv maken betekent ook dat je ervoor zorgt dat alles klopt. Foutjes staan slordig en wekken de indruk dat je niet zorgvuldig bent.\r\n\r\n* Maak gebruik van de spellingchecker van het tekstprogramma wat je gebruikt.\r\n* Lees je tekst hardop voor, van begin tot eind. Hiermee ontdek je foutjes die de spellingchecker niet ziet.\r\n* Laat anderen jouw cv lezen. Laat dit bij voorkeur doen door mensen die jou goed kennen, zodat ze je kunnen aanvullen of verbeteren.\r\n\r\n## **Een digitaal cv maken**\r\n\r\n### **Een pdf-bestand**\r\n\r\nGa je het cv via e-mail versturen? Maak er dan een pdf-bestand van. Het wil wel eens voorkomen dat een tekstbestand er bij de een anders uitziet dan bij de ander. In een pdf-bestand blijft je opmaak altijd gelijk.\r\n\r\n### **Je cv uploaden**\r\n\r\nEen cv uploaden kan het beste vanuit een Word-bestand. Maak zo min mogelijk gebruik van foto’s en gekleurde blokken. Dit levert de beste match op. Na het uploaden krijg je de mogelijkheid extra bestanden toe te voegen, zoals een foto, diploma’s, een portfolio of een mooi opgemaakt pdf-cv.\r\n\r\n### **De bestandnaam aanpassen**\r\n\r\nDenk ook aan de bestandnaam van je cv als je deze upload. Werkgevers kunnen daar gebruik van maken als ze op cv’s aan het screenen zijn. In de database kijken ze naar de titels om een mogelijke match te maken. Een titel als ‘Accountmanager zoekt commerciële functie in internationale handel’ valt meer op, dan ‘cv van Annelies’. Pas de naam van je cv dus aan voor je deze upload.\r\n\r\nbron: [https://www.nationalevacaturebank.nl/carriere/curriculum-vitae/in-vijf-stappen-een-goed-cv](https://www.nationalevacaturebank.nl/carriere/curriculum-vitae/in-vijf-stappen-een-goed-cv)", "related_products": []}}, {"model": "questionnaire.questionnairestep", "pk": 15, "fields": {"path": "000200010007", "depth": 3, "numchild": 0, "parent_answer": "Ik wil graag hulp bij het solliciteren", "title": "", "description": "", "question": "Ik wil graag hulp bij het solliciteren", "question_subject": "", "slug": "dignissimos-consequuntur-quisquam", "help_text": "Kies het antwoord dat het meest van toepassing is", "content": "", "related_products": []}}, {"model": "questionnaire.questionnairestepfile", "pk": 1, "fields": {"questionnaire_step": 11, "file": 5}}, {"model": "questionnaire.questionnairestepfile", "pk": 2, "fields": {"questionnaire_step": 14, "file": 5}}] +[] + From a9c661282a3dc88eb1ced95ac97de7579ab0b438 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Mon, 31 Oct 2022 19:14:48 +0100 Subject: [PATCH 06/10] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index c507f48923..4d96655ce5 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ Open Inwoner ================== -:Version: 0.8.0 +:Version: 1.0.5 :Source: https://github.com/maykinmedia/open-inwoner :Keywords: inwoner :PythonVersion: 3.9 From 98cecf0752b348715318d352f184b2d2d5bd01d1 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Mon, 31 Oct 2022 19:35:49 +0100 Subject: [PATCH 07/10] Resolving heisentest --- src/open_inwoner/accounts/tests/test_logging.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/open_inwoner/accounts/tests/test_logging.py b/src/open_inwoner/accounts/tests/test_logging.py index fbad1da4b1..81e763cff3 100644 --- a/src/open_inwoner/accounts/tests/test_logging.py +++ b/src/open_inwoner/accounts/tests/test_logging.py @@ -209,7 +209,9 @@ def test_password_change_is_logged(self): form["new_password1"] = "newPassw0rd" form["new_password2"] = "newPassw0rd" form.submit() - log_entry = TimelineLog.objects.last() + log_entry = TimelineLog.objects.filter( + extra_data__message=str(_("password was changed")) + ).last() self.assertEqual( log_entry.timestamp.strftime("%m/%d/%Y, %H:%M:%S"), "10/18/2021, 13:00:00" From 65b19d54a4da9889a9c05afe614707e054656207 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Mon, 31 Oct 2022 19:55:14 +0100 Subject: [PATCH 08/10] Making test less flakey --- src/open_inwoner/accounts/tests/test_password_reset_view.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/open_inwoner/accounts/tests/test_password_reset_view.py b/src/open_inwoner/accounts/tests/test_password_reset_view.py index d2e91bd5dc..8054c4ed89 100644 --- a/src/open_inwoner/accounts/tests/test_password_reset_view.py +++ b/src/open_inwoner/accounts/tests/test_password_reset_view.py @@ -8,8 +8,10 @@ def test_user_cant_access_the_password_reset_view_more_than_5_times(self): url = reverse("admin_password_reset") cache.clear() - for i in range(5): + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + for i in range(10): response = self.client.get(url) - self.assertEqual(response.status_code, 200) response = self.client.get(url) self.assertEqual(response.status_code, 403) From fcb9dc545b7ffd59797cb4aaa966a3f65298aea4 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Tue, 1 Nov 2022 10:29:20 +0100 Subject: [PATCH 09/10] Fixed #866 -- Reordering str --- src/open_inwoner/questionnaire/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/open_inwoner/questionnaire/models.py b/src/open_inwoner/questionnaire/models.py index 26a32e89be..47e549ff6c 100644 --- a/src/open_inwoner/questionnaire/models.py +++ b/src/open_inwoner/questionnaire/models.py @@ -110,7 +110,7 @@ class Meta: ordering = ("path",) def __str__(self) -> str: - return "{} ({} - {})".format(self.question, self.id, self.code) + return "({} - {}) {}".format(self.id, self.code, self.question) def get_absolute_url(self) -> str: if self.is_root(): From dfd5412294d6bb28053e7b8c8a65542f02c2fc15 Mon Sep 17 00:00:00 2001 From: Alex de Landgraaf Date: Tue, 1 Nov 2022 10:39:43 +0100 Subject: [PATCH 10/10] Resolving failing test --- src/open_inwoner/questionnaire/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/open_inwoner/questionnaire/tests/test_models.py b/src/open_inwoner/questionnaire/tests/test_models.py index 5db0dfda2d..871fdc3ecc 100644 --- a/src/open_inwoner/questionnaire/tests/test_models.py +++ b/src/open_inwoner/questionnaire/tests/test_models.py @@ -23,7 +23,7 @@ def test_slug_unique(self): def test_str(self): root = QuestionnaireStepFactory.create(question="foo") - self.assertTrue(str(root).startswith("foo")) + self.assertTrue("foo" in str(root)) def test_get_absolute_url_root(self): root = QuestionnaireStepFactory.create(code="foo", slug="foo")