Mailing lijst:"
+"strong>\n"
+" \n"
+" %(mailing_list_url)s\n"
+" \n"
+" "
+
+#: taiga/base/templates/emails/hero-body-html.jinja:6
+msgid "You have been Taigatized"
+msgstr "Je bent getaiganiseerd."
+
+#: taiga/base/templates/emails/hero-body-html.jinja:359
+msgid ""
+"\n"
+" You have been Taigatized!"
+"
\n"
+" Welcome to Taiga, an Open "
+"Source, Agile Project Management Tool
\n"
+" "
+msgstr ""
+"\n"
+" Je bent getaiganiseerd!"
+"h1>\n"
+"
Welkom bij Taiga, een "
+"Open Source, Agile Project Management Tool
\n"
+" "
+
+#: taiga/base/templates/emails/updates-body-html.jinja:6
+msgid "[Taiga] Updates"
+msgstr "[Taiga] Updates"
+
+#: taiga/base/templates/emails/updates-body-html.jinja:417
+msgid "Updates"
+msgstr "Updates"
+
+#: taiga/base/templates/emails/updates-body-html.jinja:423
+#, python-format
+msgid ""
+"\n"
+" comment:"
+"
\n"
+" "
+"%(comment)s
\n"
+" "
+msgstr ""
+
+#: taiga/base/templates/emails/updates-body-text.jinja:6
+#, python-format
+msgid ""
+"\n"
+" Comment: %(comment)s\n"
+" "
+msgstr ""
+"\n"
+" Commentaar: %(comment)s\n"
+" "
+
+#: taiga/export_import/api.py:103
+msgid "We needed at least one role"
+msgstr "We hadden minstens één rol nodig"
+
+#: taiga/export_import/api.py:197
+msgid "Needed dump file"
+msgstr "Dump file nodig"
+
+#: taiga/export_import/api.py:204
+msgid "Invalid dump format"
+msgstr "Ongeldig dump formaat"
+
+#: taiga/export_import/dump_service.py:96
+msgid "error importing project data"
+msgstr "fout bij het importeren van project data"
+
+#: taiga/export_import/dump_service.py:109
+msgid "error importing lists of project attributes"
+msgstr "fout bij importeren van project attributenlijst"
+
+#: taiga/export_import/dump_service.py:114
+msgid "error importing default project attributes values"
+msgstr "fout bij importeren van standaard projectattributen waarden"
+
+#: taiga/export_import/dump_service.py:124
+msgid "error importing custom attributes"
+msgstr "fout bij importeren eigen attributen"
+
+#: taiga/export_import/dump_service.py:129
+msgid "error importing roles"
+msgstr "fout bij importeren rollen"
+
+#: taiga/export_import/dump_service.py:144
+msgid "error importing memberships"
+msgstr "fout bij importeren lidmaatschappen"
+
+#: taiga/export_import/dump_service.py:149
+msgid "error importing sprints"
+msgstr "fout bij importeren sprints"
+
+#: taiga/export_import/dump_service.py:154
+msgid "error importing wiki pages"
+msgstr "fout bij importeren wiki pagina's"
+
+#: taiga/export_import/dump_service.py:159
+msgid "error importing wiki links"
+msgstr "fout bij importeren wiki links"
+
+#: taiga/export_import/dump_service.py:164
+msgid "error importing issues"
+msgstr "fout bij importeren issues"
+
+#: taiga/export_import/dump_service.py:169
+msgid "error importing user stories"
+msgstr "fout bij importeren user stories"
+
+#: taiga/export_import/dump_service.py:174
+msgid "error importing tasks"
+msgstr "fout bij importeren taken"
+
+#: taiga/export_import/dump_service.py:179
+msgid "error importing tags"
+msgstr "fout bij importeren tags"
+
+#: taiga/export_import/dump_service.py:183
+msgid "error importing timelines"
+msgstr "fout bij importeren tijdlijnen"
+
+#: taiga/export_import/serializers.py:161
+msgid "{}=\"{}\" not found in this project"
+msgstr "{}=\"{}\" niet gevonden in dit project"
+
+#: taiga/export_import/serializers.py:382
+#: taiga/projects/custom_attributes/serializers.py:103
+msgid "Invalid content. It must be {\"key\": \"value\",...}"
+msgstr "Ongeldige inhoud. Volgend formaat geldt {\"key\": \"value\",...}"
+
+#: taiga/export_import/serializers.py:397
+#: taiga/projects/custom_attributes/serializers.py:118
+msgid "It contain invalid custom fields."
+msgstr "Het bevat ongeldige eigen velden:"
+
+#: taiga/export_import/serializers.py:466
+#: taiga/projects/milestones/serializers.py:63
+#: taiga/projects/serializers.py:66 taiga/projects/serializers.py:92
+#: taiga/projects/serializers.py:122 taiga/projects/serializers.py:164
+msgid "Name duplicated for the project"
+msgstr "Naam gedupliceerd voor het project"
+
+#: taiga/export_import/tasks.py:49 taiga/export_import/tasks.py:50
+msgid "Error generating project dump"
+msgstr "Fout bij genereren project dump"
+
+#: taiga/export_import/tasks.py:82 taiga/export_import/tasks.py:83
+msgid "Error loading project dump"
+msgstr "Fout bij laden project dump"
+
+#: taiga/export_import/templates/emails/dump_project-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Project dump generated
\n"
+" Hello %(user)s,
\n"
+" Your dump from project %(project)s has been correctly generated."
+"h3>\n"
+"
You can download it here:
\n"
+" Download the dump file\n"
+" This file will be deleted on %(deletion_date)s.
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+"\n"
+" Project dump gegenereerd
\n"
+" Hallo %(user)s,
\n"
+" De dump van project %(project)s is correct gegenereerd.
\n"
+" Je kan het hier downloaden:
\n"
+" Download het dump bestand\n"
+" Dit bestand zal verwijderd worden op %(deletion_date)s.
\n"
+" Het Taiga Team
\n"
+" "
+
+#: taiga/export_import/templates/emails/dump_project-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Hello %(user)s,\n"
+"\n"
+"Your dump from project %(project)s has been correctly generated. You can "
+"download it here:\n"
+"\n"
+"%(url)s\n"
+"\n"
+"This file will be deleted on %(deletion_date)s.\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+"\n"
+"Hallo %(user)s,\n"
+"\n"
+"De dump van project %(project)s werd correct genereerd. Je kan het hier "
+"downloaden:\n"
+"\n"
+"%(url)s\n"
+"\n"
+"Het bestand zal verwijderd worden op %(deletion_date)s.\n"
+"\n"
+"---\n"
+"Het Taiga Team\n"
+
+#: taiga/export_import/templates/emails/dump_project-subject.jinja:1
+#, python-format
+msgid "[%(project)s] Your project dump has been generated"
+msgstr "[%(project)s] De project dump werd gegenereerd"
+
+#: taiga/export_import/templates/emails/export_error-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" %(error_message)s
\n"
+" Hello %(user)s,
\n"
+" Your project %(project)s has not been exported correctly.
\n"
+" The Taiga system administrators have been informed.
Please, try "
+"it again or contact with the support team at\n"
+" %(support_email)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/export_import/templates/emails/export_error-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Hello %(user)s,\n"
+"\n"
+"%(error_message)s\n"
+"Your project %(project)s has not been exported correctly.\n"
+"\n"
+"The Taiga system administrators have been informed.\n"
+"\n"
+"Please, try it again or contact with the support team at %(support_email)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/export_import/templates/emails/export_error-subject.jinja:1
+#, python-format
+msgid "[%(project)s] %(error_subject)s"
+msgstr "[%(project)s] %(error_subject)s"
+
+#: taiga/export_import/templates/emails/import_error-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" %(error_message)s
\n"
+" Hello %(user)s,
\n"
+" Your project has not been importer correctly.
\n"
+" The Taiga system administrators have been informed.
Please, try "
+"it again or contact with the support team at\n"
+" %(support_email)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/export_import/templates/emails/import_error-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Hello %(user)s,\n"
+"\n"
+"%(error_message)s\n"
+"\n"
+"Your project has not been importer correctly.\n"
+"\n"
+"The Taiga system administrators have been informed.\n"
+"\n"
+"Please, try it again or contact with the support team at %(support_email)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/export_import/templates/emails/import_error-subject.jinja:1
+#, python-format
+msgid "[Taiga] %(error_subject)s"
+msgstr "[Taiga] %(error_subject)s"
+
+#: taiga/export_import/templates/emails/load_dump-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Project dump imported
\n"
+" Hello %(user)s,
\n"
+" Your project dump has been correctly imported.
\n"
+" Go to %(project)s\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/export_import/templates/emails/load_dump-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Hello %(user)s,\n"
+"\n"
+"Your project dump has been correctly imported.\n"
+"\n"
+"You can see the project %(project)s here:\n"
+"\n"
+"%(url)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/export_import/templates/emails/load_dump-subject.jinja:1
+#, python-format
+msgid "[%(project)s] Your project dump has been imported"
+msgstr "[%(project)s] Je project dump is geïmporteerd"
+
+#: taiga/feedback/models.py:23 taiga/users/models.py:111
+msgid "full name"
+msgstr "volledige naam"
+
+#: taiga/feedback/models.py:25 taiga/users/models.py:106
+msgid "email address"
+msgstr "e-mail adres"
+
+#: taiga/feedback/models.py:27
+msgid "comment"
+msgstr "commentaar"
+
+#: taiga/feedback/models.py:29 taiga/projects/attachments/models.py:63
+#: taiga/projects/custom_attributes/models.py:38
+#: taiga/projects/issues/models.py:53 taiga/projects/milestones/models.py:45
+#: taiga/projects/models.py:129 taiga/projects/models.py:561
+#: taiga/projects/tasks/models.py:46 taiga/projects/userstories/models.py:82
+#: taiga/projects/wiki/models.py:38 taiga/userstorage/models.py:27
+msgid "created date"
+msgstr "aanmaakdatum"
+
+#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Feedback
\n"
+" Taiga has received feedback from %(full_name)s <%(email)s>
\n"
+" "
+msgstr ""
+"\n"
+" Feedback
\n"
+" Taiga heeft feedback ontvangen van %(full_name)s <%(email)s>
\n"
+" "
+
+#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:9
+#, python-format
+msgid ""
+"\n"
+" Comment
\n"
+" %(comment)s
\n"
+" "
+msgstr ""
+"\n"
+" Commentaar
\n"
+" %(comment)s
\n"
+" "
+
+#: taiga/feedback/templates/emails/feedback_notification-body-html.jinja:18
+#: taiga/users/admin.py:51
+msgid "Extra info"
+msgstr "Extra info"
+
+#: taiga/feedback/templates/emails/feedback_notification-body-text.jinja:1
+#, python-format
+msgid ""
+"---------\n"
+"- From: %(full_name)s <%(email)s>\n"
+"---------\n"
+"- Comment:\n"
+"%(comment)s\n"
+"---------"
+msgstr ""
+"---------\n"
+"- Van: %(full_name)s <%(email)s>\n"
+"---------\n"
+"- Commentaar:\n"
+"%(comment)s\n"
+"---------"
+
+#: taiga/feedback/templates/emails/feedback_notification-body-text.jinja:8
+msgid "- Extra info:"
+msgstr "- Extra info:"
+
+#: taiga/feedback/templates/emails/feedback_notification-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[Taiga] Feedback from %(full_name)s <%(email)s>\n"
+msgstr ""
+"\n"
+"[Taiga] Feedback van %(full_name)s <%(email)s>\n"
+
+#: taiga/hooks/api.py:52
+msgid "The payload is not a valid json"
+msgstr "De payload is geen geldige json"
+
+#: taiga/hooks/api.py:61
+msgid "The project doesn't exist"
+msgstr "Het project bestaat niet"
+
+#: taiga/hooks/api.py:64
+msgid "Bad signature"
+msgstr "Slechte signature"
+
+#: taiga/hooks/bitbucket/api.py:40
+msgid "The payload is not a valid application/x-www-form-urlencoded"
+msgstr "De payload is geen geldige application/x-www-form-urlencoded"
+
+#: taiga/hooks/bitbucket/event_hooks.py:45
+msgid "The payload is not valid"
+msgstr "De payload is niet geldig"
+
+#: taiga/hooks/bitbucket/event_hooks.py:81
+#: taiga/hooks/github/event_hooks.py:76 taiga/hooks/gitlab/event_hooks.py:74
+msgid "The referenced element doesn't exist"
+msgstr "Het element waarnaar verwezen wordt bestaat niet"
+
+#: taiga/hooks/bitbucket/event_hooks.py:88
+#: taiga/hooks/github/event_hooks.py:83 taiga/hooks/gitlab/event_hooks.py:81
+msgid "The status doesn't exist"
+msgstr "De status bestaat niet"
+
+#: taiga/hooks/bitbucket/event_hooks.py:94
+msgid "Status changed from BitBucket commit"
+msgstr "Status veranderd door Bitbucket commit"
+
+#: taiga/hooks/github/event_hooks.py:97
+#, python-brace-format
+msgid ""
+"Status changed by [@{github_user_name}]({github_user_url} \"See "
+"@{github_user_name}'s GitHub profile\") from GitHub commit [{commit_id}]"
+"({commit_url} \"See commit '{commit_id} - {commit_message}'\")."
+msgstr ""
+
+#: taiga/hooks/github/event_hooks.py:108
+msgid "Status changed from GitHub commit."
+msgstr "Status veranderd door GitHub commit."
+
+#: taiga/hooks/github/event_hooks.py:142 taiga/hooks/gitlab/event_hooks.py:114
+msgid "Invalid issue information"
+msgstr "Ongeldige issue informatie"
+
+#: taiga/hooks/github/event_hooks.py:158
+#, python-brace-format
+msgid ""
+"Issue created by [@{github_user_name}]({github_user_url} \"See "
+"@{github_user_name}'s GitHub profile\") from GitHub.\n"
+"Origin GitHub issue: [gh#{number} - {subject}]({github_url} \"Go to "
+"'gh#{number} - {subject}'\"):\n"
+"\n"
+"{description}"
+msgstr ""
+
+#: taiga/hooks/github/event_hooks.py:169
+msgid "Issue created from GitHub."
+msgstr "Issue aangemaakt via GitHub."
+
+#: taiga/hooks/github/event_hooks.py:178 taiga/hooks/github/event_hooks.py:193
+msgid "Invalid issue comment information"
+msgstr "Ongeldige issue commentaar informatie"
+
+#: taiga/hooks/github/event_hooks.py:201
+#, python-brace-format
+msgid ""
+"Comment by [@{github_user_name}]({github_user_url} \"See "
+"@{github_user_name}'s GitHub profile\") from GitHub.\n"
+"Origin GitHub issue: [gh#{number} - {subject}]({github_url} \"Go to "
+"'gh#{number} - {subject}'\")\n"
+"\n"
+"{message}"
+msgstr ""
+
+#: taiga/hooks/github/event_hooks.py:212
+#, python-brace-format
+msgid ""
+"Comment From GitHub:\n"
+"\n"
+"{message}"
+msgstr ""
+"Commentaar via GitHub:\n"
+"\n"
+"{message}"
+
+#: taiga/hooks/gitlab/event_hooks.py:87
+msgid "Status changed from GitLab commit"
+msgstr "Status veranderd door GitLab commit"
+
+#: taiga/hooks/gitlab/event_hooks.py:129
+msgid "Created from GitLab"
+msgstr "Aangemaakt via GitLab"
+
+#: taiga/permissions/permissions.py:21 taiga/permissions/permissions.py:31
+#: taiga/permissions/permissions.py:52
+msgid "View project"
+msgstr "Bekijk project"
+
+#: taiga/permissions/permissions.py:22 taiga/permissions/permissions.py:32
+#: taiga/permissions/permissions.py:54
+msgid "View milestones"
+msgstr "Bekijk milestones"
+
+#: taiga/permissions/permissions.py:23 taiga/permissions/permissions.py:33
+msgid "View user stories"
+msgstr "Bekijk user stories"
+
+#: taiga/permissions/permissions.py:24 taiga/permissions/permissions.py:36
+#: taiga/permissions/permissions.py:64
+msgid "View tasks"
+msgstr "Bekijk taken"
+
+#: taiga/permissions/permissions.py:25 taiga/permissions/permissions.py:34
+#: taiga/permissions/permissions.py:69
+msgid "View issues"
+msgstr "Bekijk issues"
+
+#: taiga/permissions/permissions.py:26 taiga/permissions/permissions.py:37
+#: taiga/permissions/permissions.py:75
+msgid "View wiki pages"
+msgstr "Bekijk wiki pagina's"
+
+#: taiga/permissions/permissions.py:27 taiga/permissions/permissions.py:38
+#: taiga/permissions/permissions.py:80
+msgid "View wiki links"
+msgstr "Bekijk wiki links"
+
+#: taiga/permissions/permissions.py:35 taiga/permissions/permissions.py:70
+msgid "Vote issues"
+msgstr "Stem op issues"
+
+#: taiga/permissions/permissions.py:39
+msgid "Request membership"
+msgstr "Vraag lidmaatschap aan"
+
+#: taiga/permissions/permissions.py:40
+msgid "Add user story to project"
+msgstr "Voeg user story toe aan project"
+
+#: taiga/permissions/permissions.py:41
+msgid "Add comments to user stories"
+msgstr "Voeg commentaar toe aan user stories"
+
+#: taiga/permissions/permissions.py:42
+msgid "Add comments to tasks"
+msgstr "Voeg commentaar toe aan taken"
+
+#: taiga/permissions/permissions.py:43
+msgid "Add issues"
+msgstr "Voeg issues toe"
+
+#: taiga/permissions/permissions.py:44
+msgid "Add comments to issues"
+msgstr "Voeg commentaar toe aan issues"
+
+#: taiga/permissions/permissions.py:45 taiga/permissions/permissions.py:76
+msgid "Add wiki page"
+msgstr "Voeg wiki pagina toe"
+
+#: taiga/permissions/permissions.py:46 taiga/permissions/permissions.py:77
+msgid "Modify wiki page"
+msgstr "Wijzig wiki pagina"
+
+#: taiga/permissions/permissions.py:47 taiga/permissions/permissions.py:81
+msgid "Add wiki link"
+msgstr "Voeg wiki link toe"
+
+#: taiga/permissions/permissions.py:48 taiga/permissions/permissions.py:82
+msgid "Modify wiki link"
+msgstr "Wijzig wiki link"
+
+#: taiga/permissions/permissions.py:55
+msgid "Add milestone"
+msgstr "Voeg milestone toe"
+
+#: taiga/permissions/permissions.py:56
+msgid "Modify milestone"
+msgstr "Wijzig milestone"
+
+#: taiga/permissions/permissions.py:57
+msgid "Delete milestone"
+msgstr "Verwijder milestone"
+
+#: taiga/permissions/permissions.py:59
+msgid "View user story"
+msgstr "Bekijk user story"
+
+#: taiga/permissions/permissions.py:60
+msgid "Add user story"
+msgstr "Voeg user story toe"
+
+#: taiga/permissions/permissions.py:61
+msgid "Modify user story"
+msgstr "Wijzig user story"
+
+#: taiga/permissions/permissions.py:62
+msgid "Delete user story"
+msgstr "Verwijder user story"
+
+#: taiga/permissions/permissions.py:65
+msgid "Add task"
+msgstr "Voeg taak toe"
+
+#: taiga/permissions/permissions.py:66
+msgid "Modify task"
+msgstr "Wijzig taak"
+
+#: taiga/permissions/permissions.py:67
+msgid "Delete task"
+msgstr "Verwijder taak"
+
+#: taiga/permissions/permissions.py:71
+msgid "Add issue"
+msgstr "Voeg issue toe"
+
+#: taiga/permissions/permissions.py:72
+msgid "Modify issue"
+msgstr "Wijzig issue"
+
+#: taiga/permissions/permissions.py:73
+msgid "Delete issue"
+msgstr "Verwijder issue"
+
+#: taiga/permissions/permissions.py:78
+msgid "Delete wiki page"
+msgstr "Verwijder wiki pagina"
+
+#: taiga/permissions/permissions.py:83
+msgid "Delete wiki link"
+msgstr "Verwijder wiki link"
+
+#: taiga/permissions/permissions.py:87
+msgid "Modify project"
+msgstr "Wijzig project"
+
+#: taiga/permissions/permissions.py:88
+msgid "Add member"
+msgstr "Voeg lid toe"
+
+#: taiga/permissions/permissions.py:89
+msgid "Remove member"
+msgstr "Verwijder lid"
+
+#: taiga/permissions/permissions.py:90
+msgid "Delete project"
+msgstr "Verwijder project"
+
+#: taiga/permissions/permissions.py:91
+msgid "Admin project values"
+msgstr "Admin project waarden"
+
+#: taiga/permissions/permissions.py:92
+msgid "Admin roles"
+msgstr "Admin rollen"
+
+#: taiga/projects/api.py:204
+msgid "Not valid template name"
+msgstr "Ongeldige template naam"
+
+#: taiga/projects/api.py:207
+msgid "Not valid template description"
+msgstr "Ongeldige template omschrijving"
+
+#: taiga/projects/api.py:469 taiga/projects/serializers.py:257
+msgid "At least one of the user must be an active admin"
+msgstr "Minstens één van de gebruikers moet een active admin zijn"
+
+#: taiga/projects/api.py:499
+msgid "You don't have permisions to see that."
+msgstr "Je hebt geen toestamming om dat te bekijken."
+
+#: taiga/projects/attachments/api.py:47
+msgid "Non partial updates not supported"
+msgstr "Niet-partiële updates worden niet ondersteund."
+
+#: taiga/projects/attachments/api.py:62
+msgid "Project ID not matches between object and project"
+msgstr "Project ID van object is niet gelijk aan die van het project"
+
+#: taiga/projects/attachments/models.py:54 taiga/projects/issues/models.py:38
+#: taiga/projects/milestones/models.py:39 taiga/projects/models.py:134
+#: taiga/projects/notifications/models.py:57 taiga/projects/tasks/models.py:37
+#: taiga/projects/userstories/models.py:64 taiga/projects/wiki/models.py:34
+#: taiga/userstorage/models.py:25
+msgid "owner"
+msgstr "eigenaar"
+
+#: taiga/projects/attachments/models.py:56
+#: taiga/projects/custom_attributes/models.py:35
+#: taiga/projects/issues/models.py:51 taiga/projects/milestones/models.py:41
+#: taiga/projects/models.py:338 taiga/projects/models.py:364
+#: taiga/projects/models.py:395 taiga/projects/models.py:424
+#: taiga/projects/models.py:457 taiga/projects/models.py:480
+#: taiga/projects/models.py:507 taiga/projects/models.py:538
+#: taiga/projects/notifications/models.py:69 taiga/projects/tasks/models.py:41
+#: taiga/projects/userstories/models.py:62 taiga/projects/wiki/models.py:28
+#: taiga/projects/wiki/models.py:66 taiga/users/models.py:196
+msgid "project"
+msgstr "project"
+
+#: taiga/projects/attachments/models.py:58
+msgid "content type"
+msgstr "inhoud type"
+
+#: taiga/projects/attachments/models.py:60
+msgid "object id"
+msgstr "object id"
+
+#: taiga/projects/attachments/models.py:66
+#: taiga/projects/custom_attributes/models.py:40
+#: taiga/projects/issues/models.py:56 taiga/projects/milestones/models.py:48
+#: taiga/projects/models.py:132 taiga/projects/models.py:564
+#: taiga/projects/tasks/models.py:49 taiga/projects/userstories/models.py:85
+#: taiga/projects/wiki/models.py:41 taiga/userstorage/models.py:29
+msgid "modified date"
+msgstr "gemodifieerde datum"
+
+#: taiga/projects/attachments/models.py:71
+msgid "attached file"
+msgstr "bijgevoegd bestand"
+
+#: taiga/projects/attachments/models.py:74
+msgid "is deprecated"
+msgstr "is verouderd"
+
+#: taiga/projects/attachments/models.py:75
+#: taiga/projects/custom_attributes/models.py:32
+#: taiga/projects/history/templatetags/functions.py:25
+#: taiga/projects/issues/models.py:61 taiga/projects/models.py:127
+#: taiga/projects/models.py:559 taiga/projects/tasks/models.py:60
+#: taiga/projects/userstories/models.py:90
+msgid "description"
+msgstr "omschrijving"
+
+#: taiga/projects/attachments/models.py:76
+#: taiga/projects/custom_attributes/models.py:33
+#: taiga/projects/milestones/models.py:54 taiga/projects/models.py:354
+#: taiga/projects/models.py:391 taiga/projects/models.py:418
+#: taiga/projects/models.py:453 taiga/projects/models.py:476
+#: taiga/projects/models.py:501 taiga/projects/models.py:534
+#: taiga/projects/wiki/models.py:71 taiga/users/models.py:191
+msgid "order"
+msgstr "volgorde"
+
+#: taiga/projects/choices.py:21
+msgid "AppearIn"
+msgstr "AppearIn"
+
+#: taiga/projects/choices.py:22
+msgid "Jitsi"
+msgstr "Jitsi"
+
+#: taiga/projects/choices.py:23
+msgid "Talky"
+msgstr "Talky"
+
+#: taiga/projects/custom_attributes/models.py:31
+#: taiga/projects/milestones/models.py:34 taiga/projects/models.py:123
+#: taiga/projects/models.py:350 taiga/projects/models.py:389
+#: taiga/projects/models.py:414 taiga/projects/models.py:451
+#: taiga/projects/models.py:474 taiga/projects/models.py:497
+#: taiga/projects/models.py:532 taiga/projects/models.py:555
+#: taiga/users/models.py:183 taiga/webhooks/models.py:27
+msgid "name"
+msgstr "naam"
+
+#: taiga/projects/custom_attributes/models.py:81
+msgid "values"
+msgstr "waarden"
+
+#: taiga/projects/custom_attributes/models.py:91
+#: taiga/projects/tasks/models.py:33 taiga/projects/userstories/models.py:34
+msgid "user story"
+msgstr "user story"
+
+#: taiga/projects/custom_attributes/models.py:106
+msgid "task"
+msgstr "taak"
+
+#: taiga/projects/custom_attributes/models.py:121
+msgid "issue"
+msgstr "issue"
+
+#: taiga/projects/custom_attributes/serializers.py:57
+msgid "Already exists one with the same name."
+msgstr "Er bestaat er al één met dezelfde naam."
+
+#: taiga/projects/history/api.py:70
+msgid "Comment already deleted"
+msgstr "Commentaar is al verwijderd"
+
+#: taiga/projects/history/api.py:89
+msgid "Comment not deleted"
+msgstr "Commentaar niet verwijderd"
+
+#: taiga/projects/history/choices.py:27
+msgid "Change"
+msgstr "Verander"
+
+#: taiga/projects/history/choices.py:28
+msgid "Create"
+msgstr "Creëer"
+
+#: taiga/projects/history/choices.py:29
+msgid "Delete"
+msgstr "Verwijder"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:22
+#, python-format
+msgid "%(role)s role points"
+msgstr "%(role)s rol punten"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:25
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:130
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:133
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:156
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:193
+msgid "from"
+msgstr "van"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:31
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:141
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:144
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:162
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:179
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:199
+msgid "to"
+msgstr "naar"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:43
+msgid "Added new attachment"
+msgstr "Nieuwe bijlage toegevoegd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:61
+msgid "Updated attachment"
+msgstr "Bijlage bijgewerkt"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:67
+msgid "deprecated"
+msgstr "verouderd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:69
+msgid "not deprecated"
+msgstr "niet verouderd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:85
+msgid "Deleted attachment"
+msgstr "Bijlage verwijderd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:104
+msgid "added"
+msgstr "toegevoegd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:109
+msgid "removed"
+msgstr "verwijderd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:134
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:145
+#: taiga/projects/services/stats.py:124 taiga/projects/services/stats.py:125
+msgid "Unassigned"
+msgstr "Niet toegewezen"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-html.jinja:211
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:86
+msgid "-deleted-"
+msgstr "-verwijderd-"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20
+msgid "to:"
+msgstr "naar:"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:20
+msgid "from:"
+msgstr "van:"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:26
+msgid "Added"
+msgstr "Toegevoegd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:33
+msgid "Changed"
+msgstr "Veranderd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:40
+msgid "Deleted"
+msgstr "Verwijderd"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:54
+msgid "added:"
+msgstr "toegevoegd:"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:57
+msgid "removed:"
+msgstr "verwijderd:"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:62
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:79
+msgid "From:"
+msgstr "Van:"
+
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:63
+#: taiga/projects/history/templates/emails/includes/fields_diff-text.jinja:80
+msgid "To:"
+msgstr "Naar:"
+
+#: taiga/projects/history/templatetags/functions.py:26
+#: taiga/projects/wiki/models.py:32
+msgid "content"
+msgstr "inhoud"
+
+#: taiga/projects/history/templatetags/functions.py:27
+#: taiga/projects/mixins/blocked.py:31
+msgid "blocked note"
+msgstr "geblokkeerde notitie"
+
+#: taiga/projects/issues/api.py:139
+msgid "You don't have permissions to set this sprint to this issue."
+msgstr "Je hebt geen toestemming om deze sprint op deze issue te zetten."
+
+#: taiga/projects/issues/api.py:143
+msgid "You don't have permissions to set this status to this issue."
+msgstr "Je hebt geen toestemming om deze status toe te kennen aan dze issue."
+
+#: taiga/projects/issues/api.py:147
+msgid "You don't have permissions to set this severity to this issue."
+msgstr ""
+"Je hebt geen toestemming om dit ernstniveau toe te kennen aan deze issue."
+
+#: taiga/projects/issues/api.py:151
+msgid "You don't have permissions to set this priority to this issue."
+msgstr ""
+"Je hebt geen toestemming om deze prioriteit toe te kennen aan deze issue."
+
+#: taiga/projects/issues/api.py:155
+msgid "You don't have permissions to set this type to this issue."
+msgstr "Je hebt geen toestemming om dit type toe te kennen aan deze issue."
+
+#: taiga/projects/issues/models.py:36 taiga/projects/tasks/models.py:35
+#: taiga/projects/userstories/models.py:57
+msgid "ref"
+msgstr "ref"
+
+#: taiga/projects/issues/models.py:40 taiga/projects/tasks/models.py:39
+#: taiga/projects/userstories/models.py:67
+msgid "status"
+msgstr "status"
+
+#: taiga/projects/issues/models.py:42
+msgid "severity"
+msgstr "erstniveau"
+
+#: taiga/projects/issues/models.py:44
+msgid "priority"
+msgstr "prioriteit"
+
+#: taiga/projects/issues/models.py:46
+msgid "type"
+msgstr "type"
+
+#: taiga/projects/issues/models.py:49 taiga/projects/tasks/models.py:44
+#: taiga/projects/userstories/models.py:60
+msgid "milestone"
+msgstr "milestone"
+
+#: taiga/projects/issues/models.py:58 taiga/projects/tasks/models.py:51
+msgid "finished date"
+msgstr "datum van afwerking"
+
+#: taiga/projects/issues/models.py:60 taiga/projects/tasks/models.py:53
+#: taiga/projects/userstories/models.py:89
+msgid "subject"
+msgstr "onderwerp"
+
+#: taiga/projects/issues/models.py:64 taiga/projects/tasks/models.py:63
+#: taiga/projects/userstories/models.py:93
+msgid "assigned to"
+msgstr "toegewezen aan"
+
+#: taiga/projects/issues/models.py:66 taiga/projects/tasks/models.py:67
+#: taiga/projects/userstories/models.py:103
+msgid "external reference"
+msgstr "externe referentie"
+
+#: taiga/projects/milestones/models.py:37 taiga/projects/models.py:125
+#: taiga/projects/models.py:352 taiga/projects/models.py:416
+#: taiga/projects/models.py:499 taiga/projects/models.py:557
+#: taiga/projects/wiki/models.py:30 taiga/users/models.py:185
+msgid "slug"
+msgstr "slug"
+
+#: taiga/projects/milestones/models.py:42
+msgid "estimated start date"
+msgstr "geschatte start datum"
+
+#: taiga/projects/milestones/models.py:43
+msgid "estimated finish date"
+msgstr "geschatte datum van afwerking"
+
+#: taiga/projects/milestones/models.py:50 taiga/projects/models.py:356
+#: taiga/projects/models.py:420 taiga/projects/models.py:503
+msgid "is closed"
+msgstr "is gesloten"
+
+#: taiga/projects/milestones/models.py:52
+msgid "disponibility"
+msgstr "beschikbaarheid"
+
+#: taiga/projects/milestones/models.py:75
+msgid "The estimated start must be previous to the estimated finish."
+msgstr "The geschatte start moet vroeger zijn dan het geschatte einde."
+
+#: taiga/projects/milestones/validators.py:12
+msgid "There's no sprint with that id"
+msgstr "Er is geen sprint met dat id"
+
+#: taiga/projects/mixins/blocked.py:29
+msgid "is blocked"
+msgstr "is geblokkeerd"
+
+#: taiga/projects/mixins/ordering.py:47
+#, python-brace-format
+msgid "'{param}' parameter is mandatory"
+msgstr "'{param}' parameter is verplicht"
+
+#: taiga/projects/mixins/ordering.py:51
+msgid "'project' parameter is mandatory"
+msgstr "'project' parameter is verplicht"
+
+#: taiga/projects/models.py:59
+msgid "email"
+msgstr "e-mail"
+
+#: taiga/projects/models.py:61
+msgid "create at"
+msgstr "aangemaakt op"
+
+#: taiga/projects/models.py:63 taiga/users/models.py:128
+msgid "token"
+msgstr "token"
+
+#: taiga/projects/models.py:69
+msgid "invitation extra text"
+msgstr "uitnodiging extra text"
+
+#: taiga/projects/models.py:72
+msgid "user order"
+msgstr "gebruiker volgorde"
+
+#: taiga/projects/models.py:78
+msgid "The user is already member of the project"
+msgstr "The gebruikers is al lid van het project"
+
+#: taiga/projects/models.py:93
+msgid "default points"
+msgstr "standaard punten"
+
+#: taiga/projects/models.py:97
+msgid "default US status"
+msgstr "standaard US status"
+
+#: taiga/projects/models.py:101
+msgid "default task status"
+msgstr "default taak status"
+
+#: taiga/projects/models.py:104
+msgid "default priority"
+msgstr "standaard prioriteit"
+
+#: taiga/projects/models.py:107
+msgid "default severity"
+msgstr "standaard ernstniveau"
+
+#: taiga/projects/models.py:111
+msgid "default issue status"
+msgstr "standaard issue status"
+
+#: taiga/projects/models.py:115
+msgid "default issue type"
+msgstr "standaard issue type"
+
+#: taiga/projects/models.py:136
+msgid "members"
+msgstr "leden"
+
+#: taiga/projects/models.py:139
+msgid "total of milestones"
+msgstr "totaal van de milestones"
+
+#: taiga/projects/models.py:140
+msgid "total story points"
+msgstr "totaal story points"
+
+#: taiga/projects/models.py:143 taiga/projects/models.py:570
+msgid "active backlog panel"
+msgstr "actief backlog paneel"
+
+#: taiga/projects/models.py:145 taiga/projects/models.py:572
+msgid "active kanban panel"
+msgstr "actief kanban paneel"
+
+#: taiga/projects/models.py:147 taiga/projects/models.py:574
+msgid "active wiki panel"
+msgstr "actief wiki paneel"
+
+#: taiga/projects/models.py:149 taiga/projects/models.py:576
+msgid "active issues panel"
+msgstr "actief issues paneel"
+
+#: taiga/projects/models.py:152 taiga/projects/models.py:579
+msgid "videoconference system"
+msgstr "videoconference systeem"
+
+#: taiga/projects/models.py:154 taiga/projects/models.py:581
+msgid "videoconference room salt"
+msgstr "videoconference kamer salt"
+
+#: taiga/projects/models.py:159
+msgid "creation template"
+msgstr "aanmaak template"
+
+#: taiga/projects/models.py:162
+msgid "anonymous permissions"
+msgstr "anonieme toestemmingen"
+
+#: taiga/projects/models.py:166
+msgid "user permissions"
+msgstr "gebruikers toestemmingen"
+
+#: taiga/projects/models.py:169
+msgid "is private"
+msgstr "is privé"
+
+#: taiga/projects/models.py:180
+msgid "tags colors"
+msgstr "tag kleuren"
+
+#: taiga/projects/models.py:339
+msgid "modules config"
+msgstr "module config"
+
+#: taiga/projects/models.py:358
+msgid "is archived"
+msgstr "is gearchiveerd"
+
+#: taiga/projects/models.py:360 taiga/projects/models.py:422
+#: taiga/projects/models.py:455 taiga/projects/models.py:478
+#: taiga/projects/models.py:505 taiga/projects/models.py:536
+#: taiga/users/models.py:113
+msgid "color"
+msgstr "kleur"
+
+#: taiga/projects/models.py:362
+msgid "work in progress limit"
+msgstr "work in progress limiet"
+
+#: taiga/projects/models.py:393 taiga/userstorage/models.py:31
+msgid "value"
+msgstr "waarde"
+
+#: taiga/projects/models.py:567
+msgid "default owner's role"
+msgstr "standaard rol eigenaar"
+
+#: taiga/projects/models.py:583
+msgid "default options"
+msgstr "standaard instellingen"
+
+#: taiga/projects/models.py:584
+msgid "us statuses"
+msgstr "us statussen"
+
+#: taiga/projects/models.py:585 taiga/projects/userstories/models.py:40
+#: taiga/projects/userstories/models.py:72
+msgid "points"
+msgstr "punten"
+
+#: taiga/projects/models.py:586
+msgid "task statuses"
+msgstr "taak statussen"
+
+#: taiga/projects/models.py:587
+msgid "issue statuses"
+msgstr "issue statussen"
+
+#: taiga/projects/models.py:588
+msgid "issue types"
+msgstr "issue types"
+
+#: taiga/projects/models.py:589
+msgid "priorities"
+msgstr "prioriteiten"
+
+#: taiga/projects/models.py:590
+msgid "severities"
+msgstr "ernstniveaus"
+
+#: taiga/projects/models.py:591
+msgid "roles"
+msgstr "rollen"
+
+#: taiga/projects/notifications/choices.py:28
+msgid "Not watching"
+msgstr "Niet volgend"
+
+#: taiga/projects/notifications/choices.py:29
+msgid "Watching"
+msgstr "Volgend"
+
+#: taiga/projects/notifications/choices.py:30
+msgid "Ignoring"
+msgstr "Negerend"
+
+#: taiga/projects/notifications/mixins.py:87
+msgid "watchers"
+msgstr "volgers"
+
+#: taiga/projects/notifications/models.py:59
+msgid "created date time"
+msgstr "aanmaak datum en tijd"
+
+#: taiga/projects/notifications/models.py:61
+msgid "updated date time"
+msgstr "gewijzigde datum en tijd"
+
+#: taiga/projects/notifications/models.py:63
+msgid "history entries"
+msgstr "geschiedenis items"
+
+#: taiga/projects/notifications/models.py:66
+msgid "notify users"
+msgstr "verwittig gebruikers"
+
+#: taiga/projects/notifications/services.py:63
+#: taiga/projects/notifications/services.py:77
+msgid "Notify exists for specified user and project"
+msgstr "Verwittiging bestaat voor gespecifieerde gebruiker en project"
+
+#: taiga/projects/notifications/templates/emails/issues/issue-change-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Issue updated
\n"
+" Hello %(user)s,
%(changer)s has updated an issue on %(project)s"
+"p>\n"
+"
Issue #%(ref)s %(subject)s
\n"
+" See issue\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/issues/issue-change-body-text.jinja:3
+#, python-format
+msgid ""
+"\n"
+"Issue updated\n"
+"Hello %(user)s, %(changer)s has updated an issue on %(project)s\n"
+"See issue #%(ref)s %(subject)s at %(url)s\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/issues/issue-change-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Updated the issue #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Issue bijgewerkt#%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/issues/issue-create-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" New issue created
\n"
+" Hello %(user)s,
%(changer)s has created a new issue on "
+"%(project)s
\n"
+" Issue #%(ref)s %(subject)s
\n"
+" See issue\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/issues/issue-create-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"New issue created\n"
+"Hello %(user)s, %(changer)s has created a new issue on %(project)s\n"
+"See issue #%(ref)s %(subject)s at %(url)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/issues/issue-create-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Created the issue #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Issue aangemaakt #%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/issues/issue-delete-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Issue deleted
\n"
+" Hello %(user)s,
%(changer)s has deleted an issue on %(project)s"
+"p>\n"
+"
Issue #%(ref)s %(subject)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/issues/issue-delete-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Issue deleted\n"
+"Hello %(user)s, %(changer)s has deleted an issue on %(project)s\n"
+"Issue #%(ref)s %(subject)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/issues/issue-delete-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Deleted the issue #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Issue verwijderd #%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-change-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Sprint updated
\n"
+" Hello %(user)s,
%(changer)s has updated an sprint on "
+"%(project)s
\n"
+" Sprint %(name)s
\n"
+" See sprint\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-change-body-text.jinja:3
+#, python-format
+msgid ""
+"\n"
+"Sprint updated\n"
+"Hello %(user)s, %(changer)s has updated a sprint on %(project)s\n"
+"See sprint %(name)s at %(url)s\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-change-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Updated the sprint \"%(milestone)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Sprint bijgewerkt\"%(milestone)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-create-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" New sprint created
\n"
+" Hello %(user)s,
%(changer)s has created a new sprint on "
+"%(project)s
\n"
+" Sprint %(name)s
\n"
+" See "
+"sprint\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-create-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"New sprint created\n"
+"Hello %(user)s, %(changer)s has created a new sprint on %(project)s\n"
+"See sprint %(name)s at %(url)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-create-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Created the sprint \"%(milestone)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Sprint aangemaakt \"%(milestone)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-delete-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Sprint deleted
\n"
+" Hello %(user)s,
%(changer)s has deleted an sprint on "
+"%(project)s
\n"
+" Sprint %(name)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-delete-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Sprint deleted\n"
+"Hello %(user)s, %(changer)s has deleted an sprint on %(project)s\n"
+"Sprint %(name)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/milestones/milestone-delete-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Deleted the Sprint \"%(milestone)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Sprint verwijderd \"%(milestone)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/tasks/task-change-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Task updated
\n"
+" Hello %(user)s,
%(changer)s has updated a task on %(project)s"
+"p>\n"
+"
Task #%(ref)s %(subject)s
\n"
+" See task\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/tasks/task-change-body-text.jinja:3
+#, python-format
+msgid ""
+"\n"
+"Task updated\n"
+"Hello %(user)s, %(changer)s has updated a task on %(project)s\n"
+"See task #%(ref)s %(subject)s at %(url)s\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/tasks/task-change-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Updated the task #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Taak bijgewerkt#%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/tasks/task-create-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" New task created
\n"
+" Hello %(user)s,
%(changer)s has created a new task on "
+"%(project)s
\n"
+" Task #%(ref)s %(subject)s
\n"
+" See task\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/tasks/task-create-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"New task created\n"
+"Hello %(user)s, %(changer)s has created a new task on %(project)s\n"
+"See task #%(ref)s %(subject)s at %(url)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/tasks/task-create-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Created the task #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Taak aangemaakt #%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/tasks/task-delete-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Task deleted
\n"
+" Hello %(user)s,
%(changer)s has deleted a task on %(project)s"
+"p>\n"
+"
Task #%(ref)s %(subject)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/tasks/task-delete-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Task deleted\n"
+"Hello %(user)s, %(changer)s has deleted a task on %(project)s\n"
+"Task #%(ref)s %(subject)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/tasks/task-delete-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Deleted the task #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Taak verwijderd #%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-change-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" User Story updated
\n"
+" Hello %(user)s,
%(changer)s has updated a user story on "
+"%(project)s
\n"
+" User Story #%(ref)s %(subject)s
\n"
+" See user story\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-change-body-text.jinja:3
+#, python-format
+msgid ""
+"\n"
+"User story updated\n"
+"Hello %(user)s, %(changer)s has updated a user story on %(project)s\n"
+"See user story #%(ref)s %(subject)s at %(url)s\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-change-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Updated the US #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] US bijgewerkt#%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-create-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" New user story created
\n"
+" Hello %(user)s,
%(changer)s has created a new user story on "
+"%(project)s
\n"
+" User Story #%(ref)s %(subject)s
\n"
+" See user story\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-create-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"New user story created\n"
+"Hello %(user)s, %(changer)s has created a new user story on %(project)s\n"
+"See user story #%(ref)s %(subject)s at %(url)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-create-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Created the US #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] US aangemaakt #%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-delete-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" User Story deleted
\n"
+" Hello %(user)s,
%(changer)s has deleted a user story on "
+"%(project)s
\n"
+" User Story #%(ref)s %(subject)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-delete-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"User Story deleted\n"
+"Hello %(user)s, %(changer)s has deleted a user story on %(project)s\n"
+"User Story #%(ref)s %(subject)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/userstories/userstory-delete-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Deleted the US #%(ref)s \"%(subject)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] US verwijderd #%(ref)s \"%(subject)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-change-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Wiki Page updated
\n"
+" Hello %(user)s,
%(changer)s has updated a wiki page on "
+"%(project)s
\n"
+" Wiki page %(page)s
\n"
+" See Wiki Page\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-change-body-text.jinja:3
+#, python-format
+msgid ""
+"\n"
+"Wiki Page updated\n"
+"\n"
+"Hello %(user)s, %(changer)s has updated a wiki page on %(project)s\n"
+"\n"
+"See wiki page %(page)s at %(url)s\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-change-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Updated the Wiki Page \"%(page)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Wiki Pagina bijgewerkt \"%(page)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-create-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" New wiki page created
\n"
+" Hello %(user)s,
%(changer)s has created a new wiki page on "
+"%(project)s
\n"
+" Wiki page %(page)s
\n"
+" See "
+"wiki page\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-create-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"New wiki page created\n"
+"\n"
+"Hello %(user)s, %(changer)s has created a new wiki page on %(project)s\n"
+"\n"
+"See wiki page %(page)s at %(url)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-create-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Created the Wiki Page \"%(page)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Wiki Pagina aangemaakt \"%(page)s\"\n"
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-delete-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Wiki page deleted
\n"
+" Hello %(user)s,
%(changer)s has deleted a wiki page on "
+"%(project)s
\n"
+" Wiki page %(page)s
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-delete-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Wiki page deleted\n"
+"\n"
+"Hello %(user)s, %(changer)s has deleted a wiki page on %(project)s\n"
+"\n"
+"Wiki page %(page)s\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/projects/notifications/templates/emails/wiki/wikipage-delete-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[%(project)s] Deleted the Wiki Page \"%(page)s\"\n"
+msgstr ""
+"\n"
+"[%(project)s] Wiki Pagina verwijderd \"%(page)s\"\n"
+
+#: taiga/projects/notifications/validators.py:44
+msgid "Watchers contains invalid users"
+msgstr "Volgers bevat ongeldige gebruikers"
+
+#: taiga/projects/occ/mixins.py:35
+msgid "The version must be an integer"
+msgstr "De versie moet een integer zijn"
+
+#: taiga/projects/occ/mixins.py:58
+msgid "The version parameter is not valid"
+msgstr ""
+
+#: taiga/projects/occ/mixins.py:74
+msgid "The version doesn't match with the current one"
+msgstr "De versie stemt niet overeen met de huidige waarde"
+
+#: taiga/projects/occ/mixins.py:93
+msgid "version"
+msgstr "versie"
+
+#: taiga/projects/permissions.py:39
+msgid "You can't leave the project if there are no more owners"
+msgstr "Je kan het project niet verlaten als er geen andere eigenaars zijn"
+
+#: taiga/projects/serializers.py:233
+msgid "Email address is already taken"
+msgstr "E-mail adres is al in gebruik"
+
+#: taiga/projects/serializers.py:245
+msgid "Invalid role for the project"
+msgstr "Ongeldige rol voor project"
+
+#: taiga/projects/serializers.py:340
+msgid "Total milestones must be major or equal to zero"
+msgstr "Totaal milestones moet groter of gelijk zijn aan 0"
+
+#: taiga/projects/serializers.py:402
+msgid "Default options"
+msgstr "Standaard opties"
+
+#: taiga/projects/serializers.py:403
+msgid "User story's statuses"
+msgstr "Status van User story"
+
+#: taiga/projects/serializers.py:404
+msgid "Points"
+msgstr "Punten"
+
+#: taiga/projects/serializers.py:405
+msgid "Task's statuses"
+msgstr "Statussen van taken"
+
+#: taiga/projects/serializers.py:406
+msgid "Issue's statuses"
+msgstr "Statussen van Issues"
+
+#: taiga/projects/serializers.py:407
+msgid "Issue's types"
+msgstr "Types van issue"
+
+#: taiga/projects/serializers.py:408
+msgid "Priorities"
+msgstr "Prioriteiten"
+
+#: taiga/projects/serializers.py:409
+msgid "Severities"
+msgstr "Ernstniveaus"
+
+#: taiga/projects/serializers.py:410
+msgid "Roles"
+msgstr "Rollen"
+
+#: taiga/projects/services/stats.py:72
+msgid "Future sprint"
+msgstr "Toekomstige sprint"
+
+#: taiga/projects/services/stats.py:89
+msgid "Project End"
+msgstr "Project einde"
+
+#: taiga/projects/tasks/api.py:58 taiga/projects/tasks/api.py:61
+#: taiga/projects/tasks/api.py:64 taiga/projects/tasks/api.py:67
+msgid "You don't have permissions for add/modify this task."
+msgstr "Je hebt geen toestemming om deze taak toe te voegen/te wijzigen"
+
+#: taiga/projects/tasks/models.py:56
+msgid "us order"
+msgstr "us volgorde"
+
+#: taiga/projects/tasks/models.py:58
+msgid "taskboard order"
+msgstr "takenbord volgorde"
+
+#: taiga/projects/tasks/models.py:66
+msgid "is iocaine"
+msgstr "is iocaine"
+
+#: taiga/projects/tasks/validators.py:12
+msgid "There's no task with that id"
+msgstr "Er is geen taak met dat id"
+
+#: taiga/projects/templates/emails/membership_invitation-body-html.jinja:6
+#: taiga/projects/templates/emails/membership_invitation-body-text.jinja:4
+msgid "someone"
+msgstr "iemand"
+
+#: taiga/projects/templates/emails/membership_invitation-body-html.jinja:11
+#, python-format
+msgid ""
+"\n"
+" You have been invited to Taiga!
\n"
+"Hi! %(full_name)s has sent you an invitation to join project "
+"%(project)s in Taiga. Taiga is a Free, open Source Agile Project "
+"Management Tool.
\n"
+" "
+msgstr ""
+
+#: taiga/projects/templates/emails/membership_invitation-body-html.jinja:17
+#, python-format
+msgid ""
+"\n"
+" And now a few words from the jolly good fellow or sistren
"
+"who thought so kindly as to invite you
\n"
+" %(extra)s
\n"
+" "
+msgstr ""
+
+#: taiga/projects/templates/emails/membership_invitation-body-html.jinja:24
+msgid "Accept your invitation to Taiga"
+msgstr "Accepteer je uitnodiging tot Taiga"
+
+#: taiga/projects/templates/emails/membership_invitation-body-html.jinja:24
+msgid "Accept your invitation"
+msgstr "Accepteer je uitnodiging"
+
+#: taiga/projects/templates/emails/membership_invitation-body-html.jinja:25
+msgid "The Taiga Team"
+msgstr "Het Taiga Team"
+
+#: taiga/projects/templates/emails/membership_invitation-body-text.jinja:6
+#, python-format
+msgid ""
+"\n"
+"You, or someone you know, has invited you to Taiga\n"
+"\n"
+"Hi! %(full_name)s has sent you an invitation to join a project called "
+"%(project)s which is being managed on Taiga, a Free, open Source Agile "
+"Project Management Tool.\n"
+msgstr ""
+
+#: taiga/projects/templates/emails/membership_invitation-body-text.jinja:12
+#, python-format
+msgid ""
+"\n"
+"And now a few words from the jolly good fellow or sistren who thought so "
+"kindly as to invite you:\n"
+"\n"
+"%(extra)s\n"
+" "
+msgstr ""
+"\n"
+"En nu enkele woorden van de blije broeder of zuster die zo vriendelijk was "
+"om je uit te nodigen:\n"
+"\n"
+"%(extra)s\n"
+" "
+
+#: taiga/projects/templates/emails/membership_invitation-body-text.jinja:18
+msgid "Accept your invitation to Taiga following this link:"
+msgstr "Accepteer je uitnodiging tot Taiga via onderstaande link:"
+
+#: taiga/projects/templates/emails/membership_invitation-body-text.jinja:20
+msgid ""
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+"\n"
+"---\n"
+"Het Taiga Team\n"
+
+#: taiga/projects/templates/emails/membership_invitation-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[Taiga] Invitation to join to the project '%(project)s'\n"
+msgstr ""
+"\n"
+"[Taiga] Uitnodiging om toe te treden tot project '%(project)s'\n"
+
+#: taiga/projects/templates/emails/membership_notification-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" You have been added to a project
\n"
+" Hello %(full_name)s,
you have been added to the project "
+"%(project)s
\n"
+" Go to "
+"project\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/projects/templates/emails/membership_notification-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"You have been added to a project\n"
+"Hello %(full_name)s,you have been added to the project %(project)s\n"
+"\n"
+"See project at %(url)s\n"
+msgstr ""
+
+#: taiga/projects/templates/emails/membership_notification-subject.jinja:1
+#, python-format
+msgid ""
+"\n"
+"[Taiga] Added to the project '%(project)s'\n"
+msgstr ""
+"\n"
+"[Taiga] Toegevoegd aan het project '%(project)s'\n"
+
+#. Translators: Name of scrum project template.
+#: taiga/projects/translations.py:28
+msgid "Scrum"
+msgstr "Scrum"
+
+#. Translators: Description of scrum project template.
+#: taiga/projects/translations.py:30
+msgid ""
+"The agile product backlog in Scrum is a prioritized features list, "
+"containing short descriptions of all functionality desired in the product. "
+"When applying Scrum, it's not necessary to start a project with a lengthy, "
+"upfront effort to document all requirements. The Scrum product backlog is "
+"then allowed to grow and change as more is learned about the product and its "
+"customers"
+msgstr ""
+"De agile product backlog in Scrum is een geprioritiseerde lijst van "
+"features, het bevat korte omschrijvingen van alle functionaliteit die men "
+"verwacht van het product. Bij het toepassen van Scrum is het niet nodig om "
+"een project te starten waar op voorhand grote moeite gedaan werd om alle "
+"requirements te documenteren. De Scrum product backlog kan op die manier "
+"groeien en veranderen naarmate men meer leert over het product en de "
+"gebruikers"
+
+#. Translators: Name of kanban project template.
+#: taiga/projects/translations.py:33
+msgid "Kanban"
+msgstr "Kanban"
+
+#. Translators: Description of kanban project template.
+#: taiga/projects/translations.py:35
+msgid ""
+"Kanban is a method for managing knowledge work with an emphasis on just-in-"
+"time delivery while not overloading the team members. In this approach, the "
+"process, from definition of a task to its delivery to the customer, is "
+"displayed for participants to see and team members pull work from a queue."
+msgstr ""
+"Kanban is een methode om kenniswerk te beheren met een nadruk om just-in-"
+"time aflevering terwijl we toch de teamleden niet willen overladen. Via deze "
+"benadering wordt het werk door teamleden van een queue afgehaald, van "
+"definitie tot taak tot het afleveren naar de klant."
+
+#. Translators: User story point value (value = undefined)
+#: taiga/projects/translations.py:43
+msgid "?"
+msgstr "?"
+
+#. Translators: User story point value (value = 0)
+#: taiga/projects/translations.py:45
+msgid "0"
+msgstr "0"
+
+#. Translators: User story point value (value = 0.5)
+#: taiga/projects/translations.py:47
+msgid "1/2"
+msgstr "1/2"
+
+#. Translators: User story point value (value = 1)
+#: taiga/projects/translations.py:49
+msgid "1"
+msgstr "1"
+
+#. Translators: User story point value (value = 2)
+#: taiga/projects/translations.py:51
+msgid "2"
+msgstr "2"
+
+#. Translators: User story point value (value = 3)
+#: taiga/projects/translations.py:53
+msgid "3"
+msgstr "3"
+
+#. Translators: User story point value (value = 5)
+#: taiga/projects/translations.py:55
+msgid "5"
+msgstr "5"
+
+#. Translators: User story point value (value = 8)
+#: taiga/projects/translations.py:57
+msgid "8"
+msgstr "8"
+
+#. Translators: User story point value (value = 10)
+#: taiga/projects/translations.py:59
+msgid "10"
+msgstr "10"
+
+#. Translators: User story point value (value = 13)
+#: taiga/projects/translations.py:61
+msgid "13"
+msgstr "13"
+
+#. Translators: User story point value (value = 20)
+#: taiga/projects/translations.py:63
+msgid "20"
+msgstr "20"
+
+#. Translators: User story point value (value = 40)
+#: taiga/projects/translations.py:65
+msgid "40"
+msgstr "40"
+
+#. Translators: User story status
+#. Translators: Task status
+#. Translators: Issue status
+#: taiga/projects/translations.py:73 taiga/projects/translations.py:96
+#: taiga/projects/translations.py:112
+msgid "New"
+msgstr "Nieuw"
+
+#. Translators: User story status
+#: taiga/projects/translations.py:76
+msgid "Ready"
+msgstr "Klaar"
+
+#. Translators: User story status
+#. Translators: Task status
+#. Translators: Issue status
+#: taiga/projects/translations.py:79 taiga/projects/translations.py:98
+#: taiga/projects/translations.py:114
+msgid "In progress"
+msgstr "Lopende"
+
+#. Translators: User story status
+#. Translators: Task status
+#. Translators: Issue status
+#: taiga/projects/translations.py:82 taiga/projects/translations.py:100
+#: taiga/projects/translations.py:116
+msgid "Ready for test"
+msgstr "Klaar om te testen"
+
+#. Translators: User story status
+#: taiga/projects/translations.py:85
+msgid "Done"
+msgstr "Afgewerkt"
+
+#. Translators: User story status
+#: taiga/projects/translations.py:88
+msgid "Archived"
+msgstr "Gearchiveerd"
+
+#. Translators: Task status
+#. Translators: Issue status
+#: taiga/projects/translations.py:102 taiga/projects/translations.py:118
+msgid "Closed"
+msgstr "Gesloten"
+
+#. Translators: Task status
+#. Translators: Issue status
+#: taiga/projects/translations.py:104 taiga/projects/translations.py:120
+msgid "Needs Info"
+msgstr "Info nodig"
+
+#. Translators: Issue status
+#: taiga/projects/translations.py:122
+msgid "Postponed"
+msgstr "Verzet naar later"
+
+#. Translators: Issue status
+#: taiga/projects/translations.py:124
+msgid "Rejected"
+msgstr "Geweigerd"
+
+#. Translators: Issue type
+#: taiga/projects/translations.py:132
+msgid "Bug"
+msgstr "Bug"
+
+#. Translators: Issue type
+#: taiga/projects/translations.py:134
+msgid "Question"
+msgstr "Vraag"
+
+#. Translators: Issue type
+#: taiga/projects/translations.py:136
+msgid "Enhancement"
+msgstr "Verbetering"
+
+#. Translators: Issue priority
+#: taiga/projects/translations.py:144
+msgid "Low"
+msgstr "Laag"
+
+#. Translators: Issue priority
+#. Translators: Issue severity
+#: taiga/projects/translations.py:146 taiga/projects/translations.py:159
+msgid "Normal"
+msgstr "Normaal"
+
+#. Translators: Issue priority
+#: taiga/projects/translations.py:148
+msgid "High"
+msgstr "Hoog"
+
+#. Translators: Issue severity
+#: taiga/projects/translations.py:155
+msgid "Wishlist"
+msgstr "Wensenlijst"
+
+#. Translators: Issue severity
+#: taiga/projects/translations.py:157
+msgid "Minor"
+msgstr "Mineur"
+
+#. Translators: Issue severity
+#: taiga/projects/translations.py:161
+msgid "Important"
+msgstr "Belangrijk"
+
+#. Translators: Issue severity
+#: taiga/projects/translations.py:163
+msgid "Critical"
+msgstr "Kritiek"
+
+#. Translators: User role
+#: taiga/projects/translations.py:170
+msgid "UX"
+msgstr "UX"
+
+#. Translators: User role
+#: taiga/projects/translations.py:172
+msgid "Design"
+msgstr "Design"
+
+#. Translators: User role
+#: taiga/projects/translations.py:174
+msgid "Front"
+msgstr "Front"
+
+#. Translators: User role
+#: taiga/projects/translations.py:176
+msgid "Back"
+msgstr "Back"
+
+#. Translators: User role
+#: taiga/projects/translations.py:178
+msgid "Product Owner"
+msgstr "Product Owner"
+
+#. Translators: User role
+#: taiga/projects/translations.py:180
+msgid "Stakeholder"
+msgstr "Stakeholder"
+
+#: taiga/projects/userstories/api.py:174
+#, python-brace-format
+msgid ""
+"Generating the user story [US #{ref} - {subject}](:us:{ref} \"US #{ref} - "
+"{subject}\")"
+msgstr ""
+"User story wordt gegenereerd [US #{ref} - {subject}](:us:{ref} \"US #{ref} - "
+"{subject}\")"
+
+#: taiga/projects/userstories/models.py:37
+msgid "role"
+msgstr "rol"
+
+#: taiga/projects/userstories/models.py:75
+msgid "backlog order"
+msgstr "backlog volgorde"
+
+#: taiga/projects/userstories/models.py:77
+#: taiga/projects/userstories/models.py:79
+msgid "sprint order"
+msgstr "sprint volgorde"
+
+#: taiga/projects/userstories/models.py:87
+msgid "finish date"
+msgstr "afwerkdatum"
+
+#: taiga/projects/userstories/models.py:95
+msgid "is client requirement"
+msgstr "is requirement van de klant"
+
+#: taiga/projects/userstories/models.py:97
+msgid "is team requirement"
+msgstr "is requirement van het team"
+
+#: taiga/projects/userstories/models.py:102
+msgid "generated from issue"
+msgstr "gegenereerd van issue"
+
+#: taiga/projects/userstories/validators.py:28
+msgid "There's no user story with that id"
+msgstr "Er is geen user story met dat id"
+
+#: taiga/projects/validators.py:28
+msgid "There's no project with that id"
+msgstr "Er is geen project met dat is"
+
+#: taiga/projects/validators.py:37
+msgid "There's no user story status with that id"
+msgstr "Er is geen user story status met dat id"
+
+#: taiga/projects/validators.py:46
+msgid "There's no task status with that id"
+msgstr "Er is geen taak status met dat id"
+
+#: taiga/projects/votes/models.py:31 taiga/projects/votes/models.py:32
+#: taiga/projects/votes/models.py:54
+msgid "Votes"
+msgstr "Stemmen"
+
+#: taiga/projects/votes/models.py:50
+msgid "votes"
+msgstr "stemmen"
+
+#: taiga/projects/votes/models.py:53
+msgid "Vote"
+msgstr "Stem"
+
+#: taiga/projects/wiki/api.py:60
+msgid "'content' parameter is mandatory"
+msgstr "'inhoud' parameter is verplicht"
+
+#: taiga/projects/wiki/api.py:63
+msgid "'project_id' parameter is mandatory"
+msgstr "'project_id' parameter is verplicht"
+
+#: taiga/projects/wiki/models.py:36
+msgid "last modifier"
+msgstr "gebruiker met laatste wijziging"
+
+#: taiga/projects/wiki/models.py:69
+msgid "href"
+msgstr "href"
+
+#: taiga/users/admin.py:50
+msgid "Personal info"
+msgstr "Persoonlijke info"
+
+#: taiga/users/admin.py:52
+msgid "Permissions"
+msgstr "Toestemmingen"
+
+#: taiga/users/admin.py:53
+msgid "Important dates"
+msgstr "Belangrijke data"
+
+#: taiga/users/api.py:124 taiga/users/api.py:131
+msgid "Invalid username or email"
+msgstr "Ongeldige gebruikersnaam of e-mail"
+
+#: taiga/users/api.py:140
+msgid "Mail sended successful!"
+msgstr "Mail met succes verzonden!"
+
+#: taiga/users/api.py:152 taiga/users/api.py:157
+msgid "Token is invalid"
+msgstr "Token is ongeldig"
+
+#: taiga/users/api.py:178
+msgid "Current password parameter needed"
+msgstr "Huidig wachtwoord parameter vereist"
+
+#: taiga/users/api.py:181
+msgid "New password parameter needed"
+msgstr "Nieuw wachtwoord parameter vereist"
+
+#: taiga/users/api.py:184
+msgid "Invalid password length at least 6 charaters needed"
+msgstr "Ongeldige lengte van wachtwoord, minstens 6 tekens vereist"
+
+#: taiga/users/api.py:187
+msgid "Invalid current password"
+msgstr "Ongeldig huidig wachtwoord"
+
+#: taiga/users/api.py:203
+msgid "Incomplete arguments"
+msgstr "Onvolledige argumenten"
+
+#: taiga/users/api.py:208
+msgid "Invalid image format"
+msgstr "Ongeldig afbeelding formaat"
+
+#: taiga/users/api.py:261
+msgid "Duplicated email"
+msgstr "Gedupliceerde e-mail"
+
+#: taiga/users/api.py:263
+msgid "Not valid email"
+msgstr "Ongeldige e-mail"
+
+#: taiga/users/api.py:283 taiga/users/api.py:289
+msgid ""
+"Invalid, are you sure the token is correct and you didn't use it before?"
+msgstr "Ongeldig, weet je zeker dat het token correct en ongebruikt is?"
+
+#: taiga/users/api.py:316 taiga/users/api.py:324 taiga/users/api.py:327
+msgid "Invalid, are you sure the token is correct?"
+msgstr "Ongeldig, weet je zeker dat het token correct is?"
+
+#: taiga/users/models.py:69
+msgid "superuser status"
+msgstr "superuser status"
+
+#: taiga/users/models.py:70
+msgid ""
+"Designates that this user has all permissions without explicitly assigning "
+"them."
+msgstr ""
+"Beduidt dat deze gebruik alle toestemmingen heeft zonder deze expliciet toe "
+"te wijzen."
+
+#: taiga/users/models.py:100
+msgid "username"
+msgstr "gebruikersnaam"
+
+#: taiga/users/models.py:101
+msgid ""
+"Required. 30 characters or fewer. Letters, numbers and /./-/_ characters"
+msgstr "Vereist. 30 of minder karakters. Letters, nummers en /./-/_ karakters"
+
+#: taiga/users/models.py:104
+msgid "Enter a valid username."
+msgstr "Geef een geldige gebruikersnaam in"
+
+#: taiga/users/models.py:107
+msgid "active"
+msgstr "actief"
+
+#: taiga/users/models.py:108
+msgid ""
+"Designates whether this user should be treated as active. Unselect this "
+"instead of deleting accounts."
+msgstr ""
+"Beduidt of deze gebruiker als actief moet behandeld worden. Deselecteer dit "
+"i.p.v. accounts te verwijderen."
+
+#: taiga/users/models.py:114
+msgid "biography"
+msgstr "biografie"
+
+#: taiga/users/models.py:117
+msgid "photo"
+msgstr "foto"
+
+#: taiga/users/models.py:118
+msgid "date joined"
+msgstr "toetrededatum"
+
+#: taiga/users/models.py:120
+msgid "default language"
+msgstr "standaard taal"
+
+#: taiga/users/models.py:122
+msgid "default theme"
+msgstr ""
+
+#: taiga/users/models.py:124
+msgid "default timezone"
+msgstr "standaard tijdzone"
+
+#: taiga/users/models.py:126
+msgid "colorize tags"
+msgstr "kleur tags"
+
+#: taiga/users/models.py:131
+msgid "email token"
+msgstr "e-mail token"
+
+#: taiga/users/models.py:133
+msgid "new email address"
+msgstr "nieuw e-mail adres"
+
+#: taiga/users/models.py:188
+msgid "permissions"
+msgstr "toestemmingen"
+
+#: taiga/users/serializers.py:59
+msgid "invalid"
+msgstr "ongeldig"
+
+#: taiga/users/serializers.py:70
+msgid "Invalid username. Try with a different one."
+msgstr "Ongeldige gebruikersnaam. Probeer met een andere."
+
+#: taiga/users/services.py:48 taiga/users/services.py:52
+msgid "Username or password does not matches user."
+msgstr "Gebruikersnaam of wachtwoord stemt niet overeen met gebruiker."
+
+#: taiga/users/templates/emails/change_email-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Change your email
\n"
+" Hello %(full_name)s,
please confirm your email
\n"
+" Confirm "
+"email\n"
+" You can ignore this message if you did not request.
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/users/templates/emails/change_email-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Hello %(full_name)s, please confirm your email\n"
+"\n"
+"%(url)s\n"
+"\n"
+"You can ignore this message if you did not request.\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/users/templates/emails/change_email-subject.jinja:1
+msgid "[Taiga] Change email"
+msgstr "[Taiga] Verander e-mail"
+
+#: taiga/users/templates/emails/password_recovery-body-html.jinja:4
+#, python-format
+msgid ""
+"\n"
+" Recover your password
\n"
+" Hello %(full_name)s,
you asked to recover your password
\n"
+" Recover your password\n"
+" You can ignore this message if you did not request.
\n"
+" The Taiga Team
\n"
+" "
+msgstr ""
+
+#: taiga/users/templates/emails/password_recovery-body-text.jinja:1
+#, python-format
+msgid ""
+"\n"
+"Hello %(full_name)s, you asked to recover your password\n"
+"\n"
+"%(url)s\n"
+"\n"
+"You can ignore this message if you did not request.\n"
+"\n"
+"---\n"
+"The Taiga Team\n"
+msgstr ""
+
+#: taiga/users/templates/emails/password_recovery-subject.jinja:1
+msgid "[Taiga] Password recovery"
+msgstr "[Taiga] Wachtwoord recuperatie"
+
+#: taiga/users/templates/emails/registered_user-body-html.jinja:6
+msgid ""
+"\n"
+" \n"
+" Thank you for registering in Taiga\n"
+" We hope you enjoy it\n"
+" We built Taiga because we wanted the project management tool "
+"that sits open on our computers all day long, to serve as a continued "
+"reminder of why we love to collaborate, code and design. \n"
+" We built it to be beautiful, elegant, simple to use and fun - "
+"without forsaking flexibility and power. \n"
+" The taiga Team\n"
+" | \n"
+" "
+msgstr ""
+
+#: taiga/users/templates/emails/registered_user-body-html.jinja:23
+#, python-format
+msgid ""
+"\n"
+" You may remove your account from this service clicking "
+"here\n"
+" "
+msgstr ""
+
+#: taiga/users/templates/emails/registered_user-body-text.jinja:1
+msgid ""
+"\n"
+"Thank you for registering in Taiga\n"
+"\n"
+"We hope you enjoy it\n"
+"\n"
+"We built Taiga because we wanted the project management tool that sits open "
+"on our computers all day long, to serve as a continued reminder of why we "
+"love to collaborate, code and design.\n"
+"\n"
+"We built it to be beautiful, elegant, simple to use and fun - without "
+"forsaking flexibility and power.\n"
+"\n"
+"--\n"
+"The taiga Team\n"
+msgstr ""
+
+#: taiga/users/templates/emails/registered_user-body-text.jinja:13
+#, python-format
+msgid ""
+"\n"
+"You may remove your account from this service: %(url)s\n"
+msgstr ""
+"\n"
+"Je mag je acccount verwijderen van deze service: %(url)s\n"
+
+#: taiga/users/templates/emails/registered_user-subject.jinja:1
+msgid "You've been Taigatized!"
+msgstr "Je bent getaiganiseerd!"
+
+#: taiga/users/validators.py:29
+msgid "There's no role with that id"
+msgstr "Er is geen rol met dat id"
+
+#: taiga/userstorage/api.py:50
+msgid ""
+"Duplicate key value violates unique constraint. Key '{}' already exists."
+msgstr ""
+"Gedupliceerde key value overtreed unieke constraint. Key '{}' bestaat al."
+
+#: taiga/userstorage/models.py:30
+msgid "key"
+msgstr "key"
+
+#: taiga/webhooks/models.py:28 taiga/webhooks/models.py:38
+msgid "URL"
+msgstr "URL"
+
+#: taiga/webhooks/models.py:29
+msgid "secret key"
+msgstr "geheime sleutel"
+
+#: taiga/webhooks/models.py:39
+msgid "status code"
+msgstr "status code"
+
+#: taiga/webhooks/models.py:40
+msgid "request data"
+msgstr "request data"
+
+#: taiga/webhooks/models.py:41
+msgid "request headers"
+msgstr "request headers"
+
+#: taiga/webhooks/models.py:42
+msgid "response data"
+msgstr "response data"
+
+#: taiga/webhooks/models.py:43
+msgid "response headers"
+msgstr "response headers"
+
+#: taiga/webhooks/models.py:44
+msgid "duration"
+msgstr "duur"
diff --git a/taiga/locale/zh-Hant/LC_MESSAGES/django.po b/taiga/locale/zh-Hant/LC_MESSAGES/django.po
index 39db28aa..0969028b 100644
--- a/taiga/locale/zh-Hant/LC_MESSAGES/django.po
+++ b/taiga/locale/zh-Hant/LC_MESSAGES/django.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: taiga-back\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-06-09 09:47+0200\n"
+"POT-Creation-Date: 2015-06-15 12:34+0200\n"
"PO-Revision-Date: 2015-06-09 07:47+0000\n"
"Last-Translator: Taiga Dev Team \n"
"Language-Team: Chinese Traditional (http://www.transifex.com/projects/p/"
@@ -2946,7 +2946,7 @@ msgstr "產品所有人"
msgid "Stakeholder"
msgstr "利害關係人"
-#: taiga/projects/userstories/api.py:173
+#: taiga/projects/userstories/api.py:174
#, python-brace-format
msgid ""
"Generating the user story [US #{ref} - {subject}](:us:{ref} \"US #{ref} - "
diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py
index cedb54f2..553bee2c 100644
--- a/taiga/projects/serializers.py
+++ b/taiga/projects/serializers.py
@@ -98,6 +98,7 @@ class BasicUserStoryStatusSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserStoryStatus
+ i18n_fields = ("name",)
fields = ("name", "color")
@@ -128,6 +129,7 @@ class BasicTaskStatusSerializerSerializer(serializers.ModelSerializer):
class Meta:
model = models.TaskStatus
+ i18n_fields = ("name",)
fields = ("name", "color")
@@ -170,6 +172,7 @@ class BasicIssueStatusSerializer(serializers.ModelSerializer):
class Meta:
model = models.IssueStatus
+ i18n_fields = ("name",)
fields = ("name", "color")
@@ -273,6 +276,7 @@ class ProjectMembershipSerializer(serializers.ModelSerializer):
full_name = serializers.CharField(source='user.get_full_name', required=False)
username = serializers.CharField(source='user.username', required=False)
color = serializers.CharField(source='user.color', required=False)
+ is_active = serializers.BooleanField(source='user.is_active', required=False)
photo = serializers.SerializerMethodField("get_photo")
class Meta:
diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py
index 1ad8dc87..3978381e 100644
--- a/taiga/projects/userstories/serializers.py
+++ b/taiga/projects/userstories/serializers.py
@@ -26,7 +26,7 @@ from taiga.projects.validators import ProjectExistsValidator
from taiga.projects.validators import UserStoryStatusExistsValidator
from taiga.projects.userstories.validators import UserStoryExistsValidator
from taiga.projects.notifications.validators import WatchersValidator
-from taiga.projects.serializers import UserStoryStatusSerializer
+from taiga.projects.serializers import BasicUserStoryStatusSerializer
from taiga.users.serializers import BasicInfoSerializer as UserBasicInfoSerializer
from . import models
@@ -53,7 +53,7 @@ class UserStorySerializer(WatchersValidator, serializers.ModelSerializer):
origin_issue = serializers.SerializerMethodField("get_origin_issue")
blocked_note_html = serializers.SerializerMethodField("get_blocked_note_html")
description_html = serializers.SerializerMethodField("get_description_html")
- status_extra_info = UserStoryStatusSerializer(source="status", required=False, read_only=True)
+ status_extra_info = BasicUserStoryStatusSerializer(source="status", required=False, read_only=True)
assigned_to_extra_info = UserBasicInfoSerializer(source="assigned_to", required=False, read_only=True)
class Meta:
diff --git a/taiga/timeline/apps.py b/taiga/timeline/apps.py
index f7790905..cbdea045 100644
--- a/taiga/timeline/apps.py
+++ b/taiga/timeline/apps.py
@@ -32,3 +32,5 @@ class TimelineAppConfig(AppConfig):
sender=apps.get_model("projects", "Membership"))
signals.post_delete.connect(handlers.delete_membership_push_to_timeline,
sender=apps.get_model("projects", "Membership"))
+ signals.post_save.connect(handlers.create_user_push_to_timeline,
+ sender=apps.get_model("users", "User"))
diff --git a/taiga/timeline/management/commands/clear_unnecessary_new_membership_entries.py b/taiga/timeline/management/commands/clear_unnecessary_new_membership_entries.py
new file mode 100644
index 00000000..f9b65dcf
--- /dev/null
+++ b/taiga/timeline/management/commands/clear_unnecessary_new_membership_entries.py
@@ -0,0 +1,36 @@
+# Copyright (C) 2014 Andrey Antukh
+# Copyright (C) 2014 Jesús Espino
+# Copyright (C) 2014 David Barragán
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+from django.conf import settings
+from django.core.management.base import BaseCommand
+
+from taiga.timeline.models import Timeline
+from taiga.projects.models import Project
+
+class Command(BaseCommand):
+ help = 'Regenerate unnecessary new memberships entry lines'
+ def handle(self, *args, **options):
+ debug_enabled = settings.DEBUG
+ if debug_enabled:
+ print("Please, execute this script only with DEBUG mode disabled (DEBUG=False)")
+ return
+
+ removing_timeline_ids = []
+ for t in Timeline.objects.filter(event_type="projects.membership.create").order_by("created"):
+ print(t.created)
+ if t.project.owner.id == t.data["user"].get("id", None):
+ removing_timeline_ids.append(t.id)
+
+ Timeline.objects.filter(id__in=removing_timeline_ids).delete()
diff --git a/taiga/timeline/management/commands/rebuild_timeline.py b/taiga/timeline/management/commands/rebuild_timeline.py
index c5864610..283c7080 100644
--- a/taiga/timeline/management/commands/rebuild_timeline.py
+++ b/taiga/timeline/management/commands/rebuild_timeline.py
@@ -46,13 +46,16 @@ class BulkCreator(object):
self.timeline_objects = []
self.created = None
- def createElement(self, element):
+ def create_element(self, element):
self.timeline_objects.append(element)
if len(self.timeline_objects) > 1000:
- Timeline.objects.bulk_create(self.timeline_objects, batch_size=1000)
- del self.timeline_objects
- self.timeline_objects = []
- gc.collect()
+ self.flush()
+
+ def flush(self):
+ Timeline.objects.bulk_create(self.timeline_objects, batch_size=1000)
+ del self.timeline_objects
+ self.timeline_objects = []
+ gc.collect()
bulk_creator = BulkCreator()
@@ -63,7 +66,7 @@ def custom_add_to_object_timeline(obj:object, instance:object, event_type:str, n
event_type_key = _get_impl_key_from_model(instance.__class__, event_type)
impl = _timeline_impl_map.get(event_type_key, None)
- bulk_creator.createElement(Timeline(
+ bulk_creator.create_element(Timeline(
content_object=obj,
namespace=namespace,
event_type=event_type_key,
@@ -74,13 +77,15 @@ def custom_add_to_object_timeline(obj:object, instance:object, event_type:str, n
))
-def generate_timeline(initial_date, final_date):
- if initial_date or final_date:
+def generate_timeline(initial_date, final_date, project_id):
+ if initial_date or final_date or project_id:
timelines = Timeline.objects.all()
if initial_date:
timelines = timelines.filter(created__gte=initial_date)
if final_date:
timelines = timelines.filter(created__lt=final_date)
+ if project_id:
+ timelines = timelines.filter(project__id=project_id)
timelines.delete()
@@ -97,6 +102,22 @@ def generate_timeline(initial_date, final_date):
projects = projects.filter(created_date__lt=final_date)
history_entries = history_entries.filter(created_at__lt=final_date)
+ if project_id:
+ project = Project.objects.get(id=project_id)
+ us_keys = ['userstories.userstory:%s'%(id) for id in project.user_stories.values_list("id", flat=True)]
+ tasks_keys = ['tasks.task:%s'%(id) for id in project.tasks.values_list("id", flat=True)]
+ issue_keys = ['issues.issue:%s'%(id) for id in project.issues.values_list("id", flat=True)]
+ wiki_keys = ['wiki.wikipage:%s'%(id) for id in project.wiki_pages.values_list("id", flat=True)]
+ keys = us_keys + tasks_keys + issue_keys + wiki_keys
+
+ projects = projects.filter(id=project_id)
+ history_entries = history_entries.filter(key__in=keys)
+
+ #Memberships
+ for membership in project.memberships.exclude(user=None).exclude(user=project.owner):
+ bulk_creator.created = membership.created_at
+ _push_to_timelines(project, membership.user, membership, "create")
+
for project in projects.iterator():
bulk_creator.created = project.created_date
print("Project:", bulk_creator.created)
@@ -115,6 +136,8 @@ def generate_timeline(initial_date, final_date):
except ObjectDoesNotExist as e:
print("Ignoring")
+ bulk_creator.flush()
+
class Command(BaseCommand):
help = 'Regenerate project timeline'
@@ -136,6 +159,12 @@ class Command(BaseCommand):
dest='final_date',
default=None,
help='Final date for timeline generation'),
+ ) + (
+ make_option('--project',
+ action='store',
+ dest='project',
+ default=None,
+ help='Selected project id for timeline generation'),
)
@@ -148,4 +177,4 @@ class Command(BaseCommand):
if options["purge"] == True:
Timeline.objects.all().delete()
- generate_timeline(options["initial_date"], options["final_date"])
+ generate_timeline(options["initial_date"], options["final_date"], options["project"])
diff --git a/taiga/timeline/management/commands/rebuild_timeline_for_user_creation.py b/taiga/timeline/management/commands/rebuild_timeline_for_user_creation.py
new file mode 100644
index 00000000..d4f99ed5
--- /dev/null
+++ b/taiga/timeline/management/commands/rebuild_timeline_for_user_creation.py
@@ -0,0 +1,98 @@
+# Copyright (C) 2014 Andrey Antukh
+# Copyright (C) 2014 Jesús Espino
+# Copyright (C) 2014 David Barragán
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+# Examples:
+# python manage.py rebuild_timeline_for_user_creation --settings=settings.local_timeline
+
+from django.conf import settings
+from django.contrib.contenttypes.models import ContentType
+from django.core.exceptions import ObjectDoesNotExist
+from django.core.management.base import BaseCommand
+from django.db.models import Model
+from django.db import reset_queries
+
+from taiga.timeline.service import (_get_impl_key_from_model,
+ _timeline_impl_map, extract_user_info)
+from taiga.timeline.models import Timeline
+from taiga.timeline.signals import _push_to_timelines
+from taiga.users.models import User
+
+from unittest.mock import patch
+
+import gc
+
+class BulkCreator(object):
+ def __init__(self):
+ self.timeline_objects = []
+ self.created = None
+
+ def create_element(self, element):
+ self.timeline_objects.append(element)
+ if len(self.timeline_objects) > 1000:
+ self.flush()
+
+ def flush(self):
+ Timeline.objects.bulk_create(self.timeline_objects, batch_size=1000)
+ del self.timeline_objects
+ self.timeline_objects = []
+ gc.collect()
+
+bulk_creator = BulkCreator()
+
+
+def custom_add_to_object_timeline(obj:object, instance:object, event_type:str, namespace:str="default", extra_data:dict={}):
+ assert isinstance(obj, Model), "obj must be a instance of Model"
+ assert isinstance(instance, Model), "instance must be a instance of Model"
+ event_type_key = _get_impl_key_from_model(instance.__class__, event_type)
+ impl = _timeline_impl_map.get(event_type_key, None)
+
+ bulk_creator.create_element(Timeline(
+ content_object=obj,
+ namespace=namespace,
+ event_type=event_type_key,
+ project=None,
+ data=impl(instance, extra_data=extra_data),
+ data_content_type = ContentType.objects.get_for_model(instance.__class__),
+ created = bulk_creator.created,
+ ))
+
+
+def generate_timeline():
+ with patch('taiga.timeline.service._add_to_object_timeline', new=custom_add_to_object_timeline):
+ # Users api wasn't a HistoryResourceMixin so we can't interate on the HistoryEntries in this case
+ users = User.objects.order_by("date_joined")
+ for user in users.iterator():
+ bulk_creator.created = user.date_joined
+ print("User:", user.date_joined)
+ extra_data = {
+ "values_diff": {},
+ "user": extract_user_info(user),
+ }
+ _push_to_timelines(None, user, user, "create", extra_data=extra_data)
+ del extra_data
+
+ bulk_creator.flush()
+
+class Command(BaseCommand):
+ help = 'Regenerate project timeline'
+
+ def handle(self, *args, **options):
+ debug_enabled = settings.DEBUG
+ if debug_enabled:
+ print("Please, execute this script only with DEBUG mode disabled (DEBUG=False)")
+ return
+
+ generate_timeline()
diff --git a/taiga/timeline/migrations/0004_auto_20150603_1312.py b/taiga/timeline/migrations/0004_auto_20150603_1312.py
new file mode 100644
index 00000000..5764b682
--- /dev/null
+++ b/taiga/timeline/migrations/0004_auto_20150603_1312.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('timeline', '0003_auto_20150410_0829'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='timeline',
+ name='project',
+ field=models.ForeignKey(null=True, to='projects.Project'),
+ preserve_default=True,
+ ),
+ ]
diff --git a/taiga/timeline/models.py b/taiga/timeline/models.py
index 5a070c49..ac181842 100644
--- a/taiga/timeline/models.py
+++ b/taiga/timeline/models.py
@@ -31,7 +31,7 @@ class Timeline(models.Model):
content_object = GenericForeignKey('content_type', 'object_id')
namespace = models.CharField(max_length=250, default="default", db_index=True)
event_type = models.CharField(max_length=250, db_index=True)
- project = models.ForeignKey(Project)
+ project = models.ForeignKey(Project, null=True)
data = JsonField()
data_content_type = models.ForeignKey(ContentType, related_name="data_timelines")
created = models.DateTimeField(default=timezone.now)
diff --git a/taiga/timeline/serializers.py b/taiga/timeline/serializers.py
index 20a266df..903dc00d 100644
--- a/taiga/timeline/serializers.py
+++ b/taiga/timeline/serializers.py
@@ -43,6 +43,7 @@ class TimelineDataJsonField(serializers.WritableField):
"photo": get_photo_or_gravatar_url(user),
"big_photo": get_big_photo_or_gravatar_url(user),
"username": user.username,
+ "date_joined": user.date_joined,
}
except User.DoesNotExist:
pass
diff --git a/taiga/timeline/service.py b/taiga/timeline/service.py
index 96567739..5317942f 100644
--- a/taiga/timeline/service.py
+++ b/taiga/timeline/service.py
@@ -57,11 +57,15 @@ def _add_to_object_timeline(obj:object, instance:object, event_type:str, namespa
event_type_key = _get_impl_key_from_model(instance.__class__, event_type)
impl = _timeline_impl_map.get(event_type_key, None)
+ project = None
+ if hasattr(instance, "project"):
+ project = instance.project
+
Timeline.objects.create(
content_object=obj,
namespace=namespace,
event_type=event_type_key,
- project=instance.project,
+ project=project,
data=impl(instance, extra_data=extra_data),
data_content_type = ContentType.objects.get_for_model(instance.__class__),
)
@@ -96,8 +100,8 @@ def get_timeline(obj, namespace=None):
def filter_timeline_for_user(timeline, user):
- # Filtering public projects
- tl_filter = Q(project__is_private=False)
+ # Filtering entities from public projects or entities without project
+ tl_filter = Q(project__is_private=False) | Q(project=None)
# Filtering private project with some public parts
content_types = {
@@ -115,6 +119,10 @@ def filter_timeline_for_user(timeline, user):
project__anon_permissions__contains=[content_type_key],
data_content_type=content_type)
+ # There is no specific permission for seeing new memberships
+ membership_content_type = ContentType.objects.get(app_label="projects", model="membership")
+ tl_filter |= Q(project__is_private=True, data_content_type=membership_content_type)
+
# Filtering private projects where user is member
if not user.is_anonymous():
membership_model = apps.get_model('projects', 'Membership')
diff --git a/taiga/timeline/signals.py b/taiga/timeline/signals.py
index a90ce867..03d8b9f5 100644
--- a/taiga/timeline/signals.py
+++ b/taiga/timeline/signals.py
@@ -34,10 +34,11 @@ def _push_to_timeline(*args, **kwargs):
def _push_to_timelines(project, user, obj, event_type, extra_data={}):
+ if project is not None:
# Project timeline
- _push_to_timeline(project, obj, event_type,
- namespace=build_project_namespace(project),
- extra_data=extra_data)
+ _push_to_timeline(project, obj, event_type,
+ namespace=build_project_namespace(project),
+ extra_data=extra_data)
# User timeline
_push_to_timeline(user, obj, event_type,
@@ -56,18 +57,18 @@ def _push_to_timelines(project, user, obj, event_type, extra_data={}):
if watchers:
related_people |= watchers
- # Team
- team_members_ids = project.memberships.filter(user__isnull=False).values_list("id", flat=True)
- team = User.objects.filter(id__in=team_members_ids)
- related_people |= team
+ if project is not None:
+ # Team
+ team_members_ids = project.memberships.filter(user__isnull=False).values_list("id", flat=True)
+ team = User.objects.filter(id__in=team_members_ids)
+ related_people |= team
+ related_people = related_people.distinct()
- related_people = related_people.distinct()
+ _push_to_timeline(related_people, obj, event_type,
+ namespace=build_user_namespace(user),
+ extra_data=extra_data)
- _push_to_timeline(related_people, obj, event_type,
- namespace=build_user_namespace(user),
- extra_data=extra_data)
-
- #Related people: team members
+ #Related people: team members
def on_new_history_entry(sender, instance, created, **kwargs):
@@ -98,12 +99,18 @@ def on_new_history_entry(sender, instance, created, **kwargs):
"comment_html": instance.comment_html,
}
+ # Detect deleted comment
+ if instance.delete_comment_date:
+ extra_data["comment_deleted"] = True
+
_push_to_timelines(project, user, obj, event_type, extra_data=extra_data)
def create_membership_push_to_timeline(sender, instance, **kwargs):
# Creating new membership with associated user
- if not instance.pk and instance.user:
+ # If the user is the project owner we don't do anything because that info will
+ # be shown in created project timeline entry
+ if not instance.pk and instance.user and instance.user != instance.project.owner:
_push_to_timelines(instance.project, instance.user, instance, "create")
#Updating existing membership
@@ -120,3 +127,10 @@ def create_membership_push_to_timeline(sender, instance, **kwargs):
def delete_membership_push_to_timeline(sender, instance, **kwargs):
if instance.user:
_push_to_timelines(instance.project, instance.user, instance, "delete")
+
+
+def create_user_push_to_timeline(sender, instance, created, **kwargs):
+ if created:
+ project = None
+ user = instance
+ _push_to_timelines(project, user, user, "create")
diff --git a/taiga/timeline/timeline_implementations.py b/taiga/timeline/timeline_implementations.py
index 8a782ce1..2b911607 100644
--- a/taiga/timeline/timeline_implementations.py
+++ b/taiga/timeline/timeline_implementations.py
@@ -105,3 +105,11 @@ def membership_timeline(instance, extra_data={}):
}
result.update(extra_data)
return result
+
+@register_timeline_implementation("users.user", "create")
+def user_timeline(instance, extra_data={}):
+ result = {
+ "user": service.extract_user_info(instance),
+ }
+ result.update(extra_data)
+ return result
diff --git a/taiga/users/permissions.py b/taiga/users/permissions.py
index 168a9419..70cfa3b8 100644
--- a/taiga/users/permissions.py
+++ b/taiga/users/permissions.py
@@ -44,7 +44,7 @@ class UserPermission(TaigaResourcePermission):
me_perms = IsAuthenticated()
remove_avatar_perms = IsAuthenticated()
starred_perms = AllowAny()
- change_email_perms = IsTheSameUser()
+ change_email_perms = AllowAny()
contacts_perms = AllowAny()
diff --git a/tests/integration/resources_permissions/test_users_resources.py b/tests/integration/resources_permissions/test_users_resources.py
index 5bcf3c4e..fada3a72 100644
--- a/tests/integration/resources_permissions/test_users_resources.py
+++ b/tests/integration/resources_permissions/test_users_resources.py
@@ -272,9 +272,10 @@ def test_user_action_password_recovery(client, data):
def test_user_action_change_email(client, data):
url = reverse('users-change-email')
- data.registered_user.email_token = "test-token"
- data.registered_user.new_email = "new@email.com"
- data.registered_user.save()
+ def after_each_request():
+ data.registered_user.email_token = "test-token"
+ data.registered_user.new_email = "new@email.com"
+ data.registered_user.save()
users = [
None,
@@ -283,5 +284,6 @@ def test_user_action_change_email(client, data):
]
patch_data = json.dumps({"email_token": "test-token"})
- results = helper_test_http_method(client, 'post', url, patch_data, users)
- assert results == [401, 204, 400]
+ after_each_request()
+ results = helper_test_http_method(client, 'post', url, patch_data, users, after_each_request=after_each_request)
+ assert results == [204, 204, 204]
diff --git a/tests/integration/test_timeline.py b/tests/integration/test_timeline.py
index b6743d9f..326a7b85 100644
--- a/tests/integration/test_timeline.py
+++ b/tests/integration/test_timeline.py
@@ -36,7 +36,7 @@ def test_add_to_object_timeline():
service._add_to_object_timeline(user1, task, "test")
- assert Timeline.objects.filter(object_id=user1.id).count() == 1
+ assert Timeline.objects.filter(object_id=user1.id).count() == 2
assert Timeline.objects.order_by("-id")[0].data == id(task)
@@ -59,9 +59,9 @@ def test_get_timeline():
service._add_to_object_timeline(user1, task4, "test")
service._add_to_object_timeline(user2, task1, "test")
- assert Timeline.objects.filter(object_id=user1.id).count() == 4
- assert Timeline.objects.filter(object_id=user2.id).count() == 1
- assert Timeline.objects.filter(object_id=user3.id).count() == 0
+ assert Timeline.objects.filter(object_id=user1.id).count() == 5
+ assert Timeline.objects.filter(object_id=user2.id).count() == 2
+ assert Timeline.objects.filter(object_id=user3.id).count() == 1
def test_filter_timeline_no_privileges():
@@ -72,7 +72,7 @@ def test_filter_timeline_no_privileges():
service.register_timeline_implementation("tasks.task", "test", lambda x, extra_data=None: str(id(x)))
service._add_to_object_timeline(user1, task1, "test")
- timeline = Timeline.objects.all()
+ timeline = Timeline.objects.exclude(event_type="users.user.create")
timeline = service.filter_timeline_for_user(timeline, user2)
assert timeline.count() == 0
@@ -88,7 +88,7 @@ def test_filter_timeline_public_project():
service.register_timeline_implementation("tasks.task", "test", lambda x, extra_data=None: str(id(x)))
service._add_to_object_timeline(user1, task1, "test")
service._add_to_object_timeline(user1, task2, "test")
- timeline = Timeline.objects.all()
+ timeline = Timeline.objects.exclude(event_type="users.user.create")
timeline = service.filter_timeline_for_user(timeline, user2)
assert timeline.count() == 1
@@ -104,7 +104,7 @@ def test_filter_timeline_private_project_anon_permissions():
service.register_timeline_implementation("tasks.task", "test", lambda x, extra_data=None: str(id(x)))
service._add_to_object_timeline(user1, task1, "test")
service._add_to_object_timeline(user1, task2, "test")
- timeline = Timeline.objects.all()
+ timeline = Timeline.objects.exclude(event_type="users.user.create")
timeline = service.filter_timeline_for_user(timeline, user2)
assert timeline.count() == 1
@@ -123,9 +123,9 @@ def test_filter_timeline_private_project_member_permissions():
service.register_timeline_implementation("tasks.task", "test", lambda x, extra_data=None: str(id(x)))
service._add_to_object_timeline(user1, task1, "test")
service._add_to_object_timeline(user1, task2, "test")
- timeline = Timeline.objects.all()
+ timeline = Timeline.objects.exclude(event_type="users.user.create")
timeline = service.filter_timeline_for_user(timeline, user2)
- assert timeline.count() == 1
+ assert timeline.count() == 3
def test_create_project_timeline():
diff --git a/tests/integration/test_users.py b/tests/integration/test_users.py
index 4682d5a2..1898aea8 100644
--- a/tests/integration/test_users.py
+++ b/tests/integration/test_users.py
@@ -93,6 +93,18 @@ def test_validate_requested_email_change(client):
assert user.new_email is None
assert user.email == "new@email.com"
+def test_validate_requested_email_change_for_anonymous_user(client):
+ user = f.UserFactory.create(email_token="change_email_token", new_email="new@email.com")
+ url = reverse('users-change-email')
+ data = {"email_token": "change_email_token"}
+
+ response = client.post(url, json.dumps(data), content_type="application/json")
+
+ assert response.status_code == 204
+ user = models.User.objects.get(pk=user.id)
+ assert user.email_token is None
+ assert user.new_email is None
+ assert user.email == "new@email.com"
def test_validate_requested_email_change_without_token(client):
user = f.UserFactory.create(email_token="change_email_token", new_email="new@email.com")